简单回顾并总结下不一样的表链接语句有什么异同之处以及一些概念。sql
建库语句以下函数
1 DROP DATABASE IF EXISTS `demo`; 2 CREATE DATABASE `demo`; 3 USE `demo`; 4 /*部门表*/ 5 CREATE TABLE department ( 6 `id` INT PRIMARY KEY AUTO_INCREMENT, 7 `name` VARCHAR(50) 8 ); 9 INSERT INTO department VALUES(DEFAULT, '财务'),(DEFAULT, '客服'),(DEFAULT, '技术'); 10 /*雇员表*/ 11 CREATE TABLE employee ( 12 `id` INT PRIMARY KEY AUTO_INCREMENT, 13 `name` VARCHAR(50), 14 `department_id` INT, 15 CONSTRAINT fk_employee_department FOREIGN KEY (id) REFERENCES department(id) 16 ); 17 INSERT INTO employee VALUES(DEFAULT, '张三', 1),(DEFAULT, '李四', 2),(DEFAULT, '王五', 2);
由上代码可知,分别建立了部门表和雇员表,雇员表和部门表是多对一的关系,技术部没有雇员。spa
语法:inner join ... on ... inner能够省略。code
概念:内链接查询的结果是从两个或两个以上的表的组合中挑选出符合链接条件的数据,若是数据没法知足链接条件则将其忽略。在内链接查询中,参与链接的表的地位是平等的。blog
例:如今要查询员工和其所在的部门,sql语句以下class
1 SELECT e.id, e.`name`, d.`name` '部门' FROM employee e JOIN department d ON e.`department_id`=d.`id`
结果以下:sql语句
能够看出,部门一列只是将有员工的部门查询了出来,而没有员工的技术部则没有查询出来。语法
概念:上文提到:在内链接查询中,参与链接的表的地位是平等的。而在外链接中参与链接的表有主从之分。以主表的每行数据匹配从表的数据列,将符合链接条件的数据直接返回到结果集中;对那些不符合链接条件的列,将被填上空值后再返回到结果集中。im
语法:left outer join ... on ... outer能够省略。技术
概念:左外链接查询的结果集包括左表中的全部行,而不单单是链接匹配的行。若左表的某行在右表中没有匹配行,则在相关联的结果集中右表的全部选择列均为空值。
例一:将上面内链接的语句改为左外链接
SELECT e.id, e.`name`, d.`name` '部门' FROM department d LEFT JOIN employee e ON e.`department_id`=d.`id`
查询结果以下图
能够看出,没有员工的部门也被查询了出来,而且员工的id和姓名列被填上了空值。
例二:查询全部部门包含的员工数,没有员工的部门也要被查询出来。sql语句以下
1 SELECT d.`name`,COUNT(e.`id`) '部门人数' FROM department d LEFT JOIN employee e ON e.`department_id`=d.`id` GROUP BY e.`department_id`
结果以下
能够看出,没有员工的技术部也被查询了出来,统计人数为0(ps:这个0和以前自动填充的null值不冲突,由于这里使用了聚合函数count(),结果集先填充了null,再进行count统计的)。
语法:right outer join ... on ... outer能够省略。
概念:右外链接和左外链接相似,只是位置变了一下。结果集必须包含右表中的全部行,若右表中有的项在左表中没有,则以null值填充。
例一:将上面左外链接的语句改为右外链接,sql语句以下
1 SELECT d.`name`,COUNT(e.`id`) '部门人数' FROM employee e RIGHT JOIN department d ON e.`department_id`=d.`id` GROUP BY e.`department_id`
结果以下