如何利用SQL中第一个表的数据从第二个表获取数据
首先得明确:要实现这个需求,核心是利用SQL JOIN语法——只要你的第二个表和CUSTOMERS表有一个共同的关联字段(比如CUSTOMERS的ID字段,对应第二个表的CUSTOMER_ID字段,这是最常见的关联场景),就能把两个表的数据关联起来,筛选出你需要的内容。
咱们先假设一个常见的第二个表场景,比如ORDERS表(记录客户的订单信息),结构和示例数据如下:
+-----+------------+-------------+--------+ | OID | DATE | CUSTOMER_ID | AMOUNT | +-----+------------+-------------+--------+ | 101 | 2023-01-05 | 1 | 500 | | 102 | 2023-01-07 | 3 | 300 | | 103 | 2023-01-09 | 5 | 800 | | 104 | 2023-01-10 | 7 | 1200 | | 105 | 2023-01-12 | 2 | 200 | +-----+------------+-------------+--------+
这里ORDERS.CUSTOMER_ID和CUSTOMERS.ID是关联字段,下面用不同的JOIN方式演示如何获取数据:
1. INNER JOIN:获取两个表中匹配的记录
这个是最常用的,只会返回在两个表中都有对应关联数据的记录,比如只获取有订单的客户信息+他们的订单数据:
SELECT c.ID, c.NAME, c.ADDRESS, o.OID, o.DATE, o.AMOUNT FROM CUSTOMERS c INNER JOIN ORDERS o ON c.ID = o.CUSTOMER_ID;
执行后会得到所有有订单的客户和对应的订单详情,没有订单的客户(比如ID为4、6的Chaitali、Komal)不会出现在结果里。
2. LEFT JOIN:获取CUSTOMERS的所有记录,以及第二个表中匹配的记录
如果不管客户有没有订单,都要显示客户信息,没有订单的地方用NULL填充,就用LEFT JOIN:
SELECT c.ID, c.NAME, c.ADDRESS, o.OID, o.DATE, o.AMOUNT FROM CUSTOMERS c LEFT JOIN ORDERS o ON c.ID = o.CUSTOMER_ID;
结果里ID为4、6的客户会被显示,他们的订单相关字段(OID、DATE、AMOUNT)都是NULL。
3. RIGHT JOIN:获取第二个表的所有记录,以及CUSTOMERS中匹配的记录
如果想显示所有订单,即使某个订单对应的客户在CUSTOMERS表中不存在(比如测试数据里没有的客户ID),就用RIGHT JOIN:
SELECT c.ID, c.NAME, c.ADDRESS, o.OID, o.DATE, o.AMOUNT FROM CUSTOMERS c RIGHT JOIN ORDERS o ON c.ID = o.CUSTOMER_ID;
如果ORDERS里有一个CUSTOMER_ID为99的订单,那这条记录会被显示,对应的客户字段都是NULL。
4. FULL OUTER JOIN:获取两个表的所有记录
这个会返回两个表的所有记录,匹配的合并,不匹配的用NULL填充:
SELECT c.ID, c.NAME, c.ADDRESS, o.OID, o.DATE, o.AMOUNT FROM CUSTOMERS c FULL OUTER JOIN ORDERS o ON c.ID = o.CUSTOMER_ID;
结果包含所有客户(不管有没有订单)和所有订单(不管有没有对应客户)。
额外提示:如果第二个表的关联字段不是ID?
如果你的第二个表和CUSTOMERS的关联字段不是ID,比如用NAME(不推荐,因为可能有重名),只需要把JOIN条件改成对应的字段就行,比如:
SELECT c.*, o.* FROM CUSTOMERS c INNER JOIN YOUR_SECOND_TABLE o ON c.NAME = o.CUSTOMER_NAME;
内容的提问来源于stack exchange,提问作者sravan kumar

