1.select [列名] from [表名] where [条件] group by [列名] having [条件] order by [列名]  的执行顺序。

在查询里面, 首先执行 from 来需要确定表,然后一条一条地遍历表数据;执行where语句把符合的表数据行筛选数来,也就得到了可以输出的数据;之后,将筛选出来的数据进行group by分组;之后用having来确定哪些数据不显示;之后,用orderby来对显示数据的数据进行排序。

------------------------------------------------------分割线------------------------------------------------

有如下的  工资表(雇员名称,所属部门,薪资,部门组长);

drop table salary_tbl;
create table salary_tbl(employer_nm varchar(20),department varchar(20) not null,salary number not null,leader_nm varchar(20)
);
truncate table salary_tbl;
beginfor i in  1..100loopinsert into salary_tbl values('雇佣者'||i,'部门'||Mod(i,6),100*POWER(10000,i*0.01),'雇佣者'||Mod(i,6)); end loop;
end;
/
commit;

写SQL一般先确定表和表之间的关联关系,然后列出筛选条件个数,例如,查询最高薪资的部门组长信息

①确认要查询的表为 salary_tbl   ② 筛选条件两个:要为部门组长,在组长里薪资最高

------查询薪资最高的部门组长-----
select * from salary_tbl s where
EMPLOYER_NM in (select distinct LEADER_NM from salary_tbl)  --条件1:部门组长信息确定
and salary =(select max(salary) from salary_tbl s where     --条件2: 薪资为部门组长里最高的
EMPLOYER_NM in (select distinct LEADER_NM from salary_tbl));

对于复杂的增删改语句中也是一样的思路,首先确定表和表之间的关联关系,确定要修改的字段,把筛选条件一一列举出来就可以思路清晰地实现了

2.集合运算 union(并集),minus(差集),intersect(交集)

Where 后面的条件筛选 也可以用集合运算来实现。

---------查询薪资低于150块钱部门组长信息(两次)---------
select s.* from (select * from salary_tbl where EMPLOYER_NM=leader_nm) s
minus
select * from salary_tbl where salary>=150       --部门组长表和薪资大于150的差集
UNION ALL                --不去重联合查询
select s3.* from
(select s.* from (select * from salary_tbl where EMPLOYER_NM=leader_nm) s
INTERSECT
select * from salary_tbl where salary<150) s3;   --部门组长表和薪资小于150的交集

3.  rownum 和 Rowid

rownum和rowid 在查询时都不是直接展示的。其中rownum即行标,在执行完SQL查询时后面添加上去的,所以每条数据的rownum根据不同的筛选条件是会变的,而rowId是由该数据行的物理地址信息所组成的字段。如果数据的物理位置没变,那么rowid也就不会变,当查询语句没跟order by时,默认按rowId排序。如图

当把rownum当做筛选条件时 只有 rownum < 或者 rownum <= 才能起效果,而大于,等于,不等于,between都不能有效的当做筛选条件。例如查询该表中的最后5行数据

---------------
select * from
(select salary_tbl.* ,rownum as row_num,rowID as row_id from salary_tbl) s
where s.row_num  between (select count(1) from salary_tbl )-5 and (select count(1) from salary_tbl);
----------------
select s.*,rownum from salary_tbl s
minus
select salary_tbl.*,rownum  from salary_tbl where rownum<
(select count(1) from salary_tbl )-5;

4. case when..then....else  和decode(value,if1,then1,if2,then2,if3,then3,...,else)

case when...then ..else  和decode 很像面向对象程序语言里的  if...elseif...elseif ..else 语句,但是decode里的 if条件只能用来判断相等,而不能直接的进行比大小。

select s.employer_nm,s.department,case when s.salary<1000 then '穷鬼'when salary<8000   then '正常'when salary <40000 then '牛逼'else '大佬'   end as 薪资水平,s.leader_nm from salary_tbl s
-----------
select s.employer_nm,s.department,decode(sign(salary-10000),1,'高',-1,'低','刚好一万元') as 薪资高低,s.leader_nm from salary_tbl s

5. 变量,行变量,游标

例子:下面是输出    查询表中的最后5行数据

declare max_num number;rowdata salary_tbl%rowtype;     --行类型变量type cur_type is ref cursor;    output1 cur_type ;              --游标v_sql varchar2(2000) :=''; begin select count(1) into max_num from salary_tbl;   -- 给变量赋值v_sql :='select s.employer_nm,s.department,s.salary,s.leader_nm from (select salary_tbl.*, rownum as row_num from salary_tbl) s where s.row_num  between '|| (max_num-5)||' and '||max_num;    --记得单词间的空格,不用加分号open output1 for v_sql;     LOOPfetch output1 into rowdata; exit when output1%notfound;dbms_output.put_line(rowdata.employer_nm || '|@|' ||rowdata.department  || '|@|' ||rowdata.salary      || '|@|' ||rowdata.leader_nm);END LOOP;            --循环输出end;

输出结果::

Oracle 原理:复杂的SQL语句相关推荐

  1. oracle 查看用户日志,Oracle查看用户操作sql语句以及数据库日志

    --查看日志文件 select member from v$logfile; --查看表空间使用情况 SELECT SUM(bytes) / (1024 * 1024) AS free_space, ...

  2. oracle笔记一(sql语句方面)

    oracle笔记一(sql语句方面) 一.sql语句 --================================================ 1.增加主键    alter table ...

  3. oracle insert汉字出错,Oracle数据库之Oracle批量插入数据SQL语句太长出错:无效的主机/绑定变量名...

    本文主要向大家介绍了Oracle数据库之Oracle批量插入数据SQL语句太长出错:无效的主机/绑定变量名,通过具体的内容向大家展现,希望对大家学习Oracle数据库有所帮助. Oracle数据库,用 ...

  4. oracle 最近的sql语句,oracle最近执行的sql语句

    oracle最近执行的sql语句 2017-01-13 oracle 查询最近执行过的 SQL语句 1.修改日期显示格式 alter session set nls_date_format='YYYY ...

  5. 查询Oracle正在执行的sql语句

    --查询Oracle正在执行的sql语句及执行该语句的用户 [sql] view plaincopy SELECT b.sid oracleID, b.username 登录Oracle用户名, b. ...

  6. 查询Oracle正在执行的sql语句,锁表,解锁

    原文出处:http://blog.csdn.net/jlds123/article/details/6572559 ----------------------- --查询Oracle正在执行的sql ...

  7. oracle将千万行查询优化到一秒内,oracle下一条SQL语句的优化过程(比较详细)

    oracle下一条SQL语句的优化过程(比较详细) 更新时间:2010年04月14日 23:56:49   作者: 很简单的一次调整,语句加了适当的索引后性能就有大幅的提升.当时看到这条语句的时候,第 ...

  8. oracle图书操作、sql语句查询+授权、视图、索引、表操作

    oracle图书操作.sql语句查询+授权.视图.索引.表操作 一.创建一张表book,表结构为(总编号,分类号,书名,作者,出版单位,单价),插入若干记录 二.创建一张表reader,表结构为(借书 ...

  9. oracle查运行sql语句,查询Oracle正在执行的SQL语句

    查询Oracle正在执行的sql语句及执行该语句的用户 查看正在执行sql的发起者的调用程序 查出oracle当前的被锁对象 结束当前的锁对象 无 SELECT b.sid oracleID, b.u ...

  10. oracle中执行某sql语句后,如一系列delete、update等操作,怎么看影响的行数?如我执行了n个表的delete语句,得看我删除了多少数据,万一sql写的有问题,误删了数据,不是灾难?

    oracle中执行某sql语句后,如一系列delete.update等操作,怎么看影响的行数?如我执行了n个表的delete语句,得看我删除了多少数据,万一sql写的有问题,误删了数据,不是灾难? 使 ...

最新文章

  1. 2022-2028年中国基因工程药物产业市场研究及前瞻分析报告
  2. 多地通知!防止疫情反扑将控制教职工和学生外出,新一轮校园封闭要开始了?...
  3. RT-Thread优化智能车设计
  4. python训练营免费领取-21天训练营丨Python量化投资打卡第五期!学完押金全返!...
  5. hdu 3790(最短路)
  6. 暗物质组成原理当然是不存在计算机,暗物质能组成生命吗?小部分暗物质可能会相互作用...
  7. python汉字转拼音代码_Python 汉字转换拼音代码
  8. c++中sort()的用法
  9. 前端:高德地图快速入门使用
  10. istio-opentracing链路追踪方案
  11. 认知升级,洞察人性,构建壁垒:AI创业如何跨越鸿沟?
  12. Halcon教程-HALCON19.05Progress将于2019年5月31日正式发布
  13. ChineseLunisolarCalendar 农历日期
  14. 梁定郊:一个人行贿赠西藏、新疆狂 野之旅
  15. 五个角度浅析大数据与BI的区别
  16. 熬了整整30天,搭建kafka服务器centos8
  17. 统计学简介之十六——单因素方差分析
  18. windows安装imgaug ERROR: Command errored out with exit status 1: ERROR: Command errored out with exit
  19. 08 | 数据采集:如何自动化采集数据?
  20. iOS创建framework静态库(SDK组件化)

热门文章

  1. 创建用于云支持的枢纽
  2. linux下JNI的demo
  3. axis的对象交由spring管理的配置
  4. tensorflow实现原理
  5. Springboot整合swagger指南
  6. git 在本地新建分支之后上传代码到远程
  7. spring boot基础配置
  8. centos7安装ansible AWX17.1.0
  9. Scala调用Java静态成员及静态方法注意点——只能通过当前类名调用而不能借助子类调用父类静态成员/方法
  10. GO关于gin工程关联GOPATH的说明