Oracle数据库基础学习笔记——基础语法
Oracle数据库基础学习笔记——基础语法
Oracle是主流数据库产品,本文是针对Oracle环境下的SQL操作的讲解,可能和其他数据库产品稍有不同。
简介
Oracle是一种结构化数据库,具体来讲是结构化数据库中的关系型数据库,存储二维数据(可以理解为表格),通过SQL语句(一种结构化查询语言)对其中的数据进行操控。
基本的查询语法结构
--两者完全等价
select * from dept;
SELECT * FROM DEPT;
其中dept是表名(Oracle中的scott用户登录自带的一个表),除了对字符串类型进行指定,所有的语句构成不区分大小写
查询语句基本操作
- 别名
对查询列进行别名操作,使用关键字:as(可省略)
对表名进行别名则直接在表名后添加别名即可,不使用as关键词(现阶段表别名还展示不出来)
例如:将原有的列和表别名设为中文并展示:
--更改ename列名为员工姓名,并更改表名为雇员信息表
select ENAME as 员工姓名 from emp 雇员信息表;
- 数值类型数据的计算
注意:任意对Null(空值)类型进行的运算最终返回结果都是空值
加减乘除简单运算可以直接对符合数值类型的列进行操作
例如:查询emp表,展示员工年薪,计算方法为:12乘以月薪加上奖金
--有些员工没有奖金,null类型参与运算无论如何都返回null
select ename, sal*12+comm from emp;
- 条件查询
用到的关键字为:where, and, or
注意:where放置于表名之后,多条件并列是默认执行顺序由右至左,优先级可以通过括号进行调整。
例如:查询工作是SALESMAN或者工资高于2000的前提下部门编号还为10的数据
select * from emp
where (job = 'SALESMAN' or sal > 1000) and deptno = 10;
- 模糊查询
关键字:like,一般均搭配通配符使用
常用通配符:%指代若干长度字符,_指代单个长度字符,灵活使用通配符可以达成首字母查询、末尾字母查询等效果
例如:查询所有姓名第二个字母是“A”的员工信息
- Null判断
关键字:is
判断语句:is null 或者 is not null,和大部分编程语言的规范一样,此次的null是一个概念,而不是一个“数值”,所以是不适用“=”来进行判断的
例如:判断没有奖金的员工并展示信息
select * from emp where comm is null;
- 包含查询(特殊情况下条件判断的简洁化表达)
关键字:in 取符合指定集合中的值, not in 取指定集合反集的值
用法:in(值1,值2,值3)
例如:取部门编号不是10和20的员工的信息
select * from emp where deptno not in (10,20);
- 范围查询(特殊情况下条件查询的简洁化表达)
关键字:between and
例如:取薪资大于1000并小于5000的员工信息
select * from emp where sal between 1000 and 5000;
- 条件查询--ANY和ALL
关键字:any all分别用于选取符合条件的任意一个对象或者所有对象
例如:查询所有工资为1250或者3000的员工信息
select * from emp where sal = any (1250,3000);
- 排序查询(作用于查询结果)
关键字:order by, asc(默认升序可省略),desc(降序或者倒序)
注意:本关键词往往放置于查询语句结尾,默认升序(从小到大)
例如:按照工资降序排列查询员工信息
select * from emp order by sal desc;
- 分组&聚合函数
关键词:group by, having
特点:分组和聚合函数往往是搭配使用的
常用函数:sum, avg, count, max, min
问:count(*) count(1) count(列名)的区别?
答:从结果上来讲,前两者都是计算行数,但是理论上count(1)的执行效率更高,而count(列名)则是不会将指定列内的空值算入计数
例1:查询薪资合计超过5000的岗位及其平均薪资
select job, sum(sal), avg(sal) from emp group by job having sum(sal)>1000;
例2:查看1980年之后入职的每个部门的员工平均薪资,并且平均薪资500-2000之间,根据部门编号进行排序
select deptno, avg(sal) from emp
where hiredate > to_date('1980/1/1', 'yyyy/mm/dd')
group by deptno
having avg(sal) between 500 and 2000
order by deptno;
注意:having和where效果上是一样的,都是过滤关键词,区别是having只能搭配group by使用,进行分组聚合过滤
- 查询语句的书写以及执行顺序
书写顺序:select -> 列1,列2……->from->表名->where过滤->group by->having过滤->order by
执行顺序:from->where->group by->having->select->order by
为什么书写顺序和执行顺序不同?
声明式语言特性
SQL 是一种声明式语言:用户只需描述“想要什么数据”,而非“如何获取数据”。书写顺序(如
SELECT → FROM → WHERE
)的设计是为了符合人类自然表达习惯(先指定目标,再描述条件)。优化器的核心作用
数据库优化器会将 SQL 转换为物理执行计划,其目标是用最低成本(I/O、CPU、内存)获取正确结果。为此,它会:
- 重写查询逻辑(如子查询展开、谓词下推)。
- 选择最优执行路径(索引扫描、连接顺序、算法)。
- 逻辑与物理的分离
书写顺序是逻辑表达,而执行顺序是物理实现。例如,
WHERE
子句可能在
JOIN
前执行以减少数据量,即使它在 SQL 中写在后面。
总结:书写顺序更符合自然语言描述顺序,执行顺序更符合底层逻辑,而相同的一点是无论是书写还是执行,order by永远在最后。