目次
自己接続
これまでの研究を通じて、私たちはすでに接続についてある程度の理解を持っています。自己結合とは、平たく言えば、それ自体を結合すること、つまりテーブルを複数回クエリすることを意味します。
自己結合のプロセスでは、1 つのテーブルを 2 つのテーブルとして扱う、つまりエイリアス化する必要があります。
クエリ構文
SELECT 字段列表 FROM 表A 别名A JOIN 表A 别名B ON 条件...;
自己結合クエリは、内部結合クエリまたは外部結合クエリにすることができます。
自己接続デモ
1. 従業員とそのリーダーの名前を問い合わせる
テーブルを観察し、質問に対応する接続条件を見つけて、それらを分類します。
- テーブル構造: emp
- 接続条件: id = マネージャーID
select a.name '员工',b.name '领导' from emp a ,emp b where a.managerid = b.id;
検索結果:
2. すべての従業員とそのリーダーの名前をクエリします。従業員にリーダーがいない場合は、それらのリーダーもクエリする必要があります。
従業員にリーダーがいない場合は、従業員にクエリを実行する必要があり、外部結合 (左または右外部結合) を使用する必要があります。
テーブル構造と接続条件は変わりません。
select a.name '员工',b.name '领导' from emp a left outer join emp b on a.managerid = b.id;
検索結果:
ユニオンクエリ
ちょっとした豆知識を見てみましょう
ユニオンクエリ - ユニオン、すべてユニオン
ユニオン クエリの場合、複数のクエリの結果が結合されて、新しいクエリ結果セットが形成されます。
クエリ構文
SELECT 字段列表 FROM 表A ...
UNION [ALL]
SELECT 字段列表 FROM 表B ...;
結合クエリの場合、複数のテーブルの列数が一貫している必要があり、フィールド タイプも一貫している必要があります。
Union all はすべてのデータを直接結合し、union は結合されたデータを重複排除します。
サブクエリ
導入
1.コンセプト
SQL ステートメント内で SELECT ステートメントをネストすることは、ネストされたクエリと呼ばれ、サブクエリとも呼ばれます。
SELECT * FROM t1 WHERE column1 = (SELECT column1 FROM t2);
サブクエリの外側のステートメントは、INSERT/UPDATE/DELETE/SELECT のいずれかになります。
2. サブクエリのさまざまな結果に従って、次のように分類されます。
- スカラー サブクエリ (サブクエリの結果は単一の値)
- 列サブクエリ(サブクエリ結果は1列)
- 行サブクエリ(サブクエリの結果は1行)
- テーブルサブクエリ (サブクエリの結果は複数の行と列です)
3. サブクエリの位置により、WHERE 以降、FROM 以降、SELECT 以降に分かれます。
スカラーサブクエリ
サブクエリによって返される結果は単一の値 (数値、文字列、日付など) であり、最も単純な形式では、このサブクエリはスカラー サブクエリと呼ばれます。
一般的に使用される演算子: = <> < <= > >=
実際にやってみましょう:
1.「営業部」の全従業員情報を問い合わせる
クエリはまず 2 つのステップに分かれています。1 つ目は営業部門の部門 ID をクエリし、2 つ目は部門 ID に対応する従業員情報をクエリします。
再度ネストして、スカラー サブクエリを使用します。
-- 1.查询销售部的所有员工信息
-- a.查询'销售部'的部门ID
select id from dept where name = '销售部'; -- 返回结果为 4
-- b.根据销售部部门ID,查询员工信息
select * from emp e where e.dept_id = 4;
-- 标量子查询
select * from emp e where e.dept_id = (select id from dept where name = '销售部');
2.「Fang Dongbai」が入社した後の従業員情報を照会する
同じ方法で解決しました
-- 2.查询在'方东白'入职之后的员工信息
-- a.查询'方东白'的入职日期
select entrydate from emp where name = '方东白';
-- b.查询指定入职日期之后入职的员工信息
select * from emp where entrydate > '2009-02-12';
-- 标量子查询
select * from emp where entrydate > (select entrydate from emp where name = '方东白');
列サブクエリ
サブクエリによって返される結果は列 (複数行の場合もあります) であり、このサブクエリは列サブクエリと呼ばれます。
よく使用される演算子: IN、NOT IN、ANY、SOME、ALL
オペレーター | 説明する |
---|---|
で | 指定された収集範囲内で、複数の中から 1 つを選択します |
ありませんで | 指定された収集範囲外です |
どれでも | サブクエリによって返されるリストでは、いずれか 1 つを満たすことができます。 |
いくつかの | ANY と同様に、SOME が使用される場合はどこでも ANY を使用できます。 |
全て | サブクエリによって返されるリスト内のすべての値は次の条件を満たす必要があります |
デモ:
1. 財務部門の全員よりも給与が高い従業員に関する情報をクエリする
まず財務部門の職員全員の給与を確認してください。
select salary from emp e where e.dept_id = (select id from dept where name = '财务部');
もう一度ネストします
select * from emp e
where salary >
all(select salary from emp e where e.dept_id = (select id from dept where name = '财务部'));
-- 相当于 salary > all(8500,48000,5250)
2. 研究開発部門のどの従業員よりも給与が高い従業員に関する情報を照会する
select * from emp
where salary > any
(select salary from emp where dept_id =
(select id from dept where name = '研发部'));
-- 这里any也可以使用some,效果是一样的
行サブクエリ
サブクエリによって返される結果は行 (複数の列も可能) であり、このサブクエリは行サブクエリと呼ばれます。
よく使用される演算子: =、<>、IN、NOT IN
デモンストレーションの例:
「Zhang Woji」と同じ給与と直接のリーダーシップを持つ従業員の情報を照会します。
まずは「張無忌」の給与と直接のリーダーシップをチェック
select salary,managerid from emp where name = '张无忌';
次に、「Zhang Woji」と同じ給与と直接のリーダーシップを持つ従業員の情報をクエリします。
select * from emp where salary = 12500 and managerid = 1;
-- 另一种写法
select * from emp where (salary,managerid) = (12500,1);
-- 行子查询
select * from emp where (salary,managerid) =
(select salary,managerid from emp where name = '张无忌');
テーブルサブクエリ
サブクエリによって返される結果は複数の行と複数の列であり、このサブクエリはテーブル サブクエリと呼ばれます。
よく使用される演算子: IN
通常、from の後に配置され、一時的な新しいテーブルとしてクエリできます。
デモンストレーション例
1. 「Luzhangke」と「Song Yuanqiao」と同じ役職と給与の従業員情報をクエリします。
まずは「魯張科」と「宋元橋」の役職と給料をチェック
select job,salary from emp where name = '鹿杖客' or '宋远桥';
テーブルサブクエリを再度実行します
select * from test.emp where
(job,salary) in (select job,salary from test.emp where name = '鹿杖客' or '宋远桥');
2. 入社日が「2006-01-01」以降の社員情報と部門情報を問い合わせます。
また、ステップごとにクエリを実行します。
select * from emp where entrydate > '2006-01-01';
検索結果:
次に、これを新しいテーブルとして使用してクエリを実行します。すべての部門情報をクエリする必要があるため、ここでは左結合が使用されます。
select e.*,d.* from (select * from emp where entrydate > '2006-01-01') e
left join dept d on e.dept_id = d.id;
検索結果:
終わり
学習内容: ダークホース プログラマー - MySQL データベース コース