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,一经查实,立即删除!

相关文章

html ios视频播放器,良心推荐!iOS端的视频播放应用

不知道大家还记不记得之前小编我推荐的最好用的iOS音乐播放器&#xff0c;如果没看过&#xff0c;可以点击这里。既然之前介绍了一款iOS端的音乐播放器给大家&#xff0c;那么今天就介绍一款iOS端十分好用的万能解码的视频播放器。使用iPhone的用户都明白&#xff0c;iPhone自带…

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

私有方法与静态私有方法您是否有私有的静态方法来帮助您将算法分解为更小的部分&#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…

dagger2 注入_使用Dagger 2在GWT中进行依赖注入

dagger2 注入依赖注入是一种软件开发概念&#xff0c;其中为对象提供了创建所需的所有对象或值。 GWT用户已经熟悉GIN&#xff0c;但已经不推荐使用此工具&#xff0c;因此不再支持它&#xff0c;因此使用GIN的应用程序当前确实需要告别。 Dagger是GWT的新依赖注入框架。 对于那…

oracle创建一个表同已存在表结构一样

oracle创建一个表同已存在表结构一样&#xff08;或者同时将数据导入&#xff09; –只是建立ta表&#xff0c;与emp表结构相同&#xff0c;并不添加数据 –这种构造与现存表相同结构的表&#xff0c;是不会将comment带过来的 create table ta as select * from scott.emp wh…

周敏教授计算机编码与密码学,中国科学院计算机与控制学院博士生导师:张玉清教授...

张玉清 男 博导 信息科学与工程学院电子邮件&#xff1a;zhangyqgucas.ac.cn通信地址&#xff1a;北京石景山区玉泉路19号甲邮政编码&#xff1a;100049部门/实验室&#xff1a;计算机与控制学院职务: 教授&#xff0c;副院长电子邮箱: zhangyqucas.ac.cn研究方向:计算机网络&a…

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

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

华南理工网络教育计算机概论,2020年《计算机概论》平时作业华南理工网络教育学院.pdf...

计算机概论平时作业1. 简 述人工智能答&#xff1a;人工智能是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门新的技术科学。人工智能是计算机科学的一个分支&#xff0c; 它企图了解智能的实质&#xff0c; 并生产出一种新的能以人类智能相似的方…

python合并csv文件_Python学习——pandas 合并csv文件

import pandas as pd import os import re import numpy as np Folder_Path rC:/Users/Cable-Ching\Desktop/New folder/New folder # 要拼接的文件夹及其完整路径&#xff0c;注意不要包含中文 SaveFile_Path rC:/Users/Cable-Ching\Desktop/New folder/New folder # 拼接后…

ebook_[EBOOK]十大Java性能问题

ebook有兴趣了解更多吗&#xff1f; 然后&#xff0c;您应该在此处下载相关的电子书。 Java中的大多数性能问题都可归因于少数根本原因。 当然&#xff0c;偶尔会有一些奇怪的极端情况突然出现&#xff0c;并在应用程序中造成严重破坏&#xff0c;但是在大多数情况下&#xff…

macOS下的视频格式转换器

1-Click Video Converter Total Video Converter Pro

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…

用计算机处理信息教学反思,《人工智能处理信息》教学反思

作业内容《用智能工具处理信息》教学反思《用智能工具处理信息》的学习目标是&#xff1a;1.初步了解人工智能的概念。2.知道人工智能的两个研究领域“自然语言理解”和“模式识别”3.能够辨别“自然语言理解”与“模式识别”的区别。在教学的过程中重视学生学习兴趣的调动。课…

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

在抽象类中可以没有抽象方法这是最近在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…