这是两个表多表查询,需要一个连接条件customer_id。如果有n个表实现多表查询,至少需要n-1个连接条件。如果少于n-1个,就会出现笛卡尔积的错误。
SELECT orders.order_id, customers.customer_name
FROM orders
INNER JOIN customers
ON orders.customer_id = customers.customer_id;
多表查询的分类:
①:等值连接VS非等值连接
②:自连接VS非自连接
SELECT emp.emp_id,emp.last_name
from emp,mgr
WHERE emp.manager_id=mgr.employee_id;
③:内连接与外连接
SELECT 列名列表
FROM 表1
INNER JOIN 表2
ON 表1.关联列 = 表2.关联列;
左连接:
SELECT 列名列表
FROM 表1
LEFT JOIN 表2
ON 表1.关联列 = 表2.关联列;
右连接:
SELECT 列名列表
FROM 表1
RIGHT JOIN 表2
ON 表1.关联列 = 表2.关联列;
但是MySQL不支持全外连接:
SELECT 列名列表
FROM 表1
FULL OUTER JOIN 表2
ON 表1.关联列 = 表2.关联列;
union和union all
UNION用于合并两个或多个SELECT语句的结果集。它会自动去除合并后结果集中的重复行。
假设有两个表TableA和TableB,结构相同,都包含Column1和Column2两列。我们想要获取这两个表中不重复的所有记录,可以使用如下代码:
SELECT Column1, Column2
FROM TableA
UNION
SELECT Column1, Column2
FROM TableB;
UNION ALL同样用于合并多个SELECT语句的结果集,但与UNION不同的是,它不会去除重复行。它会直接将所有查询结果按顺序连接起来。
还是以上述TableA和TableB为例,若使用UNION ALL,代码如下:
SELECT Column1, Column2
FROM TableA
UNION ALL
SELECT Column1, Column2
FROM TableB;
从性能角度来看,UNION ALL通常会比UNION更快。因为UNION需要对合并后的结果集进行去重操作,这涉及到额外的排序和比较工作。而UNION ALL只是简单地将结果集连接起来,无需进行去重的复杂操作。
所以,当我们确定合并的结果集中不会出现重复行,或者即使有重复行也不影响业务需求时,优先使用UNION ALL可以提高查询性能,减少数据库的处理开销。
自然连接:
自然连接会遍历Employees表和Departments表,将Employees表中DepartmentID值与Departments表中DepartmentID值相同的行组合在一起,形成最终的结果集。并且,由于自然连接会自动根据同名列进行匹配,结果集中不会出现重复的列(即DepartmentID在结果集中只会出现一次)。
USING连接:
SELECT *
FROM Employees
JOIN Departments
USING (DepartmentID);
在这个查询中,通过USING (DepartmentID)明确指定了仅依据DepartmentID列进行连接。这样,我们可以精准控制连接条件,避免其他无关同名列的干扰。同时,与自然连接类似,在结果集中DepartmentID列只会出现一次。
表连接的约束条件:WHERE,ON,USING
WHERE 子句在表连接中用于筛选符合特定条件的行。它的作用范围是整个查询结果集。
ON 子句专门用于指定表连接的条件。它在连接操作执行时就发挥作用,决定哪些行应该被连接在一起。
USING 子句也是用于指定连接条件的一种方式,它与 ON 子句有相似之处,但有其独特的特点。USING 子句用于连接两个表中具有相同列名的列。