MySQL - 內連線



MySQL 內連線

MySQL 內連線是一種用於基於兩個相關表中的公共列組合來自兩個相關表的記錄的連線型別。這些表根據特定條件連線在一起。如果兩個表中的記錄都滿足指定的條件,則它們將被組合。

Inner Join

這是預設連線;也就是說,即使使用 JOIN 關鍵字代替 INNER JOIN,表也是使用公共列的匹配記錄連線的。它們也稱為等值連線。

語法

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

SELECT column_name(s)
FROM table_name1
INNER JOIN table_name2
ON table_name1.column_name = table_name2.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 姓名 年齡 地址 薪水
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 表:

讓我們建立另一個名為 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 日期 CUSTOMER_ID 金額
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

內連線查詢:

現在讓我們使用如下所示的內連線查詢組合這兩個表:

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

輸出

該表顯示如下:

ID 姓名 日期 金額
3 Kaushik 2009-10-08 00:00:00 3000.00
3 Kaushik 2009-10-08 00:00:00 1500.00
2 Khilan 2009-11-20 00:00:00 1560.00
4 Chaitali 2008-05-20 00:00:00 2060.00

使用內連線連線多個表

使用內連線查詢,我們可以連線儘可能多的表。

但是,一次只能根據一個條件將兩個表連線在一起。這個過程按順序進行,直到所有表都被組合。

語法

以下是使用內連線連線多個表的語法:

SELECT column_name1, column_name2...
FROM table_name1
INNER JOIN 
table_name2
ON condition_1
INNER JOIN 
table_name3
ON condition_2
.
.
.

示例

在這個例子中,讓我們連線三個表,包括 CUSTOMERS 和 ORDERS 以及一個新表 EMPLOYEE。我們將首先使用下面的查詢建立 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);

EMPLOYEE 表的詳細資訊如下所示。

EID 員工姓名 銷售額
102 SARIKA 4500
100 ALEKHYA 3623
101 REVATHI 1291
103 VIVEK 3426

使用下面的查詢,我們將三個表 CUSTOMERS、ORDERS 和 EMPLOYEE 組合在一起。

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

輸出

獲得的輸出如下:

OID 日期 金額 員工姓名
102 2009-10-08 00:00:00 3000.00 SARIKA
100 2009-10-08 00:00:00 1500.00 ALEKHYA
101 2009-11-20 00:00:00 1560.00 REVATHI
103 2008-05-20 00:00:00 2060.00 VIVEK

帶有 WHERE 子句的內連線

內連線使用 WHERE 子句對要從表中檢索的記錄應用約束。

語法

使用 WHERE 子句時內連線的語法如下:

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

示例

考慮之前的兩個表 CUSTOMERS 和 ORDERS;並透過使用 WHERE 子句應用一些約束來使用內連線查詢連線它們。

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

輸出

該表顯示如下:

ID 姓名 日期 金額
3 Kaushik 2009-10-08 00:00:00 3000.00
4 Chaitali 2008-05-20 00:00:00 2060.00

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

我們還可以透過使用客戶端程式執行內連線操作來連線兩個或多個表。

語法

要透過 PHP 程式使用內連線操作連線具有公共欄位的表,我們需要使用 **mysqli** 函式 **query()** 執行 JOIN 子句,如下所示:

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

要透過 JavaScript 程式使用內連線操作連線具有公共欄位的表,我們需要使用 **mysql2** 庫的 **query()** 函式執行 JOIN 子句,如下所示:

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

要透過 Java 程式使用內連線操作連線具有公共欄位的表,我們需要使用 **JDBC** 函式 **executeQuery()** 執行 JOIN 子句,如下所示:

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

要透過 Python 程式使用內連線操作連線具有公共欄位的表,我們需要使用 **MySQL Connector/Python** 的 **execute()** 函式執行 JOIN 子句,如下所示:

using_inner_join_query = "SELECT ID, NAME, AMOUNT, DATE FROM CUSTOMERS INNER JOIN ORDERS ON CUSTOMERS.ID = ORDERS.CUST_ID"
cursorObj.execute(using_inner_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 INNER JOIN tcount_tbl b ON a.tutorial_author = b.tutorial_author'; $result = $mysqli->query($sql); if ($result->num_rows > 0) { while ($row = $result->fetch_assoc()) { printf( "Id: %s, Author: %s, Count: %d
", $row["tutorial_id"], $row["tutorial_author"], $row["tutorial_count"] ); } } else { printf('No record found.
'); } mysqli_free_result($result); $mysqli->close();

輸出

獲得的輸出如下:

Id: 3, Author: Sanjay, Count: 1
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);
  //inner join
  sql = "SELECT a.tutorial_id, a.tutorial_author, b.tutorial_count  FROM tutorials_tbl a INNER 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 } ]
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

public class InnerJoin {
   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 INNER JOIN...!;
         String sql = "SELECT a.tutorial_id, a.tutorial_author, b.tutorial_count FROM tutorials_tbl a INNER JOIN tcount_tbl b ON a.tutorial_author = b.tutorial_author";
         ResultSet resultSet = statement.executeQuery(sql);
         System.out.println("Table records after INNER 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);
      }
   }
}    

輸出

獲得的輸出如下所示:

Table records after INNER join...!
1 John Paul 1
3 Sanjay 1
import mysql.connector
#establishing the connection
connection = mysql.connector.connect(
    host='localhost',
    user='root',
    password='password',
    database='tut'
)
cursorObj = connection.cursor()
inner_join_query = f"""SELECT ID, NAME, AMOUNT, DATE FROM CUSTOMERS INNER JOIN ORDERS ON CUSTOMERS.ID = ORDERS.CUST_ID """
cursorObj.execute(inner_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()    

輸出

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

(3, 'kaushik', 3000, '2009-10-08 00:00:00')
(3, 'kaushik', 1500, '2009-10-08 00:00:00')
(2, 'Khilan', 1560, '2009-11-20 00:00:00')
(4, 'Chaital', 2060, '2008-05-20 00:00:00')
廣告