多表查询

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

一、笛卡尔乘积(Cartesian product)

在数学中,两个集合x和y的笛卡尔积,又称直积,表示x*y,第一个对象是x的成员 而第二个对象是y的所有可能有序对的其中一个成员。

如果避免出现笛卡尔乘积

当一个连接条件无效或被遗漏时,其结果是一个笛卡尔乘积,其中所有的行组合都 被显示。第一个表中的所有行连接到第二个表中的所有行。一个笛卡尔乘积会产生 大量的行,其结果为无用结果。应该在where子句中始终包含一个有效的连接条 件;
(以hr用户中的employees、departments表为例)

笛卡尔乘积效果
Select * from employees,departments;

二、多表连接语法(SQL86版)

语法结构

使用一个连接查询多个表的数据;

在where子句中写连接条件;
当有多个表中有相同的列名时,将表明或者表的别名作为列名的前缀;

定义连接

当数据库从多表中查询是,要使用连接(join)条件,一个表中的行按照存在相应 列中的值被连接到另一个表中的行;

原则

在写一个连接表的select语句时,在列名前用表明或者表别名可以使语义清楚,并且加快数据库访问;
为了连接n个表在一起,至少需要n-1个连接条件。例:为了连接4个表,至少需要3个连接条件。

三、等值连接

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

抉择矩阵(decision matrix)

通过行与列来分析一个查询的方式;
(以hr用户中的employees、departments表为例)

显示同一个部门中所有名字为Taylor的雇员的名字和部门名称,可以写出下面的    抉择矩阵:

(以hr用户中的employees、departments表为例)

 查询所有雇员名字以及他们所在的部门名称;Select last_name,department_name from employees,departments where            employees.department_id = departments.department_id;

使用and操作符附加搜索条件

除了连接以外,还可以要求where子句在连接中限制一个或多个表中的行;
(以hr用户中的employees、departments表为例)

     显示同一个部门中所有名字为Taylor的雇员的名字和部门名称;Select last_name ,department_name from employees , departments where last_name = ‘Taylor’ and employees.department_id = departments.department_id;

使用表别名

用于简化语句的长度;
表别名:代替表名,跟列别名相同;有助于保持SQL代码较小,从而使用的存储器也较少;
原则
1.表别名最多可以有30个字符,但短一些更好;
2.如果在from子句中表别名被用于指定的表,那么整个select语句中都可 以使用表别名;
3.表别名应该有意义;
4.表别名只对当前select语句有效;
(以hr用户中的employees、departments表为例)



使用表别名方式改写显示同一个部门中所有名字为 Taylor 的雇员的名字和部门名 称;
Select last_name , department_name from employees em , departments de where     last_name = ‘Taylor’ and em.department_id = de.department_id;

多于两个表的连接

为了连接n个表,你最少需要n-1个连接条件。例:为了连接3个表,最少需要两 个连接;
(以hr用户中的employees、departments、locations表为例)

一、查询每个雇员的名字、岗位名称和工作地点;Select last_name , department_name , city from employees em , departments de ,  locations lo where em.department_id = de.department_id and de.location_id =   lo.location_id;
二、查询Taylor的雇员ID、部门名称和工作城市;Select last_name , employee_id , department_name , city from employees em , departments de , locations lo where last_name = ‘Taylor’ and em.department_id = de.department_id and de.location_id = lo.location_id;

四、非等值连接

一种不使用相等(=)作为连接条件的查询。如:!=、>、<、>=、<=、between and等都是非等连接的条件判断;
(以hr用户中的employees、job_grades表为例)

查询所有雇员的薪水级别;
Select em.last_name , em.salary , gr.gra from employees em , jog_grades gr where    em.salary between gr.lowest and gr.high;

五、自连接

使用一个表连接他自身的操作;
(以hr用户中的employees为例)

查询每个雇员的经理的名字以及雇员的名字;
select worker.last_name,manager.last_name from employees worker, employees  manager where worker.manager_id=manager.employee_id;

六、外连接

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

孤儿数据(orphan data)

被连接的列的值为空的数据;

外连接类型(SQL99)

左外(left outer join):包含左表的孤儿数据。
右外(right outer join):包含右表的孤儿数据;
全外(full outer join):包含俩个表中的孤儿数据;

SQL中的外连接

语法格式
用left outer join | right outer join | full outer join定义连接类型,用on()子句 创建连接条件;
左外连接(left outer join)
(以hr用户中的employees、departments表为例)

     查询雇员的名字以及他们所有的部门名称,包含那些没有部门的员工;Select em.last_name,de.department_name from employees em left outer join departments de on( em.department_id = de.department_id);

右外连接(right outer join)

(以hr用户中的employees、departments表为例)

     查询雇员的名字以及他们所有的部门名称,包含那些没有员工的部门;Select em.last_name, de.department_name from employees em right outer join departments de on( em.department_id = de.department_id);

全连接(full outer join)

(以hr用户中的employees、departments表为例)

     查询雇员的名字以及他们所有的部门名称,包含那些没有部门的员工和没有员工的部门;Select em.last_name, de.department_name from employees em full outer join departments de on( em.department_id = de.department_id);

Oracle扩展的外连接

通过在连接条件的后侧使用(+)来表示是否显示孤儿数据,有(+)表示不显示孤 儿数据而另一侧显示孤儿数据。但这种写法仅能在Oracle数据库中使用;
(以hr用户中的employees、departments表为例)

     查询雇员的名字以及他们所有的部门名称,包含那些没有部门的员工;            select em.last_name,de.department_name from employees em ,departments de where em.department_id=de.department_id(+);

(以hr用户中的employees、departments表为例)

     查询雇员的名字以及他们所有的部门名称,包含那些没有员工的部门;Select em.last_name,de.department_name from employees em,departments de where em.department_id(+) = de.department_id;

SQL99中的交叉连接(用处不大,产生笛卡尔乘积)

Cross join子句导致两个表的交叉乘积;
该连接和连个表之间的笛卡尔乘积是一样的;

(以hr用户中的employees、departments表为例)

     查询 Employees 表与 Departments 表的笛卡尔乘积。Select * from employees cross join departments;

SQL99中的自然连接(natural join)(不建议使用)

相当于等式连接的另一种写法,简化了等式连接的写法,性能相同;
Natural join子句基于两个表之间有相同名字的所有列;
从两个表中选择在所有的匹配列中有相等值的行;
如果有相同名字的列的数据类型不同,返回一个错误;
使用自然连接需要注意
如果做自然连接的两个表有多个字段都满足有相同名称和类型,那么他们 会被作为自然连接的条件;
如果自然连接的两个表仅是字段名称相同,但数据类型不同,将会返回一 个错误;
由于Oracle中可以进行这种非常简单的natural join,我们在设计表时对具 有相同含义的字段需要考虑到使用相同的名字和数据类型;
(以hr用户中的departments、locations表为例)

     查询部门ID,部门名称以及他们所在的城市;Select de.department_id , de.department_name , lo.city from locations lo natural join departments de ;

Using子句创建连接(using())

Using子句中可以指定多个列,但必须属于and关系;例:using(employee_id,name);
当有多个列匹配是,用using子句匹配唯一的列;
如果某列在using中使用,那么在引用该列时不要使用表名或别名;
Natural join 和 using 子句是互相排斥的;
(以hr用户中的departments、locations表为例)

     查询location_id为1800的部门名称以及他们所在的城市名称,指定location_id为连接列;Select de.department_name , lo.city from locations lo join departments de using(location_id) where location_id = 1800;

SQL中的内连接(inner join)

通过inner join 来建立两个表的连接,在内连接中使用inner join 作为表的连接,用on()子句给定连接条件。Inner join语句在性能上与其他语句没有区别;
在用内连接做等值连接的时候,可以用using()子句来代替on子句;
(以hr用户中的employees、departments、locations表为例)

查询雇员 id 为 202 的雇员名字,部门名称,以及工作的城市。

1.等值连接
Select em.last_name,de.department_name,lo.city from employees em , departments de , locations lo where em.employee_id = 202 and em.department_id = de.department_id and de.location_id = lo.location_id;
2.内连接(Inner join)
Select em.last_name,de.department_name,lo.city from employees em inner join departments de on( em.department_id = de.department_id) inner join locations lo on( de.location_id = lo.location_id) where em.employee_id = 202;
3.在内连接中使用using子句定义等值连接
Select em.last_name,de.department_name,lo.city from employees em inner join department de using(department_id) inner join locations lo using(location_id) where em.employee_id = 202;

SQL语言之多表查询(oracle)相关推荐

  1. Oracle和sql语言,SQL语言的四种类型和ORACLE运算符

    数据定义语言(DDL) 数据操作语言(DML) 数据控制语言(DCL) 事务控制语言(TCL) Data Definition Language(DDL) DDL使我们有能力创建或删除表格.也可以定义 ...

  2. SQL 语句的多表查询方式

    SQL 语句的多表查询方式 例如:按照 department_id 查询 employees(员工表)和 departments(部门表) 的信息. 方式一(通用型): SELECT ... FROM ...

  3. Apache Drill介绍-SQL语句和系统表查询

    Apache Drill介绍-SQL语句和系统表查询 Apache Drill 主要用于查询,主要关注select 和 建表语句,Drill 支持select 很标准, 这次主要介绍create语句, ...

  4. 在EXCEL中使用SQL语言对工作表进行操作

    选中第一份表格右键,选择定义名,第二份表也如此. 选择菜单中的"数据",再选"其他来源",再选最后一个,从MICROSOFT QUERY 再在弹出的窗口选择EX ...

  5. 金仓数据库 KingbaseES SQL 语言参考手册 (10. 查询和子查询)

    10. 查询和子查询 本章描述SQL查询以及子查询.包含以下章节: 关于查询和子查询 创建简单查询 层次查询 集合操作 查询结果排序 JOIN操作 使用子查询 限制嵌套查询层数 DUAL表查询 10. ...

  6. oracle去重差个数,多表查询 - Oracle 查询技巧与优化_数据库技术_Linux公社-Linux系统门户网站...

    前言 上一篇blog介绍了Oracle中的单表查询和排序的相关技巧,本篇blog继续介绍查询中用的最多的--多表查询的技巧与优化方式,下面依旧通过一次例子看一个最简单的多表查询. 多表查询 上一篇中提 ...

  7. sql 相加_SQL多表查询

    一.表的加法 相加就是用union把两个select语句相加,会去重:如果需要保留重复的行,用union all就可以了 二.表的联结 联结的几种类型: 1.交叉联结 2.内联结 3.左联结 4.右联 ...

  8. mysql多表查询sql语句怎么写_MySQL基本SQL语句之单表查询、多表查询和子查询

    一.简单查询: 基本语法: SELECT * FROM tb_name;查询全部 SELECT field1,field2 FROM tb_name; 投影 SELECT [DISTINCT] * F ...

  9. 修改 连接层_Mybatis连接池_动态sql语句_多表查询实现

    Mybatis连接池 Mybatis中的连接池Mybatis连接池提供了3种方式的配置:配置的位置:主配置文件SqlMapConfig.xml中的dataSource标签,type属性就是表示采用何种 ...

最新文章

  1. PAT甲级真题 1018 A+B in Hogwarts--python解法
  2. 像素颜色JavaFX示例--简易图片处理工具
  3. linux学习笔记-第一课-linux的历史,安装linux,远程连接
  4. Spring FactoryBean的开发1
  5. 在vue中使用express-mock搭建mock服务
  6. 三分钟完全了解PyTorch中卷积层内部计算方法和权值初始值的来历,让你对模型有更深层次的理解
  7. Eclipse 基于接口编程的时候,快速跳转到实现类的方法(图文)
  8. 华为电脑c盘哪些文件可以删除,c盘可以删除哪些文件
  9. matlab矩阵排序sort,MATLAB数组元素的排序
  10. ardl模型stata命令_计量经济学《手把手教你EViews软件操作教程与案例分析》
  11. 密码算法测试向量——Cipher MAC SM4
  12. Android渲染时间 太长,Android性能优化之渲染篇
  13. Win10 系统一天蓝屏好多次,怎么解决?
  14. zipimport.ZipImportError: can't decompress data
  15. 汉字编码中区位码、国标码和机内码的区别
  16. 卷积神经网络(CNN)的参数优化方法
  17. 自动驾驶感知——毫米波雷达
  18. android 记录血糖的折线图_画画血糖曲线图,你还可稳血糖!快试试
  19. $.ajax({});的各个参数的理解
  20. 隐私保护学习笔记(privacy protection reading list)

热门文章

  1. VS打开文件,解决方案资源管理器自动定位到文件位置
  2. Laravel5.1 搭建博客 --文章的增删改查
  3. sturst2的原理及环境搭建
  4. WinCE开发初探——开发环境
  5. AB1601定时器timer0,timer1简介
  6. Hyperledger Fabric 智能合约实战 (7) windows安装fabric
  7. 《图解密码技术》分组密码(1) 概览
  8. BUU--[MRCTF2020]PixelShooter
  9. python的异常处理机制
  10. 基于Warshall算法的连通图及欧拉图判定方法