多表查询:

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

多表链接方式:

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

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

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

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

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

笛卡尔积:

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

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

例:链接俩张表:

  1. SQL> select e.last_name,d.department_name from employees e,departments d where e.department_id=d.department_id;
  2. LAST_NAME DEPARTMENT_NAME
  3. ------------------------- ------------------------------
  4. Whalen Administration
  5. Fay Marketing
  6. Hartstein Marketing
  7. Tobias Purchasing
  8. Colmenares Purchasing
  9. Baida Purchasing
  10. Raphaely Purchasing
  11. Khoo Purchasing
  12. Himuro Purchasing
  13. Mavris Human Resources
  14. Feeney Shipping
  15. Fleaur Shipping
  16. Fripp Shipping
  17. Gates Shipping
  18. Gee Shipping
  19. Geoni Shipping
  20. Grant Shipping
  21. Jones Shipping
  22. Kaufling Shipping
  23. Ladwig Shipping

多表链接的语法:

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

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

原则:

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

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

等值链接:

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

抉择矩阵思想:

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

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

  1. SQL> select e.last_name,d.department_name from employees e,departments d where e.department_id=d.department_id;
  2. LAST_NAME DEPARTMENT_NAME
  3. ------------------------- ------------------------------
  4. Whalen Administration
  5. Fay Marketing
  6. Hartstein Marketing
  7. Tobias Purchasing
  8. Colmenares Purchasing
  9. Baida Purchasing
  10. Raphaely Purchasing
  11. Khoo Purchasing
  12. Himuro Purchasing
  13. Mavris Human Resources
  14. Feeney Shipping
  15. Fleaur Shipping
  16. Fripp Shipping
  17. Gates Shipping
  18. Gee Shipping
  19. Geoni Shipping
  20. Grant Shipping
  21. Jones Shipping
  22. Kaufling Shipping
  23. Ladwig Shipping

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

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

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

  1. 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';
  2. LAST_NAME DEPARTMENT_NAME
  3. ------------------------- ------------------------------
  4. Taylor Sales
  5. Taylor Shipping

使用表别名原则:

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

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

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

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

多于两个表的连接:

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

  1. 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;
  2. LAST_NAME DEPARTMENT_NAME CITY
  3. ------------------------- ------------------------------ ------------------------------
  4. Abel Sales Oxford
  5. Ande Sales Oxford
  6. Atkinson Shipping South San Francisco
  7. Austin IT Southlake
  8. Baer Public Relations Munich
  9. Baida Purchasing Seattle
  10. Banda Sales Oxford
  11. Bates Sales Oxford
  12. Bell Shipping South San Francisco
  13. Bernstein Sales Oxford
  14. Bissot Shipping South San Francisco
  15. Bloom Sales Oxford
  16. Bull Shipping South San Francisco
  17. Cabrio Shipping South San Francisco
  18. Cambrault Sales Oxford
  19. Cambrault Sales Oxford
  20. Chen Finance Seattle
  21. Chung Shipping South San Francisco
  22. Colmenares Purchasing Seattle
  23. Davies Shipping South San Francisco

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

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

非等值链接:

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

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

  1. SQL> select e.last_name,e.employee_id,e.salary,gra.gra
  2. 2 from employees e,job_grades gra
  3. 3 where e.salary<gra.highest_sal
  4. 4 and e.salary>gra.lowest_sal;
  5. LAST_NAME EMPLOYEE_ID SALARY GRA
  6. ------------------------- ----------- ---------- ----------
  7. King 100 24000.00 E
  8. Kochhar 101 17000.00 E
  9. De Haan 102 17000.00 E
  10. Russell 145 14000.00 D
  11. Partners 146 13500.00 D
  12. Hartstein 201 13000.00 D
  13. Greenberg 108 12008.00 D
  14. Higgins 205 12008.00 D
  15. Errazuriz 147 12000.00 D
  16. Ozer 168 11500.00 D
  17. Raphaely 114 11000.00 D
  18. Cambrault 148 11000.00 D
  19. Abel 174 11000.00 D
  20. Zlotkey 149 10500.00 D
  21. Vishney 162 10500.00 D
  22. Fox 170 9600.00 C
  23. Greene 163 9500.00 C
  24. Bernstein 151 9500.00 C
  25. Sully 157 9500.00 C
  26. Hall 152 9000.00 C

自连接:自己连接自己

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

  1. SQL> select worker.last_name,man.last_name
  2. 2 from employees worker,employees man
  3. 3 where worker.manager_id=man.employee_id;
  4. LAST_NAME LAST_NAME
  5. ------------------------- -------------------------
  6. Smith Cambrault
  7. Ozer Cambrault
  8. Kumar Cambrault
  9. Fox Cambrault
  10. Bloom Cambrault
  11. Bates Cambrault
  12. Hunold De Haan
  13. Vishney Errazuriz
  14. Marvins Errazuriz
  15. Lee Errazuriz
  16. Greene Errazuriz
  17. Banda Errazuriz
  18. Ande Errazuriz
  19. Sarchand Fripp
  20. Olson Fripp
  21. Marlow Fripp
  22. Dellinger Fripp
  23. Cabrio Fripp
  24. Bull Fripp
  25. 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):

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

  1. SQL> select e.last_name,d.department_id
  2. 2 from employees e left outer join departments d
  3. 3 on e.department_id=d.department_id;
  4. LAST_NAME DEPARTMENT_ID
  5. ------------------------- -------------
  6. King 90
  7. Kochhar 90
  8. De Haan 90
  9. Hunold 60
  10. Ernst 60
  11. Hutton 80
  12. Taylor 80
  13. Livingston 80
  14. Grant
  15. Johnson 80
  16. Taylor 50
  17. Fleaur 50

右外链接(RIGHT OUTER JOIN)

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

  1. SQL> select e.last_name,d.department_name
  2. 2 from employees e right outer join departments d
  3. 3 on e.department_id=d.department_id;
  4. LAST_NAME DEPARTMENT_NAME
  5. ------------------------- ------------------------------
  6. Whalen Administration
  7. Fay Marketing
  8. Hartstein Marketing
  9. Tobias Purchasing
  10. Colmenares Purchasing
  11. Baida Purchasing
  12. Gietz Accounting
  13. Higgins Accounting
  14. Treasury
  15. Corporate Tax
  16. Control And Credit
  17. Shareholder Services
  18. Benefits
  19. Manufacturing
  20. Construction
  21. Contracting
  22. Operations
  23. IT Support
  24. NOC
  25. IT Helpdesk
  26. Government Sales
  27. Retail Sales
  28. Recruiting
  29. Payroll

全外链接(FULL  OUTER  JOIN)

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

  1. SQL> select e.last_name,d.department_name
  2. 2 from employees e full outer join departments d
  3. 3 on e.department_id=d.department_id;
  4. LAST_NAME DEPARTMENT_NAME
  5. ------------------------- ------------------------------
  6. King Executive
  7. Kochhar Executive
  8. De Haan Executive
  9. Hunold IT
  10. Abel Sales
  11. Hutton Sales
  12. Taylor Sales
  13. Livingston Sales
  14. Grant
  15. Johnson Sales
  16. aer Public Relations
  17. Higgins Accounting
  18. Gietz Accounting
  19. NOC
  20. Manufacturing
  21. Government Sales
  22. IT Support
  23. Benefits
  24. Shareholder Services
  25. Retail Sales
  26. Control And Credit
  27. Recruiting
  28. Operations
  29. Treasury
  30. Payroll
  31. Corporate Tax
  32. Construction
  33. Contracting
  34. IT Helpdesk

Oracle 扩展的外连接

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

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

  1. SQL> select e.last_name,d.department_name
  2. 2 from employees e , departments d
  3. 3 where e.department_id(+)=d.department_id;
  4. LAST_NAME DEPARTMENT_NAME
  5. ------------------------- ------------------------------
  6. Gietz Accounting
  7. Higgins Accounting
  8. Treasury
  9. Corporate Tax
  10. Control And Credit
  11. Shareholder Services
  12. Benefits
  13. Manufacturing
  14. Construction
  15. Contracting
  16. Operations
  17. IT Support
  18. NOC
  19. IT Helpdesk
  20. Government Sales
  21. Retail Sales
  22. Recruiting
  23. Payroll

数据库Oracle多表链接的更多相关文章

  1. 【c# 数据库】 多表链接

    1.inner join string sql = "select * from studentsinfo inner join teacher on teacher.姓名 = studen ...

  2. oracle 数据库下所有表结构、数据量及缺失值统计

    表结构 SELECT t1.TABLE_NAME, t1.COLUMN_NAME, t1.DATA_TYPE || '(' || t1.DATA_LENGTH || ')', t2.COMMENTS ...

  3. PowerDesigner生成Oracle数据库时,表名会带引号问题

    使用PowerDesigner生成数据库建表SQL脚本时,尤其是Oracle数据库时,表名一般会带引号.其实加引号是PL/SQL的规范,数据库会严格按照""中的名称建表,如果没有& ...

  4. 实例讲解Oracle数据库设置默认表空间问题

    实例讲解Oracle数据库设置默认表空间问题   实例讲解Oracle数据库设置默认表空间问题,阅读实例讲解Oracle数据库设置默认表空间问题,DBA们经常会遇到一个这样令人头疼的问题:不知道谁在O ...

  5. MySQL的链接,查看数据库,使用数据库,查看表

    MySQL的链接,查看数据库,使用数据库,查看表 mysql> show databases; +--------------------+ | Database | +------------ ...

  6. Oracle 数据库(oracle Database)Select 多表关联查询方式

    Oracle数据库中Select语句语法及介绍 SELECT [ ALL | DISTINCT ] <字段表达式1[,<字段表达式2[,…] FROM <表名1>,<表名 ...

  7. Oracle数据库之创建表结构

    Oracle数据库之创建表结构 主键与外键 主键:关系型数据库中的一条记录中有若干个属性,若其中的某一个属性组(可以是一个属性,也可以是多个)能唯一标识一条记录,那么该属性组就是主键. 外键:关系型数 ...

  8. Oracle数据库之创建表空间与用户

    Oracle数据库之创建表空间与用户 一.创建表空间 基本语法表述: CREATE TABLESPACE tablespace_name [DATAFILE datafile_spec1 [,data ...

  9. ORACLE查询数据库的锁表情况

      查询数据库的锁表情况语句如下: SELECT p.spid,a.serial#, c.object_name,b.session_id,b.oracle_username,b.os_user_na ...

随机推荐

  1. jquery mobiscroll移动端日期选择控件(无乱码)

    jquery mobiscroll移动端日期选择控件(无乱码) <pre><!DOCTYPE html><html lang="en">< ...

  2. 公众号第三方平台开发 component_verify_ticket和accessToken的获取

    公众号第三方平台审核通过之后,微信的服务器会定时(10分钟一次)给"授权事件接收URL"发送component_verify_ticket,这里我们需要及时更新component_ ...

  3. B2B电商正在向一个新的方向转变

    在互联网+.中国制造2025等国家战略规划的不断催发下,淡出舆论风口多时的B2B电商,开始重新回归公众视野,B2B行业也就此得到一剂强心剂.不过值得关注的是,B2B平台商业模式已经开始发生变革. 互联 ...

  4. SparkSQL--数据源Parquet的加载和保存

    一.通用的load和save操作 对于Spark SQL的DataFrame来说,无论是从什么数据源创建出来的DataFrame,都有一些共同的load和save操作.load操作主要用于加载数据,创 ...

  5. Mac上sonar插件的安装及使用

    本文主要讲解sonar的安装及使用. 分为两个维度来讲解 1. 使用sonarqube以及自带的Derby数据库 2. 使用sonarqube以及配置mysql数据库 ---------------- ...

  6. deepin 、 windows10,双系统安装

    deepin . windows10,双系统安装: 首先,最好专门分一个盘用来存放deepin操作系统的安装位置(我这里分给它60个G). 1.在 http://rsync.deepin.com/de ...

  7. hdu 5901 Count primes (meisell-Lehmer)

    Count primes Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Tot ...

  8. PHP常用的三种输出语句

    今天介绍一下PHP三种常用的输出语句: 1.echo语句 2.print_r语句 3.var_dump语句 echo语句:可以输出数字.字符串 例: echo 12: echo 'aswedf'; e ...

  9. iOS UIKit x Android Widget

    Android的事件回调Listener相当于iOS的delegate回调. Android的事件回调接口Listener相当于iOS的protocol回调协议. Android的UI容器(Adapt ...

  10. Javascript脚本语言

    找组件用 id (唯一) 2.name 样式 使用分类 1 页面中 2 建JS文件 可以放在head也可以在body 工作区可以有 1 全局变量 2 由多个函数构成 标签编辑器 onChange 改变 ...