Maison  >  Article  >  base de données  >  Explication détaillée de la différence entre distinct, row_number() et over()

Explication détaillée de la différence entre distinct, row_number() et over()

Y2J
Y2Joriginal
2017-05-24 13:55:121563parcourir

Cet article présente principalement la différence et les informations d'utilisation entre Explication détaillée de la différence entre distinct, row_number() et over() et row_number() over() dans SQL Les amis qui en ont besoin peuvent s'y référer

1 Préface

<.>Lorsque nous écrivons des instructions SQL pour exploiter les données dans la base de données, nous pouvons rencontrer des problèmes inconfortables. Par exemple, pour les enregistrements portant le même nom dans le même champ, nous n'avons besoin d'en afficher qu'un, mais en fait la base de données peut en contenir plusieurs. enregistrements portant le même nom, donc plusieurs enregistrements seront affichés lors de la récupération, ce qui est contraire à notre intention initiale ! Par conséquent, afin d'éviter que cette situation ne se produise, nous devons effectuer un traitement de « suppression des doublons ». Alors, qu'est-ce que la « suppression des doublons » ? Pour parler franchement, cela signifie qu'un seul enregistrement sera affiché pour les enregistrements ayant le même contenu dans le même champ.

Alors, comment implémenter la fonction « suppression des doublons » ? À cet égard, nous avons deux manières de réaliser cette fonction.

Le premier, lors de l'écriture de l'instruction select, ajoutez le mot-clé Explication détaillée de la différence entre distinct, row_number() et over()

Le second, lors de l'écriture de l'instruction select, appelez la fonction row_number() over()

.

Les deux méthodes ci-dessus peuvent réaliser la fonction de « suppression des doublons », alors quelles sont les similitudes et les différences entre les deux ? Ensuite, l'auteur donnera des instructions détaillées.

2 Explication détaillée de la différence entre distinct, row_number() et over()s

En SQL, le mot-clé Explication détaillée de la différence entre distinct, row_number() et over() est utilisé pour renvoyer des valeurs Explication détaillée de la différence entre distinct, row_number() et over()es de manière unique. Le format de syntaxe est :


SELECT DISTINCT 列名称 FROM 表名称
Supposons qu'il existe une table "Explication détaillée de la différence entre Explication détaillée de la différence entre distinct, row_number() et over(), row_number() et over()" qui contient deux champs, NAME et AGE. Le format spécifique est le suivant :

.

Explication détaillée de la différence entre Explication détaillée de la différence entre distinct, row_number() et over(), row_number() et over()

En observant le tableau ci-dessus, nous constaterons qu'il y a deux enregistrements avec le même NOM et trois enregistrements avec le même AGE. Si nous exécutons l'instruction SQL suivante,


/**
* 其中 PPPRDER 为 Schema 的名字,即表 Explication détaillée de la différence entre Explication détaillée de la différence entre distinct, row_number() et over(), row_number() et over() 在 PPPRDER 中
*/

select Explication détaillée de la différence entre Explication détaillée de la différence entre distinct, row_number() et over(), row_number() et over() from PPPRDER.Explication détaillée de la différence entre Explication détaillée de la différence entre distinct, row_number() et over(), row_number() et over()
obtiendra les résultats suivants :

Explication détaillée de la différence entre Explication détaillée de la différence entre distinct, row_number() et over(), row_number() et over()

Observez ceci comme En conséquence, nous constaterons que les quatre enregistrements ci-dessus incluent deux enregistrements avec la même valeur NAME, c'est-à-dire que les valeurs du 2ème enregistrement et du 3ème enregistrement sont toutes deux "gavin". Alors, que se passe-t-il si nous voulons qu'un seul enregistrement portant le même nom soit affiché ? À ce stade, vous devez utiliser le mot-clé Explication détaillée de la différence entre distinct, row_number() et over() ! Ensuite, exécutez l'instruction SQL suivante,


select Explication détaillée de la différence entre distinct, row_number() et over() Explication détaillée de la différence entre Explication détaillée de la différence entre distinct, row_number() et over(), row_number() et over() from PPPRDER.Explication détaillée de la différence entre Explication détaillée de la différence entre distinct, row_number() et over(), row_number() et over()
et vous obtiendrez le résultat suivant :

Explication détaillée de la différence entre distinct, row_number() et over()

Observer le résultat, visiblement notre demande a été réalisée ! Cependant, on ne peut s'empêcher de se demander quel sera l'effet si le mot-clé Explication détaillée de la différence entre distinct, row_number() et over() est appliqué à deux champs en même temps ? Maintenant que nous y avons pensé, essayons-le et exécutons l'instruction SQL suivante,


select Explication détaillée de la différence entre distinct, row_number() et over() Explication détaillée de la différence entre Explication détaillée de la différence entre distinct, row_number() et over(), row_number() et over(), age from PPPRDER.Explication détaillée de la différence entre Explication détaillée de la différence entre distinct, row_number() et over(), row_number() et over()
Le résultat est le suivant :

Explication détaillée de la différence entre Explication détaillée de la différence entre distinct, row_number() et over(), row_number() et over()andage

Observez les résultats, oups, ça semble n'avoir aucun effet ? Elle a affiché tous les enregistrements ! Il y a deux enregistrements avec la même valeur NAME et trois enregistrements avec la même valeur AGE. Il n'y a aucun changement ! Mais en fait, le résultat devrait être le suivant. Parce que

lorsque Explication détaillée de la différence entre distinct, row_number() et over() est appliqué à plusieurs champs, elle ne "dupliquera" que les enregistrements avec les mêmes valeurs de champ Evidemment nos quatre "pauvres" enregistrements ne remplissent pas cette condition, donc Explication détaillée de la différence entre distinct, row_number() et over() Vous penserez que le. au-dessus de quatre enregistrements ne sont pas identiques. C'est un discours vide de sens. Ensuite, ajoutons un enregistrement identique à la table "Explication détaillée de la différence entre Explication détaillée de la différence entre distinct, row_number() et over(), row_number() et over()" et vérifions-le. Le tableau après l'ajout d'un enregistrement ressemble à ceci :

Explication détaillée de la différence entre distinct, row_number() et over()

Exécutez à nouveau l'instruction SQL suivante,


select Explication détaillée de la différence entre distinct, row_number() et over() Explication détaillée de la différence entre Explication détaillée de la différence entre distinct, row_number() et over(), row_number() et over(), age from PPPRDER.Explication détaillée de la différence entre Explication détaillée de la différence entre distinct, row_number() et over(), row_number() et over()
Les résultats obtenus sont les suivants :

Explication détaillée de la différence entre Explication détaillée de la différence entre distinct, row_number() et over(), row_number() et over()andage

L'observation de ce résultat vérifie parfaitement notre conclusion ci-dessus.

De plus, il y a une chose à laquelle tout le monde doit prêter une attention particulière, à savoir :

Le mot-clé Explication détaillée de la différence entre distinct, row_number() et over() ne peut fonctionner que s'il est placé devant tous les champs de l'instruction SQL If. il est placé dans la mauvaise position, SQL ne signalera pas d'erreur, mais cela n'aura aucun effet.

3 row_number() over()

Dans la base de données SQL Server, nous disposons d'une fonction row_number() pour le row_number() dans le table de base de données. Les enregistrements sont numérotés lorsqu'ils sont utilisés, ils sont suivis d'une fonction over(), et la fonction de over() est de

regrouper et trier les enregistrements dans la table. La syntaxe utilisée par les deux est :


ROW_NUMBER() OVER(PARTITION BY COLUMN1 ORDER BY COLUMN2)
ce qui signifie : regrouper les enregistrements de la table par champ COLONNE1 et trier par champ COLONNE2, où

PARTITION BY : indique le regroupement ORDER BY : indique le tri

接下来,咱们还用表“Explication détaillée de la différence entre Explication détaillée de la différence entre distinct, row_number() et over(), row_number() et over()”中的数据进行测试。首先,给出没有使用 row_number() over() Explication détaillée de la différence entre distinct, row_number() et over()时查询的结果,如下所示:

Explication détaillée de la différence entre distinct, row_number() et over()

然后,运行如下 SQL 语句,


select PPPRDER.Explication détaillée de la différence entre Explication détaillée de la différence entre distinct, row_number() et over(), row_number() et over().*, row_number() over(partition by age order by Explication détaillée de la différence entre Explication détaillée de la différence entre distinct, row_number() et over(), row_number() et over() desc) from PPPRDER.Explication détaillée de la différence entre Explication détaillée de la différence entre distinct, row_number() et over(), row_number() et over()

得到的结果如下所示:

Explication détaillée de la différence entre distinct, row_number() et over()

从上面的结果可以看出,其在原表的基础上,多了一列标有数字排序的列。那么反过来分析咱们运行的 SQL 语句,发现其确实按字段 AGE 的值进行分组了,也按字段 NAME 的值进行排序啦!因此,Explication détaillée de la différence entre distinct, row_number() et over()的功能得到了验证。

接下来,咱们就研究如何用 row_number() over() Explication détaillée de la différence entre distinct, row_number() et over()实现“去重”的功能。通过观察上面的结果,咱们可以发现,如果以 NAME 分组,以 AGE 排序,然后再取每组的第一个记录或许就可以实现“去重”的功能啊!那么试试看,运行如下 SQL 语句,


/*
* 其中 Explication détaillée de la différence entre distinct, row_number() et over() 表示最后添加的那一列
*/

select * from 
(select PPPRDER.Explication détaillée de la différence entre Explication détaillée de la différence entre distinct, row_number() et over(), row_number() et over().*, row_number() over(partition by Explication détaillée de la différence entre Explication détaillée de la différence entre distinct, row_number() et over(), row_number() et over() order by age desc) Explication détaillée de la différence entre distinct, row_number() et over() from PPPRDER.Explication détaillée de la différence entre Explication détaillée de la différence entre distinct, row_number() et over(), row_number() et over())
where Explication détaillée de la différence entre distinct, row_number() et over() = 1

运行后,得到的结果如下所示:

Explication détaillée de la différence entre distinct, row_number() et over()

观察以上的结果,我们发现,哎呀,数据“去重”的功能一不小心就被咱们实现了啊!不过很遗憾,如果咱们细心的话,会发现一个很不爽的事情,那就是在执行以上 SQL 语句进行“去重”的时候,有一条 NAME 值为“gavin”、AGE 值为“18”的记录被过滤掉了,但是在现实生活会中,同名不同年龄的事情太正常了。

4 总结

通过阅读及实践以上内容,咱们已经知道了,无论是用关键字 Explication détaillée de la différence entre distinct, row_number() et over() 还是用Explication détaillée de la différence entre distinct, row_number() et over() row_number() over() 都可以实现数据“去重”的功能。但是在实现使用的过程中,咱们要特别注意两者的用法特点以及区别。

在使用关键字 Explication détaillée de la différence entre distinct, row_number() et over() 的时候,咱们要知道其作用于单个字段和多个字段的时候是有区别的,作用于单个字段时,其“去重”的是表中所有该字段值重复的数据;作用于多个字段的时候,其“去重”的表中所有字段(即 Explication détaillée de la différence entre distinct, row_number() et over() 具体作用的多个字段)值都相同的数据。

使用Explication détaillée de la différence entre distinct, row_number() et over() row_number() over() 的时候,其是按先分组排序后,再取出每组的第一条记录来进行“去重”的(在本篇博文中如此)。当然,在此处咱们还可以通过不同的限制条件来进行“去重”,具体如何实现,就需要大家自己去动脑思考啦!

最后,在本篇博文中,作者详述了自己对用关键字 Explication détaillée de la différence entre distinct, row_number() et over() 和Explication détaillée de la différence entre distinct, row_number() et over() row_number() over() 进行数据“去重”的一些认识,希望以上的内容能够对大家有所帮助!

【相关推荐】

1. Mysql免费视频教程

2. 详解innodb_index_stats导入数据时 提示表主键冲突的错误

3. 实例详解 mysql中innodb_autoinc_lock_mode

4. MySQL中添加新用户权限的实例详解

5. 实例详解mysql中init_connect方法

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn