🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
SQL

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

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Q&A

解決済

2回答

1101閲覧

SQL文のコードについて

shinnyan

総合スコア6

SQL

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

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

0グッド

0クリップ

投稿2021/02/23 06:17

編集2021/02/23 08:18

イメージ説明

こちらのテーブルに対して次のSQL文についてです。
※SQLは標準SQLです

SELECT 社員コード FROM 社員 X WHERE NOT EXISTS (SELECT * FROM 社員 Y WHERE X.社員コード = Y.上司)

社員表から上司でない者を抽出しているわけですが、質問は2点です。

・副問合わせ句で表をXとYと読み替えていることに意味はあるのか。
・主問合せが無く、副問合わせ句のみで同様の結果となるのでは。

よろしくお願いいたします。

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

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

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

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

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

m.ts10806

2021/02/23 06:25

テーブル定義をCREATE TABLE文で サンプルデータをINSERT文で提示してください。 あと「SQL」とひとえにいってもたくさんありますしバージョンによっても機能が違います。 バージョンも含めて提示してください。質問タグにも追加してください。
Orlofsky

2021/02/23 06:33

ここの掲示板ではMarkdownの使い方を覚えてください。 質問のSQLはテーブル定義をCREATE TABLE文で、テーブル中のデータをINSERT文で https://teratail.com/help/question-tips#questionTips3-7 の [コード] に修正してください。 全角空白を入れるのも止めてください。
Orlofsky

2021/02/23 06:36

同じSQLでもデータベースやそのバージョンによって方言が大きいですから、どのデータベースを使うのかを質問のタグで示したり、質問にバージョンも明記した方が適切なコメントが付き易いです。
maisumakun

2021/02/23 07:05

> 主問合せが無く、副問合わせ句のみで同様の結果となるのでは。 どのようなSQLコードを想定しましたか?
shinnyan

2021/02/23 09:38

NOT EXISTSでなくEXISTSであれば副問合せをそのまま表出するのではという質問の間違えでした
m.ts10806

2021/02/23 09:41

>※SQLは標準SQLです http://www.sql-post.biz/2019/05/02/%E6%A8%99%E6%BA%96sql/ ???? MySQLとかPostgreSQLとかOracleとかSQL ServerとかSQLiteとかあると思うのですけど。 その中でもバージョンによって違う。 きつめに言うと「こたえになってない」です。
guest

回答2

0

副問合わせ句で表をXとYと読み替えていることに意味はあるのか。

社員コードはPRIMARY KEY(一意:同じキーは1つしかない)でしょう。
1つの同じ行が社員S001であり、S002であることはできないので、
Xは社員コードでのSELECT。Yで上司をSELECTするのを明示的に別の行として取得しています。

・主問合せが無く、副問合わせ句のみで同様の結果となるのでは

SQLに限らず、プログラムは実際に実行して動作を確認します。
その結果を質問に追記してください。

投稿2021/02/23 06:36

Orlofsky

総合スコア16417

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

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

shinnyan

2021/02/23 07:59

X、Yとしないと1つの同じ行が社員S001であり、S002である行を取り出すような文になってしまうのですか
Orlofsky

2021/02/23 09:28

[質問への追記・修正] の修正をすると、もっと詳しくコメントしてくれる人が出てくるかも?
guest

0

ベストアンサー

・副問合わせ句で表をXとYと読み替えていることに意味はあるのか。

単なる副問合せではなく相関副問合せによる自己参照ですから、XやYのようなエイリアスを付けないと、相関されません。

・主問合せが無く、副問合わせ句のみで同様の結果となるのでは。

相関副問合せですから、副問合せの内容だけだと同様にはなりません。

社員表から上司でない者を抽出

条件の表現としては、「部下がいないもの」ですね。

追記

相関問合せを使用しない例

SQL

1SELECT 社員コード 2FROM 社員 X left join( 3 select 上司 from 社員 group by 上司 4 ) Y 5 on X.社員コード=Y.上司 6WHERE Y.上司 is null

SQL

1SELECT 社員コード 2FROM 社員 3where 社員コード not in ( 4 select 上司 from 社員 where 上司 is not null 5 )

投稿2021/02/23 06:33

編集2021/02/24 11:29
sazi

総合スコア25327

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

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

shinnyan

2021/02/23 08:40 編集

エイリアスが無いといけないということは主問合せと副問合せが同時実行されてるイメージなんですか。副問合せで使用しているテーブルだと素問合せで使用できないからEXISTSするにも素材が一つしか用意できないと。
sazi

2021/02/23 08:55

> エイリアスが無いといけないということは主問合せと副問合せが同時実行されてるイメージなんですか。 相関問合せはそのイメージで問題ありません。 後半部分は誤字もありどのようにイメージされているのかよく分かりません。 以下参考にしてみて下さい。 https://www.atmarkit.co.jp/ait/articles/1703/01/news187.html
sazi

2021/02/23 09:10 編集

相関副問合せを使用しない例を追記しました。 結合がある以上、副問合せだけでは同様にならない事が分かりますか? > 上司でない者を抽出 と言われると、このような表現の方が近いですね。 また、どちらのコストが低いかは、状況によって使い分けが必要だと思いますが、部下の方が多いと考えると相関副問合せの方が低いと思います。
shinnyan

2021/02/23 09:35

結合とはEXISTSのことですね。副問合せだけでは駄目ですね、「上司という肩書を持つ社員」を取り出しているだけになる。 NOT EXISTSでなくEXISTSだけであれば副問合せをそのまま表出するのではという質問の間違えでした。
sazi

2021/02/23 09:41 編集

> 結合とはEXISTSのことですね。 いいえ。 追記したSQLではEXISTSは何処にも使用していませんよ。 existsは集合が存在するかどうかの判定です。結合とは関係ありません。 結合といっているのはテーブル間で項目を比較している式の事を言っています。
sazi

2021/02/24 11:31

相関副問合せを使用しない例を追記しました。 相関によるexistsよりもコスト高だと思われます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問