服务、监听
启动oracle服务
1 | su - oracle |
启动监听服务
1 | lsnrctl start |
配置监听
1 | netca |
启动em控制台
1 | emctl start dbconsole |
创建数据库
1 | dbca |
连接数据库
1 | sqlplus /nolog |
连接数据库
1 | conn system/password; |
断开数据库连接
1 | disc[onnect] |
将屏幕上的内容输入到文件中
1 | spool d:\a.txt |
创建用户
密码必须以字母开头
1 | create user xiaoming identified by m123; |
sys用户:超级管理员,权限最高,dba角色,默认密码:change_on_install
system用户:系统管理员,没有create database权限,默认密码:manager
普通用户:新建的用户无登录数据库权限
查看当前用户
1 | show user; |
修改密码
1 | 1. passw[ord] |
删除用户
如果用户已经创建表,删除的时候加一个cascade参数
1 | drop user 用户名 cascade |
如果一个用户正在被占用,报错ORA-01940: cannot drop a user that is currently connected
1 | SELECT 'ALTER SYSTEM KILL SESSION '||''''||SID||''''||','||''''||SERIAL#||''''||';' as KILLER FROM V$SESSION WHERE USERNAME='USER'; |
授予权限
1 | grant select on emp to xiaoming; |
收回权限
1 | revoke all on emp to xiaoming; |
收回上级权限,下级权限也相应取消
对象权限授权
1 | grant select on emp to xiaoming with grant option; |
系统权限授权
1 | grant connect to xiaoming with admin option; |
用户口令管理
建立数据库时候,oracle会建立默认的default的profile,当没有给用户指定profile的时候,oracle会将default的profile分配给用户
创建profile文件
用户输入3次错误密码后被锁定2天
1 | create profile lock_account limit failed_login_attempts 3 password_lock_time 2; |
用户解锁
1 | alter user xiaoming account unlock; |
定期修改密码
要求用每隔30天修改登录密码,宽限期为2天,32天后没有修改将不能登录
1 | create profile myprofile limit password_life_time 30 password_grace_time 2; |
口令历史
希望用户修改密码的时候,不能使用之前的密码;使用口令历史,oracle会将之前的密码存在数据字典中,当用户修改密码时,oracle会将新输入的密码和旧密码进行比对,如果一样,会提示重新输入。
不能使用10内使用过的密码
1 | create profile password_history limit password_life_time 10 password_grace_time 2 password_reuse_time 10 |
删除profile文件
1 | drop profile password_history [cascade] |
###############Day2############
创建表
必须以字母开头
长度不能超过30个字符
不能使用oracle保留字
只能使用a-zA-Z0-9$#
字符型
char 2000
varchar2 4000
clob 4000+
数字型
number 整数,小数 -(10^38) ~ 10^38
日期类型
date 包含年月日和时分秒
timestamp 时间戳,精度更高
图片
blob
创建student表
1 | create table student( |
添加一个字段
1 | alter table student add(classID number(2)); |
修改字段长度
1 | alter table student modify(xm varchar2(30)); |
修改字段的类型/或者名字(不能有数据)
1 | alter table student modify (xm char(30)); |
删除一个字段
1 | alter table student drop column sal; |
修改表名字
1 | rename student to stu; |
删除表
1 | drop table student; |
修改日期默认格式
1 | alter session set nls_date_format='mm-dd-yyyy' |
插入数据
插入所有字段
1 | insert into student values(1,'小明','男','03-14-2017',3200.00) |
插入部分字段
1 | insert into student(xh,xm,sex) values('23',小张','男') |
插入空值
修改数据
1 | update student set sex='女' where xm='小明'; |
修改多个字段,用逗号隔开
将一行数据复制多条
1 | insert into users (userid,username,userpass) select * from users; |
查询字段为[非]空
1 | select * from student where brithday is [not] null; |
删除数据,不删除表结构,记录在日志中,删除之前建立一个回滚点savepoint aa;可恢复
1 | delete from student; |
删除数据后回滚
1 | rollback to aa; |
删除表的结构和数据
1 | drop table student; |
删除表数据,不删除表结构,不记录在日志中,不可恢复,速度快;
1 | truncate table student; |
查看表结构
1 | desc table_name; |
查询所有列
1 | select * from dept; |
查询指定列
1 | select ename,sal,job,deption from dept; |
取消重复行
1 | select distinct deptno,job from emp; |
打开显示操作时间
1 | set timing on; |
nvl处理null值,当字段为null,当0处理
1 | select sal*13+nvl(comm,0)*13 "年工资",ename,comm from emp; |
like
%表示0到多个字符
_表示任意单个字符
多个值匹配
1 | select * from emp where empno in(123,234,500); |
or & and
1 | select * from emp where (sal>500 or job='Manager') and ename like 'J%'; |
默认排序低到高
1 | order by [asc/desc] |
select * from emp order by depto, sal desc;
1 | 列别名排序 |
select ename,(sal+nvl(comm,0))*12 [as] “年薪” from emp order by “年薪”;
1 |
|
select max(sal),min(sal) from emp;
1 | 查出最高工资员工 |
select ename,sal from emp where sal=(select max(sal) from emp);
1 | 显示工资高于平均工资的员工 |
select * from emp where sal>(select avg(sal) from emp);
1 | group by |
select avg(sal),max(sal),deptno from emp group by deptno;
1 | 显示每个部门的每种岗位的平均工资,最高工资 |
select avg(sal),max(sal),deptno,job from emp group by deptno,job;
1 | having |
select avg(sal),max(sal),deptno from emp group by deptno having avg(sal)>2000;
1 |
|
select a1.ename,a1.sal,a2.dname from emp a1, dept a2 where a1.deptno=a2.deptno;
1 | between 在两者之间 |
select a1.ename,a1.sal,a2.grade from emp a1,salgrade a2 where a1.sal between a2.losal and a2.hisal;
1 | 多表排序 |
select a1.ename,a2.dname,a1.sal from emp a1,dept a2 where a1.deptno=a2.deptno order by a1.deptno;
1 | 自连接 |
select * from emp where deptno=(select deptno from emp where ename=’SMITH’);
1 | 多行子查询 |
select * from emp where job in(select distinct job from emp where deptno=10);
1 | all |
select ename,sal,deptno from emp where sal>all(select all from emp where deptno=30);
select * from emp where sal>(select max(sal) from emp where deptno=30)
1 | any |
select ename,sal,dept from emp where sal>any(select all from emp where deptno=30);
select * from emp where sal>(select min(sal) from emp where deptno=30)
1 | 多列子查询 |
select * from emp where (deptno,job)=(select deptno,job from emp where ename=’SMITH’);
1 | 查询高于自己部门平均工资的员工的信息 |
select a2.ename,a2.sal,a2.deptno,a1.mysal from emp a2,(select deptno,avg(sal) mysql from emp group by deptno) a1 where a2.deptno=a1.deptno and a2.sal > a1.mysal;
1 | 内嵌视图就是子查询当一个表使用,当在from子句中使用子查询时,必须给子查询指定别名; |
select * from (select a1.*,rownum rn from (select * from emp) a1 where rownum<=10) where rn>6;
1 | 2. ROWID 分页 |
create table mytable (id,name,sal,job,deptno) as select empno,ename,sal from emp;
1 | 合并查询 |
exp userid=username/passwd@sid tables=(table1,table2,table3) file=/path/x.dmp
1 | 导入表 |
imp userid=username/passwd@sid tables=(table1,table2,table3) file=/path/x.dmp
1 | 使用直接导出方式 |
exp userid=username/passwd@sid tables=(table1,table2,table3) file=/path/x.dmp direct=y
1 | 导出表结构 |
exp userid=username/passwd@sid tables=(table1,table2,table3) file=/path/x.dmp rows=n
1 | 导出方案 |
exp username/passwd@sid owner=username file=/path/x.dmp
1 | 导出数据库 |
exp userid=system/passwd@sid full=y inctype=complete file=/path/xx.dmp
imp userid=system/manager full=y file=/path/xx.dmp
数据字典记录了数据库的系统信息,它是只读表和视图的集合,数据字典的所有者为sys用户,用户只能在数据字典上执行查询操作,而其维护和修改是由系统自动完成的
数据字典包括字典基表和数据字典动态视图,其中基表存储数据库的基本信息,普通用户不能直接访问数据字典的基表,数据字典视图是基于数据字典基表所建立的视图,普通用户可以通过查询数据字典的视图取得系统信息
数据字典视图主要包括user_xxx,all_xxx,dba_xxx三种类型
user_tables;
用于显示当前用户拥有的所有表,只返回用户所对应方案的所有表;
select table_name from user_tables;
all_tables;
用于显示当前用户可以访问的所有表;
select table_name from all_tables;
dba_tables;
用户显示所有方案拥有的数据库表。但是查询这种数据库字典视图,要求用户必须是dba角色或是有select any table系统权限。
select table_name from dba_tables;
用户名,权限,角色
dba_users 可以显示所有数据库用户的详细信息;
dba_sys_privs 可以显示用户所具有的系统权限;
dba_tab_privs 可以显示用户具有的对象权限;
dba_col_privs 可以显示用户具有的列权限;
dba_role_privs 可以显示用户所具有的角色。
查询oracle中所有的系统权限,一般是dba
select * from system_privilege_map order by name;
查询oracle中所有的角色,一般是dba
select * from dba_roles;
查询oracle中所有的对象权限,一般是dba
select distinct privilege from dba_tab_privs;
查询数据表的表空间
select tablespace_name from dba_tablespaces;
oracle 有多少种角色?
select * from dba_roles;
查询一种角色有多少种权限?
a. 一个角色包含的系统权限
select * from dba_sys_privs where grantee='CONNECT';
select * from role_sys_privs where role='CONNECT';
b. 一个角色包含的对象权限
select * from dba_tab_privs where grantee='CONNECT';
如何查看某个用户具有什么样的角色?
select * from dba_role_privs where grantee='SCOTT';
显示当前用户可以访问的所有数据字典视图
select * from dict where comments like '%grant%'
显示当前数据库的全称
select * from global_name;