From b2c63e157412a53277a0d9dd05f88d2c58b5a2a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E6=AC=A3?= <3188923799@qq.com> Date: Sun, 5 Mar 2023 13:00:07 +0800 Subject: [PATCH 1/2] task --- ...63\350\201\224\345\207\275\346\225\260.md" | 677 ++++++++++++++++++ 1 file changed, 677 insertions(+) create mode 100644 "31 \346\235\216\346\254\243/20230304 \345\210\206\347\273\204&\345\215\225\350\201\224&\345\205\263\350\201\224\345\207\275\346\225\260.md" diff --git "a/31 \346\235\216\346\254\243/20230304 \345\210\206\347\273\204&\345\215\225\350\201\224&\345\205\263\350\201\224\345\207\275\346\225\260.md" "b/31 \346\235\216\346\254\243/20230304 \345\210\206\347\273\204&\345\215\225\350\201\224&\345\205\263\350\201\224\345\207\275\346\225\260.md" new file mode 100644 index 0000000..cd8f531 --- /dev/null +++ "b/31 \346\235\216\346\254\243/20230304 \345\210\206\347\273\204&\345\215\225\350\201\224&\345\205\263\350\201\224\345\207\275\346\225\260.md" @@ -0,0 +1,677 @@ +# 作业 + +\1. 设有一数据库,包括四个表:学生表(Student)、课程表(Course)、成绩表(Score)以及教师信息表(Teacher)。四个表的结构分别如表1-1的表(一)~表(四)所示,数据如表1-2的表(一)~表(四)所示。用SQL语句创建四个表并完成相关题目。 + +\2. **数据库的表结构** + +表(一)Student (学生表) + +| 属性名 | 数据类型 | 可否为空 | 含义 | +| --------- | ------------ | -------- | ------------ | +| Sno | varchar (20) | 否 | 学号(主码) | +| Sname | varchar (20) | 否 | 学生姓名 | +| Ssex | varchar (20) | 否 | 学生性别 | +| Sbirthday | datetime | 可 | 学生出生年月 | +| Class | varchar (20) | 可 | 学生所在班级 | + +表(二)Course(课程表) + +| 属性名 | 数据类型 | 可否为空 | 含义 | +| ------ | ------------ | -------- | ---------------- | +| Cno | varchar (20) | 否 | 课程号(主码) | +| Cname | varchar (20) | 否 | 课程名称 | +| Tno | varchar (20) | 否 | 教工编号(外码) | + +表(三)Score(成绩表) + +| 属性名 | 数据类型 | 可否为空 | 含义 | +| -------------- | ------------ | -------- | -------------- | +| Sno | varchar (20) | 否 | 学号(外码) | +| Cno | varchar (20) | 否 | 课程号(外码) | +| Degree | Decimal(4,1) | 可 | 成绩 | +| 主码:Sno+ Cno | | | | + +表(四)Teacher(教师表) + +| 属性名 | 数据类型 | 可否为空 | 含义 | +| --------- | ------------ | -------- | ---------------- | +| Tno | varchar (20) | 否 | 教工编号(主码) | +| Tname | varchar (20) | 否 | 教工姓名 | +| Tsex | varchar (20) | 否 | 教工性别 | +| Tbirthday | datetime | 可 | 教工出生年月 | +| Prof | varchar (20) | 可 | 职称 | +| Depart | varchar (20) | 否 | 教工所在部门 | + +\3. **数据库中的数据**: + +-- 1,查询所有学生,都学了哪些课程,要显示学生信息和课程信息/ + +-- 2,查询没有学生的教师的所有信息 + + + + + +表(一)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 | + +表(二)Course + +| Cno | Cname | Tno | +| ----- | ---------- | ---- | +| 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 | + +表(四)Teacher + +| Tno | Tname | Tsex | Tbirthday | Prof | Depart | +| ---- | ----- | ---- | --------- | ------ | ---------- | +| 804 | 李诚 | 男 | 1958-12-2 | 副教授 | 计算机系 | +| 856 | 张旭 | 男 | 1969-3-12 | 讲师 | 电子工程系 | +| 825 | 王萍 | 女 | 1972-5-5 | 助教 | 计算机系 | +| 831 | 刘冰 | 女 | 1977-8-14 | 助教 | 电子工程系 | + +\4. 查询 + +① 查询Score表中的最高分的学生学号和课程号。 + +② 查询所有学生的Sname、Cno和Degree列。 + +③ 查询所有学生的Sno、Cname和Degree列。 + +④ 查询所有学生的Sname、Cname和Degree列。 + +⑤ 查询“95033”班学生的平均分。 + +⑥ 查询选修“3-105”课程的成绩高于“109”号同学成绩的所有同学的记录。 + +⑦ 查询score中选学多门课程的同学中分数为非最高分成绩的记录。 + +⑧ 查询成绩高于学号为“109”、课程号为“3-105”的成绩的所有记录。 + +⑨ 查询和学号为108的同学同年出生的所有学生的Sno、Sname和Sbirthday列。 + +⑩ 查询“张旭“教师任课的学生成绩。 + +11 查询选修某课程的同学人数多于5人的教师姓名。 + +12 查询出“计算机系“教师所教课程的成绩表。 + +13 查询“计算机系”与“电子工程系“不同职称的教师的Tname和Prof。 + +14 查询选修编号为“3-105“课程且成绩至少高于选修编号为“3-245”的同学的Cno、Sno和Degree,并按Degree从高到低次序排序。 + +15 查询选修编号为“3-105”且成绩高于选修编号为“3-245”课程的同学的Cno、Sno和Degree. + +16 查询成绩比该课程平均成绩低的同学的成绩表。 + +17 查询所有任课教师的Tname和Depart. + +18 查询所有未讲课的教师的Tname和Depart. + +19 查询“男”教师及其所上的课程。 + +20 查询最高分同学的Sno、Cno和Degree列。 + +21 查询和“李军”同性别的所有同学的Sname. + +22 查询和“李军”同性别并同班的同学Sname. + +23 查询所有选修“计算机导论”课程的“男”同学的成绩表。 + + + + + + + + + +```sql +CREATE TABLE `student` ( + `Sno` varchar(20) NOT NULL COMMENT '学号', + `Sname` varchar(20) NOT NULL COMMENT '学生姓名', + `Ssex` varchar(20) NOT NULL COMMENT '学生性别', + `Sbirthday` datetime DEFAULT NULL COMMENT '学生出生年月', + `Class` varchar(20) DEFAULT NULL COMMENT '学生所在班级', + PRIMARY KEY (`Sno`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE `teacher` ( + `Tno` varchar(20) NOT NULL COMMENT '教工编号', + `Tname` varchar(20) NOT NULL COMMENT '教工姓名', + `Tsex` varchar(20) NOT NULL COMMENT '教工性别', + `Tbirthday` datetime DEFAULT NULL COMMENT '教工出生年月', + `Prof` varchar(20) DEFAULT NULL COMMENT '职称', + `Depart` varchar(20) NOT NULL COMMENT '教工所在部门', + PRIMARY KEY (`Tno`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE `course` ( + `Cno` varchar(20) NOT NULL COMMENT '课程号', + `Cname` varchar(20) NOT NULL COMMENT '课程名称', + `Tno` varchar(20) NOT NULL COMMENT '教工编号', + PRIMARY KEY (`Cno`,`Tno`), + KEY `Cno` (`Cno`), + CONSTRAINT `score_ibfk_1` FOREIGN KEY (`Cno`) REFERENCES `teacher` (`Tno`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE `score` ( + `Sno` varchar(20) NOT NULL COMMENT '学号', + `Cno` varchar(20) NOT NULL COMMENT '课程号', + `Degree` decimal(4,2) DEFAULT NULL COMMENT '成绩', + PRIMARY KEY (`Sno`,`Cno`), + KEY `Cno` (`Cno`), + CONSTRAINT `course_ibfk_1` FOREIGN KEY (`Sno`) REFERENCES `student` (`Sno`), + CONSTRAINT `course_ibfk_2` FOREIGN KEY (`Cno`) REFERENCES `score` (`Cno`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +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' ); + +INSERT INTO Teacher VALUES( '804', '李诚', '男', '1958-12-2', '副教授', '计算机系' ),( '856', '张旭', '男', '1969-3-12', '讲师', '电子工程系' ),( '825', '王萍', '女', '1972-5-5', '助教', '计算机系' ),( '831', '刘冰', '女', '1977-8-14', '助教', '电子工程系' ); + +INSERT INTO Course VALUES( '3-105', '计算机导论', '825' ),( '3-245', '操作系统', '804' ),( '6-166', '数字电路', '856' ),( '9-888', '高等数学', '831' ); + + +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' ); + +-- 3. **数据库中的数据**: + +-- 1,查询所有学生,都学了哪些课程,要显示学生信息和课程信息/ +SELECT Student.*,Course.Cname FROM Student,Course,Score WHERE Student.Sno=Score.Sno AND Course.Cno=Score.Cno; +-- 2,查询没有学生的教师的所有信息 +SELECT Teacher.* FROM Student RIGHT JOIN Teacher ON Sname IS NULL; + +-- 4. 查询 +-- +-- ① 查询Score表中的最高分的学生学号和课程号。 +SELECT + Sno, + Cno +FROM + Score +WHERE + Degree =( + SELECT + MAX( Degree ) + FROM + Score + ); +-- ② 查询所有学生的Sname、Cno和Degree列。 +SELECT + Sname, + Score.Cno, + Score.Degree +FROM + Student + INNER JOIN Score ON Student.Sno = Score.Sno; +-- ③ 查询所有学生的Sno、Cname和Degree列。 +SELECT + Student.Sno, + Cname, + Degree +FROM + Student + LEFT JOIN Score ON Student.Sno = Score.Sno + INNER JOIN Course Course ON Course.Cno = Score.Cno; +-- ④ 查询所有学生的Sname、Cname和Degree列。 +SELECT + Sname, + Cname, + Degree +FROM + Student + INNER JOIN Score ON Student.Sno = Score.Sno + INNER JOIN Course Course ON Course.Cno = Score.Cno; + +-- ⑤ 查询“95033”班学生的平均分。 +SELECT + AVG( Degree ) +FROM + Score + LEFT JOIN Student ON Score.Sno = Student.Sno +WHERE + Class = 95033; +-- ⑥ 查询选修“3-105”课程的成绩高于“109”号同学成绩的所有同学的记录。 +SELECT + * +FROM + Score +WHERE + Degree > ( SELECT Degree FROM Score WHERE Sno = 109 AND Cno = '3-105' ) + AND Cno = '3-105'; +-- ⑦ 查询score中选学多门课程的同学中分数为非最高分成绩的记录。 +SELECT + * +FROM + Score a +WHERE + Sno IN ( SELECT Sno FROM Score GROUP BY Sno HAVING count(*)> 1 ) + AND Degree !=( + SELECT + MAX( Degree ) + FROM + Score b + WHERE + a.Cno = b.Cno + ); +-- ⑧ 查询成绩高于学号为“109”、课程号为“3-105”的成绩的所有记录。 +SELECT + * +FROM + Score +WHERE + Cno = '3-105' + AND Degree >( + SELECT + Degree + FROM + Score + WHERE + Cno = '3-105' + AND Sno = '109' + ); +-- ⑨ 查询和学号为108的同学同年出生的所有学生的Sno、Sname和Sbirthday列。 +SELECT + Sno, + Sname, + Sbirthday +FROM + Student +WHERE + YEAR ( Sbirthday )=( + SELECT YEAR + ( Sbirthday ) + FROM + Student + WHERE + Sno = '108' + ); +-- ⑩ 查询“张旭“教师任课的学生成绩。 +SELECT + Degree +FROM + Score +WHERE + Cno =( + SELECT + Cno + FROM + Course + WHERE + Tno =( + SELECT + Tno + FROM + Teacher + WHERE + Tname = '张旭' + )); +-- ⑪ 查询选修某课程的同学人数多于5人的教师姓名。 +SELECT + Tname +FROM + Teacher +WHERE + Tno =( + SELECT + Tno + FROM + Course + WHERE + Cno =( + SELECT + Cno + FROM + Score + GROUP BY + Cno + HAVING + COUNT(*)> 5 + )); +-- ⑫ 查询出“计算机系“教师所教课程的成绩表。 +SELECT + * +FROM + Score +WHERE + Cno IN ( + SELECT + Cno + FROM + Course + WHERE + Tno IN ( SELECT Tno FROM Teacher WHERE Depeat = '计算机系' )); +-- ⑬ 查询“计算机系”与“电子工程系“不同职称的教师的Tname和Prof。 +SELECT + Tname, + Prof +FROM + Teacher +WHERE + Prof IN ( + SELECT + Prof + FROM + Teacher + WHERE + Depeat = '计算机系' XOR Prof IN ( SELECT Prof FROM Teacher WHERE Depeat = '电子工程系' ));-- +-- ⑭ 查询选修编号为“3-105“课程且成绩至少高于选修编号为“3-245”的同学的Cno、Sno和Degree,并按Degree从高到低次序排序。 +SELECT + Cno, + Sno, + Degree +FROM + Score +WHERE + Cno IN ( SELECT Cno FROM Score WHERE Cno = '3-105' ) + AND Degree IN ( SELECT Degree FROM Score WHERE Degree > '3-245' ) +ORDER BY + Degree DESC; +-- ⑮ 查询选修编号为“3-105”且成绩高于选修编号为“3-245”课程的同学的Cno、Sno和Degree. +SELECT + Cno, + Sno, + Degree +FROM + Score +WHERE + Cno IN ( SELECT Cno FROM Score WHERE Cno = '3-105' ) + AND Degree IN ( SELECT Degree FROM Score WHERE Degree > '3-245' ); +-- ⑯ 查询成绩比该课程平均成绩低的同学的成绩表。 +SELECT + Degree +FROM + Score +WHERE + Degree <( + SELECT + AVG( Degree ) + FROM + Score + ); +-- ⑰ 查询所有任课教师的Tname和Depart. +SELECT + Tname, + Depeat +FROM + Teacher +WHERE + Tno IN ( SELECT Tno FROM Course WHERE Cno IN ( SELECT DISTINCT Cno FROM Score ) ); + +-- ⑱ 查询所有未讲课的教师的Tname和Depart. +SELECT + Tname, + Depeat +FROM + Teacher +WHERE + Tno NOT IN ( + SELECT + Tno + FROM + Course + WHERE + Cno IN ( SELECT DISTINCT Cno FROM Score )); +-- ⑲ 查询“男”教师及其所上的课程。 +SELECT + Tname, + Cname +FROM + Teacher + JOIN Course ON Teacher.Tno = Course.Tno + AND Tsex = '男'; +-- ⑳ 查询最高分同学的Sno、Cno和Degree列。 +SELECT + Sno, + Cno, + Degree +FROM + Score +WHERE + Degree IN ( SELECT MAX( Degree ) FROM Score ); +-- 21 查询和“李军”同性别的所有同学的Sname. +SELECT + Sname +FROM + Student +WHERE + Ssex IN ( SELECT Ssex FROM Student WHERE Ssex = '男' ); +-- 22 查询和“李军”同性别并同班的同学Sname. +SELECT Sname FROM Student WHERE + Ssex IN ( SELECT Ssex FROM Student WHERE Ssex = '男' ) + AND Class =( + SELECT + Class + FROM + Student + WHERE + Sname = '李军' + ); +-- 23 查询所有选修“计算机导论”课程的“男”同学的成绩表。 +SELECT Degree FROM Score WHERE + Cno IN ( SELECT Cno FROM Course WHERE Cname = '计算机导论' ) + AND Sno IN ( SELECT Sno FROM Student WHERE Ssex = '男' ); +``` + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +# 分组函数 + +也是聚合函数,就是让多行结果变为一行结果 + +#### 类型: + +AVG(X):平均值 + +SUM(X):和 + +MAX(X):最大值 + +MIN(X):最小值 + +COUNT(X):统计 + +注意:1 count(*)或者count(常量值):统计所以数量包含null + +2 count(字段/表达式)只统计字段/表达式不包含null + +比如: + +```sql +#找出t_employee表中最高的薪资值 +SELECT MAX(salary) FROM t_employee; + +#找出t_employee表中最低的薪资值 +SELECT MIN(salary) FROM t_employee; + +#统计t_employee表中平均薪资值 +SELECT AVG(salary) FROM t_employee; + +#统计所有人的薪资总和,财务想看一下,一个月要准备多少钱发工资 +SELECT SUM(salary) FROM t_employee; #没有考虑奖金 +SELECT SUM(salary+salary*IFNULL(commission_pct,0)) FROM t_employee; + +#找出年龄最小、最大的员工的出生日期 +SELECT MAX(birthday),MIN(birthday) FROM t_employee; + +#查询最新入职的员工的入职日期 +SELECT MAX(hiredate) FROM t_employee; +``` + +# 单行函数 + +常用数学函数类型: + +| cell(X) | 取整数 比如2.7就是3 | +| -------------- | ------------------- | +| round(X) | 四舍五入 | +| truncarte(X,Y) | 取整数 比如2.7就是2 | + +还有其他的函数类型了解 + +# 关联函数 + +就是两个或者多个表一起查询 + +关联查询分为七种情况 + +### 1.内连接: + +### (两张表有相同条件去掉不同的地方就是内连接) + +```sql +inner join ...on 条件 +``` + +比如: + +```sql +select * from t_employee a inner join t_department b on a.did = b.did ; + +``` + +特殊内连接: + +```sql +select * from 表名A 别名1,表名B 别名2 where 别名1.字段 = 别名2.字段(字段必须是两边相同的) +``` + +比如: + +```sql +select * from t_employee a,t_department b where a.did = b.did; + +``` + +注意:表名不可以重名 + +笛卡尔积出现的原因是没有关联条件 + +### 2.左连接: + +### (a左边的表内容的全部+右边表和左边表有共同的b左边独有的) + +```sql +A left join B on +``` + +```sql +A表 left join B表 on A表.关联字段 = B表.关联字段 + where 从表.关联字段 is null +``` + +比如: + +```sql +题目:查询所有的员工的姓名和部门编号,部门名称,包括那些没有分配部门的员工 +SELECT + ename, + a.did, + dname +FROM + t_employee a + LEFT JOIN t_department b ON a.did = b.did;#查询所有的员工的姓名和部门编号,部门名称,只显示那些没有分配部门的员工。 +SELECT + ename, + a.did, + dname +FROM + t_employee a + LEFT JOIN t_department b ON a.did = b.did +WHERE + a.did IS NULL; +``` + +### 右连接: + +### (a右边的表内容的全部+左边表和右边表有共同的b右边独有的) + +```sql +A right join B on +``` + +```sql +A表 right join B表 on A表.关联字段 = B表.关联字段 + where 从表.关联字段 is null +``` + +比如: + +```sql +题目:查询所有部门的编号,部门的名称,以及该部门下所有的员工姓名,包括那些没有员工的部门 +SELECT + b.did, + dname, + ename +FROM + t_employee a + RIGHT JOIN t_department b ON a.did = b.did;#查询所有部门的编号,部门的名称,以及该部门下所有的员工信息, +#只显示那些没有员工的部门 +SELECT + b.did, + dname, + ename +FROM + t_employee a + RIGHT JOIN t_department b ON a.did = b.did + where ename is null; + +``` + +# -- Gitee From c952da7692decc90c2f1f8635c3f240492116253 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E6=AC=A3?= <3188923799@qq.com> Date: Tue, 7 Mar 2023 23:21:26 +0800 Subject: [PATCH 2/2] task --- ...7 \345\255\220\346\237\245\350\257\242.md" | 170 ++++++++++++++++++ 1 file changed, 170 insertions(+) create mode 100644 "31 \346\235\216\346\254\243/20230307 \345\255\220\346\237\245\350\257\242.md" diff --git "a/31 \346\235\216\346\254\243/20230307 \345\255\220\346\237\245\350\257\242.md" "b/31 \346\235\216\346\254\243/20230307 \345\255\220\346\237\245\350\257\242.md" new file mode 100644 index 0000000..582b47b --- /dev/null +++ "b/31 \346\235\216\346\254\243/20230307 \345\255\220\346\237\245\350\257\242.md" @@ -0,0 +1,170 @@ +# 作业 + +```sql +drop database student; +create database student charset utf8; +use student; +create table stuinfo( + stuNO varchar(10) primary key, + stuName varchar(10) 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(10) not null, + writtenExam int not null, + labExam int not null, + constraint stuExam foreign key (stuNO) references stuinfo(stuNO) +); + +create table stuMarks( + examNO int not null, + stuID varchar(10) not null, + score int not null, + constraint stuMarks foreign key (examNO) references stuExam(examNO) +); + +insert into stuinfo values +('s2501','张秋利',1,20,'美国硅谷',1), +('s2502','李斯文',2,18,'湖北武汉',2), +('s2503','马文才',1,18,'湖南长沙',3), +('s2504','欧阳俊雄',2,21,'湖北武汉',4), +('s2505','梅超风',1,20,'湖北武汉',5), +('s2506','陈旋风',1,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.查询出年龄比班上平均年龄大的学生的信息 +select * from stuinfo where stuAge>(select avg(stuAge) from stuinfo); +-- 2.查询出每个学生的学号,姓名,性别和选修课程的最高分(stuMarks) +select stuNo 学号,stuName 姓名,stuSex 性别,max(b.score) 最高分 from stuinfo a left join stuMarks b on a.stuNO=b.stuID group by a.stuNO; +-- 3.查询出每个学生的学号,姓名,性别和考试平均分(stuExam) +select a.stuNO 学号,a.stuName 姓名,a.stuSex 性别,avg(b.writtenExam) 笔试平均分,avg(b.labExam) 实践平均分 from stuinfo a left join stuExam b on a.stuNO=b.stuNO group by a.stuNO; +-- 4.查询性别是男并且年龄大于等于20的学生的信息(用两种方法实现:普通查询和子查询) +select * from stuinfo where stuSex='男' and stuAge >=20; +select * from stuinfo where stuSex in(select stuSex from stuinfo where stuSex='男') and stuAge in (select stuAge from stuinfo where stuAge >=20); +-- 5.查询出年龄比所有男生年龄都大的女生的信息 +select * from stuinfo where stuAge in(select stuAge from stuinfo where stuSex='男') < stuAge in(select stuAge from stuinfo where stuSex='女') ; +-- 6.查询出所有选修课程都及格的学生的信息 (stuMarks) +select * from stuinfo a left join stuMarks b on a.stuNO=b.stuID group by a.stuNO having min(b.score)>=60; +-- 7.查询出参加考试的学生的信息(用表连接,in二种方法做)(stuMarks) +select a.* from stuinfo a left join stuMarks b on a.stuNO=b.stuID where b.score is not null group by a.stuNO; +-- 8.查询出没有参加考试的学生的信息(用表连接,in二种方法做)(stuMarks) +select a.* from stuinfo a left join stuMarks b on a.stuNO=b.stuID where b.score is null group by a.stuNO; +-- 9.将有一门成绩成绩大于90分的学生的基本信息查询出来(stuMarks) +select a.* from stuinfo a left join stuMarks b on a.stuNO=b.stuID where b.score>90; +-- 10.查询出平均成绩在80分以上的学生的基本信息(stuMarks) +select a.* from stuinfo a left join stuMarks b on a.stuNO=b.stuID group by a.stuNO having avg(b.score)>=80; +-- 11.查询出某同学所有考试成绩比“张秋利”同学所有分数都高的学生基本信息(stuMarks) +select a.* from stuinfo a left join stuMarks b on a.stuNO=b.stuID group by a.stuNO having min(b.score) >b.score in(select b.score from stuinfo a left join stuMarks b on a.stuNO=b.stuID where stuName = '张秋利') ; +-- 12.查询出某同学所有考试成绩只需要比“张秋利”同学某个分数高的学生基本信息(stuMarks) +select a.* from stuinfo a left join stuMarks b on a.stuNO=b.stuID where b.score >score in(select b.score from stuinfo a left join stuMarks b on a.stuNO=b.stuID where stuName = '张秋利') and stuName !='张秋利' group by a.stuNO ; +-- 13.查询班上比所有男生年龄都要大的女生的信息 +select * from stuinfo where stuAge in(select stuAge from stuinfo where stuSex='男') < stuAge in(select stuAge from stuinfo where stuSex='女'); +-- 14.查询出只是比某个男生年龄大的女生的信息 +select * from stuinfo where stuAge>(select min(stuAge) from stuinfo where stuSex='男') and stuSex='女'; +``` + + + +# 子查询 + +# 子查询 + +## 形式一: + +### select的子查询放在select之后 + +```sql +在“t_employee”表中查询每个人薪资和公司平均薪资的差值, +#并显示员工薪资和公司平均薪资相差5000元以上的记录。 +第一步: +查出每个部门的平均薪资 +select did,avg(salary) from t_employee) from t_employee group by did; +第二步: +查出公司的平均薪资 +select avg(salary) from t_employee; +两者结合: +select ename,salary,salary-(select avg(salary) from t_employee) 差值 from t_employee +where abs(salary-(select avg(salary) from t_employee))>5000; +``` + +## 形式二: + +### select的子查询在where/having之后 + +```sql +(1)在“t_employee”表中查询薪资最高的员工姓名(ename)和薪资(salary)。 +第一步: +找出最高薪资是多少 +select max(salary)from t_employee; +第二步: +找出谁的薪资和最高薪资相等 +select ename,salary,from t_employee where salary=(select max(salary)from t_employee) +结合就是上面的代码 + +``` + +##### 注意:where不能用别名也都是having可以 + +#### 子查询返回的结果当条件使用时会有三种情况: + +1 当结果是单列单值时,此时可以用比较运算符(<,>,<=,>=,!=,=) + +2 当结果是单列多值时,此时不可以用比较运算符(<,>,<=,>=,!=,=) + + 而这时可以用集合的形式(in护坡桩not in) + +3当结果是多列多值时,此时可以用比较运算符(<,>,<=,>=,!=,=) + +但是前面必须要有any some all来搭配 + +## 形式三: + +### 放在from + +```sql +在“t_employee”表中,查询每个部门的平均薪资,显示所有部门的部门编号、部门名称、部门平均薪资。 +方案一:先联表,再分组 +select dep.did,dname,avg(salary) +from t_employee emp + right join t_department dep on emp.did=dep.did +GROUP BY dep.did; + +-- 方案二:先分组,再联表 +# 第一步,按部门did分组,得到每个部门的平均薪资 +select dep.did,dname,avgnum -- 当使用左连接或右连接的时候。select跟的字段,也以主表为主 +from +(select did,avg(salary) avgnum from t_employee GROUP BY did) as temp +right join t_department dep on dep.did=temp.did +order by dep.did; +``` + +#### 注意:当子查询的返回结果是多列多值就只能当临时表用,必须要起别名 + +## 总结: + +```sql +select 单列单值 from 多列多值 where 单列多值 +``` + +# -- Gitee