一、簡單檢索數據
1)從一個表中檢索所有列
SELECT * FROM 表名;
2)從一個表中檢索特定某列或某幾列
SELECT 列名(,列名2,列名3…列名n) FROM 表名;
SELECT 表名.列名 FROM (數據庫名.)表名; (完全限定格式)
3)只返回不同(唯一)的行
SELECT DISTINCT 列名(,列名2,列名3,…列名n)FROM 表名;
4)返回指定開始行和行數的檢索結果
SELECT 列名 FROM 表名 LIMIT (開始行數,)行數;
SELECT 列名 FROM 表名 LIMIT 開始行數 OFFSET 行數(MySQL 5開始支持)
二、排序數據
排序一般使用ORDER BY子句。ORDER BY子句取一個或多個列的名字,據此對輸出排序。ORDER BY子句中使用的列可以為非檢索的列按多個列排序時,排序完全按所規定的順序進行。
1)按字母順序對檢索的一個(或一組)特定列的數據排序輸出
SELECT prod_name(列名) FROM 表名
ORDER BY prod_name(,prod_price);
2)指定排序方向
輸入:SELECT prod_id,prod_price,prod_name(列名)FROM 表名
ORDER BY prod_price DESC/ASC, prod_name;
DESC、ASC關鍵字只應用到直接位于其前面的列名,一般默認為升序,所以ASC作用不大
如果想在多個列上進行降序排序,必須對每個列指定DESC關鍵字
2)找出最高/最低值(排序后的第一行)
輸入:SELECT prod_price FROM 表名
ORDER BY prod_price DESC/ASC ?LIMIT 1;
三、過濾數據
過濾數據一般使用 WHERE子句、通配符、正則表達式
1)WHERE子句?
舉例1:從指定表中檢索指定列后,返回特定條件的行?
SELECT prod_name,prod_price(列名) FROM 表名
WHERE prod_price = 2.50;(搜索條件)
:舉例2:多個過濾條件檢索的結果
SELECT prod_id,prod_price,prod_name FROM 表名
WHERE vend_id = 1003 AND prod_price <= 10;
(若同時使用WHERE子句和ORDER BY子句時,ORDER BY 應位于WHERE之后)
操作符
用來聯結或改變WHERE子句中的子句的關鍵字。
AND操作符:用來指示檢索滿足所有給定條件的行。
OR操作符:用來表示檢索匹配任一 給定條件的行。
IN操作符:用在WHERE子句中的關鍵字,用來指定要匹配值的清單的關鍵字(取合法值的由逗號分割開的清單,全在圓括號中),功能與OR相當。
NOT操作符:用在WHERE子句中的關鍵字,用來否定它之后所跟的任何條件。
BETWEEN操作符:用在WHERE子句中的關鍵字,用來檢查某個范圍的值。
2)通配符LIKE
用來匹配值的一部分的特殊字符。為在搜索子句中使用通配符,必須使用LIKE謂詞。
%通配符:表示任何字符出現的任一次數。
_通配符:下劃線只匹配單個字符而不是多個字符。
舉例:
SELECT prod_id,prod_name FORM 表名
WHERE prod_name LIKE ‘%anvil%’
3)正則表達式?
REGEXP正則表達式:用來匹配文本的特殊的串(字符集合),LIKE匹配整個串而REGEXP匹配子串
舉例:
1)檢索列prod_name包含文本1000的所有行
SELECT prod_name FROM 表名
WHERE prod_name REGEXP ‘1000’;
2)檢索列prod_name包含文本‘000’的所有行
SELECT prod_name FROM 表名
WHERE prod_name REGEXP ‘.000’;
(.是正則表達式語言中一個特殊的字符,它表示匹配任意一個字符)
3)OR匹配
SELECT prod_name FROM 表名
WHERE prod_name REGEXP ‘1000|2000’ ;
4)匹配特定字符
SELECT prod_name FROM 表名
WHERE prod_name REGEXP ‘[123] Ton’;
([123]定義一組字符,為[1|2|3]的縮寫,作用同OR,它的意思是匹配1或2或3;也可以用[1-3]這種方式來表達,字符集合否定用^,它將匹配除指定字符外的任何東西。 如[^123]匹配除這些字符外的任何東西。)
5)匹配特殊字符
SELECT prod_name FROM 表名
WHERE prod_name REGEXP ‘\.’;
(轉義字符\與C、C++用法一樣,也可用來引用元字符(如\\r回車、\\f換頁等))
6)匹配連在一起的4位數字
SELECT prod_name FROM 表名
WHERE prod_name REGEXP ‘[[:digit:]]{4}’;
解釋: ?[:digit:]匹配任意數字,因而它為數字的一個集合。{4}確切地要求它前面的字符(任意數字)出現4次,所以 [[:digit:]]{4}匹配連在一起的任意4位數字。
7)檢索出以小數點開始的所有產品
SELECT prod_name FROM 表名
WHERE prod_name REGEXP ‘^[0-9\.]’;
四、數據分組
創建分組GROUP BY子句?分組允許把數據分為多個邏輯組,以便能對每個組進行聚集計算,例如: 返回每個供應商提供的產品數目,或者返回只提供單項產品的供應商所提供的產品,或返回提供10個以上產品的供應商。
1. GROUP BY子句可以包含任意數目的列。這使得能對分組進行嵌套, 為數據分組提供更細致的控制。
2. 如果在GROUP BY子句中嵌套了分組,數據將在后規定的分組上 進行匯總。換句話說,在建立分組時,指定的所有列都一起計算(所以不能從個別的列取回數據)。
3. GROUP BY子句中列出的每個列都必須是檢索列或有效的表達式 (但不能是聚集函數)。如果在SELECT中使用表達式,則必須在 GROUP BY子句中指定相同的表達式。不能使用別名。
4. 除聚集計算語句外,SELECT語句中的每個列都必須在GROUP BY子句中給出。
5. 如果分組列中具有NULL值,則NULL將作為一個分組返回。如果列 中有多行NULL值,它們將分為一組。
6. GROUP BY子句必須出現在WHERE子句之后,ORDER BY子句之前。
舉例:統計每個供應商擁有的產品數
SELECT vent_id,COUNT(*) AS num_prods FROM products?
GROUP BY vend_id;
過濾分組:HAVING子句
(WHERE在數據分組前進行過濾,HAVING在數據分組后進行過濾。這是一個重要的區別,WHERE排除的行不包括在分組中。這可能會改變計算值,從而影響HAVING子句中基于這些值過濾掉的分組)
舉例:
1)列出至少有兩個訂單的所有顧客
SELECT cust_id,COUNT(*) AS num_orders FROM orders
GROUP BY cust_id
HAVING COUNT(*)>=2;
2) 列出具有2個(含)以上、價格 為10(含)以上的產品的供應商
(同時使用where和having子句)
SELECT vent_id,COUNT(*) AS num_prods FROM productsSELECT cust_id,COUNT(*) AS num_orders FROM orders
WHERE prod_price>=10
GROUP BY vend_id;
HAVING COUNT(*)>=2;
五、SELECT子句及其執行順序
select 要返回的列或表達式
from 從中檢索數據的表
where 行級過濾
group by 分組說明(僅在按組計算聚集時使用)
having 組級過濾
order by 輸出排序順序
limit 要檢索的行數