Oracle 数据库中较为复杂或典型的 SQL 语句的解读

文章目录

  • 批量生成 SQL 语句/拼接字符串
  • 多表关联查询 + where 子句
    • 示例(一)
    • 示例(二)
  • 普通的表间内连接查询语句
    • 关键字 distinct 用法说明
  • Oracle 数据库的分组排序查询
  • Oracle 数据库 cast 函数
  • Oracle 数据库 sum 函数的高级用法
  • Oracle 数据库多层子查询嵌套查询
  • 关联子查询
    • 数据库如何把纵向列表转换成横向列表

批量生成 SQL 语句/拼接字符串

select 'update t_pf_menu set a1='''||t.a1||''' where a2='''|| t.a2||''';' 
from tesst t;
select 'update t_busop set busname='''||t.busname||''',icon='''||t.icon||''' where busopid='''|| t.busopid||''';' 
from lwx t;

SQL 语句解释:

|| 是表示两段字符串拼接起来,' ' 里面是拼接的字符串, ' '' ' 表示字符串里面有个单引号,'' 表示一个单引号哦。
t.a1 表示取 t 表的 a1 字段的值,注意变量不要加任何的引号哦。

注意:
Oracle 数据库字符串拼接符号 ||,而MySQL 数据库的字符串拼接使用函数 concat(str1,str2),str1、str2 是指要拼接的两个字符串

多表关联查询 + where 子句

示例(一)

select s.name,s.age,c.course_name 
from student s 
left outer join course c 
on s.course_id=c.course_id 
where c.course_id='0707';

上述查询语句执行过程如下:

  1. 先打开表 student 和 course
  2. 接着根据关联条件(s.course_id=c.course_id)将 student 和 course 将两张表进行关联
  3. 接着将匹配结果生成一张虚表,即将符合条件的两张表的数据合并成一张虚表 v1
  4. 再根据 where 条件把虚表 v1 中符合 c.course_id='0707' 的记录筛选出来,生成虚表 v2
  5. 最后执行 select 子句把指定字段的数据获取到,生成虚表 v3,v3 就是最后的查询结果

左外连接 left outer join 执行效果说明:

left outer join 的查询结果是这样的,如果匹配成功的那么两张表的相关字段的数据会提取出来,如果匹配不成功的,则左边的数据提取出来,右边表的相应字段值则为空。

错误理解:

这个 where 子句并不是先对 course 表进行筛选再和 student 表进行关联查询,而是进行关联匹配的同时进行筛选,匹配成功且符合筛选条件的记录才提取出来,如果只是匹配成功但是不符合筛选条件的剔除掉。

示例(二)

 select cmcltname,jurperson,special,d.name,ecotype,depcode from $prdline.securiorg s left outer join $platform.t_pf_datadict d on s.tecgrd=d.code where d.ddfld='tecgrd';

执行过程简单说明:
数据库是按照这样的顺序来执行 SQL 语句的,首先 securiorg 和 t_pf_datadict 两张表通过 s.tecgrd=d.code 关联条件进行做左连接,这样就得到连接后的结果集,再执行 where 语句进行筛选,再执行 select 语句得到最后想要的结果集。

普通的表间内连接查询语句

select distinct e.deptno,d.dname from emp_lwx e inner join dept_lwx d on e.deptno=d.deptno;

分析上述 SQL 语句的内部执行顺序如下:

  1. 数据库先执行 from,打开表 emp_lwx 和 dept_lwx
  2. 接着执行 on,根据关联字段把两张表关联起来
  3. 接着执行 inner join,把匹配的数据取出生成一张虚表 v1
  4. 接着执行 select 子句,在虚表 v1 中取出相关的数据生成虚表 v2
  5. 接着执行 distinct,将虚表 v2 中 deptno 和 dname 都重复的数据过滤掉,生成虚表 v3,此虚表 v3 就是最后的查询结果

关键字 distinct 用法说明

select distinct deptno,job from emp_lwx;

distinct 关键字不是作用在字段 deptno 上,在执行 select 子句的时候,数据库是这样判断的,取出 deptno 和 job 的数据,这两个字段的数据联合起来在结果集中是唯一的就可以了,这个两个字段的数据就构成结果集中的一条记录,只要这条记录在整个结果集中是唯一的就OK了。

Oracle 数据库的分组排序查询

SELECT T.ENTITYID,T.CREDATE,T.EXACTCRETIME,ROW_NUMBER() OVER(PARTITION BY T.ENTITYID ORDER BY CREDATE DESC,EXACTCRETIME DESC) AS RNUM 
FROM HYT2PRDHN.TASKED T;

说明:
先执行 FROM,接着执行 SELECT,接着执行 PARTITION BY,最后执行 ORDER BY。对 SELECT 出来的结果集按 ENTITYID 进行分组,每组再按 CREDATE 和 EXACTCRETIME 排序,顺序号的字段名为 RNUM,查询得到的结果如下图所示:
在这里插入图片描述

Oracle 数据库 cast 函数

SELECT CODE,NAME,CAST(CASE WHEN CODE LIKE '%000' THEN 1 WHEN CODE LIKE '%00' THEN 2 ELSE 3 END AS VARCHAR2(3)) AS LEV 
FROM T_PF_DATADICT WHERE DDFLD='BNSCOPE' AND CODE IN ('08000','08100','08101','08102','08103','08200','08201','08300','08301') 
ORDER BY CODE

解读:

CAST函数的作用是类型转换,在此就是将LEV 字段的数据类型转换成VARCHAR2(3)

Oracle 数据库 sum 函数的高级用法

 select depcode,sum(case when BILLSTATE=1 then 1 else 0 end) as 未使用,sum(case when BILLSTATE in (2,3,4) then 1 else 0 end) as 已使用,sum(case when BILLSTATE in (5) then 1 else 0 end) as 已遗失 from BCBILLSTOCK group by depcode;

解读:

先对整个表进行遍历分组,然后判断每组里面每条记录 BILLSTATE 字段的值,如果是 1 则累加 1 ,否则累加 0,最后的累加值显示一列,列名为:未使用;如果是2或3或4则将累加 1,否则累加 0,最后的值显示一列,列名为:已使用;如果是 5 则累加 1,否则累加 0,最后的值显示一列,列名为:已遗失。

Oracle 数据库多层子查询嵌套查询

SELECT DEPNAME 运管机构,SUM(已作废) 已作废,SUM(已反馈) 已反馈,SUM(未使用) 未使用,SUM(已使用) 已使用 
FROM 
(SELECT DEPNAME,CASE 牌证状态 WHEN '已作废' THEN TOTAL END AS 已作废,CASE  牌证状态 WHEN '已反馈' THEN TOTAL END AS 已反馈,CASE 牌证状态 WHEN '未使用' THEN TOTAL END AS 未使用,CASE 牌证状态 WHEN '已使用' THEN TOTAL END AS 已使用 
FROM 
(SELECT D1.DEPNAME,B1.牌证状态,B1.TOTAL 
FROM (SELECT T1.DEPCODE, CASE BILLSTATE WHEN '2' THEN '已使用' WHEN '3' THEN '已作废' WHEN '4' THEN '已反馈' WHEN '5' THEN '遗失' ELSE '未使用' END AS 牌证状态,SUM(CNT) TOTAL 
FROM BCBILLSTOCK T1 
GROUP BY DEPCODE,BILLSTATE) B1 
LEFT JOIN HYT2PRDHN.T_PF_DEP D1 
ON B1.DEPCODE=D1.DEPCODE)) 
GROUP BY DEPNAME; 

注意: 先对某张表进行筛选再关联其它表是不可以的,对某个表先进行分组再筛选也是不可以的,会报错

关联子查询

select ename, salary, deptno from emp_xxx a where salary < ( select avg(nvl(salary,0)) 
from emp_xxx where deptno = a.deptno; // 子查询需要依赖主查询传递过来的参数 a.deptno

解读:
数据库的指针先指向 emp_xxx 的第一条记录,然后将当前记录的deptno的值传递给子查询,接着数据库开始执行子查询,计算出参数deptno的值所对应的部门的平均工资,接着又回到主查询判断当前记录的salary值是否小于平均工资,如果小于则添加到结果集,接着指针移到下条记录,重复上一次的查询动作,如果当前记录不小于平均工资,则直接将指针移到下条记录,重复上一次的查询动作。这样就可以查询出所有薪水比本部门平均工资低的员工数据。

我们知道数据库服务器执行SQL语句是有按照先后顺序的,例如:select ename,salary from emp_lwx where salary >3000;
顺序是这样的,数据库服务器首先打开emp_lwx表,然后执行where语句,按照where子句的条件来筛选符合条件的记录,服务器是对整个表从上至下进行全盘扫描,逐条判断记录是否符合条件,然后把符合条件的记录全部放在内存的一个虚表中,然后才执行select子句的,是符合条件的记录全部筛选出来后才执行select子句,而不是筛选一条记录就执行一次select子句,当然执行select子句也是从上至下逐条取出所需的数据,如果是组函数的话,那么就逐条记录取出所需的数据后再进行函数运算的。

数据库如何把纵向列表转换成横向列表

纵向列表,如下图所示:

在这里插入图片描述

如何变成横向列表,如下图所示:
在这里插入图片描述

SQL语句是这样写的:

select o.year,(select n.amount 
from ym n where n.month='1' and n.year=o.year) as m1,(select n.amount 
from ym n where n.month='2' and n.year=o.year) as m2,(select n.amount 
from ym n where n.month='3' and n.year=o.year) as m3,(select n.amount 
from ym n where n.month='4' and n.year=o.year) as m4 
from ym o group by year;

解读下:

很明显这是一个关联子查询,执行顺序是这样的,首先主查询 from ym 0 group by year 是先打开ym这张表,然后根据year字段来分组,接着执行select语句,指针先移至第一组,获取第一组的year值,也就是1991,然后执行关联子查询了,这时会把第一组的年份1991传入子查询中,那么第一个子查询就根据 month=‘1’ and year=‘1991’ 获取到相应的 amount值,字段名是m1,接着执行第二个子查询了,同样是将第一组的年份1991传入,得到相应的amont值,直到4个子查询都执行完毕,这样就得到第一条记录。那么指针就移到第二组了,同上一轮一样取出相应的值,那么最后得到的结果就是第2条记录了。

注意:这里的指针按组移动,取到年份值后分别传给四个子查询!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/335246.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

私有方法与静态私有方法_每个私有静态方法都是新类的候选人

私有方法与静态私有方法您是否有私有的静态方法来帮助您将算法分解为更小的部分&#xff1f; 我做。 每当我编写一个新方法时&#xff0c;我就会意识到它可以是一个新类。 当然&#xff0c;我不会从所有课程中选修课程&#xff0c;但这必须是目标。 私有静态方法不可重用&#…

c语言插入排序_还有这种操作?C语言插入排序算法,一点就透

插入排序算法是所有排序方法中最简单的一种算法&#xff0c;其主要的实现思想是将数据按照一定的顺序一个一个的插入到有序的表中&#xff0c;最终得到的序列就是已经排序好的数据。更多C/C资料群文件&#xff1a;569268376直接插入排序是插入排序算法中的一种&#xff0c;采用…

Mac 如何操控远程的 Windows 电脑

文章目录使用 Remote Desktop Connection for mac 客户端第 1 步&#xff1a;Windows 电脑进行远程设置第 2 步&#xff1a;Windows 电脑设置管理员账号和密码第 3 步&#xff1a;获取 Windows 电脑的 IP 地址第 4 步&#xff1a;Mac 电脑安装远程桌面连接客户端第 5 步&#x…

map iterator_一个简单的Map Iterator性能测试

map iteratorJava Map性能有很多方面可以衡量&#xff0c;但是关键的一个是简单的单线程扫描。 这是一些针对Iterators和Java 8 Map.forEach()简单测试代码&#xff0c;以及一些图形结果。 1.性能测试困难 性能测试是一项非常困难的工作&#xff0c;精确的可重复性测试需要Jav…

学生用计算机中sto,STO 文件扩展名: 它是什么以及如何打开它?

STO 疑难解答常见的 STO 打开问题Ecru Software PRO100 不存在你尝试加载 STO 文件并收到错误&#xff0c;例如 “%%os%% 无法打开 STO 文件扩展名”。 如果是这种情况&#xff0c;通常是因为 你的计算机上没有安装 Ecru Software PRO100 for %%os%%。 由于您的操作系统不知道如…

MacBook 使用 Loopback 录屏和录音频(MacBook 录屏教程/录视频教程/Loopback 教程)

文章目录一、下载软体二、Loopback 界面介绍三、设置系统的声音输入/输出设备&#xff08;一&#xff09;设置声音输入设备&#xff08;二&#xff09;设置声音输出设备四、录制程序中选择声音输入设备五、开始录制一、下载软体 在網路上可以找到破解版的軟體 Loopback 二、L…

惠普照片打印软件_被看错的打印机?原来打印机还可以这么玩

孩提时代&#xff0c;经常弄丢试卷的小值君曾频繁地与打印店打交道&#xff0c;那是我最早接触打印机的时候。白驹过隙&#xff0c;时至当下&#xff0c;打印设备已然成为家庭不可或缺的部分。印象中&#xff0c;打印机要不就是打打文档&#xff0c;要不就是打打照片&#xff0…

戴尔G3笔记本使用U盘重装操作系统

戴尔G3笔记本 下载安装大白菜U盘启动盘制作软件根据使用说明完成启动盘制作下载操作系统ISO文件重启电脑&#xff0c;连续按F12&#xff0c;打开如下界面后选择红色线框选项&#xff1a; 进入PE系统界面&#xff0c;打开【大白菜】&#xff0c;看到如下界面&#xff1a;

valid floating point value什么意思_为什么 0.1 + 0.2 = 0.300000004?

往期热门文章&#xff1a;1、《往期精选优秀博文都在这里了&#xff01;》2、求求你&#xff01;数据库不要再使用外键了&#xff1f;3、还在写慢SQL&#xff1f;4、ELK太笨重了&#xff1f;想放弃&#xff1f;快试试日志系统新贵Loki吧&#xff01;5、谁再悄咪咪的吃掉异常&am…

在抽象类中可以没有抽象方法_是否可以在最终课程中使用抽象方法?

在抽象类中可以没有抽象方法这是最近在Java开发人员工作面试的电话面试中向我的一位读者提出的有趣的Java核心问题之一。 即使他知道你 无法用Java将抽象类定型为final &#xff0c;他对方法的措辞感到困惑。 答案很简单&#xff0c;不&#xff0c;在Java的最终类中不可能有抽…

python二维列表排序_使用Python按顺时针方向排序二维坐标列表?

这应该说明问题&#xff0c;给出一个可视化工具 但对于在同一距离上获得一组点的正确入口点来说&#xff0c;这并不总是有效的import random import pylab import cmath from itertools import groupby pts [(random.randrange(-5,5), random.randrange(-5,5)) for _ in range…

微型计算机生产工艺,bb肥生产设备制造工艺流程

原标题&#xff1a;bb肥生产设备制造工艺流程BB肥生产设备与有机肥设备相比较而言设备相对简单&#xff0c;因而BB肥便具有投资小的优点&#xff0c;而且因其配方灵活&#xff0c;非常适合我国正在推广的测土配方肥的需要&#xff0c;是一种非常适合我国国情的肥料。在发达国家…

devc++鼠标变成了光标_Excel填充别再用鼠标拖拉了!用这4个方法,效率至少高10倍!...

Hello&#xff0c;各位叨友们好呀&#xff01;我是叨叨君~根据下表对照一下自己&#xff0c;在Excel中需要批量填充公式的时候&#xff0c;你是不是还在用鼠标拖拉的方法&#xff0c;将光标放在单元格的右下角&#xff0c;然后按鼠标左键&#xff0c;向下拖动&#xff0c;填充完…

运动基元_开发人员的新分布式基元

运动基元面向对象的基元&#xff08;进程内基元&#xff09; 作为Java开发人员&#xff0c;我非常熟悉面向对象的概念&#xff0c;例如类&#xff0c;对象&#xff0c;继承&#xff0c;封装&#xff0c;多态性等。除了面向对象的概念之外&#xff0c;我还非常熟悉Java运行时。它…

html5网站 500.19错误,WIN7操作系统创建IIS后浏览时提示HTTP500.19错误是怎么回事?如何解决?...

WIN7操作系统创建IIS后浏览时提示HTTP500.19错误是怎么回事&#xff1f;如何解决&#xff1f;作者&#xff1a;兴邦开发部人气&#xff1a;发表时间&#xff1a;2015年05月18日[文章内容简介]&#xff1a;WIN7操作系统创建IIS后浏览时提示HTTP500.19错误是怎么回事&#xff1f;…

网络位置可以看到另一个人的电脑_计算机组成原理(一)- 冯·诺依曼体系结构...

1 计算机的基本硬件组成早期,DIY一台计算机&#xff0c;要先有三大件CPU内存主板1.1 CPU计算机最重要的核心配件&#xff0c;中央处理器(Central Processing Unit)。计算机的所有“计算”都是由CPU来进行的。CPU是一个超级精细的印刷电路版1.2 内存(Memory)你撰写的程序、打开的…

vaadin_Vaadin提示:以声明方式构建UI

vaadin如果您使用过GWT&#xff0c;那么您可能会发现UiBinder对于设计复杂的UI很有用。 在有关Vaadin的系列文章中&#xff0c;我们希望在Vaadin和GWT之间得出相似之处。 Vaadin提供了多种开箱即用的工具和组件&#xff0c;用于构建复杂且美观的UI。 其中之一是可以像UiBinder那…

关东升python从小白到大牛_《Python从小白到大牛》第3章 第一个Python程序

本章以HelloWorld作为切入点&#xff0c;介绍如何编写和运行Python程序代码。 运行Python程序主要有两种方式&#xff1a; 1&#xff0e;交互式方式运行 2&#xff0e;文件方式运行 本章介绍这两种运行方式实现HelloWorld程序。 使用Python Shell 进入Python Shell可以通过交互…

neo4j 显示名字_Neo4j:绘制“我的名字是……我在工作”图

neo4j 显示名字在过去的几天里&#xff0c;我一直在关注DHH发起的有关“我的名字是……”的推文。 据我了解&#xff0c;其想法是表明在白板上编写采访谜语/艰巨任务是荒谬的。 您好&#xff0c;我叫大卫。 我不会在白板上写气泡排序。 我一直在互联网上查找代码。 我不做谜语…

Final Cut Pro x(FCPX)调色笔记

文章目录一、注意点二、调色流程1. 颜色校正&#xff08;一级校色&#xff09;1.1 颜色转换即色彩空间转换1.2 降噪&#xff08;noise reduction 即NR&#xff09;1.3 调整曝光和对比度1.4 调整白平衡1.5 饱和度1.6 肤色调整2.二级校色2.1 突出人物主体的方法一2.2 突出人物主体…