CASE 测试表达式
WHEN 简单表达式1 THEN 结果表达式1
WHEN 简单表达式2 THEN 结果表达式2 …
WHEN 简单表达式n THEN 结果表达式n
[ ELSE 结果表达式n+1 ]
END
SELECT 班号 ,班名,
CASE 系号
WHEN 1 THEN '软件工程系'
WHEN 2 THEN '计算机系'
WHEN 3 THEN '物联网系'
END AS 系号,班主任号
FROM 班级表
CASE
WHEN 布尔表达式1 THEN 结果表达式1
WHEN 布尔表达式2 THEN 结果表达式2 …
WHEN 布尔表达式n THEN 结果表达式n
[ ELSE 结果表达式n+1 ]
END
SELECT 班号 ,班名,
CASE
WHEN 系号=1 THEN '软件工程系'
WHEN 系号=2 THEN '计算机系'
WHEN 系号=3 THEN '物联网系'
END AS 系号,班主任号
FROM 班级表
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 班号
SELECT
CASE
WHEN 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 BY
CASE
WHEN GRADE BETWEEN 85 AND 100 THEN '优'
WHEN GRADE BETWEEN 70 AND 84 THEN '良'
WHEN GRADE BETWEEN 60 AND 69 THEN '及格'
ELSE '不及格'
END
SELECT 班名,系名
FROM 班级表 bjb JOIN
(SELECT 系号,系名 FROM 系表) AS xb
ON bjb.系号=xb.系号
SELECT 姓名, 班号 FROM 学生表
WHERE 班号 IN
(SELECT 班号 FROM 学生表
WHERE 姓名 = '张三' )
AND 姓名 != '张三’
不相关子查询
SELECT 学号, 姓名 FROM 学生表
WHERE 学号 IN
( SELECT 学号 FROM 成绩表
WHERE 成绩 > 90 )
相关子查询
SELECT 学号, 姓名 FROM 学生表
WHERE 学号 IN
( SELECT 学号 FROM 成绩表
WHERE 学生表.学号=学号 AND 成绩 > 90 )
SELECT 学号, 姓名 FROM 学生表
WHERE 学号 IN
(SELECT 学号 FROM 成绩表
WHERE 课程号 IN
(SELECT 课程号 FROM 课程表
WHERE 课程名 = ‘操作系统') )
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 学号
SELECT 学号 , 成绩 FROM 成绩表
WHERE 课程号 = 'M01F011' AND 成绩 >
(SELECT AVG(成绩) FROM 成绩表
WHERE 课程号 = 'M01F011’)
SELECT 学号 FROM 成绩表
WHERE 成绩 =
(SELECT MAX(成绩) FROM 成绩表)
SELECT 姓名 FROM 学生表
WHERE EXISTS
(SELECT * FROM 成绩表
WHERE 学号 = 学生表.学号
AND 课程号 = '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.学号=学号)
SELECT 姓名, 性别 FROM 学生表
WHERE 学号 NOT IN
(SELECT 学号 FROM 成绩表 WHERE
课程号 = 'M01F011')
AND 班号 = '21226P'
派生表
学号:16001,姓名:张三丰,性别:男,出生日期“1996-01-30”,班级号是“31231P”。
INSERT INTO 学生表
VALUES ('16001', '张三丰', '男', '1996-01-30', '31231P')
学号:16002,姓名:裘伯君,性别:男,出生日期“1995-02-14” 。
INSERT INTO 学生表 (学号,姓名, 性别,出生日期)
VALUES ('16002', '裘伯君', '男', '1995-02-14')
实际插入的值为:('16002', '裘伯君', '男', '1995-02-14‘,NULL)
INSERT INTO bak_学生表 SELECT 学号,姓名 FROM 学生表
INSERT INTO bak_学生表 SELECT TOP 10 学号,姓名 FROM 学生表
更新数据
UPDATE 班级表 SET 人数= 50
UPDATE 班级表 SET 人数 = DEFAULT(更改为默认值)
UPDATE 班级表 SET 人数= 40,系号=1
例3.将班级表中班号以数字2开始的班级的系号改为2。
UPDATE 班级表 SET 系号 = 2
WHERE 班号 LIKE ‘2%'
更新限制数量的记录
UPDATE TOP(2) 班级表 SET 系号 = 2
WHERE 班号 LIKE ‘2%’
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 课程名 = '操作系统'
DELETE FROM 成绩表
DELETE FROM 成绩表 WHERE 成绩 < 60
删除限制数量的记录。
DELETE TOP(2) FROM 成绩表 WHERE 成绩 < 60
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
插入、更新、删除语句;
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.系号);
SELECT TOP (1000) [Cno]
,[Cname]
,[Credit]
,[Semester]
FROM [db].[dbo].[Course]
SELECT TOP (1000) [Sno]
,[Cno]
,[Grade]
FROM [db].[dbo].[SC]
SELECT TOP (1000) [Sno]
,[Sname]
,[Ssex]
,[Sage]
,[Sdept]
FROM [db].[dbo].[Student]
SELECT TOP (1000) [编号]
,[姓名]
,[性别]
,[出生日期]
,[学历]
,[政治面貌]
,[民族]
,[工资现状]
FROM [db].[dbo].[人才档案]
(1)查询通信工程系成绩 80 分以上的学生学号和姓名。
(2)查询计算机系考试成绩最高的学生姓名。
(3)查询考试成绩比计算机系所有学生都低的学生姓名。
(4)查询年龄最大的男生的姓名和年龄。
(5)查询“C001”课程的考试成绩高于“C001”课程的平均成绩的学生的学号和“C001”课程成绩。
(6)查询没有选修“C003”课程的学生的姓名和所在系。
C1:整型,标识列。
C2:字符型,长度为 10 ,不允许空值,默认值为“B2”。
C3:字符型,长度为 10 ,允许空值。
试写出按行插入如下数据的语句(空白处表示空值)。
对通信工程系学生,成绩加 10 分;
对信息管理系学生,成绩加 5 分;
对其他系学生,成绩不变。
Coming Soon
Coming Soon
Coming Soon
Coming Soon
Coming Soon
Coming Soon
Coming Soon
Coming Soon
Coming Soon
Coming Soon