艾丽雅

导航

 

mysql 连接查询 join

 

本文用到的表

 cls表--班级表
 stu表--学生表
 score表--成绩等级表

 

1、连接查询简介

1)连接查询分为

    • 内连接查询 inner  join
    • 外连接查询  
    • 左连接查询  left  outer  join
    • 右连接查询  right  outer  join

其中iner/outer 可以省略,因为区分内外连接查询的不在于inner/outer,而是判断有无left/right,有就是外连接查询,没有则为内链接查询。

2)内连接查询与外连接查询的区别:假设A/B两张表做连接查询

①  A/B能够全部匹配的记录查询,内连接查询

②  除了将A/B全部匹配的查询出来之外,还将其中一张表的记录全部显示出来,对方表没有记录则用null值表示

③  外连接查询结果数  >=  内连接查询结果数

④  任何一个左连接都可以写成右连接,任何一个右连接也都可以写成左连接

 

1、内连接查询

复制代码
select 
    xxx
from
    A表
inner join
    B表
on
    连接条件
where
    查询条件;
复制代码

1)查询每个学生的姓名与班级,要求显示:学生姓名  班级名 两列

复制代码
mysql> select s.name, c.name from stu as s inner join cls as c on s.cls_id=c.cls_id;
+-----------+-----------+
| name      | name      |
+-----------+-----------+
| zhangsan  | 火箭班    |
| lisi      | 提高班    |
| wangwu    | 速成班    |
| zhaoliu   | 提高班    |
| guojing   | 速成班    |
| huangrong | 提高班    |
| xiaolongn | 火箭班    |
+-----------+-----------+
7 rows in set (0.00 sec)
复制代码

 

2、外连接查询

复制代码
select 
    xxx
from
    A表
left join
    B表
on
    连接条件
where
    查询条件;
复制代码

1)left join,左连接查询,除了匹配结果外,还将左边表未能匹配上的值显示,这里全都匹配,看不到效果

复制代码
mysql> select s.name, c.name from stu as s left join cls as c on s.cls_id=c.cls_id;
+-----------+-----------+
| name      | name      |
+-----------+-----------+
| zhangsan  | 火箭班    |
| xiaolongn | 火箭班    |
| wangwu    | 速成班    |
| guojing   | 速成班    |
| lisi      | 提高班    |
| zhaoliu   | 提高班    |
| huangrong | 提高班    |
+-----------+-----------+
复制代码

2)right join,右连接查询,除了匹配结果外,还将右边表未能匹配上的值显示,如最后一行

复制代码
mysql> select s.name, c.name from stu as s right join cls as c on s.cls_id=c.cls_id;
+-----------+-----------+
| name      | name      |
+-----------+-----------+
| zhangsan  | 火箭班    |
| lisi      | 提高班    |
| wangwu    | 速成班    |
| zhaoliu   | 提高班    |
| guojing   | 速成班    |
| huangrong | 提高班    |
| xiaolongn | 火箭班    |
| NULL      | 补习班    |
+-----------+-----------+
复制代码

3)right join <-->  left join 之间的相互转换,将left/right互换,A/B表位置互换即可。

复制代码
mysql> select s.name, c.name from cls as c left join stu as s on s.cls_id=c.cls_id;
+-----------+-----------+
| name      | name      |
+-----------+-----------+
| zhangsan  | 火箭班    |
| lisi      | 提高班    |
| wangwu    | 速成班    |
| zhaoliu   | 提高班    |
| guojing   | 速成班    |
| huangrong | 提高班    |
| xiaolongn | 火箭班    |
| NULL      | 补习班    |
+-----------+-----------+
复制代码

 

3、三张表以上的连接查询

复制代码
select 
    xxx
from
    A表
inner join
    B表
on
    连接条件
inner join
    C表
on
    连接条件
where
    查询条件;
复制代码

 

这里A-B表先连接查询,然后A-C表再连接查询

1)查询显示结果。“学生姓名,班级名,成绩等级”,学生姓名,班级名,成绩等级在不同的表中

复制代码
select 
    s.name, c.name, sc.grade
from
    stu as s
inner join 
    cls as c
on
    s.cls_id=c.cls_id
inner join
    score as sc
on 
    s.score between sc.min_sc and max_sc;
复制代码

 

复制代码
+-----------+-----------+--------+
| name      | name      | grade  |
+-----------+-----------+--------+
| zhangsan  | 火箭班    | 及格   |
| lisi      | 提高班    | 中     |
| wangwu    | 速成班    | 中     |
| zhaoliu   | 提高班    | 优     |
| guojing   | 速成班    | 及格   |
| huangrong | 提高班    | 良     |
| xiaolongn | 火箭班    | 差     |
+-----------+-----------+--------+
复制代码

 

posted on 2021-10-21 17:07  艾丽雅  阅读(92)  评论(0)    收藏  举报