Home実験室 − No.0035


        No.0035(SQL)
        ソート(ORDER BY)についての追加実験

■環境
  □OS: Windows XP Professional SP3
  □Oracle: Oracle Database 11g R2 (Standard)
  □OSログインユーザ: ORA_DBAグループ
  □Oracleユーザ: dicdic(実験用ユーザー) → 実験環境構築スクリプト

■実験
  0. 実験ユーザー「dicdic」でコネクトする。

SQL> conn dicdic/Oracle11g 接続されました。 SQL>



  1. 【ソートの基本】 1993年12月1日〜9日生まれの人を、生年月日でソートして表示したい。

SQL> SELECT 氏名,生年月日 FROM TT01_学生 Where 生年月日 Like '1993120%' order by 生年月日; 氏名 生年月日 ---------------------------------------- ---------- 早川 雄三 19931201 越智 七菜 19931202 林田 康正 19931202 碓井 幸平 19931202 佐野 博久 19931202 徳永 公子 19931204 名取 新平 19931204 狩野 忠良 19931204 吉崎 由佳 19931204 川本 新平 19931204 相原 隆吾 19931204 板垣 千代 19931204 相沢 亀太郎 19931204 堀口 嘉子 19931205 横井 三喜 19931205 河崎 清三 19931205 本橋 清人 19931205 山根 沙彩 19931205 齋藤 行夫 19931205 新井 丈夫 19931205 亀田 伸也 19931206 佐久間 秋雄 19931206 松下 蒼依 19931206 大山 弓月 19931206 上村 真穂 19931206 河村 詠一 19931206 松浦 雅俊 19931207 榎本 結月 19931207 沖 貴文 19931207 滝沢 章司 19931207 浅沼 欧子 19931207 内野 心優 19931207 星野 夏音 19931208 尾崎 喜太郎 19931208 川添 昇一 19931208 木村 春男 19931208 依田 秀雄 19931209 森山 真依 19931209 岡 忠吉 19931209 植松 幸仁 19931209 小野田 泰介 19931209 滝川 善成 19931209 42行が選択されました。 SQL>



  2. 【明示的な昇順ソート】 誕生日が早い順。やっていることは上と同じ。

SQL> SELECT 氏名,生年月日 FROM TT01_学生 Where 生年月日 Like '1993120%' order by 生年月日 ASC; 氏名 生年月日 ---------------------------------------- ---------- 早川 雄三 19931201 越智 七菜 19931202 林田 康正 19931202 碓井 幸平 19931202 佐野 博久 19931202 徳永 公子 19931204 名取 新平 19931204 狩野 忠良 19931204 吉崎 由佳 19931204 川本 新平 19931204 相原 隆吾 19931204 板垣 千代 19931204 相沢 亀太郎 19931204 堀口 嘉子 19931205 横井 三喜 19931205 河崎 清三 19931205 本橋 清人 19931205 山根 沙彩 19931205 齋藤 行夫 19931205 新井 丈夫 19931205 亀田 伸也 19931206 佐久間 秋雄 19931206 松下 蒼依 19931206 大山 弓月 19931206 上村 真穂 19931206 河村 詠一 19931206 松浦 雅俊 19931207 榎本 結月 19931207 沖 貴文 19931207 滝沢 章司 19931207 浅沼 欧子 19931207 内野 心優 19931207 星野 夏音 19931208 尾崎 喜太郎 19931208 川添 昇一 19931208 木村 春男 19931208 依田 秀雄 19931209 森山 真依 19931209 岡 忠吉 19931209 植松 幸仁 19931209 小野田 泰介 19931209 滝川 善成 19931209 42行が選択されました。 SQL>



  3. 【降順ソート】 誕生日が遅い順

SQL> SELECT 氏名,生年月日 FROM TT01_学生 Where 生年月日 Like '1993120%' order by 生年月日 DESC; 氏名 生年月日 ---------------------------------------- ---------- 依田 秀雄 19931209 森山 真依 19931209 滝川 善成 19931209 小野田 泰介 19931209 岡 忠吉 19931209 植松 幸仁 19931209 星野 夏音 19931208 川添 昇一 19931208 木村 春男 19931208 尾崎 喜太郎 19931208 沖 貴文 19931207 松浦 雅俊 19931207 浅沼 欧子 19931207 内野 心優 19931207 榎本 結月 19931207 滝沢 章司 19931207 亀田 伸也 19931206 佐久間 秋雄 19931206 松下 蒼依 19931206 大山 弓月 19931206 上村 真穂 19931206 河村 詠一 19931206 山根 沙彩 19931205 齋藤 行夫 19931205 新井 丈夫 19931205 河崎 清三 19931205 堀口 嘉子 19931205 横井 三喜 19931205 本橋 清人 19931205 徳永 公子 19931204 相沢 亀太郎 19931204 川本 新平 19931204 吉崎 由佳 19931204 狩野 忠良 19931204 名取 新平 19931204 相原 隆吾 19931204 板垣 千代 19931204 越智 七菜 19931202 佐野 博久 19931202 林田 康正 19931202 碓井 幸平 19931202 早川 雄三 19931201 42行が選択されました。 SQL>



  4. 【Null値を含むデータのソート】 ここから先の例では、TOEIC列をソートに使用する。
     下のように、降順にすると Nullは一番上に表示されてしまう。Nullはゼロみたいなもんなのに....。

SQL> SELECT 氏名,TOEIC FROM TT01_学生 Where 生年月日 Like '1993120%' order by TOEIC DESC; 氏名 TOEIC ---------------------------------------- ---------- 板垣 千代 河村 詠一 沖 貴文 山根 沙彩 岡 忠吉 依田 秀雄 狩野 忠良 松下 蒼依 大山 弓月 植松 幸仁 浅沼 欧子 新井 丈夫 992 榎本 結月 942 相沢 亀太郎 921 佐久間 秋雄 746 堀口 嘉子 670 佐野 博久 657 川本 新平 622 上村 真穂 578 内野 心優 558 滝川 善成 557 齋藤 行夫 535 本橋 清人 490 吉崎 由佳 487 木村 春男 484 亀田 伸也 437 横井 三喜 415 相原 隆吾 414 松浦 雅俊 404 徳永 公子 373 越智 七菜 322 早川 雄三 272 滝沢 章司 271 川添 昇一 255 星野 夏音 250 河崎 清三 243 小野田 泰介 232 森山 真依 226 尾崎 喜太郎 195 林田 康正 194 碓井 幸平 150 名取 新平 139 42行が選択されました。 SQL>



  5. 【Null値を含むデータのソート】 NULLS LASTオプションを指定すると、Nullを最後にしてくれる。

SQL> SELECT 氏名,TOEIC FROM TT01_学生 Where 生年月日 Like '1993120%' order by TOEIC DESC NULLS LAST; 氏名 TOEIC ---------------------------------------- ---------- 新井 丈夫 992 榎本 結月 942 相沢 亀太郎 921 佐久間 秋雄 746 堀口 嘉子 670 佐野 博久 657 川本 新平 622 上村 真穂 578 内野 心優 558 滝川 善成 557 齋藤 行夫 535 本橋 清人 490 吉崎 由佳 487 木村 春男 484 亀田 伸也 437 横井 三喜 415 相原 隆吾 414 松浦 雅俊 404 徳永 公子 373 越智 七菜 322 早川 雄三 272 滝沢 章司 271 川添 昇一 255 星野 夏音 250 河崎 清三 243 小野田 泰介 232 森山 真依 226 尾崎 喜太郎 195 林田 康正 194 碓井 幸平 150 名取 新平 139 河村 詠一 沖 貴文 山根 沙彩 岡 忠吉 依田 秀雄 狩野 忠良 松下 蒼依 大山 弓月 植松 幸仁 浅沼 欧子 板垣 千代 42行が選択されました。 SQL>



  6. 【Null値を含むデータのソート】 NULLS FIRSTオプションを指定すると、Nullを最初にしてくれる。お好みで。

SQL> SELECT 氏名,TOEIC FROM TT01_学生 Where 生年月日 Like '1993120%' order by TOEIC NULLS FIRST; 氏名 TOEIC ---------------------------------------- ---------- 板垣 千代 河村 詠一 沖 貴文 山根 沙彩 岡 忠吉 依田 秀雄 狩野 忠良 松下 蒼依 大山 弓月 植松 幸仁 浅沼 欧子 名取 新平 139 碓井 幸平 150 林田 康正 194 尾崎 喜太郎 195 森山 真依 226 小野田 泰介 232 河崎 清三 243 星野 夏音 250 川添 昇一 255 滝沢 章司 271 早川 雄三 272 越智 七菜 322 徳永 公子 373 松浦 雅俊 404 相原 隆吾 414 横井 三喜 415 亀田 伸也 437 木村 春男 484 吉崎 由佳 487 本橋 清人 490 齋藤 行夫 535 滝川 善成 557 内野 心優 558 上村 真穂 578 川本 新平 622 佐野 博久 657 堀口 嘉子 670 佐久間 秋雄 746 相沢 亀太郎 921 榎本 結月 942 新井 丈夫 992 42行が選択されました。 SQL>



  7. 【複数列でソート指定できる】列名をカンマで区切ることで複数列に対してソート順を指定できる。エクセルみたい。

SQL> SELECT 氏名,生年月日,学科コード FROM TT01_学生 Where 生年月日 Like '1993120%' order by 生年月日 ,学科コード; 氏名 生年月日 学科コード ---------------------------------------- ---------- ---------- 早川 雄三 19931201 2445 越智 七菜 19931202 1521 碓井 幸平 19931202 1521 林田 康正 19931202 2101 佐野 博久 19931202 2703 名取 新平 19931204 1293 徳永 公子 19931204 1293 川本 新平 19931204 1350 吉崎 由佳 19931204 1578 狩野 忠良 19931204 2101 相沢 亀太郎 19931204 2359 板垣 千代 19931204 2531 相原 隆吾 19931204 2789 堀口 嘉子 19931205 1350 山根 沙彩 19931205 1578 横井 三喜 19931205 1635 河崎 清三 19931205 1635 新井 丈夫 19931205 2101 本橋 清人 19931205 2273 齋藤 行夫 19931205 2617 上村 真穂 19931206 1293 佐久間 秋雄 19931206 1350 大山 弓月 19931206 1521 亀田 伸也 19931206 1521 河村 詠一 19931206 1578 松下 蒼依 19931206 2703 沖 貴文 19931207 1293 内野 心優 19931207 1521 松浦 雅俊 19931207 1578 榎本 結月 19931207 2445 浅沼 欧子 19931207 2531 滝沢 章司 19931207 2617 川添 昇一 19931208 2015 尾崎 喜太郎 19931208 2101 木村 春男 19931208 2445 星野 夏音 19931208 2617 植松 幸仁 19931209 1293 依田 秀雄 19931209 1350 森山 真依 19931209 1464 小野田 泰介 19931209 2445 滝川 善成 19931209 2531 岡 忠吉 19931209 2531 42行が選択されました。 SQL>



  8. もちろん、複数列で、降順と昇順を混在できる。

SQL> SELECT 氏名,生年月日,学科コード FROM TT01_学生 Where 生年月日 Like '1993120%' order by 生年月日 ,学科コード DESC; 氏名 生年月日 学科コード ---------------------------------------- ---------- ---------- 早川 雄三 19931201 2445 佐野 博久 19931202 2703 林田 康正 19931202 2101 碓井 幸平 19931202 1521 越智 七菜 19931202 1521 相原 隆吾 19931204 2789 板垣 千代 19931204 2531 相沢 亀太郎 19931204 2359 狩野 忠良 19931204 2101 吉崎 由佳 19931204 1578 川本 新平 19931204 1350 徳永 公子 19931204 1293 名取 新平 19931204 1293 齋藤 行夫 19931205 2617 本橋 清人 19931205 2273 新井 丈夫 19931205 2101 横井 三喜 19931205 1635 河崎 清三 19931205 1635 山根 沙彩 19931205 1578 堀口 嘉子 19931205 1350 松下 蒼依 19931206 2703 河村 詠一 19931206 1578 亀田 伸也 19931206 1521 大山 弓月 19931206 1521 佐久間 秋雄 19931206 1350 上村 真穂 19931206 1293 滝沢 章司 19931207 2617 浅沼 欧子 19931207 2531 榎本 結月 19931207 2445 松浦 雅俊 19931207 1578 内野 心優 19931207 1521 沖 貴文 19931207 1293 星野 夏音 19931208 2617 木村 春男 19931208 2445 尾崎 喜太郎 19931208 2101 川添 昇一 19931208 2015 岡 忠吉 19931209 2531 滝川 善成 19931209 2531 小野田 泰介 19931209 2445 森山 真依 19931209 1464 依田 秀雄 19931209 1350 植松 幸仁 19931209 1293 42行が選択されました。 SQL>



  9. Select列に指定した順番の番号をソート列に使用できる。でも判りづらいから、あんまりやりたくないね。

SQL> SELECT 氏名,生年月日,学科コード FROM TT01_学生 Where 生年月日 Like '1993120%' order by 2 ,3 DESC; 氏名 生年月日 学科コード ---------------------------------------- ---------- ---------- 早川 雄三 19931201 2445 佐野 博久 19931202 2703 林田 康正 19931202 2101 碓井 幸平 19931202 1521 越智 七菜 19931202 1521 相原 隆吾 19931204 2789 板垣 千代 19931204 2531 相沢 亀太郎 19931204 2359 狩野 忠良 19931204 2101 吉崎 由佳 19931204 1578 川本 新平 19931204 1350 徳永 公子 19931204 1293 名取 新平 19931204 1293 齋藤 行夫 19931205 2617 本橋 清人 19931205 2273 新井 丈夫 19931205 2101 横井 三喜 19931205 1635 河崎 清三 19931205 1635 山根 沙彩 19931205 1578 堀口 嘉子 19931205 1350 松下 蒼依 19931206 2703 河村 詠一 19931206 1578 亀田 伸也 19931206 1521 大山 弓月 19931206 1521 佐久間 秋雄 19931206 1350 上村 真穂 19931206 1293 滝沢 章司 19931207 2617 浅沼 欧子 19931207 2531 榎本 結月 19931207 2445 松浦 雅俊 19931207 1578 内野 心優 19931207 1521 沖 貴文 19931207 1293 星野 夏音 19931208 2617 木村 春男 19931208 2445 尾崎 喜太郎 19931208 2101 川添 昇一 19931208 2015 岡 忠吉 19931209 2531 滝川 善成 19931209 2531 小野田 泰介 19931209 2445 森山 真依 19931209 1464 依田 秀雄 19931209 1350 植松 幸仁 19931209 1293 42行が選択されました。 SQL>



  10. 【計算結果でソートができる】 その場で生成した計算結果の列を使ってもソートできる。
     でも、TOEIC未受験の人の合計がNullになっちゃうなぁ

SQL> SELECT 氏名,単位数,TOEIC,単位数+TOEIC FROM TT01_学生 Where 生年月日 Like '1993120%' order by 単位数+TOEIC DESC; 氏名 単位数 TOEIC 単位数+TOEIC ---------------------------------------- ---------- ---------- ------------ 板垣 千代 208 河村 詠一 48 沖 貴文 126 山根 沙彩 114 岡 忠吉 134 依田 秀雄 80 狩野 忠良 134 松下 蒼依 206 大山 弓月 115 植松 幸仁 129 浅沼 欧子 57 新井 丈夫 207 992 1199 榎本 結月 206 942 1148 相沢 亀太郎 120 921 1041 佐久間 秋雄 201 746 947 川本 新平 203 622 825 堀口 嘉子 117 670 787 佐野 博久 129 657 786 内野 心優 201 558 759 上村 真穂 122 578 700 本橋 清人 206 490 696 滝川 善成 114 557 671 齋藤 行夫 111 535 646 横井 三喜 202 415 617 松浦 雅俊 202 404 606 木村 春男 120 484 604 吉崎 由佳 114 487 601 徳永 公子 206 373 579 亀田 伸也 132 437 569 相原 隆吾 123 414 537 越智 七菜 200 322 522 星野 夏音 207 250 457 河崎 清三 209 243 452 林田 康正 200 194 394 早川 雄三 118 272 390 滝沢 章司 114 271 385 川添 昇一 112 255 367 小野田 泰介 131 232 363 尾崎 喜太郎 125 195 320 森山 真依 86 226 312 碓井 幸平 125 150 275 名取 新平 114 139 253 42行が選択されました。 SQL>



  11. 自分で指定した列別名を、ソート列の指定に使用できる。
     TOEIC未受験の人の合計がNullになっちゃうなぁ。これを何とかしたいなぁ。

SQL> SELECT 氏名,単位数,TOEIC,単位数+TOEIC ごうけい FROM TT01_学生 Where 生年月日 Like '1993120%' order by ごうけい DESC; 氏名 単位数 TOEIC ごうけい ---------------------------------------- ---------- ---------- ---------- 板垣 千代 208 河村 詠一 48 沖 貴文 126 山根 沙彩 114 岡 忠吉 134 依田 秀雄 80 狩野 忠良 134 松下 蒼依 206 大山 弓月 115 植松 幸仁 129 浅沼 欧子 57 新井 丈夫 207 992 1199 榎本 結月 206 942 1148 相沢 亀太郎 120 921 1041 佐久間 秋雄 201 746 947 川本 新平 203 622 825 堀口 嘉子 117 670 787 佐野 博久 129 657 786 内野 心優 201 558 759 上村 真穂 122 578 700 本橋 清人 206 490 696 滝川 善成 114 557 671 齋藤 行夫 111 535 646 横井 三喜 202 415 617 松浦 雅俊 202 404 606 木村 春男 120 484 604 吉崎 由佳 114 487 601 徳永 公子 206 373 579 亀田 伸也 132 437 569 相原 隆吾 123 414 537 越智 七菜 200 322 522 星野 夏音 207 250 457 河崎 清三 209 243 452 林田 康正 200 194 394 早川 雄三 118 272 390 滝沢 章司 114 271 385 川添 昇一 112 255 367 小野田 泰介 131 232 363 尾崎 喜太郎 125 195 320 森山 真依 86 226 312 碓井 幸平 125 150 275 名取 新平 114 139 253 42行が選択されました。 SQL>



  12. 【ソートの際のNullの処理】 NVL関数を使って、Nullをゼロとして扱えば、正確なソートが可能になる。      でも、SQL文はどんどん長くなる。

SQL> SELECT 氏名,単位数,NVL(TOEIC,0),単位数+NVL(TOEIC,0) ごうけい FROM TT01_学生 Where 生年月日 Like '1993120%' order by ごうけい DESC; 氏名 単位数 NVL(TOEIC,0) ごうけい ---------------------------------------- ---------- ------------ ---------- 新井 丈夫 207 992 1199 榎本 結月 206 942 1148 相沢 亀太郎 120 921 1041 佐久間 秋雄 201 746 947 川本 新平 203 622 825 堀口 嘉子 117 670 787 佐野 博久 129 657 786 内野 心優 201 558 759 上村 真穂 122 578 700 本橋 清人 206 490 696 滝川 善成 114 557 671 齋藤 行夫 111 535 646 横井 三喜 202 415 617 松浦 雅俊 202 404 606 木村 春男 120 484 604 吉崎 由佳 114 487 601 徳永 公子 206 373 579 亀田 伸也 132 437 569 相原 隆吾 123 414 537 越智 七菜 200 322 522 星野 夏音 207 250 457 河崎 清三 209 243 452 林田 康正 200 194 394 早川 雄三 118 272 390 滝沢 章司 114 271 385 川添 昇一 112 255 367 小野田 泰介 131 232 363 尾崎 喜太郎 125 195 320 森山 真依 86 226 312 碓井 幸平 125 150 275 名取 新平 114 139 253 板垣 千代 208 0 208 松下 蒼依 206 0 206 岡 忠吉 134 0 134 狩野 忠良 134 0 134 植松 幸仁 129 0 129 沖 貴文 126 0 126 大山 弓月 115 0 115 山根 沙彩 114 0 114 依田 秀雄 80 0 80 浅沼 欧子 57 0 57 河村 詠一 48 0 48 42行が選択されました。 SQL>



    【PR】    Oracle実験室監修  『Oracleアーキテクチャ鳥瞰図』 PDF  (Oracleのアーキテクチャを一目で俯瞰できるイラスト)  


Home実験室 − No.0035

© 2011-2011   Amateur Laboratory of ORACLE
inserted by FC2 system