From e7b151c61d2ba19416eec70aa97245274df70893 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9E=97=E4=BD=B3=E6=B3=BD?= <1097559914@qq.com> Date: Sat, 4 Mar 2023 21:58:37 +0800 Subject: [PATCH 1/2] 20230227 --- .../20230227 \344\275\234\344\270\232.md" | 368 ++++++++++++++++++ 1 file changed, 368 insertions(+) create mode 100644 "02 \346\236\227\344\275\263\346\263\275/20230227 \344\275\234\344\270\232.md" diff --git "a/02 \346\236\227\344\275\263\346\263\275/20230227 \344\275\234\344\270\232.md" "b/02 \346\236\227\344\275\263\346\263\275/20230227 \344\275\234\344\270\232.md" new file mode 100644 index 0000000..8590713 --- /dev/null +++ "b/02 \346\236\227\344\275\263\346\263\275/20230227 \344\275\234\344\270\232.md" @@ -0,0 +1,368 @@ +-- 1. 设有一数据库,包括四个表:学生表(Student)、课程表(Course)、成绩表(Score)以及教师信息表(Teacher)。四个表的结构分别如表1-1的表(一)~表(四)所示,数据如表1-2的表(一)~表(四)所示。用SQL语句创建四个表并完成相关题目。 + +```mysql +CREATE DATABASE class3 CHARSET utf8; +use class3; +``` + +-- 2. 数据库的表结构 +-- 表(一)Student (学生表) +-- 属性名 数据类型 可否为空 含义 +-- Sno varchar (20) 否 学号(主码) +-- Sname varchar (20) 否 学生姓名 +-- Ssex varchar (20) 否 学生性别 +-- Sbirthday datetime 可 学生出生年月 +-- Class varchar (20) 可 学生所在班级 + +```mysql +CREATE TABLE `Student` ( +Sno VARCHAR(20) PRIMARY KEY COMMENT '学号', +Sname VARCHAR(20) not null COMMENT '学生姓名', +Ssex VARCHAR(20) not null COMMENT '学生性别', +Sbirthday datetime COMMENT '学生出生年月', +Class VARCHAR(20) COMMENT '学生所在班级' +)COMMENT '学生表'; +``` + +-- 表(二)Course(课程表) +-- 属性名 数据类型 可否为空 含义 +-- Cno varchar (20) 否 课程号(主码) +-- Cname varchar (20) 否 课程名称 +-- Tno varchar (20) 否 教工编号(外码) + +```mysql +CREATE TABLE Course( +Cno VARCHAR(20) PRIMARY KEY COMMENT '课程号', +Cname VARCHAR(20) NOT NULL COMMENT '课程名称', +Tno VARCHAR(20) not null COMMENT '教工编号' +)COMMENT '课程表'; +``` + +-- 表(三)Score(成绩表) +-- 属性名 数据类型 可否为空 含义 +-- Sno varchar (20) 否 学号(外码) +-- Cno varchar (20) 否 课程号(外码) +-- Degree Decimal(4,1) 可 成绩 +-- 主码:Sno+ Cno + +```mysql +CREATE TABLE Score( +Sno VARCHAR(20), +Cno VARCHAR(20), +Degree DECIMAL(4,1), +PRIMARY KEY(Sno,Cno), +FOREIGN KEY (Sno) REFERENCES Student(Sno), +FOREIGN KEY (Cno) REFERENCES Course(Cno) +)COMMENT '成绩表'; +``` + +-- 表(四)Teacher(教师表) +-- 属性名 数据类型 可否为空 含义 +-- Tno varchar (20) 否 教工编号(主码) +-- Tname varchar (20) 否 教工姓名 +-- Tsex varchar (20) 否 教工性别 +-- Tbirthday datetime 可 教工出生年月 +-- Prof varchar (20) 可 职称 +-- Depart varchar (20) 否 教工所在部门 + +```mysql +CREATE TABLE Teacher( +Tno VARCHAR(20) PRIMARY KEY COMMENT '教工编号', +Tname VARCHAR(20) not null COMMENT '教工姓名', +Tsex VARCHAR(20) not null COMMENT '教工性别', +Tbirthday datetime COMMENT '教工出生年月' , +Prof VARCHAR(20) COMMENT '职称', +Depart VARCHAR(20) not null COMMENT '教工所在部门' +)COMMENT '教师表'; +``` + +-- 将Course表添加外键 + +```mysql +ALTER TABLE Course add FOREIGN KEY (Tno) REFERENCES Teacher(Tno); +``` + +-- 3. 数据库中的数据: +-- -- 1,查询所有学生,都学了哪些课程,要显示学生信息和课程信息/ + +```mysql +SELECT * FROM Student INNER JOIN Score on Student.Sno = Score.Sno +``` + +-- -- 2,查询没有学生的教师的所有信息 + +```mysql +SELECT * from Teacher +LEFT JOIN Course on Teacher.Tno = Course.Tno +LEFT JOIN Score on Course.Cno = Score.Cno +WHERE Sno is null; +``` + +-- 表(一)Student +-- Sno Sname Ssex Sbirthday class +-- 108 曾华 男 1977-9-1 95033 +-- 105 匡明 男 1975-10-2 95031 +-- 107 王丽 女 1976-1-23 95033 +-- 101 李军 男 1976-2-20 95033 +-- 109 王芳 女 1975-2-10 95031 +-- 103 陆君 男 1974-6-3 95031 + +```mysql +INSERT INTO Student VALUES ('108','曾华','男','1977-9-1','95033'), +('105','匡明','男','1975-10-2','95031'), +('107','王丽','女','1976-1-23','95033'), +('101','李军','男','1976-2-20','95033'), +('109','王芳','女','1975-2-10','95031'), +('103','陆君','男','1974-6-3','95031'); +``` + +-- 表(二)Course +-- Cno Cname Tno +-- 3-105 计算机导论 825 +-- 3-245 操作系统 804 +-- 6-166 数字电路 856 +-- 9-888 高等数学 831 + +```mysql +INSERT INTO Course VALUES ('3-105','计算机导论','825'), +('3-245','操作系统','804'), +('6-166','数字电路','856'), +('9-888','高等数学','831'); +``` + +-- 表(三)Score +-- Sno Cno Degree +-- 103 3-245 86 +-- 105 3-245 75 +-- 109 3-245 68 +-- 103 3-105 92 +-- 105 3-105 88 +-- 109 3-105 76 +-- 101 3-105 64 +-- 107 3-105 91 +-- 108 3-105 78 +-- 101 6-166 85 +-- 107 6-166 79 +-- 108 6-166 81 + +```mysql +INSERT into Score VALUES ('103','3-245','86'), +('105','3-245','75'), +('109','3-245','68'), +('103','3-105','92'), +('105','3-105','88'), +('109','3-105','76'), +('101','3-105','64'), +('107','3-105','91'), +('108','3-105','78'), +('101','6-166','85'), +('107','6-166','79'), +('108','6-166','81'); +``` + +-- 表(四)Teacher +-- Tno Tname Tsex Tbirthday Prof Depart +-- 804 李诚 男 1958-12-2 副教授 计算机系 +-- 856 张旭 男 1969-3-12 讲师 电子工程系 +-- 825 王萍 女 1972-5-5 助教 计算机系 +-- 831 刘冰 女 1977-8-14 助教 电子工程系 + +```mysql +INSERT INTO Teacher VALUES ('804','李诚','男','1958-12-2','副教授','计算机系'), +('856','张旭','男','1969-3-12','讲师','电子工程系'), +('825','王萍','女','1972-5-5','助教','计算机系'), +('831','刘冰','女','1977-8-14','助教','电子工程系'); +``` + +-- 4. 查询 +-- ① 查询Score表中的最高分的学生学号和课程号。 + +```mysql +SELECT Sno,Cno,MAX(Degree) from Score; +``` + +-- ② 查询所有学生的Sname、Cno和Degree列。 + +```mysql +SELECT Student.Sname,Cno,Degree FROM Score INNER JOIN Student on Score.Sno = Student.Sno ; +``` + +-- ③ 查询所有学生的Sno、Cname和Degree列。 + +```mysql +SELECT Sno,Course.Cname,Degree from Score INNER JOIN Course on Score.Cno = Course.Cno; +``` + +-- ④ 查询所有学生的Sname、Cname和Degree列。 + +```mysql +SELECT Student.Sname,Course.Cname,Degree FROM Score INNER JOIN Student on Score.Sno = Student.Sno INNER JOIN Course on Score.Cno = Course.Cno; +``` + +-- ⑤ 查询“95033”班学生的平均分。 + +```mysql +SELECT class,AVG(Score.Degree) FROM Student INNER JOIN Score on Student.Sno=Score.Sno WHERE class = '95033'; +``` + +-- ⑥ 查询选修“3-105”课程的成绩高于“109”号同学成绩的所有同学的记录。 + +```mysql +select * from student,Score where Score.Cno='3-105' and student.Sno=Score.Sno and Score.Degree>(select Degree from Score where Cno='3-105' and Sno='109'); +``` + +-- ⑦ 查询score中选学多门课程的同学中分数为非最高分成绩的记录。 + +```mysql +SELECT * from score WHERE Degree < (SELECT MAX(Degree) from score); +``` + +-- ⑧ 查询成绩高于学号为“109”、课程号为“3-105”的成绩的所有记录。 + +```mysql +select * from student,Score where student.Sno=Score.Sno and Score.Degree>(select Degree from Score where Cno='3-105' and Sno='109'); +``` + +-- ⑨ 查询和学号为108的同学同年出生的所有学生的Sno、Sname和Sbirthday列。 + +```mysql +SELECT Sno,Sname,Sbirthday FROM student WHERE YEAR(Sbirthday) = (SELECT YEAR(Sbirthday) FROM student WHERE Sno = '108'); +``` + +-- ⑩ 查询“张旭“教师任课的学生成绩。 + +```mysql +select Degree FROM Score s INNER JOIN Course c on s.Cno = c.Cno WHERE c.Tno = '856'; +``` + +-- 11 查询选修某课程的同学人数多于5人的教师姓名。 + +```mysql +SELECT + Tname +FROM + Teacher + left JOIN Course ON Teacher.Tno = Course.Tno + left JOIN Score ON Course.Cno = Score.Cno + GROUP BY Score.Cno HAVING count(Score.Cno) >= 5; +``` + +-- 12 查询出“计算机系“教师所教课程的成绩表。 + +```mysql +SELECT + Tname 教师姓名, + Depart 系别, + Course.Cname 课程名, + Score.Sno 学生学号, + Score.Degree 学生成绩 +FROM + Teacher +INNER JOIN Course ON Teacher.Tno = Course.Tno +INNER JOIN Score ON Course.Cno = Score.Cno +WHERE Depart = '计算机系'; +``` + +-- 13 查询“计算机系”与“电子工程系“不同职称的教师的Tname和Prof。 + +-- 12 查询出“计算机系“教师所教课程的成绩表。 +SELECT + Tname 教师姓名, + Depart 系别, + Course.Cname 课程名, + Score.Sno 学生学号, + Score.Degree 学生成绩 +FROM + Teacher +INNER JOIN Course ON Teacher.Tno = Course.Tno +INNER JOIN Score ON Course.Cno = Score.Cno +WHERE Depart = '计算机系'; +-- 13 查询“计算机系”与“电子工程系“不同职称的教师的Tname和Prof。 + +```mysql +SELECT + Tname 教师姓名, + Prof 职称 +FROM + Teacher +WHERE + depart = '电子工程系' + AND prof NOT IN ( SELECT Prof FROM Teacher WHERE depart = '计算机系' ) UNION +SELECT + Tname 教师姓名, + Prof 职称 +FROM + Teacher +WHERE + depart = '计算机系' + AND prof NOT IN ( SELECT prof FROM Teacher WHERE depart = '电子工程系' ); +``` + +-- 14 查询选修编号为“3-105“课程且成绩至少高于选修编号为“3-245”的同学的Cno、Sno和Degree,并按Degree从高到低次序排序。 + +```mysql +SELECT Cno,Sno,Degree FROM score WHERE Cno='3-105' and Degree>(SELECT min(Degree) FROM score WHERE Cno='3-245') ORDER BY Degree DESC; +``` + +-- 15 查询选修编号为“3-105”且成绩高于选修编号为“3-245”课程的同学的Cno、Sno和Degree. + +```mysql +SELECT Cno,Sno,Degree FROM score WHERE Cno='3-105' and Degree>(SELECT min(Degree) FROM score WHERE Cno='3-245') ; +``` + +-- 16 查询成绩比该课程平均成绩低的同学的成绩表。 + +```mysql +SELECT * FROM score a WHERE Degree<(SELECT AVG(Degree) FROM score b WHERE a.Cno=b.Cno); +``` + +-- 17 查询所有任课教师的Tname和Depart. + +```mysql +SELECT Tname,Depart FROM teacher; +``` + +-- 18 查询所有未讲课的教师的Tname和Depart. + +```mysql +SELECT Tname,Depart FROM teacher LEFT JOIN course on teacher.Tno = course.Tno +LEFT JOIN score on course.Cno=score.Cno +WHERE Sno is null; +``` + +-- 19 查询“男”教师及其所上的课程。 + +```mysql +SELECT teacher.*,course.Cname FROM teacher,course WHERE teacher.Tno = course.Tno AND teacher.Tsex='男'; +``` + +-- 20 查询最高分同学的Sno、Cno和Degree列。 + +```mysql +SELECT Sno,Cno,Degree from score WHERE Degree=(SELECT MAX(Degree) FROM score); +``` + +-- 21 查询和“李军”同性别的所有同学的Sname. + +```mysql +SELECT Sname FROM student WHERE Ssex = (SELECT Ssex FROM student WHERE Sname='李军'); +``` + +-- 22 查询和“李军”同性别并同班的同学Sname. + +```mysql +SELECT Sname FROM student WHERE student.Class = (SELECT student.Class FROM student WHERE Sname='李军'); +``` + +-- 23 查询所有选修“计算机导论”课程的“男”同学的成绩表。 + +```mysql +select * + +from score + +where sno in (select sno from student where ssex='男' and sno in( + +select sno from score where sno in (select sno from score where cno = (select cno from course where cname='计算机导论')))) +``` + -- Gitee From 54a59cbdb93f752d4be59a81cdbefe97e803ad5a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9E=97=E4=BD=B3=E6=B3=BD?= <1097559914@qq.com> Date: Tue, 7 Mar 2023 19:35:09 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E4=BD=9C=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...42\343\200\201\344\275\234\344\270\232.md" | 271 ++++++++++++++++++ 1 file changed, 271 insertions(+) create mode 100644 "02 \346\236\227\344\275\263\346\263\275/20230306 \345\207\275\346\225\260\343\200\201\345\205\263\350\201\224\346\237\245\350\257\242\343\200\201\345\255\220\346\237\245\350\257\242\343\200\201\344\275\234\344\270\232.md" diff --git "a/02 \346\236\227\344\275\263\346\263\275/20230306 \345\207\275\346\225\260\343\200\201\345\205\263\350\201\224\346\237\245\350\257\242\343\200\201\345\255\220\346\237\245\350\257\242\343\200\201\344\275\234\344\270\232.md" "b/02 \346\236\227\344\275\263\346\263\275/20230306 \345\207\275\346\225\260\343\200\201\345\205\263\350\201\224\346\237\245\350\257\242\343\200\201\345\255\220\346\237\245\350\257\242\343\200\201\344\275\234\344\270\232.md" new file mode 100644 index 0000000..f954d26 --- /dev/null +++ "b/02 \346\236\227\344\275\263\346\263\275/20230306 \345\207\275\346\225\260\343\200\201\345\205\263\350\201\224\346\237\245\350\257\242\343\200\201\345\255\220\346\237\245\350\257\242\343\200\201\344\275\234\344\270\232.md" @@ -0,0 +1,271 @@ +# 20230306 函数、关联查询、子查询、作业 + +## 一、聚合函数: + +##### 1、将一列数据作为一个整体,进行纵向计算 + +##### 2、常见聚合函数: + +| 函数 | 功能 | 注意 | +| :---: | :------: | :-------------: | +| count | 统计数量 | count包含null值 | +| max | 最大值 | 求字段最大值 | +| min | 最小值 | 求字段最小值 | +| avg | 平均值 | 求字段平均值 | +| sum | 求和 | 求字段和值 | + +##### 3、用法: + +```mysql +select 聚合函数(字段) from 表; +-- 注:null值不参与所有聚合函数运算 +``` + +## 二、分组函数 + +​ 关键词:group by + +​ 使用格式: + +```mysql +select 字段 from 表名 group by 参与分组的字段 +``` + +## 三、分组和聚合后再次筛选 + +​ 关键词:having + +​ 使用方式:在统计结果中再次筛选,分组后 聚合后再次筛选 + +## 四、字符串拼接 + +```mysql +concat(x,y,z) -- 拼接x,y,z +concat_ws ('-',x,y,z) -- 用-来拼接xyz +length (字段) -- 求字段或字符长度 +``` + +## 五、关联查询 + +##### 1、两个及更多表一起查询 + +##### 2、内连接 + +```mysql +A表 inner join B表 on A.字段 = B.字段 -- 关联条件 + -- 结果 A ∩ B +``` + +##### 3、左连接 + +```mysql +A left join B on 关联条件 +-- 结果:A表全部 +A left join B on 关联条件 where A.字段 is null +-- 结果:A-A ∩ B 显示A表为空的数据 +``` + +##### 4、右连接 + +```mysql +A right join B on 关联条件 +-- 结果:B表全部 +A right join B on 关联条件 where A.字段 is null +-- 结果:B-A ∩ B 显示B表为空的数据 +``` + +##### 5、合并查询 + +​ 查询A表结果的SQL(左连接A) + +​ union + +​ 查询B表结果的SQL(右连接B) + +##### 6、特殊内连接 + +```mysql +select * from 表1,表2,…… where 条件; +``` + +##### 7、自连接 + +```mysql +select * from left join 表 on 关联条件; +``` + +## 六、子查询 + +​ 子查询是嵌套在其他sql语句中的,查询语句子查询先运行,因此要用()包括起来。 + +​ 表现形式: + +​ ①:select子查询 放在select之后 + +```mysql +select 字段 +(select 字段 from 表) from 表; +``` + +​ ②:放在where/having 之后 + +```mysql +select 字段 from 表 where 字段=(select 字段 from 表); +``` + +​ ③:放在from后 + +​ 是有多列多个值,需要取别名 + +注:where不能用别名,也不能用聚合,having才能用 + +​ ④:where/having之后,会有三种情况: + +​ 1、结果是单列单个值,此时可以直接用比较运算符 + +​ 2、结果是单列多个值,此时不可以直接使用比较运算符,要用in、not in + +​ 3、结果是单列多个值,可以用比较运算符,搭配any,all等关键词使用 + +## 七、作业 + +```mysql +create database text1 charset utf8; +use text1; + +create table stuinfo( +stuNO VARCHAR(20) PRIMARY KEY, +stuName VARCHAR(20) not null, +stuSex enum("男","女") not null, +stuAge int not null, +stuAddress VARCHAR(20) not null, +stuSeat int not null +); + +create table stuExam( +examNO int PRIMARY KEY, +stuNO VARCHAR(20) not null, +writtenExam int not null, +labExam int not null, +FOREIGN KEY (stuNO) REFERENCES stuinfo(stuNO) +); + +create table stuMarks( +examNo int not null, +stuID VARCHAR(20) not null, +score int not NULL +); + +ALTER table stuMarks add FOREIGN KEY (stuID) REFERENCES stuinfo(stuNO); +ALTER table stuMarks add FOREIGN KEY (examNo) REFERENCES stuExam(examNO); + +INSERT into stuinfo VALUES ('s2501','张秋利','男',20,'美国硅谷',1), +('s2502','李斯文','女',18,'湖北武汉',2), +('s2503','马文才','男',22,'湖南长沙',3), +('s2504','欧阳俊雄','女',21,'湖北武汉',4), +('s2505','梅超风','男',20,'湖北武汉',5), +('s2506','陈旋风','男',19,'美国硅谷',6); + +INSERT into stuexam VALUES (1,'s2501',50,70), +(2,'s2502',60,65), +(3,'s2503',86,70), +(4,'s2504',40,80), +(5,'s2505',70,85), +(6,'s2506',85,90); + +INSERT into stumarks VALUES (1,'s2501',88), +(2,'s2501',92), +(3,'s2501',53), +(4,'s2502',60), +(5,'s2502',99), +(6,'s2503',82); +``` + +-- 在如图的数据表上完成以下题目 + +-- 1.查询出年龄比班上平均年龄大的学生的信息 + +```mysql +SELECT * FROM stuinfo WHERE stuAge > (SELECT AVG(stuAge) FROM stuinfo); +``` + +-- 2.查询出每个学生的学号,姓名,性别和选修课程的最高分(stuMarks) + +```mysql +select stuID,stuName,stuAge,max(score) FROM stumarks INNER JOIN stuinfo on stumarks.stuID = stuinfo.stuNO GROUP BY stuID; +``` + +-- 3.查询出每个学生的学号,姓名,性别和考试平均分(stuExam) + +```mysql +select stuexam.stuNO,stuName,stuSex,((writtenExam + labExam) / 2) 平均值 FROM stuexam,stuinfo WHERE stuexam.stuNO=stuinfo.stuNO; +``` + +-- 4.查询性别是男并且年龄大于等于20的学生的信息(用两种方法实现:普通查询和子查询) +-- ①普通查询 + +```mysql +select * FROM stuinfo WHERE stuSex = '男' and stuAge>=20; +``` + +-- ②子查询 + +-- 5.查询出年龄比所有男生年龄都大的女生的信息 + +```mysql +SELECT * FROM stuinfo WHERE (SELECT MAX(stuAge) FROM stuinfo WHERE stuSex = '女') > (select max(stuAge) from stuinfo WHERE stuSex='男'); +``` + +-- 6.查询出所有选修课程都及格的学生的信息 (stuMarks) + +```mysql +SELECT * FROM stumarks INNER JOIN stuinfo on stumarks.stuID = stuinfo.stuNO (SELECT DISTINCT * FROM stuMarks WHERE score<60 ); +``` + +-- 7.查询出参加考试的学生的信息(用表连接,in二种方法做)(stuMarks) + +```mysql +SELECT * from stumarks RIGHT JOIN stuinfo on stumarks.stuID = stuinfo.stuNO WHERE score is not null; +``` + +-- +-- 8.查询出没有参加考试的学生的信息(用表连接,in二种方法做)(stuMarks) + +```mysql +SELECT * from stumarks RIGHT JOIN stuinfo on stumarks.stuID = stuinfo.stuNO WHERE score is null; +``` + +-- 9.将有一门成绩成绩大于90分的学生的基本信息查询出来(stuMarks) +```mysql +SELECT * from stumarks INNER JOIN stuinfo on stumarks.stuID = stuinfo.stuNO WHERE score>90; +``` + +-- 10.查询出平均成绩在80分以上的学生的基本信息(stuMarks) +```mysql +SELECT stuinfo.*,score FROM stumarks INNER JOIN stuinfo on stumarks.stuID=stuinfo.stuNO WHERE score in (SELECT AVG(score) FROM stumarks GROUP BY stuID WHERE AVG(score)>80); +``` + +-- 11.查询出某同学所有考试成绩比“张秋利”同学所有分数都高的学生基本信息(stuMarks) + +```mysql +select * FROM stumarks INNER JOIN stuinfo on stumarks.stuID=stuinfo.stuNO WHERE score > all (SELECT score FROM stumarks INNER JOIN stuinfo on stumarks.stuID=stuinfo.stuNO WHERE stuName = '张秋利'); +``` + +-- 12.查询出某同学所有考试成绩只需要比“张秋利”同学某个分数高的学生基本信息(stuMarks) + +```mysql +select * from stumarks INNER JOIN stuinfo on stumarks.stuID=stuinfo.stuNO WHERE score > any (SELECT score FROM stumarks INNER JOIN stuinfo on stumarks.stuID=stuinfo.stuNO WHERE stuName = '张秋利' ); +``` + +-- +-- 13.查询班上比所有男生年龄都要大的女生的信息 + +```mysql +SELECT * FROM stuinfo WHERE stuSex= '女' and stuAge > (SELECT MAX(stuAge) FROM stuinfo WHERE stuSex = '男'); +``` + +-- 14.查询出只是比某个男生年龄大的女生的信息 + +```mysql +SELECT * FROM stuinfo WHERE stuSex= '女' and stuAge > any (SELECT stuAge FROM stuinfo WHERE stuSex = '男'); +``` + -- Gitee