数据库SQL实战(1)
1.查找最晚入职员工的所有信息:
CREATE TABLE `employees` (
`emp_no` int(11) NOT NULL,
`birth_date` date NOT NULL,
`first_name` varchar(14) NOT NULL,
`last_name` varchar(16) NOT NULL,
`gender` char(1) NOT NULL,
`hire_date` date NOT NULL,
PRIMARY KEY (`emp_no`));
我们看到表的结构如上,其中 hire_date 字段名就是入职日期,我们需要查找最晚入职员工的所有信息,所以我们要对 hire_date 这个字段进行倒序,然后去结果集的第一条记录:
select * from employees order by hire_date desc limit 1;
上面的方法是排序,还有一种方法是进行子查询,而且 hire_date 的类型为 date,所以可能存在多个同一天入职的员工,使用子查询就可以把最后一天入职的员工都查询出来:
select * from employees where hire_date = (select max(hire_date) from employees);
2.查找入职员工时间排名倒数第三的员工所有信息:
CREATE TABLE `employees` (
`emp_no` int(11) NOT NULL,
`birth_date` date NOT NULL,
`first_name` varchar(14) NOT NULL,
`last_name` varchar(16) NOT NULL,
`gender` char(1) NOT NULL,
`hire_date` date NOT NULL,
PRIMARY KEY (`emp_no`));
首先我们对 hire_date 字段进行排序,然后从第三个开始选取一条记录(0为第一个,所以第三个就是2):
select * from employees order by hire_date desc limit 2,1;
如果我们考虑到入职员工时间排名倒数第三的员工不止一个,这样我们就需要用子查询来查找:
select * from employees where hire_date = (select hire_date from employees order by hire_date desc limit 2,1);
3.查找各个部门当前(to_date='9999-01-01')领导当前薪水详情以及其对应部门编号dept_no
CREATE TABLE `dept_manager` (
`dept_no` char(4) NOT NULL,
`emp_no` int(11) NOT NULL,
`from_date` date NOT NULL,
`to_date` date NOT NULL,
PRIMARY KEY (`emp_no`,`dept_no`));
CREATE TABLE `salaries` (
`emp_no` int(11) NOT NULL,
`salary` int(11) NOT NULL,
`from_date` date NOT NULL,
`to_date` date NOT NULL,
PRIMARY KEY (`emp_no`,`from_date`));
这里我们要使用多表查询,题中可以得知 to_date='9999-01-01' 时为领导,所以查询语句为:
select s.*, d.dept_no from salaries s, dept_manager d where d.to_date = '9999-01-01' and s.to_date = '9999-01-01' and d.emp_no = s.emp_no;