前回「複数の表からデータを取り出す方法」では、結合の種類と特徴、構文について学習しました。
今回は、以下の項目を確認します。
■例題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文のことです。副問い合わせを使用することで、欲しい情報を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は、複数行を戻す副問い合わせに用いる「複数行比較演算子」ですが、単一行を戻す問い合わせに用いてもエラーにはなりません。
選択肢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です。
Copyright © ITmedia, Inc. All Rights Reserved.