连接查询
1、介绍
- 单表查询
从一张表中单独查询,称为单表查询。 - 连接查询
emp表和dept表联合起来查询数据,从emp表中取员工名字,从dept表中取部门名字;这种跨表查询,多张表联合起来查询数据,被称为连接查询。
2、连接查询分类
- 内连接
- 等值连接
- 非等值连接
- 自连接
- 外连接
- 左外连接(左连接)
- 右外连接(右连接)
- 全连接(不讲)
3、内连接
3.1 等值连接
//案例:查询每个员工所在部门名称,显示员工名和部门名
//SQL92语法
select
e.ename,d.dname
from
emp e, dept d
where
e.deptno = d.deptno;
sql92的缺点:结构不清晰,表的连接条件,和后期进一步筛选的条件,都放到了where后面。
//SQL99语法
mysql> select
-> e.ename,d.dname
-> from
-> emp e
-> inner join //inner可以省略
-> dept d
-> on
-> e.deptno = d.deptno; // 条件是等量关系,所以被称为等值连接。
//表连接的条件是独立的,连接之后,如果还需要进一步筛选,再往后继续添加where
select
...
from
a
join
b
on
a和b的连接条件
where
筛选条件
3.2 非等值连接
//找出每个员工的薪资等级,要求显示员工名、薪资、薪资等级
select
e.ename, e.sal, s.grade
from
emp e
join
salgrade s
on
e.sal between s.losal and s.hisal; // 条件不是一个等量关系,称为非等值连接。
3.3 自连接(NATURAL JOIN)
自然连接只有在连接的列在两张表中的名称都相同时才会有用,自然连接之后,两张表等值连接,A,B列自动合并成一列,自然连接不必指出任何条件。
SQL> select * from R natural join S;
4、外连接
4.1 左外连接(LEFT OUTER JOIN)
接收左表的所有行,并用这些行与右表进行匹配
/**LEFT OUTER JOIN左边的表dept我们称为左表,右边的emp称为右表,所以LEFT OUTER JOIN会取得左表dept的所有行和右表的emp的行进行匹配,如果右表emp中没有匹配的项,将用NULL取代**/
select
e.ename,d.dname
from
dept d
left outer join //outer可以省略
emp e
on
e.deptno = d.deptno;
带有right的是右外连接,又叫做右连接。
带有left的是左外连接,又叫做左连接。
任何一个右连接都有左连接的写法。
任何一个左连接都有右连接的写法。
外连接的查询结果条数一定是 >= 内连接的查询结果条数的嘛? 正确
5、多表查询(联结)
涉及到多表查询,需要用到联结,联结可以分为以下几类
- 左联结(left join):联结结果保留左表的全部数据
- 右联结(right join):联结结果保留右表的全部数据
- 内联结(inner join):联结结果取两表的公共数据
例:
select firstName, lastName, city, state
from Person (as) p left join Address (as) a
on p.personId = a.personId