Oracle数据查询的方法简单总结
1. 句法:
SELECT 字段名 5
FROM 表格名称 1
WHERE 筛选语句 2
GROUP BY 字段名称 3
HAVING 分组后的数据筛选 4
ORDER BY DESC/ASC 6
该句法为最全语句,当不需要相应语句可去掉
2. 执行顺序:
1 数据来源,2,筛选出符合条件的数据,3对符合条件的数据分组,4对分组的数据条件进行判断,5:输出想要的数据字段 6:输出的格式(升序/降序)
-
常见的条件筛选关键字:
(1.)<和>和:表示小于 和大于
(2.)=:表示等于
(3.)!=或<>:表示不等于
(4.) OR:表示或者关系; AND:表示且的关系
(5.)BETWEEN…AND…:表示在两个数范围内,小数在AND前大数在AND后;
(6.)IN():表示在括号的列举范围内,如:IN(1,2,3)表示在1,2,3三个数之内,“或者"关系
(7.)IS NULL和IS NOT NULL:判断是否为空
(8.)LIKE:模糊查询关键字, 后面跟“_” 、”%"分别表示任意一个字符和任意一段字符段;如‘A%’表示以A开头的字段,‘_A%’表示第二个字母是A的字段;
(9.)>ANY():表示大于括号里最小的
<ANY():表示小于括号里最大的
>ALL:表示大于括号里里最大的
<ALL:表示小于括号里里最小的
3. 该句法可适用一些简单的查询,但若筛选条件较复杂,可利用 FROM 子查询、WHERE子查询、HAVING子查询,举例说明:(数据来自Oracle表格)
-
WHERE 子查询:
薪资比经理中薪资最低的高的员工信息:
SELECT *
FROM emp
WHERE sal>(SELECT MIN(sal) FROM emp WHERE job=‘MANAGER’);
SELECT *
FROM emp
WHERE sal>ANY (SELECT sal FROM emp WHERE job=‘MANAGER’);
薪资比经理中薪资最高的低的员工信息:
SELECT *
FROM emp
WHERE sal<(SELECT MAX(sal) FROM emp WHERE job=‘MANAGER’);
SELECT *
FROM emp
WHERE sal<ANY (SELECT sal FROM emp WHERE job=‘MANAGER’);
薪资比经理中薪资最高的高的员工信息:
SELECT *
FROM emp
WHERE sal>(SELECT MAX(sal) FROM emp WHERE job=‘MANAGER’);
SELECT *
FROM emp
WHERE sal>ALL (SELECT sal FROM emp WHERE job=‘MANAGER’);
薪资比经理中薪资最低的低的员工信息:
SELECT *
FROM emp
WHERE sal<(SELECT MMIN(sal) FROM emp WHERE job=‘MANAGER’);
SELECT *
FROM emp
WHERE sal<ALL (SELECT sal FROM emp WHERE job=‘MANAGER’); -
HAVING子查询:
1.查询出平均薪资高于所有员工平均工资的职位的名称,以及职位的人数,这些职位的平均工资;
SELECT job,AVG(sal)
FROM emp
GROUP BY job
HAVING AVG(sal)>(SELECT AVG(sal) FROM emp);
2.查询出平均薪资最高的职位名称和该职位的平均薪资
SELECT job,AVG(sal)
FROM emp
GROUP BY job
HAVING AVG(sal)=(SELECT MAX(AVG(sal)) FROM emp GROUP BY job); -
FROM子查询:
查询各部门中薪水最高的员工编号,姓名
SELECT empno,ename ,sal, demp.m
FROM emp e,(SELECT MAX(sal) m,deptno FROM emp GROUP BY deptno) demp
WHERE e.deptno=demp.deptno AND sal=demp.m;
查询薪资高于佣金的员工信息
SELECT *
FROM (SELECT * FROM emp WHERE comm IS NOT NULL) newemp
WHERE newemp.sal>newemp.comm; - 数据来源多张表称为多表查询,会产生笛卡尔积,表示这几张表的数据个数的乘积,所以要在WHERE消除笛卡尔积,或者在FROM语句中直接使用(内连接查询) ”表1 INNER JOIN 表2 ON 消除笛卡尔积的判断条件“或(外连接查询) ”表1 OUTER JOIN 表2 ON 消除笛卡尔积的判断条件“
如:查询各部门的平均薪资,部门名称,部门编号
SELECT d.deptno,d.dname,s.平均薪资
FROM dept d,(SELECT AVG(sal) 平均薪资,emp.deptno FROM emp FULL OUTER JOIN dept ON emp.deptno=dept.deptno GROUP BY emp.deptno ) s
WHERE d.deptno=s.deptno;
4.总结:
- WHERE 字句中不能出现统计函数;
- 对于含有GROUP BY 的SQL语句有如下规则:
- FROM 子查询会产生笛卡尔积,需要消除,方法有INNER JOIN和OUTER JOIN;
- WHERE子句和HAVING子句的区别:WHERE在GROUP BY之前执行,且不能含有统计函数,HAVING子句在GROUP BY后面执行,含有统计函数判断条件;