SQL 语句记录
一、查询
单体查询: select a from b
多重查询: select a,b from c
全部查询: select * from b
简单的单体转换: a, b AS c
1.查询全体学生的学号和姓名
1 | select sno,sname |
2.查询全体学生的详细信息
1 | SELECT * FROM student; |
3.查询全部学生的 “ 姓名 ” 及其 “ 出生年 ” 两列
1 | SELECT Sname, (2024 - Sage) AS BirthYear FROM Student; |
二、消除取值重复(distinct)
消除取值重复: select distinct a from b
4.查询选修了课程的学生学号
1 | SELECT DISTINCT Sno FROM SC; |
三、满足条件(WHERE)
指定条件: select a from b where c …
大小比较: select a,b from c where d </> …
确定范围: select a,b,c from d where c BETWEEN … AND …
in 和 not in 确定集合: select a,b from c where d IN (‘m’, ‘n’)
字符匹配: select … from … where … (not) like …
5.查询计算机系( IS )全体学生名单
1 | SELECT Sname FROM Student WHERE Sdept = 'IS'; |
6.查询全体 20 岁以下的学生姓名和年龄
1 | SELECT Sname, Sage FROM Student WHERE Sage < 20; |
7.查询所有在 20 到 23 岁(含 20 和 23 )的学生姓名、系别和年龄
1 | SELECT Sname, Sdept, Sage FROM Student WHERE Sage BETWEEN 20 AND 23; |
8.查询 IS 系和 CS 系的全体学生姓名和性别
1 | SELECT Sname, Ssex FROM Student WHERE Sdept IN ('IS', 'CS'); |
9.查询既不属于 IS 系,也不属于 MA 系的学生姓名和年龄
1 | SELECT Sname, Sage FROM Student WHERE Sdept NOT IN ('IS', 'MA'); |
10.查询所有姓李的学生姓名和性别
1 | SELECT Sname, Ssex FROM Student WHERE Sname LIKE '李%'; |
11.查询所有 “2002” 年入学的学生学号、姓名和系别
1 | SELECT Sno, Sname, Sdept FROM Student WHERE Sno LIKE '2002%'; |
12.查询所有不姓 “ 刘 ” 的学生信息
1 | SELECT * FROM Student WHERE Sname NOT LIKE '刘%'; |
13.查询名称含有 “ 数据 ” 的课程号、课程名及学分
1 | SELECT Cno, Cname, Ccredit FROM Course WHERE Cname LIKE '%数据%'; |
14.查询没有先修课的课程号和课程名。
1 | SELECT Cno, Cname FROM Course WHERE Cpno IS NULL; |
15.查询所有有成绩的学生学号、课程号及成绩
1 | SELECT Sno, Cno, Grade FROM SC WHERE Grade IS NOT NULL; |
四、查询结果排序(order by)
select a,b from c where d … order by b …
16.查询选修了 3 号课程的学生学号和成绩,结果按成绩降序排列。
1 | SELECT Sno, Grade FROM SC WHERE Cno = '3' ORDER BY Grade DESC; |
五、聚集函数(count、sum、avg、max、min)
聚集函数有count 、 sum 、 avg 、 max 、 min
count(列1),功能:计算列1的个数,行数。如果加distinct ,计算列1的不同值的个数。
sum(列1),功能是对列1的值进行求和。累加。条件是列1的属性为可累加的。
avg(列1),对列1的值进行求平均数。
Max,min,avg和sum具有共同的条件,列可计算。
17.查询学生总数
1 | SELECT COUNT(*) AS TotalStudents FROM Student; |
18.查询所有课程的总学分
1 | SELECT SUM(Ccredit) AS TotalCredits FROM Course; |
19.查询全体学生平均年龄
1 | SELECT AVG(Sage) AS AverageAge FROM Student; |
20.查询 1 号课程的最高分
1 | SELECT MAX(Grade) AS HighestScore FROM SC WHERE Cno = '1'; |
六、分组统计(group by)
21.查询男女学生各有多少人
1 | SELECT Ssex, COUNT(*) AS StudentCount FROM Student GROUP BY Ssex; |
22.查询每个课程的课程号和平均分。
1 | SELECT Cno, AVG(Grade) AS AverageGrade FROM SC GROUP BY Cno; |
23.查询选修了3门课程以上(含3门)的学生学号和选修课程数。
1 | SELECT Sno, COUNT(Cno) AS CourseCount FROM SC GROUP BY Sno HAVING COUNT(Cno) >= 3; |
24.查询选修了2门课程以上(含2门,但不含1号课程),学生学号和选修课程数。
1 | SELECT Sno, COUNT(Cno) AS CourseCount FROM SC WHERE Cno != '1' GROUP BY Sno HAVING COUNT(Cno) >= 2; |
25.查询不及格门数2门以上的学生学号。
1 | SELECT Sno |
26.查询有2名以上(含2名)学生选修了的课程号和选修人数。
1 | SELECT Cno, COUNT(Sno) AS StudentCount FROM SC GROUP BY Cno HAVING COUNT(Sno) >= 2; |
七、多表查询
1.查询计算机工程系女学生的学生学号、姓名及考试成绩。
1 | SELECT S.Sno, S.Sname, SC.Grade |
2.查询“李勇”同学所选课程的成绩。
1 | SELECT SC.Grade |
3.查询“李新”老师所授课程的课程名称
1 | SELECT C.Cname |
4.查询女教师所授课程的课程号及课程名称
1 | SELECT C.Cno, C.Cname |
5.查询至少选修一门课程的女学生姓名
1 | SELECT S.Sname |
6.查询姓“李”的学生所学的课程名称
1 | SELECT DISTINCT C.Cname |
7.查询选修“数学”课程且成绩在80~90分之间的学生学号及成绩
1 | SELECT SC.Sno, SC.Grade |
8.查询课程成绩及格的男同学的学生信息及课程号与成绩
1 | SELECT S.Sno, S.Sname, S.Ssex, S.Sage, S.Sdept, SC.Cno, SC.Grade |
9.查询选修“c02”课程的学生的平均年龄
1 | SELECT AVG(S.Sage) AS AverageAge |
10.查询学习课程名为“数学”的学生学号和姓名
1 | SELECT S.Sno, S.Sname |
11.查询“钱军”教师任课的课程号,选修其课程的学生的学号和成绩
1 | SELECT T.Cno, SC.Sno, SC.Grade |
12.查询在第3学期所开课程的课程名称及成绩
1 | SELECT C.Cname, SC.Grade |
13.查询“c02”号课程90分以下(不含90)的学生信息
1 | SELECT S.Sno, S.Sname, S.Ssex, S.Sage, S.Sdept |
14.查询信息工程系成绩在90分以下(不含90)的学生姓名、性别和课程名称。
1 | SELECT S.Sname, S.Ssex, C.Cname |
15.查询同时选修了“c03”和“c02”课程的学生姓名和成绩
1 | SELECT S.Sname, SC1.Grade AS Grade_c02, SC2.Grade AS Grade_c03 |
八、嵌套查询
1.查询计算机系(CS)女学生的学生学号、姓名及考试成绩。
1 | SELECT Student.Sno, Student.Sname, SC.Grade |
2.查询“李勇”同学所选课程的成绩。
1 | SELECT SC.Sno, Course.Cno, Course.Cname, SC.Grade |
3.查询女教师所授课程的课程号及课程名称。
1 | SELECT Course.Cno, Course.Cname |
4.查询姓“王”的学生所学的课程名称。
1 | SELECT DISTINCT Course.Cname |
5.查询选修“数据库”课程且成绩在80~90分之间的学生学号及成绩。
1 | SELECT SC.Sno, SC.Grade |
6.查询选修“C04”课程的学生的平均年龄。
1 | SELECT AVG(Student.Sage) AS AverageAge |
7.查询学习课程名为“数学”的学生学号和姓名。
1 | SELECT Student.Sno, Student.Sname |
8.查询在第3学期所开课程的课程名称及成绩。
1 | SELECT Course.Cname, SC.Grade |
9.查询与“李勇”同一个系的同学姓名。
1 | SELECT Sname |
10.查询学号比“刘晨”同学大,而出生日期比他小的学生姓名。
1 | SELECT Sname |
11.查询出生日期大于所有女同学出生日期的男同学的姓名及系别。
1 | SELECT Sname, Sdept |
12.查询成绩比该课程平均成绩高的学生的学号及成绩。
1 | SELECT SC.Sno, SC.Grade |
13.查询没有选修“C02”课程的学生学号及姓名。
1 | SELECT Sno, Sname |
14.查询选修了“数据库”课程的学生学号、姓名及系别。
1 | SELECT Student.Sno, Student.Sname, Student.Sdept |
15.查询“C02”号课程不及格的学生信息。
1 | SELECT Student.Sno, Student.Sname, Student.Sdept |
九、数据更新
1.向Student表中插入记录(“20050203”,”张静”,”19”,”女”,”CS”)。
1 | INSERT INTO Student VALUES ('20050203', '张静', '女', 19, 'CS'); |
2.插入学号为“20050302”、姓名为“李四”的学生信息。
1 | INSERT INTO Student VALUES ('20050302', '李四', '男', 20, 'CS'); |
3.把计算机工程系的学生记录保存到表TS中(2种情况,TS表已存在和不存在)。
1 | # 1.TS表已存在 |
1 | # 2.TS表不存在 |
4.将学号为“20050202”的学生姓名改为“张华”,系别改为“CS”,专业改为“多媒体技术”。
1 | -- 假设“专业”列名为Smajor |
5.将“李勇”同学的专业改为“计算机信息管理”。
1 | -- 添加专业字段Smajor |
6.将“20050201”学生选修“C03”号课程的成绩改为该课的平均成绩。
1 | -- 声明一个变量来存储平均成绩 |
7.把成绩低于总平均成绩的女同学的成绩提高5%。
1 | -- 计算总平均成绩 |
8.把选修了“数学”课程而成绩小于90(不含)的学生的成绩全改为空值(NULL)。
1 | # 第一种 |
9.删除学号为“20050302”的学生记录。
1 | DELETE FROM Student WHERE Sno = '20050302'; |
10.删除SC表中尚无成绩的选课记录。
1 | DELETE FROM SC WHERE Grade IS NULL; |
11.删除“计算机工程系”所有学生的选课记录。
1 | DELETE FROM SC |
12.把“刘晨”同学的成绩全部删除。
1 | -- 首先,找到“刘晨”的学号 |
注:检查:
如果您希望在删除之前检查“刘晨”的所有成绩记录,可以使用
SELECT
语句进行查询:
1
2
3
4 SELECT * FROM SC
WHERE Sno = (
SELECT Sno FROM Student WHERE Sname = '刘晨'
);
零、元数据
1 | drop database if EXISTS sc; |
用SQL语句创建学校信息管理数据库StuDB
学校信息管理数据库StuDB中有以下8个关系,根据关系完成本题SQL语句的编写:
学生信息表Student(学号Sno,学生姓名SName,学生性别SSex,学生年龄Sage,所在班级编号ClassNo,邮箱Email,家庭住址Address)
班级信息表Class(班级编号ClassNo,班级名称ClassName,班级人数Num,所属专业编号Pno)
课程信息表Course(课程编号Cno,课程名称CName,学分Credits)
选课记录表SC(课程编号Cno,学号Sno,分数Grade,选课学期Semester)
学院信息表Department(院系编号DeptNo,院系名称DeptName)
专业信息表Professional(专业编号Pno,专业名称PName,所属院系编号DeptNo)
教师信息表Teacher(教师工号Tno,教师姓名Tname,教师性别TSex,教师年龄Tage,职称Title,联系电话Phone,所属院系编号DeptNo)
教师授课信息表TC(教师工号Tno,课程编号Cno,授课课时数Cnum)
首先,我们将创建学校信息管理数据库StuDB
,然后根据您提供的8个关系,我们将编写SQL语句来创建相应的表。
创建数据库StuDB
1 | CREATE DATABASE StuDB; |
创建学生信息表Student
1 | CREATE TABLE Student ( |
创建班级信息表Class
1 | CREATE TABLE Class ( |
创建课程信息表Course
1 | CREATE TABLE Course ( |
创建选课记录表SC
1 | CREATE TABLE SC ( |
创建学院信息表Department
1 | CREATE TABLE Department ( |
创建专业信息表Professional
1 | CREATE TABLE Professional ( |
创建教师信息表Teacher
1 | CREATE TABLE Teacher ( |
创建教师授课信息表TC
1 | CREATE TABLE TC ( |
(1)创建选课记录表SC,要求:根据实际情况自定义各个属性的数据类型和列宽,但其中课程编号Cno与学号Sno为组合主码,课程编号Cno与课程信息表Course外码关联,学号Sno与学生信息表Student外码关联,分数Grade的取值范围是0到100分,分数Grade默认值为空
1 | CREATE TABLE SC ( |
(2)向基本表SC中插入数据,具体数据如表1所示
表1 选课记录数据表
课程编号 | 学号 | 分数 | 选课学期 |
---|---|---|---|
1 | 2023001 | 空 | 2023-2024-2 |
1 | 2023001 | 99 | 2023-2024-1 |
1 | -- 向SC表中插入数据 |
(3)删除教师信息表中所有年龄超过60岁的教师信息。
1 | DELETE FROM Teacher |
(4)将所有教师的年龄增加一岁。
1 | UPDATE Teacher |
(5)查询姓李并且姓名为两个字(如“李健”)的学生信息,包括学号和姓名信息,查询结果根据学号降序排序。
1 | SELECT Sno, SName |
(6)统计每门课程不及格学生人数,包括课程编号、课程名称、不及格人数等信息。
1 | SELECT |
(7)查询信息工程学院所有学生信息,包含学生学号、学生姓名、所在学院名称和所属专业名称等信息。
1 | SELECT |
(8)创建可查阅物联网工程专业学生信息的视图ITE_Stu,视图包含学生学号、姓名、性别等信息。
1 | CREATE VIEW ITE_Stu AS |
(9)利用ITE_Stu视图查询物联网工程专业所有女生的学号和姓名信息。
1 | SELECT |
(10)删除ITE_Stu视图。
1 | DROP VIEW IF EXISTS ITE_Stu; |
笔记
主要摘自 数据库系统概论(第6版) - 王珊 杜小勇 陈红 编著
数据(data)
描述事物的符号记录。是数据库中存储的基本对象。
数据的含义称为数据的语义,数据与其语义是不可分的。
数据库(database,DB)
是长期存储在计算机内有组织、可共享的大量数据的集合。(按一定的格式存放数据的仓库)
数据库管理系统
包含 数据定义功能(数据定义语言(data definition language,DDL))、数据组织、存储和管理功能、数据操纵功能(数据操纵语言(data manipulation languageDML))、数据库的事务管理和运行管理功能、数据库的建立和维护功能 的,位于用户与操作系统之间的数据管理软件。
数据库系统database system,DBS)
指由 数据库、数据库管理系统(及其应用开发工具)、应用系统和数据库管理员(database administrator,DBA)组成的存储、管理、处理和维护数据的系统
数据建模(data modeling)
把现实世界中的具体事物抽象、组织为某一数据库管理系统支持的数据模型,这个过程称为数据建模(data modeling)。
概念模型
用于信息世界的建模,是现实世界到机器世界的一个中间层次。
关系模型
建立在严格的数学概念基础之上,由一组关系组成,每个关系的数据结构是一张规范化的二维表。
- 关系(relation):一个关系对应通常说的一张二维表。
- 元组(tuple):表中的一行即为一个元组。
- 属性:表中的一列即为一个属性,每列的名称即为属性名。
- 码:又称为码键或键,是表中的某一个属性或一组属性,其值可以唯一确定一个元组。
- 域(domain):域表示某一属性的取值范围。
- 分量(component):元组中的一个属性值。
- 关系模式:对关系的描述,一般表示为:关系名(属性1,属性2,·,属性n)。
关系模型要求关系必须是规范化(normalization)的。关系的每一个分量必须是一个不可分的数据项。
优点:
- 关系模型建立在严格的数学概念基础上。
- 关系模型的概念单一。
- 关系模型的存取路径对用户隐蔽。
缺点:
- 存取路径对用户是隐蔽的,其查询效率往往不如层次模型和网状模型。
- 为了提高性能,关系数据库管理系统必须对用户的查询请求进行优化,因此增加了开发关系数据库管理系统的难度。
数据库系统的三级模式结构
模式、外模式和内模式 三级模式结构。
这三级模间提供了两级映像: 外模式/模式映像和模式/内模式映像。这两级映像保证了数据库系统中的数据能够具有较强的逻辑独立性和物理独立性