7.连接

一、笛卡尔积

设A,B为集合,用A中元素为第一元素,B中元素为第二元素构成有序对,所有这样的组成的集合叫做A和B的笛卡尔积。表示为 X*Y,

示例:假设集合A={a,b},集合B={0,1,2},则两个集合的笛卡尔积为{(a,0),(a,1),(a,2),(b,0),(b,1),(b,2)}

如何避免连接两表时形成笛卡尔积:

  • 一个连接条件被遗漏
  • 一个连接条件不正确
  • 在第一个表中的所有行被连接到第二张表中的所有行

为了避免笛卡尔积,在where子句中应当总是包含正确的连接条件

二、sql92标准查询

1.等值连接(内连接)

等值连接的特点

  • 多表等值连接的结果为多表的交集部分
  • n表连接,至少需要n-1个条件
  • 夺表不分主次,没有顺序要求
  • 一般为表起别名,提高阅读性和性能
  • 可以搭配排序、分组、筛选等子句使用

语法

SELECT [* | <column_name>[,...]]
FROM <table_name>[,...]
WHERE condition
AND other_condition

示例:

SELECT e.employee_id,e.last_name,e.department_name
FROM employee e,department d
WHERE e.employee_id = d.employee_id;

2.非等值连接

一个非等值连接使用不同于”等于(=)“的操作符获得关系,可以使用除=以外的关系运算符。

示例:

SELECT e.last_name,e.salary,j.grade_level
FROM employee e,job_grade j
WHERE e.salary BETWEEN j.lowest_sal AND j.highest_level;

3.自连接

连接自己的表到自己。当一个表中所包含的数据过多,查询的时候就可能会需要用到自连接。

# 查询每个雇员的经理的名字以及雇员的名字,雇员名字列别名为W,经理列别名为M。
SELECT worker.last_name W,manager.last_name M
FROM employees worker,employees manager
WHERE worker.manager_id = manager.employee_id;

三、sql99标准查询

1.交叉连接

对于每个表进行交叉连接,就是创建他们的笛卡尔积。

  • CROSS JOIN 子句导致两个表的交叉连接
  • 该连接和两个表之间的笛卡尔乘积一样

示例:

# 使用交叉连接查询employees和departments
SELECT *
FROM employees CROSS JOIN departments;

2.自然连接

连接只能发生在两个表中有相同列名和数据类型的列上,如果列有相同名字,数据类型不相同的话,会引起语法错误。

  • NATURAL JOIN子句基于两个表之间有相同名字的所有列;
  • 它从两个表中选择在所有的匹配列中有相同值的行;
  • 如果有相同名字的列数据类型不同,会返回一个错误

示例:

# 使用自然连接查询所有有部门的雇员的名字以及部门名称。
SELECT e.last_name,d.department_name
FROM emplyees e NATURAL JOIN departments d;

3.内连接

内连接时候得到两个表交集的数据。

语法:(INNER关键字可以省略)

SELECT [* | <column_name>[,...]]
FROM <table_name> as other_name 
INNER JOIN <table_name> as other_name
ON <condition>

示例:

SELECT e.employee_id,e.last_name,e.department_id,d.location_id
FROM employees e  JOIN department d
ON e.department_id = d.department_id

4.外连接

左外连接和右外连接


在两个表之间的连接,返回内连接的结果,同时还返回不匹配行的左(右)外连接,称为左(右)外连接。

语法

SELECT ... FROM ... LEFT JOIN ... ON ...
SELECT ... FROM ... RIGHT JOIN ... ON ...

全外连接

在两个表之间的连接,返回内连接的结果,同时还返回左和右连接的结果,成为全外连接。MySQL不支持直接使用全外连接,通过使用UNION关键字实现全外连接。

  • UNION:可以将两个查询结果集合并,返回唯一的数据(去重),同对结果集使用了DISTINCT
  • UNION ALL:将两个查询结果集合并,结果不去重。

语法

(SELECT col_name FROM tab_name1 LEFT JOIN tab_name2 ON condition)
UNION
(SELECT col_name FROM tab_name1 RIGHT JOIN tab_name2 ON condition)

示例:

# 查询所有雇员的名字以及他们的部门名称,包含那些没有雇员的部门以及没有部门的雇员。

(SELECT e.last_name,d.department_name FROM employees e LEFT JOIN departments d ON e.department_id = d.department_id)
UNION
(SELECT e1.last_name,d1.department_name FROM employees e1 RIGHT JOIN departments d1 ON e1.department_id = d1.department_id);

孤儿数据

故而数据是指被连接的值为空的数据。

posted @ 2022-01-19 19:06  只强  阅读(167)  评论(0编辑  收藏  举报