Oracle 原理:复杂的SQL语句
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语句相关推荐
- oracle 查看用户日志,Oracle查看用户操作sql语句以及数据库日志
--查看日志文件 select member from v$logfile; --查看表空间使用情况 SELECT SUM(bytes) / (1024 * 1024) AS free_space, ...
- oracle笔记一(sql语句方面)
oracle笔记一(sql语句方面) 一.sql语句 --================================================ 1.增加主键 alter table ...
- oracle insert汉字出错,Oracle数据库之Oracle批量插入数据SQL语句太长出错:无效的主机/绑定变量名...
本文主要向大家介绍了Oracle数据库之Oracle批量插入数据SQL语句太长出错:无效的主机/绑定变量名,通过具体的内容向大家展现,希望对大家学习Oracle数据库有所帮助. Oracle数据库,用 ...
- oracle 最近的sql语句,oracle最近执行的sql语句
oracle最近执行的sql语句 2017-01-13 oracle 查询最近执行过的 SQL语句 1.修改日期显示格式 alter session set nls_date_format='YYYY ...
- 查询Oracle正在执行的sql语句
--查询Oracle正在执行的sql语句及执行该语句的用户 [sql] view plaincopy SELECT b.sid oracleID, b.username 登录Oracle用户名, b. ...
- 查询Oracle正在执行的sql语句,锁表,解锁
原文出处:http://blog.csdn.net/jlds123/article/details/6572559 ----------------------- --查询Oracle正在执行的sql ...
- oracle将千万行查询优化到一秒内,oracle下一条SQL语句的优化过程(比较详细)
oracle下一条SQL语句的优化过程(比较详细) 更新时间:2010年04月14日 23:56:49 作者: 很简单的一次调整,语句加了适当的索引后性能就有大幅的提升.当时看到这条语句的时候,第 ...
- oracle图书操作、sql语句查询+授权、视图、索引、表操作
oracle图书操作.sql语句查询+授权.视图.索引.表操作 一.创建一张表book,表结构为(总编号,分类号,书名,作者,出版单位,单价),插入若干记录 二.创建一张表reader,表结构为(借书 ...
- oracle查运行sql语句,查询Oracle正在执行的SQL语句
查询Oracle正在执行的sql语句及执行该语句的用户 查看正在执行sql的发起者的调用程序 查出oracle当前的被锁对象 结束当前的锁对象 无 SELECT b.sid oracleID, b.u ...
- oracle中执行某sql语句后,如一系列delete、update等操作,怎么看影响的行数?如我执行了n个表的delete语句,得看我删除了多少数据,万一sql写的有问题,误删了数据,不是灾难?
oracle中执行某sql语句后,如一系列delete.update等操作,怎么看影响的行数?如我执行了n个表的delete语句,得看我删除了多少数据,万一sql写的有问题,误删了数据,不是灾难? 使 ...
最新文章
- 2022-2028年中国基因工程药物产业市场研究及前瞻分析报告
- 多地通知!防止疫情反扑将控制教职工和学生外出,新一轮校园封闭要开始了?...
- RT-Thread优化智能车设计
- python训练营免费领取-21天训练营丨Python量化投资打卡第五期!学完押金全返!...
- hdu 3790(最短路)
- 暗物质组成原理当然是不存在计算机,暗物质能组成生命吗?小部分暗物质可能会相互作用...
- python汉字转拼音代码_Python 汉字转换拼音代码
- c++中sort()的用法
- 前端:高德地图快速入门使用
- istio-opentracing链路追踪方案
- 认知升级,洞察人性,构建壁垒:AI创业如何跨越鸿沟?
- Halcon教程-HALCON19.05Progress将于2019年5月31日正式发布
- ChineseLunisolarCalendar 农历日期
- 梁定郊:一个人行贿赠西藏、新疆狂 野之旅
- 五个角度浅析大数据与BI的区别
- 熬了整整30天,搭建kafka服务器centos8
- 统计学简介之十六——单因素方差分析
- windows安装imgaug ERROR: Command errored out with exit status 1: ERROR: Command errored out with exit
- 08 | 数据采集:如何自动化采集数据?
- iOS创建framework静态库(SDK组件化)