数据库相关操作
数据库相关操作
- Redis
- Key(键)操作
- MySQL
- 查看表已有索引
- 创建/删除索引
- 是否命中索引
- Oracle
- 备份/恢复/删除表
- REGEXP_SUBSTR
- INSTR(string, substring)
- ROWNUM
- DBMS_RANDOM.VALUE()
- 判空
- 两个日期间隔
Redis
Key(键)操作
命令 | 描述 | 例子 |
---|---|---|
DEL key | 删除指定键(支持多键,如 DEL key1 key2 ) | DEL sys_dict:hangup_cause (删除指定键) |
KEYS pattern | 按模式匹配查询键(* 通配符,如 sys_dict:* ) | KEYS sys_dict:* (查所有 sys_dict: 开头的键 ) |
MySQL
查看表已有索引
SHOW INDEX FROM `表名` IN `数据库名`;
结果说明:
Key_name:索引名称(PRIMARY 为主键索引)。
Column_name:索引包含的列名。
Non_unique:是否为非唯一索引(0 表示唯一索引,1 表示非唯一索引)。
Index_type:索引类型(如 BTREE、HASH 等)。
创建/删除索引
-- 创建索引
CREATE INDEX idx_record ON record (from_user, -- 优先放置等值查询或前缀模糊查询的字段start_time DESC, -- 范围查询 + 排序字段(DESC 与 ORDER BY 一致)end_time -- 若查询中需要过滤 end_time,可加入索引(但范围查询后字段无法再利用索引)
);
-- 删除索引
DROP INDEX idx_record ON record;
是否命中索引
EXPLAIN SELECT ... -- 你的原始查询语句
结果说明:
key:实际使用的索引。若为NULL则表示未使用索引
possible_keys :可能使用的索引列表
type 连接类型,常见值:
- ALL:全表扫描(未命中索引)
- index:索引扫描
- range:范围扫描(如LIKE ‘abc%’)
- ref:使用非唯一索引查找
Extra额外信息,常见值:
- Using index:使用了覆盖索引(性能最佳)
- Using where:使用了 WHERE 过滤
- Using filesort:需要文件排序(性能较差)
Oracle
备份/恢复/删除表
--备份
CREATE TABLE table_t_backup AS
SELECT *
FROM table_t
WHERE t_flag = 0
AND t_CODE IN('8AP57','8AP51');
--恢复
MERGE INTO table_t t
USING table_t_backup s
ON (t.ID = s.ID)
WHEN MATCHED THENUPDATE SET t.NUMBER = s.NUMBER,t.PAPT_NUMBER = s.PAPT_NUMBER,
AND s.CODE IN('8AP57','8AP51');
--删除
DROP TABLE table_t_backup
REGEXP_SUBSTR
从字符串中提取与正则表达式匹配的子串
REGEXP_SUBSTR(source_string, -- 源字符串(必填)pattern, -- 正则表达式模式(必填)[position], -- 开始搜索的位置(可选,默认 1,支持负数从右向左)[occurrence], -- 匹配第几次出现的结果(可选,默认 1)[match_param], -- 匹配参数(可选,控制大小写、换行等)[subexpression] -- 提取第几个子匹配项(可选,默认 0 表示整个匹配)
)
参数 | 描述 |
---|---|
source_string | 要搜索的字符串,可以是列名或字符串字面量 |
pattern | 正则表达式模式,支持标准正则语法(如 \d、*、+ 等) |
position | 搜索起始位置: - 正数:从左到右第 position 个字符开始(默认 1) - 负数:从右到左第 abs(position) 个字符开始 |
occurrence | 指定返回第几次匹配的结果,默认为 1(第一次匹配) |
match_param | 匹配参数(可选,多个参数可组合使用): ‘i’:不区分大小写 ‘c’:区分大小写(默认) ‘n’:允许 . 匹配换行符 ‘m’:多行模式(^ 和 $ 匹配行首尾) ‘x’:忽略模式中的空白字符 null |
subexpression | 提取正则表达式中第 n 个括号内的子匹配项(()): 0:返回整个匹配结果(默认) 1:返回第 1 个括号内的子串 2:返回第 2 个括号内的子串,依此类推 |
SELECT REGEXP_SUBSTR('user@example.com', '^([^@]+)') AS username FROM DUAL;
-- 正则解析:^([^@]+) 表示以非 @ 字符开头的第一个子串
-- 输出:user
INSTR(string, substring)
Oracle 的内置函数,用于查找 substring 在 string 中首次出现的位置。如果找到,返回位置索引(从 1 开始);如果未找到,返回 0。
一个字符串含多个符号时,只返回第一个的位置
INSTR(‘ABC-DEF’, ‘-’) → 返回 4(连字符 - 在第 4 个位置)
INSTR(‘ABCDEF’, ‘-’) → 返回 0(没有连字符)
WHERE INSTR(HARDWARE_NUMBER, '-') > 0
结果:这个条件等价于 “字段中包含 -”
WHERE INSTR(ms.SOFTWARE_NUMBER, '-', INSTR(ms.SOFTWARE_NUMBER, '-') + 1) > 0
结果:判断字段中是否至少包含两个 -
ROWNUM
ROWNUM是 Oracle 的行号伪列,用于标识结果集中的行顺序
ROWNUM必须在结果集生成后才能使用,故必须用子查询
SELECT *
FROM (SELECT * FROM t_table
)
WHERE ROWNUM <= 20;
结果:返回的是满足条件的前 20 行,但顺序是未定义的(通常按数据在磁盘中的物理存储顺序,或索引顺序)
DBMS_RANDOM.VALUE()
DBMS_RANDOM.VALUE() 是 Oracle 内置函数,会为结果集中的每一行生成一个随机数。
按这些随机数排序后,结果集就会呈现随机排列的状态。
SELECT *
FROM (SELECT * FROM INVOKE_LOGORDER BY DBMS_RANDOM.VALUE()
)
WHERE ROWNUM <= 20;
结果:随机前20条数据
判空
AND (ms.ECU_PAPT_NUMBER IS NULL OR ms.ECU_PAPT_NUMBER = '')
两个日期间隔
SELECT *
FROM LOG pl
WHERE pl.NAME = 'add' AND pl.TIME BETWEEN TO_DATE('2021-09-06 00:00:00', 'YYYY-MM-DD HH24:MI:SS')AND TO_DATE('2025-09-06 23:59:59', 'YYYY-MM-DD HH24:MI:SS')