Backend - Oracle SQL

目录

[一、CRUD 增删改查(基础)](#一、CRUD 增删改查(基础))

(一)查询

(二)插入

(三)更新

(四)清空

[二、常用 SQL](#二、常用 SQL)

[1. exists 搭配 select 1](#1. exists 搭配 select 1)

[2. FROM DUAL](#2. FROM DUAL)

[3. INSTR()函数](#3. INSTR()函数)

[4. 提取字串](#4. 提取字串)

[5. IF 条件](#5. IF 条件)

(1)基本写法

(2)嵌套写法

[6. 循环](#6. 循环)

(1)for循环

(2)loop循环

[7. 格式化文本(换行)](#7. 格式化文本(换行))

[8. 游标](#8. 游标)

(1)游标类型

[① 系统自带:SYS_REFCURSOR](#① 系统自带:SYS_REFCURSOR)

[② 自定义强类型](#② 自定义强类型)

(2)游标属性

(3)用法

[① 定义游标时赋值](#① 定义游标时赋值)

[② 打开游标时赋值](#② 打开游标时赋值)

[9. SQL编辑器中的输出语法](#9. SQL编辑器中的输出语法)

[10. SQL编辑器中的异常信息](#10. SQL编辑器中的异常信息)

[11. 查询clob字段的值](#11. 查询clob字段的值)

(1)用PLSQL的Editor查看

(2)用SQL语句查询

[① 首先判断clob字符长度](#① 首先判断clob字符长度)

[② 查询内容](#② 查询内容)

[12. 日期处理(decode、nvl)](#12. 日期处理(decode、nvl))

(1)decode函数

(2)nvl函数

[13. LAG() 和 LEAD() 窗口函数](#13. LAG() 和 LEAD() 窗口函数)

[(1)LAG(column, n)](#(1)LAG(column, n))

[(2)LEAD(column, n)](#(2)LEAD(column, n))


一、CRUD 增删改查(基础)

(一)查询

查询前10行记录

sql 复制代码
SELECT ROWNUM, t.* FROM XXX t WHERE ROWNUM <= 10;

(二)插入

sql 复制代码
INSERT INTO 表名 (栏位名1,栏位名2) VALUES ('值1','值2'));

注意:执行更新和插入、删除时,一定要再三确认好语句后才执行。

(三)更新

sql 复制代码
UPDATE 表名
SET 栏位名 = '值', 栏位名2 = '值2'
WHERE 栏位名 = '值' and 栏位名2 = '值2';

注意:执行更新和插入、删除时,一定要再三确认好语句后才执行。

(四)清空

sql 复制代码
TRUNCATE TABLE 表名;

注意:执行更新和插入、删除时,一定要再三确认好语句后才执行。

二、常用 SQL

1. exists 搭配 select 1

select 1常用于判断子查询是否成功,返回的结果是满足查询条件的每行记录都返回1。

exists (子查询) 常搭配select 1子查询,用于判断子查询是否包含行,返回的结果是布尔值。

例如:

sql 复制代码
select * from Book Bk where exists (select 1 from Author where Bk.id = Author.bookid)

其中,若 select 1 这个子查询有返回值,则子查询满足条件,exists 返回True(理解:Book表中id是否在Author表中的bookid也有对应)。

2. FROM DUAL

理解:DUAL 是 Oracle 的虚拟表,不能更改该表(包括数据)。它只有一行一列。

作用:常用于从系统函数中取值时,保证查询语句完整来正常执行。

例如,查询当前系统时间:select sysdate from dual。

3. INSTR()函数

字符查找函数。查找一个字符串在另一个字符串中首次出现的位置,若找不到,则返回0。起始位置从1开始。

例如:INSTR("这是一个字符串,一个字符串喔", '一个')的结果是3。

4. 提取字串

substr(string, start_position, length)

5. IF 条件

(1)基本写法

sql 复制代码
IF ... THEN ... END IF;

(2)嵌套写法

sql 复制代码
IF <condition1> THEN
    -- 处理条件1为TRUE时的逻辑
    
    IF <condition2> THEN
        -- 处理条件2为TRUE时的逻辑
    ELSE
        -- 处理条件2为FALSE时的逻辑
    END IF;
    
ELSE
    -- 处理条件1为FALSE时的逻辑
END IF;

6. 循环

(1)for循环

sql 复制代码
FOR i in 1 .. length(变量名) 
LOOP 
   ...
END LOOP; 

(2)loop循环

相当于do..while循环

sql 复制代码
loop 
  ...
exit when 条件;
end loop;

7. 格式化文本(换行)

写法: CHR(13) || CHR(10)

8. 游标

(1)游标类型

① 系统自带:SYS_REFCURSOR

举例:

sql 复制代码
游标名 SYS_REFCURSOR;
② 自定义强类型

举例:

sql 复制代码
TYPE 游标类型名 IS REF CURSOR;  --  自定义REF CURSOR 强游标类型
游标名 游标类型名; -- 定义游标

(2)游标属性

sql 复制代码
%isopen -- 游标是否打开
%rowcount -- 已从游标中读取的记录数
%found -- 该行是否有值
%notfound -- 该行是否没有值

(3)用法

① 定义游标时赋值

在begin前定义:

sql 复制代码
cursor 游标名 IS SQL查询语句; --- 赋值SQL语句

打开:

sql 复制代码
open 游标名;  --- 使用前必须先打开

获取一行游标:

sql 复制代码
 fetch 游标名 into 变量名 ;  --- (变量名类型定义:表名.栏位名%type)

关闭:

sql 复制代码
close 游标名 ; --- 一经打开记得关闭
② 打开游标时赋值

在begin前定义:

sql 复制代码
TYPE 游标类型 IS REF CURSOR; 游标名 游标类型; --  REF CURSOR 类型(强类型)

打开:

sql 复制代码
OPEN 游标名 FOR SQL查询语句; --- 赋值SQL语句

9. SQL编辑器中的输出语法

sql 复制代码
DBMS_OUTPUT.PUT_LINE(' ');

注意:

DBMS_OUTPUT最大長度为32767。若想全部打印且不报异常,则如下:

首先定义时,

sql 复制代码
maxLength CONSTANT NUMBER := 32767;  -- DBMS_OUTPUT最大長度

然后begin时,

sql 复制代码
curLength := LENGTH(SQL变量名); --- 获取当前SQL语句的最大长度
FOR i IN 1..CEIL( curLength / maxLength) LOOP  --- 循环打印出SQL语句
       DBMS_OUTPUT.PUT_LINE(SUBSTR(SQL变量名, (i - 1) * maxLength + 1, maxLength));
END LOOP;

10. SQL编辑器中的异常信息

sql 复制代码
DBMS_UTILITY.format_error_backtrace

例如,打印出异常信息:

sql 复制代码
DBMS_OUTPUT.PUT_LINE(DBMS_UTILITY.format_error_backtrace);

11. 查询clob字段的值

该内容针对的是字段,若是Test,直接使用下方的变量值输出框即可查看CLOB值(注意使用 "=> :变量名"的冒号形式)。

(1)用PLSQL的Editor查看

在PLSQL中的表格数据中,右击,选择Open in Editor。

或者直接点击该单元格旁边的三点符号。

(2)用SQL语句查询

① 首先判断clob字符长度
sql 复制代码
SELECT DBMS_LOB.GETLENGTH(栏位名) 
FROM 表名
WHERE ROWNUM <10;
② 查询内容
sql 复制代码
-- 查询某栏位的前3500个字符,从第1个位置开始。
-- 使用SUBSTR方法时,长度不可超出4000。
SELECT  DBMS_LOB.SUBSTR(栏位名, 3500, 1) 
FROM 表名 
WHERE ROWNUM <10; 

12. 日期处理(decode、nvl)

(1)decode函数

sql 复制代码
decode(条件,值1,返回值1,值2,返回值2,...值n,返回值n,缺省值) 
--- 若条件1等于值1,则返回值1,然后依次检查,若都不满足,则默认缺省值,若没有缺省值,则默认为null。

(2)nvl函数

sql 复制代码
nvl(column, 默认值) --- 若某字段为null,则显示默认值。

13. LAG() 和 LEAD() 窗口函数

(1)LAG(column, n)

访问当前行之前的最近某行中的数据。

sql 复制代码
LAG(column, 1, 默认值) OVER(ORDER BY column)  --- 查询column该字段中每行的前面最近1行的数据,若无值则默认值。

(2)LEAD(column, n)

访问当前行之后的最近某行中的数据。

sql 复制代码
LEAD(column,2, 默认值) OVER(ORDER BY column)  --- 查询column该字段中每行的后面次近1行(第2近行)的数据,若无值则默认值。

注意:

一般需要搭配排序(如OVER(ORDER BY column)),LAG和LEAD函数才有意义。

相关推荐
Faith_xzc10 分钟前
MySQL 迁移至 Doris 最佳实践方案
数据库·mysql·adb
ikun·12 分钟前
MySQL高可用
数据库·mysql
Bug退退退1231 小时前
分析 redis 的 exists 命令有一个参数和多个参数的区别
数据库·redis·缓存
老天文学家了1 小时前
蓝桥杯-不完整的算式
数据库·职场和发展·蓝桥杯
YUNYINGXIA1 小时前
PostgreSQL初体验
数据库·postgresql
舰长1151 小时前
ubuntu 安装 Redis新版Redis 7.x
数据库·redis·ubuntu
文牧之1 小时前
Oracle 数据库的默认隔离级别
运维·数据库·oracle
洁✘2 小时前
POSTGRESQL 初体验
数据库·postgresql
李昊翔的博客2 小时前
保证数据库 + redis在读写分离场景中事务的一致性
数据库·redis·oracle
瀚高PG实验室3 小时前
流复备机断档处理
数据库·oracle