SELECT语法——排序
语法:SELECT [ALL | DISTINCT]
{ * | table.* | [ table.field1 [ as alias1] [, table.field2 [as alias2]][, …]] }
FROM table_name [ as table_ alias ]
[ left|out|inner join table_name2 ] #多表连接查询
[ WHERE … ] #指定结果需满足的条件
[ GROUP BY …] #指定结果按照哪几个字段来分组
[ HAVING …] #过滤分组的记录必须满足的次要条件
[ ORDER BY… ] #指定查询记录按一个或者多个条件排序
[ LIMIT { [ offset,] row_count | row_count OFFSET offset }] ; #分页查询
注意:[ ] 括号代表可选的;
{ } 括号代表必须的;
# MySQL语句中的注释符,也可以用 /*该处为注释*/
ORDER BY 子句
ORDER BY子句:实现按一定顺序显示查询结果。
排序可以是升序(ASC)或者降序(DESC),如果不指定ASC或DESC,结果集默认按ASC升序排序。
示例:#把成绩都降低10%后加5分,再查询及格成绩,并按照成绩从高到低排序。
SELECT studentno AS 学生编号,(studentresult*0.9+5 ) AS 综合成绩
FROM `result`
WHERE (`studentresult`*0.9+5) >=60
ORDER BY studentresult DESC;
如果要在学生成绩排序的基础上,再按照课程编号进行排序。怎么办?
示例:#把成绩都降低10%后加5分,再查询及格成绩,并按照成绩从高到低排序,如果成绩
#相同,再按照课程编号进行排序。
SELECT studentno AS 学生编号,(studentresult*0.9+5 ) AS 综合成绩
FROM `result`
WHERE (`studentresult`*0.9+5) >=60
ORDER BY studentresult DESC,subjectno;
SELECT语法——分页查询
语法:SELECT [ALL | DISTINCT]
{ * | table.* | [ table.field1 [ as alias1] [, table.field2 [as alias2]][, …]] }
FROM table_name [ as table_ alias ]
[ left|out|inner join table_name2 ] #多表连接查询
[ WHERE … ] #指定结果需满足的条件
[ GROUP BY …] #指定结果按照哪几个字段来分组
[ HAVING …] #过滤分组的记录必须满足的次要条件
[ ORDER BY… ] #指定查询记录按一个或者多个条件排序
[ LIMIT { [ offset,] row_count | row_count OFFSET offset }] ; #分页查询
LIMIT 子句:MySQL查询语句中使用LIMIT子句限制结果集
示例:#查询课程编号为1的,考试日期为2019年的考试的前5名同学的学号和成绩
#应用1:限制显示的结果集的行数(小说排行榜 新闻只显示最新的5条)
SELECT studentno,studentresult
FROM result
WHERE subjectno=1 AND YEAR(examdate)=2019
ORDER BY studentresult DESC
LIMIT 5
LIMIT 子句:MySQL查询语句中使用LIMIT子句限制结果集
示例:#应用2:分页查询(分页显示数据)
#查询学生表的学号、姓名、电话 ,每页显示2条记录
#第一条记录的偏移量为0
#第一页 #偏移量 0 1
SELECT studentno,studentname,phone FROM student
LIMIT 0,2
SELECT语法——分组查询
语法:SELECT [ALL | DISTINCT]
{ * | table.* | [ table.field1 [ as alias1] [, table.field2 [as alias2]][, …]] }
FROM table_name [ as table_ alias ]
[ left|out|inner join table_name2 ] #多表连接查询
[ WHERE … ] #指定结果需满足的条件
[ GROUP BY …] #指定结果按照哪几个字段来分组
[ HAVING …] #过滤分组的记录必须满足的次要条件
[ ORDER BY… ] #指定查询记录按一个或者多个条件排序
[ LIMIT { [ offset,] row_count | row_count OFFSET offset }] ; #分页查询
GROUP BY分组
GROUP BY作用:使用GROUP BY关键字对查询结果分组
对所有的数据进行分组统计
分组的依据字段可以有多个,并依次分组
与HAVING结合使用,进行分组后的数据筛选
提示:GROUP BY子句经常和聚合函数结合使用完成分组统计功能
WHERE与HAVING对比:
WHERE子句
用来筛选 FROM 子句中指定的操作所产生的行
GROUP BY子句
用来分组 WHERE 子句的输出
HAVING子句
用来从分组的结果中筛选行
子查询
子查询是一个嵌套在 SELECT、INSERT、UPDATE 或 DELETE 语句或其他子查询中的查询。
子查询在WHERE语句中的一般用法;
语法:SELECT … FROM 表名 WHERE 字段X 比较运算符(子查询)
注意 :习惯上,外层查询称为父查询,圆括号中嵌入的查询称为子查询。 执行SQL语句时,先执行子查询,返回所有来自子查询的结果,再执行外围的父查询,返回查询的最终结果(即求解方式为由里及外)。
将子查询和比较运算符联合使用,必须保证子查询返回的值不能多于一个(否则会出现提示信息:错误代号1242 Subquery returns more than 1 row)。
IN子查询
IN后面的子查询可以返回多条记录。
常用IN替换等于(=)的子查询。
语法:SELECT … FROM 表名 WHERE 字段X IN(子查询)
示例:#查询课程名称为”JavaOOP”且考试分数大于60分的学生信息(学号、姓名和联系电话)。 SELECT studentno,studentname,phone FROM student WHERE studentno IN
(SELECT studentno FROM result WHERE studentresult>60 AND
subjectno=(SELECT subjectno FROM `subject`WHERE subjectname='JAVAOOP'))
EXISTS 子查询
EXISTS 子查询:带有EXISTS的子查询不返回任何记录的数据,只返回逻辑值“True”或“False”。
语法:SELECT …… FROM 表名 WHERE EXISTS(子查询);
注意:子查询有返回结果: EXISTS子查询结果为TRUE,执行外层查询;
子查询无返回结果: EXISTS子查询结果为FALSE, 外层查询不执行;
子查询注意事项
任何允许使用表达式的地方都可以使用子查询
嵌套在父查询SELECT语句的子查询可包括
SELECT子句
FROM子句
WHERE子句
GROUP BY子句
HAVING子句
只出现在子查询中而没有出现在父查询中的列不能包含在输出列中;