sql题目练习——多表查询
题目:
现有 orders 表,字段有 order_id(订单编号,主键),customer_id(客户编号),order_date(订单日期);以及 customers 表,字段有 customer_id(客户编号,主键),customer_name(客户姓名),city(客户所在城市)。编写 SQL 查询所有来自 “Beijing” 城市的客户的订单编号、订单日期和客户姓名。
select o.order_id,o.order_date,c.customer_name
from orders o,customers c
where c.customer_id=o.customer_id AND c.city='Beijing'
追问:
1.orders 表还有 total_amount(订单总金额)字段,现在要查询来自 “Shanghai” 城市且订单总金额大于 1000的订单编号、订单日期、客户姓名和订单总金额,SQL 如何实现?
2. 怎么修改这条 SQL(用 JOIN 写法)
追答:
select o.order_id,o.order_date,c.customer_name,o.total_amount
from orders o,customers c
where c.customer_id=o.customer_id AND c.city=‘Shanghai’ AND o.total_amount>1000
改为 join写法为:
select o.order_id,o.order_date,c.customer_name,o.total_amount
from orders o
join customers c ON c.customer_id=o.customer_id
where c.city=‘Shanghai’ AND o.total_amount>1000
相关知识点
JOIN
关键字用于在SQL查询中结合两个或多个表的数据,基于这些表之间的相关列。常见的 JOIN
类型包括 INNER JOIN
、LEFT JOIN
、RIGHT JOIN
和 FULL OUTER JOIN
。以下是对它们的详细解释:
1. INNER JOIN
- 含义:
INNER JOIN
返回两个表中连接条件相匹配的行。只有当连接条件满足时,才会在结果集中包含相应的行。这是最常用的JOIN
类型,如果不指定JOIN
类型,默认就是INNER JOIN
。 - 语法示例:
SELECT column1, column2
FROM table1
INNER JOIN table2 ON table1.common_column = table2.common_column;
- 示例说明:假设
table1
是orders
表,table2
是customers
表,common_column
是customer_id
。只有当orders
表中的customer_id
与customers
表中的customer_id
匹配时,相应的订单和客户信息才会出现在结果集中。
2. LEFT JOIN
(也称为 LEFT OUTER JOIN
)
- 含义:
LEFT JOIN
返回左表(JOIN
关键字左边的表)中的所有行,以及右表中满足连接条件的行。如果右表中没有匹配的行,则结果集中对应右表的列值为NULL
。 - 语法示例:
SELECT column1, column2
FROM table1
LEFT JOIN table2 ON table1.common_column = table2.common_column;
- 示例说明:继续以
orders
和customers
表为例,使用LEFT JOIN
时,orders
表中的所有订单记录都会出现在结果集中。对于每个订单,如果在customers
表中有匹配的客户记录,则显示客户信息;否则,客户相关列显示为NULL
。这在需要查看所有订单,包括那些可能还没有关联客户的订单时很有用。
3. RIGHT JOIN
(也称为 RIGHT OUTER JOIN
)
- 含义:
RIGHT JOIN
与LEFT JOIN
相反,它返回右表(JOIN
关键字右边的表)中的所有行,以及左表中满足连接条件的行。如果左表中没有匹配的行,则结果集中对应左表的列值为NULL
。 - 语法示例:
SELECT column1, column2
FROM table1
RIGHT JOIN table2 ON table1.common_column = table2.common_column;
- 示例说明:以相同的
orders
和customers
表为例,使用RIGHT JOIN
会确保customers
表中的所有客户记录都出现在结果集中。对于每个客户,如果有相关订单,则显示订单信息;否则,订单相关列显示为NULL
。
4. FULL OUTER JOIN
- 含义:
FULL OUTER JOIN
返回左表和右表中的所有行。当某行在另一表中没有匹配项时,结果集中对应另一表的列值为NULL
。它实际上是LEFT JOIN
和RIGHT JOIN
的并集。 - 语法示例:
SELECT column1, column2
FROM table1
FULL OUTER JOIN table2 ON table1.common_column = table2.common_column;
- 示例说明:对于
orders
和customers
表,FULL OUTER JOIN
会包含所有订单和所有客户的信息。如果某个订单没有关联客户,客户相关列是NULL
;如果某个客户没有订单,订单相关列是NULL
。不过,并非所有数据库都直接支持FULL OUTER JOIN
关键字,在不支持的数据库中,可能需要通过LEFT JOIN
和RIGHT JOIN
的组合来实现类似效果。