为了账号安全,请及时绑定邮箱和手机立即绑定

【备战春招】第6天 Java数据库开发与实战(数据库高级查询)

标签:
Java MySQL
课程名称: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.数据库表的分组查询

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消