oracle02--多表关联查询
1. 多表(关联)查询
多表查询也称之为关联查询、多表关联查询等,主要是指通过多个表的关联来获取数据的一种方式。
1.1. 多表映射关系

一对多:A表的一行数据,对应B表中的多条。如:一个部门可以对应多个员工.
多对一:B表中的多条对应A表的一行数据.如:多个员工对应一个部门.
多对多:学生和选修课表----学生和课程对应表。

一对一:人员基本信息和人员信息扩展表。

1.2. 笛卡尔集

笛卡尔集对于我们数据库的数据查询结果的影响:
1. 数据冗余。---笛卡尔集并不是我们所需要的数据.
2. 效率问题:导致数量级的增长。100w *100w,====》1w亿。如果你在查询大量数据的时候,不注意这个笛卡尔集的话,会导致你的查询结果时间非常非常非常长,还会导致数据库故障。
因此,在实际运行环境下,应避免使用全笛卡尔集。
笛卡尔集产生的条件:
l 省略连接条件
l 连接条件无效
如下示例:

语句一结果3,语句二结果2,
语句三,无论是加无效连接条件,还是不加条件,结果都是2*3=6,这是由于笛卡尔积的问题,所以要使用有效的连接条件;
如何避免笛卡尔集:
在 WHERE 加入有效的连接条件。
这时候就需要学习表关联的几种方式了。
1.3. 多表连接的类型
根据连接方式的不同,Oracle的多表关联的类型分为:
内连接、外连接、自连接。
内连接分为:等值内连接、不等值内连接
外连接分为:左外连接、右外连接、全外连接
自连接是一种特殊的关联,可以包含内连接和外连接的连接方式。
1.4. 关于sql99-了解
Oracle是关系型数据库,它遵的规范(sql规范)。
但是,mysql和Oracle有些地方不一样,原因:各个厂商的实现可能会有差别。

Sql99 是为了 统一规范多个关系型数据库的通用语法的
1.5. 多表连接的基本语法
Sql99的语法:

Oracle的语法:


sql语句 优化:
加上前缀:效率高!
1.6. 内连接

1.6.1. 等值内连接
等值内连接也称之为等值连接。
--需求:查询一下员工信息,并且显示其部门名称
SELECT * FROM emp t1,dept t2 WHERE t1.deptno=t2.deptno;
--等值内连接,数据库的私有扩展语法:隐式内连接(mysql,oracle都支持) SELECT * FROM emp t1 INNER JOIN dept t2 ON t1.deptno=t2.deptno;
--sql99语法,显示内连接(所有符合sql99规范的都支持)
注意:INNER 可以省略
1.6.2. 不等值内连接
不等值内连接也称之为不等值连接。
--分析:要完成这个需求,需要使用到下面两张表:
--需求:查询员工信息,要求显示员工的编号、姓名、月薪、工资级别。
SELECT * FROM emp t1,salgrade t2 WHERE t1.sal >=t2.losal AND t1.sal<=t2.hisal; --隐式语法 SELECT * FROM emp INNER JOIN salgrade ON emp.sal >=salgrade.losal AND emp.sal <=salgrade.hisal --sql99
1.6.3. 表的别名
为什么要使用表的别名?
l 使用别名可以简化查询。
l 使用表名前缀可以提高执行效率。--SQL性能优化方案
在不同表中具有相同列名的列,可以用表的别名作为前缀来加以区分。

需要注意的是,如果一旦使用了表的别名,则不能再使用表的真名。

1.6.4. 更多表的连接

1.7. 外连接
分为左外连接,右外连接,全外连接(oracle特有 mysql没有)。

注意:单表查询与多表查询的区别:单表查询只显示一个表中的数据,而多表查询一般会显示多个表中的数据
至于显示是全部字段还是部分字段,决定于select后面查询的内容;
就像左外链接查询和只查询左表的区别:左外链接显示的是两表内容,而查询左表值显示左表内容
1.7.1. 左外连接
--查询"所有"员工信息,要求显示员工号,姓名 ,和部门名称--要求使用左外连接
SELECT * FROM emp t1 LEFT OUTER JOIN dept t2 ON t1.deptno=t2.deptno; --sql99标准语法 SELECT * FROM emp t1,dept t2 WHERE t1.deptno=t2.deptno(+);
--oracle私有语法(mysql不支持),+放到右边是左外,你可以认为(+)是附加补充的意思。
--要求查询所有的信息的表,我们可以称之为主表,而补充信息的表,称之为从表
注意:外连接的outer可以省略(包括左,右,全连接);
1.7.2. 右外连接

---查询所有部门及其下属的员工的信息。--右外连接
SELECT * FROM emp t1 RIGHT OUTER JOIN dept t2 ON t1.deptno=t2.deptno;
--sql99--右外连接--右边表(dept)数据全部显示。 SELECT * FROM emp t1,dept t2 WHERE t1.deptno(+)=t2.deptno;--oracle语法,右外连接
1.7.3. 如何选择左外和右外

--1.到底是使用左外还是右外,主要是看两张表的在语句中的位置,
--两张表是有主从关系,一般把主表放在左边,----一般两张表的情况下,我们都使用左连接.
SELECT t1.*,t2.* FROM dept t1 ,emp t2 WHERE t1.deptno=t2.deptno(+); --2.+到底是放在条件哪边?左外连接的+放在右边,右外连接的+放在左边.
----记忆的方法:(+)放在从表的一方,起到数据附加的作用. 简单的说:左外连接就是左边的表的数据全部显示,右外就是右边的表的数据全部显示。
注意:这种(+)的写法,只能用在Oracle。不能用于mysql!
一定要有主表和从表这个概念,分清那张是主表,哪张是从表。
把你想查询基础表当成左表。想把谁全部都查询出来就当成主表。
到底哪张是主表哪张是从表?最终还看你的需求。
一般我们把主表放在左边,使用左外连接。
一般情况下,我们就用左连接就行了。
1.7.4. 全外连接

左表和右表的数据全部都显示,而且不是笛卡尔集。相当于左外+右外的数据。
【示例】
需求:要求将所有员工和所有部门都显示出来
--全外连接
SELECT * FROM emp t1 LEFT OUTER JOIN dept t2 on t1.deptno=t2.deptno
UNION -- union 去重
SELECT * FROM emp t1 RIGHT JOIN dept t2 ON t1.deptno=t2.deptno; SELECT empno, ename ,dname FROM emp LEFT JOIN dept ON emp.deptno= dept.deptno
UNION ALL --union all 不去重
SELECT empno, ename ,dname FROM emp right JOIN dept ON emp.deptno= dept.deptno; --sql99 SELECT * FROM emp t1 FULL OUTER JOIN dept t2 ON t1.deptno=t2.deptno; -- full 去重
--sql99语法,Oracle没有私有扩展的语法。而且,mysql没有全外(mysql只能使用前两种方式,没有第三种方式)
1.8. 自连接
自连接,就是将一张表当成两张表来查询。
1.8.1. 示例

自连接的查询的原理:就是将一张表当成两张表来使用.
【示例】
1.查询员工信息,要求同时显示员工和员工的领导的姓名
2.查询“所有”员工信息,要求同时显示员工和员工的领导的姓名
--查询员工信息,要求同时显示员工和员工的领导的姓名
SELECT * FROM emp t1,emp t2 WHERE t1.mgr=t2.empno;
--查询“所有”员工信息,要求同时显示员工和员工的领导的姓名
SELECT * FROM emp t1,emp t2 WHERE t1.mgr=t2.empno(+);
实质:自连接实质上也是一种特殊的多表连接方式,可以使用内连接和外连接的操作.
注意问题:你也要注意笛卡尔集的产生.

oracle02--多表关联查询的更多相关文章
- MSSQL N张表关联查询
declare @newTime varchar(50); declare @lasetTime varchar(50); set @newTime= getdate(); set @lasetTim ...
- RDIFramework.NET 中多表关联查询分页实例
RDIFramework.NET 中多表关联查询分页实例 RDIFramework.NET,基于.NET的快速信息化系统开发.整合框架,给用户和开发者最佳的.Net框架部署方案.该框架以SOA范式作为 ...
- 图解SQL多表关联查询
图解SQL多表关联查询 网上看了篇文章关于多表连接的,感觉很好,记录下来,以便日后自己学习 内连接 左连接 右连接 全外连接 1. 查两表关联列相等的数据 ...
- Oracle 数据库(oracle Database)Select 多表关联查询方式
Oracle数据库中Select语句语法及介绍 SELECT [ ALL | DISTINCT ] <字段表达式1[,<字段表达式2[,…] FROM <表名1>,<表名 ...
- ORACLE数据库多表关联查询效率问题解决方案
最近在做项目中遇到多表关联查询排序的效率问题(5张以上40W+数据的表),查询一次大概要20多秒,经过一番苦思冥想,处理方案如下: 1.软件设计初期,需要一对一关联的表应该设计在一张大表里,这样虽然字 ...
- mongodb操作之使用javaScript实现多表关联查询
一.数据控制 mongodb操作数据量控制,千万控制好,不要因为操作的数据量过多而导致失败. 演示一下发生此类错误的错误提示:
- ofbiz学习笔记01--多表关联查询
不管做什么项目,肯定会用到多表关联查询数据,从网络查询得知ofbiz有三种多表关联查询方法 实现一:Screem.xml 中的 section 里,加 <action>, 加 get-re ...
- JAVA入门[9]-mybatis多表关联查询
概要 本节要实现的是多表关联查询的简单demo.场景是根据id查询某商品分类信息,并展示该分类下的商品列表. 一.Mysql测试数据 新建表Category(商品分类)和Product(商品),并插入 ...
- MyBatis 多表关联查询
多表关联查询 一对多 单条SQL实现. //根据部门编号查询出部门和部门成员姓名public dept selectAll() thorws Excatipon; //接口的抽象方法 下面是对应接口的 ...
- MyBatis学习总结(三)——多表关联查询与动态SQL
在上一章中我们学习了<MyBatis学习总结(二)——MyBatis核心配置文件与输入输出映射>,这一章主要是介绍一对一关联查询.一对多关联查询与动态SQL等内容. 一.多表关联查询 表与 ...
随机推荐
- poj 3254(状态压缩DP)
poj 3254(状态压缩DP) 题意:一个矩阵里有很多格子,每个格子有两种状态,可以放牧和不可以放牧,可以放牧用1表示,否则用0表示,在这块牧场放牛,要求两个相邻的方格不能同时放牛,即牛与牛不能相 ...
- 初入码田--ASP.NET MVC4 Web应用开发之二 实现简单的增删改查
初入码田--ASP.NET MVC4 Web应用之创建一个空白的MVC应用程序 初入码田--ASP.NET MVC4 Web应用开发之一 实现简单的登录 2016-07-29 一.创建M002Adm ...
- javascript 进阶篇1 正则表达式,cookie管理,userData
首先,什么事正则表达式呢,其实引入概念很多时候并不能帮我们明白它到底是什么,所以我先简单描述下,正则表达式,其实就是一个记录字符串规则则的字符串,等我们看完这一部分,也就能明白它到底是什么了. 基本语 ...
- 【Java并发编程】之五:volatile变量修饰符—意料之外的问题
volatile用处说明 在JDK1.2之前,Java的内存模型实现总是从主存(即共享内存)读取变量,是不需要进行特别的注意的.而随着JVM的成熟和优化,现在在多线程环境下volatile关键字的 ...
- STL 算法中函数对象和谓词
STL 算法中函数对象和谓词 函数对象和谓词定义 函数对象: 重载函数调用操作符的类,其对象常称为函数对象(function object),即它们是行为类似函数的对象.一个类对象,表现出一个函数的特 ...
- 【LaTex】随便学学,
教程 http://blog.csdn.net/u014803202/article/details/50410748 一个数学公式编辑器 http://latex.91maths.com/
- 【BZOJ4035】数组游戏(博弈论)
[BZOJ4035]数组游戏(博弈论) 题面 BZOJ 洛谷 题解 很明显是一个翻硬币游戏的变形,因此当前局面的\(SG\)函数值就是所有白格子单独存在的\(SG\)函数的异或和. 那么,对于每一个位 ...
- Beta 反(tu)思(cao) && 获小黄衫感言
写在前面 终于要结束了...我的心情就像走在沙漠中的人看到了一片绿洲一样,身体很疲惫,心情是自由自在~ 这是一篇总结反思的博客 (为了附加分),顺便把早该写的获小黄衫感言一起发了. Beta 反思 做 ...
- 【poj2127】 Greatest Common Increasing Subsequence
http://poj.org/problem?id=2127 (题目链接) 题意 计算两个序列$a$和&b$的最长公共上升子序列. Solution 爸爸的$n^3$算法莫名其妙RE了,不爽之 ...
- Apache+tomcat配置动静分离(一个apache一个tomcat,没有做集群)
1. 下载apache http server,tomcat,mok_jk.so apache下载地址:http://httpd.apache.org/download.cgi tomcat下载地址: ...