我可以查询一个 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
是查询的一部分之前就加入了 projects
和 departments
。当它检查引用 employees
的 ON
条件时,它不知道 table.
这实际上已记录在案:https://dev.mysql.com/doc/refman/8.0/en/join.html 在页面底部附近搜索“JOIN 的优先级高于逗号运算符”。
解决方案是始终只使用 1992 风格的语法。我会按照@Adamszsz 在另一个答案中写查询的方式来写它。
我正在研究 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
是查询的一部分之前就加入了 projects
和 departments
。当它检查引用 employees
的 ON
条件时,它不知道 table.
这实际上已记录在案:https://dev.mysql.com/doc/refman/8.0/en/join.html 在页面底部附近搜索“JOIN 的优先级高于逗号运算符”。
解决方案是始终只使用 1992 风格的语法。我会按照@Adamszsz 在另一个答案中写查询的方式来写它。