多表联合查询:需要获取的数据分布在多张表中

SQL92:

  1. --笛卡尔积:将多个表的数据进行一一对应,所得的结果为多表的笛卡尔积
  2. select * from emp;
  3. select * from dept;
  4. select * from emp,dept;--进行全排列 14*5=70

  1. --等值连接:先笛卡尔积,然后筛选,筛选条件为等值筛选
  2. --查询员工的姓名,工作,薪资,部门名称
  3. --可直接在select子句中使用字段获取数据,但效率低,建议字段前明确表名
  4. select ename,job,sal,dname from emp,dept where emp.deptno=dept.deptno;--效率低
  5. --两张表存在的公众字段,必须明确表名:emp.deptno=dept.deptno
  6. select emp.ename,emp.job,emp.sal,dept.dname from emp,dept where emp.deptno=dept.deptno;--效率高
  7. --给表添加别名(推荐)
  8. select e.ename,e.job,e.sal,d.dname
  9. from emp e,dept d
  10. where e.deptno=d.deptno;

  1. --查询员工的姓名,工作,工资,工资等级
  2. select e.ename,e.job,e.sal,s.grade
  3. from emp e,salgrade s
  4. where e.sal>=s.losal and e.sal<=s.hisal;

  1. --自连接
  2. --查询员工的姓名,工作,薪资,及上级领导的姓名
  3. select e1.ename,e1.job,e1.sal,e2.ename
  4. from emp e1,emp e2
  5. where e1.mgr=e2.empno;
  6. ----------------下面SQL可详细查看到对应的领导姓名详情-------------------
  7. select e1.empno,e1.ename,e1.job,e1.sal,e1.mgr,e2.ename
  8. from emp e1,emp e2
  9. where e1.mgr=e2.empno;

外连接:左外连接&&右外连接

  1. --左外链接
  2. --查询员工的姓名,工作,薪资,部门名称及没有部门的员工信息(删除SMITH的部门编号测试)
  3. select e.ename,e.job,e.sal,d.dname
  4. from emp e,dept d
  5. where e.deptno=d.deptno(+);

  1. --右外连接
  2. --查询员工的姓名,工作,薪资,部门名称及没有员工的部门信息
  3. select e.ename,e.job,e.sal,d.dname
  4. from emp e,dept d
  5. where e.deptno(+)=d.deptno;

SQL99:
1:可给表添加别名
2:如果使用on或者usering关键字对结果进行筛选,必须使用inner join作为表与表的连接,其中inner可缺省
3:外连接的outer可缺省
4:依然可以使用分组,having,排序等。

  1. --笛卡尔积:使用关键字 cross join
  2. --select * from 表名1 cross join 表名2;
  3. select * from emp cross join dept;

  1. --筛选
  2. --自然连接:使用关键字 natural join
  3. --特点1:底层先笛卡尔积,然后按照所有同名同值字段自动进行等值筛选
  4. --查询员工的姓名,工作,薪资,部门名称
  5. select e.ename,e.job,e.sal,d.dname from emp e natural join dept d;

问题1:如果只想按照部分字段结束筛选?
解决1:使用using关键字
作用1:指明使用指定的字段对联合查询的结果进行等值筛选
注意1:指明字段必须是两表的同名同值字段
使用:select * from 表名 inner join 表名 using(字段名1,字段名2...);

  1. --查询员工的姓名,工作,薪资,部门名称
  2. select emp.ename,emp.job,emp.sal,dept.dname
  3. from emp
  4. inner join dept using(deptno);

问题2:如果按照字段名不同,但是值相同进行等值筛选?
解决2:使用on关键字进行自定义条件筛选(等值,不等值)
注意1:普通筛选条件使用where进行筛选,不要使用on。(增加SQL语句的阅读性)
使用:select 内容 from 表名 inner join 表名 on 连接条件 where 普通筛选条件;

  1. --查询员工的姓名,工作,薪资,部门名称并工资大于等于2000
  2. select emp.ename,emp.job,emp.sal,dept.dname
  3. from emp
  4. inner join dept
  5. on emp.deptno=dept.deptno where sal>=2000;

外链接
--左外连接:select 内容 from 表名 left outer join 表名 on 连接条件

  1. --查询员工的姓名,工作,薪资,部门名称及没有部门的员工信息(删除SMITH的部门编号测试)
  2. select e.ename,e.job,e.sal,d.dname
  3. from emp e
  4. left outer join dept d
  5. on e.deptno=d.deptno;


--右外连接:select 内容 from 表名 right outer join 表名 on 连接条件

  1. --查询员工的姓名,工作,薪资,部门名称及没有员工的部门信息
  2. select e.ename,e.job,e.sal,d.dname
  3. from emp e
  4. right outer join dept d
  5. on e.deptno=d.deptno;
  1. --全外连接:select 内容 from 表名 full outer join 表名 on 连接条件
  2. select e.ename,e.job,e.sal,d.dname
  3. from emp e
  4. full outer join dept d
  5. on e.deptno=d.deptno;
  1. --自链接:
  2. --查询员工的姓名,工作,薪资,及上级领导的姓名
  3. select e1.ename,e1.job,e1.sal,e2.ename
  4. from emp e1
  5. inner join emp e2
  6. on e1.mgr=e2.empno;

SQL92 && SQL99 详细比对:

  1. -------------------------------------------------- SQL92 && SQL99 详细比对 --------------------------------------------------
  2. --SQL92
  3. --笛卡尔积
  4. select * from emp,dept;--进行全排列
  5. --SQL99
  6. --笛卡尔积:使用关键字 cross join
  7. select * from emp cross join dept;
  8.  
  9. --SQL92
  10. --等值连接
  11. --查询员工的姓名,工作,薪资,部门名称
  12. select e.ename,e.job,e.sal,d.dname
  13. from emp e,dept d
  14. where e.deptno=d.deptno;
  15. --SQL99
  16. --自然连接:使用关键字 natural join
  17. --查询员工的姓名,工作,薪资,部门名称
  18. select e.ename,e.job,e.sal,d.dname
  19. from emp e
  20. natural join dept d;
  21. --查询员工的姓名,工作,薪资,部门名称
  22. select emp.ename,emp.job,emp.sal,dept.dname
  23. from emp
  24. inner join dept using(deptno);
  25.  
  26. --SQL92
  27. --不等值连接
  28. --查询员工的姓名,工作,工资,工资等级
  29. select e.ename,e.job,e.sal,s.grade
  30. from emp e,salgrade s
  31. where e.sal>=s.losal and e.sal<=s.hisal;
  32. --SQL99
  33. --查询员工的姓名,工作,工资,工资等级
  34. select e.ename,e.job,e.sal,s.grade
  35. from emp e
  36. natural join salgrade s
  37. where e.sal>=s.losal and e.sal<=s.hisal;
  38.  
  39. --SQL92
  40. --自连接
  41. --查询员工的姓名,工作,薪资,及上级领导的姓名
  42. select e1.ename,e1.job,e1.sal,e2.ename
  43. from emp e1,emp e2
  44. where e1.mgr=e2.empno;
  45. --SQL99
  46. --查询员工的姓名,工作,薪资,及上级领导的姓名
  47. select e1.ename,e1.job,e1.sal,e2.ename
  48. from emp e1
  49. inner join emp e2
  50. on e1.mgr=e2.empno;
  51.  
  52. --SQL92
  53. --左外链接
  54. --查询员工的姓名,工作,薪资,部门名称及没有部门的员工信息(删除SMITH的部门编号测试)
  55. select e.ename,e.job,e.sal,d.dname
  56. from emp e,dept d
  57. where e.deptno=d.deptno(+);
  58. --SQL99
  59. select e.ename,e.job,e.sal,d.dname
  60. from emp e
  61. left outer join dept d
  62. on e.deptno=d.deptno
  63.  
  64. --SQL92
  65. --右外连接
  66. --查询员工的姓名,工作,薪资,部门名称及没有员工的部门信息
  67. select e.ename,e.job,e.sal,d.dname
  68. from emp e,dept d
  69. where e.deptno(+)=d.deptno;
  70. --SQL99
  71. select e.ename,e.job,e.sal,d.dname
  72. from emp e
  73. right outer join dept d
  74. on e.deptno=d.deptno;
  75.  
  76. --SQL99
  77. --全外连接:select 内容 from 表名 full outer join 表名 on 连接条件
  78. select e.ename,e.job,e.sal,d.dname
  79. from emp e
  80. full outer join dept d
  81. on e.deptno=d.deptno;

SQL92 && SQL99 详细比对

Oracle【多表查询操作(SQL92&SQL99)】的更多相关文章

  1. Oracle锁表查询和解锁方法

    数据库操作语句的分类 DDL:数据库模式定义语言,关键字:create DML:数据操纵语言,关键字:Insert.delete.update DCL:数据库控制语言 ,关键字:grant.remov ...

  2. oracle锁表查询

    ORACLE EBS操作某一个FORM界面,或者后台数据库操作某一个表时发现一直出于"假死"状态,可能是该表被某一用户锁定,导致其他用户无法继续操作 复制代码代码如下: --锁表查 ...

  3. MySQL/MariaDB数据库的多表查询操作

    MySQL/MariaDB数据库的多表查询操作 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.单表查询小试牛刀 [root@node105.yinzhengjie.org.cn ...

  4. oracle系统表查询

    oracle查询用户下的所有表 select * from all_tab_comments -- 查询所有用户的表,视图等select * from user_tab_comments -- 查询本 ...

  5. 在MyBatis中查询数据、涉及多参数的数据访问操作、插入数据时获取数据自增长的id、关联表查询操作、动态SQL、关于配置MyBatis映射没有代码提示的解决方案

    1. 单元测试 在单元测试中,每个测试方法都需要执行相同的前置代码和后置代码,则可以自定义2个方法,分别在这2个方法中执行前置代码和后置代码,并为这2个方法添加@Before和@After注解,然后, ...

  6. oracle 字典表查询

    1.oracle 字典表查询 /*显示当前用户*/ show user 在sql plus中可用,在pl sql中不可用 /*查看所有用户名*/ select username,user_id,cre ...

  7. Oracle——多表查询

    本次预计讲解的知识点 1. 多表查询的操作.限制.笛卡尔积的问题: 2. 统计函数及分组统计的操作: 3. 子查询的操作,并且结合限定查询.数据排序.多表查询.统计查询一起完成各个复杂查询的操作: 一 ...

  8. oracle锁表查询,资源占用,连接会话,低效SQL等性能检查

    查询oracle用户名,机器名,锁表对象 select l.session_id sid, s.serial#, l.locked_mode, l.oracle_username, l.os_user ...

  9. Oracle 多表查询(1)

    一.基本概念 多表查询的语法如下: SELECT [DISTINCT] * | 字段 [别名] [,字段 [别名] ,…]FROM 表名称 [别名], [表名称 [别名] ,…][WHERE 条件(S ...

随机推荐

  1. Linux学习—redis安装配置及远程连接

    1.下载安装包并解压 进入文件夹/usr/local cd /usr/local 下载redis安装包: wget http://download.redis.io/releases/redis-.t ...

  2. Python 面向对象--继承,实现,依赖,关联,聚合,组合

    一. 继承 继承指的是子类继承父类除私有内容以外的其他所有内容, 并且子类具有增加自己新内容的能力. 举例说明: class Animal: print("吃是动物的本能") cl ...

  3. Spring Cloud health节点通过注册中心扫描状态的简单实现

    package com.zjs.web; import com.netflix.appinfo.InstanceInfo; import com.zjs.FallbackApiApplication; ...

  4. 【VS开发】修改窗口背景颜色大全

    如何修改frame窗口的背景颜色?  MDI窗口的客户区是由frame窗口拥有的另一个窗口覆盖的.为了改变frame窗口背景的颜色,只需要这个客户区的背景颜色就可以了.你必须自己处理WM_ERASEB ...

  5. D3 GEO应用专题(一):绘制旋转的3D地球

    https://gallery.echartsjs.com/explore.html#sort=rank~timeframe=all~author=all 雷达图 https://blog.csdn. ...

  6. Codeforces Round #581(Div. 2)

    Codeforces Round #581(Div. 2) CF 1204 A. BowWow and the Timetable 题解:发现,$4$的幂次的二进制就是一个$1$后面跟偶数个$0$. ...

  7. SQL中的DATENAME()函数

    SQL从时间字段值中获取年份使用DATENAME()函数. DATENAME()函数语法:DATENAME(param,date) date是时间字段名 或一个时间值 param是指定要返回日期部分的 ...

  8. 【LOJ】#2983. 「WC2019」数树

    LOJ2983. 「WC2019」数树 task0 有\(i\)条边一样答案就是\(y^{n - i}\) task1 这里有个避免容斥的方法,如果有\(i\)条边重复我们要算的是\(y^{n - i ...

  9. C++常用数据类型和Windows常见数据类型

    一.C++基本的内置类型 C++ 为程序员提供了种类丰富的内置数据类型和用户自定义的数据类型.下表列出了七种基本的 C++ 数据类型: 类型 关键字 布尔型 bool 字符型 char 整型 int ...

  10. Jmeter之HTTP配置元件

    前言:在测试一个项目中,HTTP请求的IP.协议和默认编码等大多数情况下都是相同的.线程之间会相互调用/请求Cookie...... 所以,推荐添加这四个配置元件在所有请求之前.(BadBoy录制的脚 ...