MYSQL基础上机练习题(四) 表连接

一、实验目的:

表连接–进行多表查询

二、实验内容:

对MYSQL基础上机练习题(二)中所输入的数据连接表查询

三、题目:

  1. 使用连接谓词
    (1)进行等值连接,查询全部员工的个人信息以及薪酬情况
    (2)进行自然连接,查询全部员工的个人信息以及薪酬情况
    (3) 查询工资水平在2500以上的员工号、姓名、教育、收入、支出、盈余
    (4)查询工资水平在2500以上的员工号、姓名、教育、收入、支出、盈余、所属部门
  2. 使用JOIN连接
    (1)进行等值连接,查询全部员工的个人信息以及薪酬情况
    (2)进行自然连接,查询全部员工的个人信息以及薪酬情况
    (3) 查询工资水平在2500以上的员工号、姓名、教育、收入、支出、盈余
    (4)查询工资水平在2500以上的员工号、姓名、教育、收入、支出、盈余、所属部门
    (5)查询所有员工的员工号,名字,薪酬,支出(左连接)
    (6)查询所有部门的员工情况(右连接)
    (7)查询所有部门的所有员工的薪酬情况(全连接)
    (8)查询所有部门所有员工的名字

四、代码:

  1. 使用连接谓词
    (1)进行等值连接,查询全部员工的个人信息以及薪酬情况
    等值连接就是把两个表中有对应的行列示,对应第二大题第(1)小题的方式,出现的结果都一样
SELECT * FROM Employees, Salary
WHERE Employees.EmployeeID = Salary.EmployeeID

在这种等值连接的情况下,两个表的相同列名会同时出现
MYSQL基础上机练习题(四) 表连接_第1张图片
(2)进行自然连接,查询全部员工的个人信息以及薪酬情况
自然连接的情况下,两个表的相同列名不会同时出现,因此使用连接谓词时要选择性地选择列名,对应第二大题第(2)小题的方式,使用JOIN会使代码更简洁

SELECT Employees.*, InCome, OutCome, ActInCome
FROM Employees, Salary
WHERE Employees.EmployeeID = Salary.EmployeeID

MYSQL基础上机练习题(四) 表连接_第2张图片
(3) 查询工资水平在2500以上的员工号、姓名、教育、收入、支出、盈余
使用连接谓词的时候,存在多个条件选择时,需要用AND关键词,对应第二大题第(3)小题的方式,使用JOIN会减少运算次数

SELECT Employees.EmployeeID, Name, Education, InCome, OutCome, ActInCome
FROM Employees, Salary
WHERE Employees.EmployeeID = Salary.EmployeeID
AND InCome > 2500

MYSQL基础上机练习题(四) 表连接_第3张图片
(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

MYSQL基础上机练习题(四) 表连接_第4张图片
2. 使用JOIN连接
(1)进行等值连接,查询全部员工的个人信息以及薪酬情况
对应第一大题第(1)小题的方式,结果一致

SELECT * FROM Employees JOIN Salary
ON Employees.EmployeeID = Salary.EmployeeID

MYSQL基础上机练习题(四) 表连接_第5张图片
(2)进行自然连接,查询全部员工的个人信息以及薪酬情况
对应第一大题第(2)小题的方式,NATURAL JOIN更简洁

SELECT * FROM Employees NATURAL JOIN Salary

MYSQL基础上机练习题(四) 表连接_第6张图片
(3) 查询工资水平在2500以上的员工号、姓名、教育、收入、支出、盈余
对应第一大题第(3)小题的代码,减少运算次数

SELECT Employees.EmployeeID, Name, Education, InCome, OutCome, ActInCome FROM Employees NATURAL JOIN Salary
WHERE InCome > 2500

MYSQL基础上机练习题(四) 表连接_第7张图片
(4)查询工资水平在2500以上的员工号、姓名、教育、收入、支出、盈余、所属部门
对应第一大题第(4)小题的方式,三表连接的时候代码更简洁,运算次数减少

SELECT Employees.EmployeeID, Name, Education, InCome, OutCome, ActInCome, DepartmentName
FROM Employees NATURAL JOIN Salary NATURAL JOIN Departments
WHERE InCome > 2500

MYSQL基础上机练习题(四) 表连接_第8张图片
(5)查询所有员工的员工号,名字,薪酬,支出(左连接)
为了显示左连接和右连接的区别,在Employees表中增加一行数据
Mysql 左连接
增加数据后,Salary表不更新,这样会导致Salary表中没有该新增员工的数据

SELECT Employees.EmployeeID, Name, InCome, OutCome
FROM Employees LEFT JOIN Salary
ON Employees.EmployeeID = Salary.EmployeeID

MYSQL基础上机练习题(四) 表连接_第9张图片
会发现左连接会列示全部Employees(即左表)中的所有行,当Salary(即右表)中不存在对应左表的数据时,会显示NULL
(6)查询所有部门的员工情况(右连接)
为了显示左连接和右连接的区别,在Departments表中增加一行数据
Mysql 右连接
增加数据后,Employees表不更新,这样会导致Employees表中没有该新增员工的数据

SELECT DepartmentName, EmployeeID, Name
FROM Employees RIGHT JOIN Departments
ON Employees.DepartmentID = Departments.DepartmentID

MYSQL基础上机练习题(四) 表连接_第10张图片
会发现右连接会列示全部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)

MYSQL基础上机练习题(四) 表连接_第11张图片
MYSQL基础上机练习题(四) 表连接_第12张图片
(8)查询所有部门所有员工的名字
两表的全连接需要用UNION进行连接

SELECT DepartmentName, Name
FROM Employees
LEFT JOIN Departments USING(DepartmentID)
UNION
SELECT DepartmentName, Name
FROM Employees
RIGHT JOIN Departments USING(DepartmentID)

MYSQL基础上机练习题(四) 表连接_第13张图片

你可能感兴趣的:(SQL练习)