记得自己要敲o~~~

select * from bonus;
select * from salgrade;
select 1+1 from dual;
--笛卡尔积:两张表的乘积
select * from emp,dept; select * from emp e1,dept d1 where e1.deptno =d1.deptno; /*
内联接:
隐式内联接:
不等值内联接:where e1.deptno <> d1.deptno
自联接:自己连接自己
等值内联接: where e1.deptno = d1.deptno;
显示内联接:
select * from 表1 inner join 表2 链接条件 inner关键字可以省略
*/
select * from emp e1,dept d1 where e1.deptno <> d1.deptno; --查询员工编号,员工姓名,经理编号,经理的姓名 select e1.empno,e1.ename,e1.mgr,m1.ename
from emp e1,emp m1 where e1.mgr = m1.empno; --查询员工编号,员工姓名,员工的部门名称,经理的编号,经理的姓名
select e1.empno,e1.ename,e1.mgr,m1.ename,d1.dname
from emp e1,emp m1,dept d1 where e1.mgr = m1.empno and e1.deptno = d1.deptno; --查询员工编号,员工姓名,员工的部门名称,经理的编号,经理的姓名,经理的部门名称
select e1.empno,e1.ename,d1.dname,e1.mgr,m1.ename,d2.dname
from emp e1,emp m1,dept d1,dept d2
where e1.mgr = m1.empno
and e1.deptno = m1.deptno and d2.deptno = m1.deptno;
select * from dept;
select * from emp;
select * from salgrade; --查询员工编号,员工姓名,员工的部门名称,员工的工资等级,经理的编号,经理的姓名,经理的部门名称
select e1.empno,e1.ename,d1.dname,s1.grade,e1.mgr,m1.ename,d2.dname
from emp e1, emp m1,dept d1,dept d2,salgrade s1
where
e1.mgr= m1.empno
and e1.deptno = d1.deptno
and m1.deptno = d2.deptno
and e1.sal between s1.losal and s1.hisal ;
--查询员工编号,员工姓名,员工的部门名称,员工的工资等级,经理的编号,经理的姓名,经理的部门名称,经理的工资等级
select e1.empno,e1.ename,d1.dname,s1.grade,e1.mgr,m1.ename,d2.dname,s2.grade
from emp e1, emp m1,dept d1,dept d2,salgrade s1,salgrade s2
where
e1.mgr= m1.empno
and e1.deptno = d1.deptno
and m1.deptno = d2.deptno
and e1.sal between s1.losal and s1.hisal
and m1.sal between s2.losal and s2.hisal ;
--查询员工编号,员工姓名,员工的部门名称,员工的工资等级,经理的编号,经理的姓名,经理的部门名称,经理的工资等级
--将工资登记1,2,3,4显示成中文的一级二级,三级四级
select e1.empno,
e1.ename,
d1.dname,
case s1.grade
when 1 then '一级'
when 2 then '二级'
when 3 then '三级'
when 4 then '四级'
else
'五级'
end "等级",
e1.mgr,
m1.ename,
d2.dname,
decode(s2.grade,1,'一级',2,'二级',3,'三级',4,'四级','五级') "等级"
from emp e1, emp m1,dept d1,dept d2,salgrade s1,salgrade s2
where
e1.mgr= m1.empno
and e1.deptno = d1.deptno
and m1.deptno = d2.deptno
and e1.sal between s1.losal and s1.hisal
and m1.sal between s2.losal and s2.hisal ; --查询员工姓名和员工部门所处的位置
select e1.ename,e1.deptno from emp e1 ,dept d1 where e1.deptno = d1.deptno; select * from emp e1 inner join dept d1 on e1.deptno = d1.deptno; /*
外联接:(标准,通用写法)
左外联接:left outer join 左表中所有的记录,如果右表没有对应记录,就显示空
右外连接:right outer join 右表中所有的记录,如果左表没有对应记录,就显示空
outer 关键字可以省略
Oracle中的外连接:(+)实际上是没有对应的记录就加上空值
select * from emp e1,dept d1 where e1.deptno = d1.deptno(+); */
select * from emp e1 left outer join dept d1 on e1.deptno = d1.deptno;
insert into emp(empno,ename) values(9527,'HUAAN');
select * from emp e1,dept d1 where e1.deptno = d1.deptno(+);
select * from emp e1 right outer join dept d1 on e1.deptno = d1.deptno; select * from emp e1,dept d1 where e1.deptno(+) = d1.deptno; /*
子查询:查询语句中嵌套查询语句;用来解决复杂的查询语句
查询最高工资的员工的信息
单行子查询:> >= = < <= <> != 多行子查询: in not in >any >all exists not exists
查询领导信息
*/
--查询最高工资的员工信息
--1.查询最高工资
select max(sal) from emp ;
--2.工资等于最高工资
select * from emp where sal=(select max(sal) from emp); --查询出比雇员7654的工资高,同时和7788从事相同工作的员工信息
--1.雇员7654的工资 1250
select sal from emp where empno=7654; --2.7788从事的工作 ANALYST
select job from emp where empno= 7788;
select* from emp where
(select sal from emp where empno=7654)<sal and job=(select job from emp where empno= 7788); select * from emp where sal > (select sal from emp where empno = 7654) and job = (select job from emp where empno = 7788); --查询每个部门最低工资的员工信息和他所在的部门信息
--1.查询每个部门的最低工资,分组统计
select deptno, min(sal) minsal from emp group by deptno;
--2.员工工资等于他所处部门的最低工资
select * from emp e1,
(select deptno, min(sal) minsal from emp group by deptno)
t1 where e1.deptno = t1.deptno and e1.sal = t1.minsal; --3.查询部门相关信息
select *
from emp e1,
(select deptno,min(sal) minsal from emp group by deptno) t1,
dept d1
where e1.deptno = t1.deptno and e1.sal = t1.minsal and e1.deptno = d1.deptno;
/*
内联接,单行自查询,多行子查询 in
not in
any
all
exists 通常情况下,数据库中不要出现null,最好的做法是加上not null
null值并不代表不占用空间,char(100)null 100个字符
*/
--查询领导信息
--1.查询所有经理的编号
select mgr from emp;
select distinct mgr from emp;
--2.结果
select * from emp where empno in (select mgr from emp);
--查询不是领导的信息
select * from emp where empno not in (select mgr from emp);
select * from emp where empno <>all(select mgr from emp);
--正确写法
select * from emp where empno not in(select mgr from emp where mgr is not null);
--查询出比10号部门任意一个员工薪资高的员工信息 10 20 30
select * from emp where sal > any(select sal from emp where deptno=10);
--查询出比20号部门所有员工薪资高的员工信息 10 20 30
--1.20号最高工资 3000
select max(sal) from emp where deptno =20;
--2.员工信息
select * from emp;
--合并
select * from emp where sal > (select max(sal) from emp where deptno =20); -----使用多行子查询完成上面这题
--20号部门所有员工的薪资
select sal from emp where deptno = 20;
--大于集合所有的
select * from emp where sal > all(select sal from emp where deptno=20); /*
exists(查询语句):存在的意思,判断一张表里的记录是否存在于另外一张表中
当作布尔值来处理
当查询语句有结果的时候,就返回true;否则false;
数据量比较大的时候是非常高效的
*/
select * from emp where exists(select * from emp where deptno = 1234567);
select * from emp where 3=4; select * from emp where exists(select * from emp where deptno = 20); --查询有员工的部门的信息
select * from dept d1 where exists(select * from emp e1 where e1.deptno = d1.deptno ); --找到员工表中工资最高的前三名(降序排序)
select * from emp order by sal desc;
/*
rownum : 伪列 ,系统自动生成一列,用来表示行号
rownum是Oracle特有的用来表示行号,默认值/起始值是1,在每查询出结果之后,在添加1
rownum最好不能做大于号判断,可以做小于号判断 sql执行顺序
from .. where..group by..having..select ..rownum..order by
*/
select rownum ,e1.* from emp e1; --查询rownum大于2的所有记录
select rownum , e1.* from emp e1 where rownum>2;--没有任何记录
--查询rownum大于等于1的所有记录
select rownum , e1.* from emp e1 where rownum>=1;
--查询rownum < 6 的所有记录
select rownum,e1.* from emp e1 where rownum < 6;
--rownum 排序
select rownum ,e1.* from emp e1 order by sal; --找到员工表中工资最高的前三名
select rownum ,e1.* from emp e1 order by sal desc ;
--将上面的结果当作一张表处理,再查询
select rownum ,t1.* from (select rownum ,e1.* from emp e1 order by sal desc) t1; --只显示前三条记录
select rownum ,
t1.* from(select rownum ,e1.* from emp e1 order by sal desc) t1 where rownum<4; --找到员工表中薪水大于本部门平均薪水的员工
--1.分组统计部门平均薪水
select deptno, avg(sal) avgsal from emp group by deptno;
--2.员工工资 > 本部门平均工资
select * from emp e1,
(select deptno,avg(sal) avgsal from emp group by deptno) t1
where e1.sal>t1.avgsal and e1.deptno = t1.deptno; /*
关联子查询 , 非关联子查询
*/
select * from emp e where
sal > (select avg(sal) from emp e2 group by deptno having e.deptno=e2.deptno) /*
统计每年入职的员工个数
*/
select hiredate from emp;
--只显示年
select to_char(hiredate,'yyyy') from emp; --分组统计
select to_char(hiredate,'yyyy')yy,count(1) cc from emp group by to_char(hiredate,'yyyy'); select case yy when '' then cc end
from
(select to_char(hiredate,'yyyy') yy,count(1) cc from emp group by to_char(hiredate,'yyyy')) tt; select yy
from
(select to_char(hiredate,'yyyy') yy,count(1) cc from emp group by to_char(hiredate,'yyyy')) tt; select case yy when '' then cc end "1987"
from
(select to_char(hiredate,'yyyy') yy,count(1) cc from emp group by to_char(hiredate,'yyyy')) tt; select case yy when '' then cc end "1987"
from
(select to_char(hiredate,'yyyy') yy,count(1) cc from emp group by to_char(hiredate,'yyyy')) tt; --去除行记录中的空值
select sum(case yy when '' then cc end) "1987"
from
(select to_char(hiredate,'yyyy') yy,count(1) cc from emp group by to_char(hiredate,'yyyy')) tt; --统计员工的总数
select sum(cc) "TOTAL"
from
(select to_char(hiredate,'yyyy') yy,count(1) cc from emp group by to_char(hiredate,'yyyy')) --将1987 和TOTAL 合并在一起
select sum(cc) "TOTAL",
sum(case yy when '' then cc end)"1987"
from
(select to_char(hiredate,'yyyy') yy,count(1) cc from emp group by to_char(hiredate,'yyyy')) tt; --显示所有年份的结果
select
sum(cc) "TOTAL",
sum(case yy when '' then cc end) "1980",
sum(case yy when '' then cc end) "1981",
sum(case yy when '' then cc end) "1982",
sum(case yy when '' then cc end) "1987"
from
(select to_char(hiredate,'yyyy') yy,count(1) cc from emp group by to_char(hiredate,'yyyy')) tt; /*
rowid :伪列 每行记录所存放的真实物理地址
rownum :行号 每查询出记录之后,就会添加一个行号
*/
select rowid ,e.* from emp e; /*
rownum:分页查询
在Oracle中只能使用子查询来做分页查询
*/
select rownum, emp.* from emp;
select * from (select rownum hanghao ,emp.* from emp)tt
where tt.hanghao between 6 and 10; /*
集合运算:
并集:将两个查询结果进行合并
交集
差集 所有的查询结果可能不是来自同一张表
emp 2000年
2017年 手机 详细信息 emp2017
*/
--工资大于1500,或者20号部门下的员工
select * from emp where sal > 1500 or deptno = 20; --并集运算: union union all
/*
union:去除重复的,并且排序
union all:不会去除重复的
*/
select * from emp where sal>1500
union
select * from emp where deptno = 20; select * from emp where sal > 1500
union all
select * from emp where deptno = 20; /*
交集运算: intersect */
--工资大于1500,并且20号部门下的员工 select * from emp where sal>1500
intersect
select * from emp where deptno = 20; /*
差集运算: 两个结果相减
*/
--1981年入职员工(不包括总裁和经理)
--1981年入职员工
select * from emp where to_char(hiredate,'yyyy')= 1981;
--总裁和经理
select * from emp where job = 'PRESIDENT' or job = 'MANAGER'; select * from emp where to_char(hiredate,'yyyy')= 1981
minus
select * from emp where job = 'PRESIDENT' or job = 'MANAGER'; /*
集合运算中的注意事项
1.列的类型要一致
2.按照顺序写
3.列的数量要一致,如果不足,用空值填充
*/
select ename,sal from emp where sal > 1500
union
select ename,sal from emp where deptno = 20;

Oracle数据库多表查询,子查询,集合运算的更多相关文章

  1. Oracle 数据库基本操作——表操作:查询

    目录: 1.基本查询 2.多表查询 3.多行查询 4.集合查询 2.连接 3.嵌套查询 1.基本查询 语法: select column|others{,columnName|others} from ...

  2. Oracle 数据库基础学习 (六) 子查询

    子查询在一个select中出现多个嵌套查询语句 1.在where子句中使用子查询(一般返回"单行单列" "单行多列" "多行单列"(可以提供 ...

  3. Database学习 - mysql 数据库 多表/复合/子 查询

    多表查询 多表查询,基本规则,通过两表有关联字段的进行条件匹配查询 内连接查询 方式一: SELECT 查看字段名[,查看字段名] FROM 一表名,二表名 WHERE 一/二表.字段 = 一/二表. ...

  4. Oracle(2)之多表查询&子查询&集合运算

    多表查询 笛卡尔积 同时查询多张表时,每张表的每条数据都要和其它表的每条数据做组合.如下栗子,我们发现产生的总记录数是 56 条,还发现 emp 表是 14 条,dept 表是 4 条,56 条正是 ...

  5. oracle 基础SQL语句 多表查询 子查询 分页查询 合并查询 分组查询 group by having order by

    select语句学习 . 创建表 create table user(user varchar2(20), id int); . 查看执行某条命令花费的时间 set timing on: . 查看表的 ...

  6. 关于oracle数据库 跨表查询建立 视图的方法

    工作中很多时候都会遇到需要将两个不同的表空间甚至数据库的表进行联合查询或者建立视图的情况. 不同的表空间查询我们可以通过在将要查询的表前面加上 表空间的对应的用户名来实现,如有两个表空间分别对应两个用 ...

  7. oracle数据库单表查询

    今天给大家分享的是关于数据库的单表查询,像单表查询/多表查询/分组查询/子查询,这些方法的使用在实际项目过程中会经常用到,作为一名合格的测试人员如果不会数据库那肯定是不行的,行走江湖可能随时会面临被侮 ...

  8. [sql Server]除非另外还指定了TOP 或 FOR XML,否则,ORDER BY 子句在视图、内联函数、派生表、子查询和公用表表达式中无效

    今天遇到一个奇怪的问题,项目突然要从mysql切换到sql server数据库,包含order by 子句的嵌套子查询报错. 示例:select top 10 name,age,sex from ( ...

  9. 【知识库】-数据库_MySQL之基本数据查询:子查询、分组查询、模糊查询

    简书作者:seay 文章出处: 关系数据库SQL之基本数据查询:子查询.分组查询.模糊查询 回顾:[知识库]-数据库_MySQL常用SQL语句语法大全示例 Learn [已经过测试校验] 一.简单查询 ...

  10. Python-select 关键字 多表查询 子查询

    sql 最核心的查询语句!!!! 增删改 单表查询 select语句的完整写法 关键字的书写顺序 执行顺序 多表查询 笛卡尔积 内连接 左外连接 右外连接 全外连接 通过合并左外连接和右外连接 子查询 ...

随机推荐

  1. java多线程获取返回结果--Callable和Future示例

    package test.guyezhai.thread; import java.util.ArrayList; import java.util.Date; import java.util.Li ...

  2. [整理]ASP.NET vNext学习资源

    http://www.hanselman.com/blog/IntroducingASPNETVNext.aspx http://blogs.msdn.com/b/dotnet/archive/201 ...

  3. laravel更新某一个或几个字段

    //更新会员状态status $ary_where = array(); $ary_where[] = ['id', '=', $int_id]; $result = $this->obj_ad ...

  4. HDU 2058 The sum problem 数学题

    解题报告:可以说是一个纯数学题,要用到二元一次和二元二次解方程,我们假设[a,b]这个区间的所有的数的和是N,由此,我们可以得到以下公式: (b-a+1)*(a+b) / 2 = N;很显然,这是一个 ...

  5. CSS 实现单边阴影

    box-shadow: 0px -15px 10px -15px #111; 五个值分别为:x y blur spread color 将 spread 设置成 blur 的负值即可 这种只适用于 o ...

  6. 利用python编写不同环境下都能运行的测试脚本

    利用bash来获取当前电脑的环境变量,可以写一个.sh文件,里面获取当前环境,然后在调用python文件执行 # -*- coding: utf-8 -*- import logging import ...

  7. 20165230 《Java程序设计》实验一(Java开发环境的熟悉)实验报告

    20165230 <Java程序设计>实验一(Java开发环境的熟悉)实验报告 一.实验报告封面 课程:Java程序设计 班级:1652班 姓名:田坤烨 学号:20165230 成绩: 指 ...

  8. Virut样本取证特征

    1.网络特征 ant.trenz.pl ilo.brenz.pl 2.文件特征 通过对文件的定位,使用PEID查看文件区段,如果条件符合增加了7个随机字符区段的文件,则判定为受感染文件. 3.受感染特 ...

  9. C# 所生成项目的处理器架构“MSIL”与引用“Oracle.DataAccess, Version=4.112.3.0, Culture=neutral, PublicKeyToken=89b483f429c47342, processorArchitecture=x86”的处理器架构“x86”不匹配。这种不匹配可能会导致运行时失败。

    这个问题一般都是Oracle.DataAccess的版本不兼容问题造成的. 解决办法: 1.把Oracle.DataAccess.dll文件拿到C盘或D盘的安装文件的地方进行搜索. 2.会出现在pro ...

  10. linux系统iostat命令详解

    iostat  -k 3 5  (以KB为单位,每3秒统计一次,共统计5次) • avg-cpu: 总体cpu使用情况统计信息,对于多核cpu,这里为所有cpu的平均值    %user    用户空 ...