ホームページ  >  記事  >  データベース  >  MySQL データクエリ接続クエリ

MySQL データクエリ接続クエリ

coldplay.xixi
coldplay.xixi転載
2021-03-15 09:05:473169ブラウズ

MySQL データクエリ接続クエリ

    #接続関係は、リレーショナル データベース モデルの主な機能です。これは最も重要なクエリでもあり、主に内部結合、外部結合などが含まれます。
  • 接続演算子を使用して複数のテーブル クエリを実装できます。
  • リレーショナル データベース管理システムでは、テーブルの作成時に各データ間の関係を決定する必要がなく、エンティティのすべての情報が 1 つのテーブルに格納されることがよくあります。データをクエリする場合、複数のテーブルの異なるエンティティに格納されている情報が接続操作を通じてクエリされます。 2 つ以上のテーブルに同じ意味を持つフィールドがある場合、これらのフィールドを使用して、異なるテーブルに対して結合クエリを実行できます。
複数のテーブル間の 3 つの接続方法を次に紹介します。

(1)内部結合クエリ

(2)外部結合クエリ
(3)複合条件接続クエリ

(無料学習の推奨事項:

mysql ビデオ チュートリアル )


(1)、内部結合クエリ (内部結合)
内部結合では、比較演算子を使用してテーブル間の特定の (一部の) 列のデータを比較し、結合条件に一致するこれらのテーブル内のデータ行をリストして新しいレコードを形成します。つまり、内部結合クエリでは、条件を満たすレコードのみが作成されます。結果関係に現れることがあります。
  • デモンストレーションのために、以下のデータ テーブル サプライヤーを作成します。
mysql> create table suppliers    -> (
    -> s_id int not null auto_increment,
    -> s_name char(50) not null,
    -> s_city char(50) null,
    -> s_zip char(10) null,
    -> s_call char(50) not null,
    -> primary key(s_id)
    -> );Query OK, 0 rows affected (0.17 sec)mysql> insert into suppliers(s_id,s_name,s_city,s_zip,s_call)
    -> values(101,'FastFruit Inc.','Tianjin','300000','48075'),
    -> (102,'LT Supplies','Chongqing','400000','44333'),
    -> (103,'ACME','Shanghai','200000','90046'),
    -> (104,'FNK Inc.','Zhongshan','528437','11111'),
    -> (105,'Good Set','Taiyuan','030000','22222'),
    -> (106,'Just Eat Ours','Beijing','010','45678'),
    -> (107,'DK Inc','Zhengzhou','450000','33332');Query OK, 7 rows affected (0.07 sec)Records: 7  Duplicates: 0  Warnings: 0

[例 1] 果物テーブルとサプライヤー テーブルの間で内部結合クエリを使用します。

mysql> desc fruits;+---------+--------------+------+-----+---------+-------+| Field   | Type         | Null | Key | Default | Extra |+---------+--------------+------+-----+---------+-------+| f_id    | char(10)     | NO   | PRI | NULL    |       || s_id    | int(11)      | NO   |     | NULL    |       || f_name  | char(255)    | NO   |     | NULL    |       || f_price | decimal(8,2) | NO   |     | NULL    |       |+---------+--------------+------+-----+---------+-------+4 rows in set (0.06 sec)mysql> desc suppliers;+--------+----------+------+-----+---------+----------------+| Field  | Type     | Null | Key | Default | Extra          |+--------+----------+------+-----+---------+----------------+| s_id   | int(11)  | NO   | PRI | NULL    | auto_increment || s_name | char(50) | NO   |     | NULL    |                || s_city | char(50) | YES  |     | NULL    |                || s_zip  | char(10) | YES  |     | NULL    |                || s_call | char(50) | NO   |     | NULL    |                |+--------+----------+------+-----+---------+----------------+5 rows in set (0.00 sec)

果物テーブルとサプライヤー テーブルの両方に同じデータ型フィールド s_id があり、2 つのテーブルが s_id フィールドを通じて接続されていることがわかります。

次に、fruits テーブルから f_name フィールドと f_price フィールドをクエリし、suppliers テーブルから s_id と s_name をクエリします。SQL ステートメントは次のとおりです:

mysql> select suppliers.s_id,s_name,f_name,f_price    -> from fruits,suppliers    -> where fruits.s_id=suppliers.s_id;+------+----------------+------------+---------+| s_id | s_name         | f_name     | f_price |+------+----------------+------------+---------+|  104 | FNK Inc.       | lemon      |    6.40 ||  101 | FastFruit Inc. | apple      |    5.20 ||  103 | ACME           | apricot    |    2.20 ||  101 | FastFruit Inc. | blackberry |   10.20 ||  104 | FNK Inc.       | berry      |    7.60 ||  107 | DK Inc         | xxxx       |    3.60 ||  102 | LT Supplies    | orange     |   11.20 ||  105 | Good Set       | melon      |    8.20 ||  101 | FastFruit Inc. | cherry     |    3.20 ||  106 | Just Eat Ours  | mango      |   15.70 ||  105 | Good Set       | xbabay     |    2.60 ||  105 | Good Set       | xxtt       |   11.60 ||  103 | ACME           | coconut    |    9.20 ||  102 | LT Supplies    | banana     |   10.30 ||  102 | LT Supplies    | grape      |    5.30 ||  107 | DK Inc         | xbabay     |    3.60 |+------+----------------+------------+---------+16 rows in set (0.00 sec)

注: なぜなら果物テーブルとサプライヤー テーブルのフィールドには同じフィールド s_id があるため、比較する場合、テーブル名は「テーブル名.列名」の形式で完全修飾する必要があります。s_id のみが指定された場合、MySQL はどちらであるかを認識できません。参照するものはエラー メッセージを返します。
  • [例 2] 果物テーブルとサプライヤー テーブルの間で、内部結合構文を使用して内部結合クエリを実行します。SQL ステートメントは次のとおりです:
mysql> select suppliers.s_id,s_name,f_name,f_price    -> from fruits inner join suppliers    -> on fruits.s_id = suppliers.s_id;+------+----------------+------------+---------+| s_id | s_name         | f_name     | f_price |+------+----------------+------------+---------+|  104 | FNK Inc.       | lemon      |    6.40 ||  101 | FastFruit Inc. | apple      |    5.20 ||  103 | ACME           | apricot    |    2.20 ||  101 | FastFruit Inc. | blackberry |   10.20 ||  104 | FNK Inc.       | berry      |    7.60 ||  107 | DK Inc         | xxxx       |    3.60 ||  102 | LT Supplies    | orange     |   11.20 ||  105 | Good Set       | melon      |    8.20 ||  101 | FastFruit Inc. | cherry     |    3.20 ||  106 | Just Eat Ours  | mango      |   15.70 ||  105 | Good Set       | xbabay     |    2.60 ||  105 | Good Set       | xxtt       |   11.60 ||  103 | ACME           | coconut    |    9.20 ||  102 | LT Supplies    | banana     |   10.30 ||  102 | LT Supplies    | grape      |    5.30 ||  107 | DK Inc         | xbabay     |    3.60 |+------+----------------+------------+---------+16 rows in set (0.00 sec)

Use where句の定義 接続条件は比較的単純かつ明確で、内部結合構文は ANSI SQL の標準仕様です。内部結合接続構文を使用すると、接続条件が忘れられることがなくなり、where 句がパフォーマンスに影響します。ある時点でクエリします。
  • 結合クエリに含まれる 2 つのテーブルが同じテーブルの場合、このタイプのクエリは自己結合クエリと呼ばれます。自己結合は特殊な内部結合であり、相互に接続されているテーブルは物理的には同じテーブルですが、論理的には 2 つのテーブルに分割できることを意味します。

[例 3]

f_id='a1'

を供給する果物供給業者が提供する果物の種類をクエリする場合、SQL ステートメントは次のとおりです。 <pre class="brush:php;toolbar:false">mysql&gt; select f1.f_id,f1.f_name    -&gt; from fruits as f1,fruits as f2    -&gt; where f1.s_id =f2.s_id and f2.f_id ='a1';+------+------------+| f_id | f_name     |+------+------------+| a1   | apple      || b1   | blackberry || c0   | cherry     |+------+------------+3 rows in set (0.00 sec)</pre>

(2)、外部結合クエリ
外部結合クエリは、複数のテーブル内の関連する行をクエリします。
  • 内部結合の場合、クエリ結果セット内のクエリ条件と接続条件を満たす行のみが返されます。ただし、無関係な行のデータを含める必要がある場合があります。つまり、返されるクエリ結果セットには、結合条件を満たす行だけでなく、左側のテーブル (左外部結合または左結合)、右側のテーブル (右側) も含まれます。外部結合または右結合) )、または 2 つのエッジ テーブル内のすべてのデータ行 (完全外部結合)。外部結合は、左外部結合または左結合と、右外部結合または右結合に分けられます。
  • ①左結合: 左側のテーブルのすべてのレコードと、右側のテーブルの等しい結合フィールドを持つレコードを返します。
②右結合: 左テーブルの結合フィールドと等しい右テーブルのレコードを含むレコードを返します。


1. 左結合

左結合

最初にテーブルの順序を作成します。SQL ステートメントは次のとおりです。

mysql> create table orders    -> (
    -> o_num int not null auto_increment,
    -> o_date datetime not null,
    -> c_id int not null,
    -> primary key (o_num)
    -> );Query OK, 0 rows affected (0.11 sec)mysql> insert into orders(o_num,o_date,c_id)
    -> values(30001,'2008-09-01',10001),
    -> (30002,'2008-09-12',10003),
    -> (30003,'2008-09-30',10004),
    -> (30004,'2008-10-03',10005),
    -> (30005,'2008-10-08',10001);Query OK, 5 rows affected (0.06 sec)Records: 5  Duplicates: 0  Warnings: 0

[例] 顧客の場合table とorders table の場合、注文のない顧客を含むすべての顧客をクエリする場合、SQL ステートメントは次のとおりです:

mysql> select * from customers;+-------+----------+---------------------+---------+--------+-----------+-------------------+| c_id  | c_name   | c_address           | c_city  | c_zip  | c_contact | c_email           |+-------+----------+---------------------+---------+--------+-----------+-------------------+| 10001 | redhool  | 200 Street          | Tianjin | 300000 | LiMing    | LMing@163.com     || 10002 | Stars    | 333 Fromage Lane    | Dalian  | 116000 | Zhangbo   | Jerry@hotmail.com || 10003 | Netbhood | 1 Sunny Place       | Qingdao | 266000 | LuoCong   | NULL              || 10004 | JOTO     | 829 Riverside Drive | Haikou  | 570000 | YangShan  | sam@hotmail.com   |+-------+----------+---------------------+---------+--------+-----------+-------------------+4 rows in set (0.00 sec)mysql> select * from orders;+-------+---------------------+-------+| o_num | o_date              | c_id  |+-------+---------------------+-------+| 30001 | 2008-09-01 00:00:00 | 10001 || 30002 | 2008-09-12 00:00:00 | 10003 || 30003 | 2008-09-30 00:00:00 | 10004 || 30004 | 2008-10-03 00:00:00 | 10005 || 30005 | 2008-10-08 00:00:00 | 10001 |+-------+---------------------+-------+5 rows in set (0.00 sec)mysql>  select customers.c_id , orders.o_num    -> from customers left outer join orders    -> on customers.c_id = orders.c_id;+-------+-------+| c_id  | o_num |+-------+-------+| 10001 | 30001 || 10003 | 30002 || 10004 | 30003 || 10001 | 30005 || 10002 |  NULL |+-------+-------+5 rows in set (0.00 sec)

2. Right join

right join

Right結合は左結合の逆です。直接結合は右テーブルのすべての行を返します。右側のテーブルの行に左側のテーブルに一致する行がない場合、左側のテーブルは null 値を返します。
  • [例] 顧客テーブルと注文テーブルで、顧客のいない注文を含むすべての注文をクエリします。SQL ステートメントは次のとおりです:
mysql> select customers.c_id, orders.o_num    -> from customers right outer join orders    -> on customers.c_id = orders.c_id;+-------+-------+| c_id  | o_num |+-------+-------+| 10001 | 30001 || 10003 | 30002 || 10004 | 30003 ||  NULL | 30004 || 10001 | 30005 |+-------+-------+5 rows in set (0.00 sec)

(3),複合条件接続クエリ
複合条件接続クエリは、接続クエリのプロセス中にフィルター条件を追加してクエリ結果を制限し、クエリ結果をより正確にします。
  • [例 1] Customers テーブルと Orders テーブルで、内部結合構文を使用して Customers テーブルをクエリし、ID 10001 の顧客の注文情報を要約します。 SQL ステートメントは次のとおりです。
mysql> select customers.c_id,orders.o_num    -> from customers inner join orders    -> on customers.c_id = orders.c_id and customers.c_id = 10001;+-------+-------+| c_id  | o_num |+-------+-------+| 10001 | 30001 || 10001 | 30005 |+-------+-------+2 rows in set (0.00 sec)

[ 例 2] 果物テーブルとサプライヤー テーブルの間で、内部結合構文を使用して内部結合クエリを実行し、クエリ結果を並べ替えます。SQL ステートメントは次のとおりです:

mysql> select suppliers.s_id,s_name,f_name,f_price    -> from fruits inner join suppliers    -> on fruits.s_id = suppliers.s_id    -> order by fruits.s_id;+------+----------------+------------+---------+| s_id | s_name         | f_name     | f_price |+------+----------------+------------+---------+|  101 | FastFruit Inc. | apple      |    5.20 ||  101 | FastFruit Inc. | blackberry |   10.20 ||  101 | FastFruit Inc. | cherry     |    3.20 ||  102 | LT Supplies    | orange     |   11.20 ||  102 | LT Supplies    | banana     |   10.30 ||  102 | LT Supplies    | grape      |    5.30 ||  103 | ACME           | apricot    |    2.20 ||  103 | ACME           | coconut    |    9.20 ||  104 | FNK Inc.       | lemon      |    6.40 ||  104 | FNK Inc.       | berry      |    7.60 ||  105 | Good Set       | melon      |    8.20 ||  105 | Good Set       | xbabay     |    2.60 ||  105 | Good Set       | xxtt       |   11.60 ||  106 | Just Eat Ours  | mango      |   15.70 ||  107 | DK Inc         | xxxx       |    3.60 ||  107 | DK Inc         | xbabay     |    3.60 |+------+----------------+------------+---------+16 rows in set (0.00 sec)

その他の関連する無料学習の推奨事項 :

mysql チュートリアル(ビデオ)

以上がMySQL データクエリ接続クエリの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はcsdn.netで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。