はじめに
SQLの学習課題に取り組む中で、
Dockerを使ったMySQL環境構築や、SQLの書き方でいくつか詰まったポイントがありました。
この記事では、
実際に手を動かしていてハマった点と、そこから理解できたことを整理します。
同じようにDockerやSQLを学習している方の参考になれば幸いです。
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
DockerでMySQLコンテナに入れなかった話
起きたこと
以下のコマンドを実行したところ、
docker exec -it middle_examination_sql bash
Error response from daemon: No such container: middle_examination_sql
というエラーが出て、コンテナに入れませんでした。
原因
Dockerイメージとコンテナを混同していた
そもそもコンテナが起動していなかった
対応と理解
まず起動中のコンテナを確認。
docker ps
その後、コンテナを起動。
docker run -d --name middle_examination_sql -p 3306:3306 middle_examination_sql
docker exec -it middle_examination_sql bash
👉 イメージを作っただけでは docker exec は使えず、
コンテナを起動して初めて中に入れるという基本を理解しました。
MySQL操作で混乱した点
mysql> の状態で mysql コマンドを打ってしまった
MySQLにログインした後、mysql> プロンプトの状態で
mysql -pcollege
を入力してしまい、SQLエラーになりました。
学んだこと
mysql -pxxx は bash(ターミナル)で実行するコマンド
mysql> は SQLを書く場所
SHOW DATABASES;
USE employees;
SHOW TABLES;
のように、SQL文のみを書く必要があると整理できました。
SQL①:最初の役職を取得する
実行したSQL
SELECT title
FROM titles
WHERE emp_no = 49988
ORDER BY from_date ASC
LIMIT 1;
ポイント
「最初」を求める場合は 日付で昇順ソート
LIMIT 1 で1件に絞る
👉 条件・並び順・件数制限をセットで考えることが重要。
SQL②:titleの種類数を数える
SELECT COUNT(DISTINCT title)
FROM titles;
ポイント
重複を除く場合は DISTINCT
種類数を数える場合は COUNT(DISTINCT カラム)
SQL③:特定期間に該当する給与を取得する
SELECT salary, from_date, to_date
FROM salaries
WHERE emp_no = 40000
AND from_date <= '1996-12-31'
AND to_date >= '1996-01-01';
ポイント
期間条件は
開始日 <= 期間の終わり AND 終了日 >= 期間の始まり
AND の前後にスペースを入れることで可読性が上がる
まとめ
今回の学習を通して、
Dockerは「イメージ」と「コンテナ」を分けて考える
MySQLでは「どの環境でコマンドを打っているか」を意識する
SQLは「何を取得したいか」を言語化してから書く
という基礎だけど重要な点を再確認できました。
今後も詰まった点は、アウトプットとして整理していきたいと思います。