連載
» 2008年09月12日 00時00分 公開

SQLの副問い合わせを使いこなす間違いやすいポイントを追え! Bronze SQL基礎I(7)(1/2 ページ)

Oracleデータベースエンジニアとしての基礎力を証明するORACLE MASTER Bronze。その取得を目指すITエンジニアのための講座が本連載だ。間違いやすいポイントを確認し、合格に近づこう!

[ゴールデンフォレスト株式会社,@IT]

 前回「複数の表からデータを取り出す方法」では、結合の種類と特徴、構文について学習しました。

 今回は、以下の項目を確認します。

  • 副問い合わせの基礎
  • 副問い合わせで使用する比較演算子

副問い合わせの構文

例題1

EMPLOYEES表からLAST_NAMEと一番高い給与(SALARY)を検索しているSQL文をすべて選択してください。

a.select last_name,salary from employees

  where salary=(select salary from employees

         where salary=(select max(salary) from employees));

b.select last_name,max(salary) from employees;

c.select last_name,salary from employees

  where salary in(select salary from employees

         where salary in (select max(salary) from employees));

d.select last_name,salary from employees

  where salary=(select salary from employees

         where last_name=(select max(salary) from employees));

例題の範囲をおさらい

参考:「SELECT文中のSELECT文、副問い合わせ

 副問い合わせとは、SELECT文の句に埋め込まれたSELECT文のことです。副問い合わせを使用することで、欲しい情報を1つのSQL文で求めることができます。

正解

a、c

解説

選択肢a:このSQL文を実行した結果は以下のようになります。

SQL> select last_name,salary from employees
  2  where salary=(select salary from employees
  3  where salary=(select max(salary) from employees));
LAST_NAME                SALARY
-------------------- ----------
King                      24000

 SQL文中の副問い合わせのみを実行してみると、以下の結果が戻ります。

SQL> select salary from employees
  2  where salary=(select max(salary) from employees);
    SALARY
----------
     24000

 副問い合わせで一番高い給与を確認し、主問い合わせでその給与をもらっている人を検索しています。

SQL> select last_name,salary from employees
  2  where salary=24000;
LAST_NAME                SALARY
-------------------- ----------
King                      24000

 このように、副問い合わせの使用で、1つのSQL文で結果を求めることが可能になります。

選択肢b:このSQL文を実行すると、以下のようにエラーとなります。

SQL> select last_name,salary from employees
  2  where salary=24000;
LAST_NAME                SALARY
-------------------- ----------
King                      24000

 これは、MAXというグループ関数の利用と、LAST_NAMEのように複数行の値を戻す列の検索は同時に行うことができないためです。

参考:「SQLの関数でデータを集計する

選択肢c:選択肢aとほぼ同じですが、WHERE句にある演算子が「=」ではなく「in」になっています。このSQL文を実行した結果は以下のようになります。

SQL> select last_name,salary from employees
  2  where salary in (select salary from employees
  3  where salary in (select max(salary) from employees));
LAST_NAME                SALARY
-------------------- ----------
King                      24000

 inは、複数行を戻す副問い合わせに用いる「複数行比較演算子」ですが、単一行を戻す問い合わせに用いてもエラーにはなりません。

参考:「SELECT文中のSELECT文、副問い合わせ

選択肢d:このSQL文を実行すると、以下のようにエラーとなります。

SQL> select last_name,salary from employees
  2  where salary=(select salary from employees
  3  where last_name=(select max(salary) from employees));
where last_name=(select max(salary) from employees))
                    *
行3でエラーが発生しました。:
ORA-01722: 数値が無効です。

 副問い合わせ内の、強調した列に注意してください。

select salary from employees
where last_name=(select max(salary) from employees)

 WHERE句の条件としてLAST_NAME列がありますが、副問い合わせの結果はMAX(SALARY)の結果となり、データ型が異なるためエラーとなります。

 よって、指定のデータを検索しているSQL文はa、cです。

       1|2 次のページへ

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。