目录
一、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 }] ; //分页查询
排序可以是升序(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 }] ; //分页查询 offset://偏移量 row_count://显示的记录数 LIMIT //LIMIT 子句:MySQL查询语句中使用LIMIT子句限制结果集 如:SELECT studentno,studentresult FROM result WHERE subjectno=1 AND YEAR(examdate)=2019 ORDER BY studentresult DESC LIMIT 5 //限制显示的结果集的行数,只显示5条
三、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关键字对查询结果分组 对所有的数据进行分组统计 分组的依据字段可以有多个,并依次分组 与HAVING结合使用,进行分组后的数据筛选 GROUP BY子句经常和聚合函数结合使用完成分组统计功能
四、WHERE与HAVING对比
WHERE子句
用来筛选 FROM 子句中指定的操作所产生的行
GROUP BY子句
用来分组 WHERE 子句的输出
HAVING子句
用来从分组的结果中筛选行
五、子查询
基本语法:
SELECT … FROM 表名 WHERE 字段X 比较运算符(子查询)
1.外层查询称为父查询,圆括号中的查询称为子查询。
2.执行SQL语句时,先执行子查询,返回所有来自子查询的结果,再执行外围的父查询,返回查询的最终结果。
3.将子查询和比较运算符联合使用,必须保证子查询返回的值不能多于一个。
1、IN子查询
IN后面的子查询可以返回多条记录。
SELECT … FROM 表名 WHERE 字段X IN(子查询)
2、EXISTS子查询
EXISTS 子查询:带有EXISTS的子查询不返回任何记录的数据,只返回逻辑值“True”或“False”。
有结果为“True”,执行语句;无结果为“False”,不执行语句。
子查询有返回结果: EXISTS子查询结果为TRUE,执行外层查询;
子查询无返回结果: EXISTS子查询结果为FALSE, 外层查询不执行;
SELECT …… FROM 表名 WHERE EXISTS(子查询);
六、多表连接查询
1、内连接
内连接使用比较运算符根据每个表的通用列中的值匹配两个表中的行。
SELECT 字段列表 FROM 表1 INNER JOIN 表2 ON 表1.通用字段名=表2.通用字段名 SELECT 字段列表 FROM 表1 ,表2 WHERE 表1.通用字段名=表2.通用字段名
需要注意的是:
如果两个表中有相同的字段名,必须在列名前加表名。否则将出现 错误代码:1052 Column ‘studentno’ in field
list is ambiguous
查询学生的学号、姓名和成绩,并按照成绩降序排列 //第一种写法 SELECT s.studentno,s.studentname,r.studentresult FROM student AS s INNER JOIN result AS r ON s.studentno=r.studentno ORDER BY r.studentresult DESC //第二种写法 SELECT s.studentno,s.studentname,r.studentresult FROM student AS s,result AS r WHERE s.studentno=r.studentno ORDER BY r.studentresult DESC
2、多表内连接
ELECT 字段列表 FROM 表1 join 表2 on 表1.通用字段名=表2.通用字段名 join 表3 on 表1.通用字段名=表3.通用字段名 join 表4 on 表4.通用字段名=表3.通用字段名;
3、左外连接
左表(表1)的记录将会全部表示出来,而右表(表2)只会显示符合匹配条件的记录。如图:
匹配,返回到结果集
无匹配,NULL值返回到结果集
SELECT 字段列表 FROM 表1 LEFT JOIN 表2 ON 表1.通用字段名=表2.通用字段名
4、右外连接
右外连接:右表(表2)的记录将会全部表示出来,而左表(表1)只会显示符合匹配条件的记录。如图:
匹配,返回到结果集
无匹配,NULL值返回到结果集
SELECT 字段列表 FROM 表1 RIGHT JOIN 表2 ON 表1.通用字段名=表2.通用字段名
5、自连接
自连接查询其实等同于连接查询,需要两张表,只不过它的左表(父表)和右表(子表)都是自己。做自连接查询的时候,是自己和自己连接,分别给父表和子表取两个不同的别名,然后附上连接条件。
SELECT c1.cname AS "父名称",c2.cname AS "子名称" FROM tbl_category AS c1, tbl_category AS c2 WHERE c1.cid = c2.pid;
6、不同的SQL JOIN对比
如图片: