■SQL攻略 - 実行すれば理解できる!

HOME>>SQL攻略マップ>>入れ子の問合せ>>EXISTS記述

EXISTS記述

■EXISTS記述
EXISTS記述を使用した入れ子の問合せの学習をします。

EXISTS記述(1)
--給料がもっとも高い従業員の抽出
SELECTENAME,SAL
FROMEMP EA
WHERENOT EXISTS(
SELECT * FROM EMP EB
WHRE EB.SAL > EA.SAL
)

このSQLはEXISTS記述を使って、給料が最も高い従業員の抽出を行っています。

EXISTS記述は()の中に書いてあるSQLで抽出されるレコードがある場合は真、無い場合は偽を返してきます。真のときのみ外側のWHERE条件が成立し、レコードが抽出されます。

実際の動作は外側のEMP表(EA)から一行ずつ取り出され、内側のSQLで比較されます。

EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
7369 SMITH CLERK 7902 1980-12-17 800 20
7499 ALLEN SALESMAN 7698 1981-02-20 1600 300 30
7521 WARD SALESMAN 7698 1981-02-22 1250 500 30
7566 JONES MANAGER 7839 1981-04-02 2975 20
7654 MARTIN SALESMAN 7698 1981-09-28 1250 1400 30
7698 BLAKE MANAGER 7839 1981-05-01 2850 30
7782 CLARK MANAGER 7839 1981-06-09 2450 10
7839 KING PRESIDENT 1981-11-17 5000 10
7844 TURNER SALESMAN 7698 1981-09-08 1500 0 30
7900 JAMES CLERK 7698 1981-12-03 950 30
7902 FORD ANALYST 7566 1981-12-03 3000 20
7934 MILLER CLERK 7782 1982-01-23 1300 10

EMP表のEA側の一行(SMITHの給料の800)が取り出されます。これを用いて内側のSQLでEB.SAL > EA.SALの比較が行われます。EA.SALは800なので内側のSQLはレコードを返し、EXISTSは真となります。NOTで否定しているので、答えは偽となり、SMITHのレコードは抽出されません。

上から順番にデータが取り出され、KINGの行までくると、KINGのSALは5000ですから、内側のSQLはレコードを抽出しないので、EXISTSは偽となり、NOTで真になるので、KINGのレコードは抽出されます。

現在使用中のDBMSがEXISTSに対応していないため、実習はありません。

以上でEXISTS記述は終了です。


<<IN記述
http://sql.main.jp by san