Mysql高级查询

EXISTSNOT 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 '%李%'; 查询名字包含李的所有学生信息.

原文地址:https://www.cnblogs.com/it-xiaoBai/p/10813727.html