Oracle数据库-多表联合查询&子查询

多表联合查询

当需要获取的数据分布在多张中,考虑使用联合查询
1、SQL92方式
2、SQL99方式

SQL92方式

1、笛卡尔积:将多个表的数据进行一一对应,所得到结果为多表的笛卡尔积。
  结果的数量为所有表的数量的乘积。
  select * from emp,dept 
2、等值连接筛选
  概念:先做表的笛卡尔积,然后筛选,筛选条件为等值筛选。
  注意:条件为字段的值相同来进行筛选,字段的名字可以不同
  查询员工姓名,工作,薪资,部门名称
  select * from emp,dept where emp.deptno=dept.deptno
    可以直接在select子句中使用字段直接获取数据,但是效率比较低。建议字段前加上表名
    注意:如果是公共字段,则必须声明表名
    select ename,job,sal,dname from emp,dept where emp.deptno=dept.deptno--等值连接筛选
    select emp.ename,emp.job,emp.sal,dept.dname,emp.deptno 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 and sal>2000--给表使用别名
3、不等值连接
  查询员工姓名,工作,工资,工资等级
  select * from emp e,salgrade s where e.sal>=s.losal and e.sal<=s.hisal
4、自连接(自己与自己做笛卡尔积)
  查询员工姓名,工作,薪资,及上级领导姓名
  select e1.ename,e1.job,e1.sal,e2.ename from emp e1,emp e2 where e1.mgr=e2.empno
5、外连接
  左外连接:加在右边,显示左边对应字段没有值的数据
    查询员工姓名,工作,薪资,部门名称及没有部门的员工信息
    select * from emp e,dept d where e.deptno=d.deptno(+)
  右外连接:加在左边,显示右边对应字段没有值的数据
    查询员工姓名,工作,薪资,部门名称及没有员工信息的部门
    select * from emp e,dept d where e.deptno(+)=d.deptno

SQL99方式

注意1:依然可以给表添加别名
注意2:如果使用on或者usering关键字对结果进行筛选,必须使用inner join作用表与表的连接,其中inner可以省略
注意3:外连接的 outer关键字可以省略不写
注意4:依然可以继续使用分组,having ,排序等
1、笛卡尔积:使用cross join 关键字
  select 内容 from 表名 cross join
  select * from emp cross join dept
2、筛选
  查询员工姓名,工作,薪资,部门名称
  1)自然连接:使用关键字 natural join
    使用:select 内容 from 表名 natural join 表名
    特点1:底层先笛卡尔积,然后按照所有的同名同值字段自动进行等值筛选。
    问题1:如果只想按照部分字段结果筛选怎么办?
    问题2:如果想按照字段名不同,但是值相同进行等值筛选怎么办?
    select * from emp natural join dept
    解决1:使用using关键字
      作用1:指明使用指定的字段对联合查询的结果进行等值筛选
      注意:指明的字段必须是两表的同名同值字段
      使用:select 内容 from 表名 inner join 表名 using(字段名,字段名,....)
      select * from emp inner join dept using(deptno)
    解决2:使用on关键字进行自定义连接条件筛选(等值筛选,不等值筛选)
      注意:普通筛选条件使用where进行筛选,不要使用on进行。好处:SQL语句的阅读性变强。
      使用:select 内容 from 表名 inner join 表名 on 连接条件 where 普通筛选条件
      select * from emp inner join dept on emp.deptno=dept.deptno where sal>2000
  2)外连接:
    左外连接:select 内容 from 表名 left outer join 表名 on 连接条件
      查询员工姓名,工作,薪资,部门名称及没有部门的员工信息
      select * from emp e left outer join dept d on e.deptno=d.deptno
    右外连接:select 内容 from 表名 right outer join 表名 on 连接条件
      查询员工姓名,工作,薪资,部门名称及没有员工的部门信息
      select * from emp e right outer  join dept d on e.deptno=d.deptno
    全外连接:select 内容 from 表名 full outer join 表名 on 连接条件
      select * from emp e full  outer join dept d on e.deptno=d.deptno
  3)自连接:
    查询员工及其上级领导姓名
    select  e1.*,e2.ename from emp e1 inner join emp e2 on e1.mgr=e2.empno

三表联合查询

SQL92实现

特点:易于书写,难于阅读
缺点:92的SQL语句结构不清晰
用法:
  select  内容 (别名,连接符,去除重复,oracle函数,逻辑运算)
  from  表名1,表名2,表名3...
  where  条件(连接条件,普通筛选条件,where子句关键字)
  group by 分组字段
  having 多行函数筛选
  order by 排序字段
查询员工信息及部门名称及所在城市名称并且员工的工资大于2000或者有奖金
  select e.*,d.dname,c.cname
  from emp e,dept d,city c
  where (e.deptno=d.deptno and d.loc=c.cid and sal>2000) or (e.deptno=d.deptno and d.loc=c.cid and comm is not null)
  order by e.sal

SQL99实现

特点:难于书写,易于阅读
用法:
  select 内容 from 表名1
  inner join 表名2
  on 连接条件
  inner join 表名3
  on 连接条件
  where  普通筛选条件
  group by 分组
  having 多行函数筛选
  order by 排序
查询员工信息及部门名称及所在城市名称并且员工的工资大于2000或者有奖金
  select * from emp e
  inner join dept d
  on e.deptno = d.deptno
  inner join city c
  on d.loc =c.cid
  where e.sal>2000 or e.comm is not null
  order by e.sal

子查询

使用时机:当查询的筛选条件不明确时,考虑使用子查询。
1、单行子查询
2、多行子查询

单行子查询

使用时机:筛选条件不明确需要执行一次查询,并且查询结果为一个字段并值只有一个
注意:where子句中允许出现查询语句,该查询语句称为子查询
使用:select 内容 from 表名 where 字段名 比较运算符 子查询语句
  查询所有比雇员“CLARK”工资高的员工信息
  select * from emp where sal>(select sal from emp where ename =‘CLARK‘)
  查询工资高于平均工资的员工的名字和工资
  select ename,sal from emp where sal>(select avg(sal) from emp )
  查询和soctt属于同一部门且工资比他低的员工资料
  select * from emp where deptno=(select deptno from emp where ename=‘SCOTT‘) and sal<(select sal from emp where ename=‘SCOTT‘)
  查询职务和scott相同,雇佣时间早的员工信息
  select * from emp where job=(select job from emp where ename=‘SCOTT‘) and hiredate <(select hiredate from emp where ename=‘SCOTT‘)

多行子查询

使用:子查询的结果只有一个字段但是字段有n个值,考虑使用多行子查询,其实就是使用关键字
关键字1:any 任意
    select 内容 from 表名 where 字段名 比较运算符 any 子查询语句
关键字2:all 所有
    select 内容 from 表名 where 字段名 比较运算符 all 子查询语句
关键字3:in 表示任意存在,相当于 = any 
    select 内容 from 表名 where 字段名 in 子查询语句  
    select 内容 from 表名 where 字段名 not in 子查询语句  
  查询工资高于任意一个CLERK的所有员工信息
  select * from  emp where sal> any (select sal from emp where job=‘CLERK‘)
  查询工资高于所有SALESMAN的员工信息
  select * from emp where sal> all (select sal from emp where job=‘SALESMAN‘)
  查询部门20中同部门10的雇员工作一样的雇员信息
  select job from emp where deptno=10
  select * from emp where job  in (select job from emp where deptno=10) and deptno=20
  select * from emp where job = any (select job from emp where deptno=10) and deptno=20

原文地址:https://www.cnblogs.com/sunny-sml/p/11980388.html

时间: 2024-10-08 21:20:12

Oracle数据库-多表联合查询&子查询的相关文章

数据库 day60,61 Oracle入门,单行函数,多表查询,子查询,事物处理,约束,rownum分页,视图,序列,索引

1.    oracle介绍 ORACLE数据库系统是美国ORACLE公司(甲骨文)提供的以分布式数据库为核心的一组软件产品,是目前最流行的客户/服务器(CLIENT/SERVER)或B/S体系结构的数据库之一.比如SilverStream就是基于数据库的一种中间件.ORACLE数据库是目前世界上使用最为广泛的数据库管理系统,作为一个通用的数据库系统,它具有完整的数据管理功能:作为一个关系数据库,它是一个完备关系的产品:作为分布式数据库它实现了分布式处理功能.但它的所有知识,只要在一种机型上学习

ORACLE 多表连接与子查询

Oracle表连接 SQL/Oracle使用表连接从多个表中查询数据 语法格式: select 字段列表from table1,table2where table1.column1=table2.column2; 说明: 在where子句中指定连接条件 当被连接的多个表中存在同名字段时,必须在该字段前加上"表名"作为前缀. 连接的类型 Oracle8i之前的表连接: 等值连接(Equijoin) 非等值连接(Non-Equijoin) 外连接(Outer join):-->左外连

Oracle系列:(14)子查询

子查询的作用:查询条件未知的事物 查询条件已知的问题:例如:查询工资为800的员工信息 查询条件未知的问题:例如:查询工资为20号部门平均工资的员工信息 一个条件未知的问题,可以分解为多个条件已知的问题 查询工资比WARD高的员工信息 第一:查询WARD的工资?       select sal from emp where ename = 'WARD'; 第二:查询工资比1250高的员工信息?       select * from emp where sal > 1250; 子查询: sel

Oracle学习(6):子查询

子查询 为何要用子查询 SQL> --查询工资比SCOTT高的员工信息 SQL> --1. 知道SCOTT的工资 SQL> select sal from emp where ename='SCOTT'; SAL ---------- 3000 SQL> --2. 查询比3000高的员工 SQL> set linesize 120 SQL> col sal for 9999 SQL> select * from emp where sal>3000; EMP

结合真实的测试实例,记录一次SQL语句辅助功能测试的场景(包含多表联查及子查询)

本文结合实例讲解一下 SQL 语句通过数据库辅助进行功能测试.希望阅读本文的小伙伴,能通过这个场景实例体会到SQL 语句在真实的功能测试时起到的作用 本次功能测试涉及的sql 知识点如下: 1 SELECT 查询 2 where 子句 3 count() 4 to_char() 5 group by 6 order by 7 两表联查(这里涉及left join) 8 子查询嵌套 实例中的需求文档 : 系统的测试界面:(不好意思,写文章的时候,想去截一个好一点的图片,测试环境无法登录了) 前提解

MSSQL 4表联查,子查询,函数统计,分组条件查询综合应用实例

1 SELECT 2 [UserName] 3 ,[Yhxm] 4 ,[Qx] 5 ,[Phone] 6 ,[Number] = COUNT([UserName]) 7 FROM 8 (SELECT 9 [UserName] = A.[username] 10 ,[Yhxm] = B.[xm] 11 ,[Qx] = D.[P_Power] 12 ,[Phone] = B.[dh] 13 ,[DayCount] = (SELECT COUNT(*) FROM [Caihuashun_FuJian_

单表查询: where group by 分组 having distinct 去重 order by 排序 limit 多表查询 子查询 连表查询

今日内容 表查询 单表查询: where group by 分组 having distinct 去重 order by 排序 limit 多表查询 子查询 连表查询 单表查询 前期表准备 create table emp( id int not null unique auto_increment, name varchar(20) not null, sex enum('male','female') not null default 'male', #大部分是男的 age int(3) u

Oracle 数据库整理表碎片

Oracle 数据库整理表碎片 转载:http://kyle.xlau.org/posts/table-fragmentation.html 表碎片的来源 当针对一个表的删除操作很多时,表会产生大量碎片.删除操作释放的空间不会被插入操作立即重用,甚至永远也不会被重用. 怎样确定是否有表碎片 -- 收集表统计信息 SQL> exec dbms_stats.gather_table_stats(ownname=>'SCHEMA_NAME',tabname=> 'TABLE_NAME'); -

SQL复杂查询(子查询)

USE STUDY SELECT * from EMP SELECT * FROM SALGRADE --1.查询雇员姓名,所在部门编号和名称 SELECT ename,EMP.deptno,DEPT.deptno FROM EMP INNER JOIN DEPT ON DEPT.deptno =EMP.deptno --2.查询雇员姓名,工作,领导的姓名 SELECT e1.ename,e1.job,e2.ename FROM EMP e1 INNER JOIN EMP e2 on e1.mg