SQL - サブクエリ

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;                           

おすすめ

転載: blog.csdn.net/J__aries/article/details/130161680