第6章 多表查询

1.多表连接案例

*多表查询,也称为关联查询,指两个或更多个表一起完成查询操作。

*前提条件:这些一起查询的表之间是有关系的(一对一、一对多),它们之间一定是有关联字段,这个关联字段可能建立了外键,也可能没有建立外键。比如:员工表和部门表,这两个表依靠“部门编号”进行关联。

*笛卡尔积:笛卡尔乘积是一个数学运算。假设有两个集合 X 和 Y,那么 X 和 Y 的笛卡尔积就是 X 和 Y 的所有可能组合,也就是第一个对象来自于 X,第二个对象来自于 Y 的所有可能。组合的个数即为两个集合中元素个数的乘积数。

第6章 多表查询_第1张图片

*多表连接例子:

#案例:查询员工的姓名及其部门名称

SELECT last_name, department_name

FROM employees, departments

WHERE employees.department_id = departments.department_id;

2.多表查询

2.1等值连接和非等值连接

(1)等值连接

第6章 多表查询_第2张图片

*基本查询语句:

SELECT employees.employee_id, employees.last_name,

employees.department_id, departments.department_id,

departments.location_id

FROM employees, departments

WHERE employees.department_id = departments.department_id;

*多个表中有相同列时,必须在列名之前加上表名前缀。

SELECT employees.last_name, departments.department_name,employees.department_id

FROM employees, departments

WHERE employees.department_id = departments.department_id;

*使用表的别名简化查询

SELECT e.employee_id, e.last_name, e.department_id,

d.department_id, d.location_id

FROM employees e , departments d

WHERE e.department_id = d.department_id;

*连接多个表

   连接 n个表,至少需要n-1个连接条件

#查询出公司员工的 last_name,department_name, city

SELECT e.last_name,d.department_name,l.city

FROM employees e,departments d,locations l

WHERE e.department_id=d.department_id AND d.location_id=l.location_id;

(2)非等值连接

第6章 多表查询_第3张图片

*查询语句:

SELECT e.last_name, e.salary, j.grade_level

FROM employees e, job_grades j

WHERE e.salary BETWEEN j.lowest_sal AND j.highest_sal;

2.2自连接和非自连接

*当table1和table2本质上是同一张表,只是用取别名的方式虚拟成两张表以代表不同的意义。然后两个表再进行内连接,外连接等查询。

第6章 多表查询_第4张图片

*例:查询employees表,返回“Xxx works for Xxx”

SELECT CONCAT(worker.last_name ,' works for ' , manager.last_name)

FROM employees worker, employees manager

WHERE worker.manager_id = manager.employee_id ;

2.3内连接和外连接

*内连接: 合并具有同一列的两个以上的表的行, 结果集中不包含一个表与另一个表不匹配的行

*外连接: 两个表在连接过程中除了返回满足连接条件的行以外还返回左(或右)表中不满足条件的行 ,这种连接称为左(或右) 外连接。没有匹配的行时, 结果表中相应的列为空(NULL)。

*如果是左外连接,则连接条件中左边的表也称为 主表 ,右边的表称为 从表 。

*如果是右外连接,则连接条件中右边的表也称为 主表 ,左边的表称为 从表 。

*在 SQL92 中采用(+)代表从表所在的位置。即左或右外连接中,(+) 表示哪个是从表。

*MySQL不支持SQL92(+)语法

#左外连接

SELECT last_name,department_name

FROM employees ,departments

WHERE employees.department_id = departments.department_id(+);

#右外连接

SELECT last_name,department_name

FROM employees ,departments

WHERE employees.department_id(+) = departments.department_id;

3. SQL99语法实现多表查询

3.1基本语法

SELECT table1.column, table2.column,table3.column

FROM table1

JOIN table2 ON table1 table2 的连接条件

JOIN table3 ON table2 table3 的连接条件

3.2内连接

SELECT e.employee_id, e.last_name, e.department_id,

d.department_id, d.location_id

FROM employees e JOIN departments d

ON (e.department_id = d.department_id);

SELECT employee_id, city, department_name

FROM employees e

JOIN departments d

ON d.department_id = e.department_id

JOIN locations l

ON d.location_id = l.location_id;

3.3外连接

(1)左外连接

#实现查询结果是A

SELECT 字段列表

FROM ALEFT JOIN B

ON 关联条件

WHERE 等其他子句;

*举例:

SELECT e.last_name, e.department_id, d.department_name

FROM employees e

LEFT OUTER JOIN departments d

ON (e.department_id = d.department_id) ;

(2)右外链接

#实现查询结果是B

SELECT 字段列表

FROM ARIGHT JOIN B

ON 关联条件

WHERE 等其他子句;

*举例:

SELECT e.last_name, e.department_id, d.department_name

FROM employees e

RIGHT OUTER JOIN departments d

ON (e.department_id = d.department_id) ;

(3)满外链接

*满外连接的结果 = 左右表匹配的数据 + 左表没有匹配到的数据 + 右表没有匹配到的数据。

*SQL99是支持满外连接的。使用FULL JOIN 或 FULL OUTER JOIN来实现。

*需要注意的是,MySQL不支持FULL JOIN,但是可以用 LEFT JOIN UNION RIGHT JOIN代替。

4.UNION的使用

*合并查询结果 利用UNION关键字,可以给出多条SELECT语句,并将它们的结果组合成单个结果集。合并时,两个表对应的列数和数据类型必须相同,并且相互对应。各个SELECT语句之间使用UNION或UNION ALL关键字分隔。

*语法格式:

SELECT column,... FROM table1

UNION [ALL]

SELECT column,... FROM table2

*UNION 操作符返回两个查询的结果集的并集,去除重复记录。

*UNION ALL操作符返回两个查询的结果集的并集。对于两个结果集的重复部分,不去重。

5.7种JOINS

(1)内连接A∩B

第6章 多表查询_第5张图片

*例子:

SELECT employee_id,last_name,department_name

FROM employees e JOIN departments d

ON e.`department_id` = d.`department_id`;

(2)左外连接

第6章 多表查询_第6张图片

*例子:

SELECT employee_id,last_name,department_name

FROM employees e LEFT JOIN departments d

ON e.`department_id` = d.`department_id`;

(3)右外连接

SELECT employee_id,last_name,department_name

FROM employees e RIGHT JOIN departments d

ON e.`department_id` = d.`department_id`;

第6章 多表查询_第7张图片

(4)A - A∩B

第6章 多表查询_第8张图片

*例子:

SELECT employee_id,last_name,department_name

FROM employees e LEFT JOIN departments d

ON e.`department_id` = d.`department_id`

WHERE d.`department_id` IS NULL

(5)B-A∩B

第6章 多表查询_第9张图片

*例子:

SELECT employee_id,last_name,department_name

FROM employees e RIGHT JOIN departments d

ON e.`department_id` = d.`department_id`

WHERE e.`department_id` IS NULL

(6)满外连接

第6章 多表查询_第10张图片

*例子:

SELECT employee_id,last_name,department_name

FROM employees e LEFT JOIN departments d

ON e.`department_id` = d.`department_id`

WHERE d.`department_id` IS NULL

UNION ALL #没有去重操作,效率高

SELECT employee_id,last_name,department_name

FROM employees e RIGHT JOIN departments d

ON e.`department_id` = d.`department_id`;

(7)A ∪B- A∩B 或者 (A - A∩B) ∪ (B - A∩B)

 第6章 多表查询_第11张图片

*例子:

SELECT employee_id,last_name,department_name

FROM employees e LEFT JOIN departments d

ON e.`department_id` = d.`department_id`

WHERE d.`department_id` IS NULL

UNION ALL

SELECT employee_id,last_name,department_name

FROM employees e RIGHT JOIN departments d

ON e.`department_id` = d.`department_id`

WHERE e.`department_id` IS NULL

6.SQL99语法新特性

6.1自然连接

*NATURAL JOIN

SELECT employee_id,last_name,department_name

FROM employees e NATURAL JOIN departments d;

6.2USING连接

*使用 USING 指定数据表里的 同名字段 进行等值连接。但是只能配

合JOIN一起使用。

SELECT employee_id,last_name,department_name

FROM employees e JOIN departments d

USING (department_id);

你可能感兴趣的:(MySQL基础,数据库,mysql)