数据库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中乐观锁与悲观锁的相关资料,乐观锁适用于读多写少的场景,通过版本号检查避免冲突,而悲观锁适用于写多读少且对数... 目录一、引言二、乐观锁(一)原理(二)应用场景(三)示例代码三、悲观锁(一)原理(二)应用场景(三)示例

Node.js 数据库 CRUD 项目示例详解(完美解决方案)

《Node.js数据库CRUD项目示例详解(完美解决方案)》:本文主要介绍Node.js数据库CRUD项目示例详解(完美解决方案),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考... 目录项目结构1. 初始化项目2. 配置数据库连接 (config/db.js)3. 创建模型 (models/

SQL表间关联查询实例详解

《SQL表间关联查询实例详解》本文主要讲解SQL语句中常用的表间关联查询方式,包括:左连接(leftjoin)、右连接(rightjoin)、全连接(fulljoin)、内连接(innerjoin)、... 目录简介样例准备左外连接右外连接全外连接内连接交叉连接自然连接简介本文主要讲解SQL语句中常用的表

SQL server配置管理器找不到如何打开它

《SQLserver配置管理器找不到如何打开它》最近遇到了SQLserver配置管理器打不开的问题,尝试在开始菜单栏搜SQLServerManager无果,于是将自己找到的方法总结分享给大家,对SQ... 目录方法一:桌面图标进入方法二:运行窗口进入方法三:查找文件路径方法四:检查 SQL Server 安

MySQL 中的 LIMIT 语句及基本用法

《MySQL中的LIMIT语句及基本用法》LIMIT语句用于限制查询返回的行数,常用于分页查询或取部分数据,提高查询效率,:本文主要介绍MySQL中的LIMIT语句,需要的朋友可以参考下... 目录mysql 中的 LIMIT 语句1. LIMIT 语法2. LIMIT 基本用法(1) 获取前 N 行数据(

MySQL 分区与分库分表策略应用小结

《MySQL分区与分库分表策略应用小结》在大数据量、复杂查询和高并发的应用场景下,单一数据库往往难以满足性能和扩展性的要求,本文将详细介绍这两种策略的基本概念、实现方法及优缺点,并通过实际案例展示如... 目录mysql 分区与分库分表策略1. 数据库水平拆分的背景2. MySQL 分区策略2.1 分区概念

MySQL高级查询之JOIN、子查询、窗口函数实际案例

《MySQL高级查询之JOIN、子查询、窗口函数实际案例》:本文主要介绍MySQL高级查询之JOIN、子查询、窗口函数实际案例的相关资料,JOIN用于多表关联查询,子查询用于数据筛选和过滤,窗口函... 目录前言1. JOIN(连接查询)1.1 内连接(INNER JOIN)1.2 左连接(LEFT JOI

MySQL 中查询 VARCHAR 类型 JSON 数据的问题记录

《MySQL中查询VARCHAR类型JSON数据的问题记录》在数据库设计中,有时我们会将JSON数据存储在VARCHAR或TEXT类型字段中,本文将详细介绍如何在MySQL中有效查询存储为V... 目录一、问题背景二、mysql jsON 函数2.1 常用 JSON 函数三、查询示例3.1 基本查询3.2

MySQL中动态生成SQL语句去掉所有字段的空格的操作方法

《MySQL中动态生成SQL语句去掉所有字段的空格的操作方法》在数据库管理过程中,我们常常会遇到需要对表中字段进行清洗和整理的情况,本文将详细介绍如何在MySQL中动态生成SQL语句来去掉所有字段的空... 目录在mysql中动态生成SQL语句去掉所有字段的空格准备工作原理分析动态生成SQL语句在MySQL

MySQL中FIND_IN_SET函数与INSTR函数用法解析

《MySQL中FIND_IN_SET函数与INSTR函数用法解析》:本文主要介绍MySQL中FIND_IN_SET函数与INSTR函数用法解析,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友一... 目录一、功能定义与语法1、FIND_IN_SET函数2、INSTR函数二、本质区别对比三、实际场景案例分