distinct 和 group by 在查询多列数据去重复时的区别在哪?

来源:互联网 发布:操盘手训练软件 编辑:程序博客网 时间:2024/04/30 02:35

distinct 和 group by 在查询多列数据去重复时的区别在哪? [问题点数:40分,结帖人luxer_1985]

 收藏
楼主发表于: 2012-09-03 10:30:50
SQL code
?
1
2
select distinct t.A1, t.A2, t.A3 from t, p
where t.A4 = p.B1 and p.B2 <> '出口' ;


SQL code
?
1
2
3
select t.A1, t.A2, t.A3 from t, p
where t.A4 = p.B1 and p.B2 <> '出口' 
group by t.A1, t.A2, t.A3 ;


对查询结果去重复行,有什么区别?
  • <iframe id="iframeu1636200_0" src="http://pos.baidu.com/kcam?rdid=1636200&amp;dc=2&amp;di=u1636200&amp;dri=0&amp;dis=0&amp;dai=2&amp;ps=1007x404&amp;dcb=BAIDU_SSP_define&amp;dtm=HTML_POST&amp;dvi=0.0&amp;dci=-1&amp;dpt=none&amp;tsr=0&amp;tpr=1470382545707&amp;ti=distinct%20%E5%92%8C%20group%20by%20%E5%9C%A8%E6%9F%A5%E8%AF%A2%E5%A4%9A%E5%88%97%E6%95%B0%E6%8D%AE%E5%8E%BB%E9%87%8D%E5%A4%8D%E6%97%B6%E7%9A%84%E5%8C%BA%E5%88%AB%E5%9C%A8%E5%93%AA%EF%BC%9F-CSDN%E8%AE%BA%E5%9D%9B-CSDN.NET-%E4%B8%AD%E5%9B%BD%E6%9C%80%E5%A4%A7%E7%9A%84I&amp;ari=2&amp;dbv=2&amp;drs=3&amp;pcs=1387x699&amp;pss=1387x4840&amp;cfv=0&amp;cpl=4&amp;chi=1&amp;cce=true&amp;cec=UTF-8&amp;tlm=1470382545&amp;rw=699&amp;ltu=http%3A%2F%2Fbbs.csdn.net%2Ftopics%2F390198600&amp;ltr=https%3A%2F%2Fwww.baidu.com%2Flink%3Furl%3DdphzhC8orJLpM0JiiTY-2nTFZ0KDggBEGZUOE0Q0QfcIu_byGQ5uaz7b9e0Lt32m%26wd%3D%26eqid%3D84ce43e1000438720000000557a44148&amp;ecd=1&amp;psr=1920x1080&amp;par=1920x1040&amp;pis=-1x-1&amp;ccd=24&amp;cja=false&amp;cmi=6&amp;col=zh-CN&amp;cdo=-1&amp;tcn=1470382546&amp;qn=eea858c8595ea643&amp;tt=1470382545689.46.342.344" width="200" height="22" align="center,center" vspace="0" hspace="0" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" allowtransparency="true" style="box-sizing: content-box; border-width: 0px; border-style: initial; vertical-align: bottom; margin: 0px;"></iframe>
     
  • <iframe id="iframeu1636201_0" src="http://pos.baidu.com/kcam?rdid=1636201&amp;dc=2&amp;di=u1636201&amp;dri=0&amp;dis=0&amp;dai=3&amp;ps=1007x658&amp;dcb=BAIDU_SSP_define&amp;dtm=HTML_POST&amp;dvi=0.0&amp;dci=-1&amp;dpt=none&amp;tsr=0&amp;tpr=1470382545707&amp;ti=distinct%20%E5%92%8C%20group%20by%20%E5%9C%A8%E6%9F%A5%E8%AF%A2%E5%A4%9A%E5%88%97%E6%95%B0%E6%8D%AE%E5%8E%BB%E9%87%8D%E5%A4%8D%E6%97%B6%E7%9A%84%E5%8C%BA%E5%88%AB%E5%9C%A8%E5%93%AA%EF%BC%9F-CSDN%E8%AE%BA%E5%9D%9B-CSDN.NET-%E4%B8%AD%E5%9B%BD%E6%9C%80%E5%A4%A7%E7%9A%84I&amp;ari=2&amp;dbv=2&amp;drs=3&amp;pcs=1387x699&amp;pss=1387x4840&amp;cfv=0&amp;cpl=4&amp;chi=1&amp;cce=true&amp;cec=UTF-8&amp;tlm=1470382545&amp;rw=699&amp;ltu=http%3A%2F%2Fbbs.csdn.net%2Ftopics%2F390198600&amp;ltr=https%3A%2F%2Fwww.baidu.com%2Flink%3Furl%3DdphzhC8orJLpM0JiiTY-2nTFZ0KDggBEGZUOE0Q0QfcIu_byGQ5uaz7b9e0Lt32m%26wd%3D%26eqid%3D84ce43e1000438720000000557a44148&amp;ecd=1&amp;psr=1920x1080&amp;par=1920x1040&amp;pis=-1x-1&amp;ccd=24&amp;cja=false&amp;cmi=6&amp;col=zh-CN&amp;cdo=-1&amp;tcn=1470382546&amp;qn=cb1035419e9a5a35&amp;tt=1470382545689.77.348.350" width="200" height="22" align="center,center" vspace="0" hspace="0" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" allowtransparency="true" style="box-sizing: content-box; border-width: 0px; border-style: initial; vertical-align: bottom; margin: 0px;"></iframe>
     
  • <iframe id="iframeu1636204_0" src="http://pos.baidu.com/kcam?rdid=1636204&amp;dc=2&amp;di=u1636204&amp;dri=0&amp;dis=0&amp;dai=4&amp;ps=1007x912&amp;dcb=BAIDU_SSP_define&amp;dtm=HTML_POST&amp;dvi=0.0&amp;dci=-1&amp;dpt=none&amp;tsr=0&amp;tpr=1470382545707&amp;ti=distinct%20%E5%92%8C%20group%20by%20%E5%9C%A8%E6%9F%A5%E8%AF%A2%E5%A4%9A%E5%88%97%E6%95%B0%E6%8D%AE%E5%8E%BB%E9%87%8D%E5%A4%8D%E6%97%B6%E7%9A%84%E5%8C%BA%E5%88%AB%E5%9C%A8%E5%93%AA%EF%BC%9F-CSDN%E8%AE%BA%E5%9D%9B-CSDN.NET-%E4%B8%AD%E5%9B%BD%E6%9C%80%E5%A4%A7%E7%9A%84I&amp;ari=2&amp;dbv=2&amp;drs=3&amp;pcs=1387x699&amp;pss=1387x4840&amp;cfv=0&amp;cpl=4&amp;chi=1&amp;cce=true&amp;cec=UTF-8&amp;tlm=1470382545&amp;rw=699&amp;ltu=http%3A%2F%2Fbbs.csdn.net%2Ftopics%2F390198600&amp;ltr=https%3A%2F%2Fwww.baidu.com%2Flink%3Furl%3DdphzhC8orJLpM0JiiTY-2nTFZ0KDggBEGZUOE0Q0QfcIu_byGQ5uaz7b9e0Lt32m%26wd%3D%26eqid%3D84ce43e1000438720000000557a44148&amp;ecd=1&amp;psr=1920x1080&amp;par=1920x1040&amp;pis=-1x-1&amp;ccd=24&amp;cja=false&amp;cmi=6&amp;col=zh-CN&amp;cdo=-1&amp;tcn=1470382546&amp;qn=89894fde133ef2c9&amp;tt=1470382545689.78.436.438" width="200" height="22" align="center,center" vspace="0" hspace="0" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" allowtransparency="true" style="box-sizing: content-box; border-width: 0px; border-style: initial; vertical-align: bottom; margin: 0px;"></iframe>
    对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理
    回复次数:9
    #1 得分:10回复于: 2012-09-03 10:39:27
    可能效率上有區別,哪個快,要具體測,測試過.在此處沒其他區別
    如果有計算匯總等聚合函數(sum,avg,max,min...)在內,則就有區別了,此時只能用group by
    对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理
    #2 得分:5回复于: 2012-09-03 10:56:23
    distinct 会启动sql引擎

    distinct只是取得唯一列,group by 是分组,可以进行函数计算。

    数据量大的话,一般用分组。
    对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理
    #3 得分:0回复于: 2012-09-03 10:56:51
    需要聚合运算采用group by。
    对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理
    #4 得分:0回复于: 2012-09-03 10:59:35
    可满足的要求是不一样的
    对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理
    #5 得分:20回复于: 2012-09-03 11:16:02
    distinct只是将重复的行从结果中出去; 
    group by是按指定的列分组,一般这时在select中会用到聚合函数。
    distinct是把不同的记录显示出来。 
    group by是在查询时先把纪录按照类别分出来再查询。
    group by 必须在查询结果中包含一个聚集函数,而distinct不用。

    对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理
    #6 得分:0回复于: 2012-09-03 11:22:18
    引用 2 楼  的回复:
    distinct 会启动sql引擎

    distinct只是取得唯一列,group by 是分组,可以进行函数计算。

    数据量大的话,一般用分组。

    我需要的结果:唯一列是A1,但是原表中与之关联的A2、A3列的内容也要在查询结果中体现,比如
    A11,A21,A31
    A11,A22,A32
    A11,A21,A33
    ……
    而重复的(A11,A21,A31)行就被去掉了 


    主题中给出的两种方法都可以实现吗?


    为什么Group by也可以实现去重,它的功能不只是分组吗?
    对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理
    #7 得分:0回复于: 2012-09-03 11:52:21
    需求中不用聚合函数 只要查出主键A1下的所有符合要求的行就行了 关键是由于联合查询,结果中可能有重复的
    对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理
    #8 得分:5回复于: 2012-09-04 15:15:06
    引用 5 楼  的回复:
    distinct只是将重复的行从结果中出去; 
    group by是按指定的列分组,一般这时在select中会用到聚合函数。
    distinct是把不同的记录显示出来。 
    group by是在查询时先把纪录按照类别分出来再查询。
    group by 必须在查询结果中包含一个聚集函数,而distinct不用。

    正解!!
    对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理
    #9 得分:0回复于: 2012-09-04 15:38:44
    引用 6 楼  的回复:
    引用 2 楼  的回复:
    distinct 会启动sql引擎

    distinct只是取得唯一列,group by 是分组,可以进行函数计算。

    数据量大的话,一般用分组。

    我需要的结果:唯一列是A1,但是原表中与之关联的A2、A3列的内容也要在查询结果中体现,比如
    A11,A21,A31
    A11,A22,A32
    A11,A21,A33
    ……
    而重复的(A11,A21,A……

    你是按 a1,a2,a3分的组,相当于去重了,你要是 group by a1 ;  或者 group by a1,a2 ; 差别就出来了。
    0 0