一,知识点
DQL语句
用于查询表中数据
DQL必须包含两部分:SELECT子句,FROM子句
SELECT子句:指定要查询的内容,表中的具体字段,*号。函数。表达式
FROM子句:指定数据来源的表
--1
SELECT * FROM emp_liwc
SELECT job,sal,sal*12 FROM emp_liwc
--2
SDQ中所有WHERE子句添加条件
SELECT job,sal,sal*12 FROM emp_liwc WHERE sal>2000
--3
字符串函数
连接串c1,c2
SELECT CONCAT(CONCAT(ename,':'),sal) FROM emp_liwc
'||'作用同上
SELECT ename||':'||sal FROM emp_liwc
--4
LENGTH(C)查询指定字符串的长度
SELECT ename,LENGTH(ename)FROM emp_liwc
查询名字是6个字母的的员工
SELECT ename,sal,job FROM Temp_liwc WHERE LENGTH(ename)=6
UPPER(大写),LOWER(小写),INITCAP(首字母大写,字符串可以用空格分割多个单词
这样每个单词首字母都大写)
当查新数据不予任何表有关系时,
查询伪表:daul
SELECT UPPER('helloworle'),LOWER('HELLOWORLD'),INITCAP('hello world')FROM dual
SELECT ename,sal,job FROM emp_liwc WHERE ename = UPPER('scott')
--5
去两端
TRIM,LTRIM,RTRIN
截取集仅能有一个字符
SELECT TRIM('e' FROM 'eeeseeliwceesee')FROM dual
去掉多个字符中的两端所有相同(任意一个)
SELECT LTRIM('eeeseeliwceesee','eeee')FROM dual
SELECT RTRIM('eeeseeliwceesee','se')FROM dual
--6
补位函数
LPAD(c1,n,c2):将c1显示N位长度,不足c2左补全,超出c1左侧截取并返回
RPAD(c1,n,c2):将c1显示N位长度,不足c2右补全,超出c1左侧截取并返回
SELECT ename,LPAD(sal,6,'$')FROM emp_liwc
SELECT ename,RPAD(sal,3,'$')FROM emp_liwc
--7
SUBSTR(c,m[,n])
截取字符串c从第m个字符开始,连续截取n个字符
若n补指定则截取到末尾,n超过长度也是截取到末尾
数据库下标从1开始的
下标负数为Last
SELECT SUBSTR('thinking in java',10,2)FROM dual
SELECT SUBSTR('thinking in java',-7,2)FROM dual
--8
INSTR(char1,char2[,n[,m]])
查找char2在char1中的位置
从n开始,m次出现,不写为1
SELECT INSTR('thinking in java','in',4,1)FROM dual
--9
ROUND(n[,m])
对n进行四舍五入,保留小数点后m位
m可为负数
m不指定为0
SELECT ROUND(45.3652,3)FROM dual--45.365
SELECT ROUND(564.5264,0)FROM dual--566
SELECT ROUND(55.265,-1)FROM dual--60
--10
TRUNC(n,[,m])
参数与ROUND意义相同,区别于仅仅截取数字,不做四舍五入
SELECT TRUNC(45.3659,3)FROM dual--45.365
SELECT TRUNC(564.5264,0)FROM dual--564
SELECT TRUNC(55.265,-1)FROM dual--50
--11
MOD(m,n)
求余数规则为m除以n,若n为0直接返回m
SELECT ename,MOD(sal,1000)FROM emp_liwc
--12
CEIL,FLOOR
向上取整,向下取整
SELECT CEIL(45.678) FROM dual--46
SELECT FLOOR(45.678) FROM dual--45
--13
时间相关关键字
SYSDATE,SYSTIMESTAMP
他们对于ARACLE内部函数,返回当前系统时间
不同的是一个返回DATE ,一个返回时间戳类型
SELECT SYSTIMESTAMP FROM dual
--14
日期转换函数
1 TO_DATE()
将字符串按照指定格式转换为date类型
SELECT TO_DATE('2008-08-08 20:08:08','YYYY-MM-DD HH24:MI:SS')FROM dual
ORA-01821: 日期格式无法识别
SELECT TO_DATE('2008-08-08 20:08:08','YYYY年MM月DD日 HH24:MI:SS')FROM dual
日期格式字符串字母,数字外所有都要用双引号引用
SELECT TO_DATE('2008年08月08日','YYYY"年"MM"月"DD"日"')FROM dual
DATE类型数据可以进行计算
两个DATE进行加减结果为相差的天数
时间越晚,DATE就越大
查看每个员工入职多少天
SELECT ename,SYSDATE-hiredate FROM emp_liwc
SELECT SYSDATE-TO_DATE('1995-03-29 20:08:08','YYYY-MM-DD HH24:MI:SS') FROM dual
TO_CHAR()
可以将日期转换为字符串,可以讲其他类型转换为字符串,通常转换时间
SELECT TO_CHAR(SYSDATE,'YYYY-MM-DD HH24:MI:SS') FROM dual--2017-09-13 15:24:44
日期格式中YY,RR的区别
都表示年
TO_DATE中
解释为实际年时,对世纪的处理方式不同
yy是根据当前系统时间解释世纪的
rr根据世纪情况判断(表)
SELECT TO_CHAR(TO_DATE('95-03-29','YY-MM-DD'),'YYYY-MM-DD') FROM dual--2095-03-29
SELECT TO_CHAR(TO_DATE('95-03-29','RR-MM-DD'),'YYYY-MM-DD') FROM dual--1995-03-29
LAST_DAY(DATE):返回一个DATE表示月底日期
SELECT LAST_DAY(SYSDATE) FROM dual
查看每个员工入职所在月的最后一天
SELECT ename,LAST_DAY(hiredate) FROM emp_liwc
ADD_MONTHS(DATE,i)
增加指定月
负数为减去
查看员工入职20周年
SELECT ename,ADD_MONTHS(hiredate,20*12)FROM emp_liwc
MOMTHS_BETWEEN(date1,date2)
两个日期相差月
SELECT TRUNC(MONTHS_BETWEEN(SYSDATE,hiredate))FROM emp_liwc
NEXT_DAY(date,i)
返回给定日期第二天开始的一周之内的指定周几的日期
SELECT NEXT_DAY(SYSDATE,1)FROM dual--17-9月 -17
LEAST,GREATRST
求最大值,最小值,在日期中则是求最大日期,最小日期
SELECT GREATEST(SYSDATE,TO_DATE('2008-08-08','YYYY-MM-DD'))FROM dual
SELECT LEAST(SYSDATE,TO_DATE('2008-08-08','YYYY-MM-DD'))FROM dual
EXTAACT
提取指定日期对应的时间分量
SELECT EXTRACT(YEAR FROM SYSDATE)FROM dual
查看1982年入职的员工
SELECT ename,hiredate FROM emp_liwc WHERE EXTRACT(YEAR FROM hiredate)=1982
CREATE TABLE student_liwc
(id NUMBER(4),name CHAR(20),gander CHAR(1));
INSERT INTO student_liwc VALUES(1000,'李莫愁','F');
INSERT INTO student_liwc VALUES(1001,'林平之',NULL);
INSERT INTO student_liwc(id,name) VALUES(1002,'张无忌');
SELECT * FROM student_liwc
更新为null
UPDATE student_liwc SET gander = null WHERE ID = 1000
过滤条件为null
判断NULL需要使用IS NULL 或者IS NOT NULL
DELETE FROM student_liwc WHERE gander IS NULL
NULL运算
NULL与字符串拼接等于什么也没做
NULL进行数字运算结果为NULL
SELECT ename||NULL FROM emp_liwc
查看每个员工的收入绩效+工资
SELECT ename,sal,comm,sal+comm FROM emp_liwc
空值函数
NVL(a1,a2)
当a1为NULL时返回a2
当a1不为NULL时返回a1
将NULL替换为非空
SELECT ename,sal,comm,sal+NVL(comm,0) FROM emp_liwc
SELECT ename,sal,comm,sal+NVL2(comm,comm,0) FROM emp_liwc
NVL2(a1,a2,a3)
当a1为NULL时返回a3
当a1不为NULL时返回a2
查看绩效,有绩效显示“有绩效”没绩效的显示“没绩效”
SELECT ename,NVL2(comm,'有绩效','没绩效') FROM emp_liwc
二,例子
1:查询emp表中数据,列出一列,内容为名字与职位
显示格式:ename:job
SELECT CONCAT(CONCAT(ename,':'),JOB) FROM emp_liwc
SELECT ename||':'||job FROM emp_liwc
2:查看每个员工职位的字符个数
SELECT ename,LENGTH(JOB)FROM emp_liwc
3:将所有员工的名字以小写形式,与首字母大写形式
查询出来,第一列为小写形式,第二列为首字母大写
SELECT LOWER(ename),INITCAP(ename)FROM emp_liwc
4:将字符串'aaaaaabaaaaa'中左右两边的a去除
SELECT TRIM('a' FROM 'aaaaaabaaaaa') FROM dual
5:显示每个员工的名字,要求显示10位,第一列左对齐效果,第二列右对齐效果
SELECT RPAD(ename,10),LPAD(ename,10) FROM emp_liwc
6:截取字符串'DOCTOR WHO'中的'WHO'
SELECT SUBSTR('DOCTOR WHO',8,3) FROM dual
7:查看'DOCTOR WHO'中'WHO'的位置
8:分别查看55.789四舍五入保留小数点后2位,整数位,十位后的
数字,显示成三列。
SELECT ROUND(55.789,2),ROUND(55.789),ROUND(55.789,-1)FROM dual
9:分别查看55.789截取后保留小数点后2位,整数位,十位后的
数字,显示成三列。
SELECT TRUNC(55.789,2),TRUNC(55.789),TRUNC(55.789,-1)FROM dual
10:查看每名员工工资百位以下的数字?
SELECT ename,MOD(sal,100) FROM emp_liwc
11:查看每名员工从入职到今天一共多少天,若有小数则向上取整。
SELECT ename,CEIL(SYSDATE-hiredate)FROM emp_liwc
12:查看从2008-08-08号到今天为止一共经历了多少天?
SELECT SYSDATE-TO_DATE('2008-08-08','YYYY-MM-DD')FROM dual
13:将每名员工入职时间以例如:
1981年12月3日
的形式显示
SELECT ename,TO_CHAR(hiredate,'YYYY"年"MM"月"DD"日"') FROM emp_liwc
14:查看每个员工入职所在月的月底是哪天?
SELECT ename,LAST_DAY(hiredate)FROM emp_liwc
15:查看每名员工转正日期(入职后3个月)
SELECT ename,ADD_MONTHS(hiredate,3)FROM emp_liwc
16:查看每名员工入职至今共多少个月?
SELECT ename,TRUNC(MONTHS_BETWEEN(SYSDATE,hiredate))FROM emp_liwc
17:查看从明天开始一周内的周日是哪天?
SELECT NEXT_DAY(SYSDATE,1)FROM dual
18:查看82年以后入职的员工的入职日期,82年以前的按照
1982年01月01号显示。格式都是DD-MON-RR(默认格式)
SELECT GREATEST(hiredate,TO_DATE('1982年01月01日','YYYY"年"MM"月"DD"日"'))FROM emp_liwc
19:查看每名员工的入职年份?
SELECT ename,EXTRACT(YEAR FROM hiredate)FROM emp_liwc
20:显示每个员工的总收入(工资加奖金),奖金为NULL的只看工资
SELECT ename,sal+NVL(comm,0)FROM emp_liwc
21:使用NVL2实现20题的需求
SELECT ename,sal+NVL2(comm,comm,0)FROM emp_liwc