Different、row_number()、over() の違いの詳細な説明

Y2J
リリース: 2017-05-24 13:55:12
オリジナル
1580 人が閲覧しました

この記事では主に、SQL におけるDifferent、row_number()、over() の違いの詳細な説明 と row_number() over() の違いと関連する使用法情報を紹介します。場合によっては、同じフィールドに同じ名前のレコードを 1 つだけ表示する必要があるなど、不快な問題が発生することがあります。実際には、データベースには同じ名前の複数のレコードが含まれている可能性があるため、複数のレコードを取得して表示する場合、それは私たちの本来の意図に反します!そこで、このような事態を避けるために「重複除去」処理を行う必要があります。端的に言えば、同じフィールド内の同じ内容のレコードは 1 つのレコードしか表示されないということです。

それでは、「重複削除」機能を実装するにはどうすればよいでしょうか?この点に関して、この機能を実現するには 2 つの方法があります。 1 つ目の方法は、select ステートメントを作成するときに unique キーワードを追加することです。 2 つ目の方法は、select ステートメントを作成するときに row_number() over()

関数

を呼び出すことです。

上記の 2 つの方法はどちらも「重複削除」機能を実現できますが、この 2 つの類似点と相違点は何ですか?次に、著者が詳細な手順を説明します。

2 unique

SQLでは、キーワードDifferent、row_number()、over() の違いの詳細な説明は一意に異なる値を返すために使用されます。構文形式は次のとおりです:

SELECT DISTINCT 列名称 FROM 表名称
ログイン後にコピー
NAME と AGE の 2 つのフィールドを含むテーブル "Different、row_number()、over() の違いの詳細な説明" があるとします。具体的な形式は次のとおりです。

上記のテーブルを観察すると、次のことがわかります。 : NAME が同じです 同じ AGE のレコードが 2 件、レコードが 3 件あります。次の SQL ステートメントを実行すると、

/**
* 其中 PPPRDER 为 Schema 的名字,即表 Different、row_number()、over() の違いの詳細な説明 在 PPPRDER 中
*/

select Different、row_number()、over() の違いの詳細な説明 from PPPRDER.Different、row_number()、over() の違いの詳細な説明
ログイン後にコピー

は次の結果を取得します: Different、row_number()、over() の違いの詳細な説明

結果を観察すると、上記の 4 つのレコードの中に、同じ NAME 値を持つ 2 つのレコードがあることがわかります。レコード 2 と 3 は両方とも値「gavin」を持ちます。では、同じ名前のレコードを 1 つだけ表示したい場合はどうすればよいでしょうか?現時点では、Different、row_number()、over() の違いの詳細な説明 キーワードを使用する必要があります。次に、次の SQL ステートメントを実行します。

select Different、row_number()、over() の違いの詳細な説明 Different、row_number()、over() の違いの詳細な説明 from PPPRDER.Different、row_number()、over() の違いの詳細な説明
ログイン後にコピー

は次の結果を取得します: Different、row_number()、over() の違いの詳細な説明

結果を観察してください。明らかに要件が達成されています。ただし、Different、row_number()、over() の違いの詳細な説明 キーワードが 2 つのフィールドに同時に適用された場合にどのような影響があるのか​​、疑問に思わずにはいられません。思いついたので、次の SQL ステートメントを実行してみましょう。

rreee

によって得られる結果は次のとおりです。 おっと、効果がないようです。彼女はすべての記録を見せてくれました!同じ NAME 値を持つレコードが 2 つあり、同じ AGE 値を持つレコードが 3 つあります。まったく変化はありません。しかし実際には、結果は次のようになります。 Different、row_number()、over() の違いの詳細な説明Different、row_number()、over() の違いの詳細な説明 が複数のフィールドに適用される場合、同じフィールド値を持つレコードのみが「重複排除」されるためです

明らかに、「貧弱な」4 つのレコードはこの条件を満たしていないため、Different、row_number()、over() の違いの詳細な説明 は上記の 4 つのレコードを考慮します。同じではありません。空話です。 次に、テーブル「Different、row_number()、over() の違いの詳細な説明」に同一のレコードを追加して検証してみます。レコードを追加した後のテーブルは次のとおりです。


次の SQL ステートメントを再度実行します。

Different、row_number()、over() の違いの詳細な説明andage

select Different、row_number()、over() の違いの詳細な説明 Different、row_number()、over() の違いの詳細な説明, age from PPPRDER.Different、row_number()、over() の違いの詳細な説明
ログイン後にコピー
ログイン後にコピー

結果は次のとおりです。

上記の内容を完全に検証する結果を観察します。結論。 Different、row_number()、over() の違いの詳細な説明

さらに、誰もが特別な注意を払う必要があることが 1 つあります。それは、

キーワード unique は、SQL ステートメントのすべてのフィールドの先頭に配置されている場合にのみ機能します。それが間違って配置されている場合です。位置を指定すると、SQL はエラーを報告しませんが、影響はありません。


3 row_number() over()

SQL Server データベースでは、データベース テーブル内のレコードにラベルを付けるための関数 row_number() が提供されており、使用する場合は関数 over() が続きます。 over() の機能は、テーブル内のレコードをグループ化して並べ替えることです。両方で使用される構文は次のとおりです: Different、row_number()、over() の違いの詳細な説明andage

select Different、row_number()、over() の違いの詳細な説明 Different、row_number()、over() の違いの詳細な説明, age from PPPRDER.Different、row_number()、over() の違いの詳細な説明
ログイン後にコピー
ログイン後にコピー

意味: テーブル内のレコードをフィールド COLUMN1 でグループ化し、フィールド COLUMN2 で並べ替えます。ここで、PARTITION BY: グループ化を意味します ORDER BY: 並べ替えを意味します

接下来,咱们还用表“Different、row_number()、over() の違いの詳細な説明”中的数据进行测试。首先,给出没有使用 row_number() over() Different、row_number()、over() の違いの詳細な説明时查询的结果,如下所示:

Different、row_number()、over() の違いの詳細な説明

然后,运行如下 SQL 语句,


select PPPRDER.Different、row_number()、over() の違いの詳細な説明.*, row_number() over(partition by age order by Different、row_number()、over() の違いの詳細な説明 desc) from PPPRDER.Different、row_number()、over() の違いの詳細な説明
ログイン後にコピー

得到的结果如下所示:

Different、row_number()、over() の違いの詳細な説明

从上面的结果可以看出,其在原表的基础上,多了一列标有数字排序的列。那么反过来分析咱们运行的 SQL 语句,发现其确实按字段 AGE 的值进行分组了,也按字段 NAME 的值进行排序啦!因此,Different、row_number()、over() の違いの詳細な説明的功能得到了验证。

接下来,咱们就研究如何用 row_number() over() Different、row_number()、over() の違いの詳細な説明实现“去重”的功能。通过观察上面的结果,咱们可以发现,如果以 NAME 分组,以 AGE 排序,然后再取每组的第一个记录或许就可以实现“去重”的功能啊!那么试试看,运行如下 SQL 语句,


/*
* 其中 Different、row_number()、over() の違いの詳細な説明 表示最后添加的那一列
*/

select * from 
(select PPPRDER.Different、row_number()、over() の違いの詳細な説明.*, row_number() over(partition by Different、row_number()、over() の違いの詳細な説明 order by age desc) Different、row_number()、over() の違いの詳細な説明 from PPPRDER.Different、row_number()、over() の違いの詳細な説明)
where Different、row_number()、over() の違いの詳細な説明 = 1
ログイン後にコピー

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

Different、row_number()、over() の違いの詳細な説明

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

4 总结

通过阅读及实践以上内容,咱们已经知道了,无论是用关键字 Different、row_number()、over() の違いの詳細な説明 还是用Different、row_number()、over() の違いの詳細な説明 row_number() over() 都可以实现数据“去重”的功能。但是在实现使用的过程中,咱们要特别注意两者的用法特点以及区别。

在使用关键字 Different、row_number()、over() の違いの詳細な説明 的时候,咱们要知道其作用于单个字段和多个字段的时候是有区别的,作用于单个字段时,其“去重”的是表中所有该字段值重复的数据;作用于多个字段的时候,其“去重”的表中所有字段(即 Different、row_number()、over() の違いの詳細な説明 具体作用的多个字段)值都相同的数据。

使用Different、row_number()、over() の違いの詳細な説明 row_number() over() 的时候,其是按先分组排序后,再取出每组的第一条记录来进行“去重”的(在本篇博文中如此)。当然,在此处咱们还可以通过不同的限制条件来进行“去重”,具体如何实现,就需要大家自己去动脑思考啦!

最后,在本篇博文中,作者详述了自己对用关键字 Different、row_number()、over() の違いの詳細な説明 和Different、row_number()、over() の違いの詳細な説明 row_number() over() 进行数据“去重”的一些认识,希望以上的内容能够对大家有所帮助!

【相关推荐】

1. Mysql免费视频教程

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

3. 实例详解 mysql中innodb_autoinc_lock_mode

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

5. 实例详解mysql中init_connect方法

以上がDifferent、row_number()、over() の違いの詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート