oracle实战(一)

1、表空间的建立以及删除

声明:此操做环境为windows,oracle10Ghtml

表空间? ORACLE数据库的逻辑单元。 数据库---表空间 一个表空间能够与多个数据文件(物理结构)关联
一个数据库下能够创建多个表空间,一个表空间能够创建多个用户、一个用户下能够创建多个表。 create tablespace test datafile 'c:\test.dbf' size 100m autoextend on
next 100m; test 为表空间名称 datafile 指定表空间对应的数据文件 size 后定义的是表空间的初始大小 autoextend on 自动增加 ,当表空间存储都占满时,自动增加 next 后指定的是一次自动增加的大小。

 

2、用户

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

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

 

二、受权

-- oracle数据库经常使用角色: -- connect--链接角色,基本角色 -- resource--开发者角色 -- dba--超级管理员角色
-- 例1:给一个用户授予dba权限(这在生产环境中是不推荐的)
grant dba to test; -- 例2:给一个用户授予开发者权限(注意,必须加上connect,否则没法链接数据库)
grant resource,connect to test;

 

三、删除用户

-- 注意:删除用户的时候,该用户须要处于未登录状态 -- 例1:删除一个没有本身建立对象的用户
drop user test; -- 例2:删除含有本身建立的对象的用户时(须要使用CASCADE)
drop user test cascade;

 

4.解锁用户

-- 例如:解锁scott用户(密码默认是tiger) -- 解锁scott用户
alter user scott account unlock; -- 设置scott用户的密码【此句也能够用来重置密码】
alter user scott identified by tiger; 

3、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

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

1.建立表

语法: Create table 表名( 字段1 数据类型 [default 默认值], 字段2 数据类型 [default 默认值], ... 字段n 数据类型 [default 默认值] ); ​ -- 建立一个person表
create table person( pid number(20), pname varchar2(10) );

 

2.修改表结构

---添加一列 
alter table person add (sex number(1)); -- 修改列类型 
alter table person modify sex char(1); -- 修改列名称 
alter table person rename column sex to gender; -- 删除一列 
alter table person drop column gender;

 

 

5、DML(数据操做语言) =》 增删改

1.插入数据

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

 

2.修改数据

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

 

3.三种删除

-- 删除表中所有记录
delete from person; -- 删除表结构
drop table person; -- 先删除表,再次建立表。效果等同于删除表中所有记录。 -- 在数据量大的状况下,尤为在表中带有索引的状况下,该操做效率高。 -- 索引能够提供查询效率,可是会影响增删改效率。
truncate table person;

6、序列

简介:

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

 

一、建立序列

create sequence sq_person;

 

2.两个函数及序列用法

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

3.删除序列

drop sequence sq_person;

 

7、DQL(数据查询语言)

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

1.简单查询

select * from person; -- 开发不推荐

select pid,pname from person; -- 开发推荐

 

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

a.单行函数

-- 字符函数 -- 接收字符输入返回字符或者数值,dual是伪表 -- 1. 把小写的字符转换成大小的字符 upper('smith')
select upper('yes') from dual;--YES -- 2. 把大写字符变成小写字符
select lower('YES') from dual;--yes
-- 数值函数
select round(56.16, -2) from dual;---四舍五入,后面的参数表示保留的位数
select trunc(56.16, -1) from dual;---直接截取,不在看后面位数的数字是否大于5.
select mod(10, 3) from dual;---求余数
-- 日期函数 ----查询出emp表中全部员工入职距离如今几天。
select sysdate-e.hiredate from emp e; ----算出明天此刻
select sysdate+1 from dual; ----查询出emp表中全部员工入职距离如今几月。
select months_between(sysdate,e.hiredate) from emp e; ----查询出emp表中全部员工入职距离如今几年。
select months_between(sysdate,e.hiredate)/12 from emp e; ----查询出emp表中全部员工入职距离如今几周。
select round((sysdate-e.hiredate)/7) from emp e; ​ -- 转换函数 ---日期转字符串
select to_char(sysdate, 'fm yyyy-mm-dd hh24:mi:ss') from dual; ---字符串转日期
select to_date('2018-6-7 16:39:50', 'fm yyyy-mm-dd hh24:mi:ss') from dual; ​ -- 通用函数 -- 算出emp表中全部员工的年薪 -- 奖金里面有null值,若是null值和任意数字作算术运算,结果都是null。
select e.sal*12+nvl(e.comm, 0) from emp e;

 

b.条件表达式

---条件表达式的通用写法,mysql和oracle通用 ---给emp表中员工起中文名
select e.ename, case e.ename when 'SMITH' then '傻瓜'
           when 'ALLEN' then '白痴'
             when 'WARD' then '二流子'
               --else '专家'
                 end
from emp e; ---判断emp表中员工工资,若是高于3000显示高收入,若是高于1500低于3000显示中等收入, -----其他显示低收入
select e.sal, case 
         when e.sal>3000 then '高收入'
           when e.sal>1500 then '中等收入'
               else '低收入'
                 end
from emp e; ----oracle中除了起别名,都用单引号。 ----oracle专用条件表达式
select e.ename, decode(e.ename, 'SMITH',  '关羽', 'ALLEN',  '张飞', 'WARD',  '刘备', '小白') "中文名" from emp e;

 

c.多行函数

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

 

d.分组查询

-- 查询出每一个部门的平均工资 -- 分组查询中,出如今group by后面的原始列,才能出如今select后面 -- 没有出如今group by后面的列,想在select后面,必须加上聚合函数。 -- 聚合函数有一个特性,能够把多行记录变成一个值。
select e.deptno, avg(e.sal)--, e.ename 
from emp e group by e.deptno; -- 查询出平均工资高于2000的部门信息
select e.deptno, avg(e.sal) asal from emp e group by e.deptno having avg(e.sal)>2000; -- 全部条件都不能使用别名来判断。 -- 好比下面的条件语句也不能使用别名当条件
select ename, sal s from emp where sal>1500; ​ -- 查询出每一个部门工资高于800的员工的平均工资
select e.deptno, avg(e.sal) asal from emp e where e.sal>800
group by e.deptno; -- where是过滤分组前的数据,having是过滤分组后的数据。 -- 表现形式:where必须在group by以前,having是在group by以后。 -- 查询出每一个部门工资高于800的员工的平均工资 -- 而后再查询出平均工资高于2000的部门
select e.deptno, avg(e.sal) asal from emp e where e.sal>800
group by e.deptno having avg(e.sal)>2000;

 

e.多表查询

-- 笛卡尔积
select *
from emp e, dept d; -- 等值链接
select *
from emp e, dept d where e.deptno=d.deptno; -- 内链接
select *
from emp e inner join dept d on e.deptno = d.deptno; -- 查询出全部部门,以及部门下的员工信息。【外链接】
select *
from emp e right join dept d on e.deptno=d.deptno; -- 查询全部员工信息,以及员工所属部门
select *
from emp e left join dept d on e.deptno=d.deptno; -- oracle中专用外链接 不推荐使用
select *
from emp e, dept d where e.deptno(+) = d.deptno; ​ select * from emp; -- 查询出员工姓名,员工领导姓名 -- 自链接:自链接其实就是站在不一样的角度把一张表当作多张表。
select e1.ename, e2.ename from emp e1, emp e2 where e1.mgr = e2.empno; -- 查询出员工姓名,员工部门名称,员工领导姓名,员工领导部门名称
select e1.ename, d1.dname, e2.ename, d2.dname from emp e1, emp e2, dept d1, dept d2 where e1.mgr = e2.empno and e1.deptno=d1.deptno and e2.deptno=d2.deptno;

 

f.子查询

-- 子查询返回一个值 -- 查询出工资和SCOTT同样的员工信息
select * from emp where sal in (select sal from emp where ename = 'SCOTT') -- 子查询返回一个集合 -- 查询出工资和10号部门任意员工同样的员工信息
select * from emp where sal in (select sal from emp where deptno = 10); -- 子查询返回一张表 -- 查询出每一个部门最低工资,和最低工资员工姓名,和该员工所在部门名称 -- 1,先查询出每一个部门最低工资
select deptno, min(sal) msal from emp group by deptno; -- 2,三表联查,获得最终结果。
select t.deptno, t.msal, e.ename, d.dname from (select deptno, min(sal) msal from emp group by deptno) t, emp e, dept d where t.deptno = e.deptno and t.msal = e.sal and e.deptno = d.deptno;

 

g.分页查询

-- oracle中的分页 -- rownum行号:当咱们作select操做的时候, -- 每查询出一行记录,就会在该行上加上一个行号, -- 行号从1开始,依次递增,不能跳着走。
-- 排序操做会影响rownum的顺序
select rownum, e.* from emp e order by e.sal desc
-- 若是涉及到排序,可是还要使用rownum的话,咱们能够再次嵌套查询。
select rownum, t.* from( select rownum, e.* from emp e order by e.sal desc) t; ​ ​ -- emp表工资倒叙排列后,每页五条记录,查询第二页。 -- rownum行号不能写上大于一个正数。
select * from( select rownum rn, tt.* from( select * from emp order by sal desc ) tt where rownum<11 ) where rn>5

 

8、视图

-- 前言:若是要操做视图,用户须要dab权限
-- 视图的概念:视图就是提供一个查询的窗口,全部数据来自于原表。
-- 查询语句建立表
create table emp as select * from scott.emp; select * from emp; -- 建立视图【必须有dba权限】
create view v_emp as select ename, job from emp; -- 查询视图
select * from v_emp; -- 修改视图[不推荐]
update v_emp set job='CLERK' where ename='ALLEN'; commit; -- 建立只读视图
create view v_emp1 as select ename, job from emp with read only; -- 视图的做用? -- 第一:视图能够屏蔽掉一些敏感字段。 -- 第二:保证总部和分部数据及时统一。

 

9、索引

-- 范例一 -- 索引的概念:索引就是在表的列上构建一个二叉树 -- 达到大幅度提升查询效率的目的,可是索引会影响增删改的效率。 -- 单列索引 -- 建立单列索引
create index idx_ename on emp(ename); -- 单列索引触发规则,条件必须是索引列中的原始值。 -- 单行函数,模糊查询,都会影响索引的触发。
select * from emp where ename='SCOTT'
-- 复合索引 -- 建立复合索引
create index idx_enamejob on emp(ename, job); -- 复合索引中第一列为优先检索列 -- 若是要触发复合索引,必须包含有优先检索列中的原始值。
select * from emp where ename='SCOTT' and job='xx';-- 触发复合索引
select * from emp where ename='SCOTT' or job='xx'; -- 不触发索引
select * from emp where ename='SCOTT';  -- 触发单列索引。

CREATE INDEX index_name ON table_name(column_name,column_name) include(score) -- 索引范例二 -- 普通索引
CREATE UNIQUE INDEX index_name ON table_name (column_name) ; -- 非空索引
CREATE PRIMARY KEY INDEX index_name ON table_name (column_name) ; -- 主键索引 -- 使用ALTER TABLE语句建立索引
alter table table_name add index index_name (column_list) ; alter table table_name add unique (column_list) ; alter table table_name add primary key (column_list) ; -- 删除索引
drop index index_name on table_name ; alter table table_name drop index index_name ; alter table table_name drop primary key ; -- 建立索引
alter table tbl_name add primary key (column_list): -- 该语句添加一个主键,这意味着索引值必须是惟一的,且不能为 null。

alter table tbl_name add unique index_name (column_list): -- 这条语句建立索引的值必须是惟一的(除了 null 外,null 可能会出现屡次)。

alter table tbl_name add index index_name (column_list): -- 添加普通索引,索引值可出现屡次。

alter table tbl_name add fulltext index_name (column_list): -- 该语句指定了索引为 fulltext ,用于全文索引。

-- 删除索引
drop index [indexname] on mytable; -- 修改
alter mytable add index [indexname] on(username(length)) -- 查询 -- 使用 show index 命令来列出表中的相关的索引信息。能够经过添加 \g 来格式化输出信息。
show index from table_name \g

bug总结:

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,插入数据正常

 

做者:醉烟sql

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

原文出处:https://www.cnblogs.com/WangLei2018/p/11295639.html数据库

相关文章
相关标签/搜索