SQL Server GROUP BY 分组查询和 INNER JOIN …ON 连接查询

SQL Server分组查询和连接查询

使用GROUP BY进行分组查询

多列分组查询

使用HAVING子句进行分组筛选

多表连接查询的分类

外连接查询

一,使用GROUP BY进行分组查询

SQL Server GROUP BY 分组查询和 INNER JOIN …ON 连接查询_第1张图片

以上这种类型的查询,在SQL Server中叫作分组查询,分组查询采用GROUP BY子句来实现。
以我的SubjectId进行分组,显示每个SubjectId中SudentResult(科目成绩)的平均分。
SELECT SubjectId,AVG(SudentResult) as 所有课程平均分 
FROM Result
GROUP BY SubjectId;
注意:如果要进行分组查询就必须和 AVG() 之类的聚合函数函数一起使用否则会报错。
我们再来看个例子
查询男、女学生进行总数的统计,用到聚合函数COUNT()。

首先按照性别列进行分组:GROUP BY Sex。

其次对每个组进行总数的统计,用到聚合函数COUNT()。

T-SQL语句如下:

SELECT COUNT(*) AS 人数,Sex FROM Student1
GROUP BY Sex;

SQL Server GROUP BY 分组查询和 INNER JOIN …ON 连接查询_第2张图片

二,多列分组查询
例如要统计每个学期的男、女学生的人数,则理论上先把每个学期分开,再针对每个学期,把男、女学生人数各自统计,也就是需要按照两个列进行分组:所属年级和性别。
T-SQL语句如下:
SELECT COUNT(*) AS 人数,Gradeld AS 年级,Sex AS 性别 FROM Student1
GROUP BY Gradeld,Sex
ORDER BY Gradeld;

SQL Server GROUP BY 分组查询和 INNER JOIN …ON 连接查询_第3张图片

三,使用HAVING子句进行分组筛选
例如要查询年级总人数超过15年级。

首先可以通过分组查询获取每个年级的总人数,对应的T-SQL语句如下。

SELECT COUNT(*) AS 人数,Gradeld AS 年级 
FROM Student1
GROUP BY Gradeld
HAVING COUNT(*)>15;

SQL Server GROUP BY 分组查询和 INNER JOIN …ON 连接查询_第4张图片

四,多表连接查询的分类
以下是几种常见的连接查询方式:内连接、外连接
1.内连接查询

内连接查询是最典型,最常用的连接查询,它根据表中共同的列来进行匹配。特别是两个表存在主外键关系时通常会使用内连接查询。

2.外连接查询

外连接查询是至少一个表中的所有记录,根据匹配条件有选择性地返回另一张表的记录。

外连接可以是左外连接、右外连接。

内连接查询

内连接查询通常会使用 “=”或“<>”等比较运算符来判断两列数值是否相等,上面所说的根据学生学号来判断学生姓名的连接就是一种内连接。

内连接使用 INNER JOIN …ON 关键字或WHERE子句来进行表之间的关联。内连接查询可以通过两种方式实现。

1.在WHERE子句中指定连接条件

例如,查询学生编号、学生姓名、考试科目和成绩的T-SQL如下。

select s.StudentNo ,s.StudentName,k.SubjectName,r.SudentResult
from Student1 as s,Result as r,Subject as k
where s.StudentNo = r.StudentNo and r.SubjectId = k.SubjectId
order by StudentNo;

SQL Server GROUP BY 分组查询和 INNER JOIN …ON 连接查询_第5张图片

这就是我们学生表Student1、科目表表Subject和成绩Result表的连接查询。
2.在FROM子句中使用INNER JOIN …ON

上面的查询也可以通过以下的INNER JOIN …ON子句来实现。

select s.StudentNo ,s.StudentName,k.SubjectName,r.SudentResult from Student1 as s
inner join Result as r on s.StudentNo = r.StudentNo
inner join Subject as k on r.SubjectId = k.SubjectId
order by StudentNo; 
五,外连接查询
外连接查询包括左外连接查询和右外连接查询两种
1.左外连接查询

左外连接查询的结果包括 LEET JOIN 子句中指定的左表的所有行,而不仅仅是连接列所匹配的行。若左表的某一行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列均为空值。

左外连接查询使用LEFT JOIN…ON或LEFT OUTER JOIN…ON关键字来进行表之间的关联。例如,要统计所有学生的考试成绩情况,要求显示所有参加考试学生的每次考试分数,没有参加考试的学生也要显示出来。这时候,以学生信息表为主表(有时也叫左表)、学生成绩表为从表的左外连接查询的T-SQL语句如下:

select s.StudentNo ,s.StudentName,k.SubjectName,r.SudentResult from Student1 as s
left join Result as r on s.StudentNo = r.StudentNo
left join Subject  as k on k.Gradeid = s.Gradeld 
order by StudentNo;

SQL Server GROUP BY 分组查询和 INNER JOIN …ON 连接查询_第6张图片

2.右外连接查询

右外连接查询与左外链接查询类似,只不过要包含右表中所有匹配的行。若右表中有的项在左表中没有对应的项,则以NULL值填充。

右外连接查询使用RIGHT JOIN…ON或RIGHT OUTER JOIN…ON关键字来进行表之间的关联。例如,在某数据库中,存在书籍表Titles和出版商表Publishers之间的右外连接将包括所有的出版商,在表Titles中没有书名的出版商(很久没出书了)也会被列出。

SELECT Titles.Title_id,Titles.Title,Publishers.Pub_name
FROM titles
RIGHT OUTER JOIN Publishers ON Titles.Pub_id = Publishers.Pub_id;
区别:
1.左外连接查询的结果包括 LEET JOIN 子句中指定的左表的所有行,而不仅仅是连接列所匹配的行。若左表的某一行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列均为空值。
2.右外连接查询与左外链接查询类似,只不过要包含右表中所有匹配的行。若右表中有的项在左表中没有对应的项,则以NULL值填充 (在虚拟表中不显示该项)。
--1.左外连
select s.StudentNo ,s.StudentName,r.SudentResult from Student1 as s
left join Result as r on s.StudentNo = r.StudentNo
order by StudentNo;

SQL Server GROUP BY 分组查询和 INNER JOIN …ON 连接查询_第7张图片

--2.右外连
select s.StudentNo ,s.StudentName,r.SudentResult from Student1 as s
right join Result as r on s.StudentNo = r.StudentNo
order by StudentNo;

SQL Server GROUP BY 分组查询和 INNER JOIN …ON 连接查询_第8张图片

你可能感兴趣的:(sql,server,sql,sqlserver,数据库)