2月27日,消失的一天,轉載個mysql的查詢技巧

 

轉載至php中文網。https://www.php.cn/mysql-tutorials-143621.html

 

1. 基本查詢

1

2

3

4

// 檢索單個列select prod_name from products;

// 檢索所有列select * from products;

// 檢索不同的行select distinct vend_id from products;

// 限制結果select prod_name from products limit 4,5;

1.LIMIT :若有兩個參數,則第一個參數爲開始位置(從 0 行開始),第二個參數爲返回結果的數量;若只有一個參數,則表示限制返回結果的數量。
2.除非確實需要表中的每個列,否則最好別使用 * 通配符,檢索不需要的列會降低檢索的性能。
2. 排序數據

1

2

// 對 `prod_name` 進行升序排序select prod_name from products order by prod_name;

//  按多個列排序: 對 `prod_price` 降序排序,對 `prod_name` 升序排序 select prod_price, prod_name form products order by prod_price desc, prod_name;

如果沒有明確規定排序順序,MySQL 默認以數據添加到表中的順序返回。
3.過濾數據
使用 WHERE 子句來指定搜索條件。

1

2

3

4

5

6

7

8

// 檢查單個值,MySQL 在執行匹配時默認不區分大小寫,因此 'jochen' 和 'Jochen' 都會匹配select prod_name, prod_price from products where prod_name = 'jochen';

// 不匹配檢查select vend_id, prod_name from products where vend_id != 1000;

// 範圍檢查select prod_name, prod_price from products where prod_price between 5 and 10;

// 空值檢查select cust_id from customers where cust_email is null;

// AND 操作符select prod_id, prod_price from products where vend_id = 1003 and prod_price <=10;

// OR 操作符select prod_name, prod_price from products where vend_id = 1002 or vend_id = 1003;

// IN 操作符select prod_name, prod_price from products where vend_id in (1002, 1003);

// NOT 操作符select prod_name, prod_price from products where vend_id not in (1002, 1003);

1.在同時使用 ORDER BY 和 WHERE 語句時,應該讓 ORDER BY 位於 WHERE 之後,否則會報錯
2.在 MySQL 中,AND 操作符的計算次序優先級高於 OR;可以使用圓括號()提高操作符的優先級。
4. 通配符過濾
MySQL 中有兩種通配符來實現匹配值的一部分的特殊字符:

1

2

// `%` 通配符select prod_id, prod_name from products where prod_name like 'jo%';

// `_` 通配符select prod_id, prod_name from products where prod_name like '_ochen';

1.% 通配符表示任意字符出現任意次數;_ 通配符表示只匹配單個字符。
2.通配符搜索的處理一般要比普通搜索所花時間更長,因此不要過度使用通配符。
5. 正則表達式檢索
正則表達式是用來匹配文本的特殊的串,通過使用 REGEXP 子句來實現。MySQL 中使用 POSIX 規範正則表達式。

1

2

3

select prod_name from products where prod_name regexp '1000|2000';

select prod_name from products where prod_name regexp '[123] Ton';

// 連續4位數字select prod_name from products where prod_name regexp '[[:digit:]]{4}';

6. 計算字段
應用程序所需要的數據往往並不存在於數據庫表中,我們需要從數據庫中檢索並進行拼接、計算、轉換或者格式化等處理而得到,這就是計算字段。計算字段並不實際存在於數據庫表中,而是運行時由 SELECT 語句創建。

1

2

// 拼接select concat(vend_name, '(', vend_country, ')') as vend_title from vendors;

// 算術計算select prod_id, quantity, item_price quantity*item_price as expanded_price from orderitems;

7. 分組數據
分組允許把數據分爲多個邏輯組,以便對每個組進行聚集計算。

1

2

3

// 返回每個供應商提供的產品數目select vend_id, count(*) as num_prods from products group by vend_id; # 創建分組

// 返回至少有兩個訂單的所有顧客select cust_id, count(*) as orders from orders group by cust_id having count(*) >= 2; # 過濾分組

// 返回總計訂單價格大於等於50的訂單的訂單號和總計訂單價格,並按總計訂單價格排序select order_num, sum(quantity*item_price) as ordertotal from orderitems group by order_num having sum(quantity*item_price) >= 50 order by ordertotal;

1.GROUP BY 子句指示 MySQL 分組數據,然後對每個組而不是整個結果集進行聚集。
2.GROUP BY 子句中列出的每個列必須是檢索列或者有效的表達式(不能是聚集函數),同時不能使用別名。
3.HAVING 在數據分組之後進行過濾,WHERE 在數據分組之前進行過濾。
4.一般在使用 GROUP BY 子句時,應該也給好 'ORDER BY' 子句,這是保證數據正確排序的唯一方法。
8. 子查詢
MySQL 允許創建子查詢,即嵌套在其他查詢中的查詢,例如把一條 SELECT 語句返回的結果用於另一條 SELECT 語句的 WHERE 子句。

1

2

select cust_id from orders where order_num in (select order_num from ordreitems where prod_id = 'TNT2');

// 作爲計算字段使用子查詢select cust_name, cust_state, (select count(*) from orders where orders.cust_id = customers.cust_id) as orders from customers order by cust_name;

保證子查詢中的 SELECT 語句具有與父查詢中的 WHERE 子句有相同數目的列。
9. 聯接表
關係表的設計就是要保證把信息分解成多個表,一類數據一個表,各表通過某些常用的值(即關係設計中的關係)互相關聯。分解數據爲多個表能更有效地存儲,更方便地處理,並且具有更大的可伸縮性。如果數據存儲在多個表中,怎樣用單條 SELECT 語句檢索出數據?答案是使用聯接。簡單地說,聯接是一種機制,用來在一條 SELECT 語句中關聯表,使用特殊的語法,可以聯接多個表返回一組數據。

聯接不是物理實體,它在實際的數據庫表中不存在。
常用的聯接類型有:

內部聯接(INNER JOIN):兩表執行笛卡爾積後,取列值符合查詢條件的數據。
左外部聯接(LEFT OUTER JOIN):指將左表的所有記錄與右表符合條件的記錄,返回的結果除內連接的結果,還有左表不符合條件的記錄,並在右表相應列中填NULL。
右外部聯接(RIGHT OUTER JOIN):

1

2

// 等值聯接1select vend_name, prod_name, prod_price from vendors, products where vendors.id = products.vend_id order by vend_name, prod_name;

// 等值聯接2select vend_name, prod_name, prod_price from vendors inner join products on vendors.id = products.vend_id order by vend_name, prod_name;

1.應該保證所有聯接都 SELECT 子句,否則 MySQL 將返回比想要的數據多得多的數據(笛卡爾積)。
2.MySQL 在運行時關聯指定的每個表以及處理聯接,這種處理可能時非常耗費資源的。
10. 複合查詢
MySQL 允許執行多個查詢(多條 SELECT 語句),並將結果作爲單個查詢結果集返回,這些組合查詢稱爲複合查詢。有兩種情況下,需要使用複合查詢:

在單個查詢中從不同的表返回類似結果的數據;
對單個表執行多個查詢,按單個查詢返回數據。

1

2

3

4

5

6

7

8

// 返回價格小於等於5的所有物品、並且包括供應商1001和1002生產的所有物品

select vend_id, prod_id, prod_price

from products

where prod_price <=5

union

select vend_id, prod_id, prod_price

from products

where vend_id in (1001, 1002);

1.UNION 中的每個查詢必須包含相同的列、表達式或聚集函數。
2.在使用 UNION 複合查詢是,只能使用一條 ORDER BY 子句,且必須在最後一條 SELECT 語句之後。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章