多表查询

一、为什么使用多表连接

因为在实际系统中,一张表无法涵盖业务的所有信息,即使能,使用一张表来存储所有业务数据也会使数据变得难以维护,提高耦合性,失去可维护性。比如一个超市系统将会员表,库存表,进货表,售价表糅合成一张表,相信没有任何管理员愿意去使用这种表。

二、笛卡尔积

1.笛卡尔积是:
第一个表中的所有行和第二个表中的所有行都发生连接。
2.笛卡尔积在下列情况产生:
 (1)连接条件被省略;
 (2)连接条件是无效的;
3.为了避免笛卡尔积的产生,通常需要在WHERE子句中包含一个有效的连接条件。
4.笛卡尔积的写法:

SELECT EMP.EMPNO, EMP.ENAME, EMP.DEPTNO, DEPT.DEPTNO, DEPT.LOC
FROM EMP, DEPT;

三、连接查询

多表连接的写法

  1.分析要查询的列都来自于哪些表,构成FROM子句;
  2.分析这些表之间的关联关系,如果表之间没有直接关联关系,而是通过另一个中间表关联,则也要在FROM子句中补充中间关联表;
  3.接下来在WHERE子句中补充表之间的关联关系,通常N个表,至少要有N-1个关联关系;
  4.分析是否还有其它限制条件,补充到WHERE子句的表关联关系之后,作为限制条件;
  5.根据用户想要显示的信息,补充SELECT子句。
  6.分析是否有排序要求,如果排序要求中还涉及到其它表,则也要进行第2步补充排序字段所在的表,并且添加表之间的关联关系;

1.等值连接。两个表中的相同字段可以使用“=”进行连接,作为限制条件,不过要使用表名作为前缀

练习1
1-1写一个查询,显示所有员工姓名,部门编号,部门名称

SELECT ENAME,EMP.DEPTNO,DNAME
FROM EMP,DEPT
WHERE EMP.DEPTNO = DEPT.DEPTNO


1-2写一个查询,显示所有工作在CHICAGO并且奖金不为空的员工姓名,工作地点,奖金

SELECT ENAME,LOC,COMM
FROM EMP,DEPT
WHERE EMP.DEPTNO = DEPT.DEPTNO AND COMM IS NOT NULL AND LOC = 'CHICAGO'


1-3写一个查询,显示所有姓名中含有A字符的员工姓名,工作地点

SELECT ENAME,LOC
FROM EMP,DEPT
WHERE ENAME LIKE '%A%' AND EMP.DEPTNO = DEPT.DEPTNO

2.非等值连接。一边的数据对应到另一边的多个列形成的区间中

查询每个员工的姓名,工资,工资等级

SELECT ENAME,SAL,GRADE
FROM EMP,SALGRADE
WHERE EMP.SAL BETWEEN SALGRADE.LOSAL AND SALGRADE.HISAL


练习2
查询每个员工的编号,姓名,工资,工资等级,所在工作城市,按照工资等级进行升序排序

SELECT EMPNO, ENAME, SAL, GRADE, LOC
FROM DEPT,SALGRADE,EMP
WHERE EMP.SAL BETWEEN SALGRADE.LOSAL AND SALGRADE.HISAL AND EMP.DEPTNO = DEPT.DEPTNO
ORDER BY GRADE

3.外部链接。为符号(+)所在边的表增加空行,用于和另一边的表中所有不满足连接条件的行进行连接

查询所有部门及所有员工,包括没有员工的部门

SELECT EMP.ENAME, DEPT.DEPTNO,DEPT.DNAME
FROM EMP, DEPT
WHERE EMP.DEPTNO(+) = DEPT.DEPTNO

4.自身连接。也叫自连接,是一个表通过某种条件和本身进行连接的一种方式,就如同多个表连接一样

查询每个员工的姓名和直接上级姓名

SELECT WORKER.ENAME||' leader is '||MANAGER.ENAME
FROM    EMP WORKER, EMP MANAGER
WHERE   WORKER.MGR = MANAGER.EMPNO(+);


练习3
3-1查询所有工作在NEW YORK和CHICAGO的员工姓名,员工编号,以及他们的经理姓名,经理编号。

SELECT WORKER.ENAME,WORKER.EMPNO,MANAGER.ENAME AS MGRNAME,MANAGER.EMPNO AS MGRNO
FROM EMP WORKER, EMP MANAGER, DEPT
WHERE WORKER.MGR = MANAGER.EMPNO AND DEPT.DEPTNO = WORKER.DEPTNO AND DEPT.LOC IN ('NEW YORK','CHICAGO')


3-2第上一题的基础上,添加没有经理的员工King,并按照员工编号排序。

SELECT WORKER.ENAME,WORKER.EMPNO,MANAGER.ENAME AS MGRNAME,MANAGER.EMPNO AS MGRNO
FROM EMP WORKER, EMP MANAGER, DEPT
WHERE WORKER.MGR = MANAGER.EMPNO(+) AND DEPT.DEPTNO = WORKER.DEPTNO AND DEPT.LOC IN ('NEW YORK','CHICAGO')
ORDER BY WORKER.EMPNO


3-3查询所有员工编号,姓名,部门名称,包括没有员工的部门也要显示出来。

SELECT EMPNO,ENAME,DNAME
FROM EMP,DEPT
WHERE EMP.DEPTNO(+) = DEPT.DEPTNO

四、另外补充一下,oracle支持ANNSI-99写法

ANNSI-99是ANSI标准提供的写法,所有关系型数据库必须支持

Oracles数据库学习笔记(三)多表查询相关推荐

  1. 数据库学习笔记6--MySQL多表查询之外键、表连接、子查询、索引

    本章主要内容: 一.外键 二.表连接 三.子查询 四.索引 一.外键: 1.什么是外键 2.外键语法 3.外键的条件 4.添加外键 5.删除外键 1.什么是外键: 主键:是唯一标识一条记录,不能有重复 ...

  2. php多表查询 例子,thinkphp学习笔记之多表查询

    在操作过程中,两表查询都没有问题,但是三表查询就开始出现问题 有以下三张表,分表为pl表(uid,content),user表(id,username),lyb表(uid,title) 多表查询操作有 ...

  3. mysql学习笔记14 多表查询初步

    对数据分组的总结 举例:统计各个部门的平均工资,并且是大于1000的,并且按照平均工资从高到底排序 mysql> select avg(stsal) as myavgsal, stdepno f ...

  4. MySQL数据库学习(6) -- 表查询关键词

    前期表准备 # 如果cmd窗口展示数据时,窗口最大,展示数据的虚表仍有错位,应使用 \G 分行显示 select * from t1\G;# 个别电脑在插入中文的时候会出现乱码或者空白的现象,可以将字 ...

  5. 三、MySQL子查询学习笔记(标量子查询、列子查询、行子查询、表子查询 详解)

    三.MySQL子查询学习笔记 7:子查询 含义: 一条查询语句中又嵌套了另一条完整的select语句,其中被嵌套的select语句,称为子查询或内查询:在外面的查询语句,称为主查询或外查询 分类: 一 ...

  6. MySQL数据库学习笔记(九)----JDBC的ResultSet接口(查询操作)、PreparedStatement接口重构增删改查(含SQL注入的解释)...

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...

  7. MySQL学习笔记(三)查询

    写在前面:本篇为作者自学总结,学习内容为课堂所学和网络学习笔记汇总,对于内容引用部分在文中和文末注明. 文章仅供参考,如需深入了解,请查阅MySQL参考手册.附上下载链接: 链接:https://pa ...

  8. 数据库学习笔记第三弹——MySQL常用的图形化管理辅助工具及相关问题(图文详解2022))

    数据库学习笔记第三弹--MySQL常用的图形化管理辅助工具(图文详解2022) 文章目录 数据库学习笔记第三弹--MySQL常用的图形化管理辅助工具(图文详解2022) 1.MySQL常用的图形化管理 ...

  9. 研一寒假MySQL数据库学习笔记(三)

    研一寒假MySQL数据库学习笔记(三) 本节记录数据库高级查询部分的内容,整理于此便于之后回顾. 1. 上一节补充内容 1.1 案例练习 现在有一个员工表.部门表,两张表之间是一个部门多个员工,一个员 ...

最新文章

  1. linux下安装QQ
  2. Centos 6.8安装Python3.7
  3. percentiles of live data capture
  4. 解决标签回车后产生的空格
  5. 4.2.1 路由算法与路由协议概述(静态路由和动态路由---距离-向量路由算法---链路状态路由算法、层次路由)
  6. Linux RHCS中心跳网络接口的指定
  7. pythonflask configlist.py_Python+Flask.0004.FLASK配置管理之三种方式加载外部配置
  8. 电脑主板跳线_DIY电脑主板的跳线安装及排序规则
  9. java optional_JAVA Optional总结
  10. linux svn删除目录命令,删除目录下的所有.svn版本库目录_CentOS
  11. li下的ul----多级列表
  12. 时间序列分析python课程论文_python时间序列分析
  13. mysql编译安装原理_Mysql源码编译安装主从复制
  14. 64位win7连接32位xp的共享打印机HP Laserjet P1008
  15. 网易云音乐android变臃肿,网易云音乐版权少,为什么用户还能突破8亿??
  16. 台电p10hd拆解_台电X19HD玩家拆机报告
  17. 毕业实习感想—软件测试
  18. 一个无需软件加密文件夹的bat(批处理)文件的分析
  19. WinMerge:一个免费开源的文件对比神器
  20. c语言switch不可以用枚举,化解一个误区,其实switch和enum是能够很方便配合使用的...

热门文章

  1. (Win10+vs2017)配置OpenCV开发环境
  2. java-IO流-在文件中数据内容的插入问题
  3. Python 求一元二次方程的根(包括虚根)
  4. python_循环语句for_1.12
  5. python怎么爬虎牙_Python爬虫:爬取虎牙星秀主播图片
  6. R语言使用lightgbm包构建多分类的LightGBM模型、caret包的confusionMatrix函数输出多分类混淆矩阵(包含:准确率及其置信区、p值、Kappa、特异度、灵敏度等)
  7. 小程序sketch_第2部分sketch3d设计应用程序
  8. OA协同办公系统 公共事务设置
  9. jupyter notebook出现DLL load failed while importing _multiarray_umath: 找不到指定的模块
  10. 双模控制器很耗电_电动车双模控制器什么意思