数据库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

相关文章

MySQL的JDBC编程详解

《MySQL的JDBC编程详解》:本文主要介绍MySQL的JDBC编程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言一、前置知识1. 引入依赖2. 认识 url二、JDBC 操作流程1. JDBC 的写操作2. JDBC 的读操作总结前言本文介绍了mysq

java.sql.SQLTransientConnectionException连接超时异常原因及解决方案

《java.sql.SQLTransientConnectionException连接超时异常原因及解决方案》:本文主要介绍java.sql.SQLTransientConnectionExcep... 目录一、引言二、异常信息分析三、可能的原因3.1 连接池配置不合理3.2 数据库负载过高3.3 连接泄漏

Linux下MySQL数据库定时备份脚本与Crontab配置教学

《Linux下MySQL数据库定时备份脚本与Crontab配置教学》在生产环境中,数据库是核心资产之一,定期备份数据库可以有效防止意外数据丢失,本文将分享一份MySQL定时备份脚本,并讲解如何通过cr... 目录备份脚本详解脚本功能说明授权与可执行权限使用 Crontab 定时执行编辑 Crontab添加定

如何通过try-catch判断数据库唯一键字段是否重复

《如何通过try-catch判断数据库唯一键字段是否重复》在MyBatis+MySQL中,通过try-catch捕获唯一约束异常可避免重复数据查询,优点是减少数据库交互、提升并发安全,缺点是异常处理开... 目录1、原理2、怎么理解“异常走的是数据库错误路径,开销比普通逻辑分支稍高”?1. 普通逻辑分支 v

MySQL中On duplicate key update的实现示例

《MySQL中Onduplicatekeyupdate的实现示例》ONDUPLICATEKEYUPDATE是一种MySQL的语法,它在插入新数据时,如果遇到唯一键冲突,则会执行更新操作,而不是抛... 目录1/ ON DUPLICATE KEY UPDATE的简介2/ ON DUPLICATE KEY UP

MySQL分库分表的实践示例

《MySQL分库分表的实践示例》MySQL分库分表适用于数据量大或并发压力高的场景,核心技术包括水平/垂直分片和分库,需应对分布式事务、跨库查询等挑战,通过中间件和解决方案实现,最佳实践为合理策略、备... 目录一、分库分表的触发条件1.1 数据量阈值1.2 并发压力二、分库分表的核心技术模块2.1 水平分

Python与MySQL实现数据库实时同步的详细步骤

《Python与MySQL实现数据库实时同步的详细步骤》在日常开发中,数据同步是一项常见的需求,本篇文章将使用Python和MySQL来实现数据库实时同步,我们将围绕数据变更捕获、数据处理和数据写入这... 目录前言摘要概述:数据同步方案1. 基本思路2. mysql Binlog 简介实现步骤与代码示例1

Java中HashMap的用法详细介绍

《Java中HashMap的用法详细介绍》JavaHashMap是一种高效的数据结构,用于存储键值对,它是基于哈希表实现的,提供快速的插入、删除和查找操作,:本文主要介绍Java中HashMap... 目录一.HashMap1.基本概念2.底层数据结构:3.HashCode和equals方法为什么重写Has

使用shardingsphere实现mysql数据库分片方式

《使用shardingsphere实现mysql数据库分片方式》本文介绍如何使用ShardingSphere-JDBC在SpringBoot中实现MySQL水平分库,涵盖分片策略、路由算法及零侵入配置... 目录一、ShardingSphere 简介1.1 对比1.2 核心概念1.3 Sharding-Sp

Java实现复杂查询优化的7个技巧小结

《Java实现复杂查询优化的7个技巧小结》在Java项目中,复杂查询是开发者面临的“硬骨头”,本文将通过7个实战技巧,结合代码示例和性能对比,手把手教你如何让复杂查询变得优雅,大家可以根据需求进行选择... 目录一、复杂查询的痛点:为何你的代码“又臭又长”1.1冗余变量与中间状态1.2重复查询与性能陷阱1.