本題目主要來自大陸網站,台灣有人貼,實作一下增加一下經驗。部份題目有問題 ,無法解出來或是資料有問題
相關資料可由下列找到
50題:https://zhuanlan.zhihu.com/p/389183029
30題: https://www.cnblogs.com/qijiang123/p/14330248.html
資料庫資料表主要來源可以 由 https://ithelp.ithome.com.tw/articles/10212163 來Download
|
|
|
|
|
|
|
|
|
|
|
|
SELECT
訂購日期,
訂單ID,
客戶ID,
雇員ID
FROM
訂單
WHERE
DATE(訂購日期) BETWEEN '1996-07-01'
AND '1996-07-15'
SELECT
供應商ID,
公司名稱,
地區,
城市,
電話
FROM
供應商
WHERE
地區 = "華北"
AND 連絡人職務 = "銷售代表"
SELECT
供應商ID,
公司名稱,
地區,
城市,
電話
FROM
供應商
WHERE
地區 IN ('華東', '華南')
OR 城市 = '天津'
SELECT
供應商ID,
公司名稱,
地區,
城市,
電話
FROM
供應商
WHERE
地區 IN ('華東', '華南')
SELECT
訂購日期,
訂單ID,
客戶ID,
公司名稱,
雇員ID,
姓氏,
名字,
CONCAT(姓氏, 名字) AS 姓名
FROM
訂單
JOIN 客戶 USING(客戶ID)
JOIN 雇員 USING(雇員ID)
WHERE
date (訂購日期) BETWEEN '1996-07-01'
AND '1996-07-15'
ORDER BY
姓氏,
名字,
訂單ID
SELECT
訂單ID,
運貨商.公司名稱,
產品.產品名稱
FROM
訂單
LEFT JOIN 運貨商 ON 運貨商 = 運貨商ID
LEFT JOIN 訂單明細 USING (訂單ID)
LEFT JOIN 產品 USING (產品ID)
WHERE
訂單ID IN("10248", "10254")
SELECT
訂單ID,
產品.產品名稱,
訂單明細.數量,
訂單明細.單價,
訂單明細.折扣
FROM
訂單
LEFT JOIN 訂單明細 USING (訂單ID)
LEFT JOIN 產品 USING (產品ID)
WHERE
訂單ID IN("10248", "10254")
SELECT
訂單ID,
產品.產品名稱,
(
訂單明細.數量 * 訂單明細.單價
)*(1 - 訂單明細.折扣) AS 銷售額
FROM
訂單
LEFT JOIN 訂單明細 USING (訂單ID)
LEFT JOIN 產品 USING (產品ID)
WHERE
訂單ID IN("10248", "10254")
9. 查詢所有運貨商的公司名稱和電話
SELECT
公司名稱,
電話
FROM
運貨商
SELECT
公司名稱,
客戶.電話,
客戶.傳真,
客戶.連絡人姓名,
客戶.連絡人職務
FROM
客戶
SELECT 產品ID,
產品名稱,
庫存量
FROM 產品
WHERE 單價 BETWEEN 10 AND 30
SELECT 產品.產品名稱,
產品.單價,
供應商.公司名稱,
供應商.電話
FROM 產品
JOIN 供應商 USING(供應商id)
WHERE 單價 > 20
SELECT 訂單ID,
產品名稱,
數量
FROM 訂單
JOIN 訂單明細 USING(訂單ID)
JOIN 產品 USING(產品ID)
WHERE YEAR(訂單.訂購日期)= 1996
AND 貨主城市 IN ("北京",
"上海")
SELECT 訂單id,
產品名稱,
round((訂單明細.單價*數量)*(1-折扣), 2) AS 銷售金額
FROM 訂單
JOIN 訂單明細 USING(訂單id)
JOIN 產品 USING(產品id)
WHERE 貨主地區="華北"
SELECT
公司名稱,
運貨商,
COUNT(訂單ID)
FROM
訂單
JOIN 運貨商 ON 運貨商 = 運貨商ID
AND YEAR(訂購日期)= "1997"
GROUP BY
運貨商,
公司名稱
SELECT
訂單ID,
SUM(訂單明細.數量)
FROM
訂單
LEFT JOIN 訂單明細 USING(訂單ID)
WHERE
訂購日期 BETWEEN "1997-1-1"
AND "1997-6-30"
GROUP BY
訂單ID
ORDER BY
訂單ID
SELECT
類別id,
類別名稱,
AVG(單價) 平均價格
FROM
類別
LEFT JOIN 產品 USING(類別ID)
GROUP BY
類別id
SELECT
地區,
COUNT(*) AS 數量
FROM
客戶
GROUP BY
地區
SELECT 公司名稱,
城市
FROM `供應商`
SELECT DISTINCT 公司名稱,
類別名稱
FROM 產品
JOIN 供應商 USING(供應商ID)
JOIN 類別 USING(類別ID)
WHERE 類別名稱="海鮮"
AND 地區="華北"
SELECT 訂單id,
運貨商.公司名稱,
ROUND(SUM(訂單明細.單價 * 訂單明細.數量 *(1 -折扣)), 0) AS sales
FROM 訂單
JOIN 訂單明細 USING(訂單ID)
JOIN 運貨商 ON 運貨商 = 運貨商ID
GROUP BY 訂單ID
ORDER BY sales DESC
LIMIT 5

SELECT 產品名稱
FROM 產品
WHERE 單位數量 LIKE "%箱%"
方法一
WITH sid AS
(SELECT 供應商ID
FROM 供應商
WHERE 城市="重慶" )
SELECT 產品.產品名稱
FROM 產品
JOIN sid USING(供應商ID)
方法二
SELECT 產品.產品名稱
FROM 供應商,
產品
WHERE 城市="重慶"
AND 產品.供應商ID=供應商.供應商ID
SELECT 訂單ID,
sum(FORMAT(單價 * 數量 * (1 - 折扣), 2)) 訂單銷售額
FROM 訂單明細
WHERE 訂單ID IN
(SELECT 訂單ID
FROM 訂單
JOIN 雇員 USING(雇員ID)
WHERE CONCAT(姓氏, 名字) = '鄭建傑' )
GROUP BY 訂單ID
ORDER BY 訂單銷售額 DESC
WITH d AS
(
SELECT 訂單.訂單id
FROM 雇員,
訂單,
訂單明細
WHERE Concat(雇員.姓氏, 雇員.名字) = "鄭建傑"
AND 雇員.雇員id = 訂單.雇員id
AND 訂單.訂單id= 訂單明細.訂單id
)
SELECT 訂單.訂單id,sum(FORMAT(單價 * 數量 * (1 - 折扣), 2)) 訂單銷售額
FROM 訂單,
訂單明細
WHERE 訂單.訂單id = 訂單明細.訂單id AND 訂單.訂單id IN (SELECT 訂單id FROM d)
GROUP BY 訂單.訂單id
ORDER BY 訂單銷售額 DESC

SELECT
產品.產品名稱,
(
(d.單價 * d.數量)*(1 - d.折扣)
) 銷售金額,
運貨商.公司名稱
FROM
訂單
JOIN 訂單明細 AS d USING(訂單ID)
JOIN 產品 USING(產品ID)
JOIN 運貨商 ON 運貨商 = 運貨商id
WHERE
訂單.訂單ID = 10284

SELECT
*
FROM
產品
JOIN 訂單明細 USING(產品ID)
JOIN 訂單 USING(訂單id)
`

SELECT
訂單ID,
訂購日期,
發貨日期,
公司名稱,
(
單價 * 數量 *(1 - 折扣)
) AS 銷售額
FROM
訂單明細
JOIN 訂單 USING(訂單ID)
JOIN 客戶 USING(客戶ID)
ORDER BY
銷售額 DESC
LIMIT
10

計算銷量前10位的訂單,查詢結果請顯示
訂單 ID,訂單日期,公司名稱,發貨日期,銷售額,並排序
SELECT 訂單.訂單id,
訂單.訂購日期,
客戶.公司名稱,
訂單.到貨日期,
Round(Sum((單價 * 數量) - (單價 * 數量) * 折扣), 0) AS 銷售額
FROM 訂單,
訂單明細,
客戶
WHERE 訂單.訂單id = 訂單明細.訂單id
AND 客戶.客戶ID=訂單.客戶ID GROUP BY 訂單id
ORDER BY 銷售額 DESC
LIMIT 10

#10. 按年度統計銷售額
SELECT SUBSTR(訂單.訂購日期, 1, 4) AS 年度,
Round(Sum((單價 * 數量) - (單價 * 數量) * 折扣), 0) AS 銷售額
FROM 訂單,
訂單明細
WHERE 訂單.訂單id = 訂單明細.訂單id GROUP BY 年度

SELECT 供應商.公司名稱,COUNT(產品.產品ID) AS 數量
FROM 產品
INNER JOIN 供應商 USING(供應商ID)
GROUP BY 供應商ID
ORDER BY 數量 DESC
LIMIT 1

SELECT 類別.類別名稱 ,COUNT(*) AS 類別數量
FROM 產品
LEFT JOIN 類別 USING(類別ID)
GROUP BY 類別.類別名稱
ORDER BY 類別數量 DESC
LIMIT 1

SELECT 運貨商.公司名稱,COUNT(*) AS 運貨次數
FROM 訂單
LEFT JOIN 運貨商 on 訂單.運貨商 =運貨商.運貨商ID
GROUP BY 訂單.運貨商
ORDER BY 運貨次數 DESC
LIMIT 1

SELECT
類別.類別名稱,
產品.產品名稱,
ROUND(
SUM(
(
訂單明細.單價 * 訂單明細.數量
) - (
訂單明細.單價 * 訂單明細.數量
) * 訂單明細.折扣
),
0
) AS 銷售額
FROM
訂單
LEFT JOIN 訂單明細 USING(訂單ID)
LEFT JOIN 產品 USING(產品ID)
LEFT JOIN 類別 USING(類別ID)
GROUP BY
類別ID,
產品.產品名稱
ORDER BY
類別.類別名稱,
產品.產品名稱,
銷售額 DESC

SELECT 訂單.訂單ID,
SUM(((訂單明細.單價 * 訂單明細.數量)*(1-訂單明細.折扣))) AS 銷售額
FROM 訂單
LEFT JOIN 訂單明細 USING(訂單ID)
LEFT JOIN 產品 USING(產品ID)
LEFT JOIN 類別 USING(類別ID)
WHERE 類別.類別名稱="海鮮"
GROUP BY 訂單.訂單ID
ORDER BY 銷售額 DESC
LIMIT 1

SELECT 訂單.訂單ID ,QUARTER(訂單.訂購日期)
FROM 訂單
SELECT YEAR(訂單.訂購日期),
QUARTER(訂單.訂購日期) as 季,
Round(SUM(((訂單明細.單價 * 訂單明細.數量)*(1-訂單明細.折扣))), 2) AS 銷售額
FROM 訂單
LEFT JOIN 訂單明細 USING(訂單ID)
GROUP BY YEAR(訂單.訂購日期),
QUARTER(訂單.訂購日期)

SELECT d.訂單ID,
k.公司名稱 AS 客戶名稱,
k.地區 AS 客戶所在地區,
round(sum(dm.單價*dm.數量*(1-dm.折扣)), 2) AS 銷售額
FROM 訂單 d
JOIN 訂單明細 dm ON d.訂單ID =dm.訂單ID
JOIN 客戶 k ON d.客戶ID=k.客戶ID
GROUP BY d.訂單ID
HAVING round(sum(dm.單價*dm.數量*(1-dm.折扣)), 2) > 5000
ORDER BY round(sum(dm.單價*dm.數量*(1-dm.折扣)), 2) DESC
FORMAT把數值每三位數用逗號(,)區分時,或是想要調整小數點顯示的位數時,可以使用FORMAT函式來達成目的。
例如以下的情形:
每三位數用逗號(,)區分: 123456 -> 123,456
顯示小數點下兩位數: 123.456 -> 123.45
SELECT 訂單.訂單ID,
客戶.公司名稱,
客戶.地區,
round(SUM(((訂單明細.單價 * 訂單明細.數量)*(1-訂單明細.折扣))), 0) AS 銷售額
FROM 訂單
INNER JOIN 訂單明細 USING(訂單ID)
INNER JOIN 客戶 USING(客戶ID)
GROUP BY 訂單.訂單ID
HAVING 銷售額 >5000

SELECT 產品.產品名稱,
YEAR(訂購日期),
round(SUM(((訂單明細.單價 * 訂單明細.數量)*(1-訂單明細.折扣))), 0) AS 銷售額
FROM 訂單
LEFT JOIN 訂單明細 USING(訂單ID)
LEFT JOIN 產品 USING(產品ID)
GROUP BY 產品名稱, YEAR(訂單.訂購日期)
HAVING 銷售額<2000
ORDER BY
銷售額 DESC

SELECT *
FROM 訂單
WHERE
訂單ID LIKE "102%"
SELECT *
FROM 訂單
WHERE 客戶ID IN
(SELECT 客戶ID
FROM 客戶
WHERE 公司名稱 ="中碩貿易"
OR 公司名稱 ="學仁貿易"
OR 公司名稱 ="正人資源"
OR 公司名稱 ="中通")

SELECT *
FROM 訂單
WHERE MONTH(訂購日期) %2 =0
SELECT *
FROM 訂單
LEFT JOIN 訂單明細 AS b USING(訂單ID)
WHERE FORMAT(b.折扣, 2)=0.15
UNION
SELECT *
FROM 訂單
LEFT JOIN 訂單明細 AS b USING(訂單ID)
WHERE FORMAT(b.折扣, 2)=0.20
SELECT *
FROM 雇員
WHERE TIMESTAMPDIFF(YEAR,出生日期,雇用日期) >=30

DATEDIFF(g.雇用日期,g.出生日期)/365 > 30?????
為空的時候,nofilter)
SELECT *
FROM 產品
INNER JOIN 供應商 USING (供應商ID)
INNER JOIN 類別 USING(類別ID)
WHERE 單價 > 30
SELECT 類別ID,SUM(單價*庫存量)
FROM 產品
GROUP BY 類別ID

方法一
SELECT 訂單id,c.產品名稱,g.公司名稱,dm.單價,dm.數量
FROM 訂單明細 dm
JOIN 產品 c using(產品id)
JOIN 供應商 g using(供應商id)
WHERE dm.訂單id IN (SELECT d.訂單id
FROM 訂單 d
JOIN 訂單明細 dm
ON d.訂單id = dm.訂單id
JOIN 雇員 g
ON d.雇員id = g.雇員id
WHERE g.職務 = "銷售代表"
GROUP BY d.訂單id
HAVING Sum(dm.數量 * dm.單價 * ( 1 - dm.折扣 )) <
2000)
方法二
WITH overid AS
(SELECT d.訂單id
FROM 訂單 d
JOIN 訂單明細 dm
ON d.訂單id = dm.訂單id
JOIN 雇員 g
ON d.雇員id = g.雇員id
WHERE g.職務 = "銷售代表"
GROUP BY d.訂單id
HAVING Sum(dm.數量 * dm.單價 * ( 1 - dm.折扣 )) < 2000
)
SELECT 訂單id,產品.產品名稱,供應商.公司名稱,訂單明細.單價,訂單明細.數量
FROM 訂單明細
JOIN 產品 using(產品id)
JOIN 供應商 using(供應商id)
WHERE 訂單id IN (SELECT * FROM overid )

SELECT d.`訂單ID`,
c.`產品名稱`,
g.`公司名稱`,
g.`城市`
FROM `訂單` d,
`訂單明細` m,
`客戶` k,
`產品` c,
`供應商` g
WHERE d.`訂單ID` = m.`訂單ID`
AND m.`產品ID` = c.`產品ID`
AND c.`供應商ID` = g.`供應商ID`
AND d.`客戶ID` = k.`客戶ID`
AND k.`公司名稱` = '艾德高科技'
SELECT
訂單ID,
TIMESTAMPDIFF(DAY, 訂購日期, 發貨日期) AS 發貨期,
TIMESTAMPDIFF(DAY, 發貨日期, 到貨日期) AS 運貨期
FROM
訂單
WHERE
到貨日期 IS NOT NULL
AND 發貨日期 IS NOT NULL
AND 訂購日期 IS NOT NULL
ORDER BY
發貨期 DESC
TIPS:datediff 兩個日期差天數
本題這樣作會有問題,因為三個時間資料有數筆NULL或是未來訂單如11069

49. 將產品表和運貨商兩個無關的表整合為一個表(真不知為何做這一題)
SELECT p.*,t.*
FROM 訂單
LEFT JOIN 訂單明細 USING(訂單ID)
LEFT JOIN 產品 as p USING(產品ID)
LEFT JOIN 運貨商 AS t ON 訂單.運貨商 =t.運貨商ID
SELECT
distinct CONCAT(雇員.姓氏, 雇員.名字) 雇員姓名,
客戶.公司名稱
FROM
訂單
LEFT JOIN 客戶 USING(客戶ID)
LEFT JOIN 雇員 USING(雇員ID)
WHERE
客戶.公司名稱 = "福星制衣廠股份有限公司"
AND 雇員.城市 = "北京"
ORDER BY
訂單ID