1.什么是连接查询?(B)

很多时候我们需要查询的数据并不是来源于同一张表,而是来源于多张表,而这种一个查询需要对多张表进行操作,就称为连接查询。

2.如何进行表的连接查询?

连接查询有两种方式:SQL 1992(1992年发布的标准) 和SQL 1999(1999年发布的标准)

3.SQL1992:(A)

3.1 语法:

SELECT table1.column, table2.column
FROM table1, table2
WHERE table1.column1 = table2.column2;

注:1.在 WHERE 子句中写入连接条件
2.在 WHERE 子句中写入连接条件当多个表中有重名列时,必须在列的名字前加上表名作为前缀(可使用表别名)

3.2 连接类型:

1.笛卡尔积 (表*表)
例: select * from emp,dept;
emp表中的每一条数据会分别与dept表的每一条数据连接
2.等值连接 (列=列)
例:查询员工的部门名称
select e.ename,d.dname from emp e,dept d where e.deptno = d.deptno
3.非等值连接 (列!=列)
--查询员工的薪水等级
select e.ename,s.grade from emp e,salgrade s where e.sal between s.losal and s.hisal
4.自连接 (表自己连接自己)
--查询员工上司的姓名:以"xxx的上司是xxx"方式显示
select e1.ename||'的上司是'|| e2.ename from emp e1,emp e2 where e1.mgr = e2.empno
5.外连接 (在满足一张表的内容都显示的基础上,连接另外一张表,如果连接匹配则正常显示,连接不匹配,另外一张表补null)
select e.ename,d.dname from emp e, dept d where e.deptno = d.deptno (+)
“(+)” 在等号右边,我们称这次查询为“左外连接查询”
“(+)” 在等号左边,我们成这次查询为“右外连接查询”
“(+)” 在等号哪一边,哪张表就补null

3.3SQL 1992 缺点:

1.表的连接条件和表的过滤条件都放在WHERE子句中,当条件过多时容易混淆
2.外连接的“左外连接查询”、“右外连接查询”不太容易辩别

4.SQL1999(A)

4.1 语法:

SELECT table1.column, table2.column FROM table1 连接类型 JOIN table2 ON 连接条件
在SQL1999 中弥补了SQL1992的缺点,使用 JOIN关键字 连接 ON关键字进行连接条件判断,WHERE进行过滤。并且外连接的“左外连接查询”、“右外连接查询”分别使用LEFT OUTER JOIN、RIGHT OUTER JOIN

4.2 连接类型:

1.CROSS JOIN 交叉连接(笛卡尔积)
select * from emp cross join dept

2.NATURAL JOIN 自然连接,找到两张表中具有相同名称列,进行等值连接
select * from emp natural join dept

3.INNER JOIN 内连接 (inner关键字可以省略)
--等值连接
select e.ename,d.dname from emp e INNER JOIN dept d on e.deptno = d.deptno where e.sal > 2000
--非等值连接
select e.ename,s.grade from emp e INNER JOIN salgrade s on e.sal between s.losal and s.hisal
--自连接
select e1.ename || '的上司是' || e2.ename from emp e1 INNER JOIN emp e2 on e1.mgr = e2.empno

--外连接(outer关键字可以省略)
4.LEFT OUTER JOIN
select * from emp e LEFT OUTER JOIN dept d on e.deptno = d.deptno
5.RIGHT OUTER JOIN
select * from emp e RIGHT OUTER JOIN dept d on e.deptno = d.deptno
6.FULL OUTER JOIN
select * from emp e FULL OUTER JOIN dept d on e.deptno = d.deptno

5.如何进行多表连接?(A)

例:

--SQL 1992
select e.ename, e.sal, d.dname, s.grade
from emp e, dept d, salgrade s
where e.deptno = d.deptno
and e.sal between s.losal and s.hisal --SQL 1999
select e.ename, e.sal, d.dname, s.grade
from emp e
join dept d
on e.deptno = d.deptno
join salgrade s
on e.sal between s.losal and s.hisal

6.子查询(A):

6.1 什么是子查询?

在SQL中允许多层嵌套。而子查询,即嵌套在其他查询中的查询。

理解子查询的关键在于把子查询当作一张表来看待。外层的语句可以把内嵌的子查询返回的结果当成一张表使用。
–子查询要用括号括起来
–将子查询放在比较运算符的右边(增强可读性)

6.2 子查询的种类(A)

1.在where中使用的子查询

--查询部门名称为RESEARCH、SALES
select *
from emp
where deptno in
(select deptno from dept where dname in ('RESEARCH', 'SALES'))
--查询有哪些人的薪水是在整个雇员的平均薪水之上的
select ename,empno, sal, sal+nvl(comm,0)
from emp
where sal+nvl(comm,0)>(select avg(sal+nvl(comm,0)) from emp);
--查在雇员中有哪些人是经理人
select empno, ename
from emp
where empno in (
select distinct mgr from emp
);
--找出部门编号为20的所有员工中收入最高的职员
select * from emp
where sal >= all(
select sal
from emp
where deptno = 20)
and
deptno = 20

2.在from后面使用子查询

--我们要求每个部门平均薪水的等级
select t1.deptno, t1.savg, s.grade
from (select deptno, avg(sal) savg from emp group by deptno) t1
join salgrade s
on t1.savg between s.losal and s.hisal --求每个部门薪水的平均等级
select t1.deptno, avg(t1.grade)
from (select e.deptno, s.grade
from emp e, salgrade s
where e.sal between s.losal and s.hisal) t1
group by t1.deptno

Oracle 连接查询的更多相关文章

  1. Oracle连接查询

    一.内连接和外连接    内连接用于返回满足连接条件的记录:而外连接则是内连接的扩展,它不仅会满足连接条件的记录,而且还会返回不满足连接条件的记录,语法如下: select table1.column ...

  2. oracle 连接查询,和(+)符号的用法

    --连接查询 左链接.右链接,全链接 --内链接select e.account 用户名, e.empname 名称, c.comname 公司名称  from employee e inner jo ...

  3. Oracle连接查询小结

    表TESTA,TESTB,TESTC,各有A, B两列 A B 001 10A 002 20A A B 001 10B 003 30B A B 001 10C 004 40C 连接分为两种:内连接与外 ...

  4. Oracle连接查询内容整理

    --内连接--select t.*,b.bumenmc from T_HQ_RYXX t,t_hq_bm b where t.bum = b.bumenbm--select * from t_hq_r ...

  5. 2014年1月24日 Oracle 连接查询与子查询

    1.乘积连接:   源表.源数据交叉链接,结果集数量为源数据之间的乘积 2.相等链接:   通过where关联几个数据源中的某一字段进行链接 3.自链接   自己链接自己 SSF A a1, A a2 ...

  6. Oracle学习笔记五 SQL命令(三):Group by、排序、连接查询、子查询、分页

    GROUP BY和HAVING子句 GROUP BY子句 用于将信息划分为更小的组每一组行返回针对该组的单个结果 --统计每个部门的人数: Select count(*) from emp group ...

  7. oracle(sql)基础篇系列(二)——多表连接查询、子查询、视图

        多表连接查询 内连接(inner join) 目的:将多张表中能通过链接谓词或者链接运算符连接起来的数据查询出来. 等值连接(join...on(...=...)) --选出雇员的名字和雇员所 ...

  8. oracle——外连接查询

    一.问题描述 有时我们为了保留某个表中的数据,而该表中的数据在另外一个关联表中未必都存在对应,此时就应该试用外连接查询. 比如:两个表,产品表和子产品表 注:子产品的parent_product_id ...

  9. 【学亮开讲】Oracle内外连接查询20181119

    --内连接查询 --需求:查询显示业主编号.业主名称.业主类型名称 select os.id 业主编号,os.name 业主名称,ot.name 业主类型名称 from t_owners os,t_o ...

随机推荐

  1. super()方法的使用

    如果在子类中也定义了构造器,既_init_()函数,那么基类的构造器该如何调用呢? 方法一.明确指定 使用一个子类的实例去调用基类的构造器,在子类的构造器中明确的指明调用基类的构造器. class C ...

  2. [ SSH框架 ] Struts2框架学习之四(自定义拦截器)

    一.Struts2的拦截器 1.1 拦截器概述 拦截器,在AOP( Aspect-Oriented Programming)中用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作.拦截 ...

  3. javascript中!=、!==、==、===操作符总结

    JavaScript 有两种比较方式:严格比较运算符和转换类型比较运算符. 在相等运算符中对应 === .!==和 ==.!=. 先举个栗子 var str = '1' var num0 = 0 va ...

  4. ionic常见问题及解决方案

    1.Android SDK install设置代理服务器mirrors.neusoft.edu.cn80force http 2.ionic build android 2.1 gradle下载不了解 ...

  5. wireshark使用方法

    抓取报文: 下载和安装好Wireshark之后,启动Wireshark并且在接口列表中选择接口名,然后开始在此接口上抓包.例如,如果想要在无线网络上抓取流量,点击无线接口.点击Capture Opti ...

  6. 并发容器之CopyOnWriteArraySet

    CopyOnWriteArraySet是基于CopyOnWriteArrayList实现的,其唯一的不同是在add时调用的是CopyOnWriteArrayList的addIfAbsent方法. 具体 ...

  7. Linux时间子系统之(六):POSIX timer

    专题文档汇总目录 Notes:首先讲解了POSIX timer的标识(唯一识别).POSIX Timer的组织(管理POSIX Timer).内核中如何抽象POSIX Timer:然后分析了POSIX ...

  8. python基础下的mysql学习之操作命令(一)

    E-R模型简介: 该模型应用于数据库设计中的概念结构设计阶段 E-entry,实体,是指设计的主体.对象等: R-relationship,关系,是指设计的主体之间的联系,关系也是一种数据: 一个实体 ...

  9. java某些基础知识点整理

    1. \n换行 \r回车 \"双引号 \\反斜杠 2.Java语言提供了八种基本类型.六种数字类型(四个整数型,两个浮点型),一种字符类型,还有一种布尔型. byte: byte 数据类型是 ...

  10. 【BZOJ 4016】 [FJOI2014]最短路径树问题

    题目链接: TP 题解:  我就是个智障.明明是道大水题,硬是拖了6h. 关于这道题我唯一想说的就是,记得更新拆分后的子树大小!!!我就是ZZ恒(QwQ. 代码: #define Troy 10/26 ...