十一、GROUP BY
如果我们的需求是要算出每个人(name)的总成绩(score),那怎么办呢?在这个情况下,我们要做到两件事:第一,我们对于name 及score这两个栏位都要选出。第二,我们需要确认所有的 score都要依照各个 name 来分开算。这个语法为:
SELECT '栏位1', SUM('栏位2')
FROM '表格名'
GROUP BY '栏位1';
查询每个人的总成绩:
select name ,sum(score) from mytest group by name
十二、HAVING
那我们如何对函数产生的值来设定条件呢?举例来说,我们可能只需要知道哪些人的总成绩大于140。在这个情况下,我们不能使用 WHERE 的指令。那要怎么办呢?很幸运地,SQL 有提供一个 HAVING 的指令,而我们就可以用这个指令来达到这个目标。 HAVING 子句通常是在一个 SQL 句子的最后。一个含有 HAVING 子句的 SQL 并不一定要包含 GROUP BY 子句。HAVING 的语法如下:
SELECT '栏位1', SUM('栏位2')
FROM '表格名'
GROUP BY '栏位1'
HAVING (函数条件);
请读者注意: GROUP BY 子句并不是一定需要的。
找出总成绩大于140的学生:
select name ,sum(score) from mytest group by name having sum(score) > 140
十三,AS (别名)
as是别名关键字. 一般我们是这么使用.
select 字段 as 别名
select 字段 别名
select 别名=字段
在sqlserver中这三种显示结果都是一模一样的.
但是我们不推荐后两种写法,只推荐第一种写法.
接下来,我们讨论 alias (别名) 在 SQL 上的用处。最常用到的别名有两种: 栏位别名及表格别名。
简单地来说,栏位别名的目的是为了让 SQL 产生的结果易读。在之前的例子中,每当我们有总成绩时,栏位名都是 SUM(score)。 虽然在这个情况下没有什么问题,可是如果这个栏位不是一个简单的总合,而是一个复杂的计算,那栏位名就没有这么易懂了。若我们用栏位别名的话,就可以确认结果中的栏位名是简单易懂的。
第二种别名是表格别名。要给一个表格取一个别名,只要在 FROM 子句中的表格名后空一格,然后再列出要用的表格别名就可以了。这在我们要用 SQL 由数个不同的表格中获取资料时是很方便的。这一点我们在之后谈到连接 (join) 时会看到。
我们先来看一下栏位别名和表格别名的语法:
SELECT '表格别名'.'栏位1' '栏位别名'
FROM '表格名' AS'表格别名';
为了更直观展示学生总成绩,我们把name用“姓名”,sum(score)用“总成绩”表示,表格用别名a表示
select a.name as '姓名',sum(score) as '总成绩' from mytest as a group by name
十四、两张表联合查询(join)
现在我们介绍连接 (Join) 的概念。要了解连接,我们需要用到许多我们之前已介绍过的指令。我们先假设我们有以下的两个表格
表一、mytest记录学生成绩:
select a.name, b.class ,sum(a.score)
from mytest as a ,s_info as b
where a.name = b.name
group by a.name
十五、外连接(OUTER JOIN):
外连不但返回符合连接和查询条件的数据行,还返回不符合条件的一些行。外连接分三类:左外连接(LEFT OUTER JOIN)、右外连接(RIGHT OUTER JOIN)和全外连接(FULL OUTER JOIN)。
三者的共同点是都返回符合连接条件和查询条件(即:内连接)的数据行。不同点如下:
左外连接还返回左表中不符合连接条件单符合查询条件的数据行。
右外连接还返回右表中不符合连接条件单符合查询条件的数据行。
全外连接还返回左表中不符合连接条件单符合查询条件的数据行,并且还返回右表中不符合连接条件单符合查询条件的数据行。全外连接实际是上左外连接和右外连接的数学合集(去掉重复),即“全外=左外 UNION 右外”。
说明:左表就是在“(LEFT OUTER JOIN)”关键字左边的表。右表当然就是右边的了。在三种类型的外连接中,OUTER 关键字是可省略的。
我们这上一个查询中会发现,没有'老王'的成绩。有可能老王没有参加考试,这时候,我们希望能查询所有学生的成绩,包括没有参加考试的,可以用以下查询:
select b.name, b.class ,sum(a.score)
from mytest as a right join s_info as b
on a.name = b.name
group by b.name
联系客服