Oracle学习笔记

数据库基础知识

数据库(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

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇