create table t_blog(
id int AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(50),
typeid int
);
DROP TABLE t_blog;
INSERT INTO t_blog(title,typeid) VALUES("aaa",1);
INSERT INTO t_blog(title,typeid) VALUES("bbb",2);
INSERT INTO t_blog(title,typeid) VALUES("ccc",3);
INSERT INTO t_blog(title,typeid) VALUES("ddd",4);
INSERT INTO t_blog(title,typeid) VALUES("eee",4);
INSERT INTO t_blog(title,typeid) VALUES("fff",3);
INSERT INTO t_blog(title,typeid) VALUES("ggg",2);
INSERT INTO t_blog(title,typeid) VALUES("hhh",NULL);
INSERT INTO t_blog(title,typeid) VALUES("iii",NULL);
INSERT INTO t_blog(title,typeid) VALUES("jjj",NULL);
SELECT * FROM t_blog;
create table t_type(
id int auto_increment PRIMARY KEY,
name varchar(20)
);
insert into t_type(name)values("C++");
insert into t_type(name)values("C");
insert into t_type(name)values("java");
insert into t_type(name)values("C#");
insert into t_type(name)values("Javascript");
select * from t_type;
笛卡尔积
select * from t_blog cross join t_type;#不允许跟on条件
select * from t_blog inner join t_type;#等同于join,join是inner join的省略写法
select *from t_blog,t_type;
意这两个是笛卡尔积,不是自然连接
select * from t_blog NATURE join t_type;
select * from t_blog NATURA join t_type;
内连接。两个表的在特定条件下的交集。
#inner join or join 在没有on的时候,等同于cross join。
select * from t_blog inner join t_type on t_blog.typeid = t_type.id;
select * from t_blog join t_type on t_blog.typeid = t_type.id;
select * from t_blog ,t_type where t_blog.typeid = t_type.id;
这个时候要略微介绍下驱动表的概念,mysql中指定了连接条件时,满足查询条件的记录行数少的表为驱动表;如未指定查询条件,则扫描行数少的为驱动表。mysql优化器就是这么粗暴以小表驱动大表的方式来决定执行顺序的。
SELECT * FROM t_blog STRAIGHT_JOIN t_type ON t_blog.typeId=t_type.id;
-- 左连接:返回两表的交集,以及左表剩余的部分。
select * from t_blog left join t_type on t_blog.typeid = t_type.id;
-- 左连接:返回两表的交集,以及右表剩余的部分。
select * from t_blog RIGHT JOIN t_type on t_blog.typeid = t_type.id;
-- 外连接:两表的交集,以及左右表剩余的部分。
select * from t_blog OUTER JOIN t_type on t_blog.typeid = t_type.id;
#但是可以通过union实现。
select * from t_blog left join t_type on t_blog.typeid = t_type.id
union
select * from t_blog right join t_type on t_blog.typeid = t_type.id
#,USING的功能相当于ON,区别在于USING指定一个属性名用于连接两个表,而ON指定一个条件。
select * from t_blog inner join t_type using(id);
#自然连接是在两张表中寻找那些数据类型和列名都相同的字段,然后自动地将他们连接起来,并返回所有符合条件按的结果。有左自然连接,右自然连接和普通自然连接之分。
select * from t_blog NATURAL join t_type;
select * from t_blog NATURAL left join t_type;
select * from t_blog NATURAL RIGHT JOIN t_type;
参考:https://www.cnblogs.com/fudashi/p/7491039.html