MySQL数据库(六)_SQL语句之JOIN

知识共享许可协议 版权声明:署名,允许他人基于本文进行创作,且必须基于与原先许可协议相同的许可协议分发本文 (Creative Commons

本章内容

SQL JOINS

在这里插入图片描述

JOIN

  1. 交叉连接:CROSS JOIN
    笛卡尔乘积
    在这里插入图片描述

  2. 内连接: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      |
+-------+-------------+-----+-----------+---------------+--------+

  1. 左外连接: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      |
+-------+-------------+-----+-----------+---------------+--------+
  1. 右外连接: 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;
  1. 完全外连接: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不匹配的,右边要
外连接:匹不匹配,都要

  1. 自连接
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     |
+------+----------+----------+
  1. 三表查询
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;
  1. 用于IN中的子查询:子查询应该单键查询并返回一个或多个值从构成列表
SELECT Name,Age FROM students WHERE Age IN (SELECT Age FROM teachers);
  1. 用于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数据库(十三)_事务与锁

猜你喜欢

转载自blog.csdn.net/weixin_42758707/article/details/95064767