二十八 DQL (二)

二十八章-- 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是对分组后的数据进行筛选

猜你喜欢

转载自blog.csdn.net/L097_/article/details/90678795
DQL