sql语句注意点

 查询语句的执行顺序

当一条查询语句中包含所有的子句,执行顺序依下列子句次序:

  1. FROM 子句:执行顺序为从后往前、从右到左。数据量较少的表尽量放在后面。
  2. WHERE子句:执行顺序为自下而上、从右到左。将能过滤掉最大数量记录的条件写在WHERE 子句的最右。
  3. GROUP BY:执行顺序从左往右分组,最好在GROUP BY前使用WHERE将不需要的记录在GROUP BY之前过滤掉。
  4. HAVING 子句:消耗资源。尽量避免使用,HAVING 会在检索出所有记录之后才对结果集进行过滤,需要排序等操作。
  5. SELECT子句:少用*号,尽量取字段名称。ORACLE 在解析的过程中, 通过查询数据字典将*号依次转换成所有的列名, 消耗时间。
  6. ORDER BY子句:执行顺序为从左到右排序,消耗资源。

多个列排序

排序时默认按升序排列,即由小及大,ASC用来指定升序排序,DESC用来指定降序排序。

因为NULL值视作最大,则升序排列时,排在最后,降序排列时,排在最前。如果不写ASC或DESC,默认是ASC,升序排列。

当以多列作为排序标准时,首先按照第一列进行排序,如果第一列数据相同,再以第二列排序,以此类推。多列排序时,不管正序还是倒序,每个列需要单独设置排序方式。

下例对职员表中的职员排序,先按照部门编码正序排列,再按照薪水降序排列:SELECT ename, deptno, sal FROM emp ORDER BY deptno ASC, sal DESC;

使用LIKE条件(模糊查询)

当用户在执行查询时,不能完全确定某些信息的查询条件,或者只知道信息的一部分,可以借助LIKE来实现模糊查询。LIKE需要借助两个通配符:

  • %:表示0到多个字符
  • _:标识单个字符

使用IS NULL和IS NOT NULL

空值NULL是一个特殊的值,比较的时候不能使用”=”号,必须使用IS NULL,否则不能得到正确的结果。例如查询哪些职员的奖金数据为NULL:SELECT ename, sal, comm FROM emp WHERE comm IS NULL;

使用ANY和ALL条件

在比较运算符中,可以出现ALL和ANY,表示“全部”和“任一”,但是ALL和ANY不能单独使用,需要配合单行比较操作符>、>=、<、<=一起使用。其中:

  • > ANY : 大于最小
  • < ANY:小于最大
  • > ALL:大于最大
  • < ALL:小于最小

例如,查询薪水比职位是“SALESMAN”的人高的员工信息,比任意一个SALESMAN高都行:SELECT empno, ename, job, sal, deptno FROM emp WHERE sal> ANY (SELECT sal FROM emp WHERE job = 'SALESMAN');

使用DISTINCT过滤重复

数据表中有可能存储相同数据的行,当执行查询操作时,默认情况会显示所有行,不管查询结果是否有重复的数据。当重复数据没有实际意义,经常会需要去掉重复值,使用DISTINCT实现。

DISTINCT后面的列可以组合查询,下例查询每个部门的职位,去掉重复值。注意是deptno和job联合起来不重复:SELECT DISTINCT deptno, job FROM emp;

扫描二维码关注公众号,回复: 4628055 查看本文章

 聚合函数对空值的处理

聚合函数忽略NULL值。

  1. SELECT AVG(sal) avg_sal FROM emp;
  2. SELECT AVG(NVL(sal,0)) avg_sal FROM emp;

内连接

SELECT e.ename, d.dnameFROM emp e, dept d WHERE e.deptno = d.deptno
SELECT e.ename, d.dname FROM emp e JOIN dept d ON(e.deptno = d.deptno);

外连接

SELECT e.ename, d.dname FROM emp e LEFT OUTER JOIN dept d ON e.deptno = d.deptno;
SELECT e.ename, d.dname FROM emp e RIGHT OUTER JOIN dept d ON e.deptno = d.deptno;
SELECT e.ename, d.dname FROM emp e FULL OUTER JOIN dept d ON e.deptno = d.deptno;

自连接

SELECT worker.empnow_empno, worker.enamew_ename, manager.empnom_empno, manager.enamem_ename

FROM emp worker join emp manager ON worker.mgr = manager.empno;

DECODE函数

  1. SELECT ename, job, sal,
  2. DECODE(job, 'MANAGER', sal * 1.2,
  3. 'ANALYST', sal * 1.1,
  4. 'SALESMAN', sal * 1.05,
  5. sal
  6. ) bonus
  7. FROM emp;

DECODE函数在分组查询中的应用

  1. SELECT DECODE(job, 'ANALYST', 'VIP',
  2. 'MANAGER', 'VIP',
  3. 'OPERATION') job,
  4. COUNT(1) job_cnt
  5. FROM emp
  6. GROUP BY DECODE(job, 'ANALYST', 'VIP', 'MANAGER', 'VIP', 'OPERATION');

猜你喜欢

转载自blog.csdn.net/weixin_41771218/article/details/83536686