测试表:web
DROP TABLE IF EXISTS `boys`;
CREATE TABLE `boys` ( `id` int(11) NOT NULL AUTO_INCREMENT, `boyName` varchar(20) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;
INSERT INTO `boys` VALUES ('1', '张无忌');
INSERT INTO `boys` VALUES ('2', '令狐冲');
INSERT INTO `boys` VALUES ('3', '郭靖');
INSERT INTO `boys` VALUES ('4', '杨过');
INSERT INTO `boys` VALUES ('5', '宋青书');
DROP TABLE IF EXISTS `girls`;
CREATE TABLE `girls` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(50) NOT NULL, `boyfriend_id` int(11) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8;
INSERT INTO `girls` VALUES ('1', '小龙女', '4');
INSERT INTO `girls` VALUES ('2', '赵敏', '1');
INSERT INTO `girls` VALUES ('3', '东方不败', '2');
INSERT INTO `girls` VALUES ('4', '黄蓉', '3');
INSERT INTO `girls` VALUES ('5', '郭襄', '100');
girls
表中的数据:
boys
表中的数据:
sql
为了方便你们测试将表结构与表中的数据都在上面贴了出来,直接拷贝到数据库执行便可。全部的测试都经过上面 2 张表完成,大于 2 张表时原理是同样的。数据库
等值链接:查询的结果是 2 张表或多张表中“同时知足”条件的数据svg
主要语法:... INNER JOIN ... ON ...
测试
示意图:
spa
案例:查询有男友的女生的名字与其对应的男友的名字3d
SQL 语句(同 WHERE
):code
SELECT g. name, b.boyName FROM girls g INNER JOIN boys b ON g.boyfriend_id = b.id;
查询结果:
xml
左外链接:也称为左链接,查询的结果是 2 张表“同时知足”条件的数据与左侧表中不符合条件的数据的结合blog
主要语法:... LEFT OUTER JOIN ... ON ...
示意图:
案例 1:查询有男友的女生的名字与对应的男友的名字,并查询没有男友的女生的名字
SQL 语句(OUTER
能够省略):
SELECT g. name, b.boyName FROM girls g LEFT OUTER JOIN boys b ON g.boyfriend_id = b.id;
查询结果:
案例二:查询没有男友的女生的名字
SQL 语句:
SELECT g. name FROM girls g LEFT JOIN boys b ON g.boyfriend_id = b.id WHERE b.id IS NULL;
查询结果:
右外链接:也称为右链接,查询的结果是 2 张表“同时知足”条件的数据与右侧表中不符合条件的数据的结合
主要语法:... RIGHT OUTER JOIN ... ON ...
示意图:
案例 1:查询有男友的女生的名字与对应的男友的名字,并查询没有女友的男生的名字
SQL 语句:
SELECT g. name, B.boyName FROM girls g RIGHT JOIN boys b ON g.boyfriend_id = b.id;
查询结果:
案例 2:查询没有女友的男生的名字,这个的答案就不贴出来了,有兴趣的能够本身尝试一下
全外链接:查询的结果是 2 张表“同时知足”条件的数据与左侧表和右侧表中不符合条件的数据的结合
主要语法:... FULL JOIN ... ON ...
示意图:
案例 1:查询有男友的女生的名字与对应的男友的名字,并查询没有男友的女生的名字与没有女友的男生的名字
SQL 语句:
SELECT g. name, B.boyName FROM girls g FULL JOIN boys b ON g.boyfriend_id = b.id
注:MySql 并不支持全外链接,全部上面的语句在执行的时候会报错,可是在 Oracle 数据库中是支持的。关于这个案例,咱们可使用联合查询的方式来实现,会在下面讲述。
联合查询:就是把多个查询语句的查询结果结合在一块儿
主要语法1:... UNION ...
主要语法2:... UNION ALL ...
案例 1:查询全部女生的名字与男生的名字
SQL 语句:
SELECT name FROM girls UNION SELECT boyName FROM boys;
查询结果:
案例 2:实现上面的全外链接
SQL 语句:
SELECT g. name, b.boyName FROM girls g LEFT JOIN boys b ON g.boyfriend_id = b.id UNION SELECT g. name, B.boyName FROM girls g RIGHT JOIN boys b ON g.boyfriend_id = b.id;
查询结果:
在实现全外链接的时候咱们使用了左外链接与右外链接相结合,而且在数据结合的时候把重复的数据去除了。
案例 3:查询单身男女的姓名,这个就留给你们本身作吧
UNION
与 UNION ALL
的区别:联合查询支持UNION
与 UNION ALL
两种用法,其中UNION
会把多个查询语句的结果合并后去重,UNION ALL
会把全部的查询结果合并,包括重复的数据。