[SQL | DDUP] Task03:复杂一点的查询

最近毕设和实习太忙,听的codewithmosh的网课来学的,可能和Datawhale的学习资料内容有点区别,很抱歉。

内连接

内连接

凭借某个列来对齐两个表

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

下面这个情况会报错:

SELECT order_id, customer_id, first_name, last_name
FROM orders
JOIN customers 
	ON orders.customer_id = customers.customer_id

报错信息Column 'customer_id' in field list is ambiguous,意思是说两个表里面都有这个列,所以MySQL不知道选择哪一个表里头的这一列
这时候你只需要加上一个前缀(prefix)就行了,随便写将哪个列设为前缀均可,因为值都是一样的,就像这样

SELECT order_id, orders.customer_id, first_name, last_name
FROM orders
JOIN customers 
	ON orders.customer_id = customers.customer_id

我们发现很多地方需要重复写一些表的名称,可以通过去alias的方法来简化

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

跨数据库连接

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

注意你前缀对哪个数据添加前缀,取决于你现在USE的是哪个数据库;
比如上面代码正在使用sql_store这个数据库,所以要连接sql_inventory里头的products,就需要加这个前缀

自连接

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

自连接的时候要注意就是你要把这同一张表取不同的别名,这样才能够有所区分

多表连接

这个不难,注意

  1. 取号Alias
  2. 注意SELECT的时候也要加前缀

复合连接条件

可以使用AND连接多个条件来实现复合连接条件

隐式连接语法

简单就是可以把JOIN...ON...的语法改成是WHERE clause(注意要把原来JOIN后面的放到FROM里头一起写)。
但是我们并不建议这样做,因为你如果忘记写了

外连接

从外连接带外连接

USE sql_store;

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

这个内连接的方法,会漏掉一些列,原因在于内连接只会给出连接条件对应的列的值存在的行。
而外连接希望除了给出连接条件对应的列的值存在的行以外还能得到该条件为空的行。

外连接分为左连接和右连接两种,左连接LEFT JOIN表示返回FROM后面那张表格的相关信息,不管连接条件是否为真;
相应地,右连接RIGHT JOIN表示返回JOIN后面那张表格的相关信息,不管连接条件是否为真;

你可以在LEFTJOINRIGHTJOIN之间添加OUTER关键字来表示这是外连接,但是可以不写,一如之前内连接的INNER也可省略一样

浙ICP备19012682号