数据库SQL复杂介绍

2024-09-04 04:08

本文主要是介绍数据库SQL复杂介绍,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.1.1 数据库复杂SQL介绍

该文档中,未涉及函数的部分,DB2数据库可以通用

1.1.1.1 行转列,并汇总求和

Oracle数据库中,行转可以使用到decode函数进行处理。

例如表t1有以下数据

合同号(hth)

科目(kmbh)

金额(je)

发生日期

00001

01

20

2015-01-02

00001

02

30

2015-01-02

00002

01

25

2015-01-02

00001

01

15

2015-01-03

00002

02

40

2015-01-03

00001

03

50

2015-01-04

 

需要将以上数据汇总,合同下相同科目的金额汇总到一起,并将科目按列展示

合同号

科目01

科目02

科目03

00001

35

20

50

00002

25

40

0

使用以下SQL实现:

select hth,sum(decode(kmbh,’01’,je,0))科目01, sum(decode(kmbh,’02’,je,0))科目02, sum(decode(kmbh,’03’,je,0))科目03 from t1 group by hth

1.1.1.2 查询结果插入表中

使用以下语句将一个查询结果插入到指定的表中

 

1.1.1.3 查询结果合并到表中

在进行SQL语句编写时,经常会遇到大量的同时进行Insert/Update的语句 ,简单说当存在记录时,就更新(Update),不存在数据时,就插入(Insert)可以使用merge命令通过一条语句完成从一个或者多个表中查询数据对目标表的更新和插入数据。

create table PRODUCTS
(PRODUCT_ID INTEGER,PRODUCT_NAME VARCHAR2(60),CATEGORY VARCHAR2(60)
);insert into PRODUCTS values (1501, 'VIVITAR 35MM', 'ELECTRNCS');
insert into PRODUCTS values (1502, 'OLYMPUS IS50', 'ELECTRNCS');
insert into PRODUCTS values (1600, 'PLAY GYM', 'TOYS');
insert into PRODUCTS values (1601, 'LAMAZE', 'TOYS');
insert into PRODUCTS values (1666, 'HARRY POTTER', 'DVD');create table NEWPRODUCTS
(PRODUCT_ID INTEGER,PRODUCT_NAME VARCHAR2(60),
CATEGORY VARCHAR2(60)
);
insert into NEWPRODUCTS values (1502, 'OLYMPUS CAMERA', 'ELECTRNCS');
insert into NEWPRODUCTS values (1601, 'LAMAZE', 'TOYS');
insert into NEWPRODUCTS values (1666, 'HARRY POTTER', 'TOYS');
insert into NEWPRODUCTS values (1700, 'WAIT INTERFACE', 'BOOKS');


1使用表newproducts中的product_namecategory字段来更新表products中相同product_idproduct_namecategory.

MERGE INTO products p USING newproducts np ON (p.product_id = np.product_id) WHEN MATCHED THENUPDATESET p.product_name = np.product_name, p.category = np.category;


2当条件不满足的时候把newproducts表中的数据INSERT到表products

MERGE INTO products p   USING newproducts np   ON (p.product_id = np.product_id)   WHEN NOT MATCHED THEN  INSERT  VALUES (np.product_id, np.product_name,   np.category);

     

3insert update 都带有where字句

MERGE INTO products p   USING newproducts np   ON (p.product_id = np.product_id)   WHEN MATCHED THEN  UPDATE  SET p.product_name = np.product_name,   p.category = np.category   WHERE p.category = 'DVD'  WHEN NOT MATCHED THEN  INSERT  VALUES (np.product_id, np.product_name, np.category)   WHERE np.category != 'BOOKS'


1.1.1.4 子查询介绍

子查询分为嵌套子查询、关联子查询两种,下面举例介绍

1.1.1.4.1 关联子查询

有项目信息表laproject及客户信息表party_customer,项目信息表tenantid对应客户信息表中的客户号initid,现需要查询出companyScale01客户下的所有项目可以使用关联查询:

 

也可以使用关联子查询:

 

嵌套子查询可以单独执行的子查询,嵌套子查询是先执行子查询再执行主查询,这个容易理解

1.1.1.4.2 关联子查询

party_customer,同一个客户有多个版本,即会有多条记录, party_customer表中version属性最大的为最新版本客户,需要查询出所有客户最新的版本,则可以使用关联子查询

 

关联子查询需要子查询中的某个字段与主查询的字段关联是与主查询关联一起的无法单独执行

关联子查询是先执行主查询逐条执行子查询,上面例子的执行过程为:先执行主查询查询到每一客户版本,然后逐条执行子查询获取这个客户对应的所以版本中最大的version,然后比较当前这一条version是否与子查询返回的version相同,不相同则过滤掉。

1.1.1.4.3 子查询作为数据来源

继续上面的例子同一个客户companyScale属性不同的版本可能值会不一样,因此使用下面关联语句则查询结果不准确。

 

最新版本的companyScale为准,将party_customer b替换子查询:

 

可以看到整合后的查询既有非关联查询,又用关联查询。

1.1.1.4.4 使用子查询进行数据更新

下面是从系统抽取的一条SQL语句,是典型的使用子查询进行更新的例子,其中还用到了case when then end语法

 

该语句的含义为使用表laproject的字段leasingType更新表rppaybaseinfo中projectid相同的记录的leasingType字段,其中还laprojectleasingType进行了加工,如果为01则更新0102则更新02,其他的更新为03。

另外,这个语句不是很严谨,因为最外层的where条件只是针对contendstate字段进行了过滤,因此如果符合条件的记录(例如contentstate=’0’),其projectidlaproject表中并不存在,即子查询返回结果为空,rp表的leasingstyle字段会被更新为null严谨写法是:

 

增加exists子查询后,只有匹配的才会更新。当然在实际使用中,可能laproject中肯定会有所有的projectid,此时则可以不需要exists子查询

1.1.1.4.5 左连接

Left out

 

1.1.1.4.6 子查询作为查询条件

上面介绍关联查询的例子即将子查询作为了查询条件。参见关联子查询

1.1.1.5 常用函数
1.1.1.5.1 数值函数

Ø abs:求绝对值函数

如:abs(−5) 结果5

Ø round按指定精度对十进制数四舍五入

round(45.923, 1),结果为45.9

round(45.923, 0),结果为46

round(45.923, −1),结果为50

Ø trunc:按指定精度截断十进制数

trunc(45.923, 1),结果为45.9

trunc(45.923),结果为45

trunc(45.923, −1),结果为 40

1.1.1.5.2 字符函数

Ø lower:将字符串转换成小写

:lower ('SQL Course')结果为sql course

Ø upper:将字符串转换成大写

:upper('SQL Course')结果为SQL COURSE

Ø concat:连接两个字符串

concat('SQL', ' Course') 结果SQL Course也可以使用||,例如’SQL’ || ‘Course’

Ø substr:给出起始位置和长度,返回子字符串

:substr('String',1,3)结果为Str,第一个字符的起始位置为1

Ø length:求字符串的长度

length('Wellcom') 结果为7

Ø lpad:用字符填充字符串左侧到指定长度

:lpad('Hi',10,'-')结果为--------Hi

Ø rpad:用字符填充字符串右侧到指定长度

:rpad('Hi',10,'-')结果为Hi--------

Ø trim:在一个字符串中去除另一个字符串

:trim('S' FROM 'SSMITH')结果为MITH

Ø replace:用一个字符串替换另一个字符串中的子字符串

:replace('ABC', 'B', 'D')结果为ADC

1.1.1.5.3 日期函数

日期函数主要为日期的转换,to_charto_date 

to_char(sysdate,'YYYY-MM-DD HH24:MI:SS AM DY') 日期到字符

to_date('2015-02-28', 'yyyy-mm-dd')

1.1.1.5.4 数值间字符转换

Ø to_char:转换成字符串类型

to_char(1234.5, '$9999.9') 数值到字符

Ø to_number:转换成数值类型

:to_number('1234.5'),结果:1234.5

1.1.1.5.5 逻辑判断函数

Ø coalesce

coalesce用法为coalesce(expr1,expr2……exprn),其作用是在expr1,expr2……exprn这列表达式中查找第一个不为null的值且返回该值。如果都为null,则返回null

Ø nvl

写法为nvl(expr1,expr2),如果expr1null则返回expr2,否则返回expr1

Ø nvl2

nvl2用法为nvl2(expr1,expr2,expr3),其作用是判断expr1是否为null,若不为null,返回expr2,为空返回expr3

Ø nullif

nullif用法为nullif(expr1,expr2),其作用是判断expr1expr2是否相等,若相等则返回null,否则返回expr1

 

 

收集sql问题


这篇关于数据库SQL复杂介绍的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1134956

相关文章

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

SQL中的外键约束

外键约束用于表示两张表中的指标连接关系。外键约束的作用主要有以下三点: 1.确保子表中的某个字段(外键)只能引用父表中的有效记录2.主表中的列被删除时,子表中的关联列也会被删除3.主表中的列更新时,子表中的关联元素也会被更新 子表中的元素指向主表 以下是一个外键约束的实例展示

基于MySQL Binlog的Elasticsearch数据同步实践

一、为什么要做 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品、订单等数据的多维度检索。 使用 Elasticsearch 存储业务数据可以很好的解决我们业务中的搜索需求。而数据进行异构存储后,随之而来的就是数据同步的问题。 二、现有方法及问题 对于数据同步,我们目前的解决方案是建立数据中间表。把需要检索的业务数据,统一放到一张M

如何去写一手好SQL

MySQL性能 最大数据量 抛开数据量和并发数,谈性能都是耍流氓。MySQL没有限制单表最大记录数,它取决于操作系统对文件大小的限制。 《阿里巴巴Java开发手册》提出单表行数超过500万行或者单表容量超过2GB,才推荐分库分表。性能由综合因素决定,抛开业务复杂度,影响程度依次是硬件配置、MySQL配置、数据表设计、索引优化。500万这个值仅供参考,并非铁律。 博主曾经操作过超过4亿行数据

性能测试介绍

性能测试是一种测试方法,旨在评估系统、应用程序或组件在现实场景中的性能表现和可靠性。它通常用于衡量系统在不同负载条件下的响应时间、吞吐量、资源利用率、稳定性和可扩展性等关键指标。 为什么要进行性能测试 通过性能测试,可以确定系统是否能够满足预期的性能要求,找出性能瓶颈和潜在的问题,并进行优化和调整。 发现性能瓶颈:性能测试可以帮助发现系统的性能瓶颈,即系统在高负载或高并发情况下可能出现的问题

水位雨量在线监测系统概述及应用介绍

在当今社会,随着科技的飞速发展,各种智能监测系统已成为保障公共安全、促进资源管理和环境保护的重要工具。其中,水位雨量在线监测系统作为自然灾害预警、水资源管理及水利工程运行的关键技术,其重要性不言而喻。 一、水位雨量在线监测系统的基本原理 水位雨量在线监测系统主要由数据采集单元、数据传输网络、数据处理中心及用户终端四大部分构成,形成了一个完整的闭环系统。 数据采集单元:这是系统的“眼睛”,

Hadoop数据压缩使用介绍

一、压缩原则 (1)运算密集型的Job,少用压缩 (2)IO密集型的Job,多用压缩 二、压缩算法比较 三、压缩位置选择 四、压缩参数配置 1)为了支持多种压缩/解压缩算法,Hadoop引入了编码/解码器 2)要在Hadoop中启用压缩,可以配置如下参数

性能分析之MySQL索引实战案例

文章目录 一、前言二、准备三、MySQL索引优化四、MySQL 索引知识回顾五、总结 一、前言 在上一讲性能工具之 JProfiler 简单登录案例分析实战中已经发现SQL没有建立索引问题,本文将一起从代码层去分析为什么没有建立索引? 开源ERP项目地址:https://gitee.com/jishenghua/JSH_ERP 二、准备 打开IDEA找到登录请求资源路径位置

MySQL数据库宕机,启动不起来,教你一招搞定!

作者介绍:老苏,10余年DBA工作运维经验,擅长Oracle、MySQL、PG、Mongodb数据库运维(如安装迁移,性能优化、故障应急处理等)公众号:老苏畅谈运维欢迎关注本人公众号,更多精彩与您分享。 MySQL数据库宕机,数据页损坏问题,启动不起来,该如何排查和解决,本文将为你说明具体的排查过程。 查看MySQL error日志 查看 MySQL error日志,排查哪个表(表空间

MySQL高性能优化规范

前言:      笔者最近上班途中突然想丰富下自己的数据库优化技能。于是在查阅了多篇文章后,总结出了这篇! 数据库命令规范 所有数据库对象名称必须使用小写字母并用下划线分割 所有数据库对象名称禁止使用mysql保留关键字(如果表名中包含关键字查询时,需要将其用单引号括起来) 数据库对象的命名要能做到见名识意,并且最后不要超过32个字符 临时库表必须以tmp_为前缀并以日期为后缀,备份