SQLServerGROUPBY分组查询和INNERJOIN…ON连接查询
SQL Server分组查询和连接查询
⼀,使⽤GROUP BY进⾏分组查询
以上这种类型的查询,在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;
⼆,多列分组查询
例如要统计每个学期的男、⼥学⽣的⼈数,则理论上先把每个学期分开,再针对每个学期,把男、⼥学⽣⼈数各⾃统计,也就是需要按照两个列进⾏分组:所属年级和性别。
T-SQL语句如下:
SELECT COUNT(*)AS⼈数,Gradeld AS年级,Sex AS性别FROM Student1
GROUP BY Gradeld,Sex
groupby分组ORDER BY Gradeld;
三,使⽤HAVING⼦句进⾏分组筛选
例如要查询年级总⼈数超过15年级。
⾸先可以通过分组查询获取每个年级的总⼈数,对应的T-SQL语句如下。
SELECT COUNT(*)AS⼈数,Gradeld AS年级
FROM Student1
GROUP BY Gradeld
HAVING COUNT(*)>15;
四,多表连接查询的分类
以下是⼏种常见的连接查询⽅式:内连接、外连接
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;
这就是我们学⽣表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;
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;
--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;
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论