参考链接出处:https://www.cnblogs.com/yuzhanhong/p/9286910.html
a,b两张表结构:
2--外连接:
left join 或者left outer join(等同于left join)
左外连接:
SELECT a.*,b.* FROM a LEFT JOIN b ON a.`id`=b.`id`;
等同于:SELECT a.*,b.* FROM a LEFT OUTER JOIN b ON a.`id`=b.`id`;
b中更不存在的记录填充Null:
(2)[left join 或者left outer join(等同于left join)] + [where B.column is null]
SELECT a.`id` aid,a.`age`,b.`id` bid,b.`name` FROM a LEFT JOIN b ON a.`id`=b.`id` WHERE b.`id` IS NULL;
(3) right join 或者fight outer join(等同于right join)
SELECT a.`id` aid,a.`age`,b.`id` bid,b.`name` FROM a RIGHT JOIN b ON a.`id`=b.`id`;
(4)[left join 或者left outer join(等同于left join)] + [where A.column is null]
SELECT a.`id` aid,a.`age`,b.`id` bid,b.`name` FROM a RIGHT JOIN b ON a.`id`=b.`id` WHERE a.`id` IS NULL;
(5)full join (mysql不支持,但是可以用 left join union right join代替)
:这种场景下得到的是满足某一条件的公共记录,和独有的记录
SELECT a.`id` aid,a.`age`,b.`id` bid,b.`name` FROM a LEFT JOIN b ON a.`id`=b.`id` UNION
SELECT a.`id` aid,a.`age`,b.`id` bid,b.`name` FROM a RIGHT JOIN b ON a.`id`=b.`id`
(6) full join + is null(mysql不支持,但是可以用 (left join + is null) union (right join+isnull代替)
:这种场景下得到的是A,B中不满足某一条件的记录之和
SELECT a.`id` aid ,a.`age`,b.`id` bid,b.`name` FROM a
LEFT JOIN b
ON a.`id`=b.`id`
WHERE b.`id` IS NULL
UNION
SELECT a.`id` aid,a.`age`,b.`id` bid,b.`name` FROM a
RIGHT JOIN b
ON a.`id`=b.`id`
WHERE a.`id` IS NULL
3---交叉连接:(cross join)
:实际应用中还有这样一种情形,想得到A,B记录的排列组合,即笛卡儿积,这个就不好用集合和元素来表示了。需要用到cross join:
SELECT a.`id` aid,a.`age`,b.`id` bid,b.`name` FROM a
CROSS JOIN b
3.1还可以为cross join指定条件 (where):
SELECT a.`id` aid,a.`age`,b.`id` bid,b.`name` FROM a
CROSS JOIN b
WHERE a.`id`=b.`id`
3.2创建表,创建外键约束的表:
01.new表:
CREATE TABLE news(
id INT UNSIGNED AUTO_INCREMENT KEY,
title VARCHAR(100) NOT NULL UNIQUE,
content VARCHAR(100) NOT NULL,
cate_id TINYINT UNSIGNED NOT NULL,
FOREIGN KEY(cate_id) REFERENCES news_cate(id)
);
02:新闻分类表:
创建新闻分类表:news_cate
CREATE TABLE news_cate(
id TINYINT UNSIGNED AUTO_INCREMENT KEY,
cate_name VARCHAR(50) NOT NULL UNIQUE,
cate_desc VARCHAR(100) NOT NULL DEFAULT ' '
);
所谓的脏数据,此时我们就要用外键,来保持数据的一致性和完整性.此时news表中的id和news_cate中的id进行了约束绑定,所以在进行news表中的数据插入时,同时要考虑到news_cate中标中的id存在不存在的情况:
不能插入非法数据了: