天天看點

mysql兩個查詢結果拼接_MySQL 檢索資料總結

mysql兩個查詢結果拼接_MySQL 檢索資料總結

php中文網最新課程

每日17點準時技術幹貨分享

mysql兩個查詢結果拼接_MySQL 檢索資料總結
mysql兩個查詢結果拼接_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 在執行比對時預設不區分大小寫,是以 '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 中有兩種通配符來實作比對值的一部分的特殊字元:

// `%` 通配符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 語句建立。

// 拼接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):

// 等值聯接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 語句),并将結果作為單個查詢結果集傳回,這些組合查詢稱為複合查詢。有兩種情況下,需要使用複合查詢:

在單個查詢中從不同的表傳回類似結果的資料;

對單個表執行多個查詢,按單個查詢傳回資料。

// 傳回價格小于等于5的所有物品、并且包括供應商1001和1002生産的所有物品select vend_id, prod_id, prod_pricefrom productswhere prod_price <=5unionselect vend_id, prod_id, prod_pricefrom productswhere vend_id in (1001, 1002);
           

1.UNION 中的每個查詢必須包含相同的列、表達式或聚集函數。

2.在使用 UNION 複合查詢是,隻能使用一條 ORDER BY 子句,且必須在最後一條 SELECT 語句之後。

mysql兩個查詢結果拼接_MySQL 檢索資料總結
mysql兩個查詢結果拼接_MySQL 檢索資料總結
mysql兩個查詢結果拼接_MySQL 檢索資料總結