主問い合わせ【SQL】
入れ子になったSQL文における外側のSQL文だよ
最終的な結果を得るSQL文だよ
簡単に書くよ
主問い合わせ【SQL】(読:シュトイアワセ 英:main query)とは
「副問い合わせ」と呼ばれている「入れ子になったSQL文
(データベースに対する命令文)(SQL文の結果を使ったSQL文)」の話で出てくる用語のひとつ
であり
入れ子の外側の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文」です。
もしくは「入れ子になったSQL文における中に書いてある方のSQL文」です。
「サブクエリ」と表現されることも あります。
実は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文する」例を紹介しましたが、いろいろな書き方の副問い合わせがあります。
そこら辺の あれやこれやが気になる方は他のところで情報を補完してください。
以上を踏まえて、本題に入ります。
先ほど副問い合わせの説明をするときに
SELECT
count(*)
FROM
(
SELECT
column1
FROM
tbl1
WHERE
ID = 1
)
;
という例を挙げました。
繰り返しになりますが、このSQL文は
1.「tbl1」という名前のテーブルから「項目『ID』の値が1」な条件に合うデータを選んで、選び出されたデータの項目「column1」の値を取り出してよ
2.「1」で取り出したデータの件数を教えてよ
な命令です。
このSQL文において
2.「1」で取り出したデータの件数を教えてよ
を取得するSQL文が「主問い合わせ」です。
「メインクエリ」と表現されることも あります。
実際のSQL文としては
SELECT
count(*)
FROM
(
SELECT
column1
FROM
tbl1
WHERE
ID = 1
)
;
における
SELECT
count(*)
FROM
(
SELECT
column1
FROM
tbl1
WHERE
ID = 1
)
;
の部分です。
つまり、SQL文全体です。
……という解釈と
SELECT
count(*)
FROM
の部分という解釈があるようです。
突き詰めて考えると分からなくなりそうですね。
表現としては
1.入れ子になったSQL文の外側の方
2.最終的な結果を得るSQL文
のどちらかで覚えておけば良いと思います。
一言でまとめるよ
まぁ「主問い合わせ」って単語が出てきたら「入れ子になったSQL文
(データベースに対する命令文)(SQL文の結果を使ったSQL文)における、外側のSQL文(最終的な結果を得るSQL文)のことなんだな~」と お考えください。
おまけ
■検索してみる?






