连接查询

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列自动合并成一列,自然连接不必指出任何条件。

mysql全连接查询代码 mysql全外连接查询_mysql全连接查询代码

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):联结结果取两表的公共数据

例:

mysql全连接查询代码 mysql全外连接查询_数据库_02

select firstName, lastName, city, state
from Person (as) p left join Address (as) a
on p.personId = a.personId