理解 MySQL 中的 JOIN 与 UNION
起步
最近公司接到一个项目,任务是根据需求制表。完整过程是:用 SQL 汇总数据,再写进 Execel 文件中。SQL 这门课倒是大学里学过,过久不用,不记得许多,顶多 SELECT 几下。总之是勉强应付。
这周五接到一个需求,差点应付不过去,卡在联表操作上了。午觉再不敢睡,总结 MySQL 查询时的多表联合。临阵磨枪管用,当测试发来 “OK” 的时候我这样想。
笔记至此,遗忘再寻。
开始前的准备
(student.sql 与 score.sql 下载链接)
现在套用一个俗套的现实场景:中学生期末考试。
有学生,那么这里会有一个 student 表,用来存放学生信息。表结构如下:
+--------+--------------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+--------------------------+------+-----+---------+-------+
| name | varchar(10) | NO | | NULL | |
| age | int(2) unsigned zerofill | YES | | NULL | |
| gender | varchar(10) | YES | | NULL | |
| id | int(4) unsigned zerofill | NO | PRI | NULL | |
+--------+--------------------------+------+-----+---------+-------+
- name 是学生名字;
- age 表示学生年龄;
- gender 表示性别;
- id 是学生的学号。
由于多个学生的名字相同,所以用 id 作为唯一标识,也就是 student 表的主键。
还需要成绩,因此还会有一张 score 表,存放学生成绩。表结构如下:
+---------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| id | int(4) | NO | PRI | NULL | |
| math | int(2) | YES | | NULL | |
| english | int(2) | YES | | NULL | |
| chinese | int(2) | YES | | NULL