分享

SQL速学篇第三课(小白七天从入门到精通)

 L罗乐 2018-10-12

十一、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记录学生成绩:


表二、s_info记录学生班级和学号基础信息:


若我们要知道学生的总成绩,并且要知道是哪个班的学生,我们需要将这两个不同表格中的资料串联起来。当我们仔细了解这两个表格后,我们会发现它们可经由一个相同的栏位,'name',连接起来。

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


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多