sql server查询语句(连接查询、嵌套查询、子查询等)

发布时间:2020-03-27编辑:脚本学堂
本文介绍了sql server查询语句的用法,包括连接查询、嵌套查询、子查询等,通过实例学习sql数据库查询语句的用法,一起来看看吧。

一、连接查询(sql数据库常用查询模式)
多表连接查询、单表连接查询(自连接)、外连接查询、复合条件连接查询。

数据表:
学生信息表student; 课程信息表course; 选课情况表sc,教师信息表teacher
 

1--- 单表连接(自连接)
用表别名把一个表定义为两个不同的表进行连接。
2--- 左连接、右连接、全外连接
--求各部门名及职工名,要求输出无职工的部门(职工以空值出现)
selectdname,tname fromdepartment d,teacher t
where d.dno = t.dno(*);(有*则,别表示该列可以为空left join )
--求各部门名及职工名,要求输出无职工的部门和未分配部门的职工
 selectdname,tname fromdepartment d,teacher t
 where d.dno (*) = t.dno(*);(full join )
3--- 复合条件连接

二、嵌套查询
在select …from …where语句结构的;
where子句中可嵌入一个select语句块;
其上层查询称为外层查询或父查询;
其下层查询称为内层查询或子查询;
sql语言允许使用多重嵌套查询;
在子查询中不允许使用order by子句;
嵌套查询的实现一般是从里到外,即先进行;

三、子查询,再把其结果用于父查询作为条件。(这是数据库中最常见的查询)
 
1--- 返回一组值得子查询
求选修‘c6‘课程且成绩超过分的学生
 

 select* from student
 where snoin( select sno from sc where cno='c6' and grade>);
 

求比计算机系中某一学生年龄小的其他系的学生
 

select* from student
 where sdept!=’cs’andsage <any( select sage fromstudentwheresdept=‘cs’);


 
2、带有exists的相关子查询
不相关子查询:子查询的查询条件不依赖于父查询的称为不相关子查询。
相关子查询:子查询的查询条件依赖于外层父
查询的某个属性值的称为相关子查询(correlated subquery),带exists的子查询就是相关子查询
exists表示存在量词,带有exists的子查询不返回任何记录的数据,只返回逻辑值‘true ’或‘false ’
 
例:求所有选修了‘c1’课程的学生名。
 

--不相关子查询
selectsname from student
 where snoin ( select sno from sc where cno = 'c1' );
--相关子查询
select sname from student
 whereexists
 (
 select*fromsc
 where student.sno=sc.snoandcno='c1'
 );
 

先在外层查询中取student表的第一个元组(记录),用该记录的
相关的属性值(在内层where子句中给定的)处理内层查询,若
外层的where子句返回‘true’值,则此元组送入结果的表中。然
后再取下一个元组;重复上述过程直到外层表的记录全部遍历一次为止。
 
不关心子查询的具体内容,因此用select *, exists + 子查询用来判断该子查询是否返回元组
当子查询的结果集非空时,exists为'true';当子查询的结果集为空时,exists为'false'
not exists :若子查询结果为空,返回‘true’值,否则返回‘false’
 
例:列出没有选c1课程的学生的学号、姓名
 

 select snamefrom student
 where not exists
 (
 select * from course
 wherestudent.sno=sc.sno and cno='c1'
 );
 

例:查询选修了所有课程的学生的姓名
 

select snamefrom student
 where not exists
 (
 select * from course
 where not exists
 (
select * from sc
wherestudent.sno=sc.sno and course.cno=sc.cno
 )
 );/*该学生不存在于 所有课都选的学生的集合之中*/
 
 

例:名查询至少选修了s1所选的全部课程的学生
 

select snamefrom student
 where not exists
 (
 select * from scscx
 wherescx.sno='s1' and not exists
 (
select * from scscy
wherestudent.sno=scy.sno and scx.cno=scy.cno
 )
 );/*该学生不存在于 s1所有课都选的学生的集合之中*/
 

注意细节
在from语句中使用子查询,对查询结果定义表名及列名
 

selectsno, avg_g
 from(
selectsno,avg(grade) fromsc
groupbysno
) as ra(sno,avg_g)
 whereavg_g>80;