Home実験室 − No.0072


        No.0072(SQL)
        副文と比較演算子

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

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

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



  1. 1.次の2つの学科での、TOEICの点数の傾向性を探ってみよう。
  2531 情報通信メディア工学科
  2875 まちづくり建築デザイン学科


  2. まず、各学科のTOEICの最高点と最低点は....

SQL> Select MAX(TOEIC) 最高点,MIN(TOEIC) 最低点 FROM TT01_学生 WHERE 学科コード='2531'; 最高点 最低点 ---------- ---------- 994 126 SQL> Select MAX(TOEIC) 最高点,MIN(TOEIC) 最低点 FROM TT01_学生 WHERE 学科コード='2875'; 最高点 最低点 ---------- ---------- 963 120 SQL>



  3. 【副問い合わせ】
比較演算子「>=ALL」は、右辺のどのデータよりも大きいデータを抽出することができる。
....はずなのだが.....?
期待値としては、情報通信メディア工学科の最高点獲得者は、まちづくり建築デザイン学科の最高点の人よりも
高得点なので、少なくとも一人は引っかかるはずなのだが.....

SQL> Select 氏名,TOEIC FROM TT01_学生 WHERE 学科コード='2531' and TOEIC >= ALL 2 (Select TOEIC FROM TT01_学生 WHERE 学科コード='2875'); レコードが選択されませんでした。 SQL>



  4. 実はTOEIC列のデータには、NULLが有り得る。未受験の人のTOEICデータはNULLなのだ。
  副問い合わせの結果にNULLが一つでも含まれていると、副問い合わせの結果自体がNULLになってしまう。
  だから、副問い合わせの結果からNULLを排除しなければならない。

SQL> Select 氏名,TOEIC FROM TT01_学生 WHERE 学科コード='2531' and TOEIC >= ALL 2 (Select TOEIC FROM TT01_学生 WHERE 学科コード='2875' and TOEIC IS NOT NULL); 氏名 TOEIC ---------------------------------------- ---------- 高崎 敏行 966 佐竹 重雄 970 Hiram Cross 971 新垣 昌孝 994 SQL>



  5. 上記の結果に、ORDER BY句を加えておこう。

SQL> Select 氏名,TOEIC FROM TT01_学生 WHERE 学科コード='2531' and TOEIC >= ALL 2 (Select TOEIC FROM TT01_学生 WHERE 学科コード='2875' and TOEIC IS NOT NULL) 3 ORDER BY TOEIC DESC; 氏名 TOEIC ---------------------------------------- ---------- 新垣 昌孝 994 Hiram Cross 971 佐竹 重雄 970 高崎 敏行 966 SQL>



  6. 一方、最低点は、まちづくり建築デザイン学科の人のほうが得点が低い。
情報通信メディア工学科の誰よりも得点が低い(情報通信メディア工学科の最低点より更に成績が悪い)
人の一覧を出してみよう。

SQL> Select 氏名,TOEIC FROM TT01_学生 WHERE 学科コード='2875' and TOEIC <= ALL 2 (Select TOEIC FROM TT01_学生 WHERE 学科コード='2531' and TOEIC IS NOT NULL) 3 ORDER BY TOEIC; 氏名 TOEIC ---------------------------------------- ---------- 小平 昇 120 下山 朋美 125 SQL>



  7. 【比較演算子「IN」】
INは、任意に列挙した値と合致するものがあるかどうかを見たいときに便利。
副問い合わせって感じじゃないけど。

SQL> Select 氏名,TOEIC FROM TT01_学生 WHERE 学科コード='2531' and TOEIC IN (911,912,913,914,915,916,917,918,919,920); 氏名 TOEIC ---------------------------------------- ---------- 寺沢 吉郎 913 桜田 義弘 916 SQL>



  8. 【比較演算子の種類】
左辺 > ALL 右辺右辺のどれよりも大きい 
左辺 = ALL 右辺右辺のどれとも等しい右辺が複数行の場合、NULLが返る。普通やらない。
左辺 <>ALL 右辺右辺のどれとも違う「NOT IN」と同意
左辺 < ALL 右辺右辺のどれよりも小さい 
左辺 > ANY 右辺右辺のどれかよりかは大きい 
左辺 = ANY 右辺右辺のどれかとなら等しい「IN」と同意
左辺 <>ANY 右辺右辺の最低どれか一つと違う右辺が複数行の場合、NULLが返る。普通やらない。
左辺 < ANY 右辺右辺のどれかよりかは小さい 




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


Home実験室 − No.0072

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