SQL函数学习

[TOC]

函数

  1. 函数都有返回值–有几个数据返回几个值(分组函数除外)

  2. 函数都带括号

  3. 函数类型:

    数值型函数
    字符型函数
    日期型函数
    分组函数(聚合函数) 一组数据返回一个值

数值型函数

1.取绝对值 abs(数值)

不论正数负数,返还的值都是正数,0返还0,空值返还空值

1
2
3
4
5
6
7
select abs(123) from dual;--返回123
select abs(-123) from dual;--返回123
select abs(0) from dual;--返回0
select abs(comm) from emp;--返回空值

select abs(1.23) from dual;--返回1.23
select abs(-1.23) from dual;--返回1.23

2.判断正负值 sign(数值)

正数返回1,负数返回-1,0返还0,空值返还空值

1
2
3
4
5
6
7
select sign(123) from dual;--返回1
select sign(-123) from dual;--返回-1
select sign(0) from dual;--返回0
select sign(comm) from emp;--返回空值

select sign(1.23) from dual;--返回1
select sign(-1.23) from dual;--返回-1

3.取整 ceil(数值)——向上取整 floor(数值)——向下取整

向上取整:只要小数点后面有值,不论大小都进一
向下取整:舍弃小数点后的内容

1
2
3
4
5
select ceil(123.156) from dual;--返回124
select ceil(123.956) from dual;--返回124

select floor(123.156) from dual;--返回123
select floor(123.956) from dual;--返回123

4.求余数(取余) mod(x,y) –x被除数 y除数

x / y = 商……余数–要的就是这个余数
–余数种类跟除数大小一致

1
2
3
4
5
6
7
8
9
10
11
12
13
select mod(10,3) from dual;
select mod(9,3) from dual;

select mod(0,4) from dual;--0
select mod(1,4) from dual;--1
select mod(2,4) from dual;--2
select mod(3,4) from dual;--3
select mod(4,4) from dual;--0
select mod(5,4) from dual;--1
select mod(6,4) from dual;--2
select mod(7,4) from dual;--3
select mod(8,4) from dual;--0
-- 除数为4,余数种类为0,1,2,3

5.四舍五入 round(数值,精度) –精度为精确程度

按照精度对数值进行四舍五入

1
2
3
4
5
6
7
8
9
10
11
12
select round(123.156) from dual;
select round(123.956) from dual;--精度不写时,精确到个位

select round(123.456,2) from dual;
select round(123.456,1) from dual;--精度为正数时,精确到小数点后几位
select round(123.456,-2) from dual;
select round(123.456,-1) from dual;--精度为负数时,精确到小数点前几位

select round(123.456,10) from dual;--没有到达指定精度时,不会补充0

select round(123.456,2.2) from dual;
select round(123.456,2.9) from dual;--精度写小数不会报错,但精度的小数位不会被识别

6.截断函数 trunc(数值,精度)

按照精度对数值进行截断操作(舍弃精度后的值)

1
2
3
4
5
6
7
8
9
10
11
12
13
select trunc(123.156) from dual;
select trunc(123.956) from dual;--精度不写时,精确到个位


select trunc(123.156,2) from dual;
select trunc(123.156,1) from dual;--精度为正数时,精确到小数点后几位
select trunc(123.956,-2) from dual;
select trunc(123.156,-1) from dual;--精度为负数时,精确到小数点前几位

select trunc(123.456,10) from dual;--没有到达指定精度时,不会补充0

select trunc(123.456,2.2) from dual;
select trunc(123.456,2.9) from dual;--精度写小数不会报错,但精度的小数位不会被识别

7.round / trunc 对日期的操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
select sysdate from dual;
select sysdate,round(sysdate),trunc(sysdate) from dual;
select sysdate,round(sysdate,'dd'),trunc(sysdate,'dd') from dual;--日期精度默认值位 'dd'

select sysdate,round(to_date('2022-05-12 11:59:59','yyyy-mm-dd hh24:mi:ss'),'dd') from dual;
select sysdate,round(to_date('2022-05-12 12:00:00','yyyy-mm-dd hh24:mi:ss'),'dd') from dual;
--精确到天,界限是12点整

select sysdate,round(sysdate,'day'),trunc(sysdate,'day') from dual;--day的单位为周
select sysdate,round(to_date('2022-05-11','yyyy-mm-dd'),'day') from dual;
select sysdate,round(to_date('2022-05-12','yyyy-mm-dd'),'day') from dual;
--在oracle中的日历,星期日为每周的第一天,星期六为每周的最后一天
--精确到周,界限为星期四

select sysdate,round(to_date('2022-05-15','yyyy-mm-dd'),'mm') from dual;
select sysdate,round(to_date('2022-05-16','yyyy-mm-dd'),'mm') from dual;
--精确到月,界限是16号(2月的界限也是16号)

select sysdate,round(to_date('2022-05-15','yyyy-mm-dd'),'q') from dual;
select sysdate,round(to_date('2022-05-16','yyyy-mm-dd'),'q') from dual;
--精确到季,界限是中间月份的16号(2月的界限也是16号)

select sysdate,round(to_date('2022-06-30','yyyy-mm-dd'),'yyyy') from dual;
select sysdate,round(to_date('2022-07-01','yyyy-mm-dd'),'yyyy') from dual;
--精确到年,界限是7月1日
1
2
3
4
5
6
查询员工的姓名与薪资,以员工XX的薪资是XX的形式输出
要求:岗位不为职员 且 姓名不少于三个字母(姓名第二位是L),或 薪资不少于1250 且 佣金不为空值。

select '员工'||ename||'的薪资是:'||sal from emp
where job != 'CLERK' and ename like '_L_%' or sal >= 1250 and comm is not null;

转换函数

一. oracle中的数据类型

1
2
3
4
5
6
7
8
9
10
11
12
字符型(字符串) 
varchar2(字节长度) --oracle中最常见
varchar(字节长度) --前两种是变长(长度不确定)
char(字节长度) --定长(长度为固定值)--用空间换取效率

数值型
number
number(数值长度)
number(数值长度,小数点后几位)---例:记成绩:number(3,1)

日期型
date

二. to_char()

函数–转成字符型

1.数值转字符

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
to_char(数值)--无指定格式转换
select to_char(empno) from emp;

to_char(数值,格式)--指定格式转换--必定生成一个空格
9--指转换为任意数值,数值位数不够时用空格填充
0--指转换为任意数值,数值位数不够时强制显示0


dual--临时表--0行0列的空表
select to_char(123456,'99999999') from dual;

select to_char(123456,'00000000') from dual;

select to_char(123456,'09090909') from dual;
select to_char(123456,'90909090') from dual;

位数不够时--数值不予显示,变为格式个数+1个#
select to_char(123456,'9999') from dual;

select to_char(123456,'0000') from dual;

带小数点时,格式也得带有小数点--小数点后面格式多,自动用0补充
select to_char(123.456,'9999.9999') from dual;

select to_char(123.456,'0000.0000') from dual;


格式小数点后位数不够时--自动四舍五入
select to_char(123.456,'9999.99') from dual;

select to_char(123.456,'0000.00') from dual;


-------千分位及货币符号
L--人民币¥--不区分大小写
$--美元
,--千位符--英文逗号
9一般用户货币
0一般用于编号

select to_char(8,'00') from dual;--学号之类的编号用0

select to_char(12345.67,'L99,999.99') from dual;--¥12,345.67
select to_char(12345.67,'99,999.99L') from dual;--12,345.67¥
select to_char(12345.67,'99,99L9.99') from dual;--报错,人民币符号只能放在最前面或最后面
select to_char(12345.67,'¥99,999.99') from dual;--报错,人民币符号是字母L

select to_char(12345.67,'$99,999.99') from dual;
select to_char(12345.67,'99,999.99$') from dual;
select to_char(12345.67,'99,99$9.99') from dual;--美元符只有放在最前面一种方式,书写位置在任何地方都可以

2.日期转字符

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
sysdate --系统时间,精确到秒
systimestamp --时间戳,精确到毫秒--自带时区

select sysdate from dual;
select systimestamp from dual;

select sysdate - hiredate from emp;--时间相减单位是--天


格式:yyyy-mm-dd hh24:mi:ss.ff6--ff3
年 月 日 24时 分 秒 毫秒 三位毫秒

select to_char(systimestamp,'yyyy-mm-dd hh24:mi:ss.ff6') from dual;

select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;

select to_char(sysdate,'yyyy-mm-dd') from dual;
select to_char(sysdate,'yyyy/mm/dd') from dual;
select to_char(sysdate,'yyyymmdd') from dual;


select to_char(sysdate,'yyyy') from dual;--2022
select to_char(sysdate,'yyy') from dual;--022
select to_char(sysdate,'yy') from dual;--22
select to_char(sysdate,'y') from dual;--2--年份的最后一位
select to_char(sysdate,'yyyyy') from dual;--2022+年份的最后一位

select to_char(sysdate,'mm') from dual;--05
select to_char(sysdate,'m') from dual;--报错,月份只能有两位

select to_char(sysdate,'dd') from dual;--06
select to_char(sysdate,'ddd') from dual;--188 一年中的第几t
select to_char(sysdate,'d') from dual;--日不是两位的话会输出奇怪的数值

select to_char(sysdate,'hh24') from dual;
select to_char(sysdate,'hh12') from dual;--hh12 分上午下午

select to_char(sysdate,'mi') from dual;
select to_char(sysdate,'mimi') from dual;
select to_char(sysdate,'ss') from dual;
select to_char(sysdate,'ssss') from dual;--成对输出,不成对报错

毫秒位数最少1位最多九位
select to_char(systimestamp,'ff3') from dual;--精确到3位
select to_char(systimestamp,'ff6') from dual;--精确到3位
select to_char(systimestamp,'ff9') from dual;--精确到3位,毫秒最多9位

q--季度
select to_char(sysdate,'q') from dual;--输出在今年的第几个季度

month--月--可以省略为mon
select to_char(sysdate,'month') from dual;--中文月份
select to_char(sysdate,'mon') from dual;--中文月份

w----本月第几周
ww---本年第几周
select to_char(sysdate,'w') from dual;--本月第几周
select to_char(sysdate,'ww') from dual;--本年第几周
select to_char(sysdate,'wwwww') from dual;--优先识别两个W,不够两个时W,才输出一个W

day--天--可以省略为dy
select to_char(sysdate,'day') from dual;--本周第几天
select to_char(sysdate,'dy') from dual;--本周第几天

3.10进制转16进制–X

1
2
3
4
select to_char(123456,'xxxxx') from dual;

位数不够时--数值不予显示,变为格式个数+1个#
select to_char(123456,'xxxx') from dual;

三. to_number

–转为数值型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
1.字符型转数值型--特点居右对其,开头不带0
select to_number('123456') from dual;

select to_number('0123456') from dual;


2.去掉千分位与货币符号
select to_number('123,456.78','999999.99') from dual;--格式不写千分位去掉千位符

select to_number('$123,456.78','$999999.99') from dual;--格式写上货币符号,去除货币符号

select to_number('¥123,456.78','L999999.99') from dual;--格式写上货币符号,去除货币符号
select to_number('¥123,456.78','999999.99L') from dual;--报错,人民币货币符号位置需统一

3.16进制转换为10进制--x
select to_number('1e240','xxxxxx') from dual;

四. to_date –转为日期型

1
2
3
4
5
6
7
8
select to_date('2022-05-06','yyyy-mm-dd') from dual;
select to_date('2022-5-6','yyyy-mm-dd') from dual;--单为月分或日可以写一位,但不推荐

select to_date('2022/5/6','yyyy-mm-dd') from dual;
select to_date('20220506','yyyy-mm-dd') from dual;

select to_date('20220506','yyyy/mm/dd') from dual;
select to_date('20220506','yyyymmdd') from dual;--前后带不带连接符号不影响转换

字符串函数

1.字符串跟 ascii 之间的转换

1
2
3
4
5
chr()  --数值转ASCII
ascii() --ASCII转数值

select chr(97) from dual;
select ascii('A') from dual;

2.连接符函数 concat(值1,值2) –连接符函数一次只能连接两个值

1
2
select ename||'的薪资为:'||sal from emp;
select concat(concat(ename,'的薪资为:'),sal) from emp;

3.大小写转换函数

1
2
3
4
5
6
7
8
upper()--小写转大写
lower()--大写转小写
initcap()--首字母大写

select 'qiankun',upper('qiankun'),lower('qiankun'),initcap('qiankun'),initcap('QIANKUN') from dual;

select initcap('a b c d e f g') from dual;
select initcap('qian kun') from dual;--空格隔开后会重新计算首字母
  1. 替换函数 replace(字符串,要被替换的字符,替换成什么)

–替换函数可以进行位数不对等的替换
–替换函数可以把符合条件的内容全部替换
–第三个参数不写可以用作删除

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
select replace('ABCDEF','C','Z') from dual;
select replace('ABCDEF','C','z') from dual;

select replace('ABCDEFCCC','c','Z') from dual;--字符串中没有小写c,所以没法替换
select replace('ABCDEFCCC','AC','ZX') from dual;--字符串中没有连续的AC,所以没法替换

select replace('ABCDEF','AB','Z') from dual;--可以多换少
select replace('ABCDEF','A','ZX') from dual;--可以少换多

select replace('ABCDEFAAA','A','ZX') from dual;--符合条件的内容会全部替换

select replace('ABCDEFAAA','A','') from dual;
select replace('ABCDEFAAA','A') from dual;--会删除符合条件的内容

思考题:
把emp表中ename列首字母的A的替换为‘K’
select replace(ename,'A','k') from emp;--错误,所有a都会被替换
select upper(replace(initcap(ename),'A','K')) from emp;

5.去除函数

运行原理:先去除第一个字符,第一个字符不满足时去除第二个字符,依次循环,直到全部字符不满足条件为止。
–满足条件的部分全部去除
–要被去除的字符如果省略,默认去除空格

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
trim(要被去除的内容 from 字符串)--去除两边的字符
ltrim(字符串,要被去除的内容)--去除左边的字符
rtrim(字符串,要被去除的内容)--去除右边的字符

select trim('A' from 'ABCDEFAAA') from dual;--大哥只能去一个字符
select ltrim('ABCDEFAAA','A') from dual;
select rtrim('ABCDEFAAA','A') from dual;

select ltrim('ABCDEFABAA','AB') from dual;--小弟可以去多个字符
select ltrim('ABACAAACBCDEFAAA','ABC') from dual;--去除多个字符时,满足任意一个字符都会去除
select ltrim('ABCACDAAACBCDEFAAA','ABC') from dual;
--遇到不满足的字符时,停止去除,即使后面再有满足条件的字符也不会继续去除

select trim(' ABC DEF ') from dual;--去除两边的空格
select ltrim(' ABC DEF ') from dual;--去除左边的空格
select rtrim(' ABC DEF ') from dual;--去除右边的空格

思考题
如何去除中间的空格?
select replace('ABC DEF',' ') from dual;

6.截取函数 substr(字符串,开始位置,截取长度)

–固定从左往右截取,长度不足时输出全部
–截取长度不能小于1,不能为负数(不会报错,输出空值)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
select substr('ABCDEFGHRJK',1,4) from dual;
select substr('ABCDEFGHRJK',4,4) from dual;
select substr('ABCDEFGHRJK',0,4) from dual;--开始位置的0被视作1
select substr('ABCDEFGHRJK',4,0) from dual;--截取长度不能小于1

select substr('ABCDEFGHRJK',4,20) from dual;--截取长度过长时,输出全部,不会补充空格

select substr('ABCDEFGHRJK',-4,4) from dual;--开始位置为负数时,从右往左数

select substr('ABCDEFGHRJK',-4,-4) from dual;--截取长度不能为负数

select substr('ABCDEFGHRJK',-2,4) from dual;--输出‘JK’

select substr('ABCDEFGHRJK',2) from dual;--如果少些一个参数,默认省略截取长度,从开始位置截取到最后

select substr(ename,2,3) from emp;

思考题:
1.用截取函数查找名字中最后两位是'TT'的员工信息
select * from emp where ename like '%TT';

2.用截取函数,把名字中首字母为'A'的替换为'K'

7.填充函数 pad –填充时,一个汉字算作两个长度

lpad(字符串,填充后的总长度,填充内容)
rpad(字符串,填充后的总长度,填充内容)

1
2
3
4
5
6
7
8
9
10
select lpad('ABCD',10,'Q'),rpad('ABCD',10,'Q') from dual;
select lpad('ABCD',10,'*'),rpad('ABCD',10,'%') from dual;--可以填充特殊符号

select lpad('ABCDEFG',5,'Q'),rpad('ABCDEFG',5,'Q') from dual;--长度小于字符串本身时,从左至右输出指定长度

select lpad('ABCD',10,'乾坤'),rpad('ABCD',10,'邵乾坤') from dual;--填充内容循环填充,直到达到指定长度
select lpad('ABCD',9,'乾坤'),rpad('ABCD',9,'邵乾坤') from dual;
--填充汉字占多个字节,如果只差一个字节时,会先填入一个空格,在填入内容

select lpad('ABCD',10),rpad('ABCD',10) from dual;--不写填充内容时,默认填充空格

8.测量长度

1
2
3
4
5
6
7
8
9
length(字符串)--测量字符串长度
lengthb(字符串)--测量字节长度
字符集—— utf-8 国际通用
--一个数字或字母占一个字节
--汉字根据字符集的不同,一个汉字占2个或3个字节

select length('shaoqiankun'),lengthb('shaoqiankun') from dual;
select length('123456'),lengthb('123456') from dual;
select length('邵乾坤'),lengthb('邵乾坤') from dual;

9.查找位置 instr(字符串,要查找的字符,从第几个字符开始查找,在字符串中出现的次数)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
select instr('ABCDFGAADD','D',4,1) from dual;--4
select instr('ABCDFGAADD','D',4,2) from dual;--9
select instr('ABCDFGAADD','D',5,2) from dual;--10--从第五个数开始查找,跳过了字符串中第一个D
--开始位置如果正好是要查找的字符,也算出现一次。
--不论从第几个字符开始查找,输出的结果都是从第一字符开始数
--查找位置之前的字符不会算次数。
select instr('ABCDFGAADD','C',1,2) from dual;
select instr('ABCDFGAADD','C',5,1) from dual;--如果按照要求找不到要查找的字符,输出0

select instr('ABCDFGAADD','D',2) from dual;--少写一个参数时,默认出现次数为1次
select instr('ABCDFGAADD','D') from dual;--少写两个参数时,默认从第1个字符开始查找,出现次数为1次

select instr('ABCDFGAADD','D',-2,2) from dual;--从右往左找,找到位置后从左往右计算位置
select instr('ABCDFGAADD','D',-2,-2) from dual;--报错,出现次数只能 >= 1

select instr('ABCDFGAADD','DFG',4,1) from dual;--如果要查找的字符为多为时,按照首字母位置输出

select instr('ABCDFGAADD','DFG',4,2) from dual;
select instr('ABCDFGAADD','DEFG',4,1) from dual;--如果要查找的字符为多位,且不存在时,输出0

select instr('ABCDF+- %GAADD','D',4,2) from dual;--特殊符号算一位
select instr('ABCDF乾坤GAADD','D',4,2) from dual;--汉字算一位

思考题
1.email:zhangsan@qq.com 我们不知道@前面有几位,输出@前面的内容--多想几种方法
SELECT REPLACE('zhangsan@qq.com','@qq.com') FROM DUAL;
SELECT RTRIM('zhangsan@qq.com','@qq.com') FROM DUAL;
SELECT SUBSTR('zhangsan@qq.com','1',LENGTH('zhangsan@qq.com')-7) FROM DUAL;

2.email:zhangsan@qq.com 我们不知道@前后有什么,输出@前面的内容

日期型函数

1
2
3
4
sysdate
systimestamp

select sysdate - hiredate from emp;--对日期进行加减,返还值是天数(数值)

1.months_between(日期1,日期2) 求两个日期相差几个月

1
2
3
4
5
6
7
8
9
select months_between(sysdate,hiredate) from emp;
select months_between(hiredate,sysdate) from emp;

select months_between(to_date('2022-5-28','yyyy-mm-dd'),to_date('2022-2-28','yyyy-mm-dd')) 月份差 from dual;
--月份不一致,天一致可以得到整数
select months_between(to_date('2022-5-31','yyyy-mm-dd'),to_date('2022-2-28','yyyy-mm-dd')) 月份差 from dual;
--月底减月底可以得到整数
select months_between(to_date('2022-5-29','yyyy-mm-dd'),to_date('2022-2-28','yyyy-mm-dd')) 月份差 from dual;
--计算小数的方法: 多出来的天数/31

2.last_day() 本月的最后一天

1
2
3
4
5
6
select last_day(sysdate) from dual;
select last_day(to_date('2022-5-11','yyyy-mm-dd')) from dual;

思考题
求五月的第一天
select last_day(to_date('2022-4-11','yyyy-mm-dd'))+1 from dual;

3.add_months(日期,n) –在日期的基础上增加 N个月

1
2
3
4
select add_months(sysdate,3) from dual;
select add_months(sysdate,-3) from dual;

select add_months(sysdate,3.1415926) from dual;--小数位无意义

4.next_day(日期,’星期日~六’) 下一个周几–不是下一个周的周几

–在计算机中,周日为每周的第一天

1
2
3
4
5
6
7
8
9
10
11
select next_day(to_date('2022-5-11','yyyy-mm-dd'),'星期三') from dual;--5月18
select next_day(to_date('2022-5-11','yyyy-mm-dd'),'星期一') from dual;--5月16
select next_day(to_date('2022-5-11','yyyy-mm-dd'),'星期四') from dual;--5月12

思考题
给你任意一个日期,输出那个周的周四

select next_day(trunc(to_date('2022-5-14','yyyy-mm-dd'),'day'),'星期四') from dual;

给你任意一个日期,输出那个周的周日
select trunc(to_date('2022-5-14','yyyy-mm-dd'),'day') from dual;

case when

注意点:

  1. 一个case when 语句-始于case ,终于 end,整个语句相当于一个字段
  2. 相当于给表加入了一个没有的列
  3. 输出值格式要保持一致
  4. 输出值可以进行加减,连接符之类的操作
  5. case when 语句 的输出值数据类型必须保持一致
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
case when 条件 then 输出值
when 条件 then 输出值
else 输出值--不是必须存在的
end

case when 条件 then 输出值 when 条件 then 输出值 else 输出值 end

select '乾坤',deptno from emp;
select ename,case when deptno = 10 then '十号部门'
when deptno = 20 then '二十号部门'
else '三十号部门'
end 部门编号,deptno from emp;

select ename,case when deptno = 10 then '十号部门' when deptno = 20 then '二十号部门'
else '三十号部门' end 部门编号,deptno from emp;


select case when sal > 3000 then '土豪'
when sal between 2000 and 3000 then '有钱人'
when sal between 1000 and 1999 then '没钱人'
when sal < 1000 then '土鳖'
end 阶级歧视,ename from emp;


思考题

1.查询员工姓名,薪资,奖金
要求:有奖金的显示奖金,无佣金的显示‘无奖金’
SELECT ENAME,SAL,COMM,CASE WHEN COMM IS NOT NULL THEN COMM
WHEN COMM IS NULL THEN '无佣金'
END 奖金 FROM EMP;--报错,结数据类型不一致
SELECT ENAME,SAL,COMM,CASE WHEN COMM IS NOT NULL THEN TO_CHAR(COMM)
WHEN COMM IS NULL THEN '无佣金'
END 奖金 FROM EMP;

select * from emp;

2.查询员工姓名,薪资,调整后的薪资(起别名为年终奖)
要求:职位为办事员,薪资+300 ,职位为经理,薪资+500 , 职位为 总经理,薪资+10% ,其他的薪资+400
select ename,sal,case when job='CLERK' THEN SAL+300
WHEN JOB='MANAGER' THEN SAL+500
WHEN JOB='PRESIDENT' THEN SAL*1.1
ELSE SAL+400
end 年终奖 from emp;

3.查询员工 薪资
--输出结果为一列
--'xx号部门'为中文
要求:薪资列输出格式为:ENAME在'xx号部门',薪资为:SAL

聚组函数

特点:

  1. 不能与其他字段连用(除非有分组语句)
  2. count(1) 和 count(*)效果相同
  3. 空值不参与统计
  4. 每个分组返还一个值

注意点:

聚组函数不能放在where后面

MAX()最大值

1
select max(sal) from emp; 

MIN()最小值

1
select min(sal) from emp;

SUM()求和

1
select sum(sal) from emp;

AVG()平均值

1
select avg(sal) from emp;

COUNT(字段)计数

1
2
select count(sal) from emp;
--仅仅计算该字段的个数,不计算空值

COUNT(*或1)计数

1
select count(*) from emp;