mysql 连接查询 join

本文用到的表

CREATE TABLE `cls` (
  `cls_id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(30) NOT NULL,
  PRIMARY KEY (`cls_id`)
)
cls表--班级表
CREATE TABLE `stu` (
  `stu_id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(30) NOT NULL,
  `age` smallint(6) DEFAULT NULL,
  `cls_id` int(11) DEFAULT NULL,
  `score` tinyint(4) DEFAULT NULL,
  PRIMARY KEY (`stu_id`),
  KEY `fk_stu_cls` (`cls_id`),
  CONSTRAINT `fk_stu_cls` FOREIGN KEY (`cls_id`) REFERENCES `cls` (`cls_id`)
)
stu表--学生表
CREATE TABLE `score` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `grade` varchar(10) DEFAULT NULL,
  `min_sc` tinyint(4) DEFAULT NULL,
  `max_sc` tinyint(4) DEFAULT NULL,
  PRIMARY KEY (`id`)
) 
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 @ 2018-10-22 10:23  nonzero  阅读(5779)  评论(0编辑  收藏  举报