mysql基础——在多张表格中检索数据

1,670 阅读3分钟

1.内连接

关键字:INNER JOIN ON (INNER可以省略)
说明:组合两个表中的记录,返回关联字段相符的记录,也就是返回两个表的交际(阴影)部分。

image.png
实例:

SELECT *
FROM orders
JOIN customers 
    ON orders.customer_id = customers.customer_id;

2.跨数据库连接

说明:有时需要选取不同数据库的表的列,就需要跨数据库连接
实现方法:只需在表前面加上数据库即可实现跨数据库连接
实例:

SELECT *
FROM order_items oi
JOIN sql_inventory.products p 
	ON oi.product_id  = p.product_id 

3.自连接

说明:一个表和它自己合并
实例:

SELECT  e.employee_id,e.first_name,m.first_name AS manager
FROM employees e
JOIN employees m
	ON e.reports_to = m.employee_id

4.多表连接

说明:FROM 一个核心表A,用多个 JOIN …… ON …… 分别通过不同的链接关系链接不同的表B、C、D……,通常是让表B、C、D……为表A提供更详细的信息从而合并为一张详情合并版A表,即:
FROM A
JOIN B ON AB的关系
JOIN C ON AC的关系
JOIN D ON AD的关系
……
将得到一个合并了BCD……等表详细信息的详情合并版A表

实例:

SELECT o.order_id,o.order_date,c.first_name,c.last_name,os.name AS STATUS
FROM orders o
JOIN customers c
	ON o.customer_id = c.customer_id
JOIN order_statuses os
	ON o.status = os.order_status_id

5.复合连接

说明:
FROM 表1 JOIN 表2 ON 条件1 【AND】 条件2
实例:将订单项目表和订单项目备注表合并

SELECT *
FROM order_items oi
JOIN order_item_notes oin
	ON oi.order_id = oin.order_id
	AND oi.product_id = oin.product_id

6.隐式连接

说明:FROM WHERE取代FROM JOIN ON
实例:合并顾客表和订单表

SELECT *
FROM orders o, customers c
WHERE o.customer_id = c.customer_id

7.外连接

a.左外连接
关键字:LEFT(OUTER) JOIN ON 说明:左表的记录将会全部显示出来,而右表只会显示符合搜索条件的记录。右表记录不足的地方均为NULL。

image.png
实例:

SELECT c.customer_id,c.first_name,o.order_id
FROM customers c
LEFT JOIN orders o
	ON c.customer_id = o.customer_id

b.右外连接
关键字:RIGHT(OUTER) JOIN ON
说明:右表的记录将会全部显示出来,而左表只会显示符合搜索条件的记录。左表记录不足的地方均为NULL。

image.png

8.多表外连接

实例:

SELECT o.order_id,o.order_date,c.first_name AS customer,sh.name AS shipper,os.name AS STATUS
FROM orders o
JOIN customers c
	ON o.customer_id = c.customer_id
LEFT JOIN shippers sh
	ON o.shipper_id = sh.shipper_id
JOIN order_statuses os
	ON o.status = os.order_status_id

9.自外连接

实例:

SELECT 
	e.employee_id,
	e.first_name,
	m.first_name AS manager
FROM employees e
LEFT JOIN employees m
	ON e.reports_to = m.employee_id

10.USING子句

说明:查询变得复杂,连接条件变得碍事让查询很难理解如果这两个表中右列名称是完全一样的可以使用HAVING替换ON
实例:

SELECT o.order_id,c.first_name
FROM orders o
JOIN customers c
	-- on o.customer_id = c.customer_id
	USING(customer_id)

11.自然连接(了解)

说明:NATURAL JOIN 就是让MySQL自动检索同名列作为合并条件。
实例:

SELECT 
    o.order_id,
    c.first_name
FROM orders o
NATURAL JOIN customers c

12.交叉连接

实例:

SELECT 
    c.first_name AS customer,
    p.name AS product
FROM customers c
CROSS JOIN products p
ORDER BY c.first_name

13.联合

说明:FROM …… JOIN …… 可对多张表进行横向列合并,而 …… UNION …… 可用来按行纵向合并多个查询结果,这些查询结果可能来自相同或不同的表

  • 同一张表可通过UNION添加新的分类字段,即先通过分类查询并添加新的分类字段再UNION合并为带分类字段的新表。

  • 不同表通过UNION合并的情况如:将一张18年的订单表和19年的订单表纵向合并起来在一张表里展示

注意

  • 合并的查询结果必须列数相等,否则会报错

  • 合并表里的列名由排在 UNION 前面的决定

实例
a.给表订单增加一个新字段——(status),用以区分今年的订单和今年以前的订单

SELECT 
        order_id,
        order_date,
        'Active' AS STATUS
    FROM orders
    WHERE order_date >= '2019-01-01'
UNION
    SELECT 
        order_id,
        order_date,
        'Archived' AS STATUS  -- Archived 归档
    FROM orders
    WHERE order_date < '2019-01-01';

b.合并不同表的例子——在同一列里显示所有顾客名以及所有商品名

    SELECT first_name AS name_of_all
    -- 新列名由排UNION前面的决定
    FROM customers
    UNION
    SELECT name
    FROM products