SQL:言語化してみた

SELECT
  COUNT(*)
FROM
  employees;

言語化すると =>
 employees テーブルにおいて、いくつ行数があるか、数える
SELECT
  COUNT(*)
FROM
  current_dept_emp
WHERE
  to_date = '9999-01-01';

言語化すると =>
 current_dept_emp テーブルにおいて、to_date 値が、9999-01-01 と一致する
行数がいくつあるか、数える
SELECT
  emp_no,
  MAX(salary)
FROM
  salaries
GROUP BY
  emp_no
ORDER BY
  MAX(salary) DESC
LIMIT 30
;

言語化すると => 
 salariesテーブルにおいて、emp_no ごとに区切って、
その中で salaryの最大値を降順(大きい順)に並び替えて、30行抽出する。
SELECT
  e.emp_no,
  e.first_name,
  e.last_name,
  t.title
FROM
  employees AS e
  INNER JOIN titles AS t
    ON e.emp_no = t.emp_no
WHERE
  e.emp_no BETWEEN 10010 AND 10100
  AND t.to_date = '9999-01-01'
;

言語化すると => 
 employeesテーブルと、titles テーブル を emp_no で結合して、
emp_no が、10010 ~ 10100 の間 かつ、to_date が、9999-01-01 と一致する
レコード(行)を抽出する。
ただし、列は、emp_no, first_name, last_name, titles 
SELECT
  cde.*,
  d.dept_name
FROM
  current_dept_emp AS cde
  INNER JOIN departments AS d
    ON cde.dept_no = d.dept_no
;

言語化すると => 
 current_dept_empテーブル(cde)と、departments(d)テーブル を dept_no で結合して、
cde の列名 全て(cde.*) と、d の列名にある dept_name の列を抽出する。
SELECT
  dept_name,
  MAX(salary)
FROM
  current_dept_emp AS cde
  INNER JOIN departments AS d
    ON cde.dept_no = d.dept_no
  INNER JOIN salaries AS s
    ON cde.emp_no = s.emp_no
WHERE
  cde.to_date = '9999-01-01'
GROUP BY
  d.dept_name
LIMIT 10;

言語化すると => 
 current_dept_empテーブルと、departmentsテーブル を共通する dept_no で結合して
さらに、その結合されたテーブルと、salariesテーブルを 共通する emp_no で、結合する。
その上で、current_dept_empテーブルの to_date が、 '9999-01-01' と一致するレコードを取得する。
また、departmentsテーブルの1つの要素である dept_name で区切って、その中で、
salary の最大値 と dept_name の2列で、抽出する。ただし、10行以内で。
SELECT
  dm.*,
  d.dept_name,
  s.salary
FROM
  dept_manager AS dm
  INNER JOIN departments AS d
    ON dm.dept_no = d.dept_no
  INNER JOIN salaries AS s
    ON dm.emp_no = s.emp_no
WHERE
  dm.to_date = '9999-01-01'
  AND s.to_date = '9999-01-01'
;

言語化すると => 
 dept_managerテーブル(dm)と、departmentsテーブル(d) を共通する dept_no で結合して
さらに、その結合されたテーブルと、salariesテーブル(s)を 共通する emp_no で、結合する。
また、dm テーブル の to_date 値が、9999-01-01 と一致、かつ、
s テーブルの to_date 値が、9999-01-01 と一致するレコードを取得する。
最後に、dm テーブルの列全てと、dテーブルの dept_name 列、sテーブルの salary 列 を抽出する。