1、SQL SELECT TOP 子句
SELECT TOP 子句用於規定要返回的記錄的數目。SELECT TOP 子句對於擁有數千條記錄的大型表來說,是非常有用的(或者比如選取某個最新的數據:我們可以按降序排序,然后選取第一個數據)
注釋:並非所有的數據庫系統都支持 SELECT TOP 子句。
語法:SELECT TOP number|percent column_name(s) FROM table_name;
MySQL語法:SELECT column_name(s) FROM table_name LIMIT number;
Oracle 語法:SELECT column_name(s) FROM table_name WHERE ROWNUM <= number;
SELECT * FROM Websites LIMIT 2; //選取頭兩條記錄
SELECT TOP 50 PERCENT * FROM Websites; //使用百分比作為參數,選取前面 50% 的記錄
2、SQL LIKE 操作符
LIKE 操作符用於在 WHERE 子句中搜索列中的指定模式。(通常與通配符一起配合使用)
語法:SELECT column_name(s) FROM table_name WHERE column_name LIKE pattern;
通過使用 NOT 關鍵字,您可以選取不匹配模式的記錄。
SELECT * FROM Websites WHERE name LIKE 'G%';開始 //選取 name 以字母 "G" 開始的所有客戶
SELECT * FROM Websites WHERE name LIKE '%k';結尾 //選取 name 以字母 "k" 結尾的所有客戶
SELECT * FROM Websites WHERE name LIKE '%oo%';包含 //選取 name 包含模式 "oo" 的所有客戶
SELECT * FROM Websites WHERE name NOT LIKE '%oo%';不包含 //選取 name 不包含模式 "oo" 的所有客戶
3、SQL 通配符
通配符與 SQL LIKE 操作符一起使用。SQL 通配符用於搜索表中的數據。在 SQL 中,可使用以下通配符:
https%:以字母 "https" 開始
%oo%:包含字母oo
_oogle:以任一字符開始,然后是 "oogle" 的所有記錄
%代表一個或多個字符,_代表一個字符
SELECT * FROM Websites WHERE name LIKE 'G_o_le'; //選取 name 以 "G" 開始,然后是一個任意字符,然后是 "o",然后是一個任意字符,然后是 "le" 的所有網站
[charlist] 通配符:MySQL 中使用 REGEXP 或 NOT REGEXP 運算符 (或 RLIKE 和 NOT RLIKE) 來操作正則表達式。
SELECT * FROM Websites WHERE name REGEXP '^[GFs]'; //選取 name 以 "G"、"F" 或 "s" 開始的所有網站
SELECT * FROM Websites WHERE name REGEXP '^[A-H]'; //選取 name 以 A 到 H 字母開頭的網站
SELECT * FROM Websites WHERE name REGEXP '^[^A-H]'; //選取 name 不以 A 到 H 字母開頭的網站
4、IN 操作符
IN 操作符允許您在 WHERE 子句中規定多個值。(in查詢可以規定多個值)
NOT column_name IN (value1,value2,…),不在規定的值內
語法:SELECT column_name(s) FROM table_name WHERE column_name IN (value1,value2,...);
SELECT * FROM Websites WHERE name IN ('Google','菜鳥教程'); //選取 name 為 "Google" 或 "菜鳥教程" 的所有網站
5、SQL BETWEEN 操作符
BETWEEN 操作符選取介於兩個值之間的數據范圍內的值。這些值可以是數值、文本或者日期。
語法:SELECT column_name(s) FROM table_name WHERE column_name BETWEEN value1 AND value2;
SELECT * FROM Websites WHERE alexa BETWEEN 1 AND 20; //選取 alexa 介於 1 和 20 之間的所有網站
SELECT * FROM Websites WHERE alexa NOT BETWEEN 1 AND 20; //不在1和20之間的
SELECT * FROM Websites WHERE (alexa BETWEEN 1 AND 20) AND NOT country IN ('USA', 'IND'); //選取alexa介於 1 和 20 之間但 country 不為 USA 和 IND 的所有網站
SELECT * FROM Websites WHERE name BETWEEN 'A' AND 'H'; //選取 name 以介於 'A' 和 'H' 之間字母開始的所有網站
SELECT * FROM Websites WHERE name NOT BETWEEN 'A' AND 'H'; //選取 name 不介於 'A' 和 'H' 之間字母開始的所有網站
SELECT * FROM access_log WHERE date BETWEEN '2016-05-10' AND '2016-05-14'; //選取 date 介於 '2016-05-10' 和 '2016-05-14' 之間的所有訪問記錄
注意:在不同的數據庫中,BETWEEN 操作符會產生不同的結果!在某些數據庫中,BETWEEN 選取介於兩個值之間但不包括兩個測試值的字段。在某些數據庫中,BETWEEN 選取介於兩個值之間且包括兩個測試值的字段。在某些數據庫中,BETWEEN 選取介於兩個值之間且包括第一個測試值但不包括最后一個測試值的字段。因此,請檢查您的數據庫是如何處理 BETWEEN 操作符!
下面是2個表的數據,用於實例演示:
6、別名
通過使用 SQL,可以為表名稱或列名稱指定別名。基本上,創建別名是為了讓列名稱的可讀性更強。
列的別名語法:SELECT column_name AS alias_name FROM table_name;
表的別名語法:SELECT column_name(s) FROM table_name AS alias_name;
列的別名實例:
SELECT name AS n, country AS c FROM Websites; //指定了兩個別名,一個是 name 列的別名,一個是 country 列的別名。 //提示:如果列名稱包含空格,要求使用雙引號或方括號
SELECT name, CONCAT(url, ', ', alexa, ', ', country) AS site_info FROM Websites; //把三個列(url、alexa 和 country)結合在一起,並創建一個名為 "site_info" 的別名
表的別名實例:
SELECT w.name, w.url, a.count, a.date FROM Websites AS w, access_log AS a WHERE a.site_id=w.id and w.name="菜鳥教程";
//選取 "菜鳥教程" 的訪問記錄。我們使用 "Websites" 和 "access_log" 表,並分別為它們指定表別名 "w" 和 "a"(通過使用別名讓 SQL 更簡短)
//不帶別名的相同的SQL語句
SELECT Websites.name, Websites.url, access_log.count, access_log.date
FROM Websites, access_log
WHERE Websites.id=access_log.site_id and Websites.name="菜鳥教程";
在下面的情況下,使用別名很有用:(1)在查詢中涉及超過一個表(2)在查詢中使用了函數(3)列名稱很長或者可讀性差(4)需要把兩個列或者多個列結合在一起
7、SQL JOIN
SQL JOIN子句用於把來自兩個或多個表的行結合起來,基於這些表之間的共同字段。
SELECT Websites.id, Websites.name, access_log.count, access_log.date FROM Websites INNER JOIN access_log ON Websites.id=access_log.site_id; //"Websites" 表中的 "id" 列指向 "access_log" 表中的字段 "site_id"。上面這兩個表是通過 "site_id" 列聯系起來的。 //關聯字段
不同的 SQL JOIN 類型:
- INNER JOIN:如果表中有至少一個匹配,則返回行
- LEFT JOIN:即使右表中沒有匹配,也從左表返回所有的行
- RIGHT JOIN:即使左表中沒有匹配,也從右表返回所有的行
- FULL JOIN:只要其中一個表中存在匹配,則返回行
8、SQL INNER JOIN 關鍵字
INNER JOIN 關鍵字在表中存在至少一個匹配時返回行。
語法:SELECT column_name(s) FROM table1 INNER JOIN table2 ON table1.column_name=table2.column_name;
或: SELECT column_name(s) FROM table1 JOIN table2 ON table1.column_name=table2.column_name;
注釋:1、INNER JOIN 與 JOIN 是相同的。
2、INNER JOIN 關鍵字在表中存在至少一個匹配時返回行。如果 "Websites" 表中的行在 "access_log" 中沒有匹配,則不會列出這些行。
9、SQL LEFT JOIN 關鍵字
LEFT JOIN 關鍵字從左表(table1)返回所有的行,即使右表(table2)中沒有匹配。如果右表中沒有匹配,則結果為 NULL。
語法:SELECT column_name(s) FROM table1 LEFT JOIN table2 ON table1.column_name=table2.column_name;
或: SELECT column_name(s) FROM table1 LEFT OUTER JOIN table2 ON table1.column_name=table2.column_name;
注釋:LEFT JOIN 關鍵字從左表(Websites)返回所有的行,即使右表(access_log)中沒有匹配。
10、SQL RIGHT JOIN 關鍵字
RIGHT JOIN 關鍵字從右表(table2)返回所有的行,即使左表(table1)中沒有匹配。如果左表中沒有匹配,則結果為 NULL。
語法:SELECT column_name(s) FROM table1 RIGHT JOIN table2 ON table1.column_name=table2.column_name;
或: SELECT column_name(s) FROM table1 RIGHT OUTER JOIN table2 ON table1.column_name=table2.column_name;
注釋:RIGHT JOIN 關鍵字從右表(Websites)返回所有的行,即使左表(access_log)中沒有匹配。
11、SQL FULL OUTER JOIN 關鍵字
FULL OUTER JOIN 關鍵字只要左表(table1)和右表(table2)其中一個表中存在匹配,則返回行。
FULL OUTER JOIN 關鍵字結合了 LEFT JOIN 和 RIGHT JOIN 的結果。
語法:SELECT column_name(s) FROM table1 FULL OUTER JOIN table2 ON table1.column_name=table2.column_name;
//MySQL中不支持 FULL OUTER JOIN,你可以在 SQL Server 測試以下實例。
SELECT Websites.name, access_log.count, access_log.date FROM Websites FULL OUTER JOIN access_log ON Websites.id=access_log.site_id ORDER BY access_log.count DESC;
注釋:FULL OUTER JOIN 關鍵字返回左表(Websites)和右表(access_log)中所有的行。如果 "Websites" 表中的行在 "access_log" 中沒有匹配或者 "access_log" 表中的行在 "Websites" 表中沒有匹配,也會列出這些行。
幾種JOIN對比: