Heim >Datenbank >MySQL-Tutorial >Verbindungsabfrage für MySQL-Datenabfrage
Im Folgenden werden drei Verbindungsmethoden zwischen mehreren Tabellen vorgestellt:
(1) Innere Join-Abfrage
(2) Äußere Join-Abfrage
(3) Zusammengesetzte bedingte Join-Abfrage
(Kostenlose Lernempfehlung: MySQL-Video-Tutorial)
Erstellen Sie die folgenden Datentabellenlieferanten zur Demonstration:
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
[Beispiel 1] Verwenden Sie eine Inner-Join-Abfrage zwischen der Obsttabelle und der Lieferantentabelle.
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)
Sie können sehen, dass sowohl die Früchte- als auch die Lieferantentabelle das gleiche Datentypfeld s_id haben und die beiden Tabellen über das s_id-Feld verbunden sind.
Als nächstes fragen Sie die Felder „f_name“ und „f_price“ aus der Tabelle „Früchte“ ab und fragen die Felder „s_id“ und „s_name“ aus der Tabelle „Lieferanten“ ab. Die SQL-Anweisung lautet wie folgt:
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)
[Beispiel 2] Verwenden Sie zwischen der Fruit-Tabelle und der Lieferantentabelle die Inner-Join-Syntax für die Inner-Join-Abfrage. Die SQL-Anweisung lautet wie folgt:
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)
Wenn es sich bei den beiden an einer Join-Abfrage beteiligten Tabellen um dieselbe Tabelle handelt, wird dieser Abfragetyp als Self-Join-Abfrage bezeichnet. Self-Join ist ein spezieller innerer Join. Dies bedeutet, dass die miteinander verbundenen Tabellen physisch dieselben Tabellen sind, aber logisch in zwei Tabellen unterteilt werden können.
[Beispiel 3] Fragen Sie die vom Obstlieferanten bereitgestellten Obstsorten ab, die f_id='a1'
liefern. Die SQL-Anweisung lautet wie folgt: f_id='a1'
的水果供应商提供的水果种类,SQL语句如下:
mysql> select f1.f_id,f1.f_name -> from fruits as f1,fruits as f2 -> 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)
①左连接:返回包括左表中的所有记录和右表中连接字段相等的记录。
②右连接:返回包括右表中的记录和左表中连接字段相等的记录。
1.左连接left join
首先创建表orders,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
【例】在customers表和orders表中,查询所有客户,包括没有订单的客户,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
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)
Beim Ausführen eines Inner Joins werden nur die Zeilen im Abfrageergebnissatz zurückgegeben, die die Abfragebedingungen und Verbindungsbedingungen erfüllen. Manchmal ist es jedoch erforderlich, Daten in nicht zusammenhängende Zeilen einzuschließen, d Outer-Join oder Right-Join) oder alle Datenzeilen in zwei Edge-Tabellen (vollständiger Outer-Join). Äußere Verknüpfungen werden in linke äußere Verknüpfungen oder linke Verknüpfungen und rechte äußere Verknüpfungen oder rechte Verknüpfungen unterteilt:
Left Join
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)[Beispiel] Fragen Sie in der Kundentabelle und der Bestelltabelle alle Kunden ab, einschließlich der Kunden Ohne Befehle lautet die SQL-Anweisung wie folgt:
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)2. Rechter Join
rechter Join
Die Verbindungsabfrage für zusammengesetzte Bedingungen ist in der Verbindung Während des Abfragevorgangs werden Filterbedingungen hinzugefügt, um die Abfrageergebnisse einzuschränken und die Abfrageergebnisse genauer zu machen. 🎜🎜🎜[Beispiel 1] Verwenden Sie in der Kundentabelle und der Bestelltabelle die Inner-Join-Syntax, um die Kundentabelle abzufragen und die Bestellinformationen des Kunden mit der ID 10001 zusammenzufassen. Die SQL-Anweisung lautet wie folgt: 🎜rrreee🎜[Beispiel 2] Verwenden Sie zwischen der Fruchttabelle und der Lieferantentabelle die Inner-Join-Syntax, um eine Inner-Join-Abfrage durchzuführen, und sortieren Sie die Abfrageergebnisse wie folgt: 🎜rrreee🎜🎜🎜 Weitere verwandte kostenlose Lernempfehlungen: 🎜🎜🎜MySQL-Tutorial🎜🎜 🎜(Video)🎜🎜🎜Der rechte Join ist der umgekehrte Join des linken Joins und gibt alle Zeilen der rechten Tabelle zurück . Wenn eine Zeile in der rechten Tabelle keine entsprechende Zeile in der linken Tabelle hat, gibt die linke Tabelle einen Nullwert zurück. [Beispiel] Fragen Sie in der Kundentabelle und der Bestelltabelle alle Bestellungen ab, einschließlich Bestellungen ohne Kunden. Die SQL-Anweisung lautet wie folgt: rrreee(3), Verbindungsabfrage für zusammengesetzte Bedingungen
Das obige ist der detaillierte Inhalt vonVerbindungsabfrage für MySQL-Datenabfrage. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!