以下文章內容都是我自己從平時學習SQL語言時整理而來,寫這篇文章是希望我或大家在使用能更方便的查詢。
如果有不完整或不正確的地方請大家指出~謝謝大家
基本SQL操作
創建數據庫
CREATE DATABASE DB_name
插入數據
INSERT INTO DB_name
VALUE{value1,value2}
更新數據
UPDATE table_name
SET Age=11
WHERE ID='123'
Alter
Alter 是不對表格本身內容修改的,對表格框架修改。
ALTER table_name
ADD state VARCHAR(2) #增添新列
ALTER table_name
DROP COLUMN state #刪除列
ALTER table_name
MODIFY id INT #把id列改成數字類型
ALTER table_name #修改列名
CHANGE 'id' 'student_id' VARCHAR(5)
邏輯運算符
1.LIKE
WHERE url LIKE '%google%' #字符串匹配,在url中尋找中間字符串為google的url,%代表0或多個字符
2.IN
WHERE id IN (1001,1002) #表示尋找id為1001,1002的行
3.NOT
NOT 與 LIKE IN連用,表示否定
鍵
主鍵(PK): 表中唯一的一列,這一列中不可重復。 標志列。
外鍵(FK):外鍵是另一個表的主鍵
注意:兩個表就是通過主外鍵進行連接。
JOIN
1. 多表鏈接:
INNER JOIN:
FROM A
JOIN B
ON A.FK =B.PK #合集包括A、B表單共有的
LEFT JOIN:
FROM A
LEFT JOIN B
ON A.FK =B.PK #合集只包括A、B表單共有的,和A表中沒在B中匹配到的行
RIGHT JOIN:
FROM A
RIGHT JOIN B
ON A.FK =B.PK #合集只包括A、B表單共有的,和B表中沒在A中匹配到的行
Union:
豎向連接兩張表,兩張表的列數必須相同。
2. 別名:
FROM tablename AS t1
JOIN tablename2 AS t2 # AS可省略
3. 外連接 OUTER JOIN = FULL OUTER JOIN :
外連接,它將返回內連接的結果,以及被連接的表格中沒有匹配的行。
4. ON子句
ON A.FK=B.PK #A表的外鍵和B表的主鍵
聚合函數
-
NULL
NULL是一種數據類型,表示 SQL 中沒有數據;
查詢時:WNERE name IS NULL #查詢name為NULL值的行 -
COUNT()
COUNT(*) #一行記錄中只要一列有數據,則計數
COUNT(COLUMN_name) #空值不計數 -
SUM()
sum(col_name) #垂直聚合,只對數值進行計算總和,SUM 將忽略 NULL 值,當做0處理 -
MAX() MIN()
MAX() #返回最大值
MIN() #返回最小值
它們都可以用在非數字列上。MIN 將返回最小的數字、最早的日期或按字母表排序的最之前的非數字值,具體取決於列類型 -
AVG()
AVG() #返回平均值,只對值列;忽略分子和分母中的 NULL 值;
GROUP BY函數
GROUP BY() #在使用聚合函數時,對關鍵列進行分組;如果SELECT語句中有字段沒進行聚合,則必須寫入GROUP BY函數
GROUP BY 始終在 WHERE 和 ORDER BY 之間
DISTINCT函數
DISTINCT 看做僅返回特定列的唯一值的函數 ?后面的行會怎么出現
HAVING()
HAVING SUN(money)>10000 # 過濾聚集列,當篩選條件有聚合函數時,用HAVING
日期時間函數
DATE_TRUNC:SELECT DATE_TRUNC('month',DATE) (如果數據2015.01~2017.12,行會把每年的每月都列出來) 使你能夠將日期截取到日期時間列的特定部分。常見的截取依據包括日期、月份 和 年份。
DATE_PART: SELECT DATE_PART('month',DATE) (如果數據2015.012017.12,行只會列出0112個月份,但每個月份是包含所有年的)可以用來獲取日期的特定部分,但是注意獲取 month 或 dow 意味着無法讓年份按順序排列。而是按照特定的部分分組,無論它們屬於哪個年份。
CASE 語句
CASE WHEN condition THEN result #進行條件選擇,分情況生成新列
ELSE result END ;
注意:
1) CASE 語句始終位於 SELECT 條件中。
2) CASE 必須包含以下幾個部分:WHEN、THEN 和 END。ELSE 是可選組成部分,用來包含不符合上述任一 CASE 條件的情況。
3)你可以在 WHEN 和 THEN 之間使用任何條件運算符編寫任何條件語句(例如 WHERE),包括使用 AND 和 OR 連接多個條件語句。
4)你可以再次包含多個 WHEN 語句以及 ELSE 語句,以便處理任何未處理的條件。
總體順序:
SELECT
CASE WHEN condition THEN result
ELSE result END ;
FROM
JOIN
ON
WHERE
GROUP BY
HAVING #有WHERE時不需要用HAVING
ORDER BY
LIMIT
高級SQL語句
子查詢
就是查詢語句嵌套查詢語句
格式
SELECT *
FROM (SELECT id,channel, COUNT(*) as events
FROM web_events
GROUP BY 1,2
ORDER BY 3 DESC) sub
GROUP BY channel
ORDER BY 2 DESC;
注意:在條件語句中編寫子查詢時,不能包含別名。
WITH語句
把要嵌套的查詢語句先定義在開頭,后面直接帶入
WITH table1_name AS (SELECT *
FROM 1 ),
table2_name AS (SELECT *
FROM 2)
SELECT *
FROM table1
JOIN table2
ON table1.id=table2.id
注意:在使用 WITH 創建多個表格時,需要在每個表格后面加一個逗號,但是在引向最終查詢的最后一個表格后面不需添加
SQL數據清理
1.清理和重新整理混亂的數據。
-
LEFT(): left函數可以從字符串左側輸出一定數量的字符 。
-
RIGHT(): right函數則是從右側 。
-
LENGTH(): 獲取字符串的長度。
-
POSITION():獲取字符和列,並提供該字符在每行的索引。第一個位置的索引在 SQL 中是1
例:POSITION(',' IN city_state) 獲取逗號的索引。 -
STRPOS(): 和 POSITION 提供的結果相同,但是語法不太一樣.
例:STRPOS(city_state, ‘,’) -
LOWER(): 把字符串全變成小寫
-
UPPER(): 把字符串全變成大寫
-
CONCAT(first_name, ' ', last_name):拼接兩列字符串。
或者使用雙豎線:first_name || ' ' || last_name, 也可以達到相同效果。
注意:POSITION 和 STRPOS 都區分大小寫,因此查找 A 的位置與查找 a 的結果不同。
2.將列轉換為不同的數據類型。
-
TO_DATE:將英文月份改成數字,DATE_PART('month', TO_DATE(month, 'month'))
例:將'JULY' 改成 '6' -
CAST(): 將拼接成的字符串'2014-9-19' 變成時間類型'2014-09-19'.
-
:: :兩個冒號是對數據列轉變數據類型。
例 age::INT,將age字符串類型轉換成數字類型
3.處理 NULL 的技巧
- COALESCE():COALESCE來處理NULL值,COALESCE('name','0')把name列中空值變成0
這樣 COUNT()、AVGAGE()函數就可以包含其計算。