sql语句中 group by用法
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sql语句中 group by用法相关的知识,希望对你有一定的参考价值。
现有一个表tab,有字段ID和name;name可以有重复,请问,如何从该表中选择出ID和name字段,且name字段不重复?
谢谢大家,五楼说的对,但是,我还要选出ID这个字段
我要从tab表中,选出ID和name两个字段,并且,name字段不能重复
SELECT ID,DISTINCT NAME
FROM TAB;
对于SELECT语句完整的句法如下:
SELECT[DISTINCT] 目标表的列名或列表达式序列--------必写项(其中DISTINCT是去掉重复的数据项)
FROM 基本表名和(或)试图序列----------------------必写项
[WHERE 行条件表达式]
[GROUP BY 列名序列[HAVING 组条件表达式]]
[ODER BY 列名[ASC/DESC]]------------------ASC升序排列,DESC降序排列
---------------------------------------------------------------由于你在问题题目中提到了GROUP BY 的用法,下面就介绍一部分。
在数据库中,我们可以使用GROUP BY函数把数据组合在一起,从而获得总计信息。可以把此功能看成是一种当数据从数据库中返回时把相同类型的信息集中到一起的能力。下面给出了完整列表。
avg([distinct]column_name)
求所有雇员薪水的平均值。
select AVG(emp_salary)
from employee;
求取column_name中的所有值的平均值。如果使用DISTINCT选项,则只使用不同的非空的数值。
count([distinct]value)
统计雇员的数目。
select COUNT(emp_name)
from employee;
统计选择行的数目,并忽略VALUE中的空值。如果使用了DISTINCT选项
则只统计不同的非空数值。VALUE可以是列名,也可以是表达式。
max(value)
返回薪水的最大值
select MIN
emp_salary)
from employee;
从选定的VALUE中选出数值/字符的最大值,忽略空值。VALUE要求同上。
min(value)
返回薪水的最小值
select MIN(emp_salsry)
from employee;
从选定的VALUE中选出数值/字符的最小值,忽略空值。VALUE要求同上。
stddev(value)返回雇员薪水的标准偏差
select STDDEV(emp_salary)
from employee;
从选择的VALUE的标准中返回标准偏差。
variance([distinct]value)
返回雇员薪水的方差
select VARIANCE(emp_salary)
from employee;
返回所选行的所有数值的方差,忽略VALUE的空值。DISTINCT和VALUE要
求同前。
1.没有group by子句的group by函数。注意到上面的所有示例都没有使用GROUP BY命令了吧?当在查询中没有使用GROUP BY子句时,数据库就把数据表中的所有行为作为一个组来处理。通常情况下,我们并不希望是这样的。多数用户都能理解组的概念,但在使用的时候却很快就陷入麻烦中。有一个技巧是:如果有一列在GROUP BY子句中没有提到,就必须对它进行累计。换句话说,就是必须对那些不包括在GROUP BY子句中的所有列使用上面提到过的一个函数。
2.having子句。就象使用where子句检查从查询返回的个别行一样,我们也可以使用having子句为一组行指定搜索条件。例如,如果想要察看新雇佣人数超过两个的州的平均工资,就可以使用having子句。查询语句如下所示:
select state_cd,avg(salsry)
from newhire
group by state_cd
having count(state_cd) > 2;
3.可以使用group by查找重复数据。|
|思想都是先查出重复数据再操作。
4.可以使用group by删除重复数据。| 参考技术A 一楼的说的是对的,在查询语句中,不管是用select distinct id,name from tab 还是select distinct name,id from tab查询出来的都会有重复的name值,只有在单个取name 值时才不会有重复的项 参考技术B select id,name from tab
where name in
(select distinct name from tab) 参考技术C 首先你这个是同样name对应多个ID,同时选取ID和name的时候结果集里面name就是重复的,你具体的需求是什么 参考技术D select distinct id,name from tab
这样肯定能够实现,但是问题在于当同样ID对应不同name的时候,你想要的是哪个name?电脑肯定不会知道。
GROUP BY,WHERE,HAVING之间的区别和用法
group by、having、where均为SQL语句中的函数。
一、区别
1、执行顺序不同
在SQL语句中,where语句的执行顺序先于group by,group by语句的执行顺序先于having。
2、执行条件不同
在group by的SQL语句中,select中返回的字段,必须包含在group by语句的后面,作为分组的依据,而且字段包含在聚合函数中。
在having 的SQL语句中,having只能用于group by,having 子句中的每一个元素也必须出现在select列表中,having语句可以使用聚合函数。
where不使用聚合函数。
二、用法
1、where用于筛选查询,通常用在select 的后面。
select city, count(*),age from dbo.user where departmentID=2;
2、group by用于对where的查询结果进行分组,通常放在where之后。
select city, count(*),age from dbo.user where departmentID=2 group by city,age;
3、having一般放在group by之后,对where和group by查询出来的分组进行过滤。
select city, count(*),age from dbo.user where departmentID=2 group by city,age having age >40;
扩展资料
ORDER BY子句中还经常会用到排序函数:ASC,DESC
其中,ASC表示升序,DESC为降序
排序函数一般放置在子句的末尾处,表示排序的方式。
例如:SELECT 课程编号,成绩 FROM Score WHERE 学号=‘2006091**1' ORDER BY 成绩 ASC;
参考资料来源:百度百科-SQL语句大全
参考技术A where是按照条件进行数据的过滤。goup by是分组统计数据的条件。
having是在group by统计之后对统计结果数据进行过滤。 参考技术B group by 分组 having 是对分组后的结果 做条件查询
where 是查询条件完成后在分组,一个在前一个在后 参考技术C having子句与where有相似之处但也有区别,都是设定条件的语句。
在查询过程中聚合语句(sum,min,max,avg,count)要比having子句优先执行.而where子句在查询过程中执行优先级别优先于聚合语句(sum,min,max,avg,count)。
简单说来:
where子句:
select sum(num) as rmb from order where id>10
//只有先查询出id大于10的记录才能进行聚合语句
having子句:
select reportsto as manager, count(*) as reports from employees
group by reportsto having count(*) > 4
以northwind库为例.having条件表达示为聚合语句。肯定的说having子句查询过程执行优先级别低于聚合语句。
再换句说话说把上面的having换成where则会出错。统计分组数据时用到聚合语句。
对分组数据再次判断时要用having。如果不用这些关系就不存在使用having。直接使用where就行了。
having就是来弥补where在分组数据判断时的不足。因为where执行优先级别要快于聚合语句。
聚合函数,这是必需先讲的一种特殊的函数:
例如SUM, COUNT, MAX, AVG等。这些函数和其它函数的根本区别就是它们一般作用在多条记录上。
SELECT SUM(population) FROM tablename
这里的SUM作用在所有返回记录的population字段上,结果就是该查询只返回一个结果,即所有
国家的总人口数。 通过使用GROUP BY 子句,可以让SUM 和 COUNT 这些函数对属于一组的数据起作用。
当你指定 GROUP BY region 时, 属于同一个region(地区)的一组数据将只能返回一行值.
也就是说,表中所有除region(地区)外的字段,只能通过 SUM, COUNT等聚合函数运算后返回一个值.
HAVING子句可以让我们筛选成组后的各组数据.
HAVING子句在聚合后对组记录进行筛选
而WHERE子句在聚合前先筛选记录.也就是说作用在GROUP BY 子句和HAVING子句前
总结:
1.WHERE 子句用来筛选 FROM 子句中指定的操作所产生的行。
2.GROUP BY 子句用来分组 WHERE 子句的输出。
3.HAVING 子句用来从分组的结果中筛选行。
以上是关于sql语句中 group by用法的主要内容,如果未能解决你的问题,请参考以下文章