// 檢索單個列 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.除非確實須要表中的每一個列,不然最好別使用*
通配符,檢索不須要的列會下降檢索的性能。
// 對 `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 默認以數據添加到表中的順序返回。
使用 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 BY
和WHERE
語句時,應該讓ORDER BY
位於WHERE
以後,不然會報錯
2.在 MySQL 中,AND
操做符的計算次序優先級高於OR
;可使用圓括號()
提升操做符的優先級。
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.通配符搜索的處理通常要比普通搜索所花時間更長,所以不要過分使用通配符。
正則表達式是用來匹配文本的特殊的串,經過使用 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}';
應用程序所須要的數據每每並不存在於數據庫表中,咱們須要從數據庫中檢索並進行拼接、計算、轉換或者格式化等處理而獲得,這就是計算字段。計算字段並不實際存在於數據庫表中,而是運行時由 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;
分組容許把數據分爲多個邏輯組,以便對每一個組進行彙集計算。數據庫
// 返回每一個供應商提供的產品數目 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' 子句,這是保證數據正確排序的惟一方法。
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
子句有相同數目的列。
關係表的設計就是要保證把信息分解成多個表,一類數據一個表,各表經過某些經常使用的值(即關係設計中的關係)互相關聯。分解數據爲多個表能更有效地存儲,更方便地處理,而且具備更大的可伸縮性。若是數據存儲在多個表中,怎樣用單條 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 在運行時關聯指定的每一個表以及處理聯接,這種處理可能時很是耗費資源的。
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
語句以後。