提示
本文简单介绍一下多表查询的基本方法,供快速复习和浏览。主要涉及到:子查询
、联结查询
,其中联结查询
主要介绍
- 内联结(
INNER JOIN
) - 外联结(
LEFT OUTER JOIN
和RIGHT OUTER JOIN
)
子查询
将一个SELECT
的查询结果作为 一整个单元,在另外一个SELECT
语句中使用
例子:查询商品,要求销售价格比菜刀的销售价格贵。
我们可以拆解该语句:
- 查询菜刀的销售价格
SELECT sale_price FROM product WHERE product_name = '菜刀'
- 将查询出的菜刀销售价格放在新
SELECT
的WHERE
条件中。
SELECT * FROM product WHERE sale_price > (SELECT sale_price FROM product WHERE product_name = '菜刀')
这里就用到了子查询,将一个结果的单元封装到另外一个查询语句中。
注意 : 子查询既可以用在单表中做嵌套查询,也可以用在多表中。但单表的嵌套查询是常用的。
联结
联结:主要是针对两个表中
有关联的字段,例如
A.id = B.id
,A表中的id和B表中的id是有关联的。
内联结
内联结:更多的用途是以A.id = B.id
为条件后,找出两个表中的 公共部分。它的关键字是INNER JOIN ON
SELECT *
FROM T1
INNER JOIN T2
ON 条件
T1 INNER JOIN T2
:将两个表的记录拼接起来,它需要按条件进行拼接,即ON
,执行后会对比;两个表的每行记录,如果满足ON
条件,就会将两个表的所有列进行拼接,形成一个表。它的执行效果和WHERE
的等值判断一样,但是效率会比WHERE
高。
例子:有两个表,一个是用户表(USERS),一个是订单表(ORDERS),查询用户的购物信息
SELECT *
FROM USERS
INNER JOIN ORDERS
ON USERS.ID = ORDERS.CUSTOMER_ID;
外联结
外联结:更多的用途是以A.id = B.id
为条件后
A LEFT JOIN B
:以A表为完整展示,B表为筛选条件 ,在B中找不到对应A的记录,则将B中的内容置为NULL。
或者
A RIGHT JOIN B
:以B表为完整展示,A表为筛选条件,在A中找不到对应B的记录,则将A中的内容置为NULL。
还是以上面的例子展开这里可以这样说:
例子:查询所有的用户信息和它的购物信息,若没有购物信息设置为NULL即可
SELECT *
FROM USERS
LEFT JOIN ORDERS
ON USERS.ID = ORDERS.CUSTOMER_ID;
记忆起来其实比较简单,它们不光是将对应条件USERS.ID = ORDERS.CUSTOMER_ID
的两个表的字段做全拼接。而且,USERS表中的内容是全部展示,如果不满足条件USERS.ID = ORDERS.CUSTOMER_ID
的字段咋整?设置为NULL即可。即USERS
表是完整展示信息的,而不满足条件的这一行,在ORDERS
的字段中都设为NULL。
T1 RIGHT JOIN T2
和LEFT JOIN
刚好相反,它是T2
表完整展示。