学习oracle数据库也有一段时间了,现在将一些前期的总结再拿出来总结一下,希望能对初学习或自学的朋友有一定的帮助。
所需的表: (以下操作只涉及到ORACLE数据库中的emp表,如果没有表的朋友可以找我要,但基本都有的)
1.完整的查询语句(可以先了解一下完整的查询语句,下面再一步一步来)
SELECT ‘数据源中的某些具体的字段、函数、常量、*’
FROM ‘数据源’
WHERE ‘查询条件’
GROUP BY ‘分组’ HAVING 筛选条件
ORDER BY ‘排序’
语法解释:
从数据源中,按条件筛选出部分数据,对该部分数据以某规则进行分组,从分组后的结果中
再一次进行筛选,最终查出需要的字段,并以某排序规则进行排序
连接:||
-
- 逻辑运算
逻辑运算符: =(等于),>=(大于等于),<=(小于等于),!=(不等于),< >(不等于),>(大于),<(小于)
注意点:空值不参与运算
--查询薪资大于1500的员工
SELECT * FROM EMP WHERE SAL>1500;
函数拓展:
字符串转日期:TO_DATE('字符串','与字符串对应的日期格式')
--查询1981年11月17日入职的员工(emp表中的日期都是很早的了)
SELECT * FROM EMP WHERE HIREDATE=TO_DATE('1981/11/17','YYYY/MM/DD');
日期转字符串:TO_CHAR('日期','日期转成字符串的目标格式')
SELECT * FROM EMP WHERE TO_CHAR(HIREDATE,'YYYYMMDD')='19811117';
-
- 模糊查询
LIKE:
谓词LIKE可以用来进行字符串的匹配
LIKE:符合
NOT LIKE:不符合
通配符:
_:有且只有一个字符
%:有零个或者一个或多个字符
转义字符:ESCAPE ‘/’ :要查询含有_和%的字符串需要将_和%转义为普通的字符,不然查询不了。
例子:
--查询首字母是S的员工
SELECT * FROM EMP WHERE ENAME LIKE 'S%';
--查询首字母不是S的员工
SELECT * FROM EMP WHERE ENAME NOT LIKE 'S%';
转义字符的运用(当需要查询的字段的数据含有%或下划线的时候需要加上转义字符,将通配符转义成普通的符号)如下:
--查询姓名中含有%的员工
SELECT * FROM EMP WHERE ENAME LIKE '%/%%' ESCAPE('/');
注意:/之后的%已经不是通配符%了,经过转义,它现在只是一个%符号。
-
- 包含查询
IN( ):
谓词IN可以用来查找属性值属于指定集合的元组,只要不在该集合中即条件成立。
集合:一组有着相同属性(相同数据类型)的数据
IN( ):包含
--查询10号和20号部门的员工
SELECT * FROM EMP WHERE DEPTNO IN(10,20);
NOT IN( ):不包含
--查询除了10号和20号部门外的所有员工
SELECT * FROM EMP WHERE DEPTNO NOT IN(10,20);
-
- 范围查询
BETWEEN AND ‘在。。到。。之间’
NOT BETWEEN AND ‘不在。。到,,之间’
语法:SELECT COL_LIST FROM TB_NAME WHERE COL_NAME BETWEEN NUM1 AND NUM2;
--查询薪资在1500到2500的员工(包含1500和2500)
SELECT * FROM EMP WHERE SAL BETWEEN 1500 AND 2500;
注意:1.NUM1<=NUM2
- 包含边界值
- NULL值判断
NULL:空值
NOT NULL:非空 (前面都跟IS)
语法:SELECT COL_LIST FROM TB_NAME WHERE COL_NAME IS NULL ;
--空值
--查询奖金为空的员工
SELECT * FROM EMP WHERE COMM IS NULL;
SELECT COL_LIST FROM TB_NAME WHERE COL_NAME IS NOT NULL ;
--非空值
--查询奖金不为空的员工
SELECT * FROM EMP WHERE COMM IS NOT NULL;
-
- ANY和ALL
ANY --任意一个
--查询10号和20号部门的员工
SELECT * FROM EMP WHERE DEPTNO=ANY(10,20);
注意:只要部门编号等于any里的任意一个就行,这与in有些相像,
但如果是>any()的话,只需要大于里面最小的行;如果是<any()的话只要小于里面最大的就行。
ALL --所有全部
SELECT * FROM EMP WHERE DEPTNO=ALL(10,20);
没有结果,因为这需要部门编号等于(10,20)的才行,这在表里是不存在的;当>all()时,需要大于里面最大的才行;而<all(),则是小于里面最小的才符合。
-
- 布尔连接
语法:
SELECT COL_NAME FROM TB_NAME WHERE CONDITION1 AND CONDITION2;
SELECT COL_NAME FROM TB_NAME WHERE CONDITION1 OR CONDITION2;
条件连接关键词:AND 和(且) OR 或
注意:
1)通过布尔连接,可以合并相同字段的条件,也可合并不同字段的条件
--相同字段的条件
--查询部门编号是10号或20号的员工
SELECT * FROM EMP WHERE DEPTNO=10 OR DEPTNO=20;
--不同字段的条件
--查询部门编号是10号和岗位是CLERK的员工
SELECT * FROM EMP WHERE DEPTNO=10 AND JOB='CLERK';
2)AND和OR一块使用时 AND的优先级高于OR
3)如果有小括号 先考虑括号中的条件
2.0 排序查询
语法:
SELECT COL_LIST FROM TB_NAME ORDER BY ODR_CONDITION [ASC|DESC];
语法解释:
对于从TB_NAME中查出的COL_LIST数据按照规则ODR_CONDITION进行排序
ASC:升序(不写的话默认升序) DESC:降序
--按薪资降序排
SELECT * FROM EMP ORDER BY SAL DESC;
--按薪资升序排
SELECT * FROM EMP ORDER BY SAL;
函数扩展:
1)NULL值的默认排序与强制排序
NULL值默认排序为极大值,即升序排列时,空值排在最后,降序排列时,空值排在最前
强制空值排在最前:NULLS FIRST
SELECT * FROM EMP ORDER BY COMM NULLS FIRST;
强制空值排在最后:NULLS LAST
SELECT * FROM EMP ORDER BY COMM NULLS LAST;
2)函数NVL()
用法:NVL(COL_NAME,DEFAULT_VALUE)
--给没有奖金的员工加100奖金
SELECT ENAME,NVL(COMM,100) FROM EMP; --当comm字段的数据为空时,给它复制100;
3)函数CASE
用法:
CASE WHEN CONDITION1 THEN RESULT1
WHEN CONDITION2 THEN RESULT2
...
ELSE DEFAULT_RESULT
END
--薪资小于等于1500的为低工资,大于1500,小于2500的为中工资,大于或等于2500的为高工资
SELECT A.*,
CASE
WHEN SAL <= 1500 THEN
'低工资'
WHEN SAL > 1500 AND SAL < 2500 THEN
'中工资'
WHEN SAL >= 2500 THEN
'高工资'
END 待遇情况
FROM EMP A;
3.0 分组查询
聚合函数
概念:把分散的数据按某种规则将数据分成不同的组、或所有数据整体作为一个组,对组级别的数据进行分析,每组得到一个返回值。
五个聚合函数:
SUM():求合计值
--求所有员工的薪资合计
SELECT SUM(SAL) FROM EMP;
MAX():求最大值
--求最大薪资
SELECT MAX(SAL) FROM EMP;
MIN():求最小值
--求最小薪资
SELECT MIN(SAL) FROM EMP;
AVG():求平均值
--求工资的平均薪资
SELECT AVG(SAL) FROM EMP;
COUNT():计数
--求所有人数
SELECT COUNT(ENAME) FROM EMP;
注意:
1)所有聚合函数都是针对非空值进行的统计
2)COUNT()的特殊用法:若是在不确定哪些字段不含空值的情况下统计总数据量,可以使用COUNT(1)或COUNT(*)来统计
3)SUM和AVG只针对数值,其他三个可针对任意类型
GROUP BY ‘分组查询’
语法:
SELECT COL_LIST,聚合函数,常量
FROM TB_NAME
GROUP BY COL_LIST;
语法解释:
对数据源TB_NAME按照COL_LIST分组,统计各分组的分析情况
--统计各部门的平均薪资
SELECT DEPTNO,AVG(SAL) FROM EMP GROUP BY DEPTNO;
注意:
1.对于含有GROUP BY子句的SQL语句,SELECT子句中仅允许出现
1)GROUP BY中出现过的字段
2)聚合函数
3)常量
2.对于不含有GROUP BY子句但SELECT子句中含有聚合函数的情况,SELECT子句中除聚合函数与常量外,不能再出现其他字段
分组过滤
语法:
SELECT COL_LIST,聚合函数,常量
FROM TB_NAME
GROUP BY COL_LIST
HAVING 以聚合函数为基础的条件判断;
语法解释:
对数据源TB_NAME按照COL_LIST分组,统计各分组的分析情况,并对分析结果进行筛选
--查询平均薪资大于1500的部门
SELECT DEPTNO FROM EMP GROUP BY DEPTNO HAVING AVG(SAL)>1500;
WHERE与HAVING的区别和联系
1.都是做条件筛选用的
不必和GROUP BY连用,HAVING必须和GROUP BY连用
筛选的是针对FROM后表的数据,HAVING是针对GROUP BY分组之后的数据进行筛选
中的部分条件可以写在HAVING中,但非常影响执行效率,不建议使用
5.只有在GROUP BY子句中出现的字段,才能够由WHERE子句中转写到HAVING子句中
后面不能跟聚合函数
区分:
书写顺序:SELECT ... FROM ... WHERE ... GROUP BY ... HAVING ... ORDER BY ...
执行顺序:FROM ... WHERE ... GROUP BY ... HAVING ... SELECT ... ORDER BY ...