多表查询:

当查询的数据并不是来源一个表时,需要使用多表链接操作完成查询。根据不同表中的数据之间的关系查询相关联的数据。

多表链接方式:

内连接:(等值连接,非等值连接,自连接,SQL99有交叉连接(cross join),内连接(inner join),自然连接(natural join))

            连接两个表,通过相等或不等判断链接列,称为内连接。在内连接中典型的联接运算有 = 或 <> 之类的比较运算符。包括               等值联接和自然联接。

外连接:(左外链接,右外连接,全外链接)

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

子查询:当一个查询是另一个查询的条件时,称之为子查询。

笛卡尔积:

           笛卡尔乘积是指在数学中,两个集合 X 和 Y 的笛卡尓积(Cartesian product),又称直积,表示为 X * Y,第一个对象是            X 的成员而第二个对象是 Y 的所有可能有序对的其中一个成员。

注意:由于笛卡尔积在数据库较大的情况下,很容易使数据库崩溃,所以为了防止笛卡尔积的产生,应该在 WHERE 子句中始终包含一个有效的连接条件。

例:链接俩张表:

SQL> select e.last_name,d.department_name from employees e,departments d where e.department_id=d.department_id;
LAST_NAME DEPARTMENT_NAME
------------------------- ------------------------------
Whalen Administration
Fay Marketing
Hartstein Marketing
Tobias Purchasing
Colmenares Purchasing
Baida Purchasing
Raphaely Purchasing
Khoo Purchasing
Himuro Purchasing
Mavris Human Resources
Feeney Shipping
Fleaur Shipping
Fripp Shipping
Gates Shipping
Gee Shipping
Geoni Shipping
Grant Shipping
Jones Shipping
Kaufling Shipping
Ladwig Shipping

多表链接的语法:

• 在 WHERE 子句中写连接条件。

• 当多个表中有相同的列名时,将表名或者表的别名作为列名的前缀。

原则:

• 在写一个连接表的 SELECT 语句时,在列名前面用表名或者表别名可以使语义清楚,并且加快数据库访问。

• 为了连接 n 个表在一起,你最少需要 n-1 个连接条件。例如,为了连接 4 个表,最少需要 3 个连接条件。

等值链接:

等值连接也被称为简单连接 (simple joins) 或内连接 (inner joins)。是通过等号来判断连接条件中的数据值是否相匹配。

抉择矩阵思想:

为什么能思路清晰去关联多张表。我们提出抉择矩阵的思想:

实例:查询所有雇员名字以及他们所在的部门名称。

SQL> select e.last_name,d.department_name from employees e,departments d where e.department_id=d.department_id;
LAST_NAME DEPARTMENT_NAME
------------------------- ------------------------------
Whalen Administration
Fay Marketing
Hartstein Marketing
Tobias Purchasing
Colmenares Purchasing
Baida Purchasing
Raphaely Purchasing
Khoo Purchasing
Himuro Purchasing
Mavris Human Resources
Feeney Shipping
Fleaur Shipping
Fripp Shipping
Gates Shipping
Gee Shipping
Geoni Shipping
Grant Shipping
Jones Shipping
Kaufling Shipping
Ladwig Shipping

用 使用 AND  操作符附加搜索条件

当我们需要在查询来张表做关联的时候提出要求,我们就需要用我和where子句,条件多了,就需要用and连接。

示例二:显示同一个部门中所有名字为 Taylor 的雇员的名字和部门号。

SQL> select e.last_name,d.department_name from employees e,departments d where e.department_id=d.department_id and e.last_name='Taylor';
LAST_NAME DEPARTMENT_NAME
------------------------- ------------------------------
Taylor Sales
Taylor Shipping

使用表别名原则:

• 表别名最多可以有 30 个字符,但短一些更好。

• 如果在 FROM 子句中表别名被用于指定的表,那么在整个 SELECT 语句中都可以使用表别名。

• 表别名应该是有意义的。

• 表别名只对当前的 SELECT 语句有效

多于两个表的连接:

实例:查询每个雇员的 last name、departmentname 和 city(city 来源于 locations 表)。

SQL> 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;
LAST_NAME DEPARTMENT_NAME CITY
------------------------- ------------------------------ ------------------------------
Abel Sales Oxford
Ande Sales Oxford
Atkinson Shipping South San Francisco
Austin IT Southlake
Baer Public Relations Munich
Baida Purchasing Seattle
Banda Sales Oxford
Bates Sales Oxford
Bell Shipping South San Francisco
Bernstein Sales Oxford
Bissot Shipping South San Francisco
Bloom Sales Oxford
Bull Shipping South San Francisco
Cabrio Shipping South San Francisco
Cambrault Sales Oxford
Cambrault Sales Oxford
Chen Finance Seattle
Chung Shipping South San Francisco
Colmenares Purchasing Seattle
Davies Shipping South San Francisco

实例二:查询 Taylor 的雇员 ID、部门名称、和工作的城市

SQL> select e.employee_id,d.department_name,l.city
2 from employees e,departments d,locations l
3 where e.department_id=d.department_id
4 and d.location_id=l.location_id
5 and e.last_name='Taylor';
EMPLOYEE_ID DEPARTMENT_NAME CITY
----------- ------------------------------ ------------------------------
176 Sales Oxford
180 Shipping South San Francisco

非等值链接:

一个非等值连接是一种不使用相等(=)作为连接条件的查询。如!=、>、<、>=、<=、BETWEEN AND 等都是非等值链接的条件判断。

实例:查询所有雇员的薪水级别

SQL> select e.last_name,e.employee_id,e.salary,gra.gra
2 from employees e,job_grades gra
3 where e.salary<gra.highest_sal
4 and e.salary>gra.lowest_sal;
LAST_NAME EMPLOYEE_ID SALARY GRA
------------------------- ----------- ---------- ----------
King 100 24000.00 E
Kochhar 101 17000.00 E
De Haan 102 17000.00 E
Russell 145 14000.00 D
Partners 146 13500.00 D
Hartstein 201 13000.00 D
Greenberg 108 12008.00 D
Higgins 205 12008.00 D
Errazuriz 147 12000.00 D
Ozer 168 11500.00 D
Raphaely 114 11000.00 D
Cambrault 148 11000.00 D
Abel 174 11000.00 D
Zlotkey 149 10500.00 D
Vishney 162 10500.00 D
Fox 170 9600.00 C
Greene 163 9500.00 C
Bernstein 151 9500.00 C
Sully 157 9500.00 C
Hall 152 9000.00 C

自连接:自己连接自己

 示例:查询每个雇员的经理的名字以及雇员的名字。

SQL> select worker.last_name,man.last_name
2 from employees worker,employees man
3 where worker.manager_id=man.employee_id;
LAST_NAME LAST_NAME
------------------------- -------------------------
Smith Cambrault
Ozer Cambrault
Kumar Cambrault
Fox Cambrault
Bloom Cambrault
Bates Cambrault
Hunold De Haan
Vishney Errazuriz
Marvins Errazuriz
Lee Errazuriz
Greene Errazuriz
Banda Errazuriz
Ande Errazuriz
Sarchand Fripp
Olson Fripp
Marlow Fripp
Dellinger Fripp
Cabrio Fripp
Bull Fripp
Bissot Fripp

外连接(OUTER JOIN):

外连接是指查询出符合连接条件的数据同时还包含孤儿数据。左外链接包含左表的孤儿数据,右外连接包含右表的孤儿数据,全外连接包含两个表中的孤儿数据。

孤儿数据(Orphan Data):指被连接的列的值为空的数据

外连接类型:

左外(LEFT OUTER JOIN):包含左表的孤儿数据。

右外(RIGHT OUTER JOIN):包含右表的孤儿数据。

全外(FULL OUTER JOIN):包含两个表中的孤儿数据。

SQL99 中的外连接:

用 LEFT OUTER JOIN | RIGHT OUTER JOIN | FULL OUTER JOIN 定义连接类型,用ON 子句创建连接条件。

左外链接(LEFT OUTER JOIN):

例:用左外链接查询雇员名字以及他们所在的部门名称,包含那些没有部门的雇员。

SQL> select e.last_name,d.department_id
2 from employees e left outer join departments d
3 on e.department_id=d.department_id;
LAST_NAME DEPARTMENT_ID
------------------------- -------------
King 90
Kochhar 90
De Haan 90
Hunold 60
Ernst 60
Hutton 80
Taylor 80
Livingston 80
Grant
Johnson 80
Taylor 50
Fleaur 50

右外链接(RIGHT OUTER JOIN)

例:用右外链接查询雇员名字以及他们所在的部门名称,包含那些没有雇员的部门。

SQL> select e.last_name,d.department_name
2 from employees e right outer join departments d
3 on e.department_id=d.department_id;
LAST_NAME DEPARTMENT_NAME
------------------------- ------------------------------
Whalen Administration
Fay Marketing
Hartstein Marketing
Tobias Purchasing
Colmenares Purchasing
Baida Purchasing
Gietz Accounting
Higgins Accounting
Treasury
Corporate Tax
Control And Credit
Shareholder Services
Benefits
Manufacturing
Construction
Contracting
Operations
IT Support
NOC
IT Helpdesk
Government Sales
Retail Sales
Recruiting
Payroll

全外链接(FULL  OUTER  JOIN)

例:查询所有雇员和部门,包含那些没有雇员的部门以及没有部门的雇员。

SQL> select e.last_name,d.department_name
2 from employees e full outer join departments d
3 on e.department_id=d.department_id;
LAST_NAME DEPARTMENT_NAME
------------------------- ------------------------------
King Executive
Kochhar Executive
De Haan Executive
Hunold IT
Abel Sales
Hutton Sales
Taylor Sales
Livingston Sales
Grant
Johnson Sales
aer Public Relations
Higgins Accounting
Gietz Accounting
NOC
Manufacturing
Government Sales
IT Support
Benefits
Shareholder Services
Retail Sales
Control And Credit
Recruiting
Operations
Treasury
Payroll
Corporate Tax
Construction
Contracting
IT Helpdesk

Oracle 扩展的外连接

在 Oracle 数据库中对外连接中的左外与右外连接做了扩展,可以简化外连接的语法通过在连接条件的后侧使用(+)来表示是否显示孤儿数据,有(+)表示不显示孤儿数据而另一侧则显示孤儿数据。 但是该种写法仅能在 Oracle 

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

SQL> select e.last_name,d.department_name
2 from employees e , departments d
3 where e.department_id(+)=d.department_id;
LAST_NAME DEPARTMENT_NAME
------------------------- ------------------------------
Gietz Accounting
Higgins Accounting
Treasury
Corporate Tax
Control And Credit
Shareholder Services
Benefits
Manufacturing
Construction
Contracting
Operations
IT Support
NOC
IT Helpdesk
Government Sales
Retail Sales
Recruiting
Payroll

最新文章

  1. 360浏览器遇到文档模式是IE7的解决办法
  2. laravel强大功能路由初探(二)
  3. PE读写
  4. C#通用类型转换 Convert.ChangeType
  5. iOS开发Hessian
  6. 使用Eclipse调试PHP程序
  7. DP入门---Robberies
  8. POJ 2153 stl
  9. 5方与5W
  10. HDOJ -- 4699
  11. 段落排版--对齐(text-aliagn)
  12. mysql跟踪提交的SQL语句
  13. ezjailserver备份和恢复方法
  14. android 删除相册图片并同步到图库
  15. Angular: 执行ng lint后如何快速修改错误
  16. .NET Framework简介
  17. Functional programming idiom
  18. POJ3040--Allowance(贪心)
  19. com.netflix.client.ClientException: Load balancer does not have available server for client xxxx
  20. Vue学习记录(一)

热门文章

  1. HttpClient 上传文件
  2. 使用vue-cli搭建项目开发环境
  3. JavaScript 弹出框:警告(alert)、确认(confirm)的简单写法
  4. [复现论文程序图]High Speed Continuous Variable Source-Independent Quantum Random Number Generation
  5. Linux命令大全(个人整理,如不全面望谅解)
  6. 【python测试开发栈】python基础语法大盘点
  7. pat 1006 Sign In and Sign Out(25 分)
  8. Linux系统中文件行末尾出现^M的原因及解决办法
  9. Flex调用JavaScript获取文件路径
  10. windows系统与SQL SERVER 2008数据库服务性能监控分析简要