#子查询关键点
#子查询语句可以嵌套在SQL语句中任何表达式出现的位置。
#在SELECT语句中,子查询可以被嵌套在SELECT语句的列、表和查询条件中,即SELECT子句、FROM子句、WHERE子句、GROUP BY子句和HAVING子句中。
#子查询在SELECT子句和FROM子句中的使用方法:
#(1)嵌套在SELECT语句的SELECT子句中的子查询语法格式如下:
SELECT(子查询)FROM 表名 #子查询结果为单行单列,但不必指定列的别名
#(2)嵌套在SELECT语句的FROM子句中的子查询语法格式如下。
SELECT*FROM(子查询)AS 表的别名 #子查询嵌套在FROM子句中时必须为表指定别名,一般返回多行多列数据记录,可以当做一张临时表
#分组查询
SELECT subject_no AVG(student_result)AS 课程平均成绩 FROM result GROUP BY subject_no
#查询男女学生的人数各是多少
#首先按照性别列进行分组:GROUP BY SEX;其次对每个组进行总是的统计,用到聚合函数COUNT()。
SELECT COUNT(*)AS 人数,sex FROM student GROUP BY sex;
#查询每个县级的总人数。
SELECT COUNT(*)AS 年级人数,grade_id FROM student GROUP BY grade_id
#使用HAVING子句进行分组筛选
#(1)查询年级总人数超过2个人的年级
SELECT COUNT(*)AS 人数,grade_id AS 年级 FROM student GROUP BY grade HAVING COUNT(*)>2
#(2)查询平均分及格的课程信息
SELECT subject_no AS 课程编号,AVG(student_result) AS 课程平均成绩 FROM result GROUP BY subject_no HAVING AVG(student_result)>=60
#(3)查询每门课程及格总人数和及格学生的平均分。
SELECT COUNT(*)AS 人数,AVG(student_result)AS 平均分,subject_no AS 课程 FROM result WHERE student_result>=60 GROUP BY subject_no
#(4)查询没门课程及格总人数和及格平均分在80分以上的记录。
SELECT COUNT(*)AS 人数,AVG(student_result)AS 平均分,subject_no AS 课程 FROM result WHERE student_result>=60 GROUP BY subject_no
HAVING AVG(student_result)>=80
#(5)在按照部分分类的员工表中,查询“有两个及以上员工的工资不低于2000元的部门编号”。
#利用WHERE子句首先滤除工资低于2000元的记录,然后按照部门进行分组,最后对分组后的记录进行条件限定
SELECT 部门编号, COUNT(*)FROM 员工信息表
WHERE 工资>=2000 GROUP BY 部门编号 HAVING COUNT(*)>1
#子查询语句可以嵌套在SQL语句中任何表达式出现的位置。
#在SELECT语句中,子查询可以被嵌套在SELECT语句的列、表和查询条件中,即SELECT子句、FROM子句、WHERE子句、GROUP BY子句和HAVING子句中。
#子查询在SELECT子句和FROM子句中的使用方法:
#(1)嵌套在SELECT语句的SELECT子句中的子查询语法格式如下:
SELECT(子查询)FROM 表名 #子查询结果为单行单列,但不必指定列的别名
#(2)嵌套在SELECT语句的FROM子句中的子查询语法格式如下。
SELECT*FROM(子查询)AS 表的别名 #子查询嵌套在FROM子句中时必须为表指定别名,一般返回多行多列数据记录,可以当做一张临时表
#分组查询
SELECT subject_no AVG(student_result)AS 课程平均成绩 FROM result GROUP BY subject_no
#查询男女学生的人数各是多少
#首先按照性别列进行分组:GROUP BY SEX;其次对每个组进行总是的统计,用到聚合函数COUNT()。
SELECT COUNT(*)AS 人数,sex FROM student GROUP BY sex;
#查询每个县级的总人数。
SELECT COUNT(*)AS 年级人数,grade_id FROM student GROUP BY grade_id
#使用HAVING子句进行分组筛选
#(1)查询年级总人数超过2个人的年级
SELECT COUNT(*)AS 人数,grade_id AS 年级 FROM student GROUP BY grade HAVING COUNT(*)>2
#(2)查询平均分及格的课程信息
SELECT subject_no AS 课程编号,AVG(student_result) AS 课程平均成绩 FROM result GROUP BY subject_no HAVING AVG(student_result)>=60
#(3)查询每门课程及格总人数和及格学生的平均分。
SELECT COUNT(*)AS 人数,AVG(student_result)AS 平均分,subject_no AS 课程 FROM result WHERE student_result>=60 GROUP BY subject_no
#(4)查询没门课程及格总人数和及格平均分在80分以上的记录。
SELECT COUNT(*)AS 人数,AVG(student_result)AS 平均分,subject_no AS 课程 FROM result WHERE student_result>=60 GROUP BY subject_no
HAVING AVG(student_result)>=80
#(5)在按照部分分类的员工表中,查询“有两个及以上员工的工资不低于2000元的部门编号”。
#利用WHERE子句首先滤除工资低于2000元的记录,然后按照部门进行分组,最后对分组后的记录进行条件限定
SELECT 部门编号, COUNT(*)FROM 员工信息表
WHERE 工资>=2000 GROUP BY 部门编号 HAVING COUNT(*)>1