表连接–进行多表查询
对MYSQL基础上机练习题(二)中所输入的数据连接表查询
SELECT * FROM Employees, Salary
WHERE Employees.EmployeeID = Salary.EmployeeID
在这种等值连接的情况下,两个表的相同列名会同时出现
(2)进行自然连接,查询全部员工的个人信息以及薪酬情况
自然连接的情况下,两个表的相同列名不会同时出现,因此使用连接谓词时要选择性地选择列名,对应第二大题第(2)小题的方式,使用JOIN会使代码更简洁
SELECT Employees.*, InCome, OutCome, ActInCome
FROM Employees, Salary
WHERE Employees.EmployeeID = Salary.EmployeeID
(3) 查询工资水平在2500以上的员工号、姓名、教育、收入、支出、盈余
使用连接谓词的时候,存在多个条件选择时,需要用AND关键词,对应第二大题第(3)小题的方式,使用JOIN会减少运算次数
SELECT Employees.EmployeeID, Name, Education, InCome, OutCome, ActInCome
FROM Employees, Salary
WHERE Employees.EmployeeID = Salary.EmployeeID
AND InCome > 2500
(4)查询工资水平在2500以上的员工号、姓名、教育、收入、支出、盈余、所属部门
同上一题,多个选择条件用AND连接,但这种方式会使运算慢,对应第二大题第(4)小题的方式,使用JOIN会使运算更快
SELECT Employees.EmployeeID, Name, Education, InCome, OutCome, ActInCome, DepartmentName
FROM Employees, Salary, Departments
WHERE Employees.EmployeeID = Salary.EmployeeID
AND Employees.DepartmentID = Departments.DepartmentID
AND InCome > 2500
2. 使用JOIN连接
(1)进行等值连接,查询全部员工的个人信息以及薪酬情况
对应第一大题第(1)小题的方式,结果一致
SELECT * FROM Employees JOIN Salary
ON Employees.EmployeeID = Salary.EmployeeID
(2)进行自然连接,查询全部员工的个人信息以及薪酬情况
对应第一大题第(2)小题的方式,NATURAL JOIN更简洁
SELECT * FROM Employees NATURAL JOIN Salary
(3) 查询工资水平在2500以上的员工号、姓名、教育、收入、支出、盈余
对应第一大题第(3)小题的代码,减少运算次数
SELECT Employees.EmployeeID, Name, Education, InCome, OutCome, ActInCome FROM Employees NATURAL JOIN Salary
WHERE InCome > 2500
(4)查询工资水平在2500以上的员工号、姓名、教育、收入、支出、盈余、所属部门
对应第一大题第(4)小题的方式,三表连接的时候代码更简洁,运算次数减少
SELECT Employees.EmployeeID, Name, Education, InCome, OutCome, ActInCome, DepartmentName
FROM Employees NATURAL JOIN Salary NATURAL JOIN Departments
WHERE InCome > 2500
(5)查询所有员工的员工号,名字,薪酬,支出(左连接)
为了显示左连接和右连接的区别,在Employees表中增加一行数据
增加数据后,Salary表不更新,这样会导致Salary表中没有该新增员工的数据
SELECT Employees.EmployeeID, Name, InCome, OutCome
FROM Employees LEFT JOIN Salary
ON Employees.EmployeeID = Salary.EmployeeID
会发现左连接会列示全部Employees(即左表)中的所有行,当Salary(即右表)中不存在对应左表的数据时,会显示NULL
(6)查询所有部门的员工情况(右连接)
为了显示左连接和右连接的区别,在Departments表中增加一行数据
增加数据后,Employees表不更新,这样会导致Employees表中没有该新增员工的数据
SELECT DepartmentName, EmployeeID, Name
FROM Employees RIGHT JOIN Departments
ON Employees.DepartmentID = Departments.DepartmentID
会发现右连接会列示全部Departments(即右表)中的所有行,当Employees(即左表)中不存在对应左表的数据时,会显示NULL
(7)查询所有部门的所有员工的薪酬情况(全连接)
全连接顾名思义,会把左右表的行全部列示,当有不对应的行时,会分别显示NULL
有两种方法选择连接的列名
第一种是使用<表名>.<列名>
SELECT DepartmentName, Name, InCome
FROM Employees
LEFT JOIN Salary
ON Employees.EmployeeID = Salary.EmployeeID
RIGHT JOIN Departments
ON Employees.DepartmentID = Departments.DepartmentID
第二种是使用表名 USING(列名),可以少书写起码两次的列名
SELECT DepartmentName, Name, InCome
FROM Employees
LEFT JOIN Salary USING(EmployeeID)
RIGHT JOIN Departments USING(DepartmentID)
(8)查询所有部门所有员工的名字
两表的全连接需要用UNION进行连接
SELECT DepartmentName, Name
FROM Employees
LEFT JOIN Departments USING(DepartmentID)
UNION
SELECT DepartmentName, Name
FROM Employees
RIGHT JOIN Departments USING(DepartmentID)