多表查询

实现多表查询(关联查询)的基本条件是,这些表之间要有要存在关系,它们之间要有关联字段

什么是笛卡尔积?

笛卡尔积也被称为交叉连接,CROSS JOIN。

假设有X和Y两个集合,集合X和Y的笛卡尔积就是X和Y所有可能的组合,其中第一个对象来自X,第二个对象来自Y。

因此,交叉连接可以把两张表连接起来,即使这两张表不相关。

笛卡尔积会使得所有表中的所有行相互连接,我们可以使用WHERE加入有效的链接条件。

SELECT table1.column,table2.column
FROM table1,table2
WHERE table1.column=table2.column

多表查询的分类

第一类:等值连接和非等值连接

等值连接

等值连接就是连接条件用等号的。

比如要查询表employees和departments,现在想查询employees中的last_name,但是departments里也有last_name,那么就要在last_name前面加个前缀

SELECT employees.last_name,departments.department_name,employees.department_id
FROM employees,departments
WHERE employees.department_id=departments.department_id;

写employees和departments写了好多,很烦,可以使用表的别名进行简化。

SELECT e.last_name,d.department_name,e.department_id
FROM employees e,departments d
WHERE e.department_id=d.department_id;

如果使用了表的别名,在查询字段,过滤条件中必须使用表的别名进行代替!!不能使用表的原名,否则会报错!!

--常见报错为
Column '列名' in field list is ambiguous

连接n个表需要n-1个链接条件。

非等值连接

非等值连接就是值连接条件用大于小于号的,或者用BETWEEN关键字的,该字段落在某个范围内。

打个比方:要对employees中的salary字段进行评级,比如工资在1000-2999范围内为A级,工资在3000-5999范围内为B级等等

WHERE e.salary BETWEEN j.low_sal AND j.higest_sal

第二类:自连接和非自连接

打个比方:employees表中有三个字段,分别是employee_id,last_name,manager_id。
现在要输出一个“XXX works for XXX”,则要对表进行自连接

SELECT CONCAT(worker.last_name,'works for',manager.last_name)
FROM employees worker,employees manager
WHERE worker.manager_id = manager.employee_id;
内连接和外连接
  • 内连接
    假设两个表有相同的列,将两个表合并起来,把两个相同的列变为一列,产生的结果集不包含一个表与另一个表不匹配的项
  • 外连接
    两个表在进行连接的时候,可能会产生不满足连接条件的情况,因此也要对不满足连接条件的行进行返回。
    额外返回左表中不满足条件的行称为左外连接
    额外返回右表中不满足条件的行称为右外连接