版权声明:署名,允许他人基于本文进行创作,且必须基于与原先许可协议相同的许可协议分发本文 (Creative Commons)
SQL JOINS
JOIN
-
交叉连接:CROSS JOIN
笛卡尔乘积
-
内连接:INNER JOIN
等值连接:让表之间的字段以“等值”建立连接关系;
SELECT * FROM tbl_nameA INNER JOIN tbl_nameB ON col1_name=col2_name;
MariaDB [hellodb]> select * from students inner join teachers on students.teacherid=teachers.tid;
+-------+-------------+-----+--------+---------+-----------+-----+---------------+-----+--------+
| StuID | Name | Age | Gender | ClassID | TeacherID | TID | Name | Age | Gender |
+-------+-------------+-----+--------+---------+-----------+-----+---------------+-----+--------+
| 5 | Yu Yutong | 26 | M | 3 | 1 | 1 | Song Jiang | 45 | M |
| 1 | Shi Zhongyu | 22 | M | 2 | 3 | 3 | Miejue Shitai | 77 | F |
| 4 | Ding Dian | 32 | M | 4 | 4 | 4 | Lin Chaoying | 93 | F |
+-------+-------------+-----+--------+---------+-----------+-----+---------------+-----+--------+
MariaDB [hellodb]> select s.stuid,s.name,s.age,s.teacherid,t.name,t.gender
> from students as s inner join teachers as t
> on s.teacherid=t.tid;
+-------+-------------+-----+-----------+---------------+--------+
| stuid | name | age | teacherid | name | gender |
+-------+-------------+-----+-----------+---------------+--------+
| 5 | Yu Yutong | 26 | 1 | Song Jiang | M |
| 1 | Shi Zhongyu | 22 | 3 | Miejue Shitai | F |
| 4 | Ding Dian | 32 | 4 | Lin Chaoying | F |
+-------+-------------+-----+-----------+---------------+--------+
- 左外连接:LEFT JOIN
格式
FROM tb1 LEFT JOIN tb2 ON tb1.col=tb2.col
MariaDB [hellodb]> select s.stuid,s.name,s.age,s.teacherid,t.name,t.gender
> from students as s left join teachers as t
> on s.teacherid=t.tid ;
+-------+---------------+-----+-----------+---------------+--------+
| stuid | name | age | teacherid | name | gender |
+-------+---------------+-----+-----------+---------------+--------+
| 1 | Shi Zhongyu | 22 | 3 | Miejue Shitai | F |
| 2 | Shi Potian | 22 | 7 | NULL | NULL |
| 3 | Xie Yanke | 53 | 16 | NULL | NULL |
| 4 | Ding Dian | 32 | 4 | Lin Chaoying | F |
| 5 | Yu Yutong | 26 | 1 | Song Jiang | M |
| 6 | Shi Qing | 46 | NULL | NULL | NULL |
| 7 | Xi Ren | 19 | NULL | NULL | NULL |
| 8 | Lin Daiyu | 17 | NULL | NULL | NULL |
| 9 | Ren Yingying | 20 | NULL | NULL | NULL |
| 10 | Yue Lingshan | 19 | NULL | NULL | NULL |
| 11 | Yuan Chengzhi | 23 | NULL | NULL | NULL |
| 12 | Wen Qingqing | 19 | NULL | NULL | NULL |
| 13 | Tian Boguang | 33 | NULL | NULL | NULL |
| 14 | Lu Wushuang | 17 | NULL | NULL | NULL |
| 15 | Duan Yu | 19 | NULL | NULL | NULL |
| 16 | Xu Zhu | 21 | NULL | NULL | NULL |
| 17 | Lin Chong | 25 | NULL | NULL | NULL |
| 18 | Hua Rong | 23 | NULL | NULL | NULL |
| 19 | Xue Baochai | 18 | NULL | NULL | NULL |
| 20 | Diao Chan | 19 | NULL | NULL | NULL |
| 21 | Huang Yueying | 22 | NULL | NULL | NULL |
| 22 | Xiao Qiao | 20 | NULL | NULL | NULL |
| 23 | Ma Chao | 23 | NULL | NULL | NULL |
| 24 | Xu Xian | 27 | NULL | NULL | NULL |
| 25 | Sun Dasheng | 100 | NULL | NULL | NULL |
+-------+---------------+-----+-----------+---------------+--------+
MariaDB [hellodb]> select s.stuid,s.name,s.age,s.teacherid,t.name,t.gender
> from students as s
> left join teachers as t on s.teacherid=t.tid
> where teacherid is not null;
+-------+-------------+-----+-----------+---------------+--------+
| stuid | name | age | teacherid | name | gender |
+-------+-------------+-----+-----------+---------------+--------+
| 1 | Shi Zhongyu | 22 | 3 | Miejue Shitai | F |
| 2 | Shi Potian | 22 | 7 | NULL | NULL |
| 3 | Xie Yanke | 53 | 16 | NULL | NULL |
| 4 | Ding Dian | 32 | 4 | Lin Chaoying | F |
| 5 | Yu Yutong | 26 | 1 | Song Jiang | M |
+-------+-------------+-----+-----------+---------------+--------+
- 右外连接: RIGHT JOIN
select s.stuid,s.name,s.classid from students as s right join scores as c on s.stuid=c.stuid;
select s.stuid,s.name,s.classid from students as s right join scores as c on s.stuid=c.stuid where s.stuid is not null;
- 完全外连接:FULL JOIN
select * from students left outer join teachers on students.teacherid=teachers.tid union select * from students right outer join teachers on students.teacherid=teachers.tid;
+-------+---------------+------+--------+---------+-----------+------+---------------+------+--------+
| StuID | Name | Age | Gender | ClassID | TeacherID | TID | Name | Age | Gender |
+-------+---------------+------+--------+---------+-----------+------+---------------+------+--------+
| 1 | Shi Zhongyu | 22 | M | 2 | 3 | 3 | Miejue Shitai | 77 | F |
| 2 | Shi Potian | 22 | M | 1 | 7 | NULL | NULL | NULL | NULL |
| 3 | Xie Yanke | 53 | M | 2 | 16 | NULL | NULL | NULL | NULL |
| 4 | Ding Dian | 32 | M | 4 | 4 | 4 | Lin Chaoying | 93 | F |
| 5 | Yu Yutong | 26 | M | 3 | 1 | 1 | Song Jiang | 45 | M |
| 6 | Shi Qing | 46 | M | 5 | NULL | NULL | NULL | NULL | NULL |
| 7 | Xi Ren | 19 | F | 3 | NULL | NULL | NULL | NULL | NULL |
| 8 | Lin Daiyu | 17 | F | 7 | NULL | NULL | NULL | NULL | NULL |
| 9 | Ren Yingying | 20 | F | 6 | NULL | NULL | NULL | NULL | NULL |
| 10 | Yue Lingshan | 19 | F | 3 | NULL | NULL | NULL | NULL | NULL |
| 11 | Yuan Chengzhi | 23 | M | 6 | NULL | NULL | NULL | NULL | NULL |
| 12 | Wen Qingqing | 19 | F | 1 | NULL | NULL | NULL | NULL | NULL |
| 13 | Tian Boguang | 33 | M | 2 | NULL | NULL | NULL | NULL | NULL |
| 14 | Lu Wushuang | 17 | F | 3 | NULL | NULL | NULL | NULL | NULL |
| 15 | Duan Yu | 19 | M | 4 | NULL | NULL | NULL | NULL | NULL |
| 16 | Xu Zhu | 21 | M | 1 | NULL | NULL | NULL | NULL | NULL |
| 17 | Lin Chong | 25 | M | 4 | NULL | NULL | NULL | NULL | NULL |
| 18 | Hua Rong | 23 | M | 7 | NULL | NULL | NULL | NULL | NULL |
| 19 | Xue Baochai | 18 | F | 6 | NULL | NULL | NULL | NULL | NULL |
| 20 | Diao Chan | 19 | F | 7 | NULL | NULL | NULL | NULL | NULL |
| 21 | Huang Yueying | 22 | F | 6 | NULL | NULL | NULL | NULL | NULL |
| 22 | Xiao Qiao | 20 | F | 1 | NULL | NULL | NULL | NULL | NULL |
| 23 | Ma Chao | 23 | M | 4 | NULL | NULL | NULL | NULL | NULL |
| 24 | Xu Xian | 27 | M | NULL | NULL | NULL | NULL | NULL | NULL |
| 25 | Sun Dasheng | 100 | M | NULL | NULL | NULL | NULL | NULL | NULL |
| NULL | NULL | NULL | NULL | NULL | NULL | 2 | Zhang Sanfeng | 94 | M |
+-------+---------------+------+--------+---------+-----------+------+---------------+------+--------+
这里再详细说明下左右外连接:
现有表A
select s.name,s.classid from students as s;
这有表B
select * from scores;
2个表有共同点就是都有stuid,现在我们来左连接:
select s.stuid,s.name,s.classid from students as s left join scores as c on s.stuid=c.stuid;
左连接,所有左边的A表就保留,B表往上填充,A表没有的就为NULL,B表
如果是右连接,则B表往
则
总结:
左连接:ON不匹配的,左边要
右连接:ON不匹配的,右边要
外连接:匹不匹配,都要
- 自连接
MariaDB [hellodb]> select e.id,e.name,l.name from emp as e left join emp as l on e.leaderid=l.id;
+------+----------+----------+
| id | name | name |
+------+----------+----------+
| 2 | zhangsir | mage |
| 3 | wang | zhangsir |
| 4 | zhang | wang |
| 1 | mage | NULL |
+------+----------+----------+
- 三表查询
MariaDB [hellodb]> select s.name,o.course,c.score from students as s inner join scores as c on s.stuid=c.stuid inner join courses as o on c.courseid=o.course;
- 用于IN中的子查询:子查询应该单键查询并返回一个或多个值从构成列表
SELECT Name,Age FROM students WHERE Age IN (SELECT Age FROM teachers);
- 用于FROM子句中的子查询
使用格式:
SELECT tb_alias.col1,... FROM (SELECT clause) AS tb_alias WHERE Clause;
示例:
SELECT s.aage,s.ClassID
FROM (SELECT avg(Age) AS aage,ClassID FROM students WHERE ClassID IS NOT NULL GROUP BY ClassID) AS s
WHERE s.aage>30;
其它章节
MySQL数据库(一)_基础概念
MySQL数据库(二)_SQL基础与数据类型
MySQL数据库(三)_SQL语句之DDL
MySQL数据库(四)_SQL语句之DML
MySQL数据库(五)_SQL语句之DQL
MySQL数据库(六)_SQL语句之JOIN
MySQL数据库(七)_视图、函数、储存过程及触发器
MySQL数据库(八)_用户管理
MySQL数据库(九)_存储引擎
MySQL数据库(十)_服务器配置
MySQL数据库(十一)_查询缓存
MySQL数据库(十二)_索引
MySQL数据库(十三)_事务与锁