GROUP BY 子句根据它前面的参数集 分组结果。当处理GROUP BY 子句时,数据库系统首先基于FORM和WHERE子句创建一个临时结果集。也就是说先执行SELECT * FROM TABLE WHERE A=B,然后才GROUP BY
根据SQL规则,不允许 组合 聚合函数 和 非聚合 的列。如:SELECT A,COUNT(B) FROM TABLE ,可以利用GROUP BY 子句改变这种情形,如:SELECT A,COUNT(B) FROM TABLE GROUP BY A
SELECT COUNT(*) FROM TABLE 与 SELECT COUNT(列名) FROM TABLE 的结果是不一样的,COUNT(*)这是统计所有记录的所有列包括NULL的数目,而COUNT(列名),只统计结果集中ID列的非NULL值的数目。永远有这样的关系COUNT(*)>=COUNT(列名)
有时候可能需要组合两个完全不同查询的结果。两个查询的结果之间可能不存在链接,您只是想将它们都显示在一个结果集中。
可以使用UNION运算符可以将两个或多个SELECT查询的结果联合到一个结果中,但存在一些基本的规则:
1.每个查询必须产生相同数目的列
2.列的数据类型必须相同(不管你是怎么让它们相同的,比如您想用日期型的regdate里的年,可以year(regdate) as regyear就可以了)
默认情况下,UNION 运算符合并了多个查询,但是仅包含唯一的记录。如果需要集中返回所有的记录,不管它们是否唯一,则需要使用ALL语句,如:
SELECT * FROM ip1 UNION ALL SELECT * FROM ip2 ORDER BY id DESC
实例解析:我有两个IP表,一个基本表,是以前的数据,可能过期,IP1。还有一个新IP表是IP2,两个表字段完全一样,
SELECT * FROM ip1 UNION ALL SELECT * FROM ip2
与
SELECT * FROM ip1 UNION SELECT * FROM ip2
查询结果是不一样的,第一条语句查询出来的要比第二条查询出来的语句多,因为两个表里可能有重复的内容。
但如果我为各表都加上一个自动编号,IP2自动编号起点设的IP1有自动编号最大值大的话,两条语句查询结果就一样了,因为自动编号是不一样的,所以不完全相同,记录不会被合并。
可以通过添加一个 ORDER BY 子句来排序结果。但是,仅可以添加一个 ORDER BY 子句,并且它必须位于 SELECT 语句的最后面。另外,在 ORDER BY 子句中仅可以使用第一个SELECT语句中的列名。