查找与“张小林”在同一个省市的其他客户情况。
select * from CustomerInfo where [所在省市] in
( SELECT [所在省市] from CustomerInfo where [客户姓名]='张小林' )
这样查询的结果记录有张小林,题目是其他客户情况。
可以使用子查询来判断不是一个人。
SELECT * from CustomerInfo a WHERE [所在省市] IN
(SELECT [所在省市] FROM CustomerInfo b
WHERE b.[客户姓名]='张小林' and a.[客户编号] <> b.[客户编号])
查找未订购“食品”类商品的客户情况。
SELECT * #查询没订购食品类的客户情况
FROM CustomerInfo
WHERE 客户编号 NOT IN
( SELECT 客户编号 #查询了订购食品类 的客户编号FROM OrderList WHERE 商品编号 IN ( SELECT [商品编号] #查询食品类的编号FROM GoodsInfo WHERE 商品类别 = '食品' ) )
带比较运算符的子查询
在OrderList表中查找订购了商品编号为“10010001”的商品、且订购数量超过全表中该商品平均订购数的记录。
select * from OrderList #查询10010001的大于平均订购数量的记录where [商品编号]= '10010001'AND 数量 >
(select AVG([数量]) from OrderList
where [商品编号]= '10010001') #查询10010001的平均订购数量
找出每个客户超过他订购商品平均数量的商品编号。
select [客户编号],[商品编号] from OrderList awhere 数量>(select AVG (数量) from OrderList b where b.[客户编号]=a.[客户编号] )
这是一个相关子查询,内层查询的条件:a.客户编号=b.客户编号,与外层查询有关。内层查询是求一个客户订购商品数量的平均值,至于要求的是哪个客户的平均值,是由外层查询当前正处理的元组来决定的。
带ALL(SOME)或ANY谓词的子查询
- ALL 指定表达式要与子查询结果集中的每个值都进行比较,当表达式与每个值都满足比较关系时,才返回 TRUE ,否则返回 FALSE 。
- • ANY 与 SOME 的限制含义相同,通常采用 ANY ,表示表达式只要与子查询结果集中的某个值满足比较关系时,就返回 TRUE ,否则返回 FALSE 。
查找比所有食品类的商品单价都低的商品信息。
SELECT * from GoodsInfo WHERE
[商品类别] <> '食品' AND [单价] < all
(
SELECT [单价] from GoodsInfo where [商品类别] = '食品')
查找比某个食品类的商品单价低的商品信息。
SELECT * from GoodsInfo WHERE [商品类别] <> '食品' AND [单价] < any(
SELECT [单价] from GoodsInfo where [商品类别] = '食品')
带EXISTS谓词的子查询
- EXISTS谓词用于测试子查询的结果是否为空表。若子查询的结果集不空,则EXISTS返回TRUE,否则返回FALSE。
- EXISTS还可与NOT结合使用,即NOT EXISTS,其返回值与EXIST刚好相反。
查找订购了编号为“10010001”商品的客户姓名。
SELECT [客户姓名] from CustomerInfo a
where EXISTS (select * from OrderList b where b.[客户编号] =a.[客户编号]
and b.[商品编号]='10010001')
查询至少订购了编号为“100001”的客户所订购的全部商品的客户编号。
SELECT DISTINCT 客户编号 #从OrderList表中选择不重复的客户编号,并给这个表指定了一个别名a
FROM OrderList a WHERE NOT EXISTS( SELECT *FROM OrderList b WHERE b.客户编号='100001' #排除客户编号为'100001'的客户AND NOT EXISTS( SELECT *FROM OrderList c WHERE c.客户编号=a.客户编号 #是在查找那些没有订购客户编号为'100001'所订购的所有商品的客户。AND c.商品编号=b.商品编号))
已经订购了客户编号为'100001'所订购的所有商品的客户编号,但排除了客户编号为'100001'本身。
集合查询
查询订购了编号为“10010001”或“10020001”商品的客户的编号。
SELECT 客户编号FROM OrderListWHERE 商品编号='10010001'
UNION
SELECT 客户编号FROM OrderListWHERE 商品编号='10020001'
查询单价小于50的商品与库存量大于20的商品的交集。
SELECT 商品编号, 商品类别, 商品名称, 品牌, 单价,生产商, 保质期, 库存量FROM GoodsInfoWHERE 单价<50
INTERSECT
SELECT 商品编号, 商品类别, 商品名称, 品牌, 单价, 生产商, 保质期, 库存量FROM GoodsInfoWHERE 库存量>20
是查询单价小于50且库存量大于20的商品
查询单价小于50的商品与库存量大于20的商品的差集。
SELECT 商品编号, 商品类别, 商品名称, 品牌, 单价, 生产商, 保质期, 库存量FROM GoodsInfoWHERE 单价<50
EXCEPT
SELECT 商品编号, 商品类别, 商品名称, 品牌, 单价, 生产商, 保质期, 库存量FROM GoodsInfoWHERE 库存量>20
实际上是查询单价小于50且库存量不大于20的商品。