From ecb41a6ac3804a721fe4f43e68a4acfd52c751fd Mon Sep 17 00:00:00 2001
From: light-city <455954986@qq.com>
Date: Mon, 24 Jun 2019 09:07:42 +0800
Subject: [PATCH 1/7] update data
---
README.md | 6 +-
prac/README.md | 19 +
.../\345\256\236\346\210\2301.md" | 69 +-
"prac/\345\256\236\346\210\2302.md" | 482 +++++++++++++
"prac/\345\256\236\346\210\2303.md" | 201 ++++++
"prac/\345\256\236\346\210\2304.md" | 644 ++++++++++++++++++
6 files changed, 1348 insertions(+), 73 deletions(-)
create mode 100644 prac/README.md
rename day1_dataset.md => "prac/\345\256\236\346\210\2301.md" (84%)
mode change 100755 => 100644
create mode 100644 "prac/\345\256\236\346\210\2302.md"
create mode 100644 "prac/\345\256\236\346\210\2303.md"
create mode 100644 "prac/\345\256\236\346\210\2304.md"
diff --git a/README.md b/README.md
index 146b4f1..cf22107 100755
--- a/README.md
+++ b/README.md
@@ -6,11 +6,7 @@
长期维护更新~
-- 2019.6.23 更新数据集与部分SQL查询题目
-
----
-
-[2019.6.23 更新内容直戳点 ](./day1_dataset.md)
+- [MySQL实战系列](./prac)
## 3.关于我
diff --git a/prac/README.md b/prac/README.md
new file mode 100644
index 0000000..870badc
--- /dev/null
+++ b/prac/README.md
@@ -0,0 +1,19 @@
+# 实战系列
+
+[实战1:MySQL建库及建表及部分查询](./实战1)
+
+[实战2:MySQL查询](./实战2)
+
+[实战3:MySQL实现窗口函数及案例](./实战3)
+
+[实战4:MySQL查询](./实战4)
+
+## 关于我
+
+- 个人网站
+
+ https://light-city.club
+
+- 个人微信公众号
+
+
\ No newline at end of file
diff --git a/day1_dataset.md "b/prac/\345\256\236\346\210\2301.md"
old mode 100755
new mode 100644
similarity index 84%
rename from day1_dataset.md
rename to "prac/\345\256\236\346\210\2301.md"
index 5030718..5681d4f
--- a/day1_dataset.md
+++ "b/prac/\345\256\236\346\210\2301.md"
@@ -1,14 +1,4 @@
-# Day1-数据库创建与表创建及一些查询
-
-## 0.关于我
-
-- 个人网站
-
- https://light-city.club
-
-- 个人微信公众号
-
-
+# MySQL实战上车,Github仓库Star起来
## 1.创建数据库
@@ -301,8 +291,6 @@ mysql> select * from SC sc where sc.CId='01' and sc.SId in (select sc.SId from S
5 rows in set (0.00 sec)
```
-
-
> 查询存在" 01 "课程但可能不存在" 02 "课程的情况(不存在时显示为 null )
首先要明确查询的表是成绩表(`SC`)的信息,这里的主要难点是:不存在显示为NULL。
@@ -389,58 +377,3 @@ mysql> select * from (select * from SC sc where sc.CId='02')s1 left join (select
+-----+-----+-------+------+------+-------+
1 row in set (0.00 sec)
```
-
-> 查询平均成绩大于等于 60 分的同学的学生编号和学生姓名和平均成绩
-
-```mysql
-mysql> select s.SId,s.Sname,avg(sc.score) as AVG from Student s join SC sc on s.SId=sc.SId group by sc.SID having AVG>=60;
-+-----+--------+----------+
-| SId | Sname | AVG |
-+-----+--------+----------+
-| 01 | 赵雷 | 89.66667 |
-| 02 | 钱电 | 70.00000 |
-| 03 | 孙风 | 80.00000 |
-| 05 | 周梅 | 81.50000 |
-| 07 | 郑竹 | 93.50000 |
-+-----+--------+----------+
-5 rows in set (0.00 sec)
-```
-
-> 查询在 SC 表存在成绩的学生信息
-
-方法一:使用`distinct`关键字
-
-```mysql
-mysql> select distinct s.* from Student s, SC sc where s.SId=sc.SId;
-+-----+--------+---------------------+------+
-| SId | Sname | Sage | Ssex |
-+-----+--------+---------------------+------+
-| 01 | 赵雷 | 1990-01-01 00:00:00 | 男 |
-| 02 | 钱电 | 1990-12-21 00:00:00 | 男 |
-| 03 | 孙风 | 1990-12-20 00:00:00 | 男 |
-| 04 | 李云 | 1990-12-06 00:00:00 | 男 |
-| 05 | 周梅 | 1991-12-01 00:00:00 | 女 |
-| 06 | 吴兰 | 1992-01-01 00:00:00 | 女 |
-| 07 | 郑竹 | 1989-01-01 00:00:00 | 女 |
-+-----+--------+---------------------+------+
-7 rows in set (0.00 sec)
-```
-
-方法二:使用`exists`关键字
-
-```mysql
-mysql> select * from Student s where exists(select sc.SId from SC sc where s.SId=sc.SId);
-+-----+--------+---------------------+------+
-| SId | Sname | Sage | Ssex |
-+-----+--------+---------------------+------+
-| 01 | 赵雷 | 1990-01-01 00:00:00 | 男 |
-| 02 | 钱电 | 1990-12-21 00:00:00 | 男 |
-| 03 | 孙风 | 1990-12-20 00:00:00 | 男 |
-| 04 | 李云 | 1990-12-06 00:00:00 | 男 |
-| 05 | 周梅 | 1991-12-01 00:00:00 | 女 |
-| 06 | 吴兰 | 1992-01-01 00:00:00 | 女 |
-| 07 | 郑竹 | 1989-01-01 00:00:00 | 女 |
-+-----+--------+---------------------+------+
-7 rows in set (0.00 sec)
-```
-
diff --git "a/prac/\345\256\236\346\210\2302.md" "b/prac/\345\256\236\346\210\2302.md"
new file mode 100644
index 0000000..cac8376
--- /dev/null
+++ "b/prac/\345\256\236\346\210\2302.md"
@@ -0,0 +1,482 @@
+> 查询平均成绩大于等于 60 分的同学的学生编号和学生姓名和平均成绩
+
+```mysql
+mysql> select s.SId,s.Sname,avg(sc.score) as AVG from Student s join SC sc on s.SId=sc.SId group by sc.SID having AVG>=60;
++-----+--------+----------+
+| SId | Sname | AVG |
++-----+--------+----------+
+| 01 | 赵雷 | 89.66667 |
+| 02 | 钱电 | 70.00000 |
+| 03 | 孙风 | 80.00000 |
+| 05 | 周梅 | 81.50000 |
+| 07 | 郑竹 | 93.50000 |
++-----+--------+----------+
+5 rows in set (0.00 sec)
+```
+
+> 查询在 SC 表存在成绩的学生信息
+
+方法一:使用`distinct`关键字
+
+```mysql
+mysql> select distinct s.* from Student s, SC sc where s.SId=sc.SId;
++-----+--------+---------------------+------+
+| SId | Sname | Sage | Ssex |
++-----+--------+---------------------+------+
+| 01 | 赵雷 | 1990-01-01 00:00:00 | 男 |
+| 02 | 钱电 | 1990-12-21 00:00:00 | 男 |
+| 03 | 孙风 | 1990-12-20 00:00:00 | 男 |
+| 04 | 李云 | 1990-12-06 00:00:00 | 男 |
+| 05 | 周梅 | 1991-12-01 00:00:00 | 女 |
+| 06 | 吴兰 | 1992-01-01 00:00:00 | 女 |
+| 07 | 郑竹 | 1989-01-01 00:00:00 | 女 |
++-----+--------+---------------------+------+
+7 rows in set (0.00 sec)
+```
+
+方法二:使用`exists`关键字
+
+```mysql
+mysql> select * from Student s where exists(select sc.SId from SC sc where s.SId=sc.SId);
++-----+--------+---------------------+------+
+| SId | Sname | Sage | Ssex |
++-----+--------+---------------------+------+
+| 01 | 赵雷 | 1990-01-01 00:00:00 | 男 |
+| 02 | 钱电 | 1990-12-21 00:00:00 | 男 |
+| 03 | 孙风 | 1990-12-20 00:00:00 | 男 |
+| 04 | 李云 | 1990-12-06 00:00:00 | 男 |
+| 05 | 周梅 | 1991-12-01 00:00:00 | 女 |
+| 06 | 吴兰 | 1992-01-01 00:00:00 | 女 |
+| 07 | 郑竹 | 1989-01-01 00:00:00 | 女 |
++-----+--------+---------------------+------+
+7 rows in set (0.00 sec)
+```
+
+> 查询所有同学的学生编号、学生姓名、选课总数、所有课程的成绩总和
+
+```mysql
+mysql> select s.SId,s.Sname,count(s.SId) '选课总和',sum(sc.score) '成绩总和' from Student s left join SC sc on s.SId=sc.SId group by s.SId;
++-----+--------+--------------+--------------+
+| SId | Sname | 选课总和 | 成绩总和 |
++-----+--------+--------------+--------------+
+| 01 | 赵雷 | 3 | 269.0 |
+| 02 | 钱电 | 3 | 210.0 |
+| 03 | 孙风 | 3 | 240.0 |
+| 04 | 李云 | 3 | 100.0 |
+| 05 | 周梅 | 2 | 163.0 |
+| 06 | 吴兰 | 2 | 65.0 |
+| 07 | 郑竹 | 2 | 187.0 |
+| 09 | 张三 | 1 | NULL |
+| 10 | 李四 | 1 | NULL |
+| 11 | 李四 | 1 | NULL |
+| 12 | 赵六 | 1 | NULL |
+| 13 | 孙七 | 1 | NULL |
++-----+--------+--------------+--------------+
+12 rows in set (0.00 sec)
+```
+
+
注意:题目中说的是查询所有同学的相关信息,然而有些同学的信息在SC成绩表中是没有的,因为他们有可能没有成绩,这些人的数据也需要被查询出来,所有需要左连接查询!
+
+> 查询成绩的学生信息
+
+分别使用`in`与`exists`子查询:
+
+```mysql
+mysql> select * from Student s where s.SId in(select sc.SId from SC sc);
++-----+--------+---------------------+------+
+| SId | Sname | Sage | Ssex |
++-----+--------+---------------------+------+
+| 01 | 赵雷 | 1990-01-01 00:00:00 | 男 |
+| 02 | 钱电 | 1990-12-21 00:00:00 | 男 |
+| 03 | 孙风 | 1990-12-20 00:00:00 | 男 |
+| 04 | 李云 | 1990-12-06 00:00:00 | 男 |
+| 05 | 周梅 | 1991-12-01 00:00:00 | 女 |
+| 06 | 吴兰 | 1992-01-01 00:00:00 | 女 |
+| 07 | 郑竹 | 1989-01-01 00:00:00 | 女 |
++-----+--------+---------------------+------+
+7 rows in set (0.00 sec)
+
+mysql> select * from Student s where exists(select sc.SId from SC sc where s.SId=sc.SId);
++-----+--------+---------------------+------+
+| SId | Sname | Sage | Ssex |
++-----+--------+---------------------+------+
+| 01 | 赵雷 | 1990-01-01 00:00:00 | 男 |
+| 02 | 钱电 | 1990-12-21 00:00:00 | 男 |
+| 03 | 孙风 | 1990-12-20 00:00:00 | 男 |
+| 04 | 李云 | 1990-12-06 00:00:00 | 男 |
+| 05 | 周梅 | 1991-12-01 00:00:00 | 女 |
+| 06 | 吴兰 | 1992-01-01 00:00:00 | 女 |
+| 07 | 郑竹 | 1989-01-01 00:00:00 | 女 |
++-----+--------+---------------------+------+
+7 rows in set (0.00 sec)
+```
+
+> 查询「李」姓老师的数量
+
+```mysql
+mysql> select count(t.TId) '数量' from Teacher t where t.Tname like '李%';
++--------+
+| 数量 |
++--------+
+| 1 |
++--------+
+1 row in set (0.00 sec)
+```
+
+> 查询学过「张三」老师授课的同学的信息
+
+考察:多表联合查询
+
+涉及四张表!
+
+```mysql
+mysql> select s.* from Student s,Course c,Teacher t,SC sc where t.TId=c.TId and c.CId=sc.CId and sc.SId=s.SId and t.Tname='张三';
++-----+--------+---------------------+------+
+| SId | Sname | Sage | Ssex |
++-----+--------+---------------------+------+
+| 01 | 赵雷 | 1990-01-01 00:00:00 | 男 |
+| 02 | 钱电 | 1990-12-21 00:00:00 | 男 |
+| 03 | 孙风 | 1990-12-20 00:00:00 | 男 |
+| 04 | 李云 | 1990-12-06 00:00:00 | 男 |
+| 05 | 周梅 | 1991-12-01 00:00:00 | 女 |
+| 07 | 郑竹 | 1989-01-01 00:00:00 | 女 |
++-----+--------+---------------------+------+
+6 rows in set (0.00 sec)
+```
+
+> 查询没有学全所有课程的同学的信息
+
+因为有学生什么课都没有选,反向思考,先查询选了所有课的学生,再选择这些人之外的学生。
+
+```mysql
+mysql> select s.* from Student s where s.SId not in(select sc.SId from SC sc group by sc.SId having count(sc.SId)=(select count(c.CId) from Course c));
++-----+--------+---------------------+------+
+| SId | Sname | Sage | Ssex |
++-----+--------+---------------------+------+
+| 05 | 周梅 | 1991-12-01 00:00:00 | 女 |
+| 06 | 吴兰 | 1992-01-01 00:00:00 | 女 |
+| 07 | 郑竹 | 1989-01-01 00:00:00 | 女 |
+| 09 | 张三 | 2017-12-20 00:00:00 | 女 |
+| 10 | 李四 | 2017-12-25 00:00:00 | 女 |
+| 11 | 李四 | 2012-06-06 00:00:00 | 女 |
+| 12 | 赵六 | 2013-06-13 00:00:00 | 女 |
+| 13 | 孙七 | 2014-06-01 00:00:00 | 女 |
++-----+--------+---------------------+------+
+8 rows in set (0.00 sec)
+```
+
+这道题进一步思考,如果要查询没有学全所有课程的同学的信息当中每个学生的选课个数。
+
+注意:你或许第一反应,这还不简单,直接与SC成绩表联合查询不就得了,可是那如果当学生没有选择任何课程的时候,这些信息是查不到的,也就是只能输出查询到的学生信息,如下所示:
+
+```mysql
+mysql> select s1.*,count(s1.SId) from (select s.* from Student s where s.SId not in(select sc.SId from SC sc group by sc.SId having count(sc.SId)=(select count(c.CId) from Course c))) s1 join SC sc on s1.SId=sc.SId group by s1.SId;
++-----+--------+---------------------+------+---------------+
+| SId | Sname | Sage | Ssex | count(s1.SId) |
++-----+--------+---------------------+------+---------------+
+| 05 | 周梅 | 1991-12-01 00:00:00 | 女 | 2 |
+| 06 | 吴兰 | 1992-01-01 00:00:00 | 女 | 2 |
+| 07 | 郑竹 | 1989-01-01 00:00:00 | 女 | 2 |
++-----+--------+---------------------+------+---------------+
+3 rows in set (0.00 sec)
+```
+
+注意:那换成left join不就行了嘛,真的可以?如下所示:上述查询的count(sc.SId)不能为count(s.SId),如果写成这个,也会查出与理想不符合,因为不管SC成绩表中有没有数据,count(s.SId)至少为1,而实际情况可以为0。
+
+```mysql
+mysql> mysql> select s1.*,count(s1.SId) from (select s.* from Student s where s.SId not in(select sc.SId from SC sc group by sc.SId having count(sc.SId)=(selec(c.CId) from Course c))) s1 left join SC sc on s1.SId=sc.SId group by s1.SId;
++-----+--------+---------------------+------+---------------+
+| SId | Sname | Sage | Ssex | count(s1.SId) |
++-----+--------+---------------------+------+---------------+
+| 05 | 周梅 | 1991-12-01 00:00:00 | 女 | 2 |
+| 06 | 吴兰 | 1992-01-01 00:00:00 | 女 | 2 |
+| 07 | 郑竹 | 1989-01-01 00:00:00 | 女 | 2 |
+| 09 | 张三 | 2017-12-20 00:00:00 | 女 | 1 |
+| 10 | 李四 | 2017-12-25 00:00:00 | 女 | 1 |
+| 11 | 李四 | 2012-06-06 00:00:00 | 女 | 1 |
+| 12 | 赵六 | 2013-06-13 00:00:00 | 女 | 1 |
+| 13 | 孙七 | 2014-06-01 00:00:00 | 女 | 1 |
++-----+--------+---------------------+------+---------------+
+8 rows in set (0.00 sec)
+```
+
+上述查询的count(sc.SId)不能为count(s.SId),如果写成这个,也会查出与理想不符合,因为不管SC成绩表中有没有数据,count(s.SId)至少为1,而实际情况可以为0。最后修改如下:
+
+```mysql
+mysql> select s1.*,count(sc.SId) from (select s.* from Student s where s.SId not in(select sc.SId from SC sc group by sc.SId having count(sc.SId)=(select count(c.CId) from Course c))) s1 left join SC sc on s1.SId=sc.SId group by s1.SId;
++-----+--------+---------------------+------+---------------+
+| SId | Sname | Sage | Ssex | count(sc.SId) |
++-----+--------+---------------------+------+---------------+
+| 05 | 周梅 | 1991-12-01 00:00:00 | 女 | 2 |
+| 06 | 吴兰 | 1992-01-01 00:00:00 | 女 | 2 |
+| 07 | 郑竹 | 1989-01-01 00:00:00 | 女 | 2 |
+| 09 | 张三 | 2017-12-20 00:00:00 | 女 | 0 |
+| 10 | 李四 | 2017-12-25 00:00:00 | 女 | 0 |
+| 11 | 李四 | 2012-06-06 00:00:00 | 女 | 0 |
+| 12 | 赵六 | 2013-06-13 00:00:00 | 女 | 0 |
+| 13 | 孙七 | 2014-06-01 00:00:00 | 女 | 0 |
++-----+--------+---------------------+------+---------------+
+8 rows in set (0.00 sec)
+```
+
+综上:我们可以得到这个结论:当直接连接查询的时候,对于select的结果不需要考虑来源于哪个表,但是当有左或右连接时,需要慎重考虑来自于哪个表!
+
+> 查询至少有一门课与学号为" 01 "的同学所学相同的同学的信息
+
+这个看上去有点绕,实际上很简单,这样子思考:
+
+理解“所学相同”,就是课程Id相同。因为只让查询出至少一门课与学号"01"的同学所学相同,而不是查询出与学号"01"的同学所学完全相同,所以可以将查询出"01"的所有课程编号作为子查询,然后又由于是至少一门课程,这表示,就是普通的连接,而不是左或右连接,因为当学生表与课程表进行连接后,有可能一门课都没。
+
+(1)首先查询出学号为"01"的同学所学课程编号
+
+(2)连接查询
+
+(3)连接查询+子查询(1)
+
+方法一:
+
+将两边连接使用in来查询:
+
+```mysql
+mysql> select * from Student s where s.SId in (select sc.SId from SC sc where sc.CId in (select sc.CId from SC sc where sc.SId='01'));
++-----+--------+---------------------+------+
+| SId | Sname | Sage | Ssex |
++-----+--------+---------------------+------+
+| 01 | 赵雷 | 1990-01-01 00:00:00 | 男 |
+| 02 | 钱电 | 1990-12-21 00:00:00 | 男 |
+| 03 | 孙风 | 1990-12-20 00:00:00 | 男 |
+| 04 | 李云 | 1990-12-06 00:00:00 | 男 |
+| 05 | 周梅 | 1991-12-01 00:00:00 | 女 |
+| 06 | 吴兰 | 1992-01-01 00:00:00 | 女 |
+| 07 | 郑竹 | 1989-01-01 00:00:00 | 女 |
++-----+--------+---------------------+------+
+7 rows in set (0.00 sec)
+```
+
+方法二:
+
+将量表查询使用`join`查询,一定要加`distinct`,如果不加,就会多出很多条重复数据。
+
+```mysql
+mysql> select distinct s.* from Student s join SC sc on s.SId=sc.SId where sc.CId in (select sc.CId from SC sc where sc.SId='01');
++-----+--------+---------------------+------+
+| SId | Sname | Sage | Ssex |
++-----+--------+---------------------+------+
+| 01 | 赵雷 | 1990-01-01 00:00:00 | 男 |
+| 02 | 钱电 | 1990-12-21 00:00:00 | 男 |
+| 03 | 孙风 | 1990-12-20 00:00:00 | 男 |
+| 04 | 李云 | 1990-12-06 00:00:00 | 男 |
+| 05 | 周梅 | 1991-12-01 00:00:00 | 女 |
+| 06 | 吴兰 | 1992-01-01 00:00:00 | 女 |
+| 07 | 郑竹 | 1989-01-01 00:00:00 | 女 |
++-----+--------+---------------------+------+
+7 rows in set (0.00 sec)
+```
+
+> 查询与学号为" 01 "的同学所学完全相同的其他同学的信息
+
+该查询有两个关键点:
+
+第一:完全相同
+
+第二:其他同学
+
+基于这两个关键点,我们得出查询语句需要考虑下面两种条件:
+
+第一:查询所学课程是否全部存在于学号01的学生的所学课程中
+
+上述简化为:查询不等于学号01且课程id均包含在01所学课程中的学生id。
+
+```mysql
+SELECT DISTINCT sc.SId
+FROM SC sc
+WHERE sc.SId <> '01'
+ AND sc.CId IN (
+ SELECT sc.CId
+ FROM SC sc
+ WHERE sc.SId = '01'
+ );
+```
+
+第二:查询所学课程数目与学号01的学生所学课程相等。
+
+上述简化为:查询
+
+```mysql
+SELECT DISTINCT sc.SId
+FROM SC sc
+WHERE sc.SId <> '01'
+ AND sc.CId IN (
+ SELECT sc.CId
+ FROM SC sc
+ WHERE sc.SId = '01'
+ )
+GROUP BY sc.SId
+HAVING COUNT(1) = (
+ SELECT COUNT(1)
+ FROM SC sc
+ WHERE sc.SId = '01'
+)
+```
+
+最后,得出:查询与学号为" 01 "的同学所学完全相同的其他同学的信息
+
+```mysql
+SELECT s.*
+FROM Student s
+WHERE s.SId IN (
+ SELECT sc.SId
+ FROM SC sc
+ WHERE sc.SId <> '01'
+ AND sc.CId IN (
+ SELECT sc.CId
+ FROM SC sc
+ WHERE sc.SId = '01'
+ )
+ GROUP BY sc.SId
+ HAVING COUNT(1) = (
+ SELECT COUNT(1)
+ FROM SC sc
+ WHERE sc.SId = '01'
+ )
+);
+```
+
+查询结果:
+
+```mysql
++-----+--------+---------------------+------+
+| SId | Sname | Sage | Ssex |
++-----+--------+---------------------+------+
+| 02 | 钱电 | 1990-12-21 00:00:00 | 男 |
+| 03 | 孙风 | 1990-12-20 00:00:00 | 男 |
+| 04 | 李云 | 1990-12-06 00:00:00 | 男 |
++-----+--------+---------------------+------+
+3 rows in set (0.00 sec)
+
+```
+
+同理,也可以用not in 来表示:
+
+```mysql
+SELECT s.*
+FROM Student s
+WHERE s.SId IN (
+ SELECT sc.SId
+ FROM SC sc
+ WHERE sc.SId NOT IN (
+ SELECT sc.SId
+ FROM SC sc
+ WHERE sc.CId NOT IN (
+ SELECT sc.CId
+ FROM SC sc
+ WHERE sc.SId = '01'
+ )
+ )
+ GROUP BY sc.SId
+ HAVING COUNT(1) = (
+ SELECT COUNT(1)
+ FROM SC sc
+ WHERE sc.SId = '01'
+ )
+ AND sc.SId <> '01'
+);
+```
+
+> 查询没学过"张三"老师讲授的任一门课程的学生姓名
+
+考察多层嵌套
+
+```mysql
+SELECT s.Sname
+FROM Student s
+WHERE s.SId NOT IN (
+ SELECT sc.SId
+ FROM SC sc
+ WHERE sc.CId IN (
+ SELECT c.CId
+ FROM Teacher t, Course c
+ WHERE t.Tname = '张三'
+ AND t.TId = c.TId
+ )
+);
+```
+
+查询结果:
+
+```mysql
++--------+
+| Sname |
++--------+
+| 吴兰 |
+| 张三 |
+| 李四 |
+| 李四 |
+| 赵六 |
+| 孙七 |
++--------+
+6 rows in set (0.00 sec)
+```
+
+> 查询两门及其以上不及格课程的同学的学号,姓名及其平均成绩
+
+```mysql
+mysql> select s.SId,s.Sname,avg(sc.score) from Student s join SC sc on sc.SId=s.SId and sc.score<60 group by sc.SId having count(1)>1;
++-----+--------+---------------+
+| SId | Sname | avg(sc.score) |
++-----+--------+---------------+
+| 04 | 李云 | 33.33333 |
+| 06 | 吴兰 | 32.50000 |
++-----+--------+---------------+
+2 rows in set (0.00 sec)
+```
+
+可以使用join中的on添加多个条件,也可以使用一个where。(注意如果是left或right join的话,就要注意了,这两种是不等价的!)
+
+```mysql
+mysql> select s.SId,s.Sname,avg(sc.score) from Student s join SC sc on sc.SId=s.SId where sc.score<60 group by sc.SId having count(*)>1;
++-----+--------+---------------+
+| SId | Sname | avg(sc.score) |
++-----+--------+---------------+
+| 04 | 李云 | 33.33333 |
+| 06 | 吴兰 | 32.50000 |
++-----+--------+---------------+
+2 rows in set (0.00 sec)
+```
+
+> 检索" 01 "课程分数小于 60,按分数降序排列的学生信息
+
+```mysql
+mysql> select s.* from Student s,SC sc where s.SId=sc.SId and sc.score<60 and sc.CId='01' order by sc.score desc;
++-----+--------+---------------------+------+
+| SId | Sname | Sage | Ssex |
++-----+--------+---------------------+------+
+| 04 | 李云 | 1990-12-06 00:00:00 | 男 |
+| 06 | 吴兰 | 1992-01-01 00:00:00 | 女 |
++-----+--------+---------------------+------+
+2 rows in set (0.01 sec)
+```
+
+当加入`distinct`关键字就会报错:
+
+```mysql
+mysql> select distinct s.* from Student s,SC sc where s.SId=sc.SId and sc.score<60 and sc.CId='01' order by sc.score desc;
+ERROR 3065 (HY000): Expression #1 of ORDER BY clause is not in SELECT list, references column 'pratice.sc.score' which is not in SELECT list; this is incompatible with DISTINCT
+```
+
+此时解决方案:把order by的字段添加到select语句中即可!
+
+```mysql
+mysql> select distinct s.*,sc.score from Student s,SC sc where s.SId=sc.SId and sc.score<60 and sc.CId='01' order by sc.score desc;
++-----+--------+---------------------+------+-------+
+| SId | Sname | Sage | Ssex | score |
++-----+--------+---------------------+------+-------+
+| 04 | 李云 | 1990-12-06 00:00:00 | 男 | 50.0 |
+| 06 | 吴兰 | 1992-01-01 00:00:00 | 女 | 31.0 |
++-----+--------+---------------------+------+-------+
+2 rows in set (0.00 sec)
+```
+
+distinct和order by一起用时,order by的字段必须在select中,不论在ORACLE或者MYSQL都是这样。
首先,distinct的执行顺序高于order by。
第二,distinct执行时会对查询的记录进行去重,产生一张虚拟的临时表;
第三,order by执行时对查询的虚拟临时表进行排序,产生新的虚拟临时表。综合来看,如果order by的字段不在select中,执行sql语句时首先执行distinct,之后产生的虚拟临时表中没有order by的字段,所以再执行order by时会报错。
+
+asd
\ No newline at end of file
diff --git "a/prac/\345\256\236\346\210\2303.md" "b/prac/\345\256\236\346\210\2303.md"
new file mode 100644
index 0000000..102a67b
--- /dev/null
+++ "b/prac/\345\256\236\346\210\2303.md"
@@ -0,0 +1,201 @@
+## 1.生成组内连续但不唯一的数字。类似Oracle的DENSE_RANK()函数。
+
+> 按各科成绩进行排序,并显示排名, Score 重复时**合并名次空缺**
+
+```mysql
+set @cid=0;
+set @rank=0;
+set @score=0;
+select @rank:=IF(@cid=sc.CId,IF(@score=sc.score,@rank,@rank+1),1) '排名',@cid:=sc.CId '课程编号' ,sc.SId,@score:=sc.score score from SC sc order by cid,score desc;
++--------+--------------+-----+-------+
+| 排名 | 课程编号 | SId | score |
++--------+--------------+-----+-------+
+| 1 | 01 | 01 | 80.0 |
+| 1 | 01 | 03 | 80.0 |
+| 2 | 01 | 05 | 76.0 |
+| 3 | 01 | 02 | 70.0 |
+| 4 | 01 | 04 | 50.0 |
+| 5 | 01 | 06 | 31.0 |
+| 1 | 02 | 01 | 90.0 |
+| 2 | 02 | 07 | 89.0 |
+| 3 | 02 | 05 | 87.0 |
+| 4 | 02 | 03 | 80.0 |
+| 5 | 02 | 02 | 60.0 |
+| 6 | 02 | 04 | 30.0 |
+| 1 | 03 | 01 | 99.0 |
+| 2 | 03 | 07 | 98.0 |
+| 3 | 03 | 03 | 80.0 |
+| 3 | 03 | 02 | 80.0 |
+| 4 | 03 | 06 | 34.0 |
+| 5 | 03 | 04 | 20.0 |
++--------+--------------+-----+-------+
+18 rows in set (0.00 sec)
+```
+
+> 查询学生的总成绩,并进行排名,总分重复时不保留名次空缺
+
+```mysql
+set @total=0;
+select @total:=IF(@total=s.total,@total,@total+1) '排名',s.SId,s.total from (select sc.SId,sum(sc.score) total from SC sc group by sc.SId) as s order by total desc;
++--------+-----+-------+
+| 排名 | SId | total |
++--------+-----+-------+
+| 1 | 01 | 269.0 |
+| 2 | 03 | 240.0 |
+| 3 | 02 | 210.0 |
+| 4 | 07 | 187.0 |
+| 5 | 05 | 163.0 |
+| 6 | 04 | 100.0 |
+| 7 | 06 | 65.0 |
++--------+-----+-------+
+7 rows in set (0.00 sec)
+```
+
+## 2.生成组内连续且唯一的数字。类似Oracle的ROW_NUMBER()函数
+
+首先初始化变量
+
+```mysql
+set @cid=0;
+set @rank=0;
+```
+
+使用`IF`
+
+```mysql
+select @rank:=IF(@cid=sc.CId,@rank+1,1) '排名',@cid:=sc.CId '课程编号' ,sc.SId,sc.score from SC sc order by cid,sc.score desc;
+```
+
+使用`case when end`
+
+```mysql
+select @rank:=(case @cid when sc.CId THEN @rank+1 else 1 end) '排名',@cid:=sc.CId '课程编号' ,sc.SId,sc.score from SC sc order by cid,sc.score desc;
+```
+
+查询结果:
+
+```mysql
++--------+--------------+-----+-------+
+| 排名 | 课程编号 | SId | score |
++--------+--------------+-----+-------+
+| 1 | 01 | 01 | 80.0 |
+| 2 | 01 | 03 | 80.0 |
+| 3 | 01 | 05 | 76.0 |
+| 4 | 01 | 02 | 70.0 |
+| 5 | 01 | 04 | 50.0 |
+| 6 | 01 | 06 | 31.0 |
+| 1 | 02 | 01 | 90.0 |
+| 2 | 02 | 07 | 89.0 |
+| 3 | 02 | 05 | 87.0 |
+| 4 | 02 | 03 | 80.0 |
+| 5 | 02 | 02 | 60.0 |
+| 6 | 02 | 04 | 30.0 |
+| 1 | 03 | 01 | 99.0 |
+| 2 | 03 | 07 | 98.0 |
+| 3 | 03 | 03 | 80.0 |
+| 4 | 03 | 02 | 80.0 |
+| 5 | 03 | 06 | 34.0 |
+| 6 | 03 | 04 | 20.0 |
++--------+--------------+-----+-------+
+18 rows in set (0.00 sec)
+```
+
+注意:select中排名必须在课程编号前面,否则结果不正确!
+
+## 3.生成组内既不连续也不唯一的数字。类似Oracle的RANK()函数。
+
+> 按各科成绩进行排序,并显示排名, Score 重复时**保留名次空缺**
+
+```
+select @enum:=IF(@cid=sc.CId,@enum+1,1) enum,@rank:=IF(@cid=sc.CId,IF(@score=sc.score,@rank,@enum),1) '排名',@cid:=sc.CId '课程编号' ,sc.SId,@score:=sc.score score from SC sc order by cid,score desc;
+```
+
+查询结果:
+
+```mysql
+mysql> select @enum:=IF(@cid=sc.CId,@enum+1,1) enum,@rank:=IF(@cid=sc.CId,IF(@score=sc.score,@rank,@enum),1) '排名',@cid:=sc.CId '课程编号' ,sc.SId,@score:=sc.score score from SC sc order by cid,score desc;
++------+--------+--------------+-----+-------+
+| enum | 排名 | 课程编号 | SId | score |
++------+--------+--------------+-----+-------+
+| 1 | 1 | 01 | 01 | 80.0 |
+| 2 | 1 | 01 | 03 | 80.0 |
+| 3 | 3 | 01 | 05 | 76.0 |
+| 4 | 4 | 01 | 02 | 70.0 |
+| 5 | 5 | 01 | 04 | 50.0 |
+| 6 | 6 | 01 | 06 | 31.0 |
+| 1 | 1 | 02 | 01 | 90.0 |
+| 2 | 2 | 02 | 07 | 89.0 |
+| 3 | 3 | 02 | 05 | 87.0 |
+| 4 | 4 | 02 | 03 | 80.0 |
+| 5 | 5 | 02 | 02 | 60.0 |
+| 6 | 6 | 02 | 04 | 30.0 |
+| 1 | 1 | 03 | 01 | 99.0 |
+| 2 | 2 | 03 | 07 | 98.0 |
+| 3 | 3 | 03 | 03 | 80.0 |
+| 4 | 3 | 03 | 02 | 80.0 |
+| 5 | 5 | 03 | 06 | 34.0 |
+| 6 | 6 | 03 | 04 | 20.0 |
++------+--------+--------------+-----+-------+
+18 rows in set (0.00 sec)
+```
+
+使用自连接:
+
+```mysql
+mysql> select sc1.CId,sc1.SId,sc1.score,count(sc2.score)+1 rank from SC sc1 left join SC sc2 on sc1.CId=sc2.CId and sc1.score 不按各科成绩进行排序,并显示排名, Score 重复时保留名次空缺
+
+```mysql
+select sc1.CId,sc1.SId,sc1.score,(select count(1) from SC sc2 where sc2.score>sc1.score)+1 as rank from SC sc1 order by rank;
++-----+-----+-------+------+
+| CId | SId | score | rank |
++-----+-----+-------+------+
+| 03 | 01 | 99.0 | 1 |
+| 03 | 07 | 98.0 | 2 |
+| 02 | 01 | 90.0 | 3 |
+| 02 | 07 | 89.0 | 4 |
+| 02 | 05 | 87.0 | 5 |
+| 01 | 01 | 80.0 | 6 |
+| 02 | 03 | 80.0 | 6 |
+| 03 | 03 | 80.0 | 6 |
+| 03 | 02 | 80.0 | 6 |
+| 01 | 03 | 80.0 | 6 |
+| 01 | 05 | 76.0 | 11 |
+| 01 | 02 | 70.0 | 12 |
+| 02 | 02 | 60.0 | 13 |
+| 01 | 04 | 50.0 | 14 |
+| 03 | 06 | 34.0 | 15 |
+| 01 | 06 | 31.0 | 16 |
+| 02 | 04 | 30.0 | 17 |
+| 03 | 04 | 20.0 | 18 |
++-----+-----+-------+------+
+18 rows in set (0.00 sec)
+```
+
+
+
diff --git "a/prac/\345\256\236\346\210\2304.md" "b/prac/\345\256\236\346\210\2304.md"
new file mode 100644
index 0000000..b483ddb
--- /dev/null
+++ "b/prac/\345\256\236\346\210\2304.md"
@@ -0,0 +1,644 @@
+> 按平均成绩从高到低显示所有学生的所有课程的成绩以及平均成绩
+
+考虑两点:
+
+第一点:平均成绩从高到低排序;
+
+第二点:所有学生;(要想到用join)。
+
+```mysql
+mysql> select * from SC sc left join (select sc.SId, avg(sc.score) AVG from SC sc group by sc.SId order by AVG desc)r on sc.SId=r.SId;
++-----+-----+-------+------+----------+
+| SId | CId | score | SId | AVG |
++-----+-----+-------+------+----------+
+| 01 | 01 | 80.0 | 01 | 89.66667 |
+| 01 | 02 | 90.0 | 01 | 89.66667 |
+| 01 | 03 | 99.0 | 01 | 89.66667 |
+| 02 | 01 | 70.0 | 02 | 70.00000 |
+| 02 | 02 | 60.0 | 02 | 70.00000 |
+| 02 | 03 | 80.0 | 02 | 70.00000 |
+| 03 | 01 | 80.0 | 03 | 80.00000 |
+| 03 | 02 | 80.0 | 03 | 80.00000 |
+| 03 | 03 | 80.0 | 03 | 80.00000 |
+| 04 | 01 | 50.0 | 04 | 33.33333 |
+| 04 | 02 | 30.0 | 04 | 33.33333 |
+| 04 | 03 | 20.0 | 04 | 33.33333 |
+| 05 | 01 | 76.0 | 05 | 81.50000 |
+| 05 | 02 | 87.0 | 05 | 81.50000 |
+| 06 | 01 | 31.0 | 06 | 32.50000 |
+| 06 | 03 | 34.0 | 06 | 32.50000 |
+| 07 | 02 | 89.0 | 07 | 93.50000 |
+| 07 | 03 | 98.0 | 07 | 93.50000 |
++-----+-----+-------+------+----------+
+18 rows in set (0.00 sec)
+```
+
+> 查询各科成绩最高分、最低分和平均分以如下形式显示:
+>
+> 课程 ID,课程 name,最高分,最低分,平均分,及格率,中等率,优良率,优秀率
+>
+> 及格为>=60,中等为:70-80,优良为:80-90,优秀为:>=90
+>
+> 要求输出课程号和选修人数,查询结果按人数降序排列,若人数相同,按课程号升序排列
+
+```
+SELECT sc.CId '课程 ID', c.Cname '课程 name', MAX(sc.score) AS '最高分'
+ , MIN(sc.score) AS '最低分', AVG(sc.score) AS '平均成绩'
+ , COUNT(sc.CId) AS '选修人数'
+ , SUM(CASE
+ WHEN sc.score >= 60 THEN 1
+ ELSE 0
+ END) / COUNT(sc.CId) AS '及格率'
+ , SUM(CASE
+ WHEN sc.score >= 70
+ AND sc.score < 80 THEN 1
+ ELSE 0
+ END) / COUNT(sc.CId) AS '中等率'
+ , SUM(CASE
+ WHEN sc.score >= 80
+ AND sc.score < 90 THEN 1
+ ELSE 0
+ END) / COUNT(sc.CId) AS '优良率'
+ , SUM(CASE
+ WHEN sc.score >= 90 THEN 1
+ ELSE 0
+ END) / COUNT(sc.CId) AS '优秀率'
+FROM SC sc
+ JOIN Course c ON sc.CId = c.CId
+GROUP BY sc.CId
+ORDER BY COUNT(sc.CId) DESC, sc.CId ASC;
+```
+
+查询结果:
+
+```mysql
++-----------+-------------+-----------+-----------+--------------+--------------+-----------+-----------+-----------+-----------+
+| 课程 ID | 课程 name | 最高分 | 最低分 | 平均成绩 | 选修人数 | 及格率 | 中等率 | 优良率 | 优秀率 |
++-----------+-------------+-----------+-----------+--------------+--------------+-----------+-----------+-----------+-----------+
+| 01 | 语文 | 80.0 | 31.0 | 64.50000 | 6 | 0.6667 | 0.3333 | 0.3333 | 0.0000 |
+| 02 | 数学 | 90.0 | 30.0 | 72.66667 | 6 | 0.8333 | 0.0000 | 0.5000 | 0.1667 |
+| 03 | 英语 | 99.0 | 20.0 | 68.50000 | 6 | 0.6667 | 0.0000 | 0.3333 | 0.3333 |
++-----------+-------------+-----------+-----------+--------------+--------------+-----------+-----------+-----------+-----------+
+3 rows in set (0.00 sec)
+```
+
+>统计各科成绩各分数段人数:课程编号,课程名称,[100-85],[85-70],[70-60],[60-0] 及所占百分比
+
+```mysql
+SELECT Course.Cname, Course.CId, SUM(CASE
+ WHEN sc.score <= 100
+ AND sc.score > 85 THEN 1
+ ELSE 0
+ END) AS "[100-85]"
+ , SUM(CASE
+ WHEN sc.score <= 85
+ AND sc.score > 70 THEN 1
+ ELSE 0
+ END) AS "[85-70]", SUM(CASE
+ WHEN sc.score <= 70
+ AND sc.score > 60 THEN 1
+ ELSE 0
+ END) AS "[70-60]"
+ , SUM(CASE
+ WHEN sc.score <= 60
+ AND sc.score > 0 THEN 1
+ ELSE 0
+ END) AS "[60-0]"
+ , SUM(CASE
+ WHEN sc.score <= 100
+ AND sc.score > 85 THEN 1
+ ELSE 0
+ END) / COUNT(1) AS "[100-85]百分比"
+ , SUM(CASE
+ WHEN sc.score <= 85
+ AND sc.score > 70 THEN 1
+ ELSE 0
+ END) / COUNT(1) AS "[85-70]百分比"
+ , SUM(CASE
+ WHEN sc.score <= 70
+ AND sc.score > 60 THEN 1
+ ELSE 0
+ END) / COUNT(1) AS "[70-60]百分比"
+ , SUM(CASE
+ WHEN sc.score <= 60
+ AND sc.score > 0 THEN 1
+ ELSE 0
+ END) / COUNT(1) AS "[60-0]百分比"
+FROM SC sc
+ LEFT JOIN Course ON sc.CId = Course.CId
+GROUP BY sc.CId;
+```
+
+> 查询各科成绩前三名的记录
+
+```mysql
+mysql> select * from SC sc
+ -> where (select count(*) from SC as a
+ -> where sc.CId= a.CId and sc.score order by CId asc, sc.score desc;
++-----+-----+-------+
+| SId | CId | score |
++-----+-----+-------+
+| 01 | 01 | 80.0 |
+| 03 | 01 | 80.0 |
+| 05 | 01 | 76.0 |
+| 01 | 02 | 90.0 |
+| 07 | 02 | 89.0 |
+| 05 | 02 | 87.0 |
+| 01 | 03 | 99.0 |
+| 07 | 03 | 98.0 |
+| 02 | 03 | 80.0 |
+| 03 | 03 | 80.0 |
++-----+-----+-------+
+10 rows in set (0.00 sec)
+```
+
+> 查询每门课程被选修的学生数
+
+```mysql
+mysql> select CId,count(SId) from SC group by CId;
++-----+------------+
+| CId | count(SId) |
++-----+------------+
+| 01 | 6 |
+| 02 | 6 |
+| 03 | 6 |
++-----+------------+
+3 rows in set (0.00 sec)
+```
+
+> 查询出只选修两门课程的学生学号和姓名
+
+联合查询:`join`连接:
+
+```mysql
+mysql> select s.SId,s.Sname from Student s join SC sc on s.SId=sc.SId group by sc.SId having count(1)=2;
++-----+--------+
+| SId | Sname |
++-----+--------+
+| 05 | 周梅 |
+| 06 | 吴兰 |
+| 07 | 郑竹 |
++-----+--------+
+3 rows in set (0.00 sec)
+```
+
+嵌套查询:`in`子句
+
+```mysql
+mysql> select s.SId,s.Sname from Student s where s.SId in (select sc.SId from SC sc group by sc.SId having count(1)=2);
++-----+--------+
+| SId | Sname |
++-----+--------+
+| 05 | 周梅 |
+| 06 | 吴兰 |
+| 07 | 郑竹 |
++-----+--------+
+3 rows in set (0.00 sec)
+```
+
+> 查询男生、女生人数
+
+```mysql
+mysql> select s.Ssex,count(s.Ssex) as '总人数' from Student s group by s.Ssex;
++------+-----------+
+| Ssex | 总人数 |
++------+-----------+
+| 男 | 4 |
+| 女 | 8 |
++------+-----------+
+2 rows in set (0.00 sec)
+```
+
+> 查询名字中含有「风」字的学生信息
+
+```mysql
+mysql> select * from Student where Sname like '%风%';
++-----+--------+---------------------+------+
+| SId | Sname | Sage | Ssex |
++-----+--------+---------------------+------+
+| 03 | 孙风 | 1990-12-20 00:00:00 | 男 |
++-----+--------+---------------------+------+
+1 row in set (0.00 sec)
+```
+
+> 查询同名学生名单,并统计同名人数
+
+```mysql
+mysql> select s.Sname,count(*) as '同名人数' from Student s group by s.Sname having count(*)>1;
++--------+--------------+
+| Sname | 同名人数 |
++--------+--------------+
+| 李四 | 2 |
++--------+--------------+
+1 row in set (0.00 sec)
+```
+
+> 查询1990年出生的学生名单
+
+`like`通配符:
+
+```mysql
+mysql> select * from Student where Sage like '1990-%';
++-----+--------+---------------------+------+
+| SId | Sname | Sage | Ssex |
++-----+--------+---------------------+------+
+| 01 | 赵雷 | 1990-01-01 00:00:00 | 男 |
+| 02 | 钱电 | 1990-12-21 00:00:00 | 男 |
+| 03 | 孙风 | 1990-12-20 00:00:00 | 男 |
+| 04 | 李云 | 1990-12-06 00:00:00 | 男 |
++-----+--------+---------------------+------+
+4 rows in set, 1 warning (0.00 sec)
+```
+
+`year`函数:
+
+```mysql
+mysql> select * from Student where year(Sage)=1990;
++-----+--------+---------------------+------+
+| SId | Sname | Sage | Ssex |
++-----+--------+---------------------+------+
+| 01 | 赵雷 | 1990-01-01 00:00:00 | 男 |
+| 02 | 钱电 | 1990-12-21 00:00:00 | 男 |
+| 03 | 孙风 | 1990-12-20 00:00:00 | 男 |
+| 04 | 李云 | 1990-12-06 00:00:00 | 男 |
++-----+--------+---------------------+------+
+4 rows in set (0.00 sec)
+```
+
+> 查询每门课程的平均成绩,结果按平均成绩降序排列,平均成绩相同时,按课程编号升序排列
+
+```mysql
+mysql> select sc.CId,avg(sc.score) as '平均成绩' from SC sc group by sc.CId order by 平均成绩 desc ,sc.CId asc;
++-----+--------------+
+| CId | 平均成绩 |
++-----+--------------+
+| 02 | 72.66667 |
+| 03 | 68.50000 |
+| 01 | 64.50000 |
++-----+--------------+
+3 rows in set (0.00 sec)
+```
+
+> 查询平均成绩大于等于 85 的所有学生的学号、姓名和平均成绩
+
+```mysql
+mysql> select s.SId,s.Sname,avg(sc.score) as average from Student s left join SC sc on sc.SId=s.SId group by s.SId having average>=85;
++-----+--------+----------+
+| SId | Sname | average |
++-----+--------+----------+
+| 01 | 赵雷 | 89.66667 |
+| 07 | 郑竹 | 93.50000 |
++-----+--------+----------+
+2 rows in set (0.00 sec)
+```
+
+> 查询课程名称为「数学」,且分数低于 60 的学生姓名和分数
+
+```mysql
+mysql> select s.Sname,sc.score from Course c,SC sc,Student s where c.Cname='数学' and c.CId=sc.CId and sc.score<60 and sc.SId=s.SId;
++--------+-------+
+| Sname | score |
++--------+-------+
+| 李云 | 30.0 |
++--------+-------+
+1 row in set (0.00 sec)
+```
+
+> 查询所有学生的课程及分数情况(存在学生没成绩,没选课的情况)
+
+```mysql
+mysql> select s.Sname,sc.CId,sc.score from Student s left join SC sc on s.SId=sc.SId;
++--------+------+-------+
+| Sname | CId | score |
++--------+------+-------+
+| 赵雷 | 01 | 80.0 |
+| 赵雷 | 02 | 90.0 |
+| 赵雷 | 03 | 99.0 |
+| 钱电 | 01 | 70.0 |
+| 钱电 | 02 | 60.0 |
+| 钱电 | 03 | 80.0 |
+| 孙风 | 01 | 80.0 |
+| 孙风 | 02 | 80.0 |
+| 孙风 | 03 | 80.0 |
+| 李云 | 01 | 50.0 |
+| 李云 | 02 | 30.0 |
+| 李云 | 03 | 20.0 |
+| 周梅 | 01 | 76.0 |
+| 周梅 | 02 | 87.0 |
+| 吴兰 | 01 | 31.0 |
+| 吴兰 | 03 | 34.0 |
+| 郑竹 | 02 | 89.0 |
+| 郑竹 | 03 | 98.0 |
+| 张三 | NULL | NULL |
+| 李四 | NULL | NULL |
+| 李四 | NULL | NULL |
+| 赵六 | NULL | NULL |
+| 孙七 | NULL | NULL |
++--------+------+-------+
+23 rows in set (0.00 sec)
+```
+
+> 查询任何一门课程成绩在 70 分以上的姓名、课程名称和分数
+
+```mysql
+mysql> select s.Sname, c.Cname,sc.score from Student s,Course c,SC sc
+ -> where sc.score>70
+ -> and s.SId= sc.SId
+ -> and sc.CId= c.CId;
++--------+--------+-------+
+| Sname | Cname | score |
++--------+--------+-------+
+| 赵雷 | 语文 | 80.0 |
+| 赵雷 | 数学 | 90.0 |
+| 赵雷 | 英语 | 99.0 |
+| 钱电 | 英语 | 80.0 |
+| 孙风 | 语文 | 80.0 |
+| 孙风 | 数学 | 80.0 |
+| 孙风 | 英语 | 80.0 |
+| 周梅 | 语文 | 76.0 |
+| 周梅 | 数学 | 87.0 |
+| 郑竹 | 数学 | 89.0 |
+| 郑竹 | 英语 | 98.0 |
++--------+--------+-------+
+11 rows in set (0.00 sec)
+```
+
+> 查询存在不及格的课程
+
+`group by`取唯一:
+
+```mysql
+mysql> select sc.CId from SC sc where sc.score<60 group by sc.CId;
++-----+
+| CId |
++-----+
+| 01 |
+| 02 |
+| 03 |
++-----+
+3 rows in set (0.00 sec)
+```
+
+`distinct`取唯一:
+
+```mysql
+mysql> select distinct sc.CId from SC sc where sc.score<60;
++-----+
+| CId |
++-----+
+| 01 |
+| 02 |
+| 03 |
++-----+
+3 rows in set (0.00 sec)
+```
+
+> 查询课程编号为 01 且课程成绩在 80 分及以上的学生的学号和姓名
+
+```mysql
+mysql> select s.SId,s.Sname from Student s,SC sc where sc.SId=s.SId and sc.score>=80 and sc.CId='01';
++-----+--------+
+| SId | Sname |
++-----+--------+
+| 01 | 赵雷 |
+| 03 | 孙风 |
++-----+--------+
+2 rows in set (0.00 sec)
+```
+
+> 求每门课程的学生人数
+
+```mysql
+mysql> select sc.CId,count(*) from SC sc group by sc.CId;
++-----+----------+
+| CId | count(*) |
++-----+----------+
+| 01 | 6 |
+| 02 | 6 |
+| 03 | 6 |
++-----+----------+
+3 rows in set (0.00 sec)
+```
+
+>查询选修「张三」老师所授课程的学生中,成绩最高的学生信息及其成绩
+
+下面两种方法不管是成绩重复与否,都可以查询出来!
+
+`in`子查询:
+
+```mysql
+mysql> select * from Student s,SC sc where s.SId=sc.SId and sc.score =( select max(sc.score) from SC sc,Teacher t,Course c where c.TId=t.TId and c.CId=sc.CId and t.Tname='张三');
++-----+--------+---------------------+------+-----+-----+-------+
+| SId | Sname | Sage | Ssex | SId | CId | score |
++-----+--------+---------------------+------+-----+-----+-------+
+| 01 | 赵雷 | 1990-01-01 00:00:00 | 男 | 01 | 02 | 90.0 |
++-----+--------+---------------------+------+-----+-----+-------+
+1 row in set (0.00 sec)
+```
+
+`limit`查询
+
+```mysql
+mysql> select s.*,sc.score from Student s,SC sc,Teacher t,Course c where c.TId=t.TId and c.CId=sc.CId and sc.SId=s.SId and t.Tname='张三' order by sc.score desc limit 1;
++-----+--------+---------------------+------+-------+
+| SId | Sname | Sage | Ssex | score |
++-----+--------+---------------------+------+-------+
+| 01 | 赵雷 | 1990-01-01 00:00:00 | 男 | 90.0 |
++-----+--------+---------------------+------+-------+
+1 row in set (0.01 sec)
+```
+
+> 查询不同课程成绩相同的学生的学生编号、课程编号、学生成绩
+
+```mysql
+mysql> select distinct sc1.CId,sc1.SId,sc1.score from SC sc1 join SC sc2 on sc1.SId=sc2.SId and sc1.CId!=sc2.CId and sc1.score=sc2.score;
++-----+-----+-------+
+| CId | SId | score |
++-----+-----+-------+
+| 02 | 03 | 80.0 |
+| 03 | 03 | 80.0 |
+| 01 | 03 | 80.0 |
++-----+-----+-------+
+3 rows in set (0.00 sec)
+```
+
+> 查询每门功成绩最好的前两名
+
+嵌套子查询:
+
+```mysql
+mysql> select * from SC sc
+ -> where (select count(*) from SC as a
+ -> where sc.CId= a.CId and sc.score order by CId asc, sc.score desc;
++-----+-----+-------+
+| SId | CId | score |
++-----+-----+-------+
+| 01 | 01 | 80.0 |
+| 03 | 01 | 80.0 |
+| 01 | 02 | 90.0 |
+| 07 | 02 | 89.0 |
+| 01 | 03 | 99.0 |
+| 07 | 03 | 98.0 |
++-----+-----+-------+
+6 rows in set (0.01 sec)
+```
+
+`group by having`
+
+```mysql
+mysql> select a.SId,a.CId,a.score from SC as a left join SC as b on a.CId=b.CId and a.score 统计每门课程的学生选修人数(超过 5 人的课程才统计)
+
+```mysql
+mysql> select sc.CId,count(sc.SId) as total from SC sc group by sc.CId having total>5;
++-----+-------+
+| CId | total |
++-----+-------+
+| 01 | 6 |
+| 02 | 6 |
+| 03 | 6 |
++-----+-------+
+3 rows in set (0.00 sec)
+```
+
+> 检索至少选修两门课程的学生学号
+
+```mysql
+mysql> select sc.SId,count(sc.CId) as count from SC sc group by sc.SId having count(sc.CId)>=2;
++-----+-------+
+| SId | count |
++-----+-------+
+| 01 | 3 |
+| 02 | 3 |
+| 03 | 3 |
+| 04 | 3 |
+| 05 | 2 |
+| 06 | 2 |
+| 07 | 2 |
++-----+-------+
+7 rows in set (0.00 sec)
+```
+
+> 查询选修了全部课程的学生信息
+
+```mysql
+mysql> select s.* from Student s,SC sc where sc.SId=s.SId group by sc.SId having count(sc.CId)=(select distinct count(*) from Course);
++-----+--------+---------------------+------+
+| SId | Sname | Sage | Ssex |
++-----+--------+---------------------+------+
+| 01 | 赵雷 | 1990-01-01 00:00:00 | 男 |
+| 02 | 钱电 | 1990-12-21 00:00:00 | 男 |
+| 03 | 孙风 | 1990-12-20 00:00:00 | 男 |
+| 04 | 李云 | 1990-12-06 00:00:00 | 男 |
++-----+--------+---------------------+------+
+4 rows in set (0.00 sec)
+```
+
+> 查询各学生的年龄,只按年份来算
+
+```mysql
+mysql> select s.Sname,year(curdate())-year(s.Sage) as 年龄 from Student s;
++--------+--------+
+| Sname | 年龄 |
++--------+--------+
+| 赵雷 | 29 |
+| 钱电 | 29 |
+| 孙风 | 29 |
+| 李云 | 29 |
+| 周梅 | 28 |
+| 吴兰 | 27 |
+| 郑竹 | 30 |
+| 张三 | 2 |
+| 李四 | 2 |
+| 李四 | 7 |
+| 赵六 | 6 |
+| 孙七 | 5 |
++--------+--------+
+12 rows in set (0.00 sec)
+```
+
+> 按照出生日期来算,当前月日 < 出生年月的月日,则年龄减一
+
+```mysql
+mysql> select s.SId,s.Sname,( case
+ -> when MONTH(curdate()) when MONTH(s.Sage)=month(curdate()) and DAYOfmonth(s.Sage) then year(curdate())-year(s.Sage)-1
+ -> else year(curdate())-year(s.Sage)
+ -> end) as 年龄 from Student s;
++-----+--------+--------+
+| SId | Sname | 年龄 |
++-----+--------+--------+
+| 01 | 赵雷 | 29 |
+| 02 | 钱电 | 28 |
+| 03 | 孙风 | 28 |
+| 04 | 李云 | 28 |
+| 05 | 周梅 | 27 |
+| 06 | 吴兰 | 27 |
+| 07 | 郑竹 | 30 |
+| 09 | 张三 | 1 |
+| 10 | 李四 | 1 |
+| 11 | 李四 | 6 |
+| 12 | 赵六 | 5 |
+| 13 | 孙七 | 4 |
++-----+--------+--------+
+12 rows in set (0.00 sec)
+```
+
+> 查询本周过生日的学生
+
+`WEEKOFYEAR(date)`返回日期用数字表示的范围是从1到53的日历周。`
+
+```mysql
+mysql> select * from Student s where weekofyear(s.Sage)=weekofyear(curdate());
+Empty set (0.00 sec)
+```
+
+>查询下周过生日的学生
+
+```mysql
+mysql> select *
+ -> from Student s
+ -> where WEEKOFYEAR(s.Sage)=WEEKOFYEAR(CURDATE())+1;
+Empty set (0.00 sec)
+```
+
+> 查询本月过生日的学生
+
+```mysql
+mysql> select *
+ -> from Student s
+ -> where MONTH(s.Sage)=MONTH(CURDATE());
++-----+--------+---------------------+------+
+| SId | Sname | Sage | Ssex |
++-----+--------+---------------------+------+
+| 11 | 李四 | 2012-06-06 00:00:00 | 女 |
+| 12 | 赵六 | 2013-06-13 00:00:00 | 女 |
+| 13 | 孙七 | 2014-06-01 00:00:00 | 女 |
++-----+--------+---------------------+------+
+3 rows in set (0.00 sec)
+```
+
+> 查询下月过生日的学生
+
+```mysql
+mysql> select *
+ -> from Student s
+ -> where MONTH(s.Sage)=MONTH(CURDATE())+1;
+Empty set (0.01 sec)
+```
+
From 87c999cd4735a61a14d6c5657bea4b502234a46f Mon Sep 17 00:00:00 2001
From: light-city <455954986@qq.com>
Date: Mon, 24 Jun 2019 09:09:22 +0800
Subject: [PATCH 2/7] update data
---
prac/README.md | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/prac/README.md b/prac/README.md
index 870badc..f9081d2 100644
--- a/prac/README.md
+++ b/prac/README.md
@@ -1,12 +1,12 @@
# 实战系列
-[实战1:MySQL建库及建表及部分查询](./实战1)
+[实战1:MySQL建库及建表及部分查询](./实战1.md)
-[实战2:MySQL查询](./实战2)
+[实战2:MySQL查询](./实战2.md)
-[实战3:MySQL实现窗口函数及案例](./实战3)
+[实战3:MySQL实现窗口函数及案例](./实战3.md)
-[实战4:MySQL查询](./实战4)
+[实战4:MySQL查询](./实战4.md)
## 关于我
@@ -16,4 +16,4 @@
- 个人微信公众号
-
\ No newline at end of file
+
From 609c4276ec899ecfa217d9cb28b714b910f53e8c Mon Sep 17 00:00:00 2001
From: light-city <455954986@qq.com>
Date: Mon, 24 Jun 2019 09:12:06 +0800
Subject: [PATCH 3/7] update data
---
"prac/\345\256\236\346\210\2301.md" | 10 ++++++++++
"prac/\345\256\236\346\210\2302.md" | 10 ++++++++++
"prac/\345\256\236\346\210\2303.md" | 10 ++++++++++
"prac/\345\256\236\346\210\2304.md" | 10 ++++++++++
4 files changed, 40 insertions(+)
diff --git "a/prac/\345\256\236\346\210\2301.md" "b/prac/\345\256\236\346\210\2301.md"
index 5681d4f..6bdb705 100644
--- "a/prac/\345\256\236\346\210\2301.md"
+++ "b/prac/\345\256\236\346\210\2301.md"
@@ -1,5 +1,15 @@
# MySQL实战上车,Github仓库Star起来
+## 关于我
+
+- 个人网站
+
+ https://light-city.club
+
+- 个人微信公众号
+
+
+
## 1.创建数据库
```mysql
diff --git "a/prac/\345\256\236\346\210\2302.md" "b/prac/\345\256\236\346\210\2302.md"
index cac8376..d421293 100644
--- "a/prac/\345\256\236\346\210\2302.md"
+++ "b/prac/\345\256\236\346\210\2302.md"
@@ -1,3 +1,13 @@
+## 关于我
+
+- 个人网站
+
+ https://light-city.club
+
+- 个人微信公众号
+
+
+
> 查询平均成绩大于等于 60 分的同学的学生编号和学生姓名和平均成绩
```mysql
diff --git "a/prac/\345\256\236\346\210\2303.md" "b/prac/\345\256\236\346\210\2303.md"
index 102a67b..7d3f5d5 100644
--- "a/prac/\345\256\236\346\210\2303.md"
+++ "b/prac/\345\256\236\346\210\2303.md"
@@ -1,3 +1,13 @@
+## 关于我
+
+- 个人网站
+
+ https://light-city.club
+
+- 个人微信公众号
+
+
+
## 1.生成组内连续但不唯一的数字。类似Oracle的DENSE_RANK()函数。
> 按各科成绩进行排序,并显示排名, Score 重复时**合并名次空缺**
diff --git "a/prac/\345\256\236\346\210\2304.md" "b/prac/\345\256\236\346\210\2304.md"
index b483ddb..7c4872a 100644
--- "a/prac/\345\256\236\346\210\2304.md"
+++ "b/prac/\345\256\236\346\210\2304.md"
@@ -1,3 +1,13 @@
+## 关于我
+
+- 个人网站
+
+ https://light-city.club
+
+- 个人微信公众号
+
+
+
> 按平均成绩从高到低显示所有学生的所有课程的成绩以及平均成绩
考虑两点:
From a0dac5f25cf5ad0af367e3d385fed5cf6d415d00 Mon Sep 17 00:00:00 2001
From: light-city <455954986@qq.com>
Date: Wed, 26 Jun 2019 23:31:40 +0800
Subject: [PATCH 4/7] update dir
---
img/dataset.png | Bin 0 -> 102213 bytes
img/ra.png | Bin 0 -> 93248 bytes
img/sql.png | Bin 0 -> 99162 bytes
img/use.png | Bin 0 -> 124358 bytes
prac/README.md | 2 +
"prac/\345\256\236\346\210\2305.md" | 139 ++++++++++++++++++++++++++++
6 files changed, 141 insertions(+)
create mode 100644 img/dataset.png
create mode 100644 img/ra.png
create mode 100644 img/sql.png
create mode 100644 img/use.png
create mode 100644 "prac/\345\256\236\346\210\2305.md"
diff --git a/img/dataset.png b/img/dataset.png
new file mode 100644
index 0000000000000000000000000000000000000000..594b69a58e76cccaf9cb82cfa72b237adbd86335
GIT binary patch
literal 102213
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