Oracle —— 操作符|SQL函数
一、SQL操作符
- 算术运算符
- 比较运算符
- 逻辑运算符
- 集合运算符
- 连接操作符
1. 算术操作符
\(+\)、\(-\)、\(\times\)、\(\div\)
- 检索出课程号是2的成绩+10分后的结果
select sid 学号,cid 课程号,score+10 加10分后的成绩 from t_score where cid=2;
- 把课程号是2的学生成绩都加10分
update t_score set score=score+10 where cid=2;
select * from t_score where cid=2;
2.比较操作符
-
> -
< -
>= -
<= -
!=(<>) -
like -
in -
not in -
between ...and.. -
is null -
检索1980年前出生的学生信息
select * from t_student where sbirthday<'1-1月-1980';
- 检索1986年出生的学生信息
select * from t_student where sbirthday
between '1-1月-1986' and '31-12月-1986';
- 检索班级是1班或者2班的学生信息
select * from t_student where sclass in(1,2);
- 检索不是2班的学生信息
select * from t_student where sclass !=2;
select * from t_student where sclass <>2;
- 检索学生表中没有电话号的学生信息
select * from t_student where stel is null;
3.逻辑操作符
-
not -
and -
or -
检索班级是1班和2班的女生
select * from t_student where sclass=1 or sclass=2;
+ 检索班级是1班的女生
```sql
select * from t_student where sclass=1 and ssex='f';
4.连接操作符 ||
select * from t_student;
--学号是sid的学生是sname,性别是sex
select '学号是'||sid||'的学生姓名是'||sname 学生信息 from t_student;
5.集合操作符
操作符的优先级:算术>连接||>比较>逻辑
- intersect 交
- minus 差
- union 并
--统计学习操作系统(1)或数据结构(2)的同学学号
----选修了第一门课的学生信息
select sid from t_score where cid=1;
----选修了第二门课的学生信息
select sid from t_score where cid=2;
insert into t_score values('10005',2,98);
--把两张表包含的记录进行显示,公共的部分删掉
select sid from t_score where cid=1
union
select sid from t_score where cid=2;
---显示两张表中的全部记录,重复的也显示
select sid from t_score where cid=1
union all
select sid from t_score where cid=2;
--统计操作系统(1)和数据结构(2)都为及格(60分以上)的同学学号
select sid from t_score where cid=1 and score>=60
intersect
select sid from t_score where cid=2 and score>=60;
---intersect,显示两张表的公共部分
--统计操作系统(1)达到70分但数据结构(2)未达到65的同学学号
select sid from t_score where cid=1 and score>70
minus
select sid from t_score where cid=2 and score>=65;
--minus:表1的查询结果-表2的查询结果,显示剩下的内容
二、SQL函数
1.单行函数
(1)字符函数
select initcap('hello') from dual;---首字母大写
select lower('FUN') from dual;---小写
select upper('sun') from dual;----大写
---清除左边/右边的空格或者内容
select ' abc ' from dual;
select trim(' abc ') from dual;
select '>>>'||trim(' abc ')||'<<<' from dual;
select '>>>'||ltrim(' abc ')||'<<<' from dual;
select'>>>'||rtrim(' abc ')||'<<<' from dual;
select ltrim( 'xyzadams','xyza') from dual;
select rtrim('xyzadams','ams') from dual;
---替换函数:translate,replace
--逐一替换:h--a,e--b,l--c
select translate('helloworld','hel','abc') from dual;
--整体替换:把hel换成abc
select replace('helloworld','hel','abc') from dual;
--第二个字符在字符串中第一次出现的位置,位置从1开始
select instr ('worldwide','d') from dual;
--从原来的字符串中提取子串,从第三个位置开始,提取2个长度的字符串
select substr('abcdefg',3,2) from dual;
--把字符串进行连接
select concat ('Hello','world') from dual;
--显示数字对应的ascii码
select chr(97) from dual;
select chr(65) from dual;
---补位函数
select lpad('hello',10,'b') "左补齐" from dual;
select rpad('hello',10,'b') "右补齐" from dual;
---以上,知道查询结果是什么即可
---查询t_student表,把性别为f的显示为女生,性别为m的显示为男生
select * from t_student;
select sid 学号,sname 姓名,ssex 性别 from t_student;
select sid 学号,sname 姓名,decode(ssex,'f','女','m','男')
性别 from t_student;
---每个值去比较然后进行值的替换。
decode(列名,值1,替换,值2,替换,值3,替换……)
--trunc截取:把数值取整
decode(trunc(score/10),'10','优秀','9','优秀','8','良好','7','中等',
'6','及格','5','不及格')---替换上表中的score
select sid,cid,decode(trunc(score/10),'10','优秀','9','优秀','8','良好','7','中等','6','及格','5','不及格') from t_score;
------查询优良中差2:switch case语句实现:case when then..end
select sid,cid,score from t_score;
select sid,cid, case
when score>=90 then '优秀'
when score>=80 then '良好'
when score>=70 then '中等'
when score>=60 then '及格'
else '不及格'
end 成绩
from t_score;
(2)数学函数
select abs(-15) from dual; --绝对值
---取整函数
select ceil(100.8) from dual; --取比当前值大的最小整数
select floor(100.8) from dual;--取比当前值小的最大整数
select round(100.8) from dual;---四舍五入
select round(100.256,2) from dual; ---按小数精度取整
select cos(180) from dual; --余弦
select power(4,2) from dual; --求a的b次方
select mod(10,3) from dual; --求模
select sqrt(4) from dual; --开方
select sign(-30) from dual;--符号函数:负数是-1,正数是1,0是0
(3)日期函数
select sysdate from dual;---查询当前系统时间
select sysdate+1 from dual;---查询第二天的日期
select sysdate-1 from dual;
select add_months(sysdate,1) from dual;--查询1个月后的日期
select add_months(sysdate,-1) from dual;---查询1个月前的日期
---比较第一个日期和第二个日期之间相差的月数
select months_between(sysdate,add_months(sysdate,-1))
from dual;
select months_between('1-1月-1970','20-1月-1971')
from dual;
---------------------------------
--日期加1年
select add_months(sysdate,12) from dual;
--日期加1个月
select add_months(sysdate,1) from dual;
--日期加1周
select sysdate+7 from dual;
--日期加1天
select sysdate+1 from dual;
--日期加1小时
select sysdate+1/24 from dual;
--日期加1分钟
select sysdate+1/24/60 from dual;
---日期加1秒
select sysdate+1/24/60/60 from dual;
--显示当前所在月的最后一天
select last_day(sysdate) from dual;
--显示下一个星期几
select next_day(sysdate,1) from dual;--1表示下一个星期天
select next_day(sysdate, '星期日') from dual;
select next_day(sysdate,7) from dual;
select next_day(sysdate,'星期六') from dual;
select next_day('5-12月-2020',7) from dual;
---日期的截取函数
trunc(具体日期,'年/月/季度')---截取当前日期所在年份/月份/季度的第一天
select trunc(sysdate,'year') from dual;
select trunc(sysdate,'y') from dual;
select trunc(sysdate,'month') from dual;
select trunc(sysdate,'q') from dual;
-----查询当前日期所在的年份,月份,日期
select extract(year from sysdate) from dual;
select extract(month from sysdate) from dual;
select extract(day from sysdate) from dual;
(4)转换函数
- 字符串转换成日期
to_date
select to_date('2020-07-28','yyyy/mm/dd') from dual;
- 日期转换成字符串
to_char
select to_char(sysdate,'yyyy-mm-dd') from dual;
select to_char(sysdate,'yyyy/mm/dd') from dual;
- 字符串转换成数值
to_number
select to_number('100') from dual;
- 其他函数(处理空值的函数)
nvl(列,exp)- 如果参数中的列为空就在查询中显示exp
nvl2(列,exp1,exp2)- 参数中的列的为空显示exp1,不空显示exp2
nullif(exp1,exp2)- 如果两个参数相等显示null,不等显示exp1
---如果两个参数值相同,显示null;否则显示第一个参数的值
select nullif(100,100) from dual;
select nullif(100,200) from dual;
---处理空值的函数
select empno,ename,sal,comm,sal+comm from emp;
--把某一列的空值变成0进行操作:nvl(comm,0)
select empno,ename,sal,comm,sal+nvl(comm,0) from emp;
--判断某一列的值,如果有值,用第二个参数替换;如果为null,替换成0
select empno,ename,sal,comm,sal+nvl2(comm,comm+100,0) from emp;
---单行函数:字符,数学,日期*,转换*,其他函数
2. 聚合函数
min(),max(),sum(),avg(),count()
select sum(score) from t_score group by sid;
3. 分析函数
row_number()......over(partition by 列1 order by 列2), 按照列1分组,按照列2排序- 生成一列连续序号,``order by```列的值相同的序号也不同
rank()......over(partition by 列1 order by 列2), 按照列1分组,按照列2排序- 生成一列可能不连续序号,``order by```列的值相同的序号相同
dense_rank()......over(partition by 列1 order by 列2), 按照列1分组,按照列2排序- 生成一列连续序号,``order by```列的值相同的序号相同
- 生成一列序号,序号连续,sal值相同序号也不相同
select row_number() over(order by sal desc),empno,ename,sal
from emp;
- 生成一列序号,序号可能不连续,sal值相同的序号相同
select rank() over(order by sal desc),empno,ename,sal
from emp;
- 生成一列序号,序号连续,sal值相同的序号相同
select dense_rank() over(order by sal desc),empno,ename,sal
from emp;
- 对表生成序号的时候,还可以按照一定的分组进行序号的生成
- 对整张表按照sal进行排序,生成一列序号
select row_number() over(order by sal),empno,ename,sal from emp;
- 组内进行排序和编号:可以按照部门编号分组
select row_number()
over(partition by deptno order by sal) 组内编号,
empno,ename,sal,deptno from emp;

浙公网安备 33010602011771号