日期:2014-05-18  浏览次数:20571 次

搞不懂group by和Join
学SQL真难呀。又是JOIN又是又是GROUP。
我始终弄不明白,为什么要GROUP?又弄不明白,为什么有的时候可以不GROUP也能SUM,而有的时候不行?
还有就是JOIN,又是内联又是外联,又是左联又是右联,头都被弄大了。

哪位DX能帮我用通俗的语言解释一下:
(1)为什么要用GROUP
(2)没有sum,avg之类的时候,为什么要用GROUP
(3)为什么有的时候可以不GROUP也能SUM,而有的时候不行?

(4)各种JOIN。。。

谢谢了,头好晕!

------解决方案--------------------
学生表
姓名,班级,年级 总分------------------------------
要查各年级各班级的总分
你可以select 年级,班级,sum(总分) from 学生表 where 年级= '某年级 ' and '班级 '= '某班级 ' 一个一个查下去
你也可以 select 年级,班级,sum(总分) from 学生表 group by 年级,班级 一次查出来
因为group by 先按年级分组,再按班级分组,相同的为一组
分组就好象分类,先大类再小类,再小小类,再。。。然后对类按你的要求取数
------------------------------------------

分组一般是取聚合数据count avg之类用不到它们意思不大,就好象你用select * from 表
查到的数据与 select * from 表 group by all (如果没有重复行的话)查到的数据是一样的
------------------
select 出来的数据不分组也是一个集,就相当于整个集是一个组,此时sum()avg()count()都能查出来,但不能作为条件用。
-----------------------------


------解决方案--------------------
A表AA列 B表BB列
1       2
2       3
4       5
join往往用于关联表的取数 如一表中有某学生的详细信息,另一表有各课的分数但只有关联id
内联接好象是紧密联接,即你有我也有才显示
  上表中2,2 才符合要求
外联接是松散联接,只要两边都出现的就列出,但在对方没有的就用null
上表中1, null
2, 2
null, 3
4, null
null, 5
左联接与右联接是上两个的折衷方案,即左联接只保证左边有的出现,右边没有的用null,右联接同理
  上表中左连 1, null   上表中右边 2, 2
  2, 2           null,3
   4, null null,5
其实还有一种cross join 就不要去管它,一般用不到。
------解决方案--------------------
(1)为什么要用GROUP
group by语句主要用在聚合函数中,比如根据某个列组合来统计信息,比如这个列组合的总和,总数,平均值等等。
(2)没有sum,avg之类的时候,为什么要用GROUP
这个没有问题,只是语法的问题,但是这个时候你得注意一个问题,你查询出来的列要嘛出现在聚合函数中,要麻在group by语句中存在。你说的情况比如可以这样,
select a from Table_A group by a
实际上这个语句没有group by也是一样的,不同的情况应该是不会出现重复的记录集。也就是如果表中a列如果有多个重复的,它只能取到一条记录唯一的记录。和distinct类似。
(3)为什么有的时候可以不GROUP也能SUM,而有的时候不行?
这个情况不可能出现,因为聚合函数必须和group by子句存在的时候才能使用,要不然没有任何意义。

(4)各种JOIN。。。
我们举例说明,有两个表A,B.他们通过id列相关联。
1。内联接是紧密联接,即你有我也有才显示
select a.id from A a
inner join B b
on a.id = b.id
出现的结果是在A和B表中存在的id才能出现。

   2。外连接包括三种:笛卡儿连接,左联接与右联接
2。1 左连接
只要前面的表有的情况就会出现,而不用考虑后面的表是否有一个相关的值和他相等。
select a.id,b.B_Column from A a
left inner join B b
on a.id = b.id
只要在A表中有的列,不管B中有没有和他相等的值都能取出来,只是如果没有相等的值,b.B_Column的值就会是NULL
2。2 右连接:实际上与左连接相反,也就是后面有的就出现,而不考虑前面的。也就只要B有,就不用考虑A.
2。3 笛卡儿连接 和数学的笛卡儿乘积是一样。就是A中有两列id = 2的,B中有3列id = 3的,他们取到的记录一共是6条,也就是任意不同情况的组合。
------解决方案--------------------
(3)为什么有的时候可以不GROUP也能SUM,而有的时候不行?
这个情况不可能出现,因为聚合函数必须和group by子句存在的时候才能使用,要不然没有任何意义。----------------------------------这是不对的不信试试,而且也有意义,最简单的我们常用count(*)去查符合条件的记录数
------解决方案--------------------
[转帖]SQL---JOIN之完全用法

外联接。外联接可以是左向外联接、右向外联接或完整外部联接。
在 FROM 子句中指定外联接时,可以由下列几组关键字中的一组指定:

LEFT JOIN 或 LEFT OUTER JOIN。
左向外联接的结果集包括 LEFT OUTER 子句中指定的左表的所有行,而不仅仅是联接列所匹配的行。如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列均为空值。

RIGHT JOIN 或 RIGHT OUTER JOIN。
右向外联接是左向外联接的反向联接。将返回右表的所有行。如果右表的某行在左表中没有匹配行,则将为左表返回空值。

FULL JOIN 或 FULL OUTER JOIN。
完整外部联接返回左表和右表中的所有行。当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值。如果表之间有匹配行,则整个结果集行包含基表的数据值。

仅当至少有一个同属于两表的行符合联接条件时,内联接才返回行。内联接消除与另一个表中的任何行不匹配的行。而外联接会返回 FROM 子句中提到的至少一个表或视图的所有行,只要这些行符合任何 WHERE 或 HAVING 搜索条件。将检索通过左向外联接引用的左表的所有行,以及通过右向外联接引用的右表的所有行。完整外部联接中两个表的所有行都将返回。