mysql 多表查询

员工表和部门表两张表,需要查出employee_id和department_name这两个字段

一、关联查询基本介绍

1、笛卡尔积类错误的查询方式:


SELECT employee_id, department_name
FROM employees, departments

通过这样查出来的效果有1000多条,因为每个员工id 将department_name的值都匹配了一次。

2、增加连接条件

连接条件:根据员工表中的dept_id和部门表中的dept_id 对应

SELECT employee_id, department_name
FROM employees, departments
WHERE employees.`department_id` = departments.`department_id`

即可成功,也叫关联查询

在关联查询时尽可能的在每个字段前增加对应的表

SELECT employees.employee_id, departments.department_name, departments.department_id
FROM employees, departments
WHERE employees.`department_id` = departments.`department_id`

3、起别名

如果在查询过程中 给表起了别名,该语句中只能用别名

错误方式:

SELECT employees.employee_id, departments.department_name, departments.department_id
FROM employees emp , departments dept
WHERE employees.`department_id` = departments.`department_id`

正确方式:

SELECT emp.employee_id, dept.department_name, dept.department_id
FROM employees emp , departments dept
WHERE emp.`department_id` = dept.`department_id`

二、关联查询的分类

1、分类一:等值连接 非等值连接

数据库学习笔记系列(6)——等值与非等值连接查询_bigface1234fdfg的博客-CSDN博客

2、分类二:自连接 非自连接

自连接:

        表与本身关联,比如在员工表中有主管或者上级字段时(因为主管字段的值即为员工号)        

         例子:#查询员工和上级的id与姓名

SELECT emp1.`employee_id`, emp1.`last_name`, emp2.`employee_id` 'boos_id',emp2.`last_name` 'boos_name'
FROM employees emp1, employees emp2
WHERE emp1.`manager_id` = emp2.`employee_id`

相当于两个emp表合并在一起,合并的条件是emp1中的manager_id与emp2的emp_id相等。合并的新的表有20个字段(10+10)

3、分类三:内连接 外连接

内连接

        合并具有同一列的两个以上的表的行,相当于两个表的交集,结果中不包含一个表与另一个表不匹配的行。

SELECT dept.`department_id`, emp.`last_name`
FROM employees emp   JOIN departments dept
ON emp.`department_id` = dept.`department_id`

        employee表中有107条员工数据,但有一条数据没有部门,所以输出的结果只有106条,相当根据 选取条件取得了交集

外连接

        (1)左外连接/右外连接

                交集加左边的集合/右边的集合

SELECT dept.`department_id`, emp.`last_name`
FROM employees emp LEFT JOIN departments dept
ON emp.`department_id` = dept.`department_id`

此例主表为左边的表,此时获取的结果有107条,员工有部门编号的106条加 左表emp中有一个员工没有部门号。

SELECT dept.`department_id`, emp.`last_name`
FROM employees emp LEFT JOIN departments dept
ON emp.`department_id` = dept.`department_id`

此例主表为右边的表,因此显示了122条,其中106条有部门的员工加上16条 没有员工的部门

        (2)满外连接

    full outer join ... on ...(mysql不支持)

SELECT * FROM xxx
WHERE employees FULL OUTER JOIN departments
ON ...

 

三、最后7中Join的实现

 


版权声明:本文为weixin_42196338原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。