数据库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字符串转数值的方法全解析

《MySQL字符串转数值的方法全解析》在MySQL开发中,字符串与数值的转换是高频操作,本文从隐式转换原理、显式转换方法、典型场景案例、风险防控四个维度系统梳理,助您精准掌握这一核心技能,需要的朋友可... 目录一、隐式转换:自动但需警惕的&ld编程quo;双刃剑”二、显式转换:三大核心方法详解三、典型场景

MySQL中between and的基本用法、范围查询示例详解

《MySQL中betweenand的基本用法、范围查询示例详解》BETWEENAND操作符在MySQL中用于选择在两个值之间的数据,包括边界值,它支持数值和日期类型,示例展示了如何使用BETWEEN... 目录一、between and语法二、使用示例2.1、betwphpeen and数值查询2.2、be

MySQL快速复制一张表的四种核心方法(包括表结构和数据)

《MySQL快速复制一张表的四种核心方法(包括表结构和数据)》本文详细介绍了四种复制MySQL表(结构+数据)的方法,并对每种方法进行了对比分析,适用于不同场景和数据量的复制需求,特别是针对超大表(1... 目录一、mysql 复制表(结构+数据)的 4 种核心方法(面试结构化回答)方法 1:CREATE

JavaWeb项目创建、部署、连接数据库保姆级教程(tomcat)

《JavaWeb项目创建、部署、连接数据库保姆级教程(tomcat)》:本文主要介绍如何在IntelliJIDEA2020.1中创建和部署一个JavaWeb项目,包括创建项目、配置Tomcat服务... 目录简介:一、创建项目二、tomcat部署1、将tomcat解压在一个自己找得到路径2、在idea中添加

SQL Server中行转列方法详细讲解

《SQLServer中行转列方法详细讲解》SQL行转列、列转行可以帮助我们更方便地处理数据,生成需要的报表和结果集,:本文主要介绍SQLServer中行转列方法的相关资料,需要的朋友可以参考下... 目录前言一、为什么需要行转列二、行转列的基本概念三、使用PIVOT运算符进行行转列1.创建示例数据表并插入数

MySQL MHA集群详解(数据库高可用)

《MySQLMHA集群详解(数据库高可用)》MHA(MasterHighAvailability)是开源MySQL高可用管理工具,用于自动故障检测与转移,支持异步或半同步复制的MySQL主从架构,本... 目录mysql 高可用方案:MHA 详解与实战1. MHA 简介2. MHA 的组件组成(1)MHA

SQL 注入攻击(SQL Injection)原理、利用方式与防御策略深度解析

《SQL注入攻击(SQLInjection)原理、利用方式与防御策略深度解析》本文将从SQL注入的基本原理、攻击方式、常见利用手法,到企业级防御方案进行全面讲解,以帮助开发者和安全人员更系统地理解... 目录一、前言二、SQL 注入攻击的基本概念三、SQL 注入常见类型分析1. 基于错误回显的注入(Erro

MySQL基本表查询操作汇总之单表查询+多表操作大全

《MySQL基本表查询操作汇总之单表查询+多表操作大全》本文全面介绍了MySQL单表查询与多表操作的关键技术,包括基本语法、高级查询、表别名使用、多表连接及子查询等,并提供了丰富的实例,感兴趣的朋友跟... 目录一、单表查询整合(一)通用模版展示(二)举例说明(三)注意事项(四)Mapper简单举例简单查询

MySQL中的DELETE删除数据及注意事项

《MySQL中的DELETE删除数据及注意事项》MySQL的DELETE语句是数据库操作中不可或缺的一部分,通过合理使用索引、批量删除、避免全表删除、使用TRUNCATE、使用ORDERBY和LIMI... 目录1. 基本语法单表删除2. 高级用法使用子查询删除删除多表3. 性能优化策略使用索引批量删除避免

MySQL 数据库进阶之SQL 数据操作与子查询操作大全

《MySQL数据库进阶之SQL数据操作与子查询操作大全》本文详细介绍了SQL中的子查询、数据添加(INSERT)、数据修改(UPDATE)和数据删除(DELETE、TRUNCATE、DROP)操作... 目录一、子查询:嵌套在查询中的查询1.1 子查询的基本语法1.2 子查询的实战示例二、数据添加:INSE