SQL(Structured Query Language)是一种用于管理和查询关系型数据库的标准编程语言。在SQL中,JOIN操作是一种强大的工具,它允许根据共同的列将不同表中的数据结合起来。在现实世界中,企业通常会将数据存储在不同的小表中,因此,为了进行数据分析,通常需要通过连接不同的表来获取所需的数据。这就是为什么在数据科学职位面试中,面试官总是对候选人如何高效使用SQL JOIN操作感兴趣的原因。
SQL中的JOIN命令用于根据这些表之间的共同列将两个或多个表中的数据结合起来。当所需数据存储在不同的表中时,SQL JOIN允许将这些表在一个或多个共同列上结合起来,然后选择记录,这些记录可能包含也可能不包含来自两个表的列。
根据想要如何结合两个或多个表以及选择记录的方式,SQL中有4种基本类型的JOIN。
INNER JOIN:它结合两个表,使得JOIN操作执行的共同列在两个表中都有匹配的值。因此,它用于检索两个表中都有的记录。如果不写INNER JOIN,只写JOIN也是可以的,因为默认情况下它会被当作INNER JOIN处理。
LEFT JOIN:这种JOIN用于检索左表的所有记录和右表中匹配的记录。但是,当右表中没有匹配的行时,这种JOIN会在左表的某些行中返回NULL。这种JOIN也被称为LEFT OUTER JOIN。
RIGHT JOIN:它用于检索右表的所有记录和左表中匹配的记录。类似于之前的JOIN类型,对于右表中的某些记录,当左表中没有匹配的行时,这种JOIN会返回NULL。这种JOIN也被称为RIGHT OUTER JOIN。
FULL JOIN:正如其名,它用于检索两个表中的所有记录。因此,这种JOIN的结果集将包含两个表中的所有行。当左表或右表中没有匹配的行时,会在该位置返回NULL值。这种JOIN也被称为FULL OUTER JOIN。
CROSS JOIN返回两个表的所有可能组合。因此,第一个表的每一行都与第二个表的每一行结合。如果未使用WHERE子句,CROSS JOIN返回的总记录数本质上是两个表中记录数的乘积。这种JOIN生成的结果被称为两个表的笛卡尔积。与其他类型的JOIN不同,CROSS JOIN不需要提及ON子句。它可以像下面这样简单:
SELECT t1.column1, t1.column2, t1.column3
FROM Table1 AS t1
CROSS JOIN
Table2 AS t2
SELF JOIN用于将表与自身结合。对于初学者来说,这可能听起来有些困惑。然而,它对于比较同一表中的行非常有用。记住,没有SELF JOIN关键字,所以只需使用JOIN,而在JOIN中涉及的两个表都是同一个表。由于两个表名相同,在SELF JOIN的情况下使用表别名是必要的。
以下是一个SELFJOIN的SQL查询示例,用于找出赚取比他们经理更多的员工:
SELECT t1.EmployeeName, t1.TotalOrders
FROM Dummy_Employees AS t1
JOIN Dummy_Employees AS t2
ON t1.ManagerID = t2.EmployeeID
WHERE t1.TotalOrders > t2.TotalOrders
这个查询返回了Abdul和Maria这两个员工,他们处理的订单比他们的经理Pablo还要多。
结合多个表与在两个表之间使用JOIN是相同的。这种JOIN需要连续的JOIN操作 → 首先,将第一个和第二个表连接起来,得到一个中间结果集;然后,将另一个表连接到这个中间表。
SELECT orders.orderID,
sales.salesUSD,
products.quantity
FROM orders
INNER JOIN sales
ON orders.orderID = sales.orderID
INNER JOIN products
ON orders.orderID = products.orderID