表結構與數據:https://github.com/XuePeng87/TSQLV4git
練習1
練習內容:編寫一個查詢,爲每一個僱員生成5個副本 |
涉及的表:HR.Employees, dbo.Nums |
輸出的列:empid, firstname, lastname, n |
正確結果:45行 |
SELECT E.empid, E.firstname, E.lastname, N.n
FROM dbo.Nums AS N
CROSS JOIN HR.Employees AS E
WHERE N.n < 6 ORDER BY N.n, E.empid;
練習內容:編寫一個查詢,每一個僱員返回一行,而且日期在2015年6月12日到2015年6月16日範圍內 |
涉及的表:HR.Employees, dbo.Nums |
輸出的列:empid, dt |
正確結果:45行 |
SELECT E.empid, DATEADD(day, N.n - 1, '20150612') AS dt
FROM HR.Employees AS E
CROSS JOIN dbo.Nums N
WHERE N <= DATEDIFF(day, '20150612', '20150616') + 1
ORDER BY E.empid, dt;
練習2
練習內容:返回美國客戶,併爲每一個客戶返回訂單總數和總數量 |
涉及的表:Sales.Customers, Sales.Orders, Sales.OrderDetails |
輸出的列:custid, numorders, totalqty |
正確結果:13行 |
SELECT C.custid, COUNT(DISTINCT O.orderid) AS numorders, SUM(OD.qty) AS totalqty
FROM Sales.Customers C
JOIN Sales.Orders O ON O.custid = C.custid
JOIN Sales.OrderDetails OD ON OD.orderid = O.orderid
WHERE C.country = N'USA'
GROUP BY C.custid;
練習3
練習內容:返回客戶及其訂單,包括沒有下訂單的客戶 |
涉及的表:Sales.Customers, Sales.Orders |
輸出的列:custid, companyname, orderid, orderdate |
正確結果:832行 |
SELECT C.custid, C.companyname, O.orderid, O.orderdate
FROM Sales.Customers C
LEFT OUTER JOIN Sales.Orders O ON O.custid = C.custid;
練習4
練習內容:返回沒有下訂單的客戶 |
涉及的表:Sales.Customers, Sales.Orders |
輸出的列:custid, companyname |
正確結果:2行 |
SELECT C.custid, C.companyname
FROM Sales.Customers C
LEFT OUTER JOIN Sales.Orders O ON O.custid = C.custid
WHERE O.orderid IS NULL;
練習5
練習內容:返回2015年2月12日下訂單的客戶,以及他們的訂單 |
涉及的表:Sales.Customers, Sales.Orders |
輸出的列:custid, companyname, orderid, orderdate |
正確結果:2行 |
SELECT C.custid, C.companyname, O.orderid, O.orderdate
FROM Sales.Customers C
LEFT OUTER JOIN Sales.Orders O ON O.custid = C.custid
WHERE O.orderdate = '20150212'
練習6
練習內容:返回2015年2月12日下訂單的客戶,以及他們的訂單。此外,還返回這一天沒有下訂單的客戶 |
涉及的表:Sales.Customers, Sales.Orders |
輸出的列:custid, companyname, orderid, orderdate |
正確結果:91行 |
SELECT C.custid, C.companyname, O.orderid, O.orderdate
FROM Sales.Customers C
LEFT OUTER JOIN Sales.Orders O ON O.custid = C.custid AND O.orderdate = '20150212'
練習7
練習內容:返回全部客戶與,並基於客戶在2015年2月12日是否有訂單爲其返回Yes/No值 |
涉及的表:Sales.Customers, Sales.Orders |
輸出的列:custid, companyname, HasOrderOn20150212 |
正確結果:91行 |
SELECT C.custid, C.companyname,
CASE WHEN O.orderid IS NULL THEN 'No'
ELSE 'Yes' END AS HasOrderOn20150212
FROM Sales.Customers C
LEFT OUTER JOIN Sales.Orders O ON O.custid = C.custid AND O.orderdate = '20150212'