sql中使用distinct加上排序怎么查询?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sql中使用distinct加上排序怎么查询?相关的知识,希望对你有一定的参考价值。

例如:
序号 产品 参数
1 A M1
2 A M2
3 A M3
4 B M1
5 B M2
6 B M3
一个产品的参数可能不止3个,我需要查出不重复的产品,且按照序号大小进行排序,用distinct后不知道怎么排序,求高手帮忙!没有财富值了,抱歉!
如:select distinct 序号,产品 from table1 order by 序号 asc
这样会出来AAABBB,但是我只需要AB,就是distinct对序号和产品都进行了限定,就没法去掉“产品”的重复了。

select 序号,distinct产品
from table 1
order by 序号asc
你应该是得对产品distinct 的吧,不应该对序号,你的序号本来就没有一只的哦追问

distinct不是只能放在所有字段的前面么?这样会报错。

追答

SELECT 序号, 产品, 参数
FROM table 1
WHERE (序号 IN
(SELECT MIN(序号)
FROM ctable 1
GROUP BY 产品))
这样子你试试,应该没问题了

参考技术A

你的这个存在问题,你需要AB 那怎么还能按照序号排序呢,按照序号排列一定有重复数据啊?

如果不按照序号排列的话,你可以尝试一下下面的group by

select t1.产品
  from (select t.产品, t.序号
          from table1 t 
         group by t.产品, t.序号
        having count(*) = 1) t1
 group by t1.产品;

追问

select 序号,产品,count(产品) from table1 group by 序号,产品。
和 select 序号,产品,count(产品) from table1 group by 产品,序号。第2句基本上就达到我想要的结果了。 这两句查询出来的结果顺序为什么不一样?group by 也会排序么?

SQL server 数据查询功能 中

查询数据

排序

查询结果集通常是按照id排序的,也就是根据主键排序。这也是大部分数据库的做法。如果我们要根据其他条件排序怎么办?可以加上ORDER BY子句。

例如按照成绩从低到高进行排序:

 SELECT id, name, gender, score FROM students
 ORDER BY score;

如果要反过来,按照成绩从高到底排序,我们可以加上DESC表示“倒序”:

SELECT id, name, gender, score FROM students
ORDER BY score DESC;

如果score列有相同的数据,要进一步排序,可以继续添加列名。

例如,使用ORDER BY score DESC, gender表示先按score列倒序,如果有相同分数的,再按gender列排序:

SELECT id, name, gender, score FROM students ORDER BY score DESC, gender;

默认的排序规则是ASC:“升序”,即从小到大。ASC可以省略,即ORDER BY score ASCORDER BY score效果一样。

如果有WHERE子句,那么ORDER BY子句要放到WHERE子句后面。例如,查询一班的学生成绩,并按照倒序排序:

SELECT id, name, gender, score
FROM students
WHERE class_id = 1
ORDER BY score DESC;

这样,结果集仅包含符合WHERE条件的记录,并按照ORDER BY的设定排序。

小结

使用ORDER BY可以对结果集进行排序;

可以对多列进行升序、倒序排序。

分页查询

使用SELECT查询时,如果结果集数据量很大,比如几万行数据,放在一个页面显示的话数据量太大,不如分页显示,每次显示100条。

要实现分页功能,实际上就是从结果集中显示第1100条记录作为第1页,显示第101200条记录作为第2页,以此类推。

因此,分页实际上就是从结果集中“截取”出第M~N条记录。这个查询可以通过LIMIT <M> OFFSET <N> 子句实现。我们先把所有学生按照成绩从高到低进行排序:

现在,我们把结果集分页,每页3条记录。要获取第1页的记录,可以使用LIMIT 3 OFFSET 0

SELECT id, name, gender, score
FROM students
ORDER BY score DESC
LIMIT 3 OFFSET 0;

上述查询LIMIT 3 OFFSET 0表示,对结果集从0号记录开始,最多取3条。注意SQL记录集的索引从0开始。

如果要查询第2页,那么我们只需要“跳过”头3条记录,也就是对结果集从3号记录开始查询,把OFFSET设定为3:

SELECT id, name, gender, score
FROM students
ORDER BY score DESC
LIMIT 3 OFFSET 3;

类似的,查询第3页的时候,OFFSET应该设定为6:

SELECT id, name, gender, score
FROM students
ORDER BY score DESC
LIMIT 3 OFFSET 6;

注意

OFFSET是可选的,如果只写LIMIT 15,那么相当于LIMIT 15 OFFSET 0

在MySQL中,LIMIT 15 OFFSET 30还可以简写成LIMIT 30, 15

使用LIMIT OFFSET 分页时,随着N越来越大,查询效率也会越来越低。

小结

使用LIMIT OFFSET 可以对结果集进行分页,每次查询返回结果集的一部分;

分页查询需要先确定每页的数量和当前页数,然后确定LIMITOFFSET的值。

聚合查询

如果我们要统计一张表的数据量,例如,想查询students表一共有多少条记录,难道必须用SELECT * FROM students查出来然后再数一数有多少行吗?

这个方法当然可以,但是比较弱智。对于统计总数、平均数这类计算,SQL提供了专门的聚合函数,使用聚合函数进行查询,就是聚合查询,它可以快速获得结果。

仍然以查询students表一共有多少条记录为例,我们可以使用SQL内置的COUNT()函数查询:

SELECT COUNT(*) FROM students;

COUNT(*)表示查询所有列的行数,要注意聚合的计算结果虽然是一个数字,但查询的结果仍然是一个二维表,只是这个二维表只有一行一列,并且列名是COUNT(*)

通常,使用聚合查询时,我们应该给列名设置一个别名,便于处理结果:

SELECT COUNT(*) num FROM students;
-- 使用聚合查询并设置结果集的列名为num:

COUNT(*)COUNT(id)实际上是一样的效果。另外注意,聚合查询同样可以使用WHERE条件,因此我们可以方便地统计出有多少男生、多少女生、多少80分以上的学生等:

SELECT COUNT(*) boys FROM students WHERE gender = ‘M‘;

除了COUNT()函数外,SQL还提供了如下聚合函数:

函数 说明
SUM 计算某一列的合计值,该列必须为数值类型
AVG 计算某一列的平均值,该列必须为数值类型
MAX 计算某一列的最大值
MIN 计算某一列的最小值

注意,MAX()MIN()函数并不限于数值类型。如果是字符类型,MAX()MIN()会返回排序最后和排序最前的字符。

要统计男生的平均成绩,我们用下面的聚合查询:

SELECT AVG(score) average FROM students WHERE gender = ‘M‘;
-- 使用聚合查询计算男生平均成绩:

要特别注意:如果聚合查询的WHERE条件没有匹配到任何行,COUNT()会返回0,而SUM()AVG()MAX()MIN()会返回NULL

分组

如果我们要统计一班的学生数量,我们知道,可以用SELECT COUNT(*) num FROM students WHERE class_id = 1;。如果要继续统计二班、三班的学生数量,难道必须不断修改WHERE条件来执行SELECT语句吗?

对于聚合查询,SQL还提供了“分组聚合”的功能。我们观察下面的聚合查询:

SELECT COUNT(*) num FROM students GROUP BY class_id;
-- 按class_id分组:

执行这个查询,COUNT()的结果不再是一个,而是3个,这是因为,GROUP BY子句指定了按class_id分组,因此,执行该SELECT语句时,会把class_id相同的列先分组,再分别计算,因此,得到了3行结果。

但是这3行结果分别是哪三个班级的,不好看出来,所以我们可以把class_id列也放入结果集中

SELECT class_id, COUNT(*) num FROM students GROUP BY class_id;

小结

使用SQL提供的聚合查询,我们可以方便地计算总数、合计值、平均值、最大值和最小值;

聚合查询也可以添加WHERE条件。

以上是关于sql中使用distinct加上排序怎么查询?的主要内容,如果未能解决你的问题,请参考以下文章

elasticSearch Java API 怎么将查询出来的数据类似sql 一样的distinct 去重某个字段

SQL server 数据查询功能 中

sql中,只使用union和先union all再distinct,两种方式哪个效率高?

SQL中 oderby和distinct哪一个先执行

mysql GROUP BY、DISTINCT、ORDER BY语句优化

问一个sql查询,如何给查询结果加上序号