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