#1. 为每个雇员行生成5个副本
SELECT E.empid,E.firstname,E.lastname,N.n
FROM HR.Employees AS E
CROSS JOIN dbo.Nums AS N
WHERE N.n <=5
ORDER BY n,empid;
#2. 返回美国客户,并为每个客户返回订单总数的总数量->
SELECT c.custid,
COUNT(DISTINCT o.orderid) AS numorders
SUM(d.qty) AS totalqty
FROM Sales.Customers c
JOIN Sales.Orders o
ON c.custid = o.custid
JOIN Sales.OrderDetails d
ON o.orderid = d.orderid
WHERE c.country = 'USA'
GROUP BY c.custid;
#3. 返回客户及其订单 包括没有下订单的客户
SELECT c.customers,
c.companyname,
o.orderid,
o.orderdate
FROM Sales.Customers c
LEFT JOIN Sales.Orders o
ON c.custid = o.custid;
#4. 返回没有下订单的客户
SELECT c.customers,
c.companyname
FROM Sales.Customers c
LEFT JOIN Sales.Orders o
ON c.custid = o.custid
WHERE o.orderid IS NULL;
#5. 返回2007年2月12日下订单的客户以及他们的订单alter
SELECT c.customers,
c.companyname,
o.orderid,
o.orderdate
FROM Sales.Customers c
JOIN Sales.Orders o
ON c.custid = o.custid
WHERE o.orderdate = '2007-02-12'
#6. 返回20070212下订单的客户订单还有没下订单的客户订单
SELECT c.customers,
c.companyname,
o.orderid,
o.orderdate
FROM Sales.Customers c
JOIN Sales.Orders o
ON c.custid = o.custid
WHERE o.orderdate = '2007-02-12'
UNOIN
SELECT c.customers,
c.companyname,
o.orderid,
o.orderdate
FROM Sales.Customers c
LEFT JOIN Sales.Orders o
ON c.custid = o.custid
WHERE o.orderid IS NULL;
############答案的做法(把订单日期看做是匹配条件!)
############这个时候比较麻烦的是当客户没有订单时在第二个表的日期是NULL,
############所以要么用ON+日期(首选),要么就两个表合并
SELECT c.custid,c.companyname,o.orderid,o.orderdate
FROM Sales.Customers AS c
LEFT JOIN Sales.Orders AS o
ON o.custid = c.custid
AND o.orderdate = '20070212'
# 7.还是要用
SELECT c.customers,
c.companyname,
CASE WHEN o.orderid IS NULL THEN 'NO'
ELSE 'YES'
END AS HashOrderOn70212
FROM Sales.Customers c
LEFT JOIN Sales.Orders o
ON c.custid = o.custid
AND o.orderdate = '2007-02-12'
重点:第6+7题