Oracle查询总结

-------------------------------多表查询--------------------------------------

--笛卡尔积查询.
select * from emp,dept;--结果为64条,emp表有14条,dept表有4条
--别名查询
--改变查询后的结果显示的列名,在字段后面写要显示的列名(注意一定要用双引号括起来,oracle查询中之后这里用到双引号!)
select ename "name" ,loc "地点" from emp e ,dept d where e.deptno = d.deptno;

--查询出雇员的编号,姓名,部门的编号和名称,地址
select * from emp;
select * from dept;
select e.empno  "雇员编号",
       e.ename  "姓名",
       e.deptno "部门的编号",
       d.dname  "部门名称",
       d.loc    "部门地址"from emp e,
       dept   d where e.deptno = d.deptno;--当字段名唯一时,字段前的别名可以省略
select empno  "雇员编号",
      ename  "姓名",
      e.deptno "部门的编号",--当两张表中都有该字段时,字段前的别名一定不能省略
      dname  "部门名称",
      loc    "部门地址"from emp e,
      dept     d where e.deptno = d.deptno;

--查询出每个员工的上级领导
select e1.mgr,e1.ename , e2.empno, e2.ename
  from emp e1, emp e2
 where e1.mgr = e2.empno ;

--在上面的查询基础上查询该员工的部门名称
select e1.mgr,e1.ename , e2.empno, e2.ename,d.dname
  from emp e1, emp e2,dept d
 where e1.mgr = e2.empno and e1.deptno = d.deptno;

--查出每个员工编号,姓名,部门名称,工资等级和他的上级领导的姓名,工资等级
select * from salgrade;
select * from emp;

select e1.mgr,
       e1.sal,
       e1.ename,
       decode(g1.grade,
              1,
              ‘一等‘,
              2,
              ‘二等‘,
              3,
              ‘三等‘,
              4,
              ‘四等‘,
              5,
              ‘五等‘) "员工工资等级",
       e2.empno,
       e2.sal,
       e2.ename,
       decode(g2.grade,
              1,
              ‘一等‘,
              2,
              ‘二等‘,
              3,
              ‘三等‘,
              4,
              ‘四等‘,
              5,
              ‘五等‘) "领导工资等级"
  from emp      e1, --员工表
       emp      e2, --领导表
       salgrade g1, --员工工资等级
       salgrade g2 --领导工资等级
 where e1.mgr = e2.empno
   and e1.sal between g1.losal and g1.hisal
   and e2.sal between g2.losal and g2.hisal;

----------------------------外连接(左右连接)---------------------------
--查询所有部门下的员工

select * from emp;
select * from dept;
select e.ename, e.deptno, d.dname
  from emp e,--非全量表,因为在emp表中没有40对应的部门编号
  dept d--全量表 dept表中有所有的部门编号
 where e.deptno(+) = d.deptno;--(+)是oracle特有的表示左连接或者有链接的符号,
                               --(+)添加在非全量表中(那个表中少,就添加到那个表中)
select e.ename, e.deptno, d.dname
  from emp e
 right join dept d
    on e.deptno = d.deptno; --右连接实现
select e.ename, e.deptno, d.dname
  from dept d
  left join emp e
    on e.deptno = d.deptno; --左连接实现
--查询出比雇员7654的工资高,同时从事和7788的工作一样的员工
select *
  from emp e
 where sal > (select sal from emp where empno = 7654)
   and job = (select job from emp where empno = 7788);
<br>--------------------------子查询--------------------------<br>
--查询出每个部门的最低工资和最低工资的雇员和部门名称
select ename, sal, e.deptno,d.dname
  from emp e,
   (select deptno, min(sal) minsal from emp group by deptno) a,
   dept d
 where e.sal = a.minsal and e.deptno = d.deptno;

---------------------分页功能--------------------
rowid:--是每行数据指向磁盘的物理地址
rownum:--查询时每行数据上贴的序号
select e.*, rownum,rowid from emp e ;
--查询员工表中工资最高的前三名
select t.*, rownum
  from (select e.* from emp e order by sal desc) t
 where rownum < 4;
--查询4,5,6的工资排名的员工
select t2.*
  from (select t.*, rownum r
          from (select e.* from emp e order by sal desc) t
         where rownum < 7) t2
 where r > 3;

 select t2.*
  from (select t.*, rownum r
          from (select e.* from emp e order by sal desc) t
         ) t2
 where r > 3 and r < 7;

 --------------------------行转列------------------------------
 --统计每年入职的员工个数
 select to_char(hiredate,‘yyyy‘), count(*) from emp group by to_char(hiredate,‘yyyy‘);

 decode(列名,值,显示数据) --
 别名

 select sum(counts) "Total",
         sum(decode(years,‘1980‘,counts)) "1980",
         sum(decode(years,‘1982‘,counts)) "1982",
         sum(decode(years,‘1981‘,counts)) "1981",
         sum(decode(years,‘1987‘,counts)) "1987"
   from
   (select to_char(hiredate,‘yyyy‘) years, count(*) counts from emp group by to_char(hiredate, ‘yyyy‘));
---子查询的总结
   --子查询可以返回单行单列值
   --子查询可以返回多行多列值
   --子查询可以返回多行多列值(当成子表使用)
   --子查询可以提高查询效率

 ------------------exists的用法------------
 select * from 表名 where exists (子查询)
 exists(子查询) 如果子查询没有结果,exists(子查询)返回false
 exists(子查询) 如果子查询有结果,exists(子查询)返回true
 --查询没有员工的部门
 select * from dept d where not exists(select * from emp e where e.deptno = d.deptno )

 -----------------------------集合运算---------------------------------
 并集
 交集
 补集
 --查询工资大于1500或者是20号部门下的员工
 select * from emp where sal > 1500
 union -- 并集
 select * from emp where deptno = 20 ;
 select * from emp where sal > 1500 or deptno = 20;
 --查询工资大于1500并且是20号部门下的员工
 select * from emp where sal > 1500
 intersect -- 交集
 select * from emp where deptno = 20 ;
 select * from emp where sal > 1500 and deptno = 20;
 --查询1981年入职的员工,不包括经理和总裁
 select * from emp where to_char(hiredate,‘yyyy‘)=‘1981‘
 minus -- 补集
 select * from emp where job=‘MANAGER‘ or job = ‘PRESIDENT‘
 --如果两个查询结果对应的列数和数据类型都一样,就可以用集合运算

 ----------------递归查询(oracle独有)---------------------
 select * from 表名
 start with 条件1
 connect by prior 条件2
 --查询7566号员工的所有下属
 select * from emp
 start with empno=7566
 connect by prior empno=mgr
时间: 2024-10-09 23:29:15

Oracle查询总结的相关文章

oracle查询转换_inlist转换

oracle的optimizer会对一些sql语句进行查询转换,比如: 合并视图 子查询非嵌套化 inlist转换 下面讲讲遇到的in list转化优化的案例: create table test( col1 varchar2(12) col2 number ext varchar2(4000) ); create index test_ind on test(user_id, col2); create sequence seq_test cache 200; 第一步:准备一些测试数据(10个

oracle查询转换_view merge

oracle对于子查询的支持做的很好,oracle optimizer会对inline view进行query transfomation,即视图合并,不过也经常带来意想不到的问题.下面是一个inline view的merge的例子: 1, 创建临时表 1 create table test1 as select * from dba_objects; 2 create table test2 as select * from dba_objects; 2, 以下查询语句 select * fr

45个非常有用的 Oracle 查询语句小结

 这里我们介绍的是 40+ 个非常有用的 Oracle 查询语句,主要涵盖了日期操作,获取服务器信息,获取执行状态,计算数据库大小等等方面的查询.这些是所有 Oracle 开发者都必备的技能,所以快快收藏吧. 原文地址:http://www.jbxue.com/db/19890.html 日期/时间 相关查询 1.获取当前月份的第一天 运行这个命令能快速返回当前月份的第一天.你可以用任何的日期值替换 "SYSDATE"来指定查询的日期. 复制代码代码如下: SELECT TRUNC

Oracle查询被锁的表及进程的方法

Oracle查询可以有多种方法,下面为您介绍的是如何Oracle查询被锁的表及Oracle查询连接的进程的方法,希望对您能够有所帮助. 一.查看被锁的表 select p.spid,a.serial#, c.object_name,b.session_id,b.oracle_username,b.os_user_name from v$process p,v$session a, v$locked_object b,all_objects c where p.addr=a.paddr and a

45 个非常有用的 Oracle 查询语句

这里我们介绍的是 40+ 个非常有用的 Oracle 查询语句,主要涵盖了日期操作,获取服务器信息,获取执行状态,计算数据库大小等等方面的查询.这些是所有 Oracle 开发者都必备的技能,所以快快收藏吧! 日期/时间 相关查询 获取当前月份的第一天 运行这个命令能快速返回当前月份的第一天.你可以用任何的日期值替换 "SYSDATE"来指定查询的日期. ? 1 2 SELECT TRUNC (SYSDATE, 'MONTH') "First day of current mo

转,Oracle中关于处理小数点位数的几个函数,取小数位数,Oracle查询函数

关于处理小数点位数的几个oracle函数() 1. 取四舍五入的几位小数 select round(1.2345, 3) from dual; 结果:1.235 2. 保留两位小数,只舍 select trunc(1.2345, 2) from dual; 结果:1.23 select trunc(1.2399, 2) from dual; 结果:1.23 3.取整数 返回大于或等于x的最大整数: SQL> select ceil(23.33) from dual; 结果: 24 返回等于或小于

ORACLE查询并删除重复记录

查询及删除重复记录的SQL语句 1.查找表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断select * from peoplewhere peopleId in (select   peopleId from   people group by   peopleId having count(peopleId) > 1) 2.删除表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断,只留有rowid最小的记录delete from people where

ORACLE查询数据库的锁表情况

  查询数据库的锁表情况语句如下: SELECT p.spid,a.serial#, c.object_name,b.session_id,b.oracle_username,b.os_user_name FROM v$process p,v$session a, v$locked_object b,all_objects c WHERE p.addr=a.paddr AND a.process=b.process AND c.object_id=b.object_id 如果表因为某些情况出现死

oracle查询所有用户表的表名、主键名称、索引、外键等

1.查找表的所有索引(包括索引名,类型,构成列): select t.*,i.index_type from user_ind_columns t,user_indexes i where t.index_name = i.index_name and t.table_name = i.table_name and t.table_name = 要查询的表 2.查找表的主键(包括名称,构成列): select cu.* from user_cons_columns cu, user_constr