常用的SQL語句小結(三)---複雜查詢,CASE表達式,各種連接查詢

1.複雜查詢

(1)普通子查詢

SELECT product_type, cnt_product
FROM (
SELECT Product_type, COUNT(*) AS cnt_product
FROM Product
GROUP BY product_type
) AS ProductSum;

()裏的是內層查詢會首先執行,然後纔會執行外層查詢

子查詢可以多層嵌套,但是性能會下降,儘量少用多層子查詢

 

(2)標量子查詢

標量子查詢只返回一列一行

 錯誤案例:選取出銷售單價( sale_price)高於全部商品的平均單價的商品

 

SELECT product_id, product_name, sale_price FROM Product
WHERE sale_price > AVG(sale_price);

WHERE子句不能直接使用聚合函數

正確做法:

SELECT product_id, product_name, sale_price FROM Product
WHERE sale_price > (SELECT AVG(sale_price) FROM Product);

 

(3)關聯子查詢

案例:選取出各商品種類中高於該商品種類的平均銷售單價的商品

第一步:按照商品種類計算平均價格
SELECT AVG(sale_price) FROM Product GROUP BY product_type; 
第二步:在細分的組內進行比較時,需要使用關聯子查詢

SELECT product_type, product_name, sale_price FROM Product AS P1
WHERE sale_price > (SELECT AVG(sale_price) FROM Product AS P2
WHERE P1.product_type = P2.product_type GROUP BY product_type);

GROUP BY product_type去掉也能得到正確結果,因爲P1.product_type = P2.product_type這個條件已經相當於AVG函數按照商品種類來計算了

 

(4)行列轉換 CASE表達式

-- 對按照商品種類計算出的銷售單價合計值進行行列轉換
SELECT SUM(CASE WHEN product_type = '衣服'
THEN sale_price ELSE 0 END) AS sum_price_clothes,
SUM(CASE WHEN product_type = '廚房用具'
THEN sale_price ELSE 0 END) AS sum_price_kitchen,
SUM(CASE WHEN product_type = '辦公用品'
THEN sale_price ELSE 0 END) AS sum_price_office
FROM Product;

在滿足商品種類(product_type)爲“衣服”或者“辦公用品”
等特定值時,上述 CASE 表達式輸出該商品的銷售單價(sale_price),
不滿足時輸出 0。對該結果進行彙總處理,就能夠得到特定商品種類的銷
售單價合計值了。

(5)UNION和UNION ALL區別

SELECT product_id, product_name
FROM Product
UNION ALL
SELECT product_id, product_name
FROM Product2;


UNION會合並重復行爲一行,而UNION ALL不會合並

UNION相當於表的加法,INTERSECT (交集),EXCEPT (減法,Product有而Product2沒有)

 

(6)內連接示例

SELECT SP.shop_id, SP.shop_name, SP.product_id, P.product_name,
P.sale_price
FROM ShopProduct AS SP INNER JOIN Product AS P
ON SP.product_id = P.product_id
WHERE SP.shop_id = '000A';

(7)右外連接示例(代表右邊的表爲主表,跟內連接區別就是,內連接必須兩張表同時存在的相同product_id才能查詢出來,而右外連接會把只有右邊表才存在的product_id也查出來)

SELECT SP.shop_id, SP.shop_name, SP.product_id, P.product_name,
P.sale_price
FROM ShopProduct AS SP RIGHT OUTER JOIN Product AS P
ON SP.product_id = P.product_id;

 

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