NVL2(comm,sal+comm,sal):html
判断comm是否是空值,若是是空值则返回sal,不是空值则返回sal+comm函数
取数字n的符号,大于0返回1,小于0返回-1,等于0则返回0htm
DECODE(value, if1, then1, if2,then2, if3,then3, . . . else ) blog
至关于if......else......语句,但DECODE()单独使用的话,通常用于等值判断排序
练习1:SELECT ename,job,DECODE(job,'MANAGER','经理','SALESMAN','销售人员','PRESIDENT','总裁') FROM emp; //判断job这一列的值,若是是'MANAGER'则返回'经理',若是是'SALESMAN'则返回'销售人员',若是是'PRESIDENT',则返回'总裁'。get
练习2:SELECT ename,job,sal,DECODE(job,'MANAGER',sal*0.8,'SALESMAN',sal+100,sal) 调后薪资 FROM emp; //工资调整:manager的工资下调20%,salesman工资增长100,其他人员不变博客
练习3:进行范围判断,根据不一样的工资范围,计算出不一样等级的税款io
方法1:与SIGN()函数结合使用class
SELECT ename,job,sal,select
DECODE(SIGN(sal-3000),1,sal*0.2,0,sal*0.2,
-1,DECODE(SIGN(sal-2000),1,sal*0.15,0,sal*0.15,
-1,DECODE(SIGN(sal-1000),1,sal*0.1,0,sal*0.1,-1,0)
)) 税款 FROM emp;
方法2:与TRUNC()函数结合使用
SELECT ename,job,sal,
DECODE(TRUNC(sal/1000),0,0,
1,sal*0.1,2,sal*0.15,sal*0.2) 税款 FROM emp;
练习4:SELECT ename,job,DECODE(INSTR(ename,'A'),0,'名字中不包含A','名字中包含A') 包含A不 FROM emp; //与INSTR函数结合使用,判断名字中是否包含A
练习5:查询雇员姓名、岗位,并以岗位排序,顺序为'CLERK','MANAGER','SALESMAN','ANALYST','PRESIDENT'
方法1:DECODE
SELECT ename,job FROM emp ORDER BY DECODE(job,'CLERK',1,'MANAGER',2,'SALESMAN',3,'ANALYST',4,'PRESIDENT',5);
方法2:CASE WHEN1 ? THEN1 ?WHEN2 ? THEN ?....... END
SELECT ename,job FROM emp ORDER BY CASE job WHEN 'CLERK' THEN 1 WHEN 'MANAGER' THEN 2 WHEN 'SALESMAN' THEN 3 WHEN 'ANALYST' THEN 4 WHEN 'PRESIDENT' THEN 5 END;
多表进行联合查询,不使用关联条件的话,就会产生笛卡尔积现象,产生不少重复无用的数据。select * from emp,dept;
语法:SELECT [DISTINCT] 列名1,列名2... FROM 表1,表2 WHERE 链接条件 AND 过滤条件;
外链接:
找寻两个表中相同的列:SELECT ename,job,d.deptno,dname FROM emp e,dept d WHERE e.deptno = d.deptno AND job='CLERK';
SELECT ename,sal,grade FROM emp,salgrade s WHERE sal BETWEEN s.losal AND s.hisal;多表链接也可使用除=外的其余符号进行链接
内链接:
SELECT e.ename,e.job,e.mgr,m.ename 上司 FROM emp e,emp m WHERE e.mgr = m.empno; 把同一个表看成几个表来使用,经过赋予别名
例题:查询员工姓名、工资、工资等级、部门名称,以及他的上司姓名和工资等级,工资等级均以汉字显示。
SELECT e.ename,e.sal,
DECODE(s1.grade,1,'第一等级',2,'第二等级',3,'第三等级',4,'第四等级',5,'第五等级') 等级,
dname,m.ename 上司,m.sal 上司sal,
DECODE(s2.grade,1,'第一等级',2,'第二等级',3,'第三等级',4,'第四等级',5,'第五等级') 等级
FROM emp e,emp m,dept d,salgrade s1,salgrade s2
WHERE e.mgr = m.empno AND d.deptno=e.deptno
AND (e.sal BETWEEN s1.losal AND s1.hisal) AND (m.sal BETWEEN s2.losal AND s2.hisal);
关键字 distinct 用于返回惟一不一样的值,只能在SELECT 语句中使用,不能在 INSERT, DELETE, UPDATE 语句中使用
distinct是将全部查询的字段进行对比去重,全部字段都彻底相同才会去重
distinct 必须放在查询字段开头进行查询,distinct对NULL是不进行过滤的,即返回的结果中是包含NULL值的。
今日练习:
一、查询部门名为’SALES’的员工信息。
SELECT * FROM emp e,dept d
WHERE (e.deptno=d.deptno) AND (d.dname='SALES');
二、查询在部门所在地为NEW YORK的员工的员工姓名,部门名称和岗位名称。
SELECT e.ename,d.dname,e.job
FROM emp e,dept d
WHERE (e.deptno=d.deptno) AND (d.loc='NEW YORK');
做者:kerwin-chyl
文章连接:https:////www.cnblogs.com/kerwin-chyl
本文版权归做者和博客园共有,欢迎转载,但未经做者赞成必须保留此段声明,且在文章页面明显位置给出原文链接,不然保留追究法律责任的权利。