Upgrade to Pro — share decks privately, control downloads, hide ads and more …

20170602_sqlstudy

 20170602_sqlstudy

ビジネス系の人向けにつくったsql 勉強会用資料

Hiroaki ONO

June 10, 2017
Tweet

More Decks by Hiroaki ONO

Other Decks in Technology

Transcript

  1. テーブル 》 イメージしやすいのは、エクセル? 7 emp_id l_name f_name job_id 1 田中

    一郎 2 2 佐藤 二郎 3 3 山田 三郎 2 4 田中 花子 1 job_id job_name salary 1 社長 1,000,000 2 営業 350,000 3 開発 350,000 4 バイト 100,000 テーブル名 : employee テーブル名 : job
  2. すっごい基本 》 SELECT ~ FROM ~ WHERE ~; ▷ SELECT

    › どのデータを取得するか ▷ FROM › どこからデータを取得するか ▷ WHERE › どういう条件のデータを取得するか 13
  3. SELECT 》 カラムの選択 ▷ 全カラムを選択 : * › SELECT *

    ▷ 複数のカラムを選択 : ,(カンマ)区切り › SELECT emp_id, f_name, l_name ▷ 重複を除く : distinct › SELECT distinct f_name 14
  4. WHERE 》 絞込条件 ▷ データの一致は = で指定 › WHERE emp_id

    = 1 ▷ データの不一致は <> で指定 ▷ データの大小は、>, <, >=, <= › WHERE emp_id < 2 › WHERE emp_id >= 3 ▷ データの範囲は BETWEEN a AND b › WHERE emp_id BETWEEN 2 AND 3 16
  5. WHERE 》 条件式の組み合わせ ▷ かつ : and › WHERE job_id

    = 2 and emp_id = 1 ▷ または : or › WHERE emp_id =1 or emp_id = 2 ◦ WHERE emp_id in (1,2) ▷ ではない : not › WHERE not emp_id = 1 17
  6. もくじ 》 データベース 》 SQL 》 基本なSQL 》 ちょっと難しいSQL ▷

    取得する上限指定 ▷ 並び変え条件指定 ▷ 集約関数 ▷ グループ化指定 》 面倒くさいSQL 19
  7. ORDER BY 》 行を並び替える ▷ 昇順 に並び替える : order by

    ~ asc › order by salary asc ▷ 降順に並び替える : order by ~ desc › order by salary desc 21 asc : ascending desc : descending
  8. 集約関数 》 「縦に」計算を行う ▷ 行数を数える : count() › count(*), count(emp_id)

    ▷ 合計 : sum() › sum(salary) ▷ 平均 : avg() › avg(salary) ▷ 最小値 : min() › min(salary) ▷ 最大値 : max() › max(salary) 22 集約関数を使う際には、 SELECT 節には 集約関数しか書けない
  9. GROUP BY 》 条件によって行をグループに分割 各グループ内で集約関数が使える ▷ グループ分割 : group by

    › group by job_id 23 job_id 2 3 2 1 グループ化 (group by) job_id count 2 2 job_id 2 2 集約関数 (count)
  10. ちょっと難しいSQL のまとめ 》 取得する行数を制限する LIMIT 》 並び替えの条件を指定する ORDER BY 》

    集計操作を行う 集約関数 》 グループ化の条件を指定する GROUP BY 24
  11. JOIN 27 emp_id l_name f_name job_id 1 田中 一郎 2

    2 佐藤 二郎 3 3 山田 三郎 2 4 田中 花子 1 job_id job_name salary 1 社長 1,000,000 2 営業 350,000 3 開発 350,000 4 バイト 100,000 テーブル名 : employee テーブル名 : job
  12. JOIN emp_id l_name f_name job_id job_id job_name salary 1 田中

    一郎 2 2 営業 350,000 2 佐藤 二郎 3 3 開発 350,000 3 山田 三郎 2 2 営業 350,000 4 田中 花子 1 1 社長 1,000,000 28
  13. JOIN SELECT * FROM employee as e JOIN job as

    j ON e.job_id = j.job_id ORDER BY e.emp_id; 29 emp_id l_name f_name job_id job_id job_name salary 1 田中 一郎 2 2 営業 350,000 2 佐藤 二郎 3 3 開発 350,000 3 山田 三郎 2 2 営業 350,000 4 田中 花子 1 1 社長 1,000,000
  14. JOIN の種類 》 INNER JOIN ▷ 両方のテーブルで合致するレコードのみ結合 › JOIN の仕方を指定しないときのdefault

    》 LEFT OUTER JOIN ▷ 左のテーブルをベースに合致するレコードを結合 》 RIGHT OUTER JOIN ▷ 右のテーブルをベースに合致するレコードを結合 30
  15. INNER JOIN SELECT * FROM employee as e INNER JOIN

    job as j ON e.job_id = j.job_id ORDER BY e.emp_id; 31 emp_id l_name f_name job_id job_id job_name salary 1 田中 一郎 2 2 営業 350,000 2 佐藤 二郎 3 3 開発 350,000 3 山田 三郎 2 2 営業 350,000 4 田中 花子 1 1 社長 1,000,000
  16. LEFT OUTER JOIN SELECT * FROM employee as e LEFT

    OUTER JOIN job as j ON e.job_id = j.job_id ORDER BY e.emp_id; 32 emp_id l_name f_name job_id job_id job_name salary 1 田中 一郎 2 2 営業 350,000 2 佐藤 二郎 3 3 開発 350,000 3 山田 三郎 2 2 営業 350,000 4 田中 花子 1 1 社長 1,000,000
  17. RIGHT OUTER JOIN SELECT * FROM employee as e RIGHT

    OUTER JOIN job as j ON e.job_id = j.job_id ORDER BY e.emp_id; 33 emp_id l_name f_name job_id job_id job_name salary NULL NULL NULL NULL 4 バイト 100,000 1 田中 一郎 2 2 営業 350,000 2 佐藤 二郎 3 3 開発 350,000 3 山田 三郎 2 2 営業 350,000 4 田中 花子 1 1 社長 1,000,000
  18. 付録 42 CREATE TABLE `employee` ( `emp_id` int(11) NOT NULL,

    `l_name` varchar(32) DEFAULT NULL, `f_name` varchar(32) DEFAULT NULL, `job_id` int(11) DEFAULT NULL, PRIMARY KEY (`emp_id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE `job` ( `job_id` int(11) NOT NULL, `job_name` varchar(32) DEFAULT NULL, `salary` int(11) DEFAULT NULL, PRIMARY KEY (`job_id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO employee (emp_id, l_name, f_name, job_id) VALUES (1, '田中', '一郎', 2); INSERT INTO employee (emp_id, l_name, f_name, job_id) VALUES (2, '佐藤', '二郎', 3); INSERT INTO employee (emp_id, l_name, f_name, job_id) VALUES (3, '山田', '三郎', 2); INSERT INTO employee (emp_id, l_name, f_name, job_id) VALUES (4, '田中', '花子', 1); INSERT INTO job (job_id, job_name, salary) VALUES (1, '社長', 1000000); INSERT INTO job (job_id, job_name, salary) VALUES (2, '営業', 350000); INSERT INTO job (job_id, job_name, salary) VALUES (3, '開発', 350000); INSERT INTO job (job_id, job_name, salary) VALUES (4, 'バイト', 100000);