数据库系统实践 IV 查询插入修改删除操作
知识
CASE函数
简单 CASE函数
CASE 测试表达式
WHEN 简单表达式1 THEN 结果表达式1
WHEN 简单表达式2 THEN 结果表达式2 …
WHEN 简单表达式n THEN 结果表达式n
[ ELSE 结果表达式n+1 ]
END
例57.
SELECT 班号 ,班名,
CASE 系号
WHEN 1 THEN '软件工程系'
WHEN 2 THEN '计算机系'
WHEN 3 THEN '物联网系'
END AS 系号,班主任号
FROM 班级表
搜索CASE函数
CASE
WHEN 布尔表达式1 THEN 结果表达式1
WHEN 布尔表达式2 THEN 结果表达式2 …
WHEN 布尔表达式n THEN 结果表达式n
[ ELSE 结果表达式n+1 ]
END
例57用搜索CASE来做:
SELECT 班号 ,班名,
CASE
WHEN 系号=1 THEN '软件工程系'
WHEN 系号=2 THEN '计算机系'
WHEN 系号=3 THEN '物联网系'
END AS 系号,班主任号
FROM 班级表
例58.
SELECT 学号,课程号,
CASE
WHEN 成绩 >= 90 THEN '优'
WHEN 成绩 BETWEEN 80 AND 89 THEN '良'
WHEN 成绩 BETWEEN 70 AND 79 THEN '中'
WHEN 成绩 BETWEEN 60 AND 69 THEN '及格'
WHEN 成绩 <60 THEN '不及格'
END 成绩
FROM 成绩表
WHERE 课程号 = 'M01F011'
统计每个班男生和女生的数量各是多少,
SELECT 班号,
COUNT(CASE WHEN 性别=‘男’ THEN ‘男’ END) 男生数,
COUNT(CASE WHEN 性别=‘女’ THEN ‘女’ END) 女生数
FROM 学生表 GROUP BY 班号
判断成绩的等级,
SELECTCASEWHEN GRADE BETWEEN 85 AND 100 THEN '优'WHEN GRADE BETWEEN 70 AND 84 THEN '良'WHEN GRADE BETWEEN 60 AND 69 THEN '及格'ELSE '不及格'END 等级, COUNT(*) 人数
FROM SC
GROUP BYCASEWHEN GRADE BETWEEN 85 AND 100 THEN '优'WHEN GRADE BETWEEN 70 AND 84 THEN '良'WHEN GRADE BETWEEN 60 AND 69 THEN '及格'ELSE '不及格'END
子查询
例65.查询所有的班名和系名。
SELECT 班名,系名
FROM 班级表 bjb JOIN
(SELECT 系号,系名 FROM 系表) AS xb
ON bjb.系号=xb.系号
使用子查询进行基于集合的测试的语句的一般格式为:
例66.查询与张三在同一个班学习的学生的姓名和所在的班号。
SELECT 姓名, 班号 FROM 学生表
WHERE 班号 IN
(SELECT 班号 FROM 学生表
WHERE 姓名 = '张三' )
AND 姓名 != '张三’
例67. 查询成绩为大于90分的学生的学号、姓名
不相关子查询
SELECT 学号, 姓名 FROM 学生表
WHERE 学号 IN
( SELECT 学号 FROM 成绩表
WHERE 成绩 > 90 )
相关子查询
SELECT 学号, 姓名 FROM 学生表
WHERE 学号 IN
( SELECT 学号 FROM 成绩表
WHERE 学生表.学号=学号 AND 成绩 > 90 )
例68. 查询选修了“操作系统”课程的学生的学号、姓名。
SELECT 学号, 姓名 FROM 学生表
WHERE 学号 IN
(SELECT 学号 FROM 成绩表
WHERE 课程号 IN
(SELECT 课程号 FROM 课程表
WHERE 课程名 = ‘操作系统') )
例69 查询选修了操作系统课程的学生的选课门数和平均成绩。
SELECT 学号, COUNT(*) 选课门数, AVG(成绩) 平均成绩
FROM 成绩表 WHERE 学号 IN
(SELECT 学号 FROM 成绩表 g JOIN 课程表 C
ON C.课程号 = g.课程号
WHERE 课程名 = '操作系统')
GROUP BY 学号SELECT 学号, COUNT(*) 选课门数,
AVG(成绩) 平均成绩
FROM 成绩表 g JOIN 课程表 C
ON C.课程号 = g.课程号
WHERE 课程名 = '操作系统'
GROUP BY 学号
当查询列表中的列来自多张表时,这种形式的查询无法用子查询来实现,必须通 过连接的形式来完成。
使用子查询进行比较测试
例70 查询选了M01F011课程且成绩高于此课程的平均成绩的学生的学号和成绩 。
SELECT 学号 , 成绩 FROM 成绩表
WHERE 课程号 = 'M01F011' AND 成绩 >
(SELECT AVG(成绩) FROM 成绩表
WHERE 课程号 = 'M01F011’)
例71.查询成绩最高的学生的学号。
SELECT 学号 FROM 成绩表
WHERE 成绩 =
(SELECT MAX(成绩) FROM 成绩表)
使用子查询进行存在性测试
例72 查询选修了M01F011课程的学生姓名。
SELECT 姓名 FROM 学生表
WHERE EXISTS
(SELECT * FROM 成绩表
WHERE 学号 = 学生表.学号
AND 课程号 = 'M01F011')
例73 查询没有选修M01F011课程的学生姓名和班号。
SELECT DISTINCT 姓名, 班号
FROM 学生表 S JOIN 成绩表 g
ON S.学号 = g.学号
WHERE 课程号 != 'M01F011'
SELECT 姓名, 班号 FROM 学生表
WHERE 学号 IN (
SELECT 学号 FROM 成绩表
WHERE 课程号 != 'M01F011')
在外层查询中否定
SELECT 姓名,班号 FROM 学生表
WHERE 学号 NOT IN (
SELECT 学号 FROM 成绩表
WHERE 课程号 = 'M01F011')
SELECT 姓名,班号 FROM 学生表
WHERE EXISTS (
SELECT * FROM 成绩表
WHERE 学号 = 学生表.学号
AND 课程号 != 'M01F011')
在外层查询中否定
SELECT 姓名,班号 FROM 学生表
WHERE NOT EXISTS (
SELECT * FROM 成绩表
WHERE 学号 = 学生表.学号
AND 课程号 = 'M01F011')
SELECT 姓名, 班号 FROM 学生表 s
WHERE 学号 IN (
SELECT 学号 FROM 成绩表 g
WHERE s.学号=学号 AND 课程号 != 'M01F011')
在外层查询中否定
SELECT 姓名, 班号 FROM 学生表 s
WHERE 'M01F011' NOT IN (
SELECT 课程号 FROM 成绩表 g
WHERE s.学号=学号)
结论:对于否定条件的查询都应该使用子查询来实现,而且应该将否定放在外层。
例74 查询21226P班没有选修M01F011课程的学生的姓名和性别。
SELECT 姓名, 性别 FROM 学生表
WHERE 学号 NOT IN
(SELECT 学号 FROM 成绩表 WHERE
课程号 = 'M01F011')
AND 班号 = '21226P'
派生表
IN和EXISTS、NOT IN和NOT EXISTS
插入数据
例1 将一个新生插入到学生表中,
学号:16001,姓名:张三丰,性别:男,出生日期“1996-01-30”,班级号是“31231P”。
INSERT INTO 学生表
VALUES ('16001', '张三丰', '男', '1996-01-30', '31231P')
例2 在学生表中插入一条新记录,
学号:16002,姓名:裘伯君,性别:男,出生日期“1995-02-14” 。
INSERT INTO 学生表 (学号,姓名, 性别,出生日期)
VALUES ('16002', '裘伯君', '男', '1995-02-14')
实际插入的值为:('16002', '裘伯君', '男', '1995-02-14‘,NULL)
例3 向学生表中插入两条记录,
例6
INSERT INTO bak_学生表 SELECT 学号,姓名 FROM 学生表
例7
INSERT INTO bak_学生表 SELECT TOP 10 学号,姓名 FROM 学生表
更新数据
例1. 将班级表中所有记录的人数改为50。
UPDATE 班级表 SET 人数= 50
UPDATE 班级表 SET 人数 = DEFAULT(更改为默认值)
例2. 将班级表中所有记录的人数改为40,系号改为1。
UPDATE 班级表 SET 人数= 40,系号=1
例3.将班级表中班号以数字2开始的班级的系号改为2。
UPDATE 班级表 SET 系号 = 2
WHERE 班号 LIKE ‘2%'
更新限制数量的记录
UPDATE TOP(2) 班级表 SET 系号 = 2
WHERE 班号 LIKE ‘2%’
例4.将成绩表中不及格的成绩加20分。
UPDATE 成绩表 SET 成绩=成绩+20
WHERE 成绩 <60
例5.将操作系统课的所有成绩加5分。
UPDATE 成绩表 SET 成绩 = 成绩 + 5
WHERE 课程号 IN
(SELECT 课程号 FROM 课程表
WHERE 课程名 = '操作系统' )
UPDATE 成绩表 SET 成绩 = 成绩 + 5
FROM 课程表 c JOIN 成绩表 g
ON g.课程号 = c.课程号 WHERE 课程名 = '操作系统'
例6. 将学分最低的课程的学分加2分。
UPDATE 课程表 SET 学分=学分+ 2
WHERE 学分=
(SELECT MIN(学分) FROM课程表)
例7. 修改全体学生的操作系统考试成绩,
UPDATE 成绩表 SET 成绩 = 成绩 +
CASE
WHEN 成绩 BETWEEN 70 AND 79 THEN 5
WHEN 成绩 BETWEEN 60 AND 69 THEN 10
WHEN 成绩 < 60 THEN 15
ELSE 0
END
FROM 课程表 c JOIN 成绩表 g ON c.课程号 = g.课程号
WHERE 课程名 = '操作系统'
删除数据
例1. 删除所有学生的选课记录。
DELETE FROM 成绩表
例2.删除所有不及格学生的修课记录。
DELETE FROM 成绩表 WHERE 成绩 < 60
删除限制数量的记录。
DELETE TOP(2) FROM 成绩表 WHERE 成绩 < 60
例3.删除电路基础不及格学生的修课记录。
DELETE FROM 成绩表
WHERE 成绩 < 60 AND 课程号 IN (
SELECT 课程号 FROM 课程表
WHERE 课程名 = '电路基础' )
(2)用多表连接实现
DELETE FROM 成绩表
FROM 课程表 c JOIN 成绩表 g ON c.课程号 = g.课程号
WHERE 课程名 = '电路基础' AND 成绩 < 60
比较记录
MERGE 目标表 AS target USING 源表
AS source(字段列表) ON 连接条件表达式
WHEN MATCHED THEN
插入、更新、删除语句
WHEN NOT MATCHED THEN
插入、更新、删除语句;
例1
SELECT 班号, 班名,系号 INTO 部分班级表 FROM 班级表
WHERE 系号 =1
MERGE 部分班级表 target
USING 班级表 source ON target.班号 = source.班号
WHEN MATCHED THEN
UPDATE SET 系号=4
WHEN NOT MATCHED THEN
INSERT(班号, 班名,系号) VALUES (source.班号,source.班名,source.系号);
例2
MERGE 部分班级表 AS target
USING (SELECT 班号, 班名,系号 FROM 班级表) AS
source(班号, 班名,系号)
ON target.班号 = source.班号
WHEN MATCHED THEN
DELETE
WHEN NOT MATCHED THEN
INSERT (班号, 班名,系号)
VALUES(source.班号,source.班名,source.系号);
SQL Server数据库迁移的几种方式
练习
表单
Course[Cno Cname Credit Semester]
SELECT TOP (1000) [Cno],[Cname],[Credit],[Semester]FROM [db].[dbo].[Course]
SC[Sno Cno Grade]
SELECT TOP (1000) [Sno],[Cno],[Grade]FROM [db].[dbo].[SC]
Student[Sno Sname Ssex Sage Sdept]
SELECT TOP (1000) [Sno],[Sname],[Ssex],[Sage],[Sdept]FROM [db].[dbo].[Student]
人才档案[编号 姓名 性别 出生日期 学历 政治面貌 民族 工资现状]
SELECT TOP (1000) [编号],[姓名],[性别],[出生日期],[学历],[政治面貌],[民族],[工资现状]FROM [db].[dbo].[人才档案]
题目
1. 用子查询实现如下查询:
(1)查询通信工程系成绩 80 分以上的学生学号和姓名。
(2)查询计算机系考试成绩最高的学生姓名。
(3)查询考试成绩比计算机系所有学生都低的学生姓名。
(4)查询年龄最大的男生的姓名和年龄。
(5)查询“C001”课程的考试成绩高于“C001”课程的平均成绩的学生的学号和“C001”课程成绩。
(6)查询没有选修“C003”课程的学生的姓名和所在系。
2. 创建一个新表,表名为 test,其结构为:(C1, C2, C3),其中:
C1:整型,标识列。
C2:字符型,长度为 10 ,不允许空值,默认值为“B2”。
C3:字符型,长度为 10 ,允许空值。
试写出按行插入如下数据的语句(空白处表示空值)。
3. 将 “C001”课程的考试成绩加 10 分。
4. 将计算机系所有选修了“计算机文化学”课程的学生成绩加 10 分,分别用子查询和多表连接形式实现。
5. 修改全体学生“C001”课程的考试成绩,修改规则如下:
对通信工程系学生,成绩加 10 分;
对信息管理系学生,成绩加 5 分;
对其他系学生,成绩不变。
6. 删除修课成绩小于 50 分的学生的选课记录。
7. 删除信息管理系考试成绩小于 50 分的学生的该门课程的修课纪录,分别用子查询和多表 连接形式实现。
8.删除考试成绩最低的前 3 条记录。
9. 统计每个系男生和女生人数,分别写出下列两种统计结果的查询语句。
10. 统计人才档案表中各民族的人数,分为汉族和少数民族两类统计,统计结果如下:
参考答案
1.
Coming Soon
2.
Coming Soon
3.
Coming Soon
4.
Coming Soon
5.
Coming Soon
6.
Coming Soon
7.
Coming Soon
8.
Coming Soon
9.
Coming Soon
10.
Coming Soon
数据库系统实践 IV 查询插入修改删除操作相关推荐
- oracle 用户表数目,表大小,视图数目及表空间等查询增加修改删除操作
oracle 用户表数目,表大小,视图数目及表空间等查询增加修改删除操作 查看当前用户的缺省表空间 SQL>select username,default_tablespace fromuser ...
- 多表(三个表)插入与删除操作
业务需求: 新增和删除分类信息,以category为主表,category_detail和image为副表,在不额外编写Sql.mapper.xml文件的前提下,利用mybatis-plus中的内置函 ...
- 红黑树及其插入、删除操作
在二叉搜索树中,基本操作如结点的插入.删除.查找的性能上界都得不到保证,原因在于二叉搜索树的构造依赖于其结点值的插入顺序,最坏情况下二叉搜索树会退化为单链表(如下图所示).因此我们需要对二叉搜索树做出 ...
- 顺序表的插入和删除操作
C语言线性表的插入和删除操作 C语言数据结构的学习之线性表的插入与删除操作 C语言线性表的插入和删除操作 一.插入操作 插入操作的时间复杂度分析: 二.删除操作 删除操作的时间复杂度分析: 查找操作 ...
- 二叉平衡树的插入和删除操作
[转载]二叉平衡树的插入和删除操作 1. 二叉平衡树 二叉排序树查找.插入和删除操作的时间复杂度和树的深度n有关.构建树时,当先后插入的结点按关键字有序时,二叉排序树退化为单枝树,平均查找长 ...
- asp.net 对xml文件的读写,添加,修改,删除操作
asp.net 对xml文件的读写,添加,修改,删除操作 下面有代码调试正确 using System; using System.Collections; using System.Componen ...
- c语言二叉排序树的创建与查找,C语言实现二叉查找树的插入和删除操作问题求教...
使用C语言实现二叉查找树的插入和删除操作,但在 return searchBST( T->rchild, val, f, p);出错.这里应该使用了双指针,求教应该怎么改才正确. /* +--- ...
- 彻底理解面试难点之rb-tree(红黑树)续--对红黑树的插入和删除操作的一些理解!!!
这里主要讲一下对红黑树的插入和删除操作的一些理解 对于红黑树的一些相关性质的介绍,上篇已经讲了,这里不再介绍,有需要了解的,可以翻前面的博客看看. 1.红黑树的插入操作 对于红黑树的元素插入,我们首先 ...
- 本科课程【数据结构与算法】实验1——线性表的顺序表示及插入、删除操作(C++实现)
大家好,我是[1+1=王], 热爱java的计算机(人工智能)渣硕研究生在读. 如果你也对java.人工智能等技术感兴趣,欢迎关注,抱团交流进大厂!!! Good better best, never ...
最新文章
- windows7 64位机上CUDA7.0配置及在VS2010中的简单使用举例
- [转载]找回被误删的VISTA“显示桌面”图标
- html制作水晶状态导航栏,HTML5 CSS3水晶风格的页面头部
- c语言主调函数和被调函数,在C语言中,何为主调函数和被调函数,他们之 – 手机爱问...
- mysql 查询某个字段SQL语句【mysql语句】
- 剥开浮躁表面,直指金融科技内心
- IntelliJ Idea学习笔记006---Idea左侧栏不显示目录结构
- spring REST中的内容协商(同一资源,多种展现:xml,json,html)
- java中的BigInteger
- Windows 开发 辅助调试工具 和 方法
- 【python】Anaconda3环境安装
- 矩阵求导、几种重要的矩阵及常用的矩阵求导公式
- java 微信分享朋友圈 链接显示图片_【微信开发】-- 微信分享功能(分享到朋友和朋友圈显示图片和简介)...
- 第五章 资本主义发展的历史进程
- tomcat服务器缓存配置文件,Tomcat7服务器配置Cache-Control和Expires
- HTTP和QUIC协议以及HTTPS——学习笔记
- U盘和存储卡实际上可以轻松的创建隐藏分区制作PE启动盘
- [声纹识别]“说话人识别”基本概念
- 解决UnicodeDecodeError: 'gbk' codec can't decode byte 0xaa in position 212: illegal multibyte sequence
- 手机号,身份证,银行卡号数据脱敏