公司昨天开始做一个Oracle的培训(基础培训)。昨天和今天进行Oracle的初级知识的培训。把在培训中学习到的以前没有学到或者是忽略了的东西做一个整理。
1. 关于Select语句是否锁定数据。
Oracle中的Select语句并不锁定数据,除非使用for update字句。
好像Ms SQL Server中Select语句会缺省的锁定数据。
2. 算术运算中包含了null值时的运算结果
如果算术运算中包含了null值,例如null+1,null-1,null*1,null/1,返回的结果都是null。即使是计算null/0,也不会报错。
3. 控制column alias的大小写
在查询语句中,可以给查询结果的每列取一个别名。缺省的会将别名以大写的形式返回。例如:
Select sysdate system_date from dual
和
select sysdate SYSTEM_DATE from dual
返回的结果都是
SYSTEM_DATE
5/12/2006 5:57:55PM
如果希望列名与自己输入的大小写一致,可以将别名用””括起来。例如:
Select sysdate “System_Date” from dual
会返回
System_Date
5/12/2006 5:57:55PM
4. Sysdate的计算
对sysdate可以进行加减计算。例如:
如果 Select sysdate from dual 返回5/12/2006 5:57:55PM
那么,Select sysdate-1 from dual 返回4/12/2006 5:57:55PM,即一天前的时间。
而Select sysdate-1/24 from dual 返回5/12/2006 4:57:55PM,即一个小时以前的时间。
5. Like子句的通配符和逃逸符
Like语句中可以使用通配符%和_;%代表任意多个字符,可以是0个、1个或多个。_代表一个字符。
假如现在有一个表TableA如下:
ColumnA | ColumnB | ColumnC |
A11 | B_1 | C1 |
A_1 | B21 | C13 |
A31 | B31 | C13 |
Select columna,
columnb,
columnc
from tablea
where columnc like ‘C%’
会返回所有的记录。
如果执行
Select columna,
columnb,
columnc
from tablea
where columnc like ‘C_’
只会返回第一条记录。
执行
Select columna,
columnb,
columnc
from tablea
where columnc like ‘C__’
(注意查询条件中是两个_符号。)
会返回后两条记录。
那么,如果我们要查询所有columnb中第一个字符是B,第二个字符是_,第三个字符为任意字符的数据,应该怎么查询呢?
如果执行
Select columna,
columnb,
columnc
from tablea
where columnb like ‘B__’
这样会返回所有的3条记录。因为Oracle会将_当作通配符,也就是说Oracle认为你要查询的是所有以B开始的总共3个字符的值。
那么怎么让Oracle认为第一个_不是通配符呢。这就需要用到逃逸符(或者叫做转义符)。上面的查询语句应该写成
Select columna,
columnb,
columnc
from tablea
where columnb like ‘B/__’
escape ‘/’
这里 escape ‘/’的意思是前面的条件中’/’为逃逸符,它后面紧跟的一个字符做原意解释。也就是说它后面紧跟的’_’字符不再被认为是通配符,而被认为是’_’字符。注意这里的escape只对它前面的一个条件有效。如果在两个条件中都需要用到逃逸符,那么在每个条件后面都需要加上一个escape字句,这两个escape子句定义的逃逸符可以不一致。
6. Char 类型和 VarChar、VarChar2类型之间的区别
Char类型是定长的。例如Char(20)代表一个20字节的字符串,即使是其中就存放了一个字符,也要占用20个字节。
VarChar和VarChar2是变长的。VarChar(20)和VarChar2(20)都表示最长可以存放20个字节的字符串。但是实际的长度是随着存放内容的变化而变化的。如果只存放了一个字符’A’,那么就只占用一个字节。
VarChar和VarChar2目前(到Oracle10g)还没有区别。但是推荐使用VarChar2。
7. 两个表做连接的时候,表的顺序对性能的影响。
从Oracle10g开始,顺序对性能没有影响。
8. count函数
如果表TableA中有100条记录,其中columnA为null的记录有10条。那么 select count(*) from tablea 会返回100;select count(columna) from tablea会返回90。
9. merge语句
语法为
merge into table_name table_alias
using (table|view|sub_query) alias
on (join condition)
when match then
DML
when not match then
DML
DML表示数据超作语言,例如insert,update,delete。
10. synonym(同义词)
同义词分为两个级别:public级别的和user级别的。
不同user的synonym可以相同。例如userA和userB都可以有一个叫做mySynonym的同义词。
public级别的synonym不可以相同。
user级别的synonym和public级别的synonym可以同名。
一般来说,使用synonym对性能会有一定的影响,不建议使用。
11. truncate和delete的区别
truncate用来清空一张表。使用delete删除所有记录也可以清空一张表。两者之间的区别在于:
delete是一条条记录的删除,数度会很慢。truncate速度快。
delete不会释放表空间。如果一张表占用2G的空间,用delete删除所有的记录之后,占用的空间还是2G。
truncate不能被rollback,因此要小心使用。