这是一个正确的MySql查询

时间:2017-05-04 18:45:45

标签: mysql sql database relational-database

我试图从员工数据库中获取包含名字,姓氏,部门名称,职位,薪水的前100行,但不确定我是否正确执行此操作。我尝试了下面的查询,它似乎工作,但特别感觉不对,因为最后2个连接没有ON语句。它是否正确,是否有更有效的方法可以执行此查询。

这是数据库表图表的链接,可让您了解数据库。 https://dev.mysql.com/doc/employee/en/images/employees-schema.png

我的查询似乎有效:

SELECT e.first_name, e.last_name, dpn.dept_name, t.title, s.salary
FROM employees e, dept_emp dp
INNER JOIN departments dpn
ON dp.dept_no = dpn.dept_no
INNER JOIN salaries s
INNER JOIN titles t
LIMIT 100;

我尝试了下面的代码但是在第二个到最后一个ON语句中开始出现错误“#1054 - 'on clause'中的未知列'e.emp_no'”。

SELECT e.first_name, e.last_name, dpn.dept_name, t.title, s.salary
FROM employees e, dept_emp dp
INNER JOIN departments dpn
ON dp.dept_no = dpn.dept_no
INNER JOIN salaries s
ON e.emp_no = salaries.emp_no
INNER JOIN titles t
ON e.emp_no = t.emp_no
LIMIT 100;

谢谢!

4 个答案:

答案 0 :(得分:2)

e表和dp表之间没有连接子句,例如:

  SELECT e.first_name, e.last_name, dp.dept_name, t.title, s.salary
  FROM employees e
  INNER JOIN dept_emp dp on e.emp_no = dp.emp_no
  INNER JOIN departments dpn  ON dp.dept_no = dpn.dept_no
  INNER JOIN salaries s  ON e.emp_no = s.emp_no
  INNER JOIN titles t ON e.emp_no = t.emp_no
  LIMIT 100;

答案 1 :(得分:1)

试试这样:

SELECT e.first_name, e.last_name, departments.dept_name, titles.title, salaries.salary
FROM employees e
INNER JOIN dept_emp
ON e.emp_no = dept_emp.emp_no
INNER JOIN departments
ON dept_emp.dept_no = departments.dept_no
INNER JOIN titles
ON e.emp_no = titles.emp_no
INNER JOIN salaries
ON e.emp_no = salaries.emp_no
LIMIT 100;

答案 2 :(得分:0)

内部联接中的“On”子句是可选的。如果您没有“On”子句,则表示“交叉连接”。 如果你想要的是内连接,那么你应该有一个“On”子句并指定哪些列应该等同。

答案 3 :(得分:0)

SELECT e.first_name, 
       e.last_name, 
       departments.dept_name, 
       titles.title, 
       salaries.salary 
FROM   employees e 
       LEFT JOIN dept_emp 
              ON e.emp_no = dept_emp.emp_no 
       LEFT JOIN departments 
               ON dept_emp.dept_no = departments.dept_no 
       LEFT JOIN titles 
             ON e.emp_no = titles.emp_no 
       LEFT JOIN salaries 
               ON e.emp_no = salaries.emp_no 
LIMIT  100;  

尝试这个因为

  

INNER JOIN:当所有表中都匹配时返回行。

     

LEFT JOIN:返回左表中的所有行,即使右表中没有匹配项。