课程名称:Java工程师2022版
课程章节:Java数据库开发与实战
课程讲师:IT老齐 悟空 八戒猪 神思者 Leo
课程内容:数据库的高级查询
一、条件查询
1.条件查询语法
很多时候,用户感兴趣的并不是逻辑表里的全部记录,而只是它们当中能够满足某一种或者几种条件的记录。这类条件要用WHERE字句来实现数据的筛选。
SELECT...FROM...WHERE 条件 [AND|OR] 条件...;
SELECT empno,ename,sal FROM t_emp
WHERE deptno=10 AND sal>=2000;
这段代码就是带条件的查询语句。第一句是关于条件查询的语法。
第二第三句是从t_emp表中选择empno,ename,sal字段且deptno=10,sal>=2000的信息。
关于定义中的AND和OR参数,两个参数都代表逻辑关系,AND表示逻辑和,OR表示逻辑或。
2.四类运算符
WHERE语句中的条件运算会用到以下四种运算符:
序号 | 运算符 |
---|---|
1 | 数学运算符 |
2 | 比较运算符 |
3 | 逻辑运算符 |
4 | 按位运算符 |
当然除了上述了逻辑运算符还有算数运算符,算数运算符主要有±*/%,加减乘除求模。SELECT 10*IFNULL(null,0);
这里牵扯到算数运算符,关于跟null的运算,不管是哪种算数运算符跟null的运算结果中结果都是null。
我想让跟null的运算中把null替换成0使用,那么就用到IFNULL函数,包含两个参数,第一个为null值的字段,第二个是0,就是把null看作什么。
3.比较运算符
(>,>=,<,<=,=,!=,IN)
比较运算符中,只有IN是比较特殊的,表示包含的含义,比如deptno IN(10,30,40)
表达式 | 意义 | 例子 |
---|---|---|
IS NULL | 为空 | comm IS NULL |
IS NOT NULL | 不为空 | comm IS NOT NULL |
BETWEEN AND | 范围 | sal BETWEEN 2000 AND 3000 |
LIKE | 模糊查询 | ename LIKE “A%” |
REGEXP | 正则表达式 | ename REGEXP “[a-zA-Z]{4}” |
主要涉及到LIKE模糊逻辑,第一个字符为A的,如果前后各一个%,则表示含有A。REGEXP正则表达式,从a-zA-Z且有四个字符的。在REGEXP中^表示字符串的开头,$表示字符串的结尾。中文字符是在这个范围内的 [\u4e00-\u9fa5] {2,4}。两个字符到四个字符之间的中文字符。
4.逻辑运算符
表达式 | 意义 | 例子 |
---|---|---|
AND | 与关系 | age>18 AND sex=“男” |
OR | 或关系 | empno=8000 OR deptno=20 |
NOT | 非关系 | NOT deptno=20 |
XOR | 异或关系 | age>18 XOR sex=“男” |
AND表示同时满足;OR表示满足一个;NOT表示取反的意思;XOR表示两边的关系相同的话,那么就为false,如果XOR两边关系不同的话,那么就为true。
5.二进制按位运算
二进制位运算的实质是将参与运算的两个操作数,按对应的二进制数逐位进行逻辑运算。
&位与关系,|位或关系,~位取反,^位异或,<<左移,>>右移,以上所有的操作都是在二进制下进行的计算。
WHERE字句的注意事项,WHERE字句中,条件执行的顺序是从左到右的。所以我们应该把索引条件,或者筛选条件记录最多的条件写在最左侧。
各种字句的执行顺序,FROM -> WHERE -> SELECT ->ORDER BY -> LIMIT。
二、聚合函数
1,聚合函数在数据的查询分析中,应用十分广泛。聚合函数可以对数据求和,求最大值和最小值,求平均值等等。
SUM函数,SUM函数用于求和,只能用于数字类型,字符类型的统计结果为0,日期类型统计记过是毫秒数相加。
2.MAX函数
MAX函数用于获得非空值的最大值。SELECT MAX(comm) FROM t_emp;
这里表示求字段comm的最大值。
问题1:查询10和20部门中,月收入最高的员工?
SELECT MAX(sal+IFNULL(comm,0)) FROM t_emp WHERE deptno IN(10,20);
月收入有两部分组成工资和奖金,从当前表t_emp中选择,处于10和20部门的员工。
问题2:查询员工名字最长的是几个字符?
SELECT MAX(LENGTH(ename))) FROM t_emp;
这里使用了LENGTH函数,可以获取当前字段ename的字符长度。
3.MIN函数
MIN函数用于获得非空值的最小值。
SELECT MIN(empno) FROM t_emp;
在当前表t_emp中查看员工编号的最小值。
SELECT MIN(hiredate) FROM t_emp;
求当前表t_emp中入职日期的最小值。
4.AVG函数
AVG函数用于获得非空值的平均值,非数字数据统计结果为0。
SELECT AVG(sal+IFNULL(comm,0)) FROM t_emp;
求平均工资,平均工资由工资和奖金组成的整体求平均值而来。
5.COUNT函数
COUNT(*)用于获取包含空值的记录数,COUNT(列名)用于获取包含非空值的记录数。
SELECT COUNT(*) FROM t_emp;
统计当前表t_emp的所有的记录数。
SELECT COUNT(comm) FROM t_emp;
统计当前表t_emp中comm字段非空的记录。
三、数据库表的分组查询
1.为什么要分组?
默认情况下汇总函数是对全表范围内的数据做统计。
GROUP BY字句的作用是通过一定的规则将一个数据集划分成若干个小区域,然后针对每个小区域分别进行数据汇总处理。
SELECT deptno,AVG(sal) FROM t_emp GROUP BY deptno;
从表t_emp中对deptno字段进行分组,且求这个字段的平均工资。
如果实现代码SELECT deptno, ROUND(AVG(sal)) FROM t_emp GROUP BY deptno;
则表示把得到的数据进行四舍五入,那我们得到的查询结果就是一个整数。
2.如何逐级分组?
数据库支持多列分组条件,执行的时候逐级分组。
问题:查询每个部门里,每种职位的人员数量和平均底薪。
SELECT deptno,job,COUNT(*),AVG(sal)
FROM t_emp GROUP BY deptno,job
ORDER BY deptno;
主要说明的部分就是GROUP BY 逐级分组的方法,首先按照deptno分组,然后再按照job分组,最后使用ORDER BY进行排序,默认是升序ASC。
3.对SELECT字句的要求
查询语句中如果含有GROUP BY字句,那么SELECT字句中的内容就必须要遵守规定:SELECT字句中可以包括聚合函数,或者GROUP BY字句的分别列,其余内容均不可以出现在SELECT子句中。比如以下代码就是错误的。
SELECT deptno,COUNT(*),AVG(sal),sal FROM t_emp GROUP BY deptno;
这段代码中出现了GROUP BY语句,SELECT语句中就只能出现聚合函数,GROUP BY中出现的deptno字段,不可以出现其他的字段比如sal字段。
课程收获:
完成了今天的学习目标:
1.条件查询
2.聚合函数
3.数据库表的分组查询