二十八章-- DQL (二)
DQL标准语法结构:编写DQM一定要按照此语法的顺序来实现!
SELECT [ALL|DISTINCT] ALL表示查询出所有的内容 DISTINCT去重
{*|表名.*|表名.字段名[AS 别名][,...]} 指定查询出的字段
FROM
表名[AS 别名][,表1...AS 别名]
[INNER|[LEET|RIGHT][OUTER] JOIN 另一张表名[AS 别名] ON 关联条件]
[WHERE 条件]
[GROUP BY 分组字段[,...]]
[HAVING 给分组后的数据进行条件筛选]
[ORDER BY 排序字段[,...]]
[LIMIT [startIndex,]pageSize]
一.掌握排序查询 order by
排序:成绩、销量、排行榜、距离、价格
默认条件下为升序排序 即ASC (Ascend) 降序DESC(Descer)
需求:查询出学生姓名、课程名称、成绩、并且按照成绩进行降序排序
使用隐式内连接
SELECT
stu.stuName,sub.subjectName,r.result
FROM
result r,student,stu,`subject`sub
WHERE
r.stuId = stu.stuId AND r.subjectId = sub.subjectId
ORDER BY
r.result DESC; (降序)
需求:查询出学生姓名、课程名称、成绩、并且按照成绩进行降序排序,如果成绩想同也按照时间降序
SELECT
stu.stuName,sub.subjectName,r.result,r.examDate
FROM
result r,student,stu,`subject`sub
WHERE
r.stuId = stu.stuId AND r.subjectId = sub.subjectId
ORDER BY
r.result DESC,r.examDate DESC;
二.掌握限制查询(分页)limit
limit startIndex起始索引<从0开始>,pageSize --分页场景
--需求:只想看前两天的学生信息
SELECT
*
FROM
student
LIMIT0,2; ---如果offset是从0开始,那么可以省略-> limito 2;
分页:因为数据量比较大的时候,如果吧所有数据显示在一页上,那么不利于阅读,且不利于定位查找。所以要对数据进行分页。
假设有20条数据 现在可以将数据拆分成4条每页,则有5页
假设有21条数据 现在可以将数据拆分成4条每页,则有6页
—【后续在java web对其进行业务实现】
LIMIT 可以再我们的MySQL中实现分页的数据查询/指定页码的数据查询
需求:现在学生信息要求每页2条 想查看第一页的信息
SELECT * FROM student LIMIT 0,2;
需求:现在学生信息要求每页2条 想查看第二页的信息
SELECT * FROM student LIMIT 2,2;
需求:现在学生信息要求每页2条 想查看第三页的信息
SELECT * FROM student LIMIT 4,2;
*页码和起始索引的计算公式:(页码-1)* 显示条数
startIndex = (currentPage - 1)* pageSize;
三.掌握MySQL子查询
子查询:在一个查询中又嵌套了其他的查询,那么嵌套查询就被成为子查询,而外层的查询就成为父查询。
子查询可以任意嵌套!可以出现在INSERT UPDATE DELETE WHERE 等中…
建议在初期写子查询时,先将查询进行步骤化!
需求:查询在高等数学考试中成绩比张三高的学生的姓名信息
SELECT
stuId
FROM
result
WHERE
subjectId = 1
AND
result > 86;
-------------------------------------------------
1.查询高等数学的课程编号
SELECT
subjectId
FROM
`subject`
WHERE
subjectName = '高等数学';
-------------------------------------------------
2.查询张三的高数考试成绩
SELECT
result
FROM
result
WHERE
stuId = (SELECT stuId FROM student WHERE stuName = '张三')
AND subjectId = (SELECT subjectId FROM `subject` WHERE subjectName = '高等数学');
-------------------------------------------------
3.整合 分别将subject = 1 和 subjectName = '高等数学' 中的 1 和 高等数学替换掉
SELECT
r.stuId,stu.stuName
FROM
result r,student stu
WHERE
r.stuId = stu.stuId
AND
subjectId = (
SELECT subjectId FROM `subject` WHERE subjectName = '高等数学'
)
AND
result > (
SELECT result FROM result WHERE stuId = (
SELECT stuId FROM student WHERE stuName = '张三'
)
AND subjectId = (
SELECT subjectId FROM `subject` WHERE subjectName = '高等数学'
)
);
使用子查询解决 连表查询 要求查询学生姓名、年级名称
--使用隐式内连接:
SELECT
stu.stuName,g.gradeName
FROM
student stu,grade g
WHERE
stu.gradeId = g.gradeId;
-------------------------------------------------
使用子查询解决:
SELECT
stu.stuName,
(SELECT g.gradeName FROM grade g WHERE g.gradeId = stu.gradeId) AS gradeName
FROM
student stu;
四.掌握MySQL常用函数
常用的字符串函数
4.1 字符串拼接
SELECT CONCAT('这是','MySQL','数据库')
-> 这是MySQL数据库
4.2字符串的替换
SELECT REPLACE('这是MySQL数据库','MySQL',Oracle')
-> 这是Oracle数据库
4.3去除左侧空格
SELECT LTRIM(' Hello word ')
-> (Hello word )
4.4获取字符串长度
SELECT LENGTH('Hello');
-> 5
4.5 截取字符串substr(str,pos)索引默认从1开始
SELECT SUBSTR('Hello word',5); --从第5个开始截取直到最后
-> o word
SUBSTR(str,pos,len)
SELECT SUBSTR('Hello World',5,3);--从第五个开始算,截取三个字符
-> o w
常用的数学函数
4.6获取随机数 Math.random();
SELECT RAND();
4.7向上取整
SELECT CEIL(20.4);
-> 21
向下取整
SELECT FLOOR(20.7);
-> 20
4.8四舍五入
SELECT ROUND(20.5);
->21
SELECT ROUND(20.76,1);--取小数点后1位
-> 20.8
常用的时间函数
4.9获取当前时间
SELECT NOW();
4.10 获取各种时间信息的函数
SELECT MONTH(NOW());--当前时间所属月份
SELECT YEAR(NOW());--当前时间所属年份
SELECT DAY(NOW());--当前时间所属该月第几天
SELECT HOUR(NOW());--当前时间所属该天第几个小时(又称多少点)
SELECT MINUTE(NOW());--当前时间所属该小时内第几分钟
SELECT SECOND(NOW());--当前时间所属该分钟内第几秒
4.11 日期转换
SELECT DATE_FORMAT(NOW(),'%Y-%m-%d');
-- 把当前时间转换成 ---年,--月--天 格式
4.12 计算时间差额
SELECT DATEDIFF(NOW(),'2019-05-25');
-- 当前时间减去所输入的时间
常用的聚合/统计查询
4.13 求年级编号最大的
SELECT MAX(gradeId) FROM grade;
4.14 求年级编号最小的
SELECT MIN(gradeId) FROM grade;
4.15求平均分
SELECT AVG(result) FROM result WHERE subjectId = 1;
-- 求subjectId = 1 的平均分
4.16 求和
SELECT SUM(result) FROM result WHERE subjectId = 1;
-- 求subjectId = 1 的和
4.17 计算学生总人数
SELECT COUNT(*) FROM student;
SELECT COUNT(stuId) FROM student;【推荐】
SELECT COUNT(1) FROM student;
五.掌握分组查询 group by
注意事项:在分组查询的查询字段中 不要出现与分组查询无关的字段值
需求:计算各个年级的学生人数
SELECT gradeId,COUNT(1) FROM student GROUP BY gradeId;
需求:查看各个年级的总人数 且 要求查看对应的学生名列表
SELECT gradeId,COUNT(1) GROUP_CONCAT(stuName) FROM student GROUP BY gradeId;
需求:计算各个年级各个性别的人数
SELECT gradeId,gender,COUNT(1) FROM student GROUP BY gradeId,gender;
需求:查询年级的学生人数大于1人的年级名称
SELECT
stu.gradeId,count(1),g.gradeName
FROM
student stu,grade g
WHERE
stu.gradeId = g.gradeId
GROUP BY
gradeId
HAVING
count(1) > 1;
having和where的区别?
相同点: 都可以用来进行条件判断 筛选行数
不同点:
位置不同:
where是在分组之前,having是在分组之后。
条件筛选不同:
where是给from查询到的数据进行条件筛选,而having是对分组后的数据进行筛选