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

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

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

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

SQL

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

Q&A

解決済

1回答

730閲覧

SQLのEXISTS文の動き

Chandler_Bing

総合スコア673

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

SQL

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

0グッド

0クリップ

投稿2019/01/05 11:45

例として以下のテーブルから1件以上の受注実績を持つ社員を取得する場合

SQL

1CREATE TABLE `社員` ( 2 `e_code` varchar(10) NOT NULL, 3 `name` varchar(10) NOT NULL 4) ENGINE=InnoDB DEFAULT CHARSET=utf8; 5 6-- 7-- Dumping data for table `社員` 8-- 9 10INSERT INTO `社員` (`e_code`, `name`) VALUES 11('0001', 'チャーリー'), 12('0002', 'ルシール'), 13('0003', 'ライナス'), 14('0004', 'シュローダー'), 15('0005', 'ペパミント'), 16('0006', 'マーシー'); 17 18-- 19-- Indexes for dumped tables 20-- 21 22-- 23-- Indexes for table `社員` 24-- 25ALTER TABLE `社員` 26 ADD PRIMARY KEY (`e_code`); 27

SQL

1CREATE TABLE `受注` ( 2 `o_number` int(11) NOT NULL, 3 `p_code` varchar(10) NOT NULL, 4 `e_code` varchar(10) NOT NULL 5) ENGINE=InnoDB DEFAULT CHARSET=utf8; 6 7-- 8-- Dumping data for table `受注` 9-- 10 11INSERT INTO `受注` (`o_number`, `p_code`, `e_code`) VALUES 12(1, 'A001', '0001'), 13(2, 'A002', '0001'), 14(3, 'B002', '0004'), 15(4, 'D001', '0005'); 16 17-- 18-- Indexes for dumped tables 19-- 20 21-- 22-- Indexes for table `受注` 23-- 24ALTER TABLE `受注` 25 ADD PRIMARY KEY (`o_number`); 26 27-- 28-- AUTO_INCREMENT for dumped tables 29-- 30 31-- 32-- AUTO_INCREMENT for table `受注` 33-- 34ALTER TABLE `受注` 35 MODIFY `o_number` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=5; 36

SQLの実行文は以下のようになるようです。(http://www.sql-reference.com/select/subquery_exists.html参照)

SQL

1SELECT * 2FROM 社員 AS x 3WHERE EXISTS ( 4 SELECT * FROM 受注 5 WHERE e_code = x.e_code 6)

質問❶
WHERE e_code = x.e_code
の処理はINNER JOIN(どちらのテーブルに存在するものだけを繋ぐ)と同じでしょうか。

質問❷
今回のWHERE句で受注テーブルからの複数行、複数列の値が返ってくると思いますが、この際どのようにして社員テーブルから値を持ってきているのでしょうか。WHERE e_code = x.e_codeの処理はテーブルの紐付けのはずですし、WHERE句からは受注テーブルが返ってくるだけですよね。

質問❸
WHERE e_code = x.e_codeの実行結果だけを得たいのですがどう実行すればよいでしょうか。WHEREで結合?した結果を確認したいです。

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

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

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

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

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

guest

回答1

0

ベストアンサー

質問❶

考え方のイメージは良いですが、
受注テーブルに1件以上ある社員です。
逆に言うと受注テーブルに0件の社員以外です。

質問❷

EXISTSの動きは、存在するか/存在しないかです。
1件だろうが100万件だろうが、存在すると評価されます。
0件の時のみ存在しない評価になります。
なおFROM句もしくはJOIN句に受注テーブルがないため、
受注テーブルはSELECT句で取得できません。

質問❸

質問の内容と、一番最初に書かれている以下で期待される結果が矛盾してる印象を受けます。

例として以下のテーブルから1件以上の受注実績を持つ社員を取得する場合

社員テーブルを一意に確認したのであれば、EXISTS句を
受注テーブルを確認したいのであれば、JOIN句を
使ってください。

投稿2019/01/05 13:33

szk.

総合スコア1400

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

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

Chandler_Bing

2019/01/05 16:42

ありがとうございます。 質問❷に対しての回答ですが このコードですと、実際に返ってくるのはどのような値なのでしょうか。 FROM 受注 とあるのに、
退会済みユーザー

退会済みユーザー

2019/01/06 11:00

どの値がかえってくるかなんて自分で試せよ
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問