SQL1

image.png

  1. //第一种:适用于最晚的员工如果不止一个的情况
  2. //先找到最晚的hire_data,再用条件查到
  3. SELECT * FROM employees
  4. WHERE hire_date =(SELECT MAX(hire_date) FROM employees)
  5. //第二种:不适用于最晚的员工如果不止一个的情况。
  6. //降序排序,并且只显示第一行
  7. //limit(x,y)代表第x行开始共显示y行 limit x [offset y]代表取前x行数据,但是跳过y行
  8. SELECT * FROM employees
  9. ORDER BY hire_date DESC LIMIT 0,1

SQL2

image.png

  1. //适用于相同时间员工不止一个的情况
  2. //方法同SQL1
  3. //注意DISTINCT去重
  4. SELECT * FROM employees
  5. WHERE hire_date = (SELECT DISTINCT hire_date FROM employees
  6. ORDER BY hire_date DESC LIMIT 2,1)
  7. //不适用于相同时间员工不止一个的情况
  8. //方法同SQL1
  9. SELECT * FROM employees
  10. ORDER BY hire_date DESC LIMIT 1 OFFSET 2

SQL3

image.png

  1. //给表起别名 FROM tablea t 把tablea起名为t
  2. //等值连接 where连接两个表
  3. SELECT s.* ,d.dept_no FROM salaries s,dept_manager d
  4. WHERE s.emp_no = d.emp_no
  5. ORDER BY s.emp_no

SQL4

image.png

  1. //第一种:等值连接
  2. SELECT e.last_name,e.first_name,d.dept_no
  3. FROM employees e,dept_emp d
  4. WHERE e.emp_no = d.emp_no
  5. //第二种:自然连接 NATURAL JOIN
  6. SELECT e.last_name,e.first_name,d.dept_no
  7. FROM employees e
  8. NATURAL JOIN dept_emp d

SQL5

image.png

  1. /* INNER JOIN 两边表同时有对应的数据,即任何一边缺失数据就不显示。
  2. LEFT JOIN 会读取左边数据表的全部数据,即便右边表无对应数据。
  3. RIGHT JOIN 会读取右边数据表的全部数据,即便左边表无对应数据。*/
  4. //内外连接需要用ON做条件
  5. SELECT e.last_name,e.first_name,d.dept_no
  6. FROM employees e LEFT JOIN dept_emp d
  7. ON e.emp_no = d.emp_no

SQL7

image.png

  1. //GROUP BY 可以按照属性对表分组
  2. //当用上 GROUP BY后的聚集函数是对每一个组进行聚集
  3. //HAVING和 WHERE类似,都是起到过滤作用,但是HAVING是对分组进行过滤,WHERE是对行进行过滤
  4. SELECT emp_no,COUNT(emp_no) FROM salaries
  5. GROUP BY emp_no HAVING COUNT(emp_no) > 15

SQL8

image.png

  1. //同SQL2
  2. SELECT DISTINCT salary FROM salaries
  3. ORDER BY salary DESC

SQL10

image.png

  1. //不包含用 NOT IN(...)
  2. SELECT emp_no FROM employees
  3. WHERE emp_no NOT IN(
  4. SELECT emp_no FROM dept_manager
  5. )

SQL11

image.png

  1. //等值连接+条件判断
  2. SELECT emp.emp_no,man.emp_no FROM dept_emp emp,dept_manager man
  3. WHERE emp.dept_no = man.dept_no && emp.emp_no != man.emp_no

SQL12

image.png

  1. //首先是内连接,若不匹配直接不显示。因为两个表有两个相同属性,from_date数据不同所以不能用自然连接
  2. //然后用窗口函数 OVER(PARITION BY... ORDER BY) as ... 可以分组进行排序,并且不修改原来的数据只添加一个排序列
  3. //要求TOPN的题都可以用窗口函数嵌套上查询和where条件把rank=N的取出来
  4. SELECT t.dept_no,t.emp_no,t.salary
  5. FROM (SELECT d.dept_no,d.emp_no,d.salary,DENSE_RANK()
  6. OVER (PARTITION BY d.dept_no ORDER BY d.salary DESC) AS sal_rank
  7. FROM (SELECT emp.dept_no,emp.emp_no,s.salary
  8. FROM dept_emp emp
  9. INNER JOIN salaries s ON emp.emp_no = s.emp_no) d
  10. ) t
  11. WHERE t.sal_rank = 1

SQL15

image.png

  1. //值不相等用!=,非空用 IS NOT NULL
  2. //字符串用''引上
  3. //多个条件用 AND连接
  4. SELECT * FROM employees
  5. WHERE emp_no % 2 != 0 AND last_name != 'Mary'
  6. ORDER BY hire_date DESC

SQL16

image.png

  1. //要对分组后的聚集函数的结果进行 ORDER BY,需要先对结果起个别名
  2. SELECT t.title,AVG(s.salary) AS sal_avg FROM titles t
  3. INNER JOIN salaries s ON t.emp_no = s.emp_no
  4. GROUP BY t.title
  5. ORDER BY sal_avg

SQL17

image.png

  1. //同SQL1
  2. SELECT emp_no,salary FROM salaries
  3. ORDER BY salary DESC
  4. LIMIT 1,1

SQL18

image.png

  1. //怪题
  2. SELECT s.emp_no, s.salary, e.last_name, e.first_name
  3. FROM employees e NATURAL JOIN salaries s
  4. WHERE s.salary = (
  5. select max(salary)
  6. from salaries
  7. where salary != ( select max(salary) from salaries )
  8. )

SQL19

image.png

  1. //双左连接,左边有数据右边没有数据也显示
  2. SELECT e.last_name,e.first_name,d.dept_name
  3. FROM employees e
  4. LEFT JOIN dept_emp t ON e.emp_no = t.emp_no
  5. LEFT JOIN departments d ON t.dept_no = d.dept_no