SQL 言語では、SELECT-FROM-WHERE ステートメントはクエリ ブロックと呼ばれます。
サブクエリ (または内部クエリ) は、内部にネストされたSELECT クエリです。
(1) SELECT、UPDATE、INSERT、DELETE文の WHERE、
(2) GROUP BY を含むHAVING句では、
(3) または他のサブクエリ内
(クエリ条件を形成するための比較 (6) 演算子または論理 (3) 演算子と合わせて) サブクエリの SELECT クエリは常に括弧で囲まれます。
(構文的に言えば、サブクエリは関係演算を完了する括弧で囲まれた特別な「条件」であるため、式が許可される場所にサブクエリを出現させることができます)
1 ネストされたサブクエリ
平均以上の給与を持つ従業員に関する情報をクエリします。
1: 最初に平均給与をクエリします。
mysql> emp から avg(sal) を選択します。
+-------------+
| 平均(給与) |
+-------------+
| 2073.214286 |
+-------------+2: 平均給与より高いクエリ
select * from emp
where sal > (select avg(sal) from emp);
2 ネストされたサブクエリから
各部門の平均給与の給与表をクエリします。
1: 各部門の平均給与を一時テーブルとして求めます。
mysql> deptno による emp グループからの avgsal として deptno,avg(sal) を選択します。
+--------+---------------+
| 部門番号 | 平均 |
+--------+---------------+
| 20 | 2175.000000 |
| 30 | 1566.666667 |
| 10 | 2916.666667 |
+----------+---------------+2: t テーブルと斜度テーブルを接続、条件 (s.losal と s.hisal 間の t.avgsal)
select
t.*,s.grade
from
(select deptno,avg(sal) as avgsal from emp group by deptno) t
join
salgrade s
on
t.avgsal between s.losal and s.hisal;
3 つのネストされたサブクエリを選択します
各従業員の所属部署の部署名を問い合わせて、従業員名と部署名を表示します。
emp テーブルの ename に対応する depnto と、dept テーブルの dname に対応する deptno
select
e.ename,(select d.dname from dept d where e.deptno=d.deptno) as dname
from
emp e;
複数テーブル結合クエリ
select
e.ename,d.dname
from
emp e
join
dept d
on
e.deptno=d.deptno;
例 56: 「VB」コースを受講した学生のコース数と平均成績を数えます。
SELECT SNO 学号, count(*) 选课门数,AVG(GRADE) 平均成绩 from sc where sno in (Select sno from sc join course c On c.cno=sc.cno Where cname='vb') Group by sno
複数テーブル結合は使用できません(クエリをステップに分割する必要がある場合、サブクエリのみ使用できます。つまり、クエリ対象の列はテーブルから取得されますが、統計関数が関与し、条件が他のテーブルから取得される場合、複数テーブル結合の代わりにサブクエリを使用します):
# (结果错误) select sno 学号, count(*) 选课门数 , avg(grade) 平均成绩 from sc join course c on c.cno=sc.cno where cname='vb' group by sno;