社内向けにSQL(入門レベル)の勉強会を開催!
はじめに
こんにちは。
新SES企業『株式会社エージェントグロー』(以下『AG』)に所属のエンジニア『かっつ』です。
普段、この手の内容は会社HPの社員ブログに書くので、Zennで書くのは初めてになります。
なので、今回は活動の説明から入りたいと思います。
エンジニア社員が勉強会を開く!
AGでは所属するエンジニアが現場で活躍しながら、自主的に次のような活動をしています。
- 同じ趣味で集まるもよし、新たな趣味を開拓するもよしのサークル活動
- 得意分野を共有し、仲間のスキルアップに貢献する勉強会
- 好きなテーマで社外向けに情報発信するブログ
ということで、今回はSQLをテーマにした勉強会を開催し、このようにブログを書いています。
社内の対象者は?
データベース言語のSQLについて、入門レベルとして共有しようと考えました。
なぜなら、幅広い分野で若手からベテランまで様々なエンジニアが所属するためです。
- 開発SE/PGだが、SQLはたまに書く程度
- インフラ/ネットワーク系なので、ほぼ使わない。
- ベテランだが、頻度の低いものは覚えていない。
どんな内容?
教材はIPAにて公開されている情報処理技術者試験の過去問から抜粋し、次の流れで進めました。
- 基本的な構文を理解する。
- 設問のSQLを実際に動かしてみる。
- 正解はどれなのか明らかにし、仕組みを理解する。
- アレンジしてみる(別解やチューニング)※これは入門レベルではないけど;
資料は?
講義と演習で使えるように作っています!
- タイムスケジュール、概要、演習などのスライド
- SQLファイル
- WEBで動かせるツールのリンク
タイムスケジュール、概要、演習などのスライド
勉強会は、大体1時間半~2時間程度で予定されることが多いです。
目的『なんのために勉強するの?』という内容も、事前に告知しています。
実施回ごとにテーマを1つに絞っています。
演習はこんなイメージ。 ※出典:基本情報技術者試験(令和元年)午前:問26
SQLファイル
過去問を実際に動かすには、自分で考えて追加しないといけない部分もあります。例えば・・・
- テーブルが定義されていない
- データがない
そこを考慮し、このような感じで作りました。
-- 試験問題からSQLを書いてデータを作成し検証する
-- ※PostgreSQLに対応
-- 【出典】基本情報技術者試験(令和元年)午前:問26
-- https://www.ipa.go.jp/shiken/mondai-kaiotu/2019h31.html#aki_fe
-- ◆事前準備 ---------------------------------------------------
-- テーブル定義
CREATE TABLE 得点 (
学生番号 CHAR(4)
, 科目 VARCHAR(20)
, 点数 INTEGER DEFAULT 0 NOT NULL
, PRIMARY KEY(学生番号,科目) -- 主キーを設定
)
;
-- サンプルデータ登録(問題文に無いので、このファイル独自のものである)
INSERT INTO 得点
VALUES
('0001','国語',90)
,('0001','数学',72)
,('0002','国語',66)
,('0002','数学',90)
,('0003','国語',85)
,('0003','数学',75)
,('0004','国語',100)
,('0004','数学',58)
,('0005','国語',70)
,('0005','数学',94)
;
-- 全データ確認用のSQL
SELECT * FROM 得点
ORDER BY 学生番号,科目 -- 主キー順にソート
;
-- ◆本題 ---------------------------------------------------
-- 【実行して結果を表示したいSQL】
SELECT 学生番号,AVG(点数)
FROM 得点
GROUP BY -- [a]
;
-- 【問題】空欄[a]には、ア~エのどれが入るか?
-- ア 科目 HAVING AVG(点数) >= 80
-- イ 科目 WHERE 点数 >= 80
-- ウ 学生番号 HAVING AVG(点数) >= 80
-- エ 学生番号 WHERE 点数 >= 80
-- ※正解はIPA公開の解答例を参照
---------------------------------------------------
---------------------------------------------------
---------------------------------------------------
-- 【おまけ】問題文のSQLをチューニングしてみた ---------------------------------------------------
WITH 平均 AS MATERIALIZED(
SELECT DISTINCT
学生番号
, AVG(点数) OVER(PARTITION BY 学生番号) AS 平均点数
FROM 得点
)
SELECT 学生番号 ,平均点数 FROM 平均
WHERE 平均点数 >= 80
;
フルセットなので、環境さえあれば試せる状態です!
WEBで動かせるツールのリンク
今のご時世、DBをインストールしなくてもWEBで動かせちゃうのですよね!
DB Fiddle
他に、念のためテキストエディタもWEB版で個人的にオススメのものを案内しました(定番だけど)
VS Code
いつ、何人くらい?
今回は2日間やることにして、レベルは一緒でテーマを変えました。
- 1回目:2024/11/21(木) 集計関数 [GROUP BY][HAVING][SUM()][COUNT()] など
- 2回目:2024/11/26(火) 集合演算 [UNION][UNION ALL][EXCEPT][INTERSECT] など
そして、事前にこのような案内を出してみました。
◆こんな方々にオススメ
・現場でいつも同じようなSQLしか使っていないので、幅広く知りたい。
・基本情報/応用情報技術者試験の対策をしたい。
◆必須スキル
ちょっとでもSQLに触れたことがあれば大丈夫です。
その後、告知では内勤の方々のご協力もあり1回目は10人、2回目は8人の応募となりました!
なお、業務都合などで参加できなくなった方もおられたので、参加者全員を対象にアーカイブ配信もしています!
どこで?
全国各地の社員が参加できるように、オンラインで開催しました。
ちなみに、こちらは開始直前の私です。
どんな雰囲気?
開始前から
早めに参加してくれたメンバーも居て、近況などを雑談したり。最近入社された方ともお話できました^^
本編
そして定刻に開始!
肩に力を入れず気楽に学べるように考えながら喋っていたら、脱線してテーマの範囲外の仕様説明までしてしまう始末です;
また、近々開催される全社員総会で全国の社員が東京に集まるのですが「そこで会いましょう!」なんて会話も。
アンケート
参加者には後日、勉強会についてのアンケートも実施!
コメントは感想や指摘、アドバイスなどを遠慮なく書いて頂くようにお願いしました。
また、週報で感想を書いてくれるメンバーも居ました(^^)
回答の抜粋
- かなり勉強になった。また参加したい。
- 内容や解説が理解できない。どのくらいのレベルを対象にしているのか事前に周知すると良い。
ご指摘を頂いた点を反省し、より良い勉強会にできるようにします!!
総じて
両日ともに、AGらしさ全開のゆるい感じで進行しました。
これが『AG』の文化なのです!!
最後に
今回の勉強会のざっくりとした紹介は以上ですが、いかがでしたでしょうか?
私は5年前にAGに転職しましたが、このような勉強会を自ら開催するようになったのは、AGに入社してからです。
良い意味でのユルさで仲間が優しいので、失敗を恐れず挑戦できるようになったのだと思います。
私の勉強会を通じて、この感じが伝われば嬉しく思います。
今回は以上です。
ここまでお付き合い頂き、ありがとうございましたm(_ _)m
Discussion