SQL查詢語句(二)—— 多表查詢


一、列名/表名更改

列名更改

AS關鍵字是可選的,因此您可以在語句中將其省略

SELECT 
   [column_1 | expression] AS descriptive_name
FROM table_name;	

選擇員工的名字和姓氏,使用CONCAT_WS()函數將名字和姓氏連接為全名

SELECT
   CONCAT_WS(', ', lastName, firstname) AS `Full name`
FROM
   employees;

表名更改

table_name AS table_alias

employees表別名更改為e:

SELECT * FROM employees e;

為表分配別名后,您可以使用以下語法引用表列:

table_alias.column_name
SELECT 
    e.firstName, 
    e.lastName
FROM
    employees e
ORDER BY e.firstName;
SELECT
	customerName,
	COUNT(o.orderNumber) total
FROM
	customers c
INNER JOIN orders o ON c.customerNumber = o.customerNumber
GROUP BY
	customerName
ORDER BY
	total DESC;

二、INNER JOIN 內連接,等值連接

SELECT
    select_list
FROM t1
INNER JOIN t2 ON join_condition1
INNER JOIN t3 ON join_condition2
...;

示例:

查詢 產品的號碼、產品名、產品描述

SELECT 
    productCode, 
    productName, 
    textDescription
FROM
    products t1
INNER JOIN productlines t2 
    ON t1.productline = t2.productline;

由於兩個表的聯接列都具有相同的名稱 productline,因此可以使用以下USING

SELECT 
    productCode, 
    productName, 
    textDescription
FROM
    products
INNER JOIN productlines USING (productline);

示例2:

ordersorderdetails表中返回來自和表的訂單號,訂單狀態和總銷售額:INNER JOIN``GROUP BY

SELECT 
    t1.orderNumber,
    t1.status,
    SUM(quantityOrdered * priceEach) total
FROM
    orders t1
INNER JOIN orderdetails t2 
    ON t1.orderNumber = t2.orderNumber
GROUP BY orderNumber;

INNER JOIN–連接三個表示例:


SELECT 
    orderNumber,
    orderDate,
    orderLineNumber,
    productName,
    quantityOrdered,
    priceEach
FROM
    orders
INNER JOIN
    orderdetails USING (orderNumber)
INNER JOIN
    products USING (productCode)
ORDER BY 
    orderNumber, 
    orderLineNumber;

INNER JOIN`使用其他運算符

SELECT 
    orderNumber, 
    productName, 
    msrp, 
    priceEach
FROM
    products p
INNER JOIN orderdetails o 
   ON p.productcode = o.productcode
      AND p.msrp > o.priceEach
WHERE
    p.productcode = 'S10_1678';

三、LEFT JOIN 左連接

LEFT JOIN返回左表中的所有行,而不管左表中的行是否與右表中的行匹配。如果沒有匹配項,則右表中該行的列將包含NULL

SELECT 
    select_list
FROM
    t1
LEFT JOIN t2 ON 
    join_condition;

SELECT
    c.customerNumber,
    customerName,
    orderNumber,
    status
FROM
    customers c
LEFT JOIN orders o 
    ON c.customerNumber = o.customerNumber;

LEFT JOIN 查找不匹配的行

SELECT 
    c.customerNumber, 
    c.customerName, 
    o.orderNumber, 
    o.status
FROM
    customers c
LEFT JOIN orders o 
    ON c.customerNumber = o.customerNumber
WHERE
    orderNumber IS NULL;

INNER JOIN子句,該子句中on的使用 可以等效WHERE 但在LEFT JOIN不等效

SELECT 
    o.orderNumber, 
    customerNumber, 
    productCode
FROM
    orders o
LEFT JOIN orderDetails 
    USING (orderNumber)
WHERE
    orderNumber = 10123;

SELECT 
    o.orderNumber, 
    customerNumber, 
    productCode
FROM
    orders o
LEFT JOIN orderDetails d 
    ON o.orderNumber = d.orderNumber AND 
       o.orderNumber = 10123;


-Condition-in-WHERE-clause.png)

四、RIGHT JOIN 右鏈接

RIGHT JOIN返回右表中的所有行,而不管右表中的行是否與左表中的行匹配。如果沒有匹配項,則右左表中該行的列將包含NULL

五、CROSS JOIN 交叉連接

從聯接表中返回行的笛卡爾積

SELECT * FROM t1
CROSS JOIN t2;

獲取所有商店和產品的組合

SELECT 
    store_name, product_name
FROM
    stores AS a
        CROSS JOIN
    products AS b;

https://www.mysqltutorial.org/mysql-cross-join/

六、SELF JOIN 自連接

SELECT 
    CONCAT(m.lastName, ', ', m.firstName) AS Manager,
    CONCAT(e.lastName, ', ', e.firstName) AS 'Direct report'
FROM
    employees e
INNER JOIN employees m ON 
    m.employeeNumber = e.reportsTo
ORDER BY 
    Manager;
SELECT 
    IFNULL(CONCAT(m.lastname, ', ', m.firstname),
            'Top Manager') AS 'Manager',
    CONCAT(e.lastname, ', ', e.firstname) AS 'Direct report'
FROM
    employees e
LEFT JOIN employees m ON 
    m.employeeNumber = e.reportsto
ORDER BY 
    manager DESC;

顯示位於同一城市的客戶列表

SELECT 
    c1.city, 
    c1.customerName, 
    c2.customerName
FROM
    customers c1
INNER JOIN customers c2 ON 
    c1.city = c2.city
    AND c1.customername > c2.customerName
ORDER BY 
    c1.city;
  • c1.city = c2.city 確保兩個客戶都在同一個城市。
  • c.customerName > c2.customerName 確保不包括同一位客戶。

參考資料

basic-mysql-tutorial




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM