From d3f3ba42acc191cf229d6818b68fbeec6c87a815 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 11:11:58 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E5=88=86=E7=BB=84=E5=87=BD=E6=95=B0?= =?UTF-8?q?=E5=85=B3=E8=81=94=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...63\350\201\224\345\207\275\346\225\260.md" | 795 ++++++++++++++++++ 1 file changed, 795 insertions(+) create mode 100644 "29 \347\216\213\351\233\257\351\235\231/20230304\345\210\206\347\273\204\345\207\275\346\225\260\357\274\214\345\205\263\350\201\224\345\207\275\346\225\260.md" diff --git "a/29 \347\216\213\351\233\257\351\235\231/20230304\345\210\206\347\273\204\345\207\275\346\225\260\357\274\214\345\205\263\350\201\224\345\207\275\346\225\260.md" "b/29 \347\216\213\351\233\257\351\235\231/20230304\345\210\206\347\273\204\345\207\275\346\225\260\357\274\214\345\205\263\350\201\224\345\207\275\346\225\260.md" new file mode 100644 index 0000000..be41913 --- /dev/null +++ "b/29 \347\216\213\351\233\257\351\235\231/20230304\345\210\206\347\273\204\345\207\275\346\225\260\357\274\214\345\205\263\350\201\224\345\207\275\346\225\260.md" @@ -0,0 +1,795 @@ +# 分组函数 + +也是聚合函数,就是让多行结果变为一行结果 + +#### 类型: + +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; + +``` + +# 作业 + +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列。 + +⑩ 查询“张旭“教师任课的学生成绩。 + +⑪ 查询选修某课程的同学人数多于5人的教师姓名。 + +⑫ 查询出“计算机系“教师所教课程的成绩表。 + +⑬ 查询“计算机系”与“电子工程系“不同职称的教师的Tname和Prof。 + +⑭ 查询选修编号为“3-105“课程且成绩至少高于选修编号为“3-245”的同学的Cno、Sno和Degree,并按Degree从高到低次序排序。 + +⑮ 查询选修编号为“3-105”且成绩高于选修编号为“3-245”课程的同学的Cno、Sno和Degree. + +⑯ 查询成绩比该课程平均成绩低的同学的成绩表。 + +⑰ 查询所有任课教师的Tname和Depart. + +⑱ 查询所有未讲课的教师的Tname和Depart. + +⑲ 查询“男”教师及其所上的课程。 + +⑳ 查询最高分同学的Sno、Cno和Degree列。 + +21 查询和“李军”同性别的所有同学的Sname. + +22 查询和“李军”同性别并同班的同学Sname. + +23 查询所有选修“计算机导论”课程的“男”同学的成绩表。 + +#### 代码: + +```sql +-- 1. 设有一数据库,包括四个表:学生表(Student)、课程表(Course)、成绩表(Score)以及教师信息表(Teacher)。四个表的结构分别如表1-1的表(一)~表(四)所示,数据如表1-2的表(一)~表(四)所示。用SQL语句创建四个表并完成相关题目。 +-- 2. 数据库的表结构 +DROP DATABASE shujuku; +CREATE DATABASE shujiku charset utf8; +USE shujuku; +CREATE TABLE Student ( + Sno VARCHAR ( 20 ) NOT NULL PRIMARY KEY COMMENT '学号(主码)', + Sname VARCHAR ( 20 ) NOT NULL COMMENT '学号姓名', + Ssex VARCHAR ( 20 ) NOT NULL COMMENT '学生性别', + Sbirthday datetime NULL COMMENT '学生出生年月', + Class VARCHAR ( 20 ) NULL COMMENT '学生所在班级' +); + + +CREATE TABLE Teacher ( + Tno VARCHAR ( 20 ) NOT NULL PRIMARY KEY COMMENT '教工编号(主码)', + Tname VARCHAR ( 20 ) NOT NULL COMMENT '教工姓名', + Tsex VARCHAR ( 20 ) NOT NULL COMMENT '教工性别', + Tbirthday datetime NULL COMMENT '教工出生日期', + Prof VARCHAR ( 20 ) NULL COMMENT '职称', + Depeat VARCHAR ( 20 ) NOT NULL COMMENT '教工所在部门' +); + + +CREATE TABLE Course ( + Cno VARCHAR ( 20 ) NOT NULL PRIMARY KEY COMMENT '课程号(主码)', + Cname VARCHAR ( 20 ) NOT NULL COMMENT '课程名称', + Tno VARCHAR ( 20 ) NOT NULL COMMENT '教工编号(外码)', + FOREIGN KEY ( Tno ) REFERENCES Teacher ( Tno ) +); + + +CREATE TABLE Score ( + Sno VARCHAR ( 20 ) NOT NULL COMMENT '学号(外码)', + Cno VARCHAR ( 20 ) NOT NULL COMMENT '课程号(外码)', + Degree DECIMAL ( 4, 1 ) NULL COMMENT '成绩', + PRIMARY KEY ( Sno, Cno ), + FOREIGN KEY ( Sno ) REFERENCES Student ( Sno ), + FOREIGN KEY ( Cno ) REFERENCES Course ( Cno ) +); + + +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中选学多门课程的同学中分数为非最高分成绩的记录。 +-- GROUP BY 分组 +-- having 等效于条件,不同的是having后面可以加函数而where不能 + + +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列。 +-- Year 返回一个指定的日期 +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 = '张旭' + )); + + + +-- 11 查询选修某课程的同学人数多于5人的教师姓名。 + + +SELECT + Tname +FROM + Teacher +WHERE + Tno =( + SELECT + Tno + FROM + Course + WHERE + Cno =( + SELECT + Cno + FROM + Score + GROUP BY + Cno + HAVING + COUNT(*)> 5 + )); + + + -- 12 查询出“计算机系“教师所教课程的成绩表。 + + + +SELECT + * +FROM + Score +WHERE + Cno IN ( + SELECT + Cno + FROM + Course + WHERE + Tno IN ( SELECT Tno FROM Teacher WHERE Depeat = '计算机系' )); + + + + +-- 13 查询“计算机系”与“电子工程系“不同职称的教师的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 = '电子工程系' )); + + + +-- 14查询选修编号为“3-105“课程且成绩至少高于选修编号为“3-245”的同学的Cno、Sno和Degree,并按Degree从高到低次序排序。 +-- Desc 是降序,Asc是升序 + +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; + + + +-- 15查询选修编号为“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' ); + + + +-- 16查询成绩比该课程平均成绩低的同学的成绩表。 +SELECT + Degree +FROM + Score +WHERE + Degree <( + SELECT + AVG( Degree ) + FROM + Score + ); + + +-- 17查询所有任课教师的Tname和Depeat. + +SELECT + Tname, + Depeat +FROM + Teacher +WHERE + Tno IN ( SELECT Tno FROM Course WHERE Cno IN ( SELECT DISTINCT Cno FROM Score ) ); + + + +-- 18 查询所有未讲课的教师的Tname和Depeat. + +SELECT + Tname, + Depeat +FROM + Teacher +WHERE + Tno NOT IN ( + SELECT + Tno + FROM + Course + WHERE + Cno IN ( SELECT DISTINCT Cno FROM Score )); + + + + + + + + +-- 19 查询“男”教师及其所上的课程。 +-- 男教师,课程 + +SELECT + Tname, + Cname +FROM + Teacher + JOIN Course ON Teacher.Tno = Course.Tno + AND Tsex = '男'; + + + + +-- 20 查询最高分同学的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 = '男' ); + + + +``` + + -- Gitee From 76e8a1d7cf5e0dbb4051abb5da2b120487666562 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 22:54:43 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E5=AD=90=E6=9F=A5=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...06\345\255\220\346\237\245\350\257\242.md" | 165 ++++++++++++++++++ 1 file changed, 165 insertions(+) create mode 100644 "29 \347\216\213\351\233\257\351\235\231/20230306\345\255\220\346\237\245\350\257\242.md" diff --git "a/29 \347\216\213\351\233\257\351\235\231/20230306\345\255\220\346\237\245\350\257\242.md" "b/29 \347\216\213\351\233\257\351\235\231/20230306\345\255\220\346\237\245\350\257\242.md" new file mode 100644 index 0000000..bb0dd9b --- /dev/null +++ "b/29 \347\216\213\351\233\257\351\235\231/20230306\345\255\220\346\237\245\350\257\242.md" @@ -0,0 +1,165 @@ +# 子查询 + +## 形式一: + +### 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 单列多值 +``` + +# 作业: + +```sql +create database shujuku charset utf8; +use shujuku; +create table stuinfo( +stuNo varchar(10), +stuName varchar(10), +stuSex enum('男','女'), +stuAge varchar(10), +stuAddress varchar(15), +stuSeat int + +); +create table stuExam( +examNO int, +stuNO varchar(10), +writenExam int, +labExam int + +); +create table stuMarks( +examNO int, +stuID varchar(10), +score int + +); +insert into stuinfo values('s2501','张秋利','男',20,'美国硅谷',1), +('s2502','李斯文','女',18,'湖北武汉',2), +('s2503','马文才','男',18,'湖南长沙',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,'s2502',92), +(3,'s2503',53), +(4,'s2504',60), +(5,'s2505',99), +(6,'s2506',82); + + +-- 查询出年龄比班上平均年龄大的学生的信息 +select*from stuinfo where stuAge>(select avg(stuAge) from stuinfo); +-- 2.查询出每个学生的学号,姓名,性别和选修课程的最高分(stuMarks) +select a.stuNO,a.stuName,a.stuSex,max(score) from stuinfo a left join stumarks b on a.stuNO=b.stuID group by stuNO; +-- 3.查询出每个学生的学号,姓名,性别和考试平均分(stuExam) +select a.stuNO,a.stuName,a.stuSex,(b.writtenExam+b.labExam)/2 平均分 from stuinfo a left join stuexam b on a.stuNO=b.stuNO; +-- 4.查询性别是男并且年龄大于等于20的学生的信息(用两种方法实现:普通查询和子查询) +select * from stuinfo where stuSex='男' and stuAge>=20; +-- 5.查询出年龄比所有男生年龄都大的女生的信息 +select * from stuinfo where stuSex='女' and stuAge>(select max(stuAge) from stuinfo where stuSex='男'); +-- 6.查询出所有选修课程都及格的学生的信息 (stuMarks) +select a.* from stuinfo a, (select stuID from stumarks group by stuID having min(score)>=60) b where a.stuNO=b.stuID +-- 7.查询出参加考试的学生的信息(用表连接,in二种方法做)(stuMarks) +select a.* from stuinfo a,(select stuID from stumarks group by stuID) b where a.stuNO=b.stuID; +-- 8.查询出没有参加考试的学生的信息(用表连接,in二种方法做)(stuMarks) +select * from stuinfo where stuNO not in(select stuID from stumarks group by stuID); +-- 9.将有一门成绩成绩大于90分的学生的基本信息查询出来(stuMarks) +select a.* from stuinfo a,(select stuID from stumarks group by stuID having max(score)>90) b where a.stuNO=b.stuID; +-- 10.查询出平均成绩在80分以上的学生的基本信息(stuMarks) +select a.* from stuinfo a,(select stuID from stumarks group by stuID having avg(score)>80) b where a.stuNO=b.stuID +-- 11.查询出某同学所有考试成绩比“张秋利”同学所有分数都高的学生基本信息(stuMarks) +select a.* from +stuinfo a, +(select stuID from stumarks where stuID!='s2501' group by stuID having max(score)>(select max(score) from stumarks where stuID='s2501')) b +where + a.stuNO=b.stuID; +-- 12.查询出某同学所有考试成绩只需要比“张秋利”同学某个分数高的学生基本信息(stuMarks) +select a.* from +stuinfo a, +(select stuID from stumarks where stuID!='s2501' group by stuID having max(score)>(select min(score) from stumarks where stuID='s2501')) b +where + a.stuNO=b.stuID; +-- 13.查询班上比所有男生年龄都要大的女生的信息 +select * from stuinfo where stuSex=2 and stuage>(select max(stuage) from stuinfo where stusex=1); +-- 14.查询出只是比某个男生年龄大的女生的信息 +select * from stuinfo where stuage>(select min(stuAge) from stuinfo where stuSex='男') and stuSex='女'; +``` -- Gitee