多表查询:

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

多表链接方式:

内连接:(等值连接,非等值连接,自连接,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

数据库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. I/O流操作

    dmesg :将printk输出的信息重新输出一遍(信息在缓存区中).

  2. Tomcat+nginx+Keepalived部署实现集群

    Tomcat+nginx+Keepalived部署实现集群 环境说明: 系统:Centos-7 主机:Centos-7 x3 IP地址: 服务器1(192.168.10.102/24) 服务器2(19 ...

  3. ASP.NET Core 3.0 gRPC 身份认证和授权

    一.开头聊骚 本文算是对于 ASP.NET Core 3.0 gRPC 研究性学习的最后一篇了,以后在实际使用中,可能会发一些经验之文.本文主要讲 ASP.NET Core 本身的认证授权和gRPC接 ...

  4. 【前端VUE】【后端SSM】 记录一次多条件查询状态下加载极慢的解决思路和解决方案

    最近在开发一个Online Judge系统,其中有一个“挑战模式”模块,如图所示 由于是第一次使用ECharts做开发,所以完成整个模块的过程也是边写边学了,记录一下问题: 遇到的问题:在最开始进行测 ...

  5. oracle 数据库,能不能将查询的结果创建成新表。

    这个是可以的.sql:create table tablename1 as select t2. * from tablename2 t2 where t2.filename =‘张三’. 解释:就是 ...

  6. HTTP,HTTPS,HTTP2笔记

    HTTP 网络协议分层 应用层 -> HTTP FTP 为应用软件提供了很多服务 构建于TCP协议之上 屏蔽网络传输的相关细节 传输层 -> TCP UDP 向用户提供可靠的端对端的服务( ...

  7. linux后台运行程序--nobup

    用途:不挂断地运行命令. 语法:nohup Command [ Arg - ] [ & ] 描述:nohup 命令运行由 Command 参数和任何相关的 Arg 参数指定的命令,忽略所有挂断 ...

  8. 🙀Java 又双叒叕发布新版本,这么多版本如何灵活管理?

    文章来源:http://1t.click/bjAG 前言 不知不觉 JDK13 发布已有两个月,不知道各位有没有下载学习体验一番?每次下载安装之后,需要重新配置一下 Java 环境变量.等到运行平时的 ...

  9. 投票通过,PHP 8 确认引入 Union Types 2.0

    关于是否要在 PHP 8 中引入 Union Types 的投票已于近日结束,投票结果显示有 61 名 PHP 开发组成员投了赞成票,5 名投了反对票. 还留意到鸟哥在投票中投了反对票~) 因此根据投 ...

  10. DexOpt相关的异常

    查找的资料 dvm探讨之odex绕过 DexClassLoader4.4.2动态加载分析(磁盘加载分析) - ::): DexOpt: incorrect opt magic number (0xff ...