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

2025-07-02 社内勉強会 SQLに親しむ / Getting to Know SQL

2025-07-02 社内勉強会 SQLに親しむ / Getting to Know SQL

Avatar for Kentaro Abe

Kentaro Abe

July 02, 2025
Tweet

More Decks by Kentaro Abe

Other Decks in Programming

Transcript

  1. 5 Structured Query Language SQLは人間がRDBと対話するための言葉 • データ操作言語 (Data Manipulation Language,

    DML) • トランザクション制御言語 (Transaction Control Language, TCL) • データ定義言語 (Data Definition Language, DDL) • データ制御言語 (Data Control Language, DCL) 特に利用頻度の高いDMLのうち、SELECTの話をします SQL
  2. 6 SELECTはデータの変換 id name age city 1 Alice 40 Chicago

    4 David 36 Boston age 36 30歳以上 ボストン在住の 人の年齢 id name age city 1 Alice 40 Chicago 2 Brian 23 Seattle 3 Cindy 29 Chicago 4 David 36 Boston
  3. 7 SELECTはデータの変換 id name age city 1 Alice 40 Chicago

    4 David 36 Boston age 36 30歳以上 ボストン在住の 人の年齢 id name age city 1 Alice 40 Chicago 2 Brian 23 Seattle 3 Cindy 29 Chicago 4 David 36 Boston select * from customer where age >= 30; select age from customer where city = ‘Boston’;
  4. 11 • 全件取得、カラム指定、並び替え(ORDER BY) • 絞り込み(WHERE) ◦ = <> IN

    LIKE AND OR • 集計関数 ◦ COUNT SUM MIN MAX AVG • 集約(GROUP BY) • サブクエリ、EXISTS • 結合(INNER JOIN, OUTER JOIN) SQL文法 初級〜中級
  5. 12 • 全件取得、カラム指定、並び替え(ORDER BY) • 絞り込み(WHERE) ◦ = <> IN

    LIKE AND OR • 集計関数 ◦ COUNT SUM MIN MAX AVG • 集約(GROUP BY) • サブクエリ、EXISTS • 結合(INNER JOIN, OUTER JOIN) SQL文法 初級〜中級 初級 中級
  6. 13 select * from customer; select name, city from customer;

    select * from customer order by age (asc); select * from customer order by age desc; 全件取得、カラム指定、並び替え( ORDER BY) ascending(昇順) デフォルトなので 書かなくてもよい descending(降順) id name age city 1 Alice 40 Chicago 2 Brian 23 Seattle 3 Cindy 29 Chicago 4 David 36 Boston
  7. select * from customer where name = ‘Brian’; select *

    from customer where name <> ‘Brian’; select * from customer where name like ‘B%’; select * from customer where id in (1,2,3); select * from customer where id = 2 and age >= ‘30’; select * from customer where id = 2 or age >= ‘30’; 14 絞り込み( WHERE) 「!=」とも書ける id name age city 1 Alice 40 Chicago 2 Brian 23 Seattle 3 Cindy 29 Chicago 4 David 36 Boston
  8. 15 select count(*) from customer; select sum(age) from customer; select

    min(age) from customer; select max(age) from customer; select avg(age) from customer; 集計 id name age city 1 Alice 40 Chicago 2 Brian 23 Seattle 3 Cindy 29 Chicago 4 David 36 Boston
  9. 16 select city, max(age) from customer group by city; 集約(GROUP

    BY) group by で指定した カラムはそのまま書ける その他のカラムは集計関数 を使って書く
  10. 17 select city, max(age) from customer group by city; SQLabの問題をやってみる

    集約(GROUP BY) id name age city 1 Alice 40 Chicago 2 Brian 23 Seattle 3 Cindy 29 Chicago 4 David 36 Boston id name age city 1 Alice 40 Chicago 3 Cindy 29 Chicago id name age city 2 Brian 23 Seattle id name age city 4 David 36 Boston city age Chicago 40 Seattle 23 Boston 36
  11. 18 select * from customer where age = (select max(age)

    from customer); SQLabの問題をやってみる サブクエリ、 EXISTS id name age city 1 Alice 40 Chicago 2 Brian 23 Seattle 3 Cindy 29 Chicago 4 David 36 Boston age 40 id name age city 1 Alice 40 Chicago サブクエリで取得した データを元のクエリで使える
  12. 19 select * from customer where exists (select * from

    customer sub where sub.age < customer.age); サブクエリ、 EXISTS id name age 1 Alice 40 2 Brian 23 3 Cindy 29 4 David 36 サブクエリから元のクエリを参照 できる id name age 1 Alice 40 2 Brian 23 3 Cindy 29 4 David 36 id name age city customer sub ①
  13. 20 select * from customer where exists (select * from

    customer sub where sub.age < customer.age); サブクエリ、 EXISTS id name age 1 Alice 40 2 Brian 23 3 Cindy 29 4 David 36 サブクエリから元のクエリを参照 できる id name age 2 Brian 23 3 Cindy 29 4 David 36 id name age city 1 Alice 40 Chicago customer sub ②
  14. 21 select * from customer where exists (select * from

    customer sub where sub.age < customer.age); サブクエリ、 EXISTS id name age 1 Alice 40 2 Brian 23 3 Cindy 29 4 David 36 サブクエリから元のクエリを参照 できる id name age id name age city 1 Alice 40 Chicago customer sub ③
  15. 22 select * from customer where exists (select * from

    customer sub where sub.age < customer.age); サブクエリ、 EXISTS id name age 1 Alice 40 2 Brian 23 3 Cindy 29 4 David 36 サブクエリから元のクエリを参照 できる id name age 2 Brian 23 id name age city 1 Alice 40 Chicago 3 Cindy 29 Chicago customer sub ④
  16. 23 select * from customer where exists (select * from

    customer sub where sub.age < customer.age); SQLabの問題をやってみる サブクエリ、 EXISTS id name age 1 Alice 40 2 Brian 23 3 Cindy 29 4 David 36 サブクエリから元のクエリを参照 できる id name age 2 Brian 23 3 Cindy 29 4 David 36 customer sub ⑤ id name age city 1 Alice 40 Chicago 3 Cindy 29 Chicago 4 David 36 Boston
  17. 24 select * from customer (inner) join city on city.id

    = customer.city_id; 結合(INNER JOIN, OUTER JOIN) id name age city_id 1 Alice 40 1 2 Brian 23 2 3 Cindy 29 1 4 David 36 4 customer id name 1 Chicago 2 Seattle 3 Arizona 4 Boston city id name age city_id city.name 1 Alice 40 1 Chicago INNER JOINは両方のテーブル に存在する要素のみ表示 ①
  18. 25 select * from customer (inner) join city on city.id

    = customer.city_id; 結合(INNER JOIN, OUTER JOIN) id name age city_id 1 Alice 40 1 2 Brian 23 2 3 Cindy 29 1 4 David 36 4 customer id name 1 Chicago 2 Seattle 3 Arizona 4 Boston city id name age city_id city.name 1 Alice 40 1 Chicago 2 Brian 23 2 Seattle INNER JOINは両方のテーブル に存在する要素のみ表示 ②
  19. 26 select * from customer (inner) join city on city.id

    = customer.city_id; 結合(INNER JOIN, OUTER JOIN) id name age city_id 1 Alice 40 1 2 Brian 23 2 3 Cindy 29 1 4 David 36 4 customer id name 1 Chicago 2 Seattle 3 Arizona 4 Boston city id name age city_id city.name 1 Alice 40 1 Chicago 2 Brian 23 2 Seattle 3 Cindy 29 1 Chicago INNER JOINは両方のテーブル に存在する要素のみ表示 ③
  20. 27 select * from customer (inner) join city on city.id

    = customer.city_id; 結合(INNER JOIN, OUTER JOIN) id name age city_id 1 Alice 40 1 2 Brian 23 2 3 Cindy 29 1 4 David 36 4 customer id name 1 Chicago 2 Seattle 3 Arizona 4 Boston city id name age city_id city.name 1 Alice 40 1 Chicago 2 Brian 23 2 Seattle 3 Cindy 29 1 Chicago 4 David 36 4 Boston INNER JOINは両方のテーブル に存在する要素のみ表示 ④
  21. 28 select * from city left (outer) join customer on

    customer.city_id = city.id; 結合(INNER JOIN, OUTER JOIN) id name age city_id 1 Alice 40 1 2 Brian 23 2 3 Cindy 29 1 4 David 36 4 customer id name 1 Chicago 2 Seattle 3 Arizona 4 Boston city id name customer.id customer.name age 1 Chicago 1 Alice 40 1 Chicago 3 Cindy 29 OUTER JOINは元とするテーブルに 存在する要素は全て表示 ① ※left outer join = left join = outer join だが、right と紛らわしいので left は明示するべき
  22. 29 select * from city left (outer) join customer on

    customer.city_id = city.id; 結合(INNER JOIN, OUTER JOIN) id name age city_id 1 Alice 40 1 2 Brian 23 2 3 Cindy 29 1 4 David 36 4 customer id name 1 Chicago 2 Seattle 3 Arizona 4 Boston city id name customer.id customer.name age 1 Chicago 1 Alice 40 1 Chicago 3 Cindy 29 2 Seattle 2 Brian 23 OUTER JOINは元とするテーブルに 存在する要素は全て表示 ②
  23. 30 select * from city left (outer) join customer on

    customer.city_id = city.id; 結合(INNER JOIN, OUTER JOIN) id name age city_id 1 Alice 40 1 2 Brian 23 2 3 Cindy 29 1 4 David 36 4 customer id name 1 Chicago 2 Seattle 3 Arizona 4 Boston city id name customer.id customer.name age 1 Chicago 1 Alice 40 1 Chicago 3 Cindy 29 2 Seattle 2 Brian 23 3 Arizona null null null OUTER JOINは元とするテーブルに 存在する要素は全て表示 ③
  24. 31 select * from city left (outer) join customer on

    customer.city_id = city.id; SQLabの問題をやってみる 結合(INNER JOIN, OUTER JOIN) id name age city_id 1 Alice 40 1 2 Brian 23 2 3 Cindy 29 1 4 David 36 4 customer id name 1 Chicago 2 Seattle 3 Arizona 4 Boston city id name customer.id customer.name age 1 Chicago 1 Alice 40 1 Chicago 3 Cindy 29 2 Seattle 2 Brian 23 3 Arizona null null null 4 Boston 4 David 36 OUTER JOINは元とするテーブルに 存在する要素は全て表示 ④