子查询:在查询条件中,可以使用另一个查询的结果作为条件的一部分,作为查询条件一部分的查询称为子查询。
IN子查询用于判断一个给定值是否在子查询的结果集中,格式为:
Expression [ NOT ] IN ( subquery )
比较子查询。它让表达式的值与子查询的结果进行比较运算,格式为:
expression 比较运算符 [ ALL | SOME | ANY ] ( subquery )
EXISTS子查询。带EXISTS的子查询不返回任何记录,只产生逻辑值TRUE或者FALSE,它的作用是在WHERE子句中测试子查询返回的行是否存在。 格式为:
[ NOT ] EXISTS ( subquery )
课堂实践
--1.IN子查询。查询有商品反馈信息的客户信息,要求显示客户编号和客户联系人。
USE DB_CRM
--打开数据库DB_CRM
SELECT CID,CContact
FROM TB_Customer
WHERE CID IN(SELECT CID
FROM TB_Feedback)
--IN子查询比较的字段必须是一样的
--2.比较子查询。查询客户积分在平均积分以上的客户信息,要求显示的客户编号、客户单位、客户联系人和客户积分。
USE DB_CRM
--打开数据库DB_CRM
SELECT CID,CCompany,CContact,CIntegration
FROM TB_Customer
WHERE CIntegration >=all(SELECT CIntegration
FROM TB_Customer)
--相比较的数据类型必须是一样的
--3.EXISTS子查询。查询从来没有购买商品的客户信息,要求显示客户编号、客户单位、客户联系人和客户电话。
USE DB_CRM
--打开数据库DB_CRM
SELECT CID,CCompany,CContact,CPhone
FROM TB_Customer
WHERE NOT EXISTS (SELECT *
FROM TB_Buy
WHERE TB_Customer.CID=CID)
--EXISTS只返回TRUE或者FALSE。
--(4)使用子查询,查询客户积分高于70的客户信息,要求显示客户编号、客户信用档案编号、客户品德及素质评分。
use DB_CRM
select CID,CCreditID,CustAblity
from TB_CustCredit
where CID in (SELECT CID
FROM TB_Customer
where CIntegration>70)
--(5)使用子查询,统计至少订购过两次的客户信息,要求显示客户编号、客户单位和客户联系人。
use DB_CRM
select CID,CCompany,CContact
from TB_Customer
where CID in(select CID
from TB_Buy
group by CID
having count(CID)>=2)
--(6)使用子查询,查询不良记录评分最高的客户信息,要求显示客户编号、客户单位和客户联系人。
USE DB_CRM
select CID,CContact,CCompany
from TB_Customer
where CID in (select CID
from TB_CustCredit
where CustPoorRD>=all(select CustPoorRD
from TB_CustCredit))
--(7)使用子查询,查询比上海客户信用得分高的浙江的客户信息,要求显示客户编号、客户单位和客户联系人。
select cid,ccompany,ccontact
from tb_customer
where cid in
(select cid
from tb_custcredit
where custcredit in
(select custcredit
from tb_customer,tb_custcredit
where tb_customer.cid=tb_custcredit.cid
and caddress like '%浙江%' and custcredit >all
(select custcredit
from tb_customer,tb_custcredit
where tb_customer.cid=tb_custcredit.cid
and caddress like '%上海%')))
--(8)使用子查询,查询在2013年没有完成任务计划的业务员信息,要求显示业务员编号、姓名和所在部门。
select SID,Sname,SDID
from tb_salesman
where sid in
(select SID from tb_task
where tyear='2013' and tperform='否')