oracle
//回收
希望收回xiaoming对emp表的查询权限
revoke select on emp from xiaoming;
//对权限的维护
希望xiaoming用户可以去查询scott的emp表/还希望小明可以把这个权限继续给别人
--如果是对象权限,就加入with grant option
grant select on emp to xiaoming with grant option
--如果是对象权限
system给xiaoming权限时:
grant connect to xiaoming with admin option
--如果scott把xiaoming对emp表的查询权限回收,那么xiaohong会怎样?
被回收
表名和列的命名规则
1.必须以字母开头
2.长度不能超过30字符
3.不能使用oracle的保留字
4.只能使用如下字符:A-Z,a-z,0-9,$,#等
字符型
char 定长 最大2000字符
例子:char(10) '小韩' 前四个字符放'小韩',后添加6个空格 补全
varchar2(20) 变长 最大4000字符
例子:varchar2(10) '小韩' oracle分配二个字符.这样可以节省空间
clob(character large objiect) 字符型大对象最大4G
数字型
number 范围 -10的38次方--10的38次方
number(5,2)
表示一个小数有5位有效数,2位小数
范围 -999.99--999.99
number(5)
表示一个五位整数
范围-99999--99999
日期类型
date 包括年月日和时分秒
timestamp 这是oracle9i对date数据类型的扩展
图片
blob 二进制数据 可以存放图片/声音 4G
建表
学生表
sql>create table student (--表名
xh number(4),--学号
xm varchar2(20),--姓名
sex char(2),--性别
birthday date,--出生日期
sal number(7,2)--奖金
);
create table student(
xh number(4),
xm varchar(20),
sex char(2),
birthday date,
sal number(7,2)
);
--班级表
create table class(
classid number(2),
cname varchar2(20));
create tabel classes(
classId number(2),
cname varchar2(40),
);
--添加字段
alter table student add(classid number(2));
--修改字段的长度
alter table student modify (xm varchar2(30));
--修改字段的类型/或是名字(不能有数据)
alter table student modify (xm char(30));
--删除一个字段
alter table student drop column sal;
--修改表的名字
rename student to stu;
--删除表
drop table student;
所有字段都插入
insert into student values(1,'小明','男','11-12月-1997',2345.23,'A102')
oracle默认的日期格式'DD-MON-YY' dd 日子(天) mon月份 yy 2位的年 '09-6月-99' 1999年6月9号
改日期的默认格式
alter session set nls_date_format ='yyyy-mm-dd'
修改后,可以用我们熟悉的格式添加日期类型
insert into student values(2,'小明','男','1999-08-07',2345.23,'A102')
插入部分字段
insert into student(xh,xm,sex) values ('A003','john','女')
插入空值
insert into student(xh,xm,sex,birthday) values ('A004','MARtin','男',null);
查询空值
select*from student where birthday is null;
查询非空值
select*from student where birthday is not null;
修改一个字段
update student set sex='女' where xh='A001'
修改多个字段
update student set sex='男',birthday='1980-04-08' where xh='A001';
修改含有null值的数据
is null
删除数据
delete from student;
删除所有记录,表结构还在,写日志,可以恢复的,速度慢
savepoint aa;
delete from student;
rollback to aa;
drop table student;删除表的结构和数据
delete from student where xh='A001';删除一条记录
truncate table student;
删除表中的所有记录,表结构还在,不写日志,无法找回删除的记录,速度快
显示运行时间命令
set timing on
如何处理null值
使用nvl函数来处理
select sal*12+nvl(comm,0)*13 年工资,ename,comm from emp;
如何连接字符串
select ename || 'is a' || job from emp;
在多行子查询中使用all操作符
如何显示工资比部门30的所有员工的工资高的员工的姓名、工资和部门号
select ename,sal,deptno from emp where sal>(select max(sal) from emp where deptno=30);
SQL> select ename,sal,deptno from emp where sal>all(select sal from emp where deptno=30);
在多行子查询中使用any操作符
如何显示工资比部门30的任意一个员工的工资高的员工的姓名、工资和部门号
select ename,sal,deptno from emp where sal>any (select sal from emp where deptno=30);
select ename,sal,deptno from emp where sal> (select min(sal) from emp where deptno=30);
多列子查询
单行子查询是指子查询只返回单列、单行数据,多行子查询是指返回单列多行数据,都是针对单列而言的,而多列子查询则是指查询返回多个列数据的子查询语句
如何查询与smith的部门和岗位完全相同的所有雇员
select *from emp where (deptno,job)=(select deptno,job from emp where ename='SMITH');
select *from emp where deptno=(select deptno from emp where ename='SMITH')and job=(select job from emp where ename='SMITH');
oracle的分页一共有三种方式:
1.rownum分页
select *from emp
2.显示rownum【oracle分配的】
select a1.*,rownum rn from (select *from emp) a1;
3
select*from(select a1.*,rownum rn from (select *from emp) a1 where rownum<=10)where rn>=6;
4
几个查询的变化
a.指定查询列,只需修改最里层的子查询
b.如何排序,只需修改最里层的子查询
用查询结果创建新表
这个命令是一种快捷的建表方法
create table mytable(id,name,sal,job,deptno) as select empno,ename,sal,job,deptno from emp;
//合并查询
有时在实际应用中,为了合并多个select语句的结果,可以使用集合操作符号 union,union all,intersect,minus
1,union操作符,该操作符用于取得两个结果集的并集,当使用该操作符时,会自动去掉结果集中重复行。相当于集合中的并
SQL> select ename,sal,job from emp where sal>2500;
ENAME SAL JOB
---------- --------- ---------
JONES 2975.00 MANAGER
BLAKE 2850.00 MANAGER
SCOTT 3000.00 ANALYST
KING 5000.00 PRESIDENT
FORD 3000.00 ANALYST
已执行耗时 0.157 秒
SQL> select ename,sal,job from emp where job='MANAGER';
ENAME SAL JOB
---------- --------- ---------
JONES 2975.00 MANAGER
BLAKE 2850.00 MANAGER
CLARK 2450.00 MANAGER
已执行耗时 0.141 秒
SQL> select ename,sal,job from emp where sal>2500 union select ename,sal,job from emp where job='MANAGER';
ENAME SAL JOB
---------- --------- ---------
BLAKE 2850.00 MANAGER
CLARK 2450.00 MANAGER
FORD 3000.00 ANALYST
JONES 2975.00 MANAGER
KING 5000.00 PRESIDENT
SCOTT 3000.00 ANALYST
6 行 已选择
2,union all
该操作与union相似,但是它不会取消重复行,而且不会排序。
SQL> select ename,sal,job from emp where sal>2500 union all select ename,sal,job from emp where job='MANAGER';
ENAME SAL JOB
---------- --------- ---------
JONES 2975.00 MANAGER
BLAKE 2850.00 MANAGER
SCOTT 3000.00 ANALYST
KING 5000.00 PRESIDENT
FORD 3000.00 ANALYST
JONES 2975.00 MANAGER
BLAKE 2850.00 MANAGER
CLARK 2450.00 MANAGER
8 行 已选择
已执行耗时 0.062 秒
3、intersect
使用该操作符用于取得两个结果集的交集
SQL> select ename,sal,job from emp where sal>2500 intersect select ename,sal,job from emp where job='MANAGER';
ENAME SAL JOB
---------- --------- ---------
BLAKE 2850.00 MANAGER
JONES 2975.00 MANAGER
已执行耗时 0.11 秒
4、minus
使用该操作符用于取得两个结果集的差集,它只会显示存在第一个集合中,而不存在第二个集合中的数据
SQL> select ename,sal,job from emp where sal>2500 minus select ename,sal,job from emp where job='MANAGER';
ENAME SAL JOB
---------- --------- ---------
FORD 3000.00 ANALYST
KING 5000.00 PRESIDENT
SCOTT 3000.00 ANALYST
已执行耗时 0.062 秒
SQL> select ename,sal,job from emp where job='MANAGER' minus select ename,sal,job from emp where sal>2500;
ENAME SAL JOB
---------- --------- ---------
CLARK 2450.00 MANAGER
已执行耗时 0.063 秒
to_date函数
使用特定格式插入日期值
如何插入列带有日期的表,并按照-月-日的格式插入?
insert into emp values(9997,'小红2','manager',7782,to_date('1988-11-11','yyyy-mm-dd'),78.9,55.33,10);
insert into emp values(9996,'小红2','manager',7782,to_date('1988/11/11','yyyy/mm/dd'),78.9,55.33,10);
当使用values子句时,一次只能插入一行数据,当使用子查询插入数据时,一条insert语句可以插入大量的数据。当处理行迁移或者装载外部表的数据库时,可以使用子查询来插入数据。
insert into kkk(myId,myname,myDept) select empno,ename,deptno from emp where deptno=10;
使用子查询更新数据
使用update语句更新数据时,既可以使用表达式或者数值直接修改数据,也可以使用子查询修改数据。
希望员工scott的岗位、工资、补助与smith员工一样
oracle特有:
update emp set(job,sal,comm)=(select job,sal,comm from emp where ename='SMITH') where ename='SCOTT';
什么是事务(transaction):
事务是用于保证数据的一致性,它由一组相关的dml语句组成,该组的dml(数据操作语言,增删改)语句要么全部成功;要么全部失败。
如:网上转账就是典型的要用事务来处理,用以保证数据的一致性。
事务和锁
当执行事务操作时(dml语句),oracle会在被作用的表上加锁,防止其它用户改变表的结构,这对我们用户来讲是非常重要的。
提交事务
当执行使用commit语句就可以提交事务,当执行了commit语句后,会确认事务的变化、结束事务、删除保存点、释放锁,当使用commit语句结束事务后,其它会话将可以查看到事务变化后的新数据。
回退事务
在介绍回退事务前,我们先介绍一下保存点(savepoint)的概念和作用。保存
点是事务中的一点,用于取消部分事务。当结束事务时,会自动的删除该事务所
定义的所有保存点。当执行rollback 时,通过指定保存点可以回退到指定的点,
这里我们作图说明。
事务的几个重要操作ν
1.设置保存点 savepoint a
2.取消部分事务 rollback to a
3.取消全部事务 rollback
注意:这个回退事务,必须是没commit 前使用的;如果事务提交了,那么无
论你刚才做了多少个保存点,都统统没。
如果没手动执行commit,而是exit了那么会自动提交
sqlserver查询的执行顺序是:
(1)FROM <left_table> <join_type> JOIN <right_table> ON <on_predicate>
(2)WHERE <where_predicate>
(3)GROUP BY <group_by_specification>
(4)HAVING <having_predicate>
(5)SELECT DISTINCT TOP(<top_specification>) <select_list>
(6)ORDER BY <order_by_list>
所以在where执行的时候,别名还不存在,而order by的时候已经存在