数据库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查询JSON数组字段包含特定字符串的方法

《MySQL查询JSON数组字段包含特定字符串的方法》在MySQL数据库中,当某个字段存储的是JSON数组,需要查询数组中包含特定字符串的记录时传统的LIKE语句无法直接使用,下面小编就为大家介绍两种... 目录问题背景解决方案对比1. 精确匹配方案(推荐)2. 模糊匹配方案参数化查询示例使用场景建议性能优

Python中win32包的安装及常见用途介绍

《Python中win32包的安装及常见用途介绍》在Windows环境下,PythonWin32模块通常随Python安装包一起安装,:本文主要介绍Python中win32包的安装及常见用途的相关... 目录前言主要组件安装方法常见用途1. 操作Windows注册表2. 操作Windows服务3. 窗口操作

mysql表操作与查询功能详解

《mysql表操作与查询功能详解》本文系统讲解MySQL表操作与查询,涵盖创建、修改、复制表语法,基本查询结构及WHERE、GROUPBY等子句,本文结合实例代码给大家介绍的非常详细,感兴趣的朋友跟随... 目录01.表的操作1.1表操作概览1.2创建表1.3修改表1.4复制表02.基本查询操作2.1 SE

MySQL中的锁机制详解之全局锁,表级锁,行级锁

《MySQL中的锁机制详解之全局锁,表级锁,行级锁》MySQL锁机制通过全局、表级、行级锁控制并发,保障数据一致性与隔离性,全局锁适用于全库备份,表级锁适合读多写少场景,行级锁(InnoDB)实现高并... 目录一、锁机制基础:从并发问题到锁分类1.1 并发访问的三大问题1.2 锁的核心作用1.3 锁粒度分

MySQL数据库中ENUM的用法是什么详解

《MySQL数据库中ENUM的用法是什么详解》ENUM是一个字符串对象,用于指定一组预定义的值,并可在创建表时使用,下面:本文主要介绍MySQL数据库中ENUM的用法是什么的相关资料,文中通过代码... 目录mysql 中 ENUM 的用法一、ENUM 的定义与语法二、ENUM 的特点三、ENUM 的用法1

MySQL count()聚合函数详解

《MySQLcount()聚合函数详解》MySQL中的COUNT()函数,它是SQL中最常用的聚合函数之一,用于计算表中符合特定条件的行数,本文给大家介绍MySQLcount()聚合函数,感兴趣的朋... 目录核心功能语法形式重要特性与行为如何选择使用哪种形式?总结深入剖析一下 mysql 中的 COUNT

Java中调用数据库存储过程的示例代码

《Java中调用数据库存储过程的示例代码》本文介绍Java通过JDBC调用数据库存储过程的方法,涵盖参数类型、执行步骤及数据库差异,需注意异常处理与资源管理,以优化性能并实现复杂业务逻辑,感兴趣的朋友... 目录一、存储过程概述二、Java调用存储过程的基本javascript步骤三、Java调用存储过程示

Go语言数据库编程GORM 的基本使用详解

《Go语言数据库编程GORM的基本使用详解》GORM是Go语言流行的ORM框架,封装database/sql,支持自动迁移、关联、事务等,提供CRUD、条件查询、钩子函数、日志等功能,简化数据库操作... 目录一、安装与初始化1. 安装 GORM 及数据库驱动2. 建立数据库连接二、定义模型结构体三、自动迁

mysql中的服务器架构详解

《mysql中的服务器架构详解》:本文主要介绍mysql中的服务器架构,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、mysql服务器架构解释3、总结1、背景简单理解一下mysqphpl的服务器架构。2、mysjsql服务器架构解释mysql的架

MySQL之InnoDB存储引擎中的索引用法及说明

《MySQL之InnoDB存储引擎中的索引用法及说明》:本文主要介绍MySQL之InnoDB存储引擎中的索引用法及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录1、背景2、准备3、正篇【1】存储用户记录的数据页【2】存储目录项记录的数据页【3】聚簇索引【4】二