数据库_多表查询_内连接&外连接

打印 上一主题 下一主题

主题 890|帖子 890|积分 2672

首先明确一下定义:
内连接:在多表查询的时候,只检索出表之间相互匹配的行(满足匹配条件的行),结果中不包括两个表之间不匹配的行。
一个不太准确但易懂的例子:比如有两个表,表1存储了 (1,2,3,4,5 )这五个数字。表2存储了(3,4,5,6,7,8)这6个数字。多表查询时两个表的关联条件是 “表1 = 表2”.
那么检索的输出就是取这两个表的交集。,即 3,4,5.

外连接:在多表查询的时候,处理检索出内连接的数据外,还返回左表(或者右表)中不满足匹配条件的行。这种连接称为左(或者右)外连接。
还是上边那个小例子:左外连接的返回结果为(1,2,3,4,5);右外连接的返回结果为(3,4,5,6,7,8).
如果是左外连接,则连接条件中左边的表也称为主表 ,右边的表称为从表 。如下简图:

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

代码实现:
下面是代码举例中要用到的3个表
employees表:
  1. +----------------+-------------+------+-----+---------+-------+
  2. | Field          | Type        | Null | Key | Default | Extra |
  3. +----------------+-------------+------+-----+---------+-------+
  4. | employee_id    | int         | NO   | PRI | 0       |       |
  5. | first_name     | varchar(20) | YES  |     | NULL    |       |
  6. | last_name      | varchar(25) | NO   |     | NULL    |       |
  7. | email          | varchar(25) | NO   | UNI | NULL    |       |
  8. | phone_number   | varchar(20) | YES  |     | NULL    |       |
  9. | hire_date      | date        | NO   |     | NULL    |       |
  10. | job_id         | varchar(10) | NO   | MUL | NULL    |       |
  11. | salary         | double(8,2) | YES  |     | NULL    |       |
  12. | commission_pct | double(2,2) | YES  |     | NULL    |       |
  13. | manager_id     | int         | YES  | MUL | NULL    |       |
  14. | department_id  | int         | YES  | MUL | NULL    |       |
  15. +----------------+-------------+------+-----+---------+-------+
复制代码
departments表:
  1. +-----------------+-------------+------+-----+---------+-------+
  2. | Field           | Type        | Null | Key | Default | Extra |
  3. +-----------------+-------------+------+-----+---------+-------+
  4. | department_id   | int         | NO   | PRI | 0       |       |
  5. | department_name | varchar(30) | NO   |     | NULL    |       |
  6. | manager_id      | int         | YES  | MUL | NULL    |       |
  7. | location_id     | int         | YES  | MUL | NULL    |       |
  8. +-----------------+-------------+------+-----+---------+-------+
复制代码
 locations表:
  1. +----------------+-------------+------+-----+---------+-------+
  2. | Field          | Type        | Null | Key | Default | Extra |
  3. +----------------+-------------+------+-----+---------+-------+
  4. | location_id    | int         | NO   | PRI | 0       |       |
  5. | street_address | varchar(40) | YES  |     | NULL    |       |
  6. | postal_code    | varchar(12) | YES  |     | NULL    |       |
  7. | city           | varchar(30) | NO   |     | NULL    |       |
  8. | state_province | varchar(25) | YES  |     | NULL    |       |
  9. | country_id     | char(2)     | YES  | MUL | NULL    |       |
  10. +----------------+-------------+------+-----+---------+-------+
复制代码
 
注:以下所用语法:JOIN...ON 为 SQL99 中的多表查询实现语法。
内连接:检索返回员工姓名,部门名组成的表(需要用到employees表及departments表)
  1. mysql> SELECT last_name,department_name
  2.     -> FROM employees e  # 表1 JOIN 表2 ON 匹配条件;
  3.     -> JOIN departments d
  4.     -> ON e.department_id = d.department_id;   # 关联条件
复制代码
 
检索返回员工姓名、部门名称、部门所在城市组成的表。
  1. mysql> SELECT last_name,department_name,city
  2.     -> FROM employees e  
  3.     -> JOIN departments d   
  4.     -> ON e.department_id = d.department_id
  5.     -> JOIN locations l
  6.     -> ON d.location_id = l.location_id;
  7.     /*
  8.     表1
  9.     JOIN 表2
  10.     ON 表1和表2的匹配条件
  11.     JOIN 表3
  12.     ON 表2和表3的匹配条件;
  13.     */
复制代码
 
外连接:从两个表中,检索返回所有员工的姓名、部门名组成的表。
  1. mysql> SELECT employee_id,department_name
  2.     -> FROM employees e   # employees表为主表,departments表为从表。主表 LEFT OUTER JOIN 从表 ON 匹配条件;
  3.     -> LEFT OUTER JOIN departments d   # 左外连接
  4.     -> ON e.department_id = d.department_id;
复制代码
 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

南七星之家

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表