数据库技术
文章平均质量分 52
曹牧
从牙牙学语到灵活运用,风风雨雨
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
Oracle 大表数据分区存储
示例:PARTITION BY LIST (region) (PARTITION p_east VALUES ('East'), PARTITION p_west VALUES ('West'))。示例:PARTITION p2022 VALUES LESS THAN (TO_DATE('2023-01-01', 'YYYY-MM-DD')) TABLESPACE ts_2022。总结:合理选择分区类型和键,结合局部索引和表空间分离,动态管理分区结构,是Oracle大表分区存储的最佳实践。原创 2026-01-07 09:27:33 · 581 阅读 · 0 评论 -
Oracle:大量数据删除
在Oracle数据库中处理大量数据的删除操作时,需要采取谨慎的策略,以确保操作的效率和避免对数据库性能造成过大影响。这可以通过Oracle的备份解决方案(如RMAN)或通过导出工具(如expdp或exp)完成。通过分区可以更灵活地管理和删除数据。将删除操作分批进行,每次删除一部分数据。在执行过程中,监控数据库的性能和资源使用情况(如CPU、内存、IO)。注意,TRUNCATE会重置表,并释放空间,但会丢失所有数据,并且不能回滚。通过上述方法,可以更安全、有效地处理Oracle数据库中的大量数据删除操作。原创 2026-01-07 09:22:26 · 424 阅读 · 0 评论 -
Oracle:单一索引和联合索引
在这个例子中,idx_employee_department 是索引的名称,employees 是表名,department_id 和 name 是要联合索引的列。维护成本:过多的索引会增加数据插入、删除和更新操作的开销,因为每次数据变更都需要更新所有相关的索引。Oracle支持两种基本的索引类型:单一字段索引和联合索引(也称为复合索引)。在这个例子中,idx_employee_name 是索引的名称,employees 是表名,name 是要索引的列。单一字段索引是基于表中的一个单一列创建的索引。原创 2026-01-07 09:18:52 · 384 阅读 · 0 评论 -
Oracle统计每日发生次数
在Oracle数据库中,统计每日发生次数通常指的是对某个事件或记录在每天的基础上的计数。下面是一些常见的方法来实现这一需求。这里,TRUNC(event_date) 用于获取日期部分,忽略时间部分,GROUP BY 按日期分组,COUNT(*) 计算每个组的记录数。方法2:使用 COUNT() 和 PARTITION BY(适用于Oracle 12c及以上版本)这种方法会为每个事件返回一个包含日计数在内的行,这对于某些分析场景可能很有用。这将为每一天返回一个计数,并且如果需要,还可以扩展到总的计数。原创 2025-12-29 08:30:26 · 999 阅读 · 0 评论 -
Oracle:判断一个字符串出现次数
REGEXP_INSTR(SUBSTR('hello world hello', REGEXP_INSTR('hello world hello', 'hello') + LENGTH('hello')), 'hello') > 0 THEN '出现两次'INSTR(SUBSTR('hello world hello', INSTR('hello world hello', 'hello') + LENGTH('hello')), 'hello') > 0 THEN '出现两次'ELSE '不是两次'原创 2025-12-23 12:57:25 · 449 阅读 · 0 评论 -
PLSQL:候选字段选择
Tips:字段按照类型、类型命名,以dt为前缀,代表时间类型字段,以flag为前缀,代表各类标记标识。以code为前缀,代表各类编码;以id为前缀代表各表主键;以name为前缀,代表对应编码的名称。字段名称按照规则命名,便于字段过滤和查找。候选菜单,选择【all】,录入所有字段。过滤字段名称,【all】所有前缀字段。原创 2025-12-23 10:58:30 · 607 阅读 · 0 评论 -
Oracel:Field IN Field
如果你想要检查一个字段(列)中的值是否存在于另一个表的字段中,你可以使用EXISTS子查询。在Oracle数据库中,如果想在一个查询中比较一个字段(列)的值是否存在于另一个字段(列)的值中,可以使用IN操作符。如果目的是找出两个表中某些列的共有值,可以使用INTERSECT操作符。另一种方法是使用JOIN来达到相同的效果。但是,直接使用IN操作符将一个字段用在另一个字段上是不支持的。方法4:使用MINUS(如果需要找出第一个表中独有的值)方法5:使用NOT EXISTS来找出不在第二个表中的值。原创 2025-12-22 14:53:48 · 283 阅读 · 0 评论 -
Oracle SQL 中,& 字符
在 Oracle SQL 中,& 字符作为替代变量的标志,会导致查询时提示输入值。替代方案:SET DEFINE *;优势:性能优于字符串拆分,且兼容 SQL*Plus 和 PL/SQL。在当前会话内有效,需重新开启会话后重置。语法:'前缀' || CHR(38) || '后缀'语法:'前缀' || '&' || '后缀'命令:SET DEFINE OFF;注意:效率最低,需两次字符串连接。2. 使用 CHR(38) 替换。1. 关闭替代变量功能。3. 字符串拆分。原创 2025-12-19 10:01:53 · 372 阅读 · 0 评论 -
Oracle:计算小数年龄
首选方法:使用 months_between(sysdate, birth_date) / 12 直接得到小数年龄,这是Oracle中最标准的做法。在Oracle数据库中,计算小数年龄(即精确到小数点后的年龄,考虑月份和天数)可以通过日期函数实现。注意:如果出生日期的月份和日期尚未到来(如当前是3月,生日是4月),此方法会自动向下取整,符合年龄计算逻辑。关键函数:months_between 是核心,它自动处理日期计算的复杂性(如不同月份的天数差异)。sysdate 获取当前系统日期。原创 2025-12-09 15:41:59 · 494 阅读 · 0 评论 -
Oracle:Replace
这个例子中,[abc]是一个字符类,匹配任何一个列出的字符('a'、'b'或'c'),而管道符(|)在这里用来分隔不同的替换模式是不正确的。如果你想一次性替换多个字符,你可以使用正则表达式的管道符(|)来分隔不同的字符。在这个例子中,我们首先将所有的'a'替换为空字符串,然后将结果中的所有'b'也替换为空字符串。在Oracle数据库中,如果你想使用REPLACE函数来将多个字符替换为空字符串,你可以通过嵌套REPLACE函数或者使用正则表达式来实现。方法2:使用正则表达式(Oracle 10g及以上版本)原创 2025-12-09 15:37:10 · 315 阅读 · 0 评论 -
Oracle:字段值中含有单引号
在Java中操作Oracle数据库时,如果字段值中包含单引号('),这可能会引起SQL注入的风险,尤其是在使用字符串拼接的方式来构建SQL语句时。创建PreparedStatement:通过调用Connection对象的prepareStatement()方法,传入SQL语句(此处使用?// 使用参数化查询。假设你有一个Oracle数据库,其中有一个表users,你想根据用户名(可能包含单引号)来查询用户信息。设置参数:通过PreparedStatement的setString()方法设置参数值,原创 2025-12-04 15:25:55 · 355 阅读 · 0 评论 -
Oracle:数字转换为字符串
虽然通常不需要这样做,但在某些复杂的转换中,你可以先用 TO_NUMBER 将字符转为数字,然后再用 TO_CHAR 转回字符,但这样做实际上是多余的,直接使用 TO_CHAR 更为直接和高效。-- 直接将数字转换为字符串,后面加一个空字符串是为了确保结果是字符串类型。虽然这种方法不是专门用于数字到字符的转换,但它可以用于将数字与其他字符串连接。假设你有一个名为 employees 的表,其中有一个名为 salary 的数字列,你想将这个数字列转换为字符串。TO_CHAR 函数可以将数字转换为字符串。原创 2025-12-02 17:04:07 · 408 阅读 · 0 评论 -
Oracle:“列不能外部关联到子查询”
在Oracle数据库中,当你尝试在查询中引用外部列(即外部查询中的列)在子查询中,可能会遇到“列不能外部关联到子查询”的错误。在编写子查询时,不能直接引用外部查询的列,除非通过某种方式明确地将这些列作为参数传递或以其他方式关联。对于一些特定的场景,可以使用IN或EXISTS来替代子查询,这样可以避免直接在子查询中引用外部列。如果子查询非常复杂且需要频繁使用,可以考虑创建一个视图或物化视图来存储这个查询的结果。CTE允许你在查询开始之前定义一个临时的结果集,然后在主查询中引用这个结果集。原创 2025-12-02 17:02:26 · 804 阅读 · 0 评论 -
Oracle:Replace
注意:在Oracle中,通常不直接使用 dual 表进行字符串操作,而是在实际应用中生成或选择包含这些字符串的列或变量。假设你有一个名为 employees 的表,其中有一个名为 email 的列,你想将所有的 @example.com 替换为 @newcompany.com。如果你需要进行更复杂的字符串替换,比如基于正则表达式的模式匹配,可以使用 REGEXP_REPLACE 函数。substring_to_replace 是你想替换的子字符串。replacement_string 是用来替换的字符串。原创 2025-12-02 17:00:15 · 338 阅读 · 0 评论 -
Oracle中ROW_NUMBER() OVER()
Oracle中ROW_NUMBER() OVER()是窗口函数,用于为查询结果集中的每一行分配唯一序号,支持分组排序和全局排序。ROW_NUMBER() OVER([PARTITION BY 分组列] ORDER BY 排序列 [ASC|DESC])PARTITION BY:按指定列分组,未指定则对整个结果集排序。ROW_NUMBER():支持分组排序,为每行分配唯一序号。ORDER BY:定义排序规则(升序或降序)。ROWNUM:伪列,(3) 分组排名。3、与ROWNUM的区别。原创 2025-12-02 12:07:25 · 475 阅读 · 0 评论 -
Oracle CASE WHEN
示例:CASE WHEN salary > 10000 THEN '高管' WHEN salary BETWEEN 5000 AND 10000 THEN '高绩效' ELSE '普通' END。Oracle 23c新特性:支持逗号分隔的多值匹配,简化等值判断(如CASE salary WHEN 9000,12000 THEN '标准薪资')示例:CASE sex WHEN '1' THEN '男' WHEN '2' THEN '女' ELSE '其他' END1。原创 2025-12-02 10:21:16 · 677 阅读 · 0 评论 -
Oracle数据库中提取JSON字段值
json('{"payDate":"2020-12-15","payAmount":"10000000","detail":{"trader":["张三","李四"]}}'),在Oracle数据库中提取JSON字段值,主要有以下几种方法,具体选择取决于你的Oracle版本和JSON结构复杂度。版本优先:如果使用12c及以上版本,优先选择JSON_VALUE函数,代码更简洁且性能更好。对于Oracle 12c及更高版本,JSON_VALUE函数是最直接的方式。处理复杂JSON结构。原创 2025-11-20 12:35:42 · 750 阅读 · 0 评论 -
Oracle数据库阻塞问题
会话监控:定期检查V$SESSION视图中的BLOCKING_SESSION字段,及时发现潜在阻塞。针对Oracle数据库阻塞问题,排查步骤和性能调优语句,结合了锁分析、会话管理和SQL优化等多个维度。该查询会返回正在阻塞其他操作的会话信息,其中BLOCK列值为1表示该会话是阻塞源。发现未提交事务后,应联系相关用户提交或回滚,必要时可执行ROLLBACK强制回滚。TM锁:表级DML锁,常见于外键约束缺失索引或父表修改场景。-- 查找阻塞其他会话的锁。TX锁:事务锁,通常由应用逻辑问题引起。原创 2025-11-12 14:29:50 · 320 阅读 · 0 评论 -
Oracle:not all variables bound
在Oracle数据库中,错误消息“not all variables bound”时,通常意味着在执行一个SQL查询时,试图将一个变量绑定到一个查询的参数位置,但该变量没有被正确绑定或初始化。这个问题经常出现在使用PL/SQL(如匿名块或存储过程)或通过某些编程语言(如Java, Python等)与Oracle数据库交互时。在支持命名绑定的环境中(如某些版本的cx_Oracle),使用命名绑定可以使代码更清晰易读。确保你的SQL查询中的占位符(如:1, :name等)与绑定的变量数量和类型一致。原创 2025-10-31 12:34:00 · 448 阅读 · 0 评论 -
Oracle数据库中最新的一条数据
方法1: 使用ORDER BY 和ROWNUM。方法4: 使用窗口函数ROW_NUMBER()方法3: 使用INNER JOIN。方法2: 使用子查询和MAX函数。原创 2025-10-22 16:23:14 · 321 阅读 · 0 评论 -
Oracle 随机采样
对于需要高命中率的场景,建议优先考虑混合抽样法,通过调整SAMPLE百分比(如10%-20%)和最终提取数量来平衡性能与随机性。若数据量较小(百万级以下)可直接使用纯随机排序法确保完全随机。使用dbms_random.value函数对全表数据进行随机排序后提取,这种方法随机性好但性能较差,特别是数据量大时会影响查询效率4。结合上述两种方法,先用SAMPLE缩小数据范围再用随机数排序,在性能和随机性间取得平衡。使用SAMPLE子句直接抽取数据块,性能最佳但随机性较差,可能导致数据分布不均。原创 2025-10-20 10:13:18 · 633 阅读 · 0 评论 -
Oracle:字段 not in
NOT IN在子查询结果包含NULL值时会导致整个查询返回空结果,因为Oracle处理NULL值的逻辑是"未知",任何与NULL的比较都会返回UNKNOWN而非TRUE7。SELECT * FROM tableA WHERE col NOT IN (SELECT col FROM tableB) -- 若tableB.col存在NULL则无结果。静态值列表较短且无NULL时可用NOT IN(如NOT IN (1,2,3))在Oracle数据库中,NOT IN运算符用于检查字段值是否不包含在。原创 2025-10-17 15:48:45 · 310 阅读 · 0 评论 -
oracle:判断字段不以开头
在Oracle中判断字段值不以特定字符开头,主要有以下几种方法:1、使用NOT LIKE运算符最直接的方式是使用NOT LIKE配合通配符'%',例如查找不以'T'开头的记录:SELECT * FROM table_name WHERE column_name NOT LIKE 'T%';这种方法适用于简单的前缀匹配场景。2、结合SUBSTR和LENGTHB函数对于需要区分字母和汉字开头的场景,可以利用字节长度判断:SELECT * FROM table_nameWHERE LENGTHB(SUB原创 2025-10-17 15:45:32 · 319 阅读 · 0 评论 -
oracle:NOT IN
这是因为NOT IN的逻辑等价于多个AND连接的<>条件,而任何值与NULL比较的结果均为UNKNOWN,最终使整个条件失效。在Oracle中应优先使用NOT EXISTS或LEFT JOIN替代NOT IN,尤其在涉及NULL值或大数据量时。在Oracle数据库中,NOT IN运算符的使用需要特别注意其与NULL值的交互问题及性能优化方案。NOT IN:适合子查询结果集小且无NULL值的情况,但需注意全表遍历的性能开销。1. NOT IN与NULL值的陷阱。4. 实际案例中的问题解决。原创 2025-10-17 15:32:27 · 282 阅读 · 0 评论 -
oracle:To_char
日:DD(月中的日)、DDD(年中的日)、DY(星期缩写如FRI)、DAY(星期全拼如FRIDAY)时间:HH24(24小时制)、HH12(12小时制)、MI(分钟)、SS(秒)、FF(毫秒)月份:MM(数字月)、MON(缩写如NOV)、MONTH(全拼如NOVEMBER)年份:YYYY(四位年)、YY(两位年)、YEAR(英文全拼)文字字符:可在格式中添加-、/等分隔符(如YYYY-MM-DD)附加信息:AD/BC(纪元标识)、Q(季度)、WW(年周数)-- 包含文字和修饰符。原创 2025-10-16 15:10:47 · 277 阅读 · 0 评论 -
Oracle中的ROUND函数
输出格式问题:若需强制显示前导零(如0.10),需结合TO_CHAR函数使用格式模型'FM9990.00'。浮点数精度:Oracle对BINARY_FLOAT和BINARY_DOUBLE类型的处理可能影响结果。TRUNC:直接截断,不四舍五入(如TRUNC(123.456, 2)返回123.45)。四舍五入到最近的小时:ROUND(SYSDATE, 'HH')。负数处理:ROUND(-3.6, 0) → 返回-4。月份的四舍五入规则:若日期在当月15日前归本月,否则归下月。若为负数,则对整数部分四舍五入;原创 2025-10-10 12:35:43 · 321 阅读 · 0 评论 -
sqlserver:单引号 Vs 双引号
SQL Server允许在QUOTED_IDENTIFIER为ON时,双引号包含短字符串(长度不超过标识符限制),但会引发警告。双引号:当QUOTED_IDENTIFIER为ON时,双引号仅用于分隔包含特殊字符(如空格)的标识符(表名、列名等),此时双引号不能用于字符串定界。双引号:仅当QUOTED_IDENTIFIER为OFF时,双引号可作为字符串定界符(不推荐)。嵌入单引号需转义为'',而双引号在标识符中需转义为""(当QUOTED_IDENTIFIER为ON时)。原创 2025-09-26 15:48:20 · 395 阅读 · 0 评论 -
sqlserver:函数默认20个9
在SQL Server中,可以通过自定义函数实现返回20个"9"的功能。函数创建时需要指定所有者(如dbo)原创 2025-09-26 15:43:08 · 260 阅读 · 0 评论 -
Oracle:LEFT JOIN和INNER JOIN的查询效率差异
仅返回两表匹配的行,减少了结果集规模,且数据库优化器可自由选择驱动表(通常选数据量小的表作为基础表)。索引影响:若右表连接字段无索引而左表有索引,LEFT JOIN可能比INNER JOIN更快(因INNER JOIN可能被迫扫描全表)。结果集控制:LEFT JOIN可配合WHERE右表字段 IS NOT NULL模拟INNER JOIN行为。数据分布:当左表极小且右表极大时,INNER JOIN可能因优化器选择小表驱动而更高效。索引策略:确保连接字段建立索引,尤其是右表字段。原创 2025-09-24 10:46:54 · 404 阅读 · 0 评论 -
Oracle:LEFT JOIN操作必须配合ON
若省略ON条件,在多数数据库系统中会直接报错,而在某些情况下可能隐式转换为交叉连接(CROSS JOIN),导致两表所有行组合的笛卡尔积结果。Oracle支持传统的外连接语法(使用(+)操作符),此时连接条件需写在WHERE子句中而非ON后。ON条件:在LEFT JOIN中,ON用于定义表间连接逻辑,即使条件不满足也会保留左表所有行(右表对应字段填充NULL)。WHERE条件:在连接完成后进行过滤,会排除不符合条件的行(包括左表保留的行)47。2、ON与WHERE的区别。1、连接条件的必要性。原创 2025-09-24 10:38:59 · 243 阅读 · 0 评论 -
Oracle:select top 5
适用于需要分组取前N条的场景(如按部门取薪资前5员工)。此方法直接返回物理排序后的前5条记录。功能需采用特定语法,因其原生不支持。先通过子查询排序数据,再在外层用。在Oracle数据库中实现。原创 2025-09-05 13:46:00 · 318 阅读 · 0 评论 -
sqlserver:多字段排序
在SQL Server中,多字段排序是通过ORDER BY子句实现的,可以同时指定多个排序字段及其排序方向(升序ASC或降序DESC)。NULL值默认在升序时排在最前,降序时排在最后,具体行为可能因数据库配置而异。先按客户ID升序,再按订单日期降序。原创 2025-09-04 10:43:39 · 331 阅读 · 0 评论 -
SqlServer:NoLock
在SQL Server中,表提示通过绕过锁机制提升查询效率,但会带来数据一致性问题。原创 2025-08-28 10:15:59 · 343 阅读 · 0 评论 -
SqlServer:EXISTS
在SQL Server中,EXISTS是一个布尔运算符,用于检查子查询是否返回至少一行结果。原创 2025-08-28 10:14:10 · 654 阅读 · 0 评论 -
sqlserver: count(*)
在SQL Server中优化。原创 2025-08-28 10:12:53 · 212 阅读 · 0 评论 -
sqlserver 临时表的用法
SQL Server 临时表是存储在 tempdb 数据库中的临时对象,主要用于会话期间存储中间数据。原创 2025-08-27 16:22:13 · 576 阅读 · 0 评论 -
PL/SQL Developer:查询窗口显示结果条数
在相同路径下,选择"每页记录数"为"所有记录",或勾选"All records"单选项(英文版),同时将"Maximum result set size"设置为0表示无限制。建议根据实际数据量选择方案:常规查询推荐固定显示数量(如100-500行),大数据量分析建议使用语法控制或分页查询。"选项中选择"固定",并输入需要显示的记录数量(如100条),最后点击应用和确定。打开菜单栏的【工具】→【首选项】→【窗口类型】→【SQL窗口】,在")直接限制返回行数,此方法不依赖客户端设置。原创 2025-08-26 10:58:56 · 890 阅读 · 0 评论 -
sql 时间字符串比较
要求格式严格一致,例如'2023-03-03'必须补零为'2023-03-03'而非'2023-3-3'原创 2025-08-20 08:53:13 · 402 阅读 · 0 评论 -
PL/SQL事务未提交的影响
PL/SQL事务未提交的影响原创 2025-08-07 12:04:31 · 2178 阅读 · 0 评论 -
PL/SQL Developer查看物化视图的方法
PL/SQL Developer查看物化视图的方法原创 2025-07-23 16:02:31 · 795 阅读 · 0 评论
分享