Backend - Oracle SQL

发布于:2025-05-21 ⋅ 阅读:(19) ⋅ 点赞:(0)

目录

一、CRUD 增删改查(基础)

(一)查询

(二)插入

(三)更新

(四)清空

二、常用 SQL

1. exists 搭配 select 1

2. FROM DUAL

3. INSTR()函数

4. 提取字串

5. IF 条件

(1)基本写法

(2)嵌套写法

6. 循环

(1)for循环

(2)loop循环

7. 格式化文本(换行)

8. 游标

(1)游标类型

① 系统自带:SYS_REFCURSOR

② 自定义强类型

(2)游标属性

(3)用法

① 定义游标时赋值

② 打开游标时赋值

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

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

11. 查询clob字段的值

(1)用PLSQL的Editor查看

(2)用SQL语句查询

① 首先判断clob字符长度

② 查询内容

12. 日期处理(decode、nvl)

(1)decode函数

(2)nvl函数

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

(1)LAG(column, n)  

(2)LEAD(column, n)  


一、CRUD 增删改查(基础)

(一)查询

查询前10行记录

SELECT ROWNUM, t.* FROM XXX t WHERE ROWNUM <= 10;

(二)插入

INSERT INTO 表名 (栏位名1,栏位名2) VALUES ('值1','值2'));

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

(三)更新

UPDATE 表名
SET 栏位名 = '值', 栏位名2 = '值2'
WHERE 栏位名 = '值' and 栏位名2 = '值2';

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

(四)清空

TRUNCATE TABLE 表名;

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

二、常用 SQL

1. exists 搭配 select 1

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

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

        例如:

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)基本写法

IF … THEN … END IF;

(2)嵌套写法

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

6. 循环

(1)for循环

FOR i in 1 .. length(变量名) 
LOOP 
   …
END LOOP; 

(2)loop循环

        相当于do..while循环

loop 
  …
exit when 条件;
end loop;

7. 格式化文本(换行)

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

8. 游标

(1)游标类型

① 系统自带:SYS_REFCURSOR

        举例:

游标名 SYS_REFCURSOR;
② 自定义强类型

        举例:

TYPE 游标类型名 IS REF CURSOR;  --  自定义REF CURSOR 强游标类型
游标名 游标类型名; -- 定义游标

(2)游标属性

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

(3)用法

① 定义游标时赋值

        在begin前定义:

cursor 游标名 IS SQL查询语句; --- 赋值SQL语句

        打开: 

open 游标名;  --- 使用前必须先打开

        获取一行游标:

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

        关闭: 

close 游标名 ; --- 一经打开记得关闭
② 打开游标时赋值

        在begin前定义:

TYPE 游标类型 IS REF CURSOR; 游标名 游标类型; --  REF CURSOR 类型(强类型)

        打开:

OPEN 游标名 FOR SQL查询语句; --- 赋值SQL语句

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

DBMS_OUTPUT.PUT_LINE(' ');

注意:

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

        首先定义时,

maxLength CONSTANT NUMBER := 32767;  -- DBMS_OUTPUT最大長度

        然后begin时,

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编辑器中的异常信息

DBMS_UTILITY.format_error_backtrace

例如,打印出异常信息:

DBMS_OUTPUT.PUT_LINE(DBMS_UTILITY.format_error_backtrace);

11. 查询clob字段的值

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

(1)用PLSQL的Editor查看

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

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

(2)用SQL语句查询

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

12. 日期处理(decode、nvl)

(1)decode函数

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

(2)nvl函数

nvl(column, 默认值) --- 若某字段为null,则显示默认值。

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

(1)LAG(column, n)  

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

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

(2)LEAD(column, n)  

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

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

注意:

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


网站公告

今日签到

点亮在社区的每一天
去签到