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

来源:互联网 发布:诸葛亮网络用语含义 编辑:程序博客网 时间:2024/04/30 11:50

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  分页

 

原创粉丝点击