您的位置:首页 > 数据库 > Oracle

看完Oracle视频后的一些实用(正在更新中)

2012-10-12 22:46 375 查看
1.用户管理

创建一个用户

create user admin identified by admin;还没有任何权限

本人修改密码 password 密码;

删除用户(同时删除他的表)

drop user admin cascade

为用户指定权限 grant

授权用户登陆的权限(系统权限)

grant connect to admin;

grant connect to admin with admin option;

将emp表的所有权限赋给admin(对象权限)

grant all on emp to admin;

回收权限

revoke all on emp to admin

将emp表的所有权限赋给admin,并且改用户还可以把这个权限给别人

grant all on emp to admin with grant option;

admin用户查询emp 表

select * from system.emp;

用户口令管理

账户锁定(创建约束:当用户3次输入密码错误的时候,系统会锁定改账号2天,

无法登陆)

create profile lock_account limit

failed_login_attempts 3 password_lock_time 2

将admin 设置约束

alter user admin profile lock_account

解锁

alter user admin accout unlock;

终止指令

在一定的时间内修改密码

create profile mm limit password_life_time 10 password_grace_time 2

alter user admin profile mm;

删除profile

drop profile 名字 (cascade)

2.表的管理

创建一张表

create table student(

xh number(4),

xm nvarchar2(20),

sex char(2),

birthday date,

sal number(7,2)

)

为表添加新的字段

alter table student add (classId number(2))

修改字段的类型或名字(不能有数据)

alter table student modify(xm char(30));

删除一个字段

alter table student drop column sal;

修改表的名字

rename student to stu

删除表

drop table student;

默认的时间格式

DD-Mon-YY 天-月-年

设置当前插入的时间格式

alter session set nls_date_format='yyyy-mm-dd';

插入null

insert into student(xh,xm,sex,birthday) values(3,'aa','女',null);

查询null

select * from student where birthday is null;

并不是select * from student where birthday=null;

删除数据

delete from student

删除后的数据可以恢复

savepoint aa;保存节点

rollback aa; 回滚到该节点

删除表的数据跟结构

drop table student

3.表的查询

emp 表结构

Name Type Nullable Default Comments

-------- ------------ -------- ------- --------

EMPNO NUMBER(4) Y

ENAME VARCHAR2(20) Y

JOB VARCHAR2(20) Y

MGR NUMBER(4) Y

HIREDATE DATE Y

SAL NUMBER(7,2) Y

COMM NUMBER(7,2) Y

DEPTNO NUMBER(4) Y

dept 表结构

Name Type Nullable Default Comments

------ ------------ -------- ------- --------

DEPTNO NUMBER(4) Y

DNAME VARCHAR2(20) Y

LOC VARCHAR2(20) Y

算术运算时,如何处理null

用nvl()函数,比如说nvl(comm,0);

select ename as "姓名",12*sal+nvl(comm,0) as "年工资" from emp;

根据时间查询

select * from emp where hiredate>'1-1月-1981'

如果你执行了这行代码

alter session set nls_date_format='yyyy-mm-dd';

就可以采用下面的方式查询

select * from emp where hiredate>'1982-1-1';

模糊查询

like 关键字

显示名字为大写S开头的

select * from emp where ename like 'S%';

显示低3个字母为小写o

select * from emp where ename like '__o%';

in 关键字

将满足条件的结果都查出来 不要用or 因为效率慢

select * from emp where empno in(7788,7902);

逻辑运算符

or and

select * from emp where (sal>500 or job='manager') and ename like

'S%';

order 分组查询

从高到低 desc

select * from emp order by sal desc;

默认是asc 从低到高

按部门顺序 提示按工资的由高到低排序

select * from emp order by deptno,sal desc;

复杂查询

显示最高工资跟最低工资

select max(sal) as "最高工资",min(sal) as "最低工资" from emp;

如果一个列里面有一个分组函数 那么这个列都是分组函数

比如 select ename,sum(sal) from emp; 这句是行不通的

select count(ename) as "员工总数",avg(sal) as "平均工资",sum(sal) as "

所有工资" from emp;

员工总数 平均工资 所有工资

---------- ---------- ----------

14 2173.21428 30425

group by

在选择列中如果有列,表达式,分组函数,那么这些列喝表达式必须有一个出现

在group by 字句中,否则就会报错

查询的每个部门的最高工资跟平均工资

select deptno,avg(sal),max(sal) from emp group by deptno;

查询的每个部门每种岗位的最高工资跟平均工资

select deptno,job,avg(sal) as "平均工资",max(sal) as "最高工资" from

emp group by deptno,job;

having

该关键字的含义是在分组的结果中删选符合条件的

显示平均工资为2000 的部门号 和他的平均工资

select deptno,avg(sal) from emp group by deptno having avg(sal)<2000;

多表查询

笛卡尔积

多表查询的的条件至少不能少于表的个数-1,这样就避免的笛卡尔积

显示员工姓名 以及他所在的部门名称

select ename,dname from emp e,dept d where d.deptno=e.deptno;

查询为10部门的部门名,员工和工资

select e.ename,e.sal,d.dname from emp e,dept d where d.deptno=10 and

e.deptno=10;

表工资级别

salgrade;

Name Type Nullable Default Comments

----- ----------- -------- ------- --------

GRADE NUMBER(4) Y

LOSAL NUMBER(6,2) Y

HISAL NUMBER(6,2) Y

查询出雇员的工资及相应的级别

select e.ename,e.sal,s.grade from emp e,salgrade s where e.sal between

s.losal and s.hisal;

雇员,工资,部门名称并按部门排序

select e.ename,e.sal,d.dname from emp e ,dept d where

e.deptno=d.deptno order by d.deptno;

自连接(一张表上面的连接查询)

显示emp 表中 员工的编码姓名以及上级的名字

select a1.empno,a1.ename,a2.ename from emp a1,emp a2 where

a1.mgr=a2.empno;

子查询

单行子查询

只返回一条记录

多行子查询

返回多条记录

比如查询和部门10的工作相同的雇员的名字,岗位,工资,和部门号

in的使用

select ename,job,sal,deptno from emp where job in(select job from emp

where deptno=10);

在多行子查询中使用all 操作符

显示工资比30号部门所有员工的工资都高的员工的姓名行工资和部门号

不用all

效率快,建议使用函数来解决

select ename,sal,deptno from emp where sal>(select max(sal) from emp

where deptno=30);

使用all

效率相对上面慢

select ename,sal,deptno from emp where sal>all(select sal from emp

where deptno=30);

any 操作符 表示任何一个

多列子查询中

在子查询中返回多列的问题

查询与smith 部门跟岗位完全相同的雇员

select ename,job,deptno from emp where (job,deptno)=(select job,deptno

from emp where ename='Smith');

from 里面使用子查询

该子查询会被当做一个试图来对待

高于自己部门的平均工资的员工信息

解析:将每个部门的平均工资看做一张子表(类似自连接,但是这张表 是你自己

查询出来的)

select a1.ename,a1.sal,a1.deptno,a2.avgsal from emp a1,(select deptno

,avg(sal) avgsal from emp group by deptno) a2 where

a1.deptno=a2.deptno and a1.sal>a2.avgsal;

Oracle 分页
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: