質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

3回答

1624閲覧

SQLのEXISTS記述がわかりません。

tukikai-incid

総合スコア12

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2018/06/11 10:10

編集2018/06/11 12:38

sql攻略というサイトで学習していたのですが、EXISTSでつまずきました。

参考URL
http://sql.main.jp/cont/sql/ne/exists.html

記載のSQLを実行すると、
SMITHの給料の800とSMITHの給料の800を比較することとなり、
800>800のEXISTSは偽となり、
NOTが付いているので真となってしまう気がします。

なぜサイトに書かれているように、最終的には最大の給与をもらっている人がわかるのか分かりません。
初歩的な質問で申し訳ありませんが、どうぞ宜しくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

exists内のサブクエリーは相関問合せです。

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

上記解説にあるように、相関問合せは外側の1行毎その1行の値サブクエリー内条件の全ての行との比較という所が理解のポイントです。

投稿2018/06/11 10:28

編集2018/06/12 04:03
sazi

総合スコア25206

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tukikai-incid

2018/06/11 11:58

1600>800という事でしょうか??
sazi

2018/06/11 12:49 編集

それは次の行の値との比較ですね。 次の行だけではなく、EA1行に対してEBの全行と比較することになります。 それを全てのEAの行に対して行う事になります。
guest

0

手続プログラミングでたとえると、二重ループになっていると考えると理解しやすいのかなと思います。
(あくまでたとえで、実際sqlやDBがいわゆるループ的に動くということではないです)

for(int i = 0 ; i < EAの行数; i++) for (int j = 0 ; j < EBの行数; j++)

なので、smithさんについては(i=jとなる任意のiについて)EB[j].SAL > EA[i].SALがなりたたずnot existsは真ですが、他のjをまわしていけば、最大の給料をもつi以外はEB[j].SAL > EA[i].SALとなるようなjが存在します。

投稿2018/06/12 04:05

papinianus

総合スコア12705

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

質問の中のURLは対応しているMarkdownの機能 の[リンク]を使いましょう。他のMarkdownの機能も良く読んでおくと良いです。

普通こんなトリッキーなSQLは書かないでしょうね。

SQL

1SELECT EA.ENAME,EA.SAL 2FROM EMP EA 3WHERE EA.SAL = ( 4SELECT MAX(EB.SAL) FROM EMP EB 5)

みたいな記述が一般的でしょう。SQLは他のサイトで勉強された方が良いように思えます。

SQLはデータベースによってかなり方言がありますから、お使いのデータベースをタグで明記したほうが適切なコメントが付き易いです。

投稿2018/06/11 12:01

Orlofsky

総合スコア16415

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問