サブクエリ【SQL】
入れ子になったSQL文だよ
もしくは、入れ子になったSQL文における中に書いてある方のSQL文だよ
普通はselect文だよ
簡単に書くよ
サブクエリ【SQL】(英:subquery)とは
ショボい例だけど、例えば「SELECT * FROM (SELECT column1 FROM tbl1)」のように、SQL文
(データベースに対する命令文)の中に入れ子になってSQL文が書かれていること。
言い方を変えると
SQL文の結果を使ったSQL文
です。
もしくは
「SELECT * FROM (SELECT column1 FROM tbl1)」における「SELECT column1 FROM tbl1」の部分のように、入れ子になって書かれているSQL文における中に書いてある方のSQL文のこと
です。
詳しく書くよ
順番に見ていきましょう。
まずは予備知識として
・データベース
・テーブル
・SQL
・SQL文(クエリ)
・select文
について説明します。
「そんなの説明されなくても知ってるよ!」な人は適当に読み飛ばしてください。
データベースは「データを入れておく箱」です。
ただし「データベース」という用語は、実際には もう少し複雑な概念です。
データを入れておく箱そのものは「テーブル」と言います。
とりあえず
データベースの話において、実際にデータを入れておく箱がテーブル
と覚えてください。
SQLは「データベースと やり取りするときに使う言葉」です。
データベースにデータを入れるときは、データベースさんに「これを入れておいて」と命令します。
データベースからデータを取り出すときは、データベースさんに「こんなデータを取り出しておくれ」と命令します。
SQLは、そんな命令をするときに使う言葉です。
SQL文は「データベースに対する、SQLを使った命令文」です。
「クエリ」とも呼ばれます。
「SQL」と「SQL文」は違います。
あまり神経質になる必要はありませんが、区別できるように しておいてください。
SQLは「言語」です。
SQL文は「命令(文)」です。
例えば、そうですね。
ピヨ子さんがピヨ太君に日本語で「パン買ってこい!」と命令したとしましょう。
ピヨ子さんが人間、ピヨ太君がデータベースだとすれば「日本語」が「SQL」です。
「パン買ってこい!な命令」が「SQL文」になります。
select文はデータベースさんに対する「これ、探してこい」な命令文です。
データベースの中にあるデータを取り出すときに使います。
select文の基本的な書式は以下の通りです。
SELECT
【取り出す項目】
FROM
【対象のテーブル】
WHERE
【取り出す条件】
;
例えば
SELECT
column1
FROM
tbl1
WHERE
ID = 1
;
というselect文が あったとしましょう。
これは
「tbl1」という名前のテーブルから「項目『ID』の値が1」な条件に合うデータを選んで、選び出されたデータの項目「column1」の値を取り出してよ
な命令です。
以上を踏まえて、本題に入ります。
実はSQL文というのは入れ子にできるのです。
例えば
SELECT
count(*)
FROM
(
SELECT
column1
FROM
tbl1
WHERE
ID = 1
)
;
のような書き方ができます。
このSQL文は
1.「tbl1」という名前のテーブルから「項目『ID』の値が1」な条件に合うデータを選んで、選び出されたデータの項目「column1」の値を取り出してよ
2.「1」で取り出したデータの件数を教えてよ
な命令です。
※【取り出す項目】に書いてある「count(*)」は「件数を教えてよ!」な指示です。
つまり
select文の結果に対してselect文をしている
わけです。
お待たせしました。
この例で登場した
SELECT
count(*)
FROM
(
SELECT
column1
FROM
tbl1
WHERE
ID = 1
)
;
のような
入れ子になっているSQL文
が「サブクエリ」です。
言い方を変えると
SQL文の結果を使ったSQL文
です。
「副問い合わせ」と表現されることも あります。
あるいは
SELECT
count(*)
FROM
(
SELECT
column1
FROM
tbl1
WHERE
ID = 1
)
;
における
SELECT
column1
FROM
tbl1
WHERE
ID = 1
のような
入れ子になっているSQL文において中に書いてある方のSQL文
が「サブクエリ」です。
どちらを指しているかは文脈から判断してください。
今回は「select文の結果をselect文する」例を紹介しました。
FROM句の【対象のテーブル】のところをサブクエリにする形ですね。
他にも
■select文の結果をWHERE句の【取り出す条件】として指定する
SELECT
column2
FROM
tbl2
WHERE
column1 in (
SELECT
column1
FROM
tbl1
WHERE
ID = 1
)
;
とか
■select文の結果を使ってデータを投入する(insert文を発行する)
INSERT INTO tbl2 (column1)
SELECT
column1
FROM
tbl1
WHERE
ID = 1
;
とか、いろいろな書き方のサブクエリがあります。
入れ子の中になる方のSQL文は、ほぼ間違いなくselect文ですけどね。
また、データベースの種類によっては「あっ!この書き方のサブクエリは使えないからね!」な場合も あります。
そこら辺の あれやこれやは他のところで勉強してください。
一言でまとめるよ
まぁ「サブクエリ」って単語が出てきたら「SQL文
(データベースに対する命令文)を入れ子にする(SQL文の結果を使ったSQL文にする)こと、もしくは、SQL文を入れ子にしたSQL文における中に書いてある方のSQL文のことなんだな~」と お考えください。
おまけ
■訳してみるよ
「sub(サブ)」という接頭辞が付くと「~の下」や「副~」的な意味になります。
「query(クエリ)」の意味は「質問」とか「疑問」とか「問い合わせ」とか「質問する」とか「問い合わせる」とかです。
何となく くっつけると
副問い合わせ
となります。
■検索してみる?






