Heim  >  Artikel  >  Datenbank  >  Verbindungsabfrage für MySQL-Datenabfrage

Verbindungsabfrage für MySQL-Datenabfrage

coldplay.xixi
coldplay.xixinach vorne
2021-03-15 09:05:473112Durchsuche

Verbindungsabfrage für MySQL-Datenabfrage

  • Verbindungsbeziehungen sind die Hauptmerkmale des relationalen Datenbankmodells. Dies ist auch die wichtigste Abfrage, die hauptsächlich innere Verknüpfungen, äußere Verknüpfungen usw. umfasst.
  • Mehrere Tabellenabfragen können über Verbindungsoperatoren implementiert werden.
  • In einem relationalen Datenbankverwaltungssystem muss die Beziehung zwischen den einzelnen Daten nicht bestimmt werden, wenn die Tabelle erstellt wird. Alle Informationen einer Entität werden häufig in einer Tabelle gespeichert. Beim Abfragen von Daten werden Informationen zu verschiedenen Entitäten, die in mehreren Tabellen gespeichert sind, über Verbindungsvorgänge abgefragt. Wenn in zwei oder mehr Tabellen Felder mit derselben Bedeutung vorhanden sind, können Sie diese Felder verwenden, um Join-Abfragen für verschiedene Tabellen durchzuführen.

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)


(1), Inner-Join-Abfrage (Inner-Join)
  • Inner-Join verwendet Vergleichsoperatoren, um bestimmte (bestimmte) Spaltendaten zwischen Tabellen zu vergleichen, und listet die Daten in diesen Tabellen auf, die den Join-Bedingungen entsprechen. Datenzeilen bilden neue Datensätze Das heißt, in einer Inner-Join-Abfrage können nur Datensätze in der Ergebnisbeziehung erscheinen, die die Bedingungen erfüllen.

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)
  • Hinweis: Da die Tabelle „Früchte“ und die Tabelle „Lieferanten“ dasselbe Feld haben s_id, also im Vergleich Wenn Sie den Tabellennamen vollständig qualifizieren müssen, lautet das Format „Tabellenname.Spaltenname“. Wenn nur s_id angegeben wird, weiß MySQL nicht, auf welche es sich bezieht, und gibt eine Fehlermeldung zurück.

[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)
  • Es ist relativ einfach und klar, die Where-Klausel zum Definieren der Verbindung zu verwenden Bedingungen und die Inner-Join-Syntax sind ANSI. Die Standardspezifikation von SQL kann durch die Verwendung der Inner-Join-Verbindungssyntax sicherstellen, dass die Verbindungsbedingungen nicht vergessen werden und die Where-Klausel irgendwann die Leistung der Abfrage beeinträchtigt.

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)

(2)、外连接查询
  • 外连接查询将查询多个表中相关联的行。
  • 内连接时,返回查询结果集合中的仅是符合查询条件和连接条件的行。但有时候需要包含没有关联的行中数据,即返回查询结果集合中的不仅包含符合连接条件的行,而且还包括左表(左外连接或左连接)、右表(右外连接或右连接)或两个边接表(全外连接)中的所有数据行。外连接分为左外连接或左连接和右外连接或右连接:

①左连接:返回包括左表中的所有记录和右表中连接字段相等的记录。
②右连接:返回包括右表中的记录和左表中连接字段相等的记录。

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)
(2 ), äußere Verbindungsabfrage
  • Äußere Join-Abfragen fragen verwandte Zeilen in mehreren Tabellen ab.

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:


①Linke Verknüpfung: Gibt alle Datensätze in der linken Tabelle und Datensätze mit gleichen Verknüpfungsfeldern in der rechten Tabelle zurück.
②Rechter Join: Gibt Datensätze zurück, einschließlich Datensätzen in der rechten Tabelle, die den Join-Feldern in der linken Tabelle entsprechen.
  • 1. Left Join Left Join
Erstellen Sie zunächst die Tabellenbestellungen. Die SQL-Anweisung lautet wie folgt:

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

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

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)🎜🎜🎜

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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:csdn.net. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen