Mysql高级查询
EXISTS和NOT EXISTS子查询
EXISTS 子查询
语法:
SELECT * FROM 表名 WHERE EXISTS(子查询);
EXISTS关键字后面可以有任意的子查询,如果有返回结果则为true 否则为false;
EXISTS跟NOT EXISTS语法一样,不过是相同取反操作.
子查询注意事项:
1):子查询语句可以嵌套在任何表达式出现的位置.
例:嵌套在SELECT语句的SELECT子句中的子查询语句:
SELECT (子查询) FROM 表名;
子查询结果为单行单列,但不必指定列别名;
例:前台在SELECT语句的FROM子句中的子查询语句:
SELECT *FROM (子查询) AS 表的别名;
必须为表指定别名,一般返回对行多列数据记录,可以当做一张临时表.
2):只出现在子查询中而没有出现在父查询中的表不能包含在输出列中.
分组查询
使用group by 进行分组查询
#查看每个学员考试的平均分 (根据学员编号来计算平均分)
SELECT studentNo 学员编号 , AVG(StudentResult) 平均成绩 FROM result GROUP BY StudentNo;
进行多列分组查询
#查询每个班班男同学和女同学的人数
SELECT COUNT(*) 人数,sex 性别,gradeID FROM students GROUP BY sex,gradeID;
使用HAVING子句进行分组筛选
#计算平均成绩大于80分以上的学生
SELECT studentNo 学号, AVG(StudentResult) 平均成绩
FROM result GROUP BY studentNo HAVING AVG(StudentResult)>80;
HAVING和WHERE 语句可以在同一个SELECT语句中一起使用,使用顺序如图所示
WHER——> GROUP BY ——> HAVING
在SELECT语句中, WHERE , GROUP BY , HAVING子句和聚合函数执行顺序次序如下,WHERE子句从数据源中去掉不符合其搜索条件的数据,group by 子句搜索数据行到各个组中,统计函数为各个组计算统计值;HAVING子句去掉不符合其组搜索条件的各组数据行.
多表连接查询
多表连接查询的分类
1):内连接查询
a) 在WHERE子句中指定连接条件.
例如:查询全部学生的学习成绩
SELECT students.StudentNo学号,students.StudentName 姓名,result.StudentResult 分数FROM students,result WHERE students.`studentNo`=result.`StudentNo`;
b) 在FROM子句中使用INNER JOIN...ON
SELECT students.StudentNo学号,students.StudentName 姓名,result.StudentResult 分数FROM students INNER JOIN result ON(students.`studentNo`=result.`StudentNo`)
在上面的内连接查询
(1):INNER JOIN用来连接两个表
(2):INNER可以省略
(3):ON用来设置条件
(4):AS用来指定表的 ’别名’ .可写/也可不写.
2):外连接查询
与内连接查询相对的方式称为外连接查询,在外连接中参与连接的表有主从之分,以主表的每行数据匹配从表的数据列,将符合连接条件数据直接返回到结果集中,对那些不符合连接条件的列.将被填上null值后在返回到结果集中.
左外连接查询
左外连接查询的结果集包括LEFT JOIN子句中指定的左表的所有行,而不仅仅是连接列所匹配的行.
左外链接查询使用LEFT JOIN...ON或LEFT OUTER JOIN...ON关键字来进行表之间的关联.
右外连接查询
右外连接查询与左外连接查询类似,只不过要包含右表中所有匹配的行.若右表中有的项在左表中没有对应的项,则以null填充.
右外链接查询使用RIGHT JOIN...ON或RIGHT OUTER JOIN...ON关键字来进行表之间的关联.
模糊查询LIKE
SELECT * FROM students WHERE studentName like '%李%'; 查询名字包含李的所有学生信息.