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

SQL92:

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

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

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

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

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

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

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

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

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

 --筛选
--自然连接:使用关键字 natural join
--特点1:底层先笛卡尔积,然后按照所有同名同值字段自动进行等值筛选
--查询员工的姓名,工作,薪资,部门名称
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...);

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

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

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

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

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


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

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

SQL92 && SQL99 详细比对:

 -------------------------------------------------- SQL92 && SQL99 详细比对 --------------------------------------------------
--SQL92
--笛卡尔积
select * from emp,dept;--进行全排列
--SQL99
--笛卡尔积:使用关键字 cross join
select * from emp cross join dept; --SQL92
--等值连接
--查询员工的姓名,工作,薪资,部门名称
select e.ename,e.job,e.sal,d.dname
from emp e,dept d
where e.deptno=d.deptno;
--SQL99
--自然连接:使用关键字 natural join
--查询员工的姓名,工作,薪资,部门名称
select e.ename,e.job,e.sal,d.dname
from emp e
natural join dept d;
--查询员工的姓名,工作,薪资,部门名称
select emp.ename,emp.job,emp.sal,dept.dname
from emp
inner join dept using(deptno); --SQL92
--不等值连接
--查询员工的姓名,工作,工资,工资等级
select e.ename,e.job,e.sal,s.grade
from emp e,salgrade s
where e.sal>=s.losal and e.sal<=s.hisal;
--SQL99
--查询员工的姓名,工作,工资,工资等级
select e.ename,e.job,e.sal,s.grade
from emp e
natural join salgrade s
where e.sal>=s.losal and e.sal<=s.hisal; --SQL92
--自连接
--查询员工的姓名,工作,薪资,及上级领导的姓名
select e1.ename,e1.job,e1.sal,e2.ename
from emp e1,emp e2
where e1.mgr=e2.empno;
--SQL99
--查询员工的姓名,工作,薪资,及上级领导的姓名
select e1.ename,e1.job,e1.sal,e2.ename
from emp e1
inner join emp e2
on e1.mgr=e2.empno; --SQL92
--左外链接
--查询员工的姓名,工作,薪资,部门名称及没有部门的员工信息(删除SMITH的部门编号测试)
select e.ename,e.job,e.sal,d.dname
from emp e,dept d
where e.deptno=d.deptno(+);
--SQL99
select e.ename,e.job,e.sal,d.dname
from emp e
left outer join dept d
on e.deptno=d.deptno --SQL92
--右外连接
--查询员工的姓名,工作,薪资,部门名称及没有员工的部门信息
select e.ename,e.job,e.sal,d.dname
from emp e,dept d
where e.deptno(+)=d.deptno;
--SQL99
select e.ename,e.job,e.sal,d.dname
from emp e
right outer join dept d
on e.deptno=d.deptno; --SQL99
--全外连接:select 内容 from 表名 full outer join 表名 on 连接条件
select e.ename,e.job,e.sal,d.dname
from emp e
full outer join dept d
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. JAVA语言课堂测试01源代码(学生成绩管理系统)

    package 考试; /*信1807-8 * 20183798 * 向瑜 */ import java.util.Scanner; //ScoreInformation 类 class ScoreI ...

  2. K/3 Cloud 中FID和FMasterID的区别

    经常会用到,例如物料在多组织情况下. 例如一个物料分配不同组织后,内码FID肯定是不同的,但FMaterId还是一样的,因为是用一个物料. FMASTERID是和物料编码对应的内码,即一个物料编码对应 ...

  3. char、varchar、nchar、nvarchar四种类型

    char,nchar是定长,如果没达到指定的长度时将自动以英文空格在其后面填充.优势在于速度较高.varchar,nvarchar属于变长,如果没有达到指定的长度时,不会将自动以英文空格在其后面填充. ...

  4. *【Python】【demo实验26】【练习实例】【递归方法的使用】

    原题: 利用递归方法求5! 原题给出的解答: #!/usr/bin/python # encoding=utf-8 # -*- coding: UTF-8 -*- # 利用递归方法求5! def fa ...

  5. iis实现方向代理

    将请求的网址重写重定向到其它网址.当80端口被占用无法同时使用两个Web服务的解决方案,使得IIS和Apache Tomcat 共存 0|1环境 WindowServer 2008 IIS7 Apac ...

  6. redis 发布订阅、geo、bitmap、hyperloglog

    1.发布订阅 简介 发布订阅类似于广播功能.redis发布订阅包括 发布者.订阅者.Channel 命令 命令 作用 时间复杂度 subscribe channel 订阅一个频道 O(n) unsub ...

  7. Spring 循环依赖的三种方式(三级缓存解决Set循环依赖问题)

    本篇文章解决以下问题: [1] . Spring循环依赖指的是什么? [2] . Spring能解决哪种情况的循环依赖?不能解决哪种情况? [3] . Spring能解决的循环依赖原理(三级缓存) 一 ...

  8. php链接redis (带密码)常用的redis方法

    连接redis $redis = new Redis(); $redis->connect($host, $port); $redis->auth('my pass'); //密码验证 常 ...

  9. 基于全备份+binlog方式恢复数据

    基于全备份+binlog方式恢复数据 将bkxt从库的全备份在rescs5上恢复一份,用cmdb操作 恢复全备后执行如下操作 set global read_only=OFF; stop slave; ...

  10. python设计购物车

    设计购物车 一需求: 1.启动程序后,输入用户名密码后,如果是第一次登录,让用户输入工资,然后打印商品列表 2.允许用户根据商品编号购买商品 3.用户选择商品后,检测余额是否够,够就直接扣款,不够就提 ...