JAVA-MySQL六{MySQL重点DQL查询数据三函数}JAVA从基础开始 --7
分页和排序
顺序
where … 指定结果需满足的条件
group by …指定结果按照哪几个字段来分组
having …过滤分组的记录必须满足的次要条件
order by…指定查询记录按一个或多个条件排序
limit …指定查询的记录从哪条至哪条
顺序不可乱-从where -到limit
order by
desc 降序,大的在前面
asc 升序,小的在前面
分页
缓解数据库压力 提高体验感,,瀑布流
第一页 | 第二页 | 第N页 |
---|---|---|
limit 0,5 | limit 6,5 | limit (n-1)*pageSize ,pageSize |
5 | 10 | limit (n-1)*pageSize ,pageSize |
-- 分页 limit 和排序 order by
SELECT
ex.`studentName` AS '学号',
st.`name` AS '姓名',
eb.`examSubjectName` AS '科目名',
ex.`examFraction` AS '分数'
FROM
`exam` AS ex
INNER JOIN `examsubject` AS eb ON eb.`examSubjectId` = ex.`examName`
INNER JOIN `student` AS st ON ex.`studentName` = st.`id`
-- order by- 通过哪个字段排序
order by st.`id` asc-- desc 降序 asc 升序
-- 分页,只显示5条数据
-- limit 起始值,页面大小
limit 0,5
-- 连接查询
SELECT
ex.`studentName` AS '学号',
eb.`examSubjectName` AS '科目名',
ex.`examFraction` AS '分数'
FROM
`exam` AS ex
INNER JOIN `examsubject` AS eb ON eb.`examSubjectId` = ex.`examName`
where eb.`examSubjectName` = '高等化学3'
-- order by- 通过哪个字段排序
-- order by st.`id` desc-- desc 降序 asc 升序
order by ex.`examFraction` desc-- desc 降序 asc 升序
-- 分页,只显示5条数据
-- limit 起始值,页面大小
-- limit 0,1
子查询
where(固定的,希望不是固定的)
在where语句中嵌套一个查询语句
在where中再加(select * from)
-- 子查询
SELECT
`studentName` AS '学号',
`examName` AS '科目名',
`examFraction` AS '分数'
FROM
`exam`
WHERE
`examName` = ( SELECT `examSubjectId` FROM `examsubject` WHERE `examSubjectName` = '高等化学3' )
-- 分数小于60分的学生的学号,和姓名
SELECT
`id`,
`name`
FROM
`student` st
WHERE
id IN ( SELECT studentName FROM exam WHERE examFraction < 60 -- AND examName = ( SELECT examSubjectId FROM examsubject WHERE examSubjectName = '高等化学3' )
)
多数据多表的情况下连接查询会更效率,但少数据,效率变化不明显,但子查询更直观
-- 查询高等语文3的前5名同学 (学号,姓名,分数)
-- 连表查询
SELECT
s.`id`,
s.`name`,
e.`examFraction`,
es.`examSubjectName`
FROM
`exam` e
LEFT JOIN `student` s ON e.studentName = s.id
LEFT JOIN `examsubject` es ON es.examSubjectId = e.examName
WHERE
es.examSubjectId = '12'
AND examFraction > '80'
ORDER BY
examFraction DESC
LIMIT 0,
5
-- 子查询
SELECT
s.`id`,
s.`name`
FROM
student s
WHERE
s.id IN ( SELECT studentName FROM exam WHERE examFraction > '80' AND examName = ( SELECT examSubjectId FROM examsubject WHERE examSubjectName = '高等语文3' ) )
分组和过滤
-- 不通课程,平均分,最高分,最低分
select `examSubjectName`,avg(`examFraction`) as '平均分',max(`examFraction`),min(`examFraction`)
from `exam`
INNER JOIN `examsubject` ON `examName` = `examSubjectId`
GROUP BY `examName` -- 通过什么来分组
having 平均分 > 60
函数 mySql方法
链接: sql方法官网.
常用函数 (不常用)
-- 常用函数
-- 数学运算
SELECT
abs( - 8 ) AS '绝对值',
sign( 8 ) AS '判断段符号 0-0 1-正 -1-负',
ceiling( 15.5 ) AS '15.5向上取整',
floor( 15.5 ) AS '15.5向下取整',
rand( ) AS '随机数',
round( rand( ) * 10 ) AS '随机数 0~10',
floor( rand( ) * 10 ) AS '随机数 0~9',
ceiling( rand( ) * 10 ) AS '随机数 1~10',
ceiling( rand( ) * 2 ) + 5 AS 'ceiling(rand()*需要的个数) + 从几开始',
'over' AS 'over'
-- 字符串函数
SELECT
char_length( '12' ) AS '字符串长度',
concat( '12', '45', '78' ) AS '拼接字符串',
INSERT ( 'abcdefg', 2, 2, '123456' ) AS '查询,在某个位置替换几个字符',
lower( 'Where' ) AS '转小写',
upper( 'Where' ) AS '转大写',
instr( 'Where', 'er' ) AS '查字符位置',
REPLACE ( 'Where', 'er', 're' ) AS '替换',
substr( 'Where', 2, 2 ) AS '截取字符串,位置,长度',
REVERSE ( 'Where' ) AS '反转',
'over' AS 'over'
-- 替换张为赵 不改变原表数据
select REPLACE ( `name`, '张', '赵' ) AS '替换后' from `student` where name like '张%'
-- 时间和日期函数 (重要)
SELECT
curDate( ) AS '当前日期',
CURRENT_TIME ( ) AS '当前时间',
NOW( ) AS '现在时间',
LOCALTIME ( ) AS '本地时间',
YEAR ( NOW( ) ) AS '年',
MONTH ( NOW( ) ) AS '月',
DAY ( NOW( ) ) AS '日',
HOUR ( NOW( ) ) AS '时',
MINUTE ( NOW( ) ) AS '分',
SECOND ( NOW( ) ) AS '秒',
'over' AS 'over'
--
-- 系统
SELECT
SYSTEM_USER( ) AS '数据库用户',
USER ( ) AS '数据库用户',
version( ) AS '数据库版本',
'over' AS 'over'
聚合函数 (常用)
函数名称 | 描述 |
---|---|
count() | 计数 |
sum() | 求和 |
avg() | 平均值 |
max() | 最大值 |
min() | 最小值 |
··· | ··· |
count
执行效率上
◆列名为主键, count(列名)会比 count(1)快
◆列名不为主键, count(1)会比 count(列名)快
◆如果表多个列并且没有主键,则 count(1)的执行效率优于 count()
◆如果有主键,则 select count(主键)的执行效率是最优的
◆如果表只有一个字段,则 select count()最优
执行效果上
◆count(*)包括了所有的列,相当于行数,在统计结果的时候,不会忽略列值为NULL
◆count(1)包括了忽略所有列,用1代表代码行,在统计结果的时候,不会忽略列值为NULL
◆count(列名)只包括列名那一列,在统计结果的时候,会忽略列值为空(这里的空不是只空字符串或者0,而是表示nu)的计数,即某个字段值为NUL时,不统计
代码
-- 聚合函数
-- 查询表中有多少个记录
select count(`email`) from `student`; -- 指定列 会忽略所有的null
select count(*) from `student`; -- * 不会忽略所有的null 本质 计算行数
select count(1) from `student`; -- 1 不会忽略所有的null 本质 计算行数
select sum(`examFraction`) as '总和' from exam; -- 求和
select avg(`examFraction`) as '平均数' from exam; -- 平均数
select max(`examFraction`) as '最高分' from exam; -- 最高分
select min(`examFraction`) as '最低分' from exam; -- 最低分