SQL-語法收集(初階.進階)

初階
查詢:列出住在比較溫暖地區的顧客
SELECT CUSTOMER_NAME,CITY
FROM CUSTOMER_V
WHERE CITY IN ('台南市','高雄市','屏東市')

查詢:針對CUSTOMER_V中地址在’台南市’,’高雄市’,’屏東市’中的所有顧客,列出他們的名稱.所在城市.而且顯示的順序是依據城市的字母順序,每個城市內的顧客亦照字母順序排列(預設為升冪)
SELECT CUSTOMER_NAME,CITY
FROM CUSTOMER_V
WHERE CITY IN ('台南市','高雄市','屏東市')
ORDER BY CITY , CUSTOMER_NAME

‘排列順序是依據所列出的欄位順序來決定的;若要由高到低排列,則在排序欄位後面加上DESC關鍵字

查詢:計算我們出貨到每一州的顧客數目
SELECT STATE,COUNT(STATE)
FROM CUSTOMER_V
GROUP BY STATE;

查詢:計算我們出貨到每個城市的顧客數目,請依據州來列出這些城市
SELECT STATE,CITY,COUNT(CITY)
FROM CUSTOMER_V
GROUP BY STATE,CITY;

查詢:計算我們出貨到每個州的顧客數目,請依據州來列出這些顧客,並找出有一個顧客以上的州
SELECT STATE,COUNT(STATE)
FROM CUSTOMER_V
GROUP BY STATE
HAVING COUNT(STATE) > 1

查詢:針對平均定價少於$750的外裝產品,列出這些外裝產品的外裝與平均定價.
SELECT PRODUCT_FINISH,AVG(STANDARD_PRICE)
FROM PRODUCT_V
WHERE PRODUCT_FINISH IN ('運動鞋','跑步鞋','淑女鞋')
GROUP BY PRODUCT_FINISH
HAVING AVG(STANDARD_PRICE)
'注意:這六個關鍵字若要同時出現,必須以這種順序呈現....(這是語法順序)

(這是處理順序)
FROM 指定涉及的表格(TABLE)
WHERE 找出符合指定條件的所有列(ROW)
GROUP BY 根據指定欄位的值組織列(ROW)
HAVING 找出符合指定條件的所有群組
SELECT 指定要顯示給使用者看的欄位(COLUMN)
ORDER BY 排列資料列(ROW)的順序

進階
等值合併
查詢:下訂單的所有顧客名稱
SELECT CUSTOMER_T.CUSTOMER_ID,ORDER_T.CUSTOMER_ID,CUSTOMER_NAME,ORDER_ID
FROM CUSTOMER_T,ORDER_T
WHERE CUSTOMER_T.CUSTOMER_ID = ORDER_T.CUSTOMER_ID;

自然合併
查詢:對於每下訂單的顧客名稱,查出他的姓名與訂單號碼為何?
SELECT CUSOTMER_T.ID,CUSTOMER_T.NAME,ORDER_T.ID
FROM CUSTOMER_T,ORDER_T
WHERE CUSTOMER_T.CUSTOMER_ID = ORDER_T.CUSTOMER_ID

外部合併
查詢:為CUSTOMER表格中的所有顧客,列出他們的顧客姓名.識別碼及訂單號碼.即使沒有訂單的顧客,也請列出他們的顧客識別碼與姓名
SELECT CUSTOMER_T.NAME,CUSTOMER_T.CUSTOMER_ID,ORDER_ID
FROM CUSTOMER_T LEFT OUTER JOIN ORDER_T
WHERE CUSTOMER_T.CUSTOMER_ID = ORDER_T.CUSTOMER_ID

查詢:為ORDER表格中的所有訂單,列出他們的顧客姓名.識別碼及訂單號碼.即使沒有顧客姓名,也要加入訂單號碼哦(這個查詢最主要的目的在於確認參考的完整性)
SELECT CUSTOMER_T.NAME,CUSTOMER_T.CUSTOMER_T.CUSTOMER_ID,ORDER_ID
FROM CUSTOMER_T RIGHT OUTER JOIN ORDER_T ON CUSTOMER_T.CUSTOMER_ID = ORDER_T.CUSTOMER_ID;

聯集合併
UNION JOIN = FULL OUTER JOIN
UNION JOIN <> UNION
UNION JOIN 的結果是每個合併

合併兩個表格的兩種方式:

  1. 利用合併技巧,在where子句中,加入兩個表格共同的欄位等式
  2. 利用子查詢或稱為巢狀查詢

子查詢
當要擷取與顯示來自數個關聯表的資料,並且未必是巢狀關係時,可以使用合併技巧.

查詢:對#1008下訂單的顧客姓名與地址(使用合併技巧)
SELECT CUSTOMER_NAME,CUSTOMER_ADDRESS,CITY,STATE,POSTAL_CODE
FROM CUSTOMER_T,ORDER_T
WHERE CUSTOMER_T.CUSTOMER_ID = ORDER_T.CUSTOMER_ID AND ORDER_T.ORDER_ID = 1008;

查詢:對#1008下訂單的顧客姓名與地址(使用子查詢)
SELECT CUSTOMER_NAME,CUSTOMER_ADDRESS,CITY,STATE,POSTAL_CODE
FROM CUSTOMER_T
WHERE CUSTOMER_T.CUSTOMER_ID = (SELECT ORDER_T.CUSTOMER_ID FROM ORDER_T WHERE ORDER_T.ORDER_ID = 1008)

注意:若要將子查詢的結果顯示在最終結果中,就得使用合併技巧,因為子查詢資料不能出現在最終的結果中(VIP)

查詢:哪些顧客下過訂單?(使用子查詢-傳回多筆值)
SELECT CUSTOMER_NAME
FROM CUSTOMER_T
WHERE CUSTOMER_T.CUSTOMER_ID IN
( SELECT DISTINCT CUSTOMER_ID FROM ORDER_T)

查詢:哪些顧客未訂購過電腦桌?(使用子查詢-傳回多筆值)
SELECT CUSTOMER_NAME
FROM CUSTOMER_T
WHERE CUSTOMER_ID NOT IN
(SELECT CUSTOMER_ID
FROM ORDER_T,ORDER_LINE_T,PRODUCT_T
WHERE ORDER_T.ORDER_ID = ORDER_LINE_T.ORDER_ID
AND ORDER_LINE_T.PRODUCT_ID = PRODUCT_T.PRODUCT_ID
AND PRODUCT_NAME = 'COMPUTER DEST' );

查詢:所有包含天然梣木傢具的訂單編號
SELECT ORDER_ID
FROM ORDER_LINE_T
WHERE EXITS
( SELECT *
FROM PRODUCT_T
WHERE PRODUCT_ID = ORDER_LINE_T.PRODUCT_ID
AND PRODUCT_FINISH = 'NATURAL ASH' );

在子查詢中使用EXITS時,它在意的是是否有符合條件的資料即可,
並不會利用子查詢的結果來篩選出母查詢(外層)最終的結果
還有啊,相關聯子查詢的處理順序會是從外到內,而一般的子查詢則是從內到外…有點不一樣

查詢:列出最高單價產品的明細(這是高級技巧)
SELECT PRODUCT_NAME,PRODUCT_FINISH,UNIT_PRICE
FROM PRODUCT_T PA
WHERE UNIT_PRICE > ALL
( SELECT UNIT_PRICE
FROM PRODUCT_T PB
WHERE PB.PRODUCT_ID PA.PRODUCT_ID )

查詢:哪個產品的標準價格高過平均標準價格?
SELECT PRODUCT_DESCRIPTION,STANDARD_PRICE,AVGPRICE
FROM ( SELECT AVG(STANDARD_PRICE) AVGPRICE FROM PRODUCT_T ),PRODUCT_T
WHERE STANDARD_PRICE > AVGPRICE ;

對「SQL-語法收集(初階.進階)」的一則回應

  1. 查詢:針對平均定價少於$750的外裝產品,列出這些外裝產品的外裝與平均定價.
    SELECT PRODUCT_FINISH,AVG(STANDARD_PRICE)
    FROM PRODUCT_V
    WHERE PRODUCT_FINISH IN (‘運動鞋’,’跑步鞋’,’淑女鞋’)
    GROUP BY PRODUCT_FINISH
    HAVING AVG(STANDARD_PRICE) < 750

  2. 查詢:所有包含天然梣木傢具的訂單編號
    SELECT ORDER_ID
    FROM ORDER_LINE_T
    WHERE EXITS
    ( SELECT *
    FROM PRODUCT_T
    WHERE PRODUCT_ID = ORDER_LINE_T.PRODUCT_ID
    AND PRODUCT_FINISH = ‘NATURAL ASH’ );

    在子查詢中使用EXITS時,它在意的是是否有符合條件的資料即可,
    並不會利用子查詢的結果來篩選出母查詢(外層)最終的結果
    還有啊,相關聯子查詢的處理順序會是從外到內,而一般的子查詢則是從內到外…有點不一樣

    —————————————–

    應該是exists 請更正

發表留言