Oracle语句学习

 

(1)select * from dual中的dual到底是什么?

    

【日常学习笔记】2019/1/10(Oracle语句学习)_listagg

在sql-developer中测试发现,dual只是一个包含一列,永远只返回一条数据记录的虚拟表。使用dual,是为了构成select的语法规则。当我们需要查询一些不需要表名的数据时,但为了保证sql语法正确性,我们需要添加dual。

比如:

【1】查询当前用户

select user from dual;

【2】查询Oracle的系统时间

select sysdate from dual;


(2)trunc(number)函数

trunc()的作用是按照一定的规则截取传入的参数

【1】select trunc(123.456) from dual;    返回123    即直接去除小数位

【2】select trunc(123.456,2) from dual;    返回123.45    将小数点后2位的数字截去,说减去可能更容易理解

123.456-0.006=123.45

【3】select trunc(123.456,-2) from dual;    返回100    将小数点前2位的数字减去,即123.456-23.456=100


(3)nvl(a,b)函数

如果a为null值时,则返回b。如果a不为null值时,则返回a本来的值。

用java语言来概括就是

return a==null?b:a;

【日常学习笔记】2019/1/10(Oracle语句学习)_dual_02


(4)sign(a)函数

如果a是负数,则返回-1

如果a是0,则返回0

如果a是正数,则返回1


(5)decode(key,x1,y1,x2,y2,.....xn,yn,defaultValue)函数

含义如下:类似于switch语句

switch(key){
case x1:
return y1;
case x2:
return y2;
.......
case xn:
return yn;
default:
return defaultValue;
}

【1】查询某班男生和女生的数量

通常我们这么写:

select count(*) from 表 where 性别 = 男;

select count(*) from 表 where 性别 = 女;

之后好需要进行union

现在利用decode,可以这样写

select sum(decode(性别,男,1,0)),sum(decode(性别,女,1,0)) from 表


(6)listagg()函数的作用

列转行,能够将多条记录转化成一条记录,中间用特定的分隔符连接

话不多说。示例:

查看每个人身上的标签,标签之间以逗号隔开

【日常学习笔记】2019/1/10(Oracle语句学习)_dual_03

对应的sql语句为:

select name,listagg(tag,',') within group(order by tag) tags from table_a group by name

此时输出为:

【日常学习笔记】2019/1/10(Oracle语句学习)_listagg_04

group bu name,先按照name字段就行分组

listagg(tag,',') 实现行转列,将分组后的tag列表转化成一行记录,各个tag之间用逗号连接

within group(order by tag),tag行记录内的多个tag,升序排列


(7)||是什么意思?

相当于字符串连接,即相当于“+”

话不多说,示例:

【日常学习笔记】2019/1/10(Oracle语句学习)_decode_05


(8)(+)代表什么?

这个要谈到左连接与右连接。

当此符号出现在连接条件的右边时,此时是左连接。

当此符号出现在连接条件的左边时,此时是右连接。

更加详细的解释见Oracle(+)号用法

不过需要注意的是,oracle中才有这种语法。mysql中是没有的,只能乖乖的写join了。