Oracle语法learn
NVL函数
空值判断函数
-
NVL(表达式A,表达式B)
如果表达式A为空值,NVL返回值为表达式B的值,否则返回表达式A的值。该函数的目的是把一个空值(null)转换成一个实际的值。其表达式的值可以是数字型、字符型和日期型。但是表达式A和表达式B的数据类型必须为一个类型。
例:nvl(clue_num,0):如果clue_num为空,则返回0;否则返回clue_num的值
-
NVL2(表达式A,表达式B,表达式C)
如果表达式A为空,则返回表达式C的值;如果表达式A不为空,则返回表达式B的值。
例:nvl(sex,0,1):如果sex为空,则返回1;否则返回0
NULLIF函数
-
NULLIF:如果exp1和exp2相等则返回空(NULL),否则返回第一个值
例如:下面返回一个空值
select NULLIF('111','111') from dual
又例如:下面返回111
select NULLIF('111','1111') from dual
而且两个值的数据类型要一致,不然会报错
Coalesce函数
-
Coalese函数的作用是的NVL的函数有点相似,其优势是有更多的选项
例:Coalesce(expr1, expr2, expr3…… exprn)
表示可以指定多个表达式的占位符。所有表达式必须是相同类型,或者可以隐性转换为相同的类型。
返回表达式中第一个非空表达式,如有以下语句:SELECT COALESCE(NULL,NULL,3,4,5) FROM dual 其返回结果为:3
如果所有自变量均为 NULL,则 COALESCE 返回 NULL 值。
!=与<>和^=
!= 、 <>、^= 三个符号都表示“不等于”的意思,在逻辑上没有本质区别
但是要主义的是三个符号在表达“不等于”含义的同时,隐含一个“不为空 is not null”的前提,所以使用时null会被过滤掉。
例如数据库三条数据
姓名 | 性别 |
---|---|
张三 | 男 |
李四 | |
王五 | 女 |
姓名<> ‘张三’ :可以查出来李四和王五
性别<> ‘男’ :仅可以查出来王五,李四的性别null被默认过滤掉了
但是官方更推荐“<>”的写法,因为跨平台可移植性更强
insert语句批量插入数据
insert all
into a(field_1,field_2) values (value_1,value_2)
into a(field_1,field_2) values (value_3,value_4)
into a(field_1,field_2) values (value_5,value_6)
select 1 from dual;
insert all into并不表示一个表中插入多条记录,而是表示多表插入各一条记录,而这多表可以是同一个表,就成了单表插入多条记录。根据后面子查询的结果,前面每条into语句执行一次,博客正文中value都是“字面量”,所以用select 1 from dual返回一条记录即可。
in/not in 的作用
-
in 常用于条件表达式(where)中,它的作用是对某个范围内的数据进行操作,查询或删除。字段值只要满足这个范围之内的任意一个即可
select * from TableName(表名) where 字段 in (value1,value2,…);
-
not in 作用是查询不在某个范围内的数据,字段值同时不满这个范围的所有值。
select * from TableName(表名) where 字段 not in (value1,value2,…);
插入系统当前时间
insert into TableName (时间字段名) values (sysdate)
修改表中字段长度
alter table TableName(表名) modify 字段 varchar2(1500);
Oracle数据库汉字占几个字节
- ORACLE数据库它可以存储字节或字符,例如 CHAR(12 BYTE) CHAR(12 CHAR)的意义是不同的.一般来说默认是存储字节,你可以查看数据库参数NLS_LENGTH_SEMANTICS的值
SELECT * FROM v$nls_parameters WHERE PARAMETER='NLS_LENGTH_SEMANTICS';
--结果为BYTE,说明存储是字节类型
- 如果定义为VARCHAR2(50 CHAR),那么该列最多就可以存储50个汉字,如果定义字段为VARCHAR2(50) 或VARCHAR2(50 BYTE)那么它最多可以存储多少个汉字就要视数据库字符集编码决定。
- ORACLE数据库汉字占用几个字节,要根据ORACLE中字符集编码决定,一般情况下,数据库的NLS_CHARACTERSET 为AL32UTF8或UTF8,即一个汉字占用三到四个字节。如果NLS_CHARACTERSET为ZHS16GBK,则一个字符占用两个字节.
SELECT * FROM v$nls_parameters WHERE PARAMETER='NLS_CHARACTERSET';
- 至于具体情况,可以通过LENGTHB或者VSIZE函数求得是占用字节数。LENGTH函数求得是占用字符数,LENGTHB或者VSIZE函数求得是占用字节数。
select lengthb('中国') from dual;
select length('中国') from dual;
LENGTH是计算字符的个数,输入的参数先被转为字符类型计算