`

DB2 常用SQL语句

阅读更多
1. 序列管理

创建从1开始,自增为1的序列:
-- MySchema: 模式名,可以省略
-- MySeq: 序列名
CREATE SEQUENCE "MySchema"."MySeq" AS INTEGER START WITH 1 INCREMENT BY 1 NO MINVALUE NO MAXVALUE
NO CYCLE CACHE 20 NO ORDER



查询序列:
SELECT
    SEQNAME,
    INCREMENT,
    "START",
    MAXVALUE,
    MINVALUE,
    "CYCLE",
    CACHE,
    "ORDER"
FROM
    sysibm.syssequences


查询当前值:
SELECT
    "MySchema"."MySeq".PREVVAL
FROM
    sysibm.dual;


查询下一个值:
SELECT
    "MySchema"."MySeq".NEXTVAL
FROM
    sysibm.dual;



重设下一个值:
-- 重设下一个值为168
ALTER SEQUENCE "MySchema"."MySeq" RESTART WITH 168

-- 重设下一个值,此时的下一个值为1
ALTER SEQUENCE "MySchema"."MySeq" RESTART


修改最大值:
-- 将序列的最大值改为99999
ALTER SEQUENCE "MySchema"."MySeq" MAXVALUE 99999

-- 不指定最大值
ALTER SEQUENCE "MySchema"."MySeq" NO MAXVALUE

注:
i. 不指定时的最大值将为序列类型的最大值:如果是INT,为2147483647;如果是BIGINT,为9223372036854775807
ii. MAXVALUE不可以写成分开的形式,否则报错

修改最小值:
-- 指定最小值为10
ALTER SEQUENCE "MySchema"."MySeq" MINVALUE 10

-- 不指定最小值
ALTER SEQUENCE "MySchema"."MySeq" NO MINVALUE

注:
i. 修改最小值后,获取的下一个值会变为新的最小值
ii. 不指定时的最小值将为序列类型的最小值:INT和BIGINT都为1
iii. MINVALUE不可以写成分开的形式,否则报错

修改递增值:
ALTER SEQUENCE "MySchema"."MySeq" INCREMENT BY 2

此时序列的当前值会在前一个值的基础上加2

修改缓存:
-- 缓存20个数据
ALTER SEQUENCE "MySchema"."MySeq" CACHE 20

-- 不缓存数据,可以写成NOCACHE
ALTER SEQUENCE "MySchema"."MySeq" NO CACHE

注:不缓存时,缓存的数据个数为1

切换排序与否:
-- 排序
ALTER SEQUENCE "MySchema"."MySeq" ORDER;

-- 不排序,可以写成NOORDER
ALTER SEQUENCE "MySchema"."MySeq" NO ORDER;


切换是否循环使用序列:

  序列配置成不能循环使用时,获取超过最大值的下一个值会报错。如序列当前值为30,最大值为30,步进为1,获取NEXTVAL会报错

-- 循环使用
ALTER SEQUENCE "MySchema"."MySeq" CYCLE;

-- 不循环使用,可以写成NOCYCLE
ALTER SEQUENCE "MySchema"."MySeq" NO CYCLE;


删除序列:
DROP SEQUENCE "MySchema"."MySeq"


2. 表管理
创建表:
CREATE TABLE
    person
    (
        id BIGINT NOT NULL,
        name VARCHAR(20) NOT NULL,
        age SMALLINT,
        CONSTRAINT PK_PERSON PRIMARY KEY (ID)
    )
    IN TBS_DAT_8K INDEX IN TBS_IDX_32K;


引号和大小写
表名和字段名加上引号时,DB2创建(修改)的表和字段的大小写和引号内的内容一致

不加引号时,全部转成大写。

修改表:
-- person表重命名为t_b
ALTER TABLE
    person RENAME TO t_b;

-- 去除name的not null约束
ALTER TABLE
    t_b DATA CAPTURE none;
ALTER TABLE
    t_b ALTER name DROP NOT NULL;
ALTER TABLE
    t_b DATA CAPTURE CHANGES;

-- 添加列sex和create_time,可以添加多个列,COLUMN可以省略
ALTER TABLE
    t_b ADD COLUMN sex CHAR(1) ADD create_time TIMESTAMP DEFAULT SYSDATE;

-- 重命名列sex为gender
ALTER TABLE
    t_b ALTER COLUMN sex gender CHAR(1);

-- 修改列age的数据类型为整型
ALTER TABLE
    t_b ALTER age SET DATA TYPE INTEGER;

-- 删除列create_time
ALTER TABLE
    t_b DROP create_time;


删除表:
DROP TABLE
    t_b;


3. 批量插入
INSERT
INTO
    t_b
    (
        ID, NAME, AGE, GENDER
    )
    VALUES
    (
        MySeq.nextVal,'Lilei',22,'M'
    )
    ,
    (
        MySeq.nextVal,'Lucy',18,'F'
    );


4. 数据复制

将t_a中除ID外的字段值拷贝到t_b中,t_b的ID为主键,由seq生成:
INSERT
INTO
    t_b
    (
        ID, NAME, AGE, GENDER
    )
SELECT
    MySeq.nextVal, NAME, AGE, GENDER
FROM
    t_a;


将t_a中除ID外的字段值更新到t_b中:
UPDATE
    t_b b
SET
    (
        b.NAME,
        b.AGE,
        b.GENDER
    )
    =
    (
        SELECT
            a.NAME,
            a.AGE,
            a.GENDER
        FROM
            t_a a
        WHERE
            a.name = b.name
        FETCH
            FIRST 1 ROWS ONLY) -- Avoid multiple rows that causes the update failed
WHERE -- The limit is necessary, otherwise it will update all the records in t_b
    b.ID IN
    (
        SELECT
            b.ID
        FROM
            t_a a2
        WHERE
            a2.name = b.name
        FETCH
            FIRST 1 ROWS ONLY)




5. 分页查询
SELECT
    *
FROM
    (
        SELECT
            ROW_NUMBER() OVER(ORDER BY NAME ASC, AGE DESC) AS row_num,
            NAME,
            AGE
        FROM
            t_b) t
WHERE
    t.row_num >= 21
AND t.row_num <= 30


注:
OVER()的参数指定按什么字段来排序,可以为空。
可以用BETWEEN 21 AND 30来替换上面的分页条件。


6. 查询前几条记录

查询年龄在25岁以上的前三条记录:

a. FETCH
SELECT
    *
FROM
    t_b
WHERE
    AGE > 25
ORDER BY
    AGE ASC
FETCH
    FIRST 3 ROWS ONLY


b. ROW_NUMBER()
SELECT
    *
FROM
    (
        SELECT
            ROW_NUMBER() OVER(ORDER BY AGE ASC) AS num,
            ID,
            NAME,
            AGE,
            GENDER
        FROM
            t_b
        WHERE
            AGE > 25) t
WHERE
    num <= 3


查出25岁以上的男女前3条记录:
SELECT
    *
FROM
    (
        SELECT
            ROW_NUMBER() OVER(PARTITION BY GENGER ORDER BY AGE ASC) AS num,
            ID,
            NAME,
            AGE,
            GENDER
        FROM
            t_b
        WHERE
            AGE > 25) t
WHERE
    num <= 3

PARTITION的作用是把BY后面字段相同的数据放到一起,类似于GROUP BY的功能。区别是GROUP BY语句除了能使用聚集函数(COUNT等)外,只能检索GROUP BY后面的字段;而PARTITION没有此限制。

7. 模式管理

查询当前模式列表:
SELECT SCHEMANAME, OWNER, CREATE_TIME FROM syscat.schemata;


创建模式:
-- 显式创建
CREATE SCHEMA "MySchema"; -- 模式名:加引号会严格按照大小写;不加为全部大写

-- 隐式创建
CREATE TABLE "MySchema"."STRENGTH"(id INT, name VARCHAR(40));


删除模式:
DROP SCHEMA "MySchema" RESTRICT;

删除schema需要使用RESTRICT关键字,而且该schema中无对象存在。

8. 索引管理

创建索引:

在同一个Schema中,索引名称不能重复,否则创建失败。
CREATE INDEX
    "IDX_ACCOUNT_NO"
ON
    "MySchema"."T_ACCOUNT" -- schema可以省略
    (
        "ACCOUNT_NO"
    )

逻辑:没有则创建;否则返回。所以重复执行创建语句是可以的。

如果要创建唯一索引,在INDEX前加入UNIQUE即可:
CREATE UNIQUE INDEX
    "IDX_ACCOUNT_NO"
ON
    T_ACCOUNT
    (
        ACCOUNT_NO
    )


(唯一)索引可以建立在多个字段上:
CREATE UNIQUE INDEX
    "IDX_ACCOUNT_NO"
ON
    T_ACCOUNT
    (
        COMPANY_ID, ACCOUNT_NO
    )


还可以根据字段升(降)序来索引:
CREATE UNIQUE INDEX
    "IDX_ACCOUNT_NO"
ON
    T_ACCOUNT
    (
        COMPANY_ID ASC,
        ACCOUNT_NO DESC
    )


删除(唯一)索引:
DROP INDEX "IDX_ACCOUNT_NO"

删除不存在的索引会报错。

9. IF EXISTS

DB2不支持下面的写法:
DROP TABLE IF EXISTS t_b


10. 执行系统命令

在DB2客户端执行REORG等命令会报错,可以调用系统存储过程:

CALL SYSPROC.ADMIN_CMD('REORG TABLE t_b');
分享到:
评论

相关推荐

    db2数据库sql语句大全

    根据提供的标题、描述以及部分文本内容,我们可以整理出与DB2数据库相关的多个知识点。...以上内容涵盖了DB2数据库中一些常用的操作命令和SQL语句,对于日常维护和管理DB2数据库具有重要的参考价值。

    DB2数据库SQL注入语句

    本文将深入探讨DB2数据库中的SQL注入语句,以及如何通过这些语句来猜解数据库结构和数据。 首先,SQL注入的基础原理是通过在合法的SQL查询语句中嵌入恶意代码,以改变原本的查询逻辑。在给定的示例中,攻击者试图猜...

    DB2中常用SQL语句

    ### DB2中常用SQL语句知识点详述 #### 数据库简介 DB2是IBM公司推出的一款关系型数据库管理系统,广泛应用于各种规模的企业级环境中。为了更高效地管理和操作数据库,掌握常用的SQL语句是非常必要的。SQL...

    SQL_Server,Oracle,DB2数据库SQL语句比较

    标题与描述均聚焦于SQL Server, Oracle, 和DB2数据库中的SQL语句比较,这是一个对IT专业人士特别是数据库管理员(DBA)、开发人员以及对数据库技术感兴趣的人来说极为实用的主题。以下是对给定文件中提及的关键知识点...

    DB2 SQL语句性能分析方法

    ### DB2 SQL语句性能分析方法详解 #### 一、引言 在现代数据库管理系统(DBMS)中,SQL语句的性能优化对于提高整体应用程序的响应速度和资源利用率至关重要。IBM DB2 Universal Database (UDB) 作为一款成熟且功能...

    DB2数据库SQL注入手册1

    1. 版本信息:可以使用以下SQL语句来获取DB2数据库的版本信息: ```sql SELECT versionnumber, version_timestamp FROM sysibm.sysversions; ``` 2. 当前用户:可以使用以下SQL语句来获取当前用户信息: ```sql ...

    DB2 UDB SQL语句的生命周期.pdf

    DB2 UDB是IBM公司开发的关系型数据库管理系统的一部分,而SQL语句是数据库操作的核心,它们的生命周期通常包含以下几个阶段:提交、分析、编译、执行、清理等。本文将详细介绍DB2 UDB处理SQL语句的整个生命周期,并...

    DB2常用语句集萃

    【DB2常用语句集萃】中的知识点涵盖了SQL查询的多个方面,主要涉及了数据的检索、聚合、分组、转换以及联接操作。以下是对这些知识点的详细说明: 1. **空值处理**:使用`ISNULL`函数来处理NULL值,例如`isnull...

    DB2常用SQL写法

    DB2中可以创建自定义结构数据类型,例如create type my_type as(username varchar(20), department integer, salary decimal(10,2)) not final mode db2sql;该语句创建了一个名为my_type的自定义结构数据类型,具有...

    DB2数据库SQL语句错误代码查询

    ### DB2数据库SQL语句错误代码查询:深入解析与应对策略 #### 引言 在进行数据库操作时,遇到SQL语句错误是常有的事,尤其是对于DB2这样的大型关系型数据库管理系统而言,其丰富的功能和复杂的架构可能导致各种...

    db2 SQL语法和语句块大全

    - **语句块**:是在单个事务中执行的一组SQL语句,可以包含变量定义、流程控制结构(如IF-THEN-ELSE、WHILE-DO循环)等。 - **存储过程**:是一种预编译的SQL代码集合,可以接受参数输入,返回值或结果集,并在...

    db2常用45条语句

    以下是一些关于DB2的常用SQL语句,它们涵盖了查询、聚合、条件过滤、转换等功能,对于理解和操作DB2数据库非常有帮助: 1. **查询员工信息**:这条语句通过`ISNULL`函数处理出生日期为空的情况,将其替换为“日期不...

    常用SQL语句大全,含常用高效SQL语句

    标题中的“常用SQL语句大全,含常用高效SQL语句”指的是这是一份集合了多种常见且高效的SQL语言表达式的文档。描述中的“非常不错的文档。常用精妙SQL语句收集,含常用高效SQL语句”进一步强调了文档的价值,它包含...

    常用sql语句集锦(PDF)

    首先,我们会简介SQL语句的分类及其在数据库管理中的应用。SQL,即结构化查询语言(Structured Query Language),是用于存储、检索和操作数据库的标准编程语言。SQL语句通常分为三大类:DDL(数据定义语言)、DML...

    Oracle迁移到DB2 SQL语句差异

    ### Oracle迁移到DB2 SQL语句差异 在IT项目的实施过程中,可能会遇到客户提出更换数据库的需求,例如从Oracle迁移到DB2。这种情况下,除了要考虑配置上的差异外,还需要关注SQL语句的不同之处。以下是对Oracle与DB2...

    DB2很不错的学习资料

    - `DB2常用SQL语句以及数据库原理.doc` 提供了对SQL语言基础的理解,包括SELECT查询、INSERT插入、UPDATE更新和DELETE删除等操作,以及如何在DB2环境中创建和管理表、视图、索引等数据库对象。 - 数据库原理部分...

Global site tag (gtag.js) - Google Analytics