MySQL學習筆記(3)——簡單查詢SELECT

一、簡單檢索數據

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 要檢索的行數

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 數據庫入門 數據庫: 保存有組織的數據的容器(通常是一個文件或一組文件).數據庫軟件應該稱為 DBMS(DataB...
    Mjericho閱讀 521評論 0 0
  • Mysql 必知必會 查詢 檢索多個列SELECT prod_id, prod_name, prod_pri...
    yoomaz閱讀 666評論 0 1
  • 1.表中的任何列都可以作為主鍵, 只要它滿足以下條件:任意兩行都不具有相同的主鍵值;每一行都必須具有一個主鍵值( ...
    Cherryjs閱讀 764評論 0 0
  • 前言 一、基礎知識1.了解數據庫數據庫(database):保存有組織的數據的容器表(table):某種特定類型數...
    流水混帳閱讀 525評論 0 1
  • 相信很多爸爸媽媽都有沖孩子發火的時候,發完脾氣又覺得對孩子很內疚,陷入深深的自責之中。很多書本提出的建議都是需要父...
    一星一點閱讀 378評論 0 2