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`));
select * from employees where hire_date =
(select max(hire_date) from employees);
select * from employees where hire_date =
(select distinct hire_date from employees
order by hire_date desc
limit 2,1);
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`));
select s.*,d.dept_no
from salaries s, dept_manager d
where s.emp_no = d.emp_no;
CREATE TABLE `dept_emp` (
`emp_no` int(11) NOT NULL,
`dept_no` char(4) NOT NULL,
`from_date` date NOT NULL,
`to_date` date NOT NULL,
PRIMARY KEY (`emp_no`,`dept_no`));
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`));
自己的:
select last_name,first_name,dept_no
from employees e,dept_emp d
where e.emp_no = d.emp_no;
别人的:
select e.last_name,e.first_name,d.dept_no
from employees e
inner join dept_emp d
on e.emp_no = d.emp_no;
别人家的:
select e.last_name,e.first_name,d.dept_no
from employees e
left join dept_emp d
on d.emp_no = e.emp_no;
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`));
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`));
# 需要使用 employees 中的 emp_no,因为salaries中,因为薪资的变动,而出现一个emp_no出现多次况且 salaries 的主键是一个联合主键
SELECT e.emp_no,s.salary
FROM employees e,salaries s
WHERE e.emp_no = s.emp_no AND e.hire = s.from_date
ORDER BY e.emp_no DESC;
别人家的:
SELECT e.emp_no,s.salary
FROM employees e,
INNER JOIN salaries s
ON e.emp_no = s.emp_no AND e.hire = s.from_date
ORDER BY e.emp_no DESC;
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`));
自己的:考虑不周全,写的其实薪水变动了15次,不管其增减
SELECT emp_no,count(emp_no) t
FROM salaries
GROUP BY emp_no
HAVING t > 15;
别人的:
SELECT a.emp_no,COUNT(*) t
FROM salaries a
INNER JOIN salaries b
ON a.emp_no = b.emp_no AND a.to_date = b.from_date
WHERE a.salary < b.salary
GROUP BY a.emp_no
HAVING t > 15;
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`));
自己的:
SELECT DISTINCT salary
FROM salaries
WHERE to_date = '9999-01-01'
ORDER BY salary DESC;
别人的:
SELECT salary
FROM salaries
WHERE to_date = '9999-01-01'
GROUP BY salary
ORDER BY salary DESC;
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`));
我的:
SELECT d.dept_no,d.emp_no,s.salary
FROM dept_manager d,salaries s
WHERE d.emp_no = s.emp_no
AND d.date = '9999-01-01'
AND s.date = '9999-01-01';
别人的:
SELECT d.dept_no,d.emp_no,s.salary
FROM dept_manager d
INNNER JOIN salary s
ON d.emp_no = s.emp_no
AND d.date = '9999-01-01'
AND s.date = '9999-01-01';
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 `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`));
自己的:
SELECT emp_no
FROM employees
WHERE emp _no
NOT IN(
SELECT emp_no
FROM dept_mangager;
);
别人的:
SELECT d.emp_no
FROM dept_manager d
LEFT JOIN employees e
ON d.emp_no = e.emp_no
WHERE d.dept_no IS NULL;
别人的:
SELECT emp_no
FROM employees
EXCEPT
SELECT emp_no
FROM dept_manager;
EXPECT
:集合差运算;UNION
:集合并运算;INTERSECT
:集合交运算结果第一列给出当前员工的emp_no,第二列给出其manager对应的manager_no。
CREATE TABLE `dept_emp` (
`emp_no` int(11) NOT NULL,
`dept_no` char(4) NOT NULL,
`from_date` date NOT NULL,
`to_date` date NOT NULL,
PRIMARY KEY (`emp_no`,`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`));
大佬的,自己的没过(我对这个to_date = '9999-01-01'很反感,不知道为什么)
SELECT e.emp_no,m.emp_no AS manager_no
FROM dept_emp e
LEFT JOIN dept_manager m
ON e.dept_no = m.dept_no
WHERE m.to_date = '9999-01-01'
AND e.to_date = '9999-01-01'
AND e.emp_no <> m.emp_no
CREATE TABLE IF NOT EXISTS "titles" (
`emp_no` int(11) NOT NULL,
`title` varchar(50) NOT NULL,
`from_date` date NOT NULL,
`to_date` date DEFAULT NULL);
SELECT title,COUNT(title) t
FROM titles
GROUP BY title
HAVING t >= 2;
CREATE TABLE IF NOT EXISTS `titles` (
`emp_no` int(11) NOT NULL,
`title` varchar(50) NOT NULL,
`from_date` date NOT NULL,
`to_date` date DEFAULT NULL);
自己的:(没通过)
SELECT title,COUNT(title) t
FROM titles
GROUP BY title
WHERE emp_no IN
( SELECT DISTINCT emp_no
FROM titles
);
别人的:
SELECT title,COUNT(DISTINCT emp_no) t
FROM titles
GROUP BY title
HAVING t >= 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`));
SELECT *
FROM employees
WHERE emp_no % 2 <> 0
AND last_name != 'Mary'
ORDER BY hire_date DESC;
SELECT num + 5 FROM test;
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`));
CREATE TABLE IF NOT EXISTS "titles" (
`emp_no` int(11) NOT NULL,
`title` varchar(50) NOT NULL,
`from_date` date NOT NULL,
`to_date` date DEFAULT NULL);
我的:(没过)
SELECT t.title,avg(salary) avg
FROM salaries s,titles t
WHERE t.emp_no = s.emp_no
AND s.to_date = '9999-01-01'
AND t.to_date = '9999-01-01';
别人的1:
SELECT t.title,avg(salary) avg
FROM salaries s,titles t
WHERE t.emp_no = s.emp_no
AND s.to_date = '9999-01-01'
AND t.to_date = '9999-01-01'
GROUP BY t.title;
别人的2:
SELECT t.title,avg(salary) avg
FROM titles t
INNER JOIN salaries s
ON t.emp_no = s.emp_no
AND s.to_date = '9999-01-01'
AND t.to_date = '9999-01-01'
GROUP BY t.title;
参考文章:
正确理解MySQL中的where和having的区别
为什么不能再where语句中使用聚合函数
HAVING 不是 必须配合 GROUP BY 一起使用
where 和 having 都可以使用的场景
select id,name from tb_user where id > 2;
select id,name from tb_user having id > 2;
只可以使用where,不可以使用having
select name from tb_user where id > 2;
//会报错!因为前面条件没有筛选出 id 字段
select name from tb_user having id > 2;
只可以使用 having,不可以使用 where
//会报错!因为 avg 在 tb_user 表中
select id avg(score) avg from tb_user where avg > 60;
select id,avg(score) avg from tb_user having avg > 60;
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`));
我的:(又没过,这里需要注意的是薪水第二多的员工并不只是一人,查第二多的薪水的时候,要记得去重,有一个第二多的薪水就够了)
SELECT emp_no,salary
FROM salaries
WHERE to_date = '9999-01-01'
AND salary = (
SELECT DISTINCT salary
FROM salaries
WHERE to_date = '9999-01-01'
ORDER BY salary DESC
LIMIT 1,1
);