表的连接分为内连和外连。
内连接实际上就是利用where子句对两种表形成的笛卡儿积进行筛选,我们前面学习的查询都是内连接,也是在开发过程中使用的最多的连接查询。而使用where进行笛卡尔积筛选的时候,后面必须跟着一个过滤条件,将不合理的数据筛选掉,并且这时候再跟着其他条件就需要and其他条件,所以这种方式的内连接虽然可以,但是容易将内连接的条件与其他约束条件混淆,不容易区分。
于是,为了能够特殊标注其是内连接,就采用了如下语句:
select 字段 from 表1 inner join 表2 on 连接条件 and 其他条件;
案例:显示SMITH的名字和部门名称
这时,我们可以用多表查询,并笛卡尔积方式连接,并进行筛选:
采用内连接的方式:
采用内连接的方式,就可以很好的将内连接的条件与其他条件进行区分。
外连接分为左外连接和右外连接
如果联合查询,左侧的表完全显示我们就说是左外连接。即有可能出现这样的情况:学生表里有四个人,但成绩表中只有三个成绩,这种情况还是常见的,因为存在着部分学生没有考试的情况,但是此时我们仍想将已知的信息显示出来,那么在连接时就会出现空值的情况。
即将学生表放在左侧,成绩表放在右侧,此时左侧的表完全显示,右侧的表由于缺少对应的一条信息,其内部的值为空。语法与内连接的区别就是将inner替换成了left。
select 字段名 from 表名1 left join 表名2 on 连接条件
案例:
-- 建两张表
create table stu (id int, name varchar(30)); -- 学生表
insert into stu values(1,'jack'),(2,'tom'),(3,'kity'),(4,'nono');
create table exam (id int, grade int); -- 成绩表
insert into exam values(1, 56),(2,76),(11, 8);
由于其中一个id无法匹配,所以该学生没有对应的成绩。如果将stu与exam的位置反过来,则会显示exam的全部信息,然后将stu能匹配上的属于与exam进行匹配。
如果联合查询,右侧的表完全显示我们就说是右外连接。这与左外连接的规则是一样的,只不过主导的表变成了右侧。
select 字段名 from 表名1 right join 表名2 on 连接条件
实际上,只有一个左外连接已经够了,因为我们可以将表的位置交换,这与右外连接没什么区别。
案例:列出部门名称和这些部门的员工信息,同时列出没有员工的部门。
通过观察,emp表中不存在部门号为40的员工。从上面要求:同时列出没有员工的部门可以看出,部门为主,因此若选择左外连接,部门表在左侧;选择右外连接,部门表在右侧。
select * from dept left join emp on dept.deptno=emp.deptno order by dept.deptno;
这就统计出来了我们想要的结果。