数据库基础知识
数据库(database)常用软件
数据库常用的软件:①MySQL ②SQL Server(写软件名时注意大小写) ③ACCESS ④DB2
四大关系型数据库
四大关系型数据库:①ORACLE ②MYSQL ③SQL Server ④DB2
数据库适用行业
①Oracle:金融、医疗、电信、政府、运营商。互联网核心数据,大型企业。凡是与钱财有关的都是用Oracle数据库,因为非常安全,就算是丢失数据也同样可以恢复。缺点是非常贵。
②MYSQL:互联网行业(不涉及到钱)。
③SQL Server: 中小企业、地方政府。只能跑在Windows上。
④DB2:较小型的银行(农信),IBM公司开发。
数据库管理系统DBMS(Database Management System)
Oracle是关系型数据库(RDBMS,relationship Database Management System)
关系型数据库:Oracle ,MySQL ,sqlServer,db
数据库起源及相关历史
创始人:拉里·艾里森、scott。
Oracle历史版本:8i; 9i; 10g; 11g; 12c; 18c;(i代表互联网,grid网格,cloud云计算)
Oracle公司有:Oracle mysql ebs(erp 软件) weblogic(中间件) Exadata(一体机)
C/S架构
客户/服务器模式,现在电脑安装的ORACLE既有客户端又有服务器。
本地连接
连接自己的机器。
远程连接
连接他人的机器。
网络
网络是由节点和连线构成,我们常见的有:局域网(单位是每台计算机)、广域网(单位是每个局域网)、互联网
域名
例子:www.baidu.com有助于对IP的记忆,baidu是父类,还有许多子域名:用DNS解析服务器实现域名和IP的转换。
端口号
通过“IP地址+端口号”来区 分不同的服务。端口号基本固定,
Oracle:1521、1522,tomcat:8080,mysql:3306
表和列的命名规则
只允许有字母,数字,下划线(尽量不要用数字开头,不要以中文命名。
表的命名方法:
①下划线命名法:关键词中间用下滑线进行连接 STU_INF
②驼峰命名法:StudentInfromation关键词首字母大写
常用的字符串类型
常用的字符串类型char(不写长度就是1) varchar(效率比char低点,但是节省时间) varchar2(Oracle特有,用这个)
监听
端口号1521,1521指的就是监听。
数据库对象
表,索引,视图,序列,存储过程,图表,缺省值,规则,触发器,用户,函数等。
Oracle DOS 登陆及相关命令
dir
显示目录,不再sql语句中不需要加;号。
sqlplus
一个数据库连接工具
SQL(Structured Query Language)
结构化查询语言
SQL是所有数据库的语言(四代语言)
有四类:
–DML(Data Manipulation Language)数据操作语言 只有这个可以提交回滚, INSERT, UPDATE , DELETE
— DDL (Data Definition Language)数据定义语言 TRUNCATE ALTER CREATE DROP
— DCL (Data Control Language)数据控制(控制权限)语言 提交,回滚GRANT (授予权限) , REVOKE (废除权限), COMMIT, ROLLBACK
— DQL (Data Query Language)数据查询语言 SELECT
— CCL (Common Command Language)通用命令语言 DECLARE , SET
普通用户登陆
sqlplus Scott/tiger
管理员身份登陆
sys(超级管理员)和system(普通管理员)。
Sqlplus sys/orcl as sysdba
当是win7或linux系统时 Sqlplus sdfsd/sdfsd(随便写) as sysdba(特殊写法) 登陆进去的用户都是sys,因为DOS就是计算机的管理员,数据库就认为他有权限管理,所以可以直接登录sys。Win10和win8因为权限问题不能执行此操作。
远程连接他人数据库
scott/tiger@(连接)IP:1521(端口号)/orcl(用到了哪个数据库)
show user
查看当前用户
更改日期格式
ALTER SESSION SET NLS_DATE_FORMAT=‘YYYY/MM/DD HH24MISS’(DOS中更改日期格式)
FDIT+/打开记事本
写好命令后保存,中间不用加;以/结尾。返回DOS窗口/运行。
lsnrctl status
查看监听状态,当数据库连接不上时,可以用这条命令,查看监听
lsnrctl stop 关闭监听,远程连接不能连接了。
lsnrctl start
sqlplus 不走监听。
DESC tablename
查看表结构
Oracle数据库查询操作
查询框架
SELECT 想显示什么就写什么(建议写具体列名,写*会跑字典)后面不建议放子查询
FROM 数据来源(表 视图 子查询à内联视图【子查询是表的】)
WHERE 过滤条件,关联条件 在条件当中尽量不要发生隐式转换
and or not 多用()
not in 少使用,使用not exists来代替
like 尽量不要用%或_开头,如果用了只能全表扫描,如果非要使用,那就尽量用instr()来代替。
尽量避免select后面有算术运算或函数
2.关联条件
(+)左外,右外,全外
GROUP BY
HAVING
ORDER BY asc desc(还可以查看表结构)
查询语句先执行from 然后执行where过滤条件,第三进行分组,第四个HAVING,SELECT永远是倒数第二个,ORDER BY永远是最后一个。
行列关系
数据库中列构成了行,select 查找列,where查找行。列的值严格区分大小写。
运算符与字符
① * 通配符
② != 和 <> 不等于
③ And 与,两条件同时为true是才为true
例:–查询出员工编号大于7369且小于7788的员工姓名
SELECT ENAME FROM EMP WHERE EMPNO >7369 AND EMPNO <7788;
④ not 非,not正规用法:not+条件
例:–查询出员工编号不为7788和7369的员工姓名
SELECT ENAME FROM EMP WHERE EMPNO NOT IN (7369,7788);
⑤ or 或,两个条件有一个为true结果为true
例:–查询出员工编号为7788和7369的员工姓名
SELECT ENAME FROM EMP WHERE EMPNO=7788 OR EMPNO=7369;
SELECT ENAME FROM EMP WHERE EMPNO IN (7369,7788);
⑥ _ 任意一个字符,必须有一个字符。
⑦ % 没有或任意多个字符 Oracle中没有中文的标点和运算符。
DISTINCT (去重)
例:–查询出公司有的职位
SELECT DISTINCT JOB FROM EMP;
DISTINCT 只能出现一次,而且只能在最前面,是对后面的整体去重。去重意味着排序,大结果集的排序很危险。
例:–查询出公司有的部门,职位
SELECT DISTINCT DEPTNO,JOB FROM EMP;
BETWEEN…AND (在…之间)
例:–查询出员工编号在7788和7369之间的员工姓名
SELECT ENAME FROM EMP WHERE EMPNO BETWEEN 7369 AND 7788;
in(在…之间)
例:–查询出员工编号为7788和7369的员工姓名
SELECT ENAME FROM EMP WHERE EMPNO IN (7369,7788);
exists(存在)
exists (sql 返回结果集为真)
not exists (sql 不返回结果集为真)
–EXISTS 通常和相关子查询连用 ,这里的x写什么都可以,()里的子查询和前面的匹配会返回true或false, true的候选行留下
–找出所有领导信息
SELECT * FROM EMP E WHERE EXISTS (SELECT 'X' FROM EMP M WHERE E.EMPNO=M.MGR)
SELECT DISTINCT E1.* FROM EMP E1,EMP E2 WHERE E1.EMPNO=E2.MGR
什么时候用EXISTS 什么时候用 IN ?
外小内大用exists,外大内小用in
NULL(空值)
例:–查询佣金不为空的员工姓名和佣金
SELECT ENAME,COMM FROM EMP WHERE COMM IS NOT NULL;
而NULL = NULL和NULL <> NULL其实返回的都是 FALSE,任何值和NULL做运算的结果都是false。
字符串查询
查询内容为字符串时,区分大小写还要加上’’。
例:–查询出员工姓名为Smith的人的员工编号
SELECT EMPNO FROM EMP WHERE ENAME='SMITH';
like (模糊查询)
例:–找出员工姓名中倒数第二位含有’t’的人的员工姓名及员工编号
SELECT ENAME,EMPNO FROM EMP WHERE ENAME LIKE '%T_';
转义 ESCAPE ‘/(可以是任何字符)’:将’/’字符后的一个符号进行转义,逃出原来含义。
例:–将emp表中姓名中含有_的数据找出来 转义
SELECT * FROM EMP WHERE ENAME LIKE '%|_%' ESCAPE '|'
DUAL伪表
虚拟的一个空间,只能查询一个固定的值。所有的表里都没有的数据可以尝试在这里找。
order by (排序)
ASC升序,默认也为升序。DESC 降序排列。空值排到最后(nulls last)
也可以用1,2分别代表第一个字段和第二个字段
例:–查询出工资,按照降序排序,若工资相等,按照员工编号排序
SELECT SAL,EMPNO FROM EMP ORDER BY SAL DESC,EMPNO ASC;
GROUP BY (分组)
–根据部门编号和职位进行分组,查询出每个部门的部门编号。
SELECT DEPTNO,JOB FROM EMP GROUP BY DEPTNO,JOB;
HAVING(对条件进行过滤)
–HAVING 对条件进行过滤,分组之后的数据进行过滤。
–查询出各部门人数,总工资并且只显示总工资超10000的部门
SELECT COUNT(EMPNO),SUM(SAL),DEPTNO FROM EMP GROUP BY DEPTNO HAVING SUM(SAL)>10000;
多表关联查询
–笛卡尔积,属于交叉连接,实际生产中严禁笛卡尔积的出现,两张表关联千万不能忘记关联条件。
关联条件就有点像笛卡尔积的筛选条件
–n张表关联至少需要n-1个关联条件。
内链接
只能取出两个表能够互相关联到的数据。
例1:–查询员工编号,员工姓名,部门编号,部门名称
SELECT E.EMPNO,E.ENAME,E.DEPTNO,D.DNAME FROM EMP E,DEPT D WHERE E.DEPTNO=D.DEPTNO
①等值连接
例–查询员工编号,员工姓名,部门编号,部门位置
–不加where就有60条数据,没有指定表格的记录
SELECT E.EMPNO,E.ENAME,E.DEPTNO,D.LOC FROM EMP E,DEPT D WHERE E.DEPTNO=D.DEPTNO;
②不等值连接
例2:–查询出员工编号,员工姓名,工资,工资等级
SELECT E.EMPNO,E.ENAME,E.SAL,S.GRADE FROM EMP E,SALGRADE S WHERE E.SAL <S.HISAL AND E.SAL>S.LOSAL
SELECT E.EMPNO,E.ENAME,E.SAL,S.GRADE FROM EMP E,SALGRADE S WHERE E.SAL BETWEEN S.LOSAL AND S.HISAL;
③自连接(特殊)
例3:–查询出员工姓名,员工编号,领导姓名,领导编号(自连接,可以属于内链接也可能是外连接)
SELECT E.ENAME,E.EMPNO MGRNO,M.ENAME MNAME,M.EMPNO FROM EMP E,EMP M WHERE E.MGR=M.EMPNO;
例4:–查询出员工编号,员工姓名,部门编号,部门名称,工资等级,领导姓名。
SELECT E.EMPNO,E.ENAME,E.DEPTNO,D.DNAME,E.SAL,S.GRADE,M.ENAME
FROM EMP E,DEPT D,SALGRADE S,EMP M
WHERE E.DEPTNO=D.DEPTNO AND E.MGR=M.EMPNO AND E.SAL BETWEEN LOSAL AND HISAL;
–查询出员工编号,员工姓名,部门编号,部门名称(通用SQL)
SELECT E.EMPNO,E.ENAME,E.DEPTNO,D.DNAME
FROM EMP E JOIN DEPT D ON E.DEPTNO=D.DEPTNO;
④ NATURAL JOIN (自然连接)
自动找两个表的关联关系
–查询出员工编号,员工姓名,部门编号,部门名称
SELECT * FROM EMP NATURAL JOIN DEPT;
外连接
取某表的所有数据。
(+)是只有Oracle中独有的写法
①左外连接E.DEPTNO=D.DEPTNO(+);
就相当于+号增加了虚拟的数据去和主表连接
SELECT EMP.EMPNO,EMP.ENAME,DEPT.DEPTNO,DEPT.DNAME
FROM EMP LEFT JOIN DEPT ON EMP.DEPTNO=DEPT.DEPTNO;(EMP为主表)
②右外连接E.DEPTNO(+)=D.DEPTNO;
例:–查询出员工编号,员工姓名,部门编号,部门名称,要求没有人的部门也要显示
SELECT E.EMPNO,E.ENAME,D.DEPTNO,D.DNAME
FROM EMP E,DEPT D
WHERE E.DEPTNO(+)=D.DEPTNO; (右外连接,表示以等号右边的表为主表,不管是否关联上的数据,都要显示)
SELECT EMP.EMPNO,EMP.ENAME,DEPT.DEPTNO,DEPT.DNAME
FROM EMP RIGHT JOIN DEPT ON EMP.DEPTNO=DEPT.DEPTNO;(DEPT为主表)
③全外连接(只能用通用SQL)
SELECT EMP.EMPNO,EMP.ENAME,DEPT.DEPTNO,DEPT.DNAME FROM EMP FULL JOIN DEPT ON EMP.DEPTNO=DEPT.DEPTNO;
子查询
子查询没有固定放的位置,如果查询出一个值,那就放在一个值该放的位置,如果是一个表,就放在表应该放的位置。
子查询是一个值的查询案例
例1:–查询出工资比7788高的人
SELECT ENAME,SAL FROM EMP WHERE SAL>(SELECT SAL FROM EMP WHERE EMPNO=7788);
例2:–查询出和7788在同一个部门的人
SELECT ENAME,DEPTNO FROM EMP WHERE DEPTNO=(SELECT DEPTNO FROM EMP WHERE EMPNO=7788);
例3:–查询出和7788及7654相同部门的人的信息
SELECT * FROM EMP WHERE DEPTNO IN (SELECT DEPTNO FROM EMP WHERE EMPNO=7788 OR EMPNO=7654);
如果后面的子查询有空值,那么就无效了,需要给空值一个不可能的值。
SELECT * FROM EMP WHERE DEPTNO=(SELECT DEPTNO FROM EMP WHERE EMPNO=7788) OR DEPTNO=(SELECT DEPTNO FROM EMP WHERE EMPNO=7654);
例4:–查询出部门位置在纽约的人
SELECT ENAME FROM EMP WHERE DEPTNO=(SELECT DEPTNO FROM DEPT WHERE LOC='NEW YORK');
SELECT ENAME,LOC FROM EMP E,DEPT D WHERE E.DEPTNO=D.DEPTNO AND D.LOC='NEW YORK';
例5:–查询出和KING同一年入职的人
SELECT ENAME FROM EMP WHERE TO_CHAR(HIREDATE,'YYYY')=(SELECT TO_CHAR(HIREDATE,'YYYY') FROM EMP WHERE ENAME='KING');
例6:–查询出薪水大于7788的人
SELECT ENAME,SAL FROM EMP WHERE SAL>(SELECT SAL FROM EMP WHERE EMPNO=7788);
子查询是一个表的查询案例
内联视图
例1:–查询出员工编号,员工姓名,部门编号,部门人数,
SELECT E.EMPNO,E.ENAME,E.DEPTNO,D.CN
FROM EMP E,(SELECT DEPTNO,COUNT(*) CN FROM EMP GROUP BY DEPTNO) D
WHERE E.DEPTNO=D.DEPTNO;
例2–查询出员工姓名,员工编号,职位,以及这个职位有多少人
SELECT E.ENAME,E.EMPNO,E.JOB,J.CN
FROM EMP E,(SELECT JOB,COUNT(*) CN FROM EMP GROUP BY JOB) J
WHERE E.JOB=J.JOB;
无关子查询和相关子查询
无关子查询:子查询可以孤立执行
相关子查询:子查询先执行,会用到外部数据
相关子查询 GET EXECUTE FETCH
--查询员工信息,按照部门名称进行排序
--当子查询中需要用到父语句中的列时,使用相关子查询
--找到比自己部门平均薪水高的员工
SELECT EMPNO,SAL,DEPTNO FROM EMP E WHERE SAL>(SELECT AVG(SAL) FROM EMP D WHERE E.DEPTNO = D.DEPTNO);
SELECT DEPTNO,AVG(SAL) FROM EMP GROUP BY DEPTNO
PURGE RECYCLEBIN --清空回收站
--JOB_HISTORY EMPNO DEPTNO
111 10
111 20
--找出换过工作的员工姓名
SELECT ENAME FROM EMP E WHERE (SELECT COUNT(*) FROM JOB_HISTORY WHERE E.EMPNO=EMPNO)>1
递归查询
SELECT * FROM EMP CONNECT BY EMPNO = PRIOR MGR START WITH EMPNO=7788;
--查询出属于7698的下属员工
SELECT * FROM EMP CONNECT BY MGR = PRIOR EMPNO START WITH MGR=7698;
WITH子句
--暂时放在TEMP表空间里
WITH DEPT_COST AS
(SELECT DEPTNO,SUM(SAL) DEPT_COST FROM EMP GROUP BY DEPTNO),
AVG_COST AS(SELECT AVG(SAL) dept_avg FROM EMP)
SELECT * FROM DEPT_COST WHERE DEPT_COST> (SELECT DEPT_AVG FROM AVG_COST)
查询并编辑
for update
查询案例
1.查询出工资大于编号7788的员工信息;
SELECT * FROM EMP WHERE SAL>(SELECT SAL FROM EMP WHERE EMPNO=7788);
2.–查询出和7788在同一部门的人
SELECT * FROM EMP WHERE DEPTNO=(SELECT DEPTNO FROM EMP WHERE EMPNO=7788);
3.查询出和7788以及7654相同部门的人的信息
SELECT * FROM EMP WHERE DEPTNO=(SELECT DEPTNO FROM EMP WHERE EMPNO=7788)OR DEPTNO= (SELECT DEPTNO FROM EMP WHERE EMPNO=7654);
SELECT ENAME FROM EMP WHERE DEPTNO IN(SELECT DEPTNO FROM EMP WHERE EMPNO=7788 OR EMPNO=7654);
4.–查询出部门位置在纽约的人
(1)分组查询
SELECT * FROM EMP E,DEPT DWHERE E.DEPTNO=D.DEPTNO AND D.LOC='NEW YORK';
(2)
SELECT * FROM EMP WHERE DEPTNO=(SELECT DEPTNO FROM DEPT WHERE LOC='NEW YORK');
5.把员工工资中最高的做个对比。
SELECT EMPNO,ENAME,SAL,(SELECT MAX(SAL) FROM EMP) FROM EMP;
6.–查询和king同年入职的人
SELECT * FROM EMP WHERE to_char(hiredate,'yyyy')=(SELECT to_char(HIREDATE,'yyyy') FROM EMP WHERE ENAME='KING');
7.–查询员工编号员工姓名,部门编号,部门人数
SELECT E.EMPNO,E.ENAME,E.DEPTNO,DN.CN
FROM EMP E,(SELECT DEPTNO,COUNT(*) CN FROM EMP GROUP BY DEPTNO) DN
WHERE E.DEPTNO=DN.DEPTNO
8.–查询员工姓名,员工编号,职位,以及职位人数
SELECT E.ENAME,E.EMPNO,E.JOB,EN.JN
FROM EMP E,(SELECT JOB,COUNT(*) JN FROM EMP GROUP BY JOB) EN
WHERE E.JOB=EN.JOB
9. 查询每个部门工资前三名的员工信息
select deptno, ename, sal
from emp e1
where
(select count(1)
from emp e2
where e2.deptno=e1.deptno and e2.sal>=e1.sal) <=3 /*这里的数值表示你想取前几名*/
Oracle标量函数
是一对一的,给它一个值返回一个值,前面的函数都是标量函数。
字符函数
①UPPER(小写转换成大写)
SELECT UPPER('abc') FROM DUAL;
大小写转换
②LOWER(大写转换成小写)
SELECT LOWER('ABC') FROM DUAL;
INITCAP(首字母大写)
SELECT INITCAP('dfdex dsf') FROM DUAL;
中间不用加,号,直接空格就行。
CONCAT或||(串连接)
SELECT CONCAT(CONCAT(CONCAT('MY','NAME'),'IS'),'TSC')FROM DUAL; --只能连接两个字符串
SELECT 'MY'||'NAME'||'IS'||'TSC'FROM DUAL;
REPLACE(串替换)
SELECT REPLACE(ENAME,'AR','唐')FROM EMP;--是整体替换
TRANSLATE(翻译)
例:–将员工姓名中的’AR’替换成‘唐’。 (是逐字翻译)
SELECT ENAME,TRANSLATE(ENAME,'AR','唐')FROM EMP;
–把A翻译成了唐,把R翻译成了空
LENGTH(串长度)
SELECT LENGTH('HELLO') FROM DUAL;
SUBSTR(截取字符串)
例:–将员工姓名的倒数第二位截取出来
SELECT SUBSTR(ENAME,-2,1) FROM EMP;
后面的数字代表从第几位开始截,截几位。
可以只写两个参数,两个参数是就是从第几位开始截,截到最后,比如
SELECT SUBSTR('TEST',3) FROM DUAL; --ST
INSTR(位置符)
例:–找出员工姓名中A在什么位置
SELECT INSTR(ENAME,'A') FROM EMP;
–找出员工姓名中第二位开始A在什么位置
SELECT INSTR(ENAME,'A',2) FROM EMP;
TRIM(去除空格)
去除两边的空格,中间的留着。
LTRIM去除左边空格
RTRIM去除右边空格。
去除小数后多余的0
TRIM(TRAILING '0' FROM "PLAN_TON")
数值函数
CEIL(向上取整)
SELECT CEIL(34.12) FROM DUAL; -- 34
FLOOR(向下取整)
SELECT FLOOR(29.97) FROM DUAL; -- 29
ROUND(四舍五入)
SELECT ROUND(29.97) FROM DUAL; -- 30
TRUNC(截取)
SELECT TRUNC(789.567,2) FROM DUAL; -- 789.56
MOD(取余数)
SELECT MOD(10,3) FROM DUAL; -- 1
ABS(取绝对值)
SELECT ABS(-3) FROM DUAL; -- 3
日期函数
日期-日期,日期+数字,日期-数字都可以,但是日期+日期不可以;
SYSDATE(当前日期)
SELECT SYSDATE FROM DUAL;
ADD_MONTHS
SELECT ADD_MONTHS(SYSDATE,-30) FROM DUAL;
-号是往前多少月
MONTHS_BETWEEN
例:–查询一下员工入职了多少个月了
SELECT MONTHS_BETWEEN(SYSDATE,HIREDATE) FROM EMP;
LAST_DAY
例:–这个月的最后一天
SELECT LAST_DAY(SYSDATE) FROM DUAL;
— 这个月的倒数第二天是哪一天
SELECT LAST_DAY(SYSDATE)-1 FROM DUAL;
NEXT_DAY
哪个日期后的第一个哪个星期几
例:–当前日期后的第一个周三是哪一天
SELECT NEXT_DAY(SYSDATE,4) FROM DUAL;
TRUNC(截断日期)
–显示今天
SELECT TRUNC(SYSDATE,'DD') FROM DUAL;
SELECT TRUNC(SYSDATE) FROM DUAL;
–显示这个月的第一天
SELECT TRUNC(SYSDATE,'MM')FROM DUAL;
–显示今年的第一天
SELECT TRUNC(SYSDATE,'YY')FROM DUAL;
–写’D’代表这个日期所在的这一周的第一天是哪一天。
SELECT TRUNC(SYSDATE,'D')FROM DUAL;
转换函数
隐式转换
”里面是数字时,进行加减会自动转换成数字类型。
SELECT '123'+'123' FROM DUAL; -- 264
显示转换,转换函数
TO_NUMBER
只能把纯数字的字符串里的数字转换出来
SELECT '123'+'123' FROM DUAL;
TO_DATE
只能把数字转换成日期,格式要说明
SELECT TO_DATE(20180724,'YYYYMMDD') FROM DUAL;
TO_CHAR
- 将日期转换成固定格式的字符串
SELECT TO_CHAR(SYSDATE,'DD_YYYY_MM HH12MISS') FROM DUAL;
- 将日期中的特定部分提取出来
SELECT TO_CHAR(SYSDATE,'DD') FROM DUAL; -- 展示今天是几号
SELECT TO_CHAR(SYSDATE,'YY') FROM DUAL; -- 展示年份的后几位
SELECT TO_CHAR(SYSDATE,'D') FROM DUAL; -- D代表的是星期几
- 显示$999,999,999.00 ; L 代表local当地的货币符号
SELECT TO_CHAR(SAL,'L999,999,999.00') FROM EMP;
- 不足的位补零 想要几位就补几个零,前面会有一个空格
SELECT TRIM(TO_CHAR(EMPNO,'000000')) FROM EMP;
通用函数
算术运算
–查询出员工的年薪(月薪+奖金)*12 空值的算术运算都是空
SELECT SAL,COMM,(SAL+NVL(COMM,0))*12 FROM EMP;
COALESCE
返回第一个不为空的值
–如果奖金为空,那么返回工资,如果工资也为空那么返回员工编号
SELECT COMM,SAL,EMPNO,COALESCE(COMM,SAL,EMPNO) FROM EMP;
DECODE
DECODE(要判断的值,值1,结果1,值2,返回结果2,值3,返回结果3,结果n) 分支判段
例:–判断职位,如果职位是MANAGER或者是PRESIDENT,那么显示一个经理,其余人显示员工
SELECT JOB,DECODE(JOB,'MANAGER','经理','PERSIDENT','经理','员工') FROM EMP;
SELECT SUBSTR(EMPNO,-2,1),
DECODE(SUBSTR(EMPNO,-2,1),'1','男','3','男','5','男','7','男','9','男','女')
FROM EMP;
CASE WHEN
case when有两种用法
- 用法1
CASE 要判断的值 WHEN 值1 THEN 结果1
WHEN 值2 THEN 结果2
ELSE 结果n END
