本文数据来源可以参考以下文章末尾含数据【SQL server】进行简单查询分组、连接查询子查询和汇总(含teaching数据库创建及实验拓展)_Deep-sea shark的博客-CSDN博客_sql 分组汇总https://blog.csdn.net/weixin_55848732/article/details/127570761?spm=1001.2014.3001.5501
目录
本文重点:
EXCEPT和INTERSECT的作用:
使用ORDER BY排序:
修改数据(UPDETE更新DELETE删除):
实验内容
实验6-1
实验6-2
完整代码:
基本常识:
--(1)查询选修了课程“0101”和课程“0202”的学生的姓名
分别查询我们可以看到每条查询都能查到71条记录,如果合并执行,那么最终只会出现69条记录,这是因为union进行了自动去重。
这里在来看看union all的作用,union all是不会进行去重的,不出意外的话应该是71+71=142条记录。这个在开发中使用的执行效率肯定是优于union的。
--(2)查询没有学生选修的课程的课程号
--(3)使用集合查询的方法查询计算机专业的男生的学生信息
--(4)查询男生的姓名和专业,并按姓名升序排列
--(5)查询sc中学生的sno,score,并按score降序排列
--(6)查询sc中学生的score和sno,score(降序)排列,若score相同按sno(升序)排列
--(7)使用TOP关键字查询“课程表”中“学分”最高的前5门课
--(8)查询所有学生的选课记录,包括sname,sno,cname,score,
-- 将查询的结果存放在表“成绩单”中,并对新表进行查询
--(1)在“teaching”中创建“sc”的一个副本“及格成绩表”,将“sc”中成绩60分以上(含60)
-- 的数据添加到“及格成绩表”中,并显示表中的内容
--(2)在teaching中将“20162438”号学生选修的“大学语文”课的成绩改为86分(初始为60)
--(3)在“teaching”中使用SELECT子句将12级网络专业的张娜选修的“1002”号课的成绩
-- 改为76分(数据库中没有此数据,代码没有错误)
--(4)使用连接将18级电子商务专业李菲选修的“0102”号课程的成绩改为80分
--(5)在“teaching”中将“20200111”号学生选修的“电子技术”课删除
--(6)在“teaching”中使用select子句将12级网络专业的张丽娜选修的“0102”号课
-- 的选课信息删除
--(7)在“teaching”中使用连接查询将18级电子商务专业李菲选修的“0102”号课程删除
--实验6:集合运算查询及其它查询操作
-- 6-1集合运算查询、查询结果排序和存储
--(1)查询选修了课程“0101”和课程“0202”的学生的姓名
use teaching
select sname
from sc,student
where student.sno=sc.sno
and cno='0101'
union
select sname
from sc,student
where student.sno=sc.sno
and cno='0202'
--(2)查询没有学生选修的课程的课程号
select cno from course
except--except是指在第一个数据集中存在,而在第二个数据集中不存在的数据
select cno from sc
--(3)使用集合查询的方法查询计算机专业的男生的学生信息
select * from student where specialty='计算机'
intersect--INTERSECT返回 两个结果集的交集(即两个查询都返回的所有非重复值)
select * from student where ssex='男'
--(4)查询男生的姓名和专业,并按姓名升序排列
use teaching
select sname,specialty
from student
where ssex='男'
order by sname asc
--(5)查询sc中学生的sno,score,并按score降序排列
use teaching
select sno,score from sc
order by score desc
--(6)查询sc中学生的score和sno,score(降序)排列,若score相同按sno(升序)排列
use teaching
select sno,score
from sc
order by score desc,sno asc
--(7)使用TOP关键字查询“课程表”中“学分”最高的前5门课
use teaching
select top 5 * from COURSE
order by credit desc
--(8)查询所有学生的选课记录,包括sname,sno,cname,score,
-- 将查询的结果存放在表“成绩单”中,并对新表进行查询
use teaching
select sname,student.sno,cname,score into 成绩单
from student,sc,COURSE
where student.sno=sc.cno and sc.cno=COURSE.cno
go
select * from 成绩单
--实验6-2 数据操作中使用select子句
--(1)在“teaching”中创建“sc”的一个副本“及格成绩表”,将“sc”中成绩60分以上(含60)
-- 的数据添加到“及格成绩表”中,并显示表中的内容
use teaching
create table 及格成绩表
(学号 nvarchar(255),
课程号 nvarchar(255),
成绩 tinyint
)
go
insert into 及格成绩表(学号,课程号,成绩)
select * from sc where score >=60
go
select * from 及格成绩表
--(2)在teaching中将“20162438”号学生选修的“大学语文”课的成绩改为86分
select student.*,cname,score
from student,sc,COURSE
where student.sno=sc.sno and sc.cno=COURSE.cno
and student.sno = '20162438' and COURSE.cname='大学语文'
select * from student where sno = '20162438'
update sc set score=86
where sno ='20162438'
and cno=(select cno from COURSE where cname='大学语文')
--(3)在“teaching”中使用SELECT子句将12级网络专业的张娜选修的“1002”号课的成绩
-- 改为76分(数据库中没有此数据,代码没有错误)
select * from student where sname='张丽娜'
update sc
set score =76
where cno='1002'
and sno =
(select sno from student where sname='张丽娜' and grade='12级' and specialty='网络')
--(4)使用连接将18级电子商务专业李菲选修的“0102”号课程的成绩改为80分
update sc
set score = 80
where cno = '0102'
and sno=(select sno from student
where sname='李菲'
and grade='18级'
and specialty='电子商务'
)
--------等价于下面的连接方法
update sc
set score = 80
from sc join student on student.sno =sc.sno
where cno='0102' and sname='李菲'
and grade='18级'
and specialty='电子商务'
--(5)在“teaching”中将“20200111”号学生选修的“电子技术”课删除
delete sc
where sno='20200111' and cno=(select cno from COURSE
where cname='电子技术')
--(6)在“teaching”中使用select子句将12级网络专业的张丽娜选修的“0102”号课
-- 的选课信息删除
delete sc where cno='0102' and sno =
(select sno from student where
sname='张丽娜'
and grade='12级'
and specialty='网络' )
--(7)在“teaching”中使用连接查询将18级电子商务专业李菲选修的“0102”号课程删除
delete sc
from sc join student on student.sno=sc.sno
where cno='0102' and sname='李菲'
and grade='18级' and specialty='电子商务'
在使用SQL server进行聚合函数查询的过程中,我们可能会遇到操作数数据类型 nvarchar 对于 avg 运算符无效的情况,这是因为在导入过程中我们默认选择了所有的数据类型均为字符型,avg是求平均值。显然这个函数是对应数值型数据的操作 nvarchar是字符型数据 就是string类型的,不能够求平均法。
解决的方法也很简单,我们对这些数据的类型进行修改,改为tinyint就可以了,修改后如下图所示,再次执行我们的聚合函数avg就能够求平均值了。
use teaching
go
alter table student
alter column sage tinyint null
特别注意的是我们的表创建完成之后如果选择使用SSMS界面直接进行操作的话会弹出一个框,到那一步保存文本什么的确实挺复杂的,目前我们有保存成功过。
变量的定义使用declare定义,变量前面需要加上标志“@”
使用T-SQL语句实现以下功能。
1.创建 @ch 和@a 2个变量,将字符串值和整数值分别赋值其中,然后输出变量的值。
declare @ch char(20),@a int
set @ch='this is a test'
set @a=20
select @ch as ch ,@a as a
go
2. 以“谁的年龄是多少”的形式输出”student”表中sno为”20160211”的学生的sname和sage。
use teaching
declare @name varchar(20),@age tinyint
select @name=sname,@age=sage from student
where sno='20160211'
print @name+'的年龄是'+cast(@age as char(2))
3.计算表达式“2021%4”的值,并将结果赋给变量@yu。
declare @yu numeric
set @yu=2021%4
select @yu as '表达式计算结果'
4. 定义变量@aa1和@aa2,给变量赋值,然后求两个变量与、或、异或的结果。
declare @aa1 int,@aa2 int
set @aa1 = 3
set @aa2 = 8
select @aa1 & @aa2 as 与 ,@aa1 | @aa2 as 或,@aa1 ^ @aa2 as 异或
5. 将字符串“中国加油!”“武汉加油!”“南昌加油!”连接,并显示。
declare @result char(60)
select @result='中国加油!'+'武汉加油!'+'南昌加油!'
select @result as '字符串的连接结果'