自学Oracle数据库(sql语句篇)

-- 查询 emp 表
select * from emp;

-- where 两种方式
select * from emp where empno = 7369;
select * from emp where empno = '7369';

-- 关系运算符 > < != <> = <= >=
select * from emp where sal > 1000;

-- between and 
select * from emp where sal between 1000 and 2000;

-- null 查询消费为null的
select * from emp where comm is null;

-- null 查询消费不为null的 (两种方式)
select * from emp where comm is not null;
select * from emp where not comm is null;

--
select * from emp where comm not is null ;

-- in not in
-- 查询id是 7369 7499 7521
select * from emp where empno in (999,7369,7499,7521)

-- 查询id在 7369 7499 7521
select * from emp where empno in (999,7369,7499,7521,null)

-- 坑 not in 内只要是导入了空值,查询结果就为null
select * from emp where empno not in (999,7369,7499,7521,null)

-- like % _ 查询 姓名中带有A
select * from emp where ename like '_A%'

-- desc降序 asc升序 order by
-- 根据部门查询30 如果部门相同 根据job排序(asc) 如果job一样 根据empno(desc)
select * from emp where deptno = 30 order by job ,empno desc

-- String字符串函数
update emp set ename = 'zhanmusi' where empno = 7900

-- upper 把小写字母转换为大写字母
select upper(ename) from emp where empno = 7900

-- 临时表 dual
-- 让它看起来就一行,非常的简洁所以我才是用了临时表dual
-- lower 把大写字母转换为小写字母
select lower('LAOwang') from dual

-- 计算String字符串的长度
select length (' lao wang ') from dual;
-- 利用trim去除字符串前后的空格
select length (trim(' lao wnag ')) from dual;

-- 日期函数 SYSDATE SYSTIMESTAMP 
select SYSDATE-1 from dual -- -1是当前日期减一天

-- 转换函数 to_date() 
select to_date('2020-09-09','yyyy-MM-dd') from dual;

-- to char()
select to_char(11) from dual

-- to_number() 转换失败
select to_number('aaa') from dual ;

-- 查询 员工的全年工资
-- 处理NULL数据 
-- 语法:数字 NVL(列,默认值);
select empno , ename , (sal+nvl(comm,0))*12 from emp;

-- DECODE() 
select decode (1,2,'xiaowang',3,'laowang',1,'dengdeng','laoqian') from dual;

select decode (5,2,'xiaowang',3,'laowang',1,'dengdeng','laoqian') from dual;

-- COUNT()、AVG()、SUM()、MIN()、MAX();
select SUM(sal) from emp group by deptno ;

-- 伪行 rownum 
-- 坑 可以用 < <= 不能用 = > >=
select rownum ,emp.* from emp where rownum < 10 ;

-- 利用伪行 写一个分页查询 temp相当于一个临时表
select * from 
(select rownum rm , emp.* from emp where rownum <= 6 ) temp
where temp.rm >= 4;

-- 伪列
-- 处理 数据表中没有主键的相同数据
select * from dept;

-- 复制
create table mydept as select * from dept;

select * from mydept

insert into mydept values(10,'ACCOUNTING','NEW YORK')

-- 保留原始数据
-- 逻辑:1.先查出最小的rowid 2.然后把其余的都删掉(部门为10的)
-- 1.先查出最小的rowid
select min(rowid) from mydept where deptno = 10 ; 
-- 2.然后把其余的都删掉(部门为10的)
delete from mydept me
where me.rowid >(
select min(rowid) from mydept where deptno = 10)
and me.deptno = 10

select * from mydept;


--------------这是一条优美得分割线-----------
-- 序列
-- 我们在做项目的时候,数据库的表可以设置为自增 sequence
-- 案例
-- 创建序列s001
create sequence s001;

-- 查询当前数据库中所有的序列
select * from user_sequences;

-- 应用此序列(序列中有两个值 nextval下一个值 currval当前值 )
-- 先写nextval下一个值 然后才可以使用 currval当前值
select s001.nextval from dual;
select s001.currval from dual;

-- 创建表
create table person(
pid number(10),
pname varchar2(255)
)

-- 查询person
select * from person;

insert into person values (s001.nextval,'xiaofang')

-- 删除sequence
drop sequence s001 ;

-- 创建序列 步长为2
create sequence s002
increment by 2;

select s002.nextval from dual ;

-- 创建序列步长为2 最小值为 3 最大值为 18
create sequence s003
increment by 2
minvalue 3
maxvalue 18

select s003.nextval from dual ;

--创建序列 s004 步长为2 最小值为 3 最大值为10 循环 + 缓存
-- cycle 循环 , cache 缓存
create sequence s006
increment by 2
minvalue 3
maxvalue 10
cycle 
cache 2;

-- 3,5,7,9 记录在为4个数字 
-- cache 缓存设置 最大可以=缓存个数 最小=2

select s006.nextval from dual ;

-- 视图 view
create view v001 as
select * from emp where deptno = 20;

-- 运行上面的创建视图 语句 报错 提升权限不足
-- 在cmd中输入sqlplus /nolog
-- 在进行连接 conn sys/123 as sysdba 
-- 运行完 提示 已连接
-- 进行授权 grant create view toscott
-- 最后 提示 授权成功
-- 再最后运行上面的 创建视图语句


-- 查询视图v001
select * from v001

-- 视图的原则! 不能对原表进行修改

-- 修改 7369 的deptno 为 30
update v001 set deptno = 30 where empno = 7369

-- 进过查询emp原表发现,通过视图可以对原表进行修改
select * from emp where empno = 7369

-- 所以创建视图的时候,需要加上条件
create view v002 as
select * from emp where deptno = 20
with check option;

select * from v002;

-- 修改 7369 的deptno 为 30
update v002 set deptno = 30 where empno = 7566;

-- 修改 7369 的ename 为 laowang
update v002 set ename = 'laowang' where empno = 7566;

-- 经过查询emp原表发现,通过视图可以对原表进行修改(只是限制了where条件后面的数据)
select * from emp where empno = 7566

-- with read only (只读)
create view v003 as 
select * from emp where deptno = 20
with read only;

select * from v003;

-- 修改7566 的deptno 为 30
update v003 set deptno = 30 where empno = 7566;

-- 修改7566 的ename 为 laownag
update v003 set ename = 'laowang' where empno = 7566;

-- 总结:推荐使用with read only ;


--------------------------分割线---------------------------


-- 同义词 如果涉及到表数据非常大的表 迁移 (他的速度最快)
-- CREATE [PUBLIC] SYNONYM 同义词名称 FOR 用户名.表名称 ;
select * from de;
create synonym em for scott.emp;
create synonym de for scott.dept;


-- 索引 提高速度
select * from emp where sal > 1500;
-- 语法
--CREATE INDEX emp_sal_ind ON emp(sal) ;
create index emp_sal_ind on emp(sal);

--什么情况下推荐使用索引
--(1)表经常进行 INSERT/UPDATE/DELETE 操作 增删改
--(2)表很小(记录超少)
--(3)列名不经常作为连接条件或出现在 where 子句中
--(4)对于那些定义为text, image和bit, blob数据类型的列不应该增加索引


-- 权限
-- 创建用户 用户名dog 密码123
create user dog identified by 123;

-- 创建dog用户的登录权限 grant to (进入管理员进行操作)
grant create session to dog ;

-- 创建dog用户的建表权限
grant create table to dog;

-- 提供了两个角色 connect , resource
GRANT CONNECT,RESOURCE to dog ;

-- 创建dog的视图权限
grant create view to dog

-- 创建dog的 序列权限
grant create sequence to dog;

-- 所以 如果我们嫌麻烦,我们可以给数据库一个超级管理员权限
grant dba to dog;

----------------------分割线--------------------------

-- 存储过程(了解)
create    or replace procedure p1
is
begin
dbms_output.put_line(' 执行了 '); 
end p1;

-- 调用 存储过程
call p1() ; 

create    or replace procedure p3(newcount out number)
is
begin
-- into 关键字    将查询的结果赋值给变量 newcount

dbms_output.put_line(' 执行了 ');
end p3;


declare
newname varchar2(32); 
begin
newname := ' 小红 '; 
p3(newname);
end;


----------------------分割线--------------------------

-- 触发器(重点)
-- 语法如下: trigger 触发器 的意思
create    or    replace trigger t2
before | after
delete | update | save 
on ta -- ta 是某个表
for each row 
begin
sql...
end;

-- 创建表 p1
create table p1 (
pid number(10),
pname varchar2(255)
);

-- 创建表log_p1
create table log_p1(
pid number(10),
pname varchar2(255)
);

select * from p1 ; 
select * from log_p1 ;

-- 创建触发器: 当对p1表进行添加的时候,触发器触动了>>>>>将添加的内容存到log_p1中,当一个备份
create    or    replace trigger t1
before 
insert 
on p1 
for each row 
begin
insert into log_p1 values(:new.pid,:new.pname);
end;

-- 开始测试
-- 向p1表中添加数据
insert into p1 values(1003,'laowang');


-- 创建触发器: 当对p1表进行删除的时候,触发器触动了>>>>>将删除的内容存到log_p1中,当一个备份
create    or    replace trigger t2
before 
delete
on p1 
for each row 
begin
insert into log_p1 values(:old.pid,:old.pname);
end;

-- 删除 p1中的1002
delete from p1 where pid = 1002;


-- 创建触发器: 当对p1表进行修改的时候,触发器触动了>>>>>将修改 之前 内容存到log_p1中,当一个备份
create    or    replace trigger t3
before 
update
on p1 
for each row 
begin
insert into log_p1 values(:old.pid,:old.pname);
end;

-- 修改 1001 改名为 wangfang 
update p1 set pname = 'wangfang' where pid = 1001;


-- 创建触发器: 当对p1表进行修改的时候,触发器触动了>>>>>将修改 之后 内容存到log_p1中,当一个备份
create    or    replace trigger t4
before 
update
on p1 
for each row 
begin
insert into log_p1 values(:new.pid,:new.pname);
end;
-- 修改 1001 改名为 wangfang22
update p1 set pname = 'wangfang22' where pid = 1001;

-- 总结: 当 insert 我们使用 :new
-- 当 delete 我们使用 :old
-- 当 update 我们使用 :new 还可以使用 :old
原文地址:https://www.cnblogs.com/masterhxh/p/13882015.html