创建用于测试的表格并插入数据
-- 创建两张表格并分别插入数据
CREATE TABLE IF NOT EXISTS left_table
(
id INT auto_increment,
age INT,
NAME VARCHAR(20),
PRIMARY KEY(id)
)
ENGINE=INNODB DEFAULT CHARSET=utf8 auto_increment=1;
INSERT INTO left_table(`age`,`NAME`)
VALUES(25,'小明');
INSERT INTO left_table(`age`,`NAME`)
VALUES(15,'小红');
INSERT INTO left_table(`age`,`NAME`)
VALUES(35,'小吕');
INSERT INTO left_table(`age`,`NAME`)
VALUES(45,'大绿');
CREATE TABLE IF NOT EXISTS right_table
(
id INT PRIMARY KEY auto_increment,
age INT,
name VARCHAR(20)
)
ENGINE=INNODB default charset=utf8 auto_increment=1;
INSERT INTO right_table(`age`,`NAME`)
VALUES(29,'高兴');
INSERT INTO right_table(`age`,`NAME`)
VALUES(25,'快乐');
INSERT INTO right_table(`age`,`NAME`)
VALUES(39,'开心');
INSERT INTO right_table(`age`,`NAME`)
VALUES(45,'喜悦');
左连接(左外连接)
左连接也叫左外连接
语法如下
SELECT L.*,R.*
FROM LEFT_TABLE L
(WHERE ...)
LEFT (OUTER) JOIN
RIGHT_TABLE R
(WHERE ...)
ON ...
对示例量表进行操作
SELECT L.*,r.*
FROM left_table L
LEFT OUTER JOIN
right_table r
on L.age=r.age;
结果
可知:
- 左连接以左边的表格为基准
- 当右边的表格满足on条件时,加入;不满足的补空值null。
右连接(右外连接)
语法如下
SELECT L.*,R.*
FROM LEFT_TABLE L
(WHERE ...)
RIGHT (OUTER) JOIN
RIGHT_TABLE R
(WHERE ...)
ON ...
示例
SELECT L.*,r.*
FROM left_table L
RIGHT JOIN
right_table r
on L.age=r.age;
结果
- 右连接以右边的表格为基准
- 当左边的表格满足on条件时,加入;不满足的补空值null。
内连接
语法如下
SELECT L.*,R.*
FROM LEFT_TABLE L
(WHERE ...)
[INNER] JOIN
RIGHT_TABLE R
(WHERE ...)
ON ...
示例
SELECT L.*,r.*
FROM left_table L
JOIN
right_table r
on L.age=r.age;
结果
- 去两者相同的结果
从结果看来和 where 语句完全一样
SELECT L.*,r.*
FROM left_table L ,right_table r
WHERE L.age=r.age;
MySQL没有全连接
如果想要实现全连接的功能,可采用
左连接 union 右连接
此处是union,关于union与union all的区别,参考:http://blog.csdn.net/qq_36743482/article/details/75021848
SELECT L.*,r.*
FROM left_table L
left JOIN
right_table r
on L.age=r.age
UNION
SELECT L.*,r.*
FROM left_table L
RIGHT JOIN
right_table r
on L.age=r.age