SELECT C.customerid, COUNT(O.orderid) AS numorders
FROM dbo.Customers AS C
LEFT OUTER JOIN dbo.Orders AS O
ON C.customerid = O.customerid
WHERE C.city = 'Madrid'
GROUP BY C.customerid
HAVING COUNT(O.orderid)
<
C.customerid
C.city
O.orderid
O.customerid
FISSA
Madrid
1
FRNDO
FISSA
Madrid
2
FRNDO
FISSA
Madrid
3
KRLOS
FISSA
Madrid
4
KRLOS
FISSA
Madrid
5
KRLOS
FISSA
Madrid
6
MRPHS
FISSA
Madrid
7
NULL
FRNDO
Madrid
1
FRNDO
FRNDO
Madrid
2
FRNDO
FRNDO
Madrid
3
KRLOS
FRNDO
Madrid
4
KRLOS
FRNDO
Madrid
5
KRLOS
FRNDO
Madrid
6
MRPHS
FRNDO
Madrid
7
NULL
KRLOS
Madrid
1
FRNDO
KRLOS
Madrid
2
FRNDO
KRLOS
Madrid
3
KRLOS
KRLOS
Madrid
4
KRLOS
KRLOS
Madrid
5
KRLOS
KRLOS
Madrid
6
MRPHS
KRLOS
Madrid
7
NULL
MRPHS
Zion
1
FRNDO
MRPHS
Zion
2
FRNDO
MRPHS
Zion
3
KRLOS
MRPHS
Zion
4
KRLOS
MRPHS
Zion
5
KRLOS
MRPHS
Zion
6
MRPHS
MRPHS
Zion
7
NULL
Step 1-J2:应用ON过滤,(JOIN 条件)
C.customerid
C.city
O.orderid
O.customerid
FRNDO
Madrid
1
FRNDO
FRNDO
Madrid
2
FRNDO
KRLOS
Madrid
3
KRLOS
KRLOS
Madrid
4
KRLOS
KRLOS
Madrid
5
KRLOS
MRPHS
Zion
6
MRPHS
Step 1-J3:添加外部列
C.customerid
C.city
O.orderid
O.customerid
FISSA
Madrid
NULL
NULL
FRNDO
Madrid
1
FRNDO
FRNDO
Madrid
2
FRNDO
KRLOS
Madrid
3
KRLOS
KRLOS
Madrid
4
KRLOS
KRLOS
Madrid
5
KRLOS
MRPHS
Zion
6
MRPHS
注意:由于数据现在还没有被分组,因此现在你不能使用聚合运算-例如:你不能使用这样的句子 WHERE orderdate = MAX(orderdate)。另外你也不能使用SELECT子句中创建的变量别名,因为现在还没有处理SELECT子句-例如你不能写这样的句子:SELECT YEAR(orderdate) AS orderyear . . . WHERE orderyear > 2008.
应用这个过滤
WHERE C.city = 'Madrid'
这时生成的临时表VT2的内容如下:
C.customerid
C.city
O.orderid
O.customerid
FISSA
Madrid
NULL
NULL
FRNDO
Madrid
1
FRNDO
FRNDO
Madrid
2
FRNDO
KRLOS
Madrid
3
KRLOS
KRLOS
Madrid
4
KRLOS
KRLOS
Madrid
5
KRLOS
Groups C.customerid
C.customerid
C.city
O.orderid
O.customerid
FISSA
FISSA
Madrid
NULL
NULL
FRNDO
FRNDO
Madrid
1
FRNDO
FRNDO
Madrid
2
FRNDO
KRLOS
Madrid
3
KRLOS
KRLOS
KRLOS
Madrid
4
KRLOS
KRLOS
Madrid
5
KRLOS
sql最终返回的结果中,每一个分组必须只能返回一行(除非被过滤掉),因此当一个sql语句中使用了GROUP BY时,在GROUP BY后面处理的子句,如SELECT,HAVING子句等,只能使用出现在GROUP BY后面的列,对于没有出现GROUP BY后面的列必须使用聚合函数(如 MAX ,MIN,COUNT,AVG等),保证每一个GROUP只返回一行。
SELECT子句中的表达式可以返回或者操作前一步表中返回的基本列。如果这个sql语句是一个聚合查询,在Step 3之后,你只能使用GROUP BY中的列,对不属于GROUP集合中的列必须使用聚合运算。不属于FROM表中基本列的必须为其起一个别名,如YEAR(orderdate) AS orderyear。
注意:在SELECT子句中创建的别名,不能在之前的Step中使用,即使在SELECT子句中也不能。原因是sql的很多操作是同时操作(all at once operation),至于什么是all-at-once operation这里就不再介绍了。因此,SELECT子句中创建的别名只能在后面的子句中使用,如ORDER BY。例如:SELECT YEAR(orderdate) AS orderyear . . . ORDER BY orderyear。
在这个例子中:
SELECT C.customerid, COUNT(O.orderid) AS numorders
SELECT C.customerid, COUNT(O.orderid) AS numorders
FROM dbo.Customers AS C
LEFT OUTER JOIN dbo.Orders AS O
ON C.customerid = O.customerid
WHERE C.city = 'Madrid'
GROUP BY C.customerid
HAVING COUNT(O.orderid)
<
C.customerid
C.city
O.orderid
O.customerid
FISSA
Madrid
1
FRNDO
FISSA
Madrid
2
FRNDO
FISSA
Madrid
3
KRLOS
FISSA
Madrid
4
KRLOS
FISSA
Madrid
5
KRLOS
FISSA
Madrid
6
MRPHS
FISSA
Madrid
7
NULL
FRNDO
Madrid
1
FRNDO
FRNDO
Madrid
2
FRNDO
FRNDO
Madrid
3
KRLOS
FRNDO
Madrid
4
KRLOS
FRNDO
Madrid
5
KRLOS
FRNDO
Madrid
6
MRPHS
FRNDO
Madrid
7
NULL
KRLOS
Madrid
1
FRNDO
KRLOS
Madrid
2
FRNDO
KRLOS
Madrid
3
KRLOS
KRLOS
Madrid
4
KRLOS
KRLOS
Madrid
5
KRLOS
KRLOS
Madrid
6
MRPHS
KRLOS
Madrid
7
NULL
MRPHS
Zion
1
FRNDO
MRPHS
Zion
2
FRNDO
MRPHS
Zion
3
KRLOS
MRPHS
Zion
4
KRLOS
MRPHS
Zion
5
KRLOS
MRPHS
Zion
6
MRPHS
MRPHS
Zion
7
NULL
Step 1-J2:应用ON过滤,(JOIN 条件)
C.customerid
C.city
O.orderid
O.customerid
FRNDO
Madrid
1
FRNDO
FRNDO
Madrid
2
FRNDO
KRLOS
Madrid
3
KRLOS
KRLOS
Madrid
4
KRLOS
KRLOS
Madrid
5
KRLOS
MRPHS
Zion
6
MRPHS
Step 1-J3:添加外部列
C.customerid
C.city
O.orderid
O.customerid
FISSA
Madrid
NULL
NULL
FRNDO
Madrid
1
FRNDO
FRNDO
Madrid
2
FRNDO
KRLOS
Madrid
3
KRLOS
KRLOS
Madrid
4
KRLOS
KRLOS
Madrid
5
KRLOS
MRPHS
Zion
6
MRPHS
注意:由于数据现在还没有被分组,因此现在你不能使用聚合运算-例如:你不能使用这样的句子 WHERE orderdate = MAX(orderdate)。另外你也不能使用SELECT子句中创建的变量别名,因为现在还没有处理SELECT子句-例如你不能写这样的句子:SELECT YEAR(orderdate) AS orderyear . . . WHERE orderyear > 2008.
应用这个过滤
WHERE C.city = 'Madrid'
这时生成的临时表VT2的内容如下:
C.customerid
C.city
O.orderid
O.customerid
FISSA
Madrid
NULL
NULL
FRNDO
Madrid
1
FRNDO
FRNDO
Madrid
2
FRNDO
KRLOS
Madrid
3
KRLOS
KRLOS
Madrid
4
KRLOS
KRLOS
Madrid
5
KRLOS
Groups C.customerid
C.customerid
C.city
O.orderid
O.customerid
FISSA
FISSA
Madrid
NULL
NULL
FRNDO
FRNDO
Madrid
1
FRNDO
FRNDO
Madrid
2
FRNDO
KRLOS
Madrid
3
KRLOS
KRLOS
KRLOS
Madrid
4
KRLOS
KRLOS
Madrid
5
KRLOS
sql最终返回的结果中,每一个分组必须只能返回一行(除非被过滤掉),因此当一个sql语句中使用了GROUP BY时,在GROUP BY后面处理的子句,如SELECT,HAVING子句等,只能使用出现在GROUP BY后面的列,对于没有出现GROUP BY后面的列必须使用聚合函数(如 MAX ,MIN,COUNT,AVG等),保证每一个GROUP只返回一行。
SELECT子句中的表达式可以返回或者操作前一步表中返回的基本列。如果这个sql语句是一个聚合查询,在Step 3之后,你只能使用GROUP BY中的列,对不属于GROUP集合中的列必须使用聚合运算。不属于FROM表中基本列的必须为其起一个别名,如YEAR(orderdate) AS orderyear。
注意:在SELECT子句中创建的别名,不能在之前的Step中使用,即使在SELECT子句中也不能。原因是sql的很多操作是同时操作(all at once operation),至于什么是all-at-once operation这里就不再介绍了。因此,SELECT子句中创建的别名只能在后面的子句中使用,如ORDER BY。例如:SELECT YEAR(orderdate) AS orderyear . . . ORDER BY orderyear。
在这个例子中:
SELECT C.customerid, COUNT(O.orderid) AS numorders