1、谈谈exists用法
exists后跟bool值:用于外表每一行检测内表每一行的结果
两张表 TableIn TableEx
ID AName ASex ID BName BSex BAddress
1 张晋娟 女 1 马艳艳 女 淮北
2 张翠兰 女 2 谭建军 男 长沙
3 李海滨 男 3 李红军 男长沙
4 马艳艳女 4 丁秀娟 女 北京
5邓事文男 5 邓事稳 男 深圳
(1)exists后跟null 返回正常结果
select * from TableIN where exists (select null)
(2)exists与In的用法比较
返回相同结果
select * from TableIn where exists (select BName from TableEx where TableEX.BName=TableIn.AName)
select * from TableIn where Aname in(select BName from TableEx)
(3)exists可以同any互相替换
select * from TableIn where exists (select BName from TableEx)
select * from TableIn where AName=any(select BName from TableEx)
注意:exists通常比in检索效率高 因为in不走索引,具体使用情况:外表比内表大用in 外表比内表小用exists
2、学生表:STUDENT(ID,USER_NAME)和考试表:EXAM(ID,USER_ID,SCORE)表,STUDENT表主键为ID字段,EXAM表中外键USER_ID为STUDENT的ID字段值,编写SQL查询每位学生的成绩,缺考的以0分处理(缺考的考试表中无记录)
select student.id, user_name, (case when Score is null then 0 else score end) as score from student left join exam on student.id=exam.User_ID
注:case when最后end勿忘
3、已知用户表USER(ID,USER_NAME,AGE),通过sql语句查询表中相同年龄(AGE)存在两条以上记录的用户年龄及用户个数,并按照统计数量倒排序
select age,count(distinct user_name) totalCount from user1 group by age having count(age)>1 order by count(distinct user_name) desc