SQL:SELECT 構文 part2

ORDER BY 句:検索結果を並び替える

$ SELECT * FROM employees ORDER BY <整列キー> <ASC/DESC>;

  • ASC は、省略可能。デフォルト値のため。

また、複数条件を指定することも可能

$ SELECT *
  FROM employees
  ORDER BY birth_date DESC, hire_date ASC;

誕生日が大きい(=年齢が若い)順、かつ、入社日が古い順に並び替える
集計関数(集約関数):

SUM, MIN, MAX, AVG, COUNT

  • COUNT:行数を取得する

    • COUNT(列名):NULL を除く

    • COUNT(*):NULL を含む

  • 四捨五入:ROUND(四捨五入する値, 小数第 X 位) X = 0 ~

  • WHERE 句では、集積関数は、使えない

読み込まれる順番:FROM -> WHERE -> SELECT

GROUP BY:テーブルを切り分けるイメージ
  • 集計関数と一緒に、使われることが多い。

  • GROUP BY で指定した 列以外を SELECT では指定できない。
    なぜなら、GROUP BY の後に、SELECT 句が読み込まれるから。

各emp_no が何回登場しているかを表わしている。

mysql> SELECT
    ->   emp_no,
    ->   COUNT(*)
    -> FROM
    ->   salaries
    -> GROUP BY
    ->   emp_no
    -> LIMIT 20;
+--------+----------+
| emp_no | COUNT(*) |
+--------+----------+
|  10001 |       17 |
|  10002 |        6 |
|  10003 |        7 |
|  10004 |       16 |
|  10005 |       13 |
|  10006 |       12 |
|  10007 |       14 |
|  10008 |        3 |
|  10009 |       18 |
|  10010 |        6 |
|  10011 |        7 |
|  10012 |       10 |
|  10013 |       17 |
|  10014 |        9 |
|  10015 |        1 |
|  10016 |        5 |
|  10017 |       10 |
|  10018 |       16 |
|  10019 |        4 |
|  10020 |        5 |
+--------+----------+
20 rows in set


例:従業員番号10001から10010の従業員ごとの最小給与と最大給与

mysql> SELECT
    ->   emp_no,
    ->   MAX(salary),
    ->   MIN(salary)
    -> FROM
    ->   salaries
    -> WHERE
    ->   emp_no BETWEEN 10001 AND 10010
    -> GROUP BY
    ->   emp_no
    -> LIMIT 20;
+--------+-------------+-------------+
| emp_no | MAX(salary) | MIN(salary) |
+--------+-------------+-------------+
|  10001 |       88958 |       60117 |
|  10002 |       72527 |       65828 |
|  10003 |       43699 |       40006 |
|  10004 |       74057 |       40054 |
|  10005 |       94692 |       78228 |
|  10006 |       60098 |       40000 |
|  10007 |       88070 |       56724 |
|  10008 |       52668 |       46671 |
|  10009 |       94443 |       60929 |
|  10010 |       80324 |       72488 |
+--------+-------------+-------------+
10 rows in set
HAVING 句:GROUP BY で取得した結果をさらに 絞る
 $ SELECT emp_no, MAX(salary)
  FROM salaries
  GROUP BY emp_no
  HAVING MAX(salary) > 100000;


解説:
emp_no 10001 ~ 10100 の中で、salaryの最小値が、40,000未満の
emp_no と 最小値 を抽出する。

SELECT
  emp_no,
  MIN(salary)
FROM
  salaries
WHERE
  emp_no BETWEEN 10001 AND 10100
GROUP BY
  emp_no
HAVING
  MIN(salary) > 40000
LIMIT 20;