MySQL 檢索數據總結

1. 基本查詢

// 檢索單個列
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. 排序數據

// 對 `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 子句來指定搜索條件。mysql

// 檢查單個值,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 BYWHERE 語句時,應該讓 ORDER BY 位於 WHERE 以後,不然會報錯
2.在 MySQL 中, AND 操做符的計算次序優先級高於 OR;可使用圓括號 ()提升操做符的優先級。

4. 通配符過濾

MySQL 中有兩種通配符來實現匹配值的一部分的特殊字符:git

// `%` 通配符
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 規範正則表達式。正則表達式

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 語句建立。sql

// 拼接
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. 分組數據

分組容許把數據分爲多個邏輯組,以便對每一個組進行彙集計算。數據庫

// 返回每一個供應商提供的產品數目
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 子句。函數

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
select vend_name, prod_name, prod_price 
from vendors, products 
where vendors.id = products.vend_id 
order by vend_name, prod_name;

// 等值聯接2
select 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 語句),並將結果做爲單個查詢結果集返回,這些組合查詢稱爲複合查詢。有兩種狀況下,須要使用複合查詢:code

  • 在單個查詢中從不一樣的表返回相似結果的數據;
  • 對單個表執行多個查詢,按單個查詢返回數據。
// 返回價格小於等於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 語句以後。
相關文章
相關標籤/搜索