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

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

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

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

Q&A

解決済

1回答

1469閲覧

SQLの相関サブクエリの解釈

spiderindigo

総合スコア20

SQL

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

0グッド

0クリップ

投稿2020/06/21 05:35

SQLの相関サブクエリの解釈で間違いがあれば訂正していただきたいです。

サブクエリとはSELECT文の中に入れ子するSELECT文のこと、セレクトした結果得られたテーブルを更にセレクトするときに等に使う。
WHEREと組み合わせてひとつの要素だけ、つまりスカラ値のみをセレクトして検索条件にすることが出きる。

例えば部署ごとの身長の平均値等を元に平均以上の人物を検索したい。部署ごとの平均値が必要なためその時点でスカラ値ではなくなる。そこで使えるのが相関サブクエリである。
それではどのようにしてスカラ値として値を取り出すか?
それは簡単な変更を三点施すだけで実現できる。
クエリ、サブクエリ、どちらのセレクトも同じテーブルをセレクトするのでSQL文内で区別するためにそれぞれのテーブルにアダ名をつけてやる。まずこの二つの変更を行う。
次にサブクエリ内に「WHERE テーブル1.身長=テーブル2.身長」を追加する。
このウェア句は特別でテーブルのどのカラムの要素を繰り返し比較するかを 指定している。
つまり指定したカラムから1要素ずつスカラ値として取り出せるようになる。このウェア句の処理を「バインドする」という。
バインドするカラムを変更すれば別の検索条件を設定することも簡単にできる。

最後にSQL文全体を俯瞰してみてみる。クエリのウェア句の入れ子として相関サブクエリがバインドされたカラムのスカラ値を返す処理を繰り返し、その度に外側にあるクエリのセレクトが実行されると言う処理が行われている。

ご教授願います。

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

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

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

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

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

guest

回答1

0

ベストアンサー

概ねは間違っていないと思いますが、1点だけ誤りが。

次にサブクエリ内に「WHERE テーブル1.身長=テーブル2.身長」を追加する。

この指定ではNGです。
メインのテーブルと部署ごとの平均身長を計算した相関サブクエリがあり、相関サブクエリの出力は部署ごとの平均身長となっているはず。平均身長を取得したい部署を指定してあげないと平均身長が一意に決まりません。

SQLで書くとこのような感じになるでしょう。

sql

1select 2 氏名 3 ,部署 4 ,身長 5from 従業員T as main 6where 7 身長 > ( 8 select avg(sub.身長) from 従業員T as sub 9 where sub.部署 = main.部署 -- <-ココね! 10 group by 部署 11 );

細かい添削

  • テーブル別名のことをアダ名って書くと何か格好悪いのでエイリアスと呼んでいただければ。
  • ウェア句もなんだかウェアウルフみたいなのでwhere句と呼んであげてほしい。
  • ウェア句もそうだけどキーワードがカタカナだったり英文字だったりで統一感がない。セレクトSELECTとか。英文字側に統一すると文章も読みやすいし見た目も良い。

投稿2020/06/21 06:23

hope_mucci

総合スコア4447

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

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

spiderindigo

2020/06/21 06:34

たしかにカットごとの平均身長を取り出してあげなきゃ正しいSELECT結果が取り出せないですね。 用語に関してもかっこが付くように今後覚えていきます! ご指摘ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問