经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库/运维 » Oracle » 查看文章
oracle实战(一)
来源:cnblogs  作者:醉烟  时间:2019/8/5 10:04:49  对本文有异议

一、表空间的创建以及删除

声明:此操作环境为windows,oracle10G

  1. 表空间? ORACLE数据库的逻辑单元。
  2. 数据库---表空间 一个表空间可以与多个数据文件(物理结构)关联
  3. 一个数据库下可以建立多个表空间,一个表空间可以建立多个用户、一个用户下可以建立多个表。
  4. create tablespace test
  5. datafile 'c:\test.dbf'
  6. size 100m
  7. autoextend on
  8. next 100m;
  9. test 为表空间名称
  10. datafile 指定表空间对应的数据文件
  11. size 后定义的是表空间的初始大小
  12. autoextend on 自动增长 ,当表空间存储都占满时,自动增长
  13. next 后指定的是一次自动增长的大小。

 

二、用户

1.用户的创建、设置密码、设置表空间

  1. create user test
  2. identified by password
  3. default tablespace test;
  4. ?
  5. -- create user 用户名
  6. -- identified by 后边是用户的密码
  7. -- default tablespace 后边是表空间名称
  8. -- oracle数据库与其它数据库产品的区别在于,表和其它的数据库对象都是存储在用户下的。

 

2、授权

  1. -- oracle数据库常用角色:
  2. -- connect--连接角色,基本角色
  3. -- resource--开发者角色
  4. -- dba--超级管理员角色
  5. ?
  6. -- 1:给一个用户授予dba权限(这在生产环境中是不推荐的)
  7. grant dba to test;
  8. -- 2:给一个用户授予开发者权限(注意,必须加上connect,不然无法连接数据库)
  9. grant resource,connect to test;

 

3、删除用户

  1. -- 注意:删除用户的时候,该用户需要处于未登陆状态
  2. -- 1:删除一个没有自己创建对象的用户
  3. drop user test;
  4. -- 2:删除含有自己创建的对象的用户时(需要使用CASCADE
  5. drop user test cascade;

 

4.解锁用户

  1. -- 例如:解锁scott用户(密码默认是tiger
  2. -- 解锁scott用户
  3. alter user scott account unlock;
  4. -- 设置scott用户的密码【此句也可以用来重置密码】
  5. alter user scott identified by tiger; 

三、Oracle数据类型(简单的)

NO数据类型描述
1 varchar,varchar2 表示一个字符串
2 number NUMBER(n)表示一个整数,长度是n NUMBER(m,n):表示一个小数,总长度是m,小数是n,整数是m-n
3 date 表示日期类型
4 clob 大对象,表示大文本数据类型,可存4G
5 blob 大对象,表示二进制数据,可存4G

四、简单DDL(数据定义语言)

1.创建表

  1. 语法:
  2. Create table 表名(
  3. 字段1 数据类型 [default 默认值],
  4. 字段2 数据类型 [default 默认值],
  5. ...
  6. 字段n 数据类型 [default 默认值]
  7. );
  8. ?
  9. -- 创建一个person
  10. create table person(
  11. pid number(20),
  12. pname varchar2(10)
  13. );

 

2.修改表结构

  1. ---添加一列
  2. alter table person add (sex number(1));
  3. -- 修改列类型
  4. alter table person modify sex char(1);
  5. -- 修改列名称
  6. alter table person rename column sex to gender;
  7. -- 删除一列
  8. alter table person drop column gender;

 

 

五、DML(数据操作语言) =》 增删改

1.插入数据

  1. insert into person (pid,pname) values('1','小李'); commit;

 

2.修改数据

  1. update person set pname = '小张' where pid = '1'; commit;

 

3.三种删除

  1. -- 删除表中全部记录
  2. delete from person;
  3. -- 删除表结构
  4. drop table person;
  5. -- 先删除表,再次创建表。效果等同于删除表中全部记录。
  6. -- 在数据量大的情况下,尤其在表中带有索引的情况下,该操作效率高。
  7. -- 索引可以提供查询效率,但是会影响增删改效率。
  8. truncate table person;

六、序列

简介:

序列不真的属于任何一张表,但是可以逻辑和表做绑定。 序列:默认从1开始,依次递增,主要用来给主键赋值使用。 dual:虚表,只是为了补全语法,没有任何意义。

 

1、创建序列

  1. create sequence sq_person;

 

2.两个函数及序列用法

  1. -- sequence.nextval 序列自增并查询
  2. select sq_person.nextval from dual;
  3. -- sequence.currval 查询序列当前参数
  4. select sq_person.currval from dual;
  5. -- 注意:序列刚创建的时候不能直接使用currval函数,需要在nextval函数执行后才能执行
  6. ?
  7. -- 充当主键(插入数据):
  8. insert into person (pid, pname) values (s_person.nextval, '小明');
  9. commit;

3.删除序列

  1. drop sequence sq_person;

 

七、DQL(数据查询语言)

  1. 前言:要测试以下部分例子:请切换到scott用户 以下使用的表为该用户自带的默认表

1.简单查询

  1. select * from person; -- 开发不推荐
  2.  
  3. select pid,pname from person; -- 开发推荐

 

2.单行函数、条件表达式、多行函数、分组查询、多表查询、子查询、分页查询

a.单行函数

  1. -- 字符函数
  2. -- 接收字符输入返回字符或者数值,dual是伪表
  3. -- 1. 把小写的字符转换成大小的字符 upper('smith')
  4. select upper('yes') from dual;--YES
  5. -- 2. 把大写字符变成小写字符
  6. select lower('YES') from dual;--yes
  7. ?
  8. -- 数值函数
  9. select round(56.16, -2) from dual;---四舍五入,后面的参数表示保留的位数
  10. select trunc(56.16, -1) from dual;---直接截取,不在看后面位数的数字是否大于5.
  11. select mod(10, 3) from dual;---求余数
  12. ?
  13. -- 日期函数
  14. ----查询出emp表中所有员工入职距离现在几天。
  15. select sysdate-e.hiredate from emp e;
  16. ----算出明天此刻
  17. select sysdate+1 from dual;
  18. ----查询出emp表中所有员工入职距离现在几月。
  19. select months_between(sysdate,e.hiredate) from emp e;
  20. ----查询出emp表中所有员工入职距离现在几年。
  21. select months_between(sysdate,e.hiredate)/12 from emp e;
  22. ----查询出emp表中所有员工入职距离现在几周。
  23. select round((sysdate-e.hiredate)/7) from emp e;
  24. ?
  25. -- 转换函数
  26. ---日期转字符串
  27. select to_char(sysdate, 'fm yyyy-mm-dd hh24:mi:ss') from dual;
  28. ---字符串转日期
  29. select to_date('2018-6-7 16:39:50', 'fm yyyy-mm-dd hh24:mi:ss') from dual;
  30. ?
  31. -- 通用函数
  32. -- 算出emp表中所有员工的年薪
  33. -- 奖金里面有null值,如果null值和任意数字做算术运算,结果都是null
  34. select e.sal*12+nvl(e.comm, 0) from emp e;

 

b.条件表达式

  1. ---条件表达式的通用写法,mysqloracle通用
  2. ---给emp表中员工起中文名
  3. select e.ename,
  4. case e.ename
  5. when 'SMITH' then '傻瓜'
  6. when 'ALLEN' then '白痴'
  7. when 'WARD' then '二流子'
  8. --else '专家'
  9. end
  10. from emp e;
  11. ---判断emp表中员工工资,如果高于3000显示高收入,如果高于1500低于3000显示中等收入,
  12. -----其余显示低收入
  13. select e.sal,
  14. case
  15. when e.sal>3000 then '高收入'
  16. when e.sal>1500 then '中等收入'
  17. else '低收入'
  18. end
  19. from emp e;
  20. ----oracle中除了起别名,都用单引号。
  21. ----oracle专用条件表达式
  22. select e.ename,
  23. decode(e.ename,
  24. 'SMITH', '关羽',
  25. 'ALLEN', '张飞',
  26. 'WARD', '刘备',
  27. '小白') "中文名"
  28. from emp e;

 

c.多行函数

  1. -- 多行函数【聚合函数】:作用于多行,返回一个值。
  2. select count(1) from emp; -- 查询总数量
  3. select sum(sal) from emp; -- 工资总和
  4. select max(sal) from emp; -- 最大工资
  5. select min(sal) from emp; -- 最低工资
  6. select avg(sal) from emp; -- 平均工资

 

d.分组查询

  1. -- 查询出每个部门的平均工资
  2. -- 分组查询中,出现在group by后面的原始列,才能出现在select后面
  3. -- 没有出现在group by后面的列,想在select后面,必须加上聚合函数。
  4. -- 聚合函数有一个特性,可以把多行记录变成一个值。
  5. select e.deptno, avg(e.sal)--, e.ename
  6. from emp e
  7. group by e.deptno;
  8. -- 查询出平均工资高于2000的部门信息
  9. select e.deptno, avg(e.sal) asal
  10. from emp e
  11. group by e.deptno
  12. having avg(e.sal)>2000;
  13. -- 所有条件都不能使用别名来判断。
  14. -- 比如下面的条件语句也不能使用别名当条件
  15. select ename, sal s from emp where sal>1500;
  16. ?
  17. -- 查询出每个部门工资高于800的员工的平均工资
  18. select e.deptno, avg(e.sal) asal
  19. from emp e
  20. where e.sal>800
  21. group by e.deptno;
  22. -- where是过滤分组前的数据,having是过滤分组后的数据。
  23. -- 表现形式:where必须在group by之前,having是在group by之后。
  24. -- 查询出每个部门工资高于800的员工的平均工资
  25. -- 然后再查询出平均工资高于2000的部门
  26. select e.deptno, avg(e.sal) asal
  27. from emp e
  28. where e.sal>800
  29. group by e.deptno
  30. having avg(e.sal)>2000;

 

e.多表查询

  1. -- 笛卡尔积
  2. select *
  3. from emp e, dept d;
  4. -- 等值连接
  5. select *
  6. from emp e, dept d
  7. where e.deptno=d.deptno;
  8. -- 内连接
  9. select *
  10. from emp e inner join dept d
  11. on e.deptno = d.deptno;
  12. -- 查询出所有部门,以及部门下的员工信息。【外连接】
  13. select *
  14. from emp e right join dept d
  15. on e.deptno=d.deptno;
  16. -- 查询所有员工信息,以及员工所属部门
  17. select *
  18. from emp e left join dept d
  19. on e.deptno=d.deptno;
  20. -- oracle中专用外连接 不推荐使用
  21. select *
  22. from emp e, dept d
  23. where e.deptno(+) = d.deptno;
  24. ?
  25. select * from emp;
  26. -- 查询出员工姓名,员工领导姓名
  27. -- 自连接:自连接其实就是站在不同的角度把一张表看成多张表。
  28. select e1.ename, e2.ename
  29. from emp e1, emp e2
  30. where e1.mgr = e2.empno;
  31. -- 查询出员工姓名,员工部门名称,员工领导姓名,员工领导部门名称
  32. select e1.ename, d1.dname, e2.ename, d2.dname
  33. from emp e1, emp e2, dept d1, dept d2
  34. where e1.mgr = e2.empno
  35. and e1.deptno=d1.deptno
  36. and e2.deptno=d2.deptno;

 

f.子查询

  1. -- 子查询返回一个值
  2. -- 查询出工资和SCOTT一样的员工信息
  3. select * from emp where sal in
  4. (select sal from emp where ename = 'SCOTT')
  5. -- 子查询返回一个集合
  6. -- 查询出工资和10号部门任意员工一样的员工信息
  7. select * from emp where sal in
  8. (select sal from emp where deptno = 10);
  9. -- 子查询返回一张表
  10. -- 查询出每个部门最低工资,和最低工资员工姓名,和该员工所在部门名称
  11. -- 1,先查询出每个部门最低工资
  12. select deptno, min(sal) msal
  13. from emp
  14. group by deptno;
  15. -- 2,三表联查,得到最终结果。
  16. select t.deptno, t.msal, e.ename, d.dname
  17. from (select deptno, min(sal) msal
  18. from emp
  19. group by deptno) t, emp e, dept d
  20. where t.deptno = e.deptno
  21. and t.msal = e.sal
  22. and e.deptno = d.deptno;

 

g.分页查询

  1. -- oracle中的分页
  2. -- rownum行号:当我们做select操作的时候,
  3. -- 每查询出一行记录,就会在该行上加上一个行号,
  4. -- 行号从1开始,依次递增,不能跳着走。
  5. ?
  6. -- 排序操作会影响rownum的顺序
  7. select rownum, e.* from emp e order by e.sal desc
  8. -- 如果涉及到排序,但是还要使用rownum的话,我们可以再次嵌套查询。
  9. select rownum, t.* from(
  10. select rownum, e.* from emp e order by e.sal desc) t;
  11. ?
  12. ?
  13. -- emp表工资倒叙排列后,每页五条记录,查询第二页。
  14. -- rownum行号不能写上大于一个正数。
  15. select * from(
  16. select rownum rn, tt.* from(
  17. select * from emp order by sal desc
  18. ) tt where rownum<11
  19. ) where rn>5

 

八、视图

  1. -- 前言:如果要操作视图,用户需要dab权限
  2. ?
  3. -- 视图的概念:视图就是提供一个查询的窗口,所有数据来自于原表。
  4. ?
  5. -- 查询语句创建表
  6. create table emp as select * from scott.emp;
  7. select * from emp;
  8. -- 创建视图【必须有dba权限】
  9. create view v_emp as select ename, job from emp;
  10. -- 查询视图
  11. select * from v_emp;
  12. -- 修改视图[不推荐]
  13. update v_emp set job='CLERK' where ename='ALLEN';
  14. commit;
  15. -- 创建只读视图
  16. create view v_emp1 as select ename, job from emp with read only;
  17. -- 视图的作用?
  18. -- 第一:视图可以屏蔽掉一些敏感字段。
  19. -- 第二:保证总部和分部数据及时统一。

 

九、索引

  1. -- 索引的概念:索引就是在表的列上构建一个二叉树
  2. -- 达到大幅度提高查询效率的目的,但是索引会影响增删改的效率。
  3. -- 单列索引
  4. -- 创建单列索引
  5. create index idx_ename on emp(ename);
  6. -- 单列索引触发规则,条件必须是索引列中的原始值。
  7. -- 单行函数,模糊查询,都会影响索引的触发。
  8. select * from emp where ename='SCOTT'
  9. -- 复合索引
  10. -- 创建复合索引
  11. create index idx_enamejob on emp(ename, job);
  12. -- 复合索引中第一列为优先检索列
  13. -- 如果要触发复合索引,必须包含有优先检索列中的原始值。
  14. select * from emp where ename='SCOTT' and job='xx';-- 触发复合索引
  15. select * from emp where ename='SCOTT' or job='xx'; -- 不触发索引
  16. select * from emp where ename='SCOTT'; -- 触发单列索引。

bug总结:

1.中文乱码的解决:

  1. 1.查看服务器端编码
    select userenv('language') from dual;
    我实际查到的结果为:AMERICAN_AMERICA.ZHS16GBK
    2.执行语句
    select * from V$NLS_PARAMETERS
    查看第一行中PARAMETER项中为NLS_LANGUAGE 对应的VALUE项中是否和第一步得到的值一样。
    如果不是,需要设置环境变量.
    否则PLSQL客户端使用的编码和服务器端编码不一致,插入中文时就会出现乱码.
    3.设置环境变量
    计算机->属性->高级系统设置->环境变量->新建
    设置变量名:NLS_LANG,变量值:第1步查到的值, 我的是 AMERICAN_AMERICA.ZHS16GBK
    4.重新启动PLSQL,插入数据正常

 

作者:醉烟

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

原文链接:http://www.cnblogs.com/WangLei2018/p/11295639.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号