链接查询和分组查询
“Group By”从字面意义上理解就是根据“By”指定的规则对数据进行分组,所谓的分组就是将一个“数据集”划分成若干个“小区域”,然后针对若干个“小区域”进行数据处理。
SELECT列表中只能包含:
1.被分组的列
2.位每个分组返回一个值的表达式,如聚合函数
按照年级分组
SELECT GradeId,count(*) AS 人数
FROM student
GROUP BY GradeId
--案例1:统计每学期男女同学的人数
--按照学期分组
--按照性别分组
SELECT COUNT(*) AS 人数,GradeId AS 学期,Gender AS 性别
From Student
GROUP BY GradeId,Gender
ORDER BY GradeId
--说明:可以按照多列分组,列名使用逗号隔开
--案例2:如何过得总人数超过15人的年级
SELECT COUNT(*) AS 总人数,GradeId AS 年级
FROM Student
Group by Gradeid
Having COUNT(*)>4
--说明:where 列名条件 Having 聚合函数条件,Having一般和Group by连用,位置固定
WHERE与HAVING对比
WHERE子句:
用来筛选FROM子句中指定的操作所产生的行
GROUP BY子句:
用来分组 WHERE 子句的输出
HAVING子句:
用来从分组的结果中筛选行
---案例1:统计平均分大于60分 的课程号和平均分
SELECT SubjectNO AS 课程号,AVG(SubjectResult) AS 平均分
From Result
Where SubjectResult>=60
常用的表连接查询
1.内连接(INNER JOIN)
2.外连接
2.1左外连接(LEFT JOIN)
2.2右外连接(RIGHT JOIN)
3.内连接
内连接使用比较运算符根据每个表的通用列中的值匹配两个表中的行
--案例:使用内连接完成 查询学员姓名,科目号和分数
--表连接: 主键列=外键列
SELECT s.studentName AS 姓名,SubjectNo as 科目号,StudentResult AS 分数
FROM Student AS s,Result AS R
WHERE s.StudentNo=r.Result
/*表连接:
格式:SELECT 表2.列1,表2.列2,表1.列名2
FROM 表1 AS 别名,表2 AS 别名
WHERE 表1.主键列=表2.外键列
*/
--使用内连接方式完成
SELECT s.StudentName AS 姓名,SubjectNo as 科目号,StudentResult AS 分数
FROM Student AS s
INNER JOIN result AS r
ON s.StudentNO=r.Result
/*
SELECT 表2.列名1,表2.列名2,表1.列名3
FROM 表1 AS 别名
INNER JOIN 表2
ON 表1.主键列=表2.外键列
*/
4.外连接
4.1.左外连接
--左外连接
--查询所有学生的考试成绩和姓名,科目号
--方法1:
SELECT StudentName AS 姓名,SubjectNo AS 科目号,StudentResult AS 成绩
FROM Student
left ourer join Result
on student.studentNo=result.studentNo
--方法2:
SELECT StudentName AS 姓名,SubjectNo AS 科目号,StudentResult AS 成绩
FROM Result
left ourer join Student
on student.studentNo=result.studentNo
主表(左表)Student中的数据逐条匹配表Result中的数据
1.匹配,返回到结果集
2.无匹配,NULL值返回到结果集
/*
SELECT
FROM 主表
LEFT OUTER JOIN 从表
ON 主表.通用列=从表.通用列
*/
SELECT列表中只能包含:
1.被分组的列
2.位每个分组返回一个值的表达式,如聚合函数
按照年级分组
SELECT GradeId,count(*) AS 人数
FROM student
GROUP BY GradeId
--案例1:统计每学期男女同学的人数
--按照学期分组
--按照性别分组
SELECT COUNT(*) AS 人数,GradeId AS 学期,Gender AS 性别
From Student
GROUP BY GradeId,Gender
ORDER BY GradeId
--说明:可以按照多列分组,列名使用逗号隔开
--案例2:如何过得总人数超过15人的年级
SELECT COUNT(*) AS 总人数,GradeId AS 年级
FROM Student
Group by Gradeid
Having COUNT(*)>4
--说明:where 列名条件 Having 聚合函数条件,Having一般和Group by连用,位置固定
WHERE与HAVING对比
WHERE子句:
用来筛选FROM子句中指定的操作所产生的行
GROUP BY子句:
用来分组 WHERE 子句的输出
HAVING子句:
用来从分组的结果中筛选行
---案例1:统计平均分大于60分 的课程号和平均分
SELECT SubjectNO AS 课程号,AVG(SubjectResult) AS 平均分
From Result
Where SubjectResult>=60
常用的表连接查询
1.内连接(INNER JOIN)
2.外连接
2.1左外连接(LEFT JOIN)
2.2右外连接(RIGHT JOIN)
3.内连接
内连接使用比较运算符根据每个表的通用列中的值匹配两个表中的行
--案例:使用内连接完成 查询学员姓名,科目号和分数
--表连接: 主键列=外键列
SELECT s.studentName AS 姓名,SubjectNo as 科目号,StudentResult AS 分数
FROM Student AS s,Result AS R
WHERE s.StudentNo=r.Result
/*表连接:
格式:SELECT 表2.列1,表2.列2,表1.列名2
FROM 表1 AS 别名,表2 AS 别名
WHERE 表1.主键列=表2.外键列
*/
--使用内连接方式完成
SELECT s.StudentName AS 姓名,SubjectNo as 科目号,StudentResult AS 分数
FROM Student AS s
INNER JOIN result AS r
ON s.StudentNO=r.Result
/*
SELECT 表2.列名1,表2.列名2,表1.列名3
FROM 表1 AS 别名
INNER JOIN 表2
ON 表1.主键列=表2.外键列
*/
4.外连接
4.1.左外连接
--左外连接
--查询所有学生的考试成绩和姓名,科目号
--方法1:
SELECT StudentName AS 姓名,SubjectNo AS 科目号,StudentResult AS 成绩
FROM Student
left ourer join Result
on student.studentNo=result.studentNo
--方法2:
SELECT StudentName AS 姓名,SubjectNo AS 科目号,StudentResult AS 成绩
FROM Result
left ourer join Student
on student.studentNo=result.studentNo
主表(左表)Student中的数据逐条匹配表Result中的数据
1.匹配,返回到结果集
2.无匹配,NULL值返回到结果集
/*
SELECT
FROM 主表
LEFT OUTER JOIN 从表
ON 主表.通用列=从表.通用列
*/