07 mysql 多表查询(连接查询)

 每个数据库中可以存放多张表,真正的应用中经常需要从多个数据表中读取数据

笛卡尔乘积

多表进行连接查询时没有任何条件,最终的结果是多表结果数量乘积的现象被称为笛卡尔积

例如

SELECT e.employeename,d.departmentname FROM department AS d,employee AS e;

注:在多表联合查询时,要记得加上连接条件 ,通常会给表取别名,通过别名来判断字段属于哪个表,有较强的可读性。

SQL92语法  1992年制定的规则


SELECT e.employeename ,d.departmentname FROM department AS d,employee AS e 
WHERE e.departmentnumber=d.departmentnumber;

SQL99 语法 建议使用   1999年制定的规则


SELECT e.employeename ,d.departmentname FROM department AS d,employee AS e
 WHERE e.departmentnumber=d.departmentnumber;

join关键字可以连接多个表,

on关键字后面加上连接条件 

join 按照功能大致分为如下三类:

内连接

inner join(内连接,或等值连接):获取两个表中字段匹配关系的记录。

内连接查询出的数据是两张表的交集,inner可省略

如:

-- 查询每个员工所在的部门名称,显示员工姓名和对应的部门名称
SELECT
  e.employeename,
  d.departmentname
FROM
  department AS d
  JOIN employee AS e
    ON d.departmentnumber = e.departmentnumber;
-- 查询每个员工所在的部门名称,显示员工姓名,工作和对应的部门名称
SELECT
  e.employeename,
  e.job,
  d.departmentname
FROM
  department AS d
  INNER JOIN employee e
    ON d.departmentnumber = e.departmentnumber;

-- 查询每个员工所在的部门名称,显示用工姓名和对应的部门名称:
SELECT
 e.employeename,d.departmentname
 FROM 
 department AS d
 JOIN employee AS e
    ON d.departmentnumber=e.departmentnumber; 
    
-- 找出员工所对应的工资等级,显示员工姓名、工资、工资等级:
SELECT
  e.employeename,
  e.salary,
  s.grade
FROM
  employee AS e
  JOIN salarygrade s
    ON e.salary BETWEEN s.lowsalary
    AND s.highsalary;

 
    

左外连接

left outer join:获取左表所有记录,即使右表没有对应匹配的记录。

左外连接如上图中A部分+C部分的内容,即包含左边表的全部行(不管右边的表中是否存在与它匹配的行),和右边表中全部匹配的行  ,outer可省略

示例:

-- 找出每一个员工对应的部门名称,要求显示所有员工,要求显示所有的部门
SELECT
  e.employeename,
  d.departmentname
FROM
  department d
  LEFT OUTER JOIN employee e
    ON e.departmentnumber = d.departmentnumber;

说明:部门表的内容有的跟员工表没联系,为了显示出部门表所有信息,需要使用左连接 

右外连接

right outer join: 与 left join相反,用于获取右表所有记录,即使左表没有对应匹配的记录,

右外连接如上图中B部分+C部分的内容,即包含右边表的全部行(不管左边的表中是否存在与它匹配的行),和左边表中全部匹配的行。outer可省略

-- 找出每一个员工对应的部门名称,要求部门名称全部显示:
SELECT
  e.employeename,
  d.departmentname`
FROM
  employee e
  RIGHT JOIN department d
    ON e.departmentnumber = d.departmentnumber;

注:右外连接都可改写成左外连接,左外连接都可改写成右外连接

自连接

两张一样的表连接查询叫自连接,自连接也可以左连接或者右连接

  例如: 查询员工的名称和员工对应的领导名称

 SELECT
  e1.employeename,
  e2.employeename AS leader
FROM
  employee e1
   JOIN employee e2
    ON e1.manager = e2.employeenumber;

上面的自连接查询有问题,king的领导为null,上面的询句查不出来,需要用到下面的左连接查询 

-- 找出每一个员工对应的领导名,要求显示所有员工
SELECT 
e1.employeename ,e2.employeename ledaer
 FROM 
employee e1
 LEFT JOIN employee e2 
ON e1.manager=e2.employeenumber;

示例:

-- 找出每一个员工对应的部门名称,以及该员工对应的工资等级,要求显示员工姓名、部门名称、员工工资,工资等级
SELECT
  e.employeename,
  d.departmentname,
  e.salary,
  s.grade
FROM
  employee e
  JOIN department d
    ON e.departmentnumber = d.departmentnumber
  JOIN salarygrade s
    ON e.salary BETWEEN s.lowsalary
    AND s.highsalary;

说明:当多余两个表联合查询时,先将前两个表查出的内容当作新表,再和第三个表联合查询 

参考:小猴子视频

http://www.monkey1024.com/database/819

猜你喜欢

转载自blog.csdn.net/sinat_41132860/article/details/84928846
今日推荐