一,操作符:
- 算数运算符
+,-,*,/, - 逻辑运算符
and与,or或,not非 - 关系运算符
=,!=,<,>,<=,>= - 连接运算符
就是||,比如:
select 'hello'||'world' from dual;
-
集合运算符
-
Union:自动去重复,排序
-
Union all:不去重复,不排序
-
Intersect:求交集,排序了
-
Minus:求差集 a minus b 就是 a-b
二,锁
oracle中默认的锁是:乐观锁,排他锁,行锁。
oracle中解锁只有两种方式:commit,rollback
1,乐观锁:
就是乐观的认为在自己操作数据的过程中,没有其他人操作这个数据,当执行insert,update,delete的语句是就自动加上了乐观锁。
update a set loc='山西' where deptno=20;
我们看到当用户1把数据改成山西,还没有commit或者rallback释放锁的时候,用户二想把它改成广东处于阻塞状态,它在等用户1释放锁.用户1释放锁之后,用户2才能改,最后的数据是用户2操作之后的数据
2,悲观锁:
总是悲观的认为在自己操作数据之前害怕有别人操作这个数据,它在访问数据之前提前就把数据锁定住,可以放心大胆的操作了!
先锁住,再进行操作。
两个用户同时进去想上悲观锁,但是1用户先进去上了锁,2用户就处于阻塞状态,等1释放锁了之后它才能上锁。
为了方便看,我们加上nowait;
select * from a for update nowait;
这样就可以看到它是处于阻塞状态的。
3,行锁:
锁定一行数据或多行数据都叫行锁
Select * from a for update nowait;
select * from a where deptno=40 for update nowait;
行锁可以是乐观锁,也可以是悲观锁,反正就是它把它想要操作的行锁定,其他用户可以增,但是如果想删改就会处于阻塞状态。就是只能查或者给里面加,但是人家锁定的数据你不能动。也不能查人家锁定的数据,没有锁定的随便查
4,表锁:
就是把一张表都给锁定了,同样用户1锁住了,其他用户就不能锁了
table 表名 in exclusive mode nowait
表锁定之后,就只能查,不能增删改。
表锁和行锁的区别就是行锁能添加数据,表锁不能。
5,共享锁:
你可以加锁,我可以加锁,大家都可以加锁!但是没一个人能操作数据!大家都只看数据不能动数据!
lock table 表名 in share mode nowait
注意:如果不加nowait就同时锁不了。
当两张表是共享锁,都对数据进行了操作,就会形成死锁
6,排它锁
整张表锁定,别人无法访问,别人也不能在加锁!自己可以随意操作数据,自己可以解锁
lock table a in exclusive mode nowait;
不能增删改,但可以查
7,死锁
- 共享锁的两个或多个用户想同时对数据进行操作时,会形成死锁。
- 当两个行锁锁的是不同的行,都想对对方的行进行操作时就会形成死锁。