看完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 分页
创建一个用户
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 分页
相关文章推荐
- oracle的一些小问题集锦(不断更新)
- iOS一些实用demo(会持续更新的)
- 一些实用SQL (持续更新)
- oracle小记之一些系统函数、自定义函数、关键字(20120719更新)
- Oracle 一些实用的函数
- IDEA的一些实用小技巧(持续更新)
- 分享一些实用的Android Studio插件 - 不定期更新
- 一些实用的DBA语句(持续学习,持续更新)
- Oracle 网上一些实用脚本归纳
- oracle 一些比较实用的用法
- oracle中更新表的一些操作
- VS的一些实用快捷键及小技巧(不断更新)
- 一些实用的方法,持续更新...
- sql语句一些实用技巧for oracle
- oracle 一些比较实用的用法
- Oracle的备忘一些经常出错的地方 长期更新
- ORACLE 实用 慢慢更新^_^
- 自己录制的Oracle 相关视频(陆续更新)
- [原创][SW]一些实用软件的小tips(长期更新)