我可以查询一个 SQL 数据库并一次性合并四个表吗?

can I query an SQL database and combine four tables in one go?

我正在研究 sql 命令行,并通过终端在 mysql 中使用命令。我正在研究INNER JOIN,我发现它很容易,但我有一个疑问我必须解决否则无法传递给其他命令。

我有这四个表:部门、员工、employees_projects、项目

这些表格有以下内容:

部门: 标识整数 名称 varchar(60)

员工: 标识整数 first_name 变量(60) last_name 变量(60) 工资整数 department_id 整数

employees_projects: project_id 整数 employee_id 整数

项目: 标识整数 标题 varchar(60) start_date 日期 end_date 日期 预算整数

当我想使用 INNER JOIN 连接两个表时,我只是这样使用它:

SELECT employees.first_name, employees.last_name, departments.name
FROM employees
INNER JOIN departments ON employees.department_id = departments.id;

当我想加入三个表时,我使用以下命令:

SELECT employees.first_name, employees.last_name, departments.name, employees_projects.project_id
FROM ( (employees
INNER JOIN departments ON employees.department_id = departments.id)
INNER JOIN employees_projects ON employees.id = employees_projects.employee_id);

这是我的问题:如您所见,最后一行的结果将给我 employees.first_name、employees.last_name、departments.name、employees_projects.project_id,这意味着我将获取员工的姓名、部门和他们正在从事的项目的 ID。现在,考虑到我们上面的表格,我无法创建一行 SQL 查询,结果是 employees.first_name、employees.last_name、departments.name、projects.title.这意味着一个查询会给我员工的名字、姓氏、部门和他们正在处理的项目名称。

是否可以在一行查询中实现这一点?

mysql>谢谢大家!

正在编辑 POST:

我创建了以下行:

SELECT employees.first_name, employees.last_name, departments.name, projects.title FROM ( (employees, projects INNER JOIN departments ON employees.department_id = departments.id) INNER JOIN employees_projects ON projects.id = employees_projects.project_id AND employees_projects.employee_id = employees.id); 

但不幸的是,我收到了这个错误,这很奇怪,因为看起来是正确的列:

mysql> SELECT employees.first_name, employees.last_name, departments.name, projects.title FROM ( (employees, projects INNER JOIN departments ON employees.department_id = departments.id) INNER JOIN employees_projects ON projects.id = employees_projects.project_id AND employees_projects.employee_id = employees.id); 
ERROR 1054 (42S22): Unknown column 'employees.department_id' in 'on clause'
mysql> 

使用需要这样的东西:

select emp.first_name,emp.last_name,d.name,p.title , p.id from employees emp
join departments d on d.id = emp.department_id
join employees_projects empp on empp.employee_id = emp.id
join projects p on p.id = empp.project_id

您可能熟悉算术符号。您可以使用任意数量的项创建算术表达式:

a + b + c + d

第一个学期之前没有任何内容。每个术语之间都有一个 +。确实没有“主”项,因为加法具有交换性的代数 属性。该表达式的结果与:

c + a + d + b

或任何其他顺序的条款。

在SQL中,联接是相似的。理论上您可以加入任意数量的 table。

<table> INNER JOIN <table> ON <condition>
        INNER JOIN <table> ON <condition>
        INNER JOIN <table> ON <condition>

如果需要,您可以在此之后继续添加更多内容。 (我说理论上是因为 MySQL 或任何其他 SQL 产品只是该语言的一种实现,它可能有实际限制。在 MySQL 的情况下,限制是 63 tables 每个查询但这不是语言的错,这只是 MySQL 的代码实现连接的方式。)

FROM 不是表达式的一部分,它不会将任何 table 命名为“主要”table。 Inner join 具有 属性 的交换性,就像算术中的加法一样。事实上,MySQL 可以在运行您的查询时对 table 本身进行重新排序,如果它最终使查询具有更好的性能的话。

您尝试过此连接:

FROM ( (employees, projects INNER JOIN departments 
    ON employees.department_id = departments.id) 
INNER JOIN employees_projects 
    ON projects.id = employees_projects.project_id 
    AND employees_projects.employee_id = employees.id); 

您混合使用两种语法形式,这会导致问题。

逗号连接来自 1989 年,这些仍然有效。但是他们无法执行 OUTER JOIN,因此语法在 1992 年更改为具有 INNER/OUTER JOIN 关键字。

但问题在于,INNER/OUTER JOIN 关键字的语法比逗号具有更高的优先级。因此,就好像您的查询在查询引擎甚至确认 employees 是查询的一部分之前就加入了 projectsdepartments。当它检查引用 employeesON 条件时,它不知道 table.

这实际上已记录在案:https://dev.mysql.com/doc/refman/8.0/en/join.html 在页面底部附近搜索“JOIN 的优先级高于逗号运算符”。

解决方案是始终只使用 1992 风格的语法。我会按照@Adamszsz 在另一个答案中写查询的方式来写它。