数据库-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 | 邮政卡 | ±-----±-----±-------±-----±-------+