04oracle之高水位、别名、字符和日期、伪表-dual、空值运算、Escape-转义字符、条件运算符

探讨Oracle数据库中高水位线的概念及其对查询效率的影响,介绍如何通过表重建和收缩来解决高水位问题,同时覆盖Oracle基础操作如别名使用、字符串连接及空值处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

高水位:

高水位线英文全称为high water mark,简称HWM
在Oracle数据的存储中,可以把存储空间想象为一个水库,数据想象为水库中的水。水库中的水的位置有一条线叫做水位线,在Oracle中,这条线被称为高水位线(High-wartermark,HWM)。
在数据库表刚建立的时候,由于没有任何数据,所以这个时候水位线是空的,也就是说HWM为最低值。当插入了数据以后,高水位线就会上涨,但是这里也有一个特性,就是如果你采用delete语句删除数据的话,数据虽然被删除了,但是高水位线却没有降低,还是你刚才删除数据以前那么高的水位。也就是说,这条高水位线在日常的增删操作中只会上涨,不会下跌。

  • 高水位对Oracle的应用有什么影响呢:
  • 高水位对查询有巨大的影响。而且还浪费空间。

例子说明:数据库有10w条数据,删掉了前面的99999个,我select查询的时候,还是需要扫描10w次,虽然表中只有一条数据。效率还是非常的低!!!!!

如何解决高水位带来的查询效率问题呢?

  • 将表数据备份出来,摧毁表再重建(truncate table),然后再将数据导回来。

  • 收缩表,整理碎片,可使用变更表的语句:alter table 表名 move ;

     收缩表之后,高水位线下降了。
     收缩表之后,rowid发生了变化。
    

注意:

  • move最好是在空闲时做,记得move的是会产生锁的(如果你move的时候需要很长时间,那么别人是不能操作这张表的)
  • move以后记得重建index(后续讲到索引,你会知道索引存放的其实就是数据的地址信息。当数据的地址变动了,索引也会失效。)语法:ALTER
    INDEX 索引名字 REBUILD;

别名的使用:

  • 别名涉及到列的别名和表的别名。需要注意引号和用法
  • 重命名一个列
  • 便于计算
  • 紧跟列名,也可以在列名和别名之间加入关键字‘as’,别名使用双引号,以便于在别名中包含空格或特殊的字符并区分大小写
  • as可以省略

例如:

--列的别名
SELECT empno AS 员工编号 FROM emp; --省略了双引号
SELECT empno 员工编号 FROM emp;--省略了as
SELECT empno AS "员工编号" FROM emp; --标准
SELECT empno AS "员工 编号" FROM emp;--空格的别名必须加引号
--表的别名
SELECT empno,ename FROM emp t;--意义不是特别大
SELECT t.empno,t.ename FROM emp t;--别名引用列
SELECT emp.empno,emp.ename FROM emp;--表直接引用列
SELECT emp.empno,emp.ename FROM emp t;--一旦指定了表的别名,则列的引用不能用原来的表名了。

还可以这样使用别名:

SELECT ename,sal*12 FROM emp ORDER BY sal *12 ASC;--asc可以省略
SELECT ename 姓名,sal*12 年薪 FROM emp ORDER BY 年薪 ASC;--根据别名排序
SELECT ename 姓名,sal*12 年薪 FROM emp ORDER BY 2 ASC;--根据列号:第二列

字符串连接符||和单引号、双引号的使用:

  • 将列与列,列与字符连接一起
  • 用‘||’表示
  • 可以用来合成列

例子:

--需求1:查询出员工的名字,要求显示的员工名字前面加上“姓名:”的字符串,显示结果参考:姓名:scott
SELECT  '姓名:'|| ename 姓名 FROM emp;
--需求2:将员工的编号和员工的姓名都放在一个结果字段中显示。合成列
SELECT  empno||':'||ename FROM emp

单引号代表的是字符串。

引号的问题。

Oracle中如何选择单引号和双引号呢?
基本上,只要是别名或不需要Oracle解析(运算)的字符串,用双引号,剩下的都用单引号(比如字符串)。

SELECT  '姓名:'||ename 姓名 FROM emp;这个是参与的运算,就用单引号 
SELECT empno AS "员工编号" FROM emp;这个并没有参与运算,就用双引号,因为只是给它起了个别名

作者个人,认为:
参加到运算当中的话,运用单引号(就是在出现的没以后当中参与到了运算)。
没有参数运算,使用双引号(仅仅在列名上进行显示)

伪表-dual:

mysql查询当前系统时间:SELECT SYSDATE(); select now();(将会报错)(其中sysdate是系统时间函数)
报错原因:

  • Oracle和mysql的一个区别:
  • Oralce的查询语句必须是完整的,即必须满足语法select from

DUAL 是一个‘伪表’(也称之为万能表),可以用来测试函数和表达式。也有人称之为万能表。
使用的时候可以用来占个语法的位置,来补充完整的sql。
伪表也是一张表,只是做了一些特殊处理。
注意:大家不要手动来维护这张表,这个表是由Oracle自动维护的。

比如:

查询显示当前的日期:
SELECT SYSDATE FROM dual;--sysdate代表当前日期的一个系统函数,dual是伪表,主要用来占位的,补充sql的。
SELECT 'a'||'b' FROM dual;
SELECT 1+2 FROM dual;

空值运算:

  • 空值是无效的、未指定的、未知的或不可预知的值

  • 空值不是空值,不是0

  • 与空值运算的都是空值

-需求:查询所有员工的月薪(月薪=基本工资+奖金)
SELECT ename, sal+comm 月薪  FROM emp;--原因:与null运算的结果都是null

空值排序显示:(nulls last的使用)

--需求:根据基本薪资的年薪倒序序排列
SELECT ename,sal*12 FROM emp ORDER BY sal *12 DESC NULLS LAST;
--排序列的空值放在最后

字符和日期、Escape-转义字符

  • 字符串可以是select列表中的一个字符,数字,日期
  • 日期和字符只能在单引号中出现
  • 每当返回一行时,字符串被输出一次
  • 字符和日期要包含在单引号中
  • 字符串大小写敏感,日期格式敏感
  • 默认日期格式是DD-MON-RR

例子:

--需求1:查询关于KING这个人的记录。
SELECT * FROM emp WHERE ename='king';--错误
SELECT * FROM emp WHERE ename='KING';--正确,具体数据库的值是区分大小写。

--需求2:查询入职日期是1987/4/19的员工的信息
SELECT * FROM emp WHERE hiredate ='1987/4/19';--数据库默认是日期的格式不对
。导致无法将字符串隐式转换为日期
SELECT * FROM EMP WHERE HIREDATE ='19-4月-1987';--数据库默认的日期格式,
字符串可以隐式转换为日期
--1987/4/19格式是工具给你转的

Escape-转义字符:
%代表零个或多个字符(任意一个字符)
_代表一个字符

--需求1:查询名称是带有”x”字符的员工的记录信息。
SELECT * FROM emp WHERE ename LIKE '%x%';
--需求2:查询员工名称中含有下划线(“_”)的员工.
SELECT * FROM emp WHERE ename LIKE '%_%'; --为什么全查出来:sql的通配符%
(任意多个字符) _(任意一个)
SELECT * FROM emp WHERE ename LIKE '%\_%' ESCAPE '\';--用ESCAPE来声明一个转义字
符,语句中,该转义字符之后的字符,都作为普通字符来处理。
SELECT * FROM emp WHERE ename LIKE '%|_%' ESCAPE '|';
--需求3:查询姓名是4个字符的员工的信息。
SELECT * FROM emp WHERE ename LIKE '____';
/*
作用:假如你允许用户注册的时候带下划线,或者表单有个字段是备注,那么用户,在写备注
的时候,可能会写下划线。
注册zhang_bo,此时,你想知道数据库中有多少人的用户名是带下划线的。
*/
SELECT COUNT(*) FROM emp WHERE ename LIKE '%/_%' ESCAPE '/';

条件运算符:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
运算符的优先级:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值