前回、Oracle上でソートして上位n件のデータを取得するSQLを作成したが、今回は他のDB上で同様のSQLを作成してみたので、共有する。
前提条件
下記記事に記載されている、MySQLとPostgreSQLでのユーザー作成とUSER_DATAテーブル作成が完了していること。
![](https://www.purin-it.com/wp-content/uploads/2020/10/beach-1850059_640.jpg)
![](https://www.purin-it.com/wp-content/uploads/2020/10/sunset-690083_640-320x180.jpg)
また、下記記事の「前提条件」の内容が完了していること。
![](https://www.purin-it.com/wp-content/uploads/2020/10/munsterland-1494592_640-320x180.jpg)
さらに、各DB上のUSER_DATAテーブルに、以下のデータが追加されていること。(下記はOracleの例)
1 | SELECT * FROM USER_DATA |
![前提条件_2](https://www.purin-it.com/wp-content/uploads/2021/03/zentei_2.png)
やってみたこと
Oracleの場合の実行結果
Oracleの場合の実行結果は、下記記事を参照のこと。
![](https://www.purin-it.com/wp-content/uploads/2021/02/beach-1867590_640-320x180.jpg)
MySQLの場合の実行結果
MySQLで、ROW_NUMBER分析関数を利用し、USER_DATAテーブルのデータを、生年月日と性別を加工し、IDの昇順にソートした後で、上位5件のみを取得するSQLの実行結果は、以下の通り。ROW_NUMBER分析関数の記載方法は、Oracleの場合と同じになる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | SELECT usr.* FROM( SELECT ID, NAME, STR_TO_DATE( CONCAT(LPAD(BIRTH_YEAR, 4, '0') , LPAD(BIRTH_MONTH, 2, '0') , LPAD(BIRTH_DAY, 2, '0')) , '%Y%m%d') AS BIRTHDAY, CASE SEX WHEN '1' THEN '男' WHEN '2' THEN '女' ELSE '' END AS SEX_STR, MEMO, ROW_NUMBER() OVER (ORDER BY ID ASC) RN FROM USER_DATA ) usr WHERE usr.RN <= 5 |
![MySQL実行結果_RN利用](https://www.purin-it.com/wp-content/uploads/2021/03/exec_mysql_rn.png)
また、先ほどのSQLと同様のことを、ROW_NUMBER 分析関数を利用しないで実行した結果は、以下の通り。ソート処理は副問い合わせの外で行い、LIMIT句で上位5件の取得を行っている。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | SELECT usr.* FROM( SELECT ID, NAME, STR_TO_DATE( CONCAT(LPAD(BIRTH_YEAR, 4, '0') , LPAD(BIRTH_MONTH, 2, '0') , LPAD(BIRTH_DAY, 2, '0')) , '%Y%m%d') AS BIRTHDAY, CASE SEX WHEN '1' THEN '男' WHEN '2' THEN '女' ELSE '' END AS SEX_STR, MEMO FROM USER_DATA ) usr ORDER BY usr.ID LIMIT 5 |
![MySQL実行結果_RN未利用](https://www.purin-it.com/wp-content/uploads/2021/03/exec_mysql_norn.png)
PostgreSQLの場合の実行結果
PostgreSQLで、ROW_NUMBER分析関数を利用し、USER_DATAテーブルのデータを、生年月日と性別を加工し、IDの昇順にソートした後で、上位5件のみを取得するSQLの実行結果は、以下の通り。ROW_NUMBER分析関数の記載方法は、Oracleの場合と同じになる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | SELECT usr.* FROM( SELECT ID, NAME, TO_DATE( CONCAT(TO_CHAR(BIRTH_YEAR, '0000') , TO_CHAR(BIRTH_MONTH, '00') , TO_CHAR(BIRTH_DAY, '00')) , 'YYYYMMDD') AS BIRTHDAY, CASE SEX WHEN '1' THEN '男' WHEN '2' THEN '女' ELSE '' END AS SEX_STR, MEMO, ROW_NUMBER() OVER (ORDER BY ID ASC) RN FROM USER_DATA ) usr WHERE usr.RN <= 5 |
![PostgreSQL実行結果_RN利用](https://www.purin-it.com/wp-content/uploads/2021/03/exec_postgresql_rn.png)
また、先ほどのSQLと同様のことを、ROW_NUMBER 分析関数を利用しないで実行した結果は、以下の通り。MySQLの場合と同様に、ソート処理は副問い合わせの外で行い、LIMIT句で上位5件の取得を行っている。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | SELECT usr.* FROM( SELECT ID, NAME, TO_DATE( CONCAT(TO_CHAR(BIRTH_YEAR, '0000') , TO_CHAR(BIRTH_MONTH, '00') , TO_CHAR(BIRTH_DAY, '00')) , 'YYYYMMDD') AS BIRTHDAY, CASE SEX WHEN '1' THEN '男' WHEN '2' THEN '女' ELSE '' END AS SEX_STR, MEMO FROM USER_DATA ) usr ORDER BY usr.ID ASC LIMIT 5 |
![PostgreSQL実行結果_RN未利用](https://www.purin-it.com/wp-content/uploads/2021/03/exec_postgresql_norn.png)
SQL Serverの場合の実行結果
SQL Serverで、ROW_NUMBER分析関数を利用し、USER_DATAテーブルのデータを、生年月日と性別を加工し、IDの昇順にソートした後で、上位5件のみを取得するSQLの実行結果は、以下の通り。ROW_NUMBER分析関数の記載方法は、Oracleの場合と同じになる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | SELECT usr.* FROM( SELECT ID, NAME, CONVERT(DATETIME , (FORMAT(BIRTH_YEAR,'0000') + FORMAT(BIRTH_MONTH,'00') + FORMAT(BIRTH_DAY,'00'))) AS BIRTHDAY, CASE SEX WHEN '1' THEN '男' WHEN '2' THEN '女' ELSE '' END AS SEX_STR, MEMO, ROW_NUMBER() OVER (ORDER BY ID ASC) RN FROM USER_DATA ) usr WHERE usr.RN <= 5 |
![SQLServer実行結果_RN利用](https://www.purin-it.com/wp-content/uploads/2021/03/exec_sqlserver_rn.png)
また、先ほどのSQLと同様のことを、ROW_NUMBER 分析関数を利用しないで実行した結果は、以下の通り。ソート処理は副問い合わせの外で行い、先頭のSELECTに付与しているTOP句で上位5件の取得を行っている。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | SELECT TOP 5 usr.* FROM( SELECT ID, NAME, CONVERT(DATETIME , (FORMAT(BIRTH_YEAR,'0000') + FORMAT(BIRTH_MONTH,'00') + FORMAT(BIRTH_DAY,'00'))) AS BIRTHDAY, CASE SEX WHEN '1' THEN '男' WHEN '2' THEN '女' ELSE '' END AS SEX_STR, MEMO FROM USER_DATA ) usr ORDER BY usr.ID ASC |
![SQLServer実行結果_RN未利用](https://www.purin-it.com/wp-content/uploads/2021/03/exec_sqlserver_norn.png)
要点まとめ
- 各DB上でソートして上位n件のデータを取得するには、Oracleの場合と同様にROW_NUMBER 分析関数を利用するか、SQLの副問い合わせ外でソートした後で、LIMIT句やTOP句で上位n件を取得すればよい。