上一篇只是一些基础的SQL查询语句,这篇是关于子查询,多表查询,聚合函数,视图的基础。
子查询。
1. 查找在财务部工作的雇员的情况。
SELECT *FROM Employees WHERE DepartmentID
IN (SELECT DepartmentID FROM Departments WHERE Departmentname ='财务部')
子查询先产生结果集,然后主查询再去结果集里去找符合要求的字段列表去.符合要求的输出,反之则不输出.。
先找到财务部的DepartmentID,再到父(主)查询去寻找符合DepartmentID=‘1’的字段。
关于IN,EXISTS的具体用法会再写一遍博客
2. 查找财务部年龄不低于研发部雇员年龄的雇员的姓名 。
(我实在不知道用哪个子查询才能让财务部所以有的值和研发部的一名进行比较,所以就把财务部的弄了个视图,有别的方法请务必告诉我!!)
创建视图:CREATE VIEW <视图名> AS <语句>
创建一个符合语句的虚表(视图)就可以用这个视图名对虚表数据进行操作
CREATE VIEW cai_wu AS
SELECT Birthday FROM Employees WHERE DepartmentID='1'
SELECT Name FROM cai_wu
WHERE Birthday < (SELECT MIN(Birthday) FROM Employees WHERE DepartmentID='4')
3.查找比所有财务部的雇员收入都高的雇员的姓名
SELECT *FROM Employees
JOIN Salary ON Employees.EmployeeID=Salary.EmployeeID
WHERE Income>=(SELECT MAX(Income) FROM Salary ,Employees
WHERE Salary.EmployeeID=Employees.EmployeeID AND DepartmentID='1')
这里有个小点可以证明是先执行子查询,再执行主查询
因为当写成
SELECT *FROM Employees
JOIN Salary ON Employees.EmployeeID=Salary.EmployeeID
WHERE Income>=(SELECT MAX(Income) FROM Salary WHERE DepartmentID='1')
时,子查询里的数据并不会因为主查询已得到的表(含有两个表信息)去筛选条件
多表查询。
1.查询每个雇员的情况及其薪水的情况(内连接)
SELECT * FROM Salary
JOIN Employees ON Employees.EmployeeID=Salary.EmployeeID
2.使用内连接的方法查询名字为“王林”的员工所在的部门
这是把三个表都连接起来,显然当时用WHERE时是对于前面写的所有已连接的表
SELECT Departmentname,Name FROM Employees
JOIN Salary ON Employees.EmployeeID=Salary.EmployeeID
JOIN Departments ON Departments.DepartmentID=Employees.DepartmentID
WHERE Name