这些Oracle基础知识你有没有都get到

此系列文章,用于梳理Oracle基础知识,如文章有错误欢迎指出

SQL关键字执行顺序

FROM->WHERE->GROUP BY->HAVING->SELECT->ORDER BY

Oracle中的数据类型

数据类型分类

1. NUMBER
     NUMBER( P)     整型,P是精度
     NUMBER( P, S)     浮点型,P是精度,S是小数点后几位
2. CHAR    字符型(长度不可变)
3. VARCHAR2    字符型(长度不可变)
4. DATE    日期类型
5. BLOB    二进制大对象(存储图片、声音、视频)
6. CLOB    字符大对象(可以存储4G+的字符串)

数据类型常见问题

1、实际开发中,为什么使用CHAR代替DATE类型?
因为不同的数据库处理日期类型方面是不同的,所以使用CHAR类型可能会导致将来的数据库很难移植。

2、实际开发中,为什么不直接使用BLOB存放图片?
操作麻烦,代码繁琐当插入图片的时候,insert语法是不能直接插入的,需要使用IO流来操作图片。为所有当存放图片到数据库时,可以直接将图片放入“云盘”,然后云盘对外提供一个共享的连接地址,再将这个地址存放入数据库

3、CHAR与VARCHAR的区别?
-CHAR是定长字符串,varchar是可变长度字符串。
-CHAR(10)与VARCHAR(10)当输入长度<初始长度:当向字段中插入"abcd"的时候,CHAR的底层实际上存储的是:“abcd+6个空格";VARCHAR的底层实际上存储的是:“abcd"。
-字段的长度不固定:采用VARCHAR类型来定义;字段的长度固定:采用CHAR类型来定义,效率高,也不会浪费空间

4、VARCHAR2与VARCHAR的区别?
-VARCHAR是SQL语句当中的标准,所有的数据库都支持;VARCHAR2是VARCHAR第二代,是Oracle数据库中特有的,其它数据库中没有。
-VARCHAR采用一个字节编码;VARCHAR2采用两个字节编码,容量较大
-在实际开发中尽量使用标准,使用VARCHAR,即使在程序中使用了VARCHAR,到Oracle数据库中也会自动变成VARCHAR2

Oracle函数分类

单行函数

定义:对单行输入值进行计算,得到相应的计算结果(单个输出)。
常用函数:
    lower:用DQL语言将查询结果变成小写,数据库表没有变。
SELECT lower(‘ABC’) AS ENAME FROM EMP;
    upper:用DQL语言将查询结果变成大写,数据库表没有变。
SELECT upper(‘abc’) AS ENAME FROM EMP;
    substr:截取字符串(模糊查询第二个字母是A
SELECT * FROM EMP WHERE substr(ENAME,2,1)=‘A’; )
    length:求字符串长度
SELECT LENGTH(‘ASDA’) FROM EMP;
    trim:去除字符串两端空格
SELECT trim(’ ASD ') FROM EMP;
    concat:字符串拼串
SELECT concat(‘ASD’,‘ADC’) FROM EMP;
    nvl(a,b):a字段值为null,用b代替;否者用a字段
SELECT nvl(COMM,0) FROM EMP;
    case…when…then…when…then…else…end:判断赋值
SELECT CASE JOB WHEN ‘JOB1’ THEN SAL1.1 WHEN ‘JOB2’ THEN SAL0.9 ELSE SAL END FROM EMP;
    decode:Oracle中特有的,和以上的case可以达到同等效果,单可读性差
SELECT decode(JOB,‘JOB1’,SAL* 1.1,‘JOB2’,SAL* 0.9,SAL) FROM EMP;
    round(A,B):截取对象A,小数点后几位B。B为可选项,忽略它则截去所有的小数部分,并四舍五入。B为负数,小数点前第一位表示-1,依次向左负数递减;B为正数,小数点后第一位表示1,依次向左正数递增。
SELECT round(125.64,1) AS RESULT FROM EMP; (RESULT =125.6)
SELECT round(125.64,0) AS RESULT FROM EMP; (RESULT =126)
SELECT round(125.64,-1) AS RESULT FROM EMP; (RESULT =130)
    to_date:将字符串转换成日期,具体格式to_date(字符串,匹配格式)
SELECT to_date(‘1981-02-20 00:00:00’, ‘YYYY-MM-DD HH24:MI:SS’) AS DATETIME FROM EMP;
    to_char:将对象格式化成与匹配格式相同的字符串,具体格式to_char(对象,匹配格式)
SELECT to_char(sal, ‘$999,999’) FROM EMP;
    to_number:将字符串转换成数值,具体格式to_number(对象,匹配格式)
SELECT * FROM EMP WHERE SAL>to_number(‘1,500’, ‘999,999’);

多行函数

定义:这种函数可以一次处理多行记录,多行记录处理完成之后最终生成一行结果。
常用分组函数:
    count  统计
    sum  求和
    avg  求平均值
    max  求最大值
    min  求最小值

常见问题

1、关于DQL语句select关键字后面可以跟什么?
-表中的字段名
-字面量,数值和字符串
    查询的表有多少行数据,则在结果集中该字面量字段下就有多少行该字面量
-当一个DQL语句中有group by的话,select关键字后面只能跟“分组函数”和“参与分组的字段”

2、在Oracle数据库当中怎么获取Oracle数据库的系统时间?
使用sysdate

3、count(*)和count(具体某个字段)的区别?
count(*):统计查询结果的总条数
count(具体某个字段):统计查询结果该字段中不为空的元素总数

4、分组函数不应该是在分组后才能使用吗?什么时候分组
DQL语句中中,分组函数是在分组后才能使用,一般与GROUP BY一起使用,当没有group by语句的话,整个表为一组。
分组是在where条件执行之后才进行的,分组之后,分组函数才能用。这也是为什么Oracle中having后面接分组函数会报错,而mysql不会的原因

Oracle中的查询

分组查询

-分组查询常用到GROUP BY,并且如果没有GROUP BY就不能使用having,having是专门对分组之后的数据进行再次过滤的。
-查询过程中如果能够使用where条件过滤,尽量使用where,除非where无法过滤,要求分组之后才能过滤,此时使用having。

连接查询

-根据年份分类
SQL92
表的连接条件和将来数据的过滤条件是在一起的,都在where后面。【结构不清晰】
SQL99
表的连接条件和将来数据的过滤条件是分离的。【结构清晰】
-连接方式分类
内连接:
根据指定的连接条件进行连接查询,因此满足连接条件的数据才会出现在结果集。
    等值连接

select e.sal,s.grade
from emp e
join salgrade s
on e.empno = s.empno;

    非等值连接

select e.sal,s.grade
from emp e
join salgrade s
on e.sal between s.losal and s.hisal;

    自连接

select a.ename empname,b.ename leadername
from emp a
join emp b
on a.mgr = b.empno;

外连接:
在内连接的基础上,将某个连接表不符合连接条件的记录加入结果集。
    左(外)连接

--左表当主表加入结果集,在on条件下右表有数据就加入结果集,没有就用null代替
select e.ename,d.dname
from emp e
left outer join dept d
on e.deptno=d.deptno;

    右(外)连接

--右表当主表加入结果集,在on条件下左表有数据就加入结果集,没有就用null代替
select e.ename,d.dname
from emp e
right outer join dept d
on e.deptno=d.deptno;

子查询

-子查询:DQL语句嵌套到SQL语句当中。
-子查询可以出现在SELECT FROM WHERE后面

常见问题

1、外连接什么时候使用?
a和b两张表连接查询,想将其中一张表的数据全部显示,必须使用外连接。
对方表记录无法与之匹配,自动添加“空”与其匹配。
任何一个左连接都可以有右连接的写法。
任何一个右连接都可以有左连接的写法。

ROWNUM、ROWID、UNION、MINUS

ROWNUM、ROWID

TOP-N分析法

UNION、MINUS

-UNION:
union是将两个sql语句合并到一起,union用法中,两个select语句的字段类型匹配,而且字段个数要相同,union含有distinct的功能。
查询中会遇到 union all,它的用法和union一样,但union all不会去重,所以union all的效率比union高。
-MINUS:
minus是结果集A“减”结果集B,这里的“减”是结果集A去除结果集B中所包含的所有记录后,minus用法中,两个select语句的字段类型匹配,而且字段个数要相同,minus含有distinct的功能。

索引、视图、序列

索引

索引相当于一本书的目录,为了提高检索效率而存在的一种机制。
索引也是存储在硬盘当中的,也是需要维护的,所以字段上不能随便添加索引。
对于查询字段,如果没有添加索引,则会进行全表扫描,扫描表中该字段
如果添加索引,这个索引专门是为该字段服务的,相当于生成了ename字段的一个目录,这时硬盘上会有一块空间用来维护这个索引。

create index emp_ename_index on emp(ename); //给emp表中的ename字段添加一个索引,索引起名emp_ename_index
drop index emp_ename_index;//删除索引emp_ename_index

视图

视图类似于虚拟表,同时视图也有一张系统表:user_views。
为一张表添加视图,前提必须有该表的操作权限。

--创建视图
create view empview as select ename,sal from emp;
--删除视图
drop view empview;

序列

-序列是Oracle数据库当中特有的,专门用来维护一个自增的数字,默认情况下从1开始,以1递增。类似于mysql当中的auto_increment
-序列对象也有一张系统表:user_sequences
-序列对象的两个属性:nextval:从序列当中获取下一个值;currval:从序列对象当中获取当前值

--创建序列对象
create sequence my_seq_01
start with 100 //序列的初始值
minvalue 100  //序列能产生的最小值
maxvalue 1000  //序列能产生的最大值
increment by 10  //序列的步长,每次增加的数量,默认为1,为负数,表示减
cycle  // CYCLE和NOCYCLE 表示当序列生成器的值达到限制值后是否循环。CYCLE代表循环,NOCYCLE代表不循环。递增循环表示达到maxvalue后有从minvalue开始,递减循环反之。
cache 10;  //CACHE表示存放序列的内存块的大小,默认为20。NOCACHE表示不对序列进行内存缓冲。对序列进行内存缓冲,可以改善序列的性能。
--删除序列对象
drop sequence myseq;

常见问题

1、什么时候字段上应该添加索引呢?
-大数据量
-该字段很少的DML操作
-该字段经常出现在where条件当中

2、怎么做查询速度快?
-通过rowid的检索效率是极高的
-对查询的字段添加索引
</font

3、索引的实现原理?

首先索引也有一张系统表:user_indexes
-user_tables 系统表描述用户表
-user_constraints 系统表描述约束信息
-user_indexes 系统表描述索引信息

select * from emp where ename = 'Jock';
当为字段添加索引后,该索引专门为该字段服务,硬盘中会对该字段的那行数据添加一个字段ROWID,当查询时:先给字段name添加索引,查询name = 'Jock'时,先找到该索引对象,再在索引上找到'J'区进行扫描范围的缩小,再获取'Jock'后面的rowid是'AAAE5SAABAAAK+hAAL',最后sql语句变成
select * from emp where ename = 'AAAE5SAABAAAK+hAAL';

4、视图有什么作用?
-隐藏表的实现细则。
-一般情况下都是客户的DBA创建视图对象,将视图对象提供给软件公司的程序员,程序员只能面向视图进行CRUD操作,程序员根本不知道原表中的数据以及表结构信息。
-原表得到保护。
-如果视图对象指向的DQL语句操作对象是一张表,通过对视图中的数据进行增删改,视图指向的那张表中的数据也会跟随着进行增删改。

Oracle 游标、异常、存储过程、触发器

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蓝桉未与

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值