Oracle语句学习
(1)select * from dual中的dual到底是什么?
在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;
(4)sign(a)函数
如果a是负数,则返回-1
如果a是0,则返回0
如果a是正数,则返回1
(5)decode(key,x1,y1,x2,y2,.....xn,yn,defaultValue)函数
含义如下:类似于switch语句
【1】查询某班男生和女生的数量
通常我们这么写:
select count(*) from 表 where 性别 = 男;
select count(*) from 表 where 性别 = 女;
之后好需要进行union
现在利用decode,可以这样写
select sum(decode(性别,男,1,0)),sum(decode(性别,女,1,0)) from 表
(6)listagg()函数的作用
列转行,能够将多条记录转化成一条记录,中间用特定的分隔符连接
话不多说。示例:
查看每个人身上的标签,标签之间以逗号隔开
对应的sql语句为:
此时输出为:
group bu name,先按照name字段就行分组
listagg(tag,',') 实现行转列,将分组后的tag列表转化成一行记录,各个tag之间用逗号连接
within group(order by tag),tag行记录内的多个tag,升序排列
(7)||是什么意思?
相当于字符串连接,即相当于“+”
话不多说,示例:
(8)(+)代表什么?
这个要谈到左连接与右连接。
当此符号出现在连接条件的右边时,此时是左连接。
当此符号出现在连接条件的左边时,此时是右连接。
更加详细的解释见Oracle(+)号用法
不过需要注意的是,oracle中才有这种语法。mysql中是没有的,只能乖乖的写join了。