MySQL - 左連線



與提供兩個表交集值的內連線不同,還有另一種型別的連線稱為外連線。此外連線在多種情況下提供兩個表的匹配和不匹配記錄的集合。

MySQL 左連線

左連線是一種外連線,它檢索第一個表中的所有記錄並將其與第二個表中的記錄匹配。

如果左表中的記錄在第二個表中沒有對應的記錄,則會新增 NULL 值。

但是,如果第一個表中的記錄數少於第二個表中的記錄數,則第二個表中在第一個表中沒有任何對應記錄的記錄將從結果中丟棄。

Left Join

語法

以下是 MySQL 中左連線的基本語法:

SELECT table1.column1, table2.column2...
FROM table1
LEFT JOIN table2
ON table1.column_name = table2.column_name;

示例

使用以下查詢,讓我們建立一個名為CUSTOMERS的表,其中包含客戶的個人詳細資訊,包括他們的姓名、年齡、地址和薪水。

CREATE TABLE CUSTOMERS (
   ID INT NOT NULL,
   NAME VARCHAR (20) NOT NULL,
   AGE INT NOT NULL,
   ADDRESS CHAR (25),
   SALARY DECIMAL (18, 2),       
   PRIMARY KEY (ID)
);

現在使用 INSERT 語句將值插入此表,如下所示:

INSERT INTO CUSTOMERS VALUES 
(1, 'Ramesh', 32, 'Ahmedabad', 2000.00),
(2, 'Khilan', 25, 'Delhi', 1500.00),
(3, 'Kaushik', 23, 'Kota', 2000.00),
(4, 'Chaitali', 25, 'Mumbai', 6500.00),
(5, 'Hardik', 27, 'Bhopal', 8500.00),
(6, 'Komal', 22, 'Hyderabad', 4500.00),
(7, 'Muffy', 24, 'Indore', 10000.00);

表將建立如下:

ID NAME AGE ADDRESS SALARY
1 Ramesh 32 Ahmedabad 2000.00
2 Khilan 25 Delhi 1500.00
3 Kaushik 23 Kota 2000.00
4 Chaitali 25 Mumbai 6500.00
5 Hardik 27 Bhopal 8500.00
6 Komal 22 Hyderabad 4500.00
7 Muffy 24 Indore 10000.00

讓我們建立另一個名為ORDERS的表,其中包含已下訂單的詳細資訊以及訂單日期。

CREATE TABLE ORDERS (
   OID INT NOT NULL,
   DATE VARCHAR (20) NOT NULL,
   CUSTOMER_ID INT NOT NULL,
   AMOUNT DECIMAL (18, 2)
);

使用 INSERT 語句,將值插入此表,如下所示:

INSERT INTO ORDERS VALUES 
(102, '2009-10-08 00:00:00', 3, 3000.00),
(100, '2009-10-08 00:00:00', 3, 1500.00),
(101, '2009-11-20 00:00:00', 2, 1560.00),
(103, '2008-05-20 00:00:00', 4, 2060.00);

該表顯示如下:

OID DATE CUSTOMER_ID AMOUNT
102 2009-10-08 00:00:00 3 3000.00
100 2009-10-08 00:00:00 3 1500.00
101 2009-11-20 00:00:00 2 1560.00
103 2008-05-20 00:00:00 4 2060.00

左連線查詢

使用以下左連線查詢,我們將檢索在指定日期下訂單的客戶的詳細資訊。如果未找到匹配項,則以下查詢將在該記錄中返回 NULL。

SELECT ID, NAME, AMOUNT, DATE
FROM CUSTOMERS
LEFT JOIN ORDERS
ON CUSTOMERS.ID = ORDERS.CUSTOMER_ID;

輸出

獲得的連線結果集如下:

ID NAME AMOUNT DATE
1 Ramesh NULL NULL
2 Khilan 1560.00 2009-11-20 00:00:00
3 Kaushik 1500.00 2009-10-08 00:00:00
3 Kaushik 3000.00 2009-10-08 00:00:00
4 Chaitali 2060.00 2008-05-20 00:00:00
5 Hardik NULL NULL
6 Komal NULL NULL
7 Muffy NULL NULL

使用左連線連線多個表

左連線還連線多個表,其中第一個表作為整體返回,後續表與第一個表中的行匹配。如果記錄不匹配,則返回 NULL。

語法

使用左連線連線多個表的語法如下:

SELECT column1, column2, column3...
FROM table1
LEFT JOIN table2
ON table1.column_name = table2.column_name
LEFT JOIN table3
ON table2.column_name = table3.column_name
.
.
.

示例

為了演示使用多個表的左連線,讓我們考慮之前建立的 CUSTOMERS 和 ORDERS 表。除了這些之外,我們將建立另一個名為EMPLOYEE的表,其中包含組織中員工的詳細資訊以及他們做出的銷售,使用以下查詢:

CREATE TABLE EMPLOYEE (
   EID INT NOT NULL,
   EMPLOYEE_NAME VARCHAR (30) NOT NULL,
   SALES_MADE DECIMAL (20)
);

現在,我們可以使用 INSERT 語句將值插入這些空表,如下所示:

INSERT INTO EMPLOYEE VALUES
(102, 'SARIKA', 4500),
(100, 'ALEKHYA', 3623),
(101, 'REVATHI', 1291),
(103, 'VIVEK', 3426);

表建立如下:

EID EMPLOYEE_NAME SALES_MADE
102 SARIKA 4500
100 ALEKHYA 3623
101 REVATHI 1291
103 VIVEK 3426

左連線查詢

讓我們使用以下左連線查詢連線這三個表:

SELECT CUSTOMERS.ID, CUSTOMERS.NAME, ORDERS.DATE, EMPLOYEE.EMPLOYEE_NAME
FROM CUSTOMERS
LEFT JOIN ORDERS
ON CUSTOMERS.ID = ORDERS.CUSTOMER_ID
LEFT JOIN EMPLOYEE
ON ORDERS.OID = EMPLOYEE.EID;

輸出

獲得的結果表如下:

ID NAME DATE EMPLOYEE_NAME
1 Ramesh NULL NULL
2 Khilan 2009-11-20 00:00:00 REVATHI
3 Kaushik 2009-10-08 00:00:00 ALEKHYA
3 Kaushik 2009-10-08 00:00:00 SARIKA
4 Chaitali 2008-05-20 00:00:00 VIVEK
5 Hardik NULL NULL
6 Komal NULL NULL
7 Muffy NULL NULL

帶 WHERE 子句的左連線

要篩選連線兩個表後的記錄,可以應用 WHERE 子句。

語法

與 WHERE 子句一起使用左連線的語法如下:

SELECT column_name(s)
FROM table_name1
LEFT JOIN table_name2
ON table_name1.column_name = table_name2.column_name
WHERE condition

示例

可以使用 WHERE 子句篩選組合資料庫表中的記錄。考慮之前的兩個表 CUSTOMERS 和 ORDERS;並使用左連線查詢連線它們,並使用 WHERE 子句應用一些約束。

SELECT ID, NAME, DATE, AMOUNT FROM CUSTOMERS
LEFT JOIN ORDERS
ON CUSTOMERS.ID = ORDERS.CUSTOMER_ID
WHERE ORDERS.AMOUNT > 2000.00;

輸出

獲得的輸出如下:

ID NAME DATE AMOUNT
3 Kaushik 2009-10-08 00:00:00 3000.00
4 Chaitali 2008-05-20 00:00:00 2060.00

使用客戶端程式進行左連線

我們還可以使用客戶端程式對一個或多個表執行左連線操作。

語法

要透過 PHP 程式使用左連線連線兩個表,我們需要使用mysqli函式query()執行帶有 LEFT JOIN 子句的 SQL 查詢,如下所示:

$sql = 'SELECT a.tutorial_id, a.tutorial_author, b.tutorial_count FROM tutorials_tbl a LEFT JOIN tcount_tbl b
ON a.tutorial_author = b.tutorial_author';
$mysqli->query($sql);

要透過 JavaScript 程式使用左連線連線兩個表,我們需要使用mysql2庫的query()函式執行帶有 LEFT JOIN 子句的 SQL 查詢,如下所示:

sql = "SELECT a.tutorial_id, a.tutorial_author, b.tutorial_count FROM tutorials_tbl a LEFT JOIN tcount_tbl b 
ON a.tutorial_author = b.tutorial_author";
con.query(sql);  

要透過 Java 程式使用左連線連線兩個表,我們需要使用JDBC函式executeQuery()執行帶有 LEFT JOIN 子句的 SQL 查詢,如下所示:

String sql = "SELECT a.tutorial_id, a.tutorial_author, b.tutorial_count FROM tutorials_tbl a LEFT JOIN tcount_tbl b 
ON a.tutorial_author = b.tutorial_author";
st.executeQuery(sql);

要使用 Python 程式透過左連線連線兩個表,我們需要使用 **execute()** 函式和 **MySQL Connector/Python** 執行帶有 LEFT JOIN 子句的 SQL 查詢,如下所示:

left_join_query = "SELECT ID, NAME, AMOUNT, DATE FROM CUSTOMERS LEFT JOIN ORDERS ON CUSTOMERS.ID = ORDERS.CUST_ID"
cursorObj.execute(left_join_query)

示例

以下是程式:

$dbhost = 'localhost';
$dbuser = 'root';
$dbpass = 'password';
$dbname = 'TUTORIALS';
$mysqli = new mysqli($dbhost, $dbuser, $dbpass, $dbname);
if ($mysqli->connect_errno) {
    printf("Connect failed: %s
", $mysqli->connect_error); exit(); } // printf('Connected successfully.
'); $sql = 'SELECT a.tutorial_id, a.tutorial_author, b.tutorial_count FROM tutorials_tbl a LEFT JOIN tcount_tbl b ON a.tutorial_author = b.tutorial_author'; $result = $mysqli->query($sql); if ($result->num_rows > 0) { echo " following is the both table details after executing left join! \n"; while ($row = $result->fetch_assoc()) { printf( "Id: %s, Author: %s, Count: %d", $row["tutorial_id"], $row["tutorial_author"], $row["tutorial_count"] ); printf("\n"); } } else { printf('No record found.
'); } mysqli_free_result($result); $mysqli->close();

輸出

獲得的輸出如下:

following is the both table details after executing left join!
Id: 1, Author: John Poul, Count: 0
Id: 2, Author: Abdul S, Count: 0
Id: 3, Author: Sanjay, Count: 1
Id: 101, Author: Aman kumar, Count: 0
Id: 102, Author: Sarika Singh, Count: 0    
var mysql = require("mysql2");
var con = mysql.createConnection({
  host: "localhost",
  user: "root",
  password: "password",
}); //Connecting to MySQL

con.connect(function (err) {
  if (err) throw err;
  //   console.log("Connected successfully...!");
  //   console.log("--------------------------");
  sql = "USE TUTORIALS";
  con.query(sql);
  //left join
  sql =
    "SELECT a.tutorial_id, a.tutorial_author, b.tutorial_count FROM tutorials_tbl a LEFT JOIN tcount_tbl b ON a.tutorial_author = b.tutorial_author";
  con.query(sql, function (err, result) {
    if (err) throw err;
    console.log(result);
  });
});

輸出

產生的輸出如下:

[
   { tutorial_id: 1, tutorial_author: 'John Poul', tutorial_count: 2 },
   { tutorial_id: 2, tutorial_author: 'Abdul S', tutorial_count: null },
   {
     tutorial_id: 101,
     tutorial_author: 'Aman kumar',
     tutorial_count: null
   },
   {
     tutorial_id: 102,
     tutorial_author: 'Sarika Singh',
     tutorial_count: null
   }
]
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

public class LeftJoin {
   public static void main(String[] args) {
      String url = "jdbc:mysql://:3306/TUTORIALS";
      String username = "root";
      String password = "password";
      try {
         Class.forName("com.mysql.cj.jdbc.Driver");
         Connection connection = DriverManager.getConnection(url, username, password);
         Statement statement = connection.createStatement();
         System.out.println("Connected successfully...!");

         //MySQL LEFT JOIN...!;
         String sql = "SELECT a.tutorial_id, a.tutorial_author, b.tutorial_count FROM tutorials_tbl a LEFT JOIN tcount_tbl b ON a.tutorial_author = b.tutorial_author";
         ResultSet resultSet = statement.executeQuery(sql);
         System.out.println("Table records after LEFT Join...!");
         while (resultSet.next()){
            System.out.println(resultSet.getString(1)+ " "+ resultSet.getString(2)+" "+resultSet.getString(3));
         }
         connection.close();
      } catch (Exception e) {
         System.out.println(e);
      }
   }
}       

輸出

獲得的輸出如下所示:

Connected successfully...!
Table records after LEFT Join...!
1 John Paul 1
2 Abdul S null
3 Sanjay 1
4 Sasha Lee null
5 Chris Welsh null
import mysql.connector
#establishing the connection
connection = mysql.connector.connect(
    host='localhost',
    user='root',
    password='password',
    database='tut'
)
cursorObj = connection.cursor()
left_join_query = f"""
SELECT ID, NAME, AMOUNT, DATE
FROM CUSTOMERS
LEFT JOIN ORDERS
ON CUSTOMERS.ID = ORDERS.CUST_ID
"""
cursorObj.execute(left_join_query)
# Fetching all the rows that meet the criteria
filtered_rows = cursorObj.fetchall()
for row in filtered_rows:
    print(row)
cursorObj.close()
connection.close()        

輸出

以下是上述程式碼的輸出:

(1, 'Ramesh', None, None)
(2, 'Khilan', 1560, '2009-11-20 00:00:00')
(3, 'Kaushik', 1500, '2009-10-08 00:00:00')
(3, 'Kaushik', 3000, '2009-10-08 00:00:00')
(4, 'Chaital', 2060, '2008-05-20 00:00:00')
(5, 'Hardik', None, None)
(6, 'Komal', None, None)
(7, 'Muffy', None, None)
廣告

© . All rights reserved.