例6.1
查询选修课程号为c05109的学生的学号、姓名和期末成绩。
select student.studentno.sname,final
from student inner join score
on student.studentno=score.studentno
where score.courseno=‘c05109’
(
use teaching
select student.studentno,sname,final
from student,score
where score.courseno=‘c05109’ and student.studentno=score.studentno
) 亦可
例6.2
查询选修课程号为c05103且平时成绩高于80分的学生的学号、姓名、平时成绩和期末成绩。
select student.studentno,sname,usually,final
from student inner join score
on student.studentno=score.studentno and usually>80
where score.courseno=‘c05103’
例6.4
利用右外连接方式查询教师的排课情况。
select courseno,tname,teacher.teacherno,major
from teach_class right join teacher
on teach_class.teacherno=teacher.teacherno
(3)完全外连接
交叉连接(Cross Join )是在没有WHERE子句的情况下,产生的表的笛卡儿积。两个表作交叉连接时,结果集大小为二者行数之积。该种方式在实际过程中用的很少。
例6.6
显示student 表和score表的笛卡儿积。
select student.studentno,sname,score.*
from student cross join score
例6.9
合并结果集示例。
create table t1 (a int,b nchar(4),c nchar(4))
insert into t1 values(1,‘aaa’,‘jkl’)
insert into t1 values(2,‘bbb’,‘mno’)
insert into t1 values(2,‘ccc’,‘pqr’)
create table t2 (a nchar(4),b float)
insert into t2 values(‘kkk’,1.000)
insert inot t2 values(‘mmm’,3.000)
select a,b from t1 union
select b,a from t2
在Transact-SQL语句中,可以把子查询的结果当成一个普通的表达式来看待,用在其外查询的选择条件中。此时子查询必须返回一个值或单个列值列表,此时的子查询可以替换WHERE子句中包含IN关键字的表达式。
例6.10
查询学号为的学生的入学成绩、所有学生的平均入学成绩及该学生成绩与所有学生的平均入学成绩的差。
select studentno,sname,point
,(select avg(point) from student) as ‘平均成绩’
,point -(select avg(point) from student) as ‘分数差值’
from student
where studentno=‘0828261367’
例6.11
获取期末成绩中含有高于93分的学生的学号、姓名、电话和Email。
select studentno,sname,phone,Email
from student
where studentno in (select studentno
from score where final>93)
例6.12
查询选修课程的多于2门、且期末成绩均在85分以上的学生的学号、姓名、电话和Email。
select studentno,sname,phone,Email
from student
where studentno in
(select studentno
from score where final>85
group by studentno having count(*)>2)
例6.13
查询期末成绩比该选修课程平均期末成绩低的学生的学号、课程号和期末成绩。
select studentno,couseno,final
from score as a
where final<(select avg(final)
from score as b
where a.courseno=b.courseno
group by courseno)
例6.14
查询期末成绩高于85分、总评成绩高于90分的学生的学号、课程号和总评成绩。
select tt.studentno,tt.courseno,tt.usually0.2+tt.final0.8 as ‘总评成绩’
from (select * from score where final>85) as tt
where tt.final0.8+tt.usually0.2>90
利用子查询修改表数据就是利用一个嵌套在INSERT、UPDATE或DELETE语句的子查询成批的添加、更新和删除表中的数据。
INSERT 语句中的 SELECT 子查询可用于将一个或多个其他的表或视图的值添加到表中。使用 SELECT 子查询可同时插入多行。
例6.15
创建一个表sc,将score表中学生的相关数据添加到sc表中,并要求计算总评成绩。
create table sc
(studentno nchar(10) not null,
courseno nchar(6) not null,
total numeric(6,2) not null)
go
insert into sc(studentno,courseno,total)
select studentno,courseno,final0.8+usually0.2
from score
where substring(studentno,1,2)=‘08’
go
select * from sc
UPDATE语句中的SELECT子查询可用于将一个或多个其他的表或视图的值进行更新。使用 SELECT子查询可同时更新多行数据。
在DELETE语句中利用子查询可以删除符合条件的数据行。实际上是通过将子查询的结果作为删除条件表达式中的一部分。
例6.16
将sc表中含有总分低于80课程的所有学生总分增加5%。
update sc
set total=total*1.05
where courseno in
(select courseno from sc
where total<80)
select * from sc
附件:
使用到的数据库:
https://pan.baidu.com/s/1Lmbw_qSmC04wnPUUgwSKRA
提取码:djsz