数据库-SQL的四种连接查询


title: 数据库-SQL的四种连接查询 date: 2021-11-21 20:42:28 tags:


数据库-SQL的四种连接查询

内连接

inner join 或者 join

把两个表的有关系的字段通过某一字段相等的方式查询出来

外连接

1.左连接 left join 或者 left outer join

2.右连接 right join 或者 right outer join

3.完全外连接 full join 或者 full outer join


创建两个表:

person表

id,name,cardId

card表

id,name


create database testJoin;

use testJoin;

create table person (id int, name varchar(20), cardId int);

create table card (id int, name varchar(20));

show tables; ±-------------------+ | Tables_in_testjoin | ±-------------------+ | card | | person | ±-------------------+

insert into card values(1, ‘饭卡’); insert into card values(2, ‘建行卡’); insert into card values(3, ‘农行卡’); insert into card values(4, ‘工商卡’); insert into card values(5, ‘邮政卡’);

insert into person values(1, ‘张三’, 1); insert into person values(2, ‘李四’, 3); insert into person values(3, ‘王五’, 6); select * from card; ±-----±-------+ | id | name | ±-----±-------+ | 1 | 饭卡 | | 2 | 建行卡 | | 3 | 农行卡 | | 4 | 工商卡 | | 5 | 邮政卡 | ±-----±-------+

select * from person; ±-----±-----±-------+ | id | name | cardId | ±-----±-----±-------+ | 1 | 张三 | 1 | | 2 | 李四 | 3 | | 3 | 王五 | 6 | ±-----±-----±-------+

–并没有创建外键

–inner join 查询(内连接)

通过on显示条件

select * from person inner join card on person.cardId = card.id;

或者

select * from person inner card on person.cardId = card.id;

±-----±-----±-------±-----±-------+ | id | name | cardId | id | name | ±-----±-----±-------±-----±-------+ | 1 | 张三 | 1 | 1 | 饭卡 | | 2 | 李四 | 3 | 3 | 农行卡 | ±-----±-----±-------±-----±-------+

–内联查询,其实就是两张表中的数据,通过某个字段相等,查询出相关记录数据。

–left join (左外连接)

select * from person left join card on person.cardId = card.id;

或者

select * from person left outer join card on person.cardId = card.id;

±-----±-----±-------±-----±-------+ | id | name | cardId | id | name | ±-----±-----±-------±-----±-------+ | 1 | 张三 | 1 | 1 | 饭卡 | | 2 | 李四 | 3 | 3 | 农行卡 | | 3 | 王五 | 6 | NULL | NULL | ±-----±-----±-------±-----±-------+

–左外连接,会把左边表里的所有数据取出来,而右边表中的数据,如果有相等的就显示出来,如果没有就会补NULL

–right join (右外连接)

select * from person right join card on person.cardId = card.id;

或者

select * from person right outer join card on person.cardId = card.id;

±-----±-----±-------±-----±-------+ | id | name | cardId | id | name | ±-----±-----±-------±-----±-------+ | 1 | 张三 | 1 | 1 | 饭卡 | | NULL | NULL | NULL | 2 | 建行卡 | | 2 | 李四 | 3 | 3 | 农行卡 | | NULL | NULL | NULL | 4 | 工商卡 | | NULL | NULL | NULL | 5 | 邮政卡 | ±-----±-----±-------±-----±-------+

–右外连接,会把右边表里的所有数据取出来,而左边表中的数据,如果有相等的就显示出来,如果没有就会补NULL

–full join(全外连接)MySQL不支持

select * from person full join card on person.cardId = card.id;

相当于

select * from person left join card on person.cardId = card.id union select * from person right join card on person.cardId = card.id;

这样就可以用了

±-----±-----±-------±-----±-------+ | id | name | cardId | id | name | ±-----±-----±-------±-----±-------+ | 1 | 张三 | 1 | 1 | 饭卡 | | 2 | 李四 | 3 | 3 | 农行卡 | | 3 | 王五 | 6 | NULL | NULL | | NULL | NULL | NULL | 2 | 建行卡 | | NULL | NULL | NULL | 4 | 工商卡 | | NULL | NULL | NULL | 5 | 邮政卡 | ±-----±-----±-------±-----±-------+

连接的好处:

不用创建外键,可以通过他们之间某个字段的相等来求他们直接各种集合之间的数据

经验分享 程序员 微信小程序 职场和发展