【SQL server】集合运算查询及其他查询操作

 本文数据来源可以参考以下文章末尾含数据【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

完整代码:

基本常识:


本文重点:

EXCEPT和INTERSECT的作用:

  1. except是指在第一个数据集中存在,而在第二个数据集中不存在的数据
  2. INTERSECT返回 两个结果集的交集(即两个查询都返回的所有非重复值)

使用ORDER BY排序:

  1. ORDER BY默认为升序(ASC),如需降序需要使用DESC关键字
  2. ORDER BY放在where后面

修改数据(UPDETE更新DELETE删除):

  1. 修改成绩使用SET命令
  2. 可以使用连接查询和SELECT语句修改和删除

实验内容

实验6-1

--(1)查询选修了课程“0101”和课程“0202”的学生的姓名
【SQL server】集合运算查询及其他查询操作_第1张图片

【SQL server】集合运算查询及其他查询操作_第2张图片 分别查询我们可以看到每条查询都能查到71条记录,如果合并执行,那么最终只会出现69条记录,这是因为union进行了自动去重。【SQL server】集合运算查询及其他查询操作_第3张图片

 这里在来看看union all的作用,union all是不会进行去重的,不出意外的话应该是71+71=142条记录。这个在开发中使用的执行效率肯定是优于union的。

 【SQL server】集合运算查询及其他查询操作_第4张图片

--(2)查询没有学生选修的课程的课程号
【SQL server】集合运算查询及其他查询操作_第5张图片
--(3)使用集合查询的方法查询计算机专业的男生的学生信息
【SQL server】集合运算查询及其他查询操作_第6张图片
--(4)查询男生的姓名和专业,并按姓名升序排列
【SQL server】集合运算查询及其他查询操作_第7张图片
--(5)查询sc中学生的sno,score,并按score降序排列
【SQL server】集合运算查询及其他查询操作_第8张图片
--(6)查询sc中学生的score和sno,score(降序)排列,若score相同按sno(升序)排列
【SQL server】集合运算查询及其他查询操作_第9张图片
--(7)使用TOP关键字查询“课程表”中“学分”最高的前5门课
【SQL server】集合运算查询及其他查询操作_第10张图片
--(8)查询所有学生的选课记录,包括sname,sno,cname,score,
--       将查询的结果存放在表“成绩单”中,并对新表进行查询

【SQL server】集合运算查询及其他查询操作_第11张图片

实验6-2

--(1)在“teaching”中创建“sc”的一个副本“及格成绩表”,将“sc”中成绩60分以上(含60)
--     的数据添加到“及格成绩表”中,并显示表中的内容

【SQL server】集合运算查询及其他查询操作_第12张图片

--(2)在teaching中将“20162438”号学生选修的“大学语文”课的成绩改为86分(初始为60)

 【SQL server】集合运算查询及其他查询操作_第13张图片

【SQL server】集合运算查询及其他查询操作_第14张图片

【SQL server】集合运算查询及其他查询操作_第15张图片

--(3)在“teaching”中使用SELECT子句将12级网络专业的张娜选修的“1002”号课的成绩
--     改为76分(数据库中没有此数据,代码没有错误)
 
【SQL server】集合运算查询及其他查询操作_第16张图片

--(4)使用连接将18级电子商务专业李菲选修的“0102”号课程的成绩改为80分
【SQL server】集合运算查询及其他查询操作_第17张图片

--(5)在“teaching”中将“20200111”号学生选修的“电子技术”课删除
【SQL server】集合运算查询及其他查询操作_第18张图片

--(6)在“teaching”中使用select子句将12级网络专业的张丽娜选修的“0102”号课
--       的选课信息删除

【SQL server】集合运算查询及其他查询操作_第19张图片
--(7)在“teaching”中使用连接查询将18级电子商务专业李菲选修的“0102”号课程删除

 【SQL server】集合运算查询及其他查询操作_第20张图片

完整代码:

--实验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类型的,不能够求平均法。

【SQL server】集合运算查询及其他查询操作_第21张图片         解决的方法也很简单,我们对这些数据的类型进行修改,改为tinyint就可以了,修改后如下图所示,再次执行我们的聚合函数avg就能够求平均值了。

【SQL server】集合运算查询及其他查询操作_第22张图片

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))

【SQL server】集合运算查询及其他查询操作_第23张图片

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 '字符串的连接结果'

你可能感兴趣的:(数据库学习,sql,sqlserver,数据库)