目录
一、视图
二、索引
三、存储函数
(一)存储函数的语法结构
(二)案例
1.输入ID,返回NAME
2.传入数字,能够被2整除就是偶数,不能被2整除的就是奇数
3.对两个数字求和,对和判断奇偶数
4.判断SCOTT用户下,工资大于3000的员工
5.输入部门名称,返回部门员工数量
一、视图
Oracle视图与Mysql相同,相当于存储一段select语句,详细可参考我的另一篇博文:
mysql8高级——视图-雷神乐乐的博客-CSDN博客
创建视图的语法:
CREATE [OR REPLACE] VIEW '视图名'
AS 查询语句 [WITH [CASCADED|LOCAL] CHECK OPTION]
-- 只读
[WITH READ ONLY]
创建普通视图:
原表中有ID,NAME和PWD三个字段,创建一个视图,只显示ID和NAME两列数据
CREATE OR replace VIEW t_view as
SELECT ID, NAME
FROM teacher;
上面这段代码与直接从原表中查询这两个字段的结果一样
SELECT ID, NAME FROM teacher;
那为什么还要多此一举呢?在工作中有些敏感字段不能让某些人看到,普通的查询语句能够看到表中所有的字段,但是使用视图就可以避免数据不安全。
注意:
1.经常用到的语句可以创建一个视图
2.视图仅用于查看数据,不要在视图中对数据进行查看以外的操作,如果删除视图中的某条数据,那么原表中的数据也会进行相应的删除。
二、索引
索引是一种供服务器在表中快速查找一个行的数据库结构。当我们使用多表联查时,往往是从表中的第一个数据扫描到表中最后一个数据,浪费资源。索引就相当于将你要找的数据和数据存放的位置,单独放在一个表中,在查询的时候能够大大减少资源的浪费。
Create[UNIQUE|BITMAP]index
[schema.]index_nameon[schema.]table_name(column_name[ASC|DESC],…n,[column_expression])|CLUSTER[schema.]cluster_name
[INITRANSinteger]
[MAXTRANSinteger]
[PCTFREEinteger]
[PCTUESDinteger]
[TABLESPACEtablespace_name]
[STORAGEstorage_clause]
[NOSORT]
[REVERSE]
创建普通索引:
-- 给teacher表中的name字段添加索引
CREATE INDEX t_index on teacher (name);
创建唯一索引:
-- 不允许有同名同姓的数据插入,否则报错
CREATE UNIQUE INDEX only_name on DEMO (name);
创建反向索引:
CREATE UNIQUE INDEX only_name on DEMO (name) reverse;
其他的还有主键索引、非空索引等。
三、存储函数
存储函数相当于自定义函数,类似java中对方法中,将实参传入形参中,并在方法中对形参进行一定的处理。即接收一个或多个参数,返回一个结果。
(一)存储函数的语法结构
CREATE [ OR REPLACE ] FUNCTION '函数名称'('参数名称1' '参数类型1', '参数名称2' '参数类型2', ...)
RETURN '结果变量数据类型'
IS | AS
'变量声明部分';
BEGIN
'逻辑部分';
RETURN '结果变量';
[EXCEPTION '异常处理部分']
END;
(二)案例
1.输入ID,返回NAME
create or replace function myFunc(f_id number)
return varchar2
is
result_name varchar2(32);
begin
select name into result_name from DEMO where ID = f_id;
return result_name;
end;
select myFunc(25) from DUAL;
2.传入数字,能够被2整除就是偶数,不能被2整除的就是奇数
create or replace function checkNumber(num number)
return varchar2
as
resultStr varchar2(32);
temp number ;
begin
temp := mod(num, 2);
if temp = 1 then
resultStr := '奇数';
ELSE
resultStr := '偶数';
end if;
return resultStr;
end;
SELECT checkNumber(10) from DUAL;-- 偶数
SELECT checkNumber(17) from DUAL;-- 奇数
3.对两个数字求和,对和判断奇偶数
1) 写法一:
create or replace function sumNumber(num1 number, num2 number)
return varchar2
as
resultStr varchar2(32);
temp number;
begin
temp := (num1 + num2);
temp := mod(temp, 2);
if temp = 1 then
resultStr := '奇数';
ELSE
resultStr := '偶数';
end if;
return resultStr;
end;
2)写法二:
create or replace function checkSumValue(num1 number, num2 number)
return varchar2
as
resultStr varchar2(32);
temp number;
begin
temp := mod((num1 + num2), 2);
if temp = 1 then
resultStr := '奇数';
ELSE
resultStr := '偶数';
end if;
return resultStr;
end;
3)写法三:
create or replace function checkSumValue2(num1 number, num2 number)
return varchar2
as
resultStr varchar2(32);
temp number;
begin
temp:=num1+num2;
if mod(temp,2)=0 then
resultStr:='偶数';
ELSE
resultStr:='奇数';
end if;
return resultStr;
end;
结果验证:-- 工资>3000元的员工数量,如果只有一个人,则输出"有一位员工薪资大于3000"
-- 如果大于一个人则输出"有?员工薪资大于3000"
-- 否则输出"没有人薪资大于3000"
SELECT CHECKSUMVALUE2(7,8) FROM DUAL;-- 奇数
SELECT CHECKSUMVALUE2(11,1) FROM DUAL; -- 偶数
4.判断SCOTT用户下,工资大于3000的员工
-- 工资>3000元的员工数量,如果只有一个人,则输出"有一位员工薪资大于3000"
-- 如果大于一个人则输出"有?员工薪资大于3000"
-- 否则输出"没有人薪资大于3000"
select count(sal)
from scott.EMP
where sal >= 3000;
create or replace function myFunc2
return varchar2
as
resultStr varchar2(32);
countNumber number;
begin
select count(sal)
into countNumber
from scott.EMP
where sal >= 3000;
if countNumber = 1 then
resultStr := '有一位员工薪资大于3000';
else
if countNumber > 1 then
resultStr := '有' || countNumber || '位员工薪资大于3000';-- 字符串拼接
else
resultStr := '没有人薪资大于3000';
end if;
end if;
return resultStr;
end;
select myFunc2() from DUAL;-- 有3位员工薪资大于3000
5.输入部门名称,返回部门员工数量
-- 查询每个部门的员工数量
SELECT D.DNAME, COUNT(E.ENAME)
FROM SCOTT.DEPT D
LEFT JOIN SCOTT.EMP E ON D.DEPTNO = E.DEPTNO
GROUP BY D.DNAME;
-- 输入部门名称,返回部门有多少人
create or replace function countename(name varchar2)
return number
as
num number;
begin
SELECT t.count into num
FROM (SELECT D.DNAME, COUNT(E.ENAME) count
FROM SCOTT.DEPT D
LEFT JOIN SCOTT.EMP E ON D.DEPTNO = E.DEPTNO
GROUP BY D.DNAME) T
WHERE T.DNAME = name;
return num;
end;
SELECT countename('SALES') FROM DUAL;-- 6