十3、使用子查詢app
1、子查詢:嵌套在其餘查詢中的查詢。ide
子查詢老是從內向外處理。函數
一、利用子查詢進行過濾。測試
例如:訂單存儲在兩個表中其中orderitems表中存儲各訂單的物品。Orders表不存儲客戶信息,只存儲客戶的ID。Customers存儲客戶的信息。spa
先在要列出訂購物品TNT2的全部客戶。orm
SELECT cust_name, cust_contactxml
FROM customers排序
WHERE cut_id IN (SELECT cust_idip
FROM ordersci
WHERE order_num IN (SELECT order_num
FROM orderitems
WHERE prod_id = ‘TNT2’));
二、做爲計算字段使用子查詢
十4、聯結表
一、聯結
聯結的做用:聯結是一種機制,用來在一條SELECT語句中關聯表。
二、建立聯結
聯結的建立很是簡單,規定要聯結的全部的表以及它們如何關聯便可
例如:SELECT vend_name, prod_name, prod_price
FROM vendors, products
WHERE vendors.vend_id = products.vend_id
ORDER BY vend_name, prod_name;
等值聯結(內部聯結):基於兩個表之間的相等測試。
這種聯結也可使用稍微不一樣的語法來實現
例如:SELECT vend_name, prod_name, prod_price
FROM vendors INNER JOIN products
ON vendors.vend_id = products.vend_id;
在這裏,兩個表之間的關係是FROM子句的組成部分,以INNER JOIN指定。在使用這種語法時,聯結條件用特定的ON子句而不是WHERE子句給出
聯結多個表
SQL對一條SELECT語句中能夠聯結的表的數目沒有限制。首先列出全部表,而後定義表之間的關係,WHERE後跟多個關係時,用AND鏈接。
例如:SELECT prod_name, vend_name, prod_price, quantity
FROM orderitems, products, vnedors
WHERE products.vend_id = vendors.vend_id
AND orderitems.prod_id = products.prod_id
AND order_num = 20005;
十5、建立高級聯結
一、使用表別名
別名除了用於列名和計算字段外,SQL還容許給表名起別名。這樣作有兩大理由:
--縮短SQL語句
--容許在單條SELECT語句中屢次使用相同的表
例如:SELECT cust_name, cust_contact
FROM customers AS c, orders AS o, orderitems AS oi
WHERE c.cust_id = o.cust_id
AND oi.order_num = o.order_num
AND prod_id = ‘TNT2’;
注意:表別名只在查詢執行中使用。與列別名不同,表別名不返回到客戶機。
二、使用不一樣類型的聯結
迄今爲止咱們使用的爲內部聯結或等值聯結的簡單聯結。如今看其餘三種聯結,它們分別是自聯結、天然聯結和外部聯結
(1)、自聯結
使用表別名的主要緣由之一是能在單條SELECT語句中不止一次引用相同的表。
例如:假如發現某物品(其ID爲DTNTR)存在問題,所以想知道生產該物品的供應商生產的其餘物品是否也存在問題。此查詢要求首先招待生產ID爲DTNTR的物品的供應商,而後找出這個供應商生產的其餘物品。
方法一:使用子查詢
SELECT prod_id, prod_name
FROM products
WHERE vend_id = (SELECT vend_id
FROM products
WHERE prod_id = ‘DTNTR’);
方法2、使用自聯結
SELECT p1.prod_id, p1.prod_name
FROM products AS p1, products AS p2
WHERE p1.vend_id = p2.vend_id
AND p2.prod_id = ‘DTNTR’;
(2)、天然聯結
天然聯結排除屢次出現,使每一個列只返回一次。
迄今爲止,咱們創建的每一個內部聯結都是天然聯結。
(3)、外部聯結
外部聯結:聯結包含了那些在關聯表中沒有關聯行的行。
例如:先給出一個內部聯結,它檢索全部客戶及其訂單
SELECT customers.cust_id, orders.order_num
FROM customers INNER JOIN orders
ON customers.cust_id = orders.cust_id;
下面給出外部聯結。檢索全部客戶,包括那些沒有訂單的客戶
SELECT customers.cust_id, orders.order_num
FROM customers LEFT OUTER JOIN orders
ON customers.cust_id = orders.cust_id;
這條SELECT語句使用了關鍵字OUTER JOIN來指定聯結的類型。可是,與內部聯結關聯兩個表中的行不一樣的是,外部聯結還包括沒有關聯行的行。在使用OUTER JOIN語法時,必須使用RIGHT或LEFT關鍵字指定其包括其全部行的表(RIGHT指出的是OUTER JOIN右邊的表,而LEFT指出的是OUTER JOIN左邊的表)
三、使用帶彙集函數的聯結
若是要檢索全部客戶及每一個客戶所下的訂單數,下面使用了COUNT()函數的代碼可完場工做。
SELECT customers.cust_name,
customers.cust_id,
COUNT(orders.order_num) AS num_ord
FROM customers INNER JOIN orders
ON customers.cust_id = orders.cust_id
GROUP BY customers.cust_id;
此SELECT語句使用INNER JOIN將customers和orders表互相關聯。
四、使用聯結和聯結條件
十6、組合查詢
本章講述如何利用UNION操做符將多條SELECT語句組合成一個結果集
1、組合查詢
MySQL容許執行多個查詢(多條SELECT語句),並將結果做爲單個查詢集返回。這些組合查詢一般稱爲並或複合查詢
須要使用組合查詢的兩種狀況:
2、建立組合查詢
可用UNION操做符來組合數條SQL查詢。
UNION的使用很簡單。所須要作的只是給出每條SELECT語句,在各條語句之間放上關鍵字UNION
例如:假設須要價格小於等於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);
UNION規則:
包含或取消重複的行
使用UNION自動去除重複的行,若是要返回全部的行(包括重複的行)可以使用UNION ALL
對組合查詢結果排序
在用UNION組合查詢時,只能使用一條ORDER BY子句,它必須出如今最後一條SELECT語句以後。