この記事では、例を使用して、MySQL の結合クエリ、結合クエリ、サブクエリの原理と使用方法を説明します。ご参考までに、詳細は以下の通りです。 この記事の内容:- 接続クエリ
- 共同クエリ
- サブクエリ
- サブクエリから
- where サブクエリ
- サブクエリが存在する
リリース日: 2018-04-11
接続クエリ:- 結合クエリは、複数のテーブルをまとめてクエリすることです。結合クエリの方法には、内部結合、外部結合、自然結合、クロス結合があります。結合クエリを使用すると、複数のテーブルのデータを同時に表示できます。
- 内部結合: 条件付き結合。指定された条件に基づいて複数のテーブルが接続され、一致した結果、一致結果を満たすレコードが保持されます。
- 外部結合: 内部結合とは異なり、一致する文字に関係なくすべてのデータを保持します。外部結合モードによって、保持するテーブルが決まります。たとえば、左側のテーブルが保持される場合、左側のテーブルが右側のテーブルと一致しないときは、左側のテーブルのデータが保持され、右側のテーブルのフィールド データは null に設定されます。
- 自然接続: 条件付き接続、「同じ名前のフィールド」に基づいて自動的に接続されます (同じ名前の複数のフィールドが条件として使用されます)。
- クロス結合: 無条件接続。各レコードを別のテーブルの各レコードに接続します (直積)。結果として、フィールド数は元のフィールド数の合計に等しくなり、レコード数は各テーブルのレコード数の積に等しくなります。
-- 実験的なテーブル構造 create table student(
id int、
名前varchar(15),
性別varchar(15),
cid 整数
);
テーブルクラスを作成する(
cid int、
cname varchar(15)
);
テーブルの学生、クラスをドロップします。
-- 実験テーブルデータ:
学生の値に挿入します(1,"lilei","男性",1),(2,"hanmeimei","男性",2),(3,"jack","男性",1),(4,"alice","女性",4); --これはクラスにはない4の特別な作成です
insert into class values(1,"linux"),(2,"python"),(3,"java"),(5,"html5");--ここでは、student に含まれないクラス 5 を作成します。
学生から*を選択します。
クラスから*を選択します。  
内部結合:- 左側のテーブルから各レコードを取得し、右側のテーブルのすべてのレコードと照合し、一致したレコードを保持して、2 つのレコードを連結します。
- 構文: 左のテーブルからフィールド リストを選択 [内部] 右のテーブルを左のテーブル.field = 右のテーブル.field に結合します。
- オン条件を使用しない場合、結果はクロス結合と同じになります。
-- 内部結合 -- select * from student inner join class; -- 結果は、student.cid = class.cid; のクロス結合 select * from student join class と同じです。
学生から*を選択し、学生.cid = class.cid でクラスを内部結合します。 
外部結合:- 内部結合とは異なり、一致する文字が満たされているかどうかに関係なく、メイン テーブルのレコードは保持されます。左外部結合と右外部結合の 2 つの方法があります。左外部結合では左側のテーブルが保持され、右外部結合では右側のテーブルが保持されます。
- 文法:
- 左外部結合: 左のテーブルからフィールド リストを選択し、左のテーブルフィールド = 右のテーブルフィールドで右のテーブルを結合します。
- 右外部結合: 左のテーブルからフィールド リストを選択し、右のテーブルを左のテーブル.field = 右のテーブル.field で結合します。
学生の左から*を選択し、クラスに参加します。student.cid = class.cid; 
自然なつながり:- 接続条件を自動的に一致させます。システムはフィールド名を一致パターンとして使用します(同じ名前のフィールドは条件として使用され、同じ名前の複数のフィールドは条件として使用されます)
- 自然内部結合: 内部結合に似ていますが、結合条件は提供されません。
- 自然外部結合: 外部結合に似ていますが、結合条件は提供されません。
- 文法:
- 自然内部結合: テーブル名からフィールド リストを選択し、テーブル名を自然に結合します。
- 自然外部結合: テーブル名からフィールド リストを選択し、テーブル名を自然左\右結合します。

クロス接続:- 各レコードを別のテーブルの各レコードと結合する
- 文法:
- テーブル名からフィールド リストを選択し、テーブル名をクロス結合します。
- テーブル名、テーブル名からフィールド リストを選択します。
学生のクロス結合クラスから * を選択します。
学生、クラスから*を選択します。 
補充:- 複数のテーブル間で各テーブルを区別し、使いやすくするために、テーブルエイリアスを使用できます。
select * from student inner join class on student.cid = class.cid;-- 元の結果 select id,name,gender,c.cid,cname from student as s inner join class as c on s.cid = c.cid;-- テーブルエイリアスを使用
- 複数接続が可能です。
- 外部結合は自然結合をシミュレートできます。左のテーブルフィールド = 右のテーブルフィールドの結合条件を「フィールド名を使用」に変更するだけです。
共同クエリ:- 結合クエリは、レコードの複数のクエリ結果を結合することです。 (他のテーブルのクエリレコード結果を最初のテーブルの後ろに接続することと同等です)[スプライスなので、複数のクエリ結果のフィールド数は同じである必要があります] [スプライスではデータ型は考慮されません。たとえば、最初のテーブルの最初のフィールドは int ですが、後続のテーブルの varchar を最初の列に接続することもできます]
- 構文: select ステートメント union select ステートメント…;
生徒の名前と性別を選択
連合
クラスから*を選択します。
-- クラスにはフィールドが2つしかないため、最初のクラスでは2つのフィールドのみが選択されます。 
補充:- Union には、Union の後に追加されるオプションがあります。all オプションは重複を削除しませんが、distinct オプションは重複を削除します。
- ユニオン クエリは通常、同じテーブル内の異なるデータを異なる方法で処理するために使用されます。 (たとえば、学生のスコア テーブルで 2 つの科目 (ここでは Python と Linux と仮定) を同時に照会する場合)
- union と order by を同時に使用するとエラーが発生する
- ユニオン クエリでクエリ結果を並べ替える場合は、SELECT ステートメントを括弧で囲む必要があります。 [また、ジョイントクエリの連結メカニズムにより、order by の後に limit 句を追加する必要があり、制限数は非常に大きな値になる可能性があります。 】
- 最終的な結合クエリ結果の場合は、最後の選択ステートメントで order by を使用します [最後のフィールドに括弧を追加してから order by を追加することをお勧めします。これは、同じ名前のフィールドがある場合に使用されます]
サブクエリ:- サブクエリは、クエリ ステートメント内にネストされたクエリです。
- サブクエリは、出現場所に応じて 3 つのカテゴリに分類できます。
- サブクエリから: サブクエリはから続きます。これは通常、「最初に 2 次元テーブルを見つけて、それを処理する」状況で使用されます。
- 例えば:
-- これは意味のない例です。たとえば、select cid,cname from (select * from class where cname="python") as c; を使用します。
- Where サブクエリ: サブクエリは where 条件の後に続きます。通常は、「最初に指定された条件をクエリしてからクエリを実行する」場合に使用されます。
- 例えば:
cid=(cname="python" のクラスから cid を選択) の学生から * を選択します。
- 存在するサブクエリ: サブクエリは存在するステートメント内にあります。通常は「存在する場合のみ」の状況で使用されます。
- 例えば:
-- これは、学生が cid=1 select * from class where exists(select * from student where cid=1) and cid=1; でコースを選択していない場合、対応するコース情報を出力しない例です。
- 実際、ユニオンに続くクエリもサブクエリであると考える人もいますが、ここではこれらはサブクエリとは見なされません。「クエリ」に非常に密接に関連する上記のいくつかのものだけがサブクエリと見なされます。
補充:- 実際、サブクエリをその結果に基づいて分類することもできます。
- スカラー サブクエリの場合、サブクエリの結果は 1 行 1 列です。これは通常、where サブクエリが 1 行 1 列のみをクエリする場合に発生します。
- 列サブクエリの場合、サブクエリの結果は複数の行を持つ 1 つの列になります。これは通常、where サブクエリが複数の行を持つ 1 つの列をクエリするときに発生します。
- 行サブクエリの場合、サブクエリの結果は複数の列と 1 つの行 (または複数の行と複数の列) になります。これは通常、where サブクエリが複数の列と 1 つの行をクエリするときに発生します。
- テーブルサブクエリ、サブクエリの結果は複数の行と列であり、通常はfromサブクエリで発生します。
- where サブクエリでは any、all、some などの他のキーワードが使用されることもありますが、= の場合は基本的に = でその機能を実現できます。
MySQL 関連のコンテンツに興味のある読者は、このサイトの次のトピックをチェックしてください: 「MySQL クエリ スキル」、「MySQL トランザクション操作スキル」、「MySQL ストアド プロシージャ スキル」、「MySQL データベース ロック関連スキルの概要」、および「MySQL 共通関数の概要」 この記事が皆様のMySQLデータベース設計に役立つことを願っています。 以下もご興味があるかもしれません:- MySQL の結合クエリとサブクエリの問題
- MySQL マルチテーブル結合クエリの詳細な説明
- どのような種類の MYSQL 接続クエリを知っていますか?
- MySQL接続クエリの原理と応用
- MySQL 結合クエリ構文と例
- Mysql 自己結合クエリ例の詳細な説明
- MySQL マルチテーブル結合クエリ例の説明
- MySQL接続クエリの詳細な説明
|