SQL: 環境構築と最初のクエリ
1. 🎯 身近な例え
料理を学びたいと想像してください。料理を始める前に、以下が必要です:
- 台所の準備 — データベースのインストールはコンベクションオーブンの設置のようなものです
- 道具の準備 — コマンドラインとGUIツールはへらや計量カップのようなものです
- 材料の準備 — データベースの作成はカウンターに食材を並べるようなものです
- 料理開始 — 最初のSQLクエリは最初の包丁を入れるようなものです
台所なしでは料理できません。同様に、データベース環境を構築しなければSQLを学べません。このレッスンでは、ゼロからあなた自身の「SQL台所」を構築するまでガイドします。
2. 📚 基本概念
(1) データベースのインストール
3つの主流リレーショナルデータベースがあります。初心者はまず1つをインストールし、後から拡張しましょう。
MySQL
MySQLは世界で最も人気のあるオープンソースデータベースで、Web開発に広く使用されています。
Windowsへのインストール:
- MySQL公式サイトからインストーラーをダウンロード
- インストーラーを実行し、「Developer Default」を選択
- rootパスワードを設定(必ず覚えておいてください!)
- インストール後、MySQLサービスが自動的に起動します
macOSへのインストール:
# Homebrewでインストール
brew install mysql
# MySQLサービスを起動
brew services start mysql
# セキュアインストール
mysql_secure_installation
Linux(Ubuntu)へのインストール:
sudo apt update
sudo apt install mysql-server
sudo systemctl start mysql
sudo mysql_secure_installation
PostgreSQL
PostgreSQLは最も強力なオープンソースデータベースで、複雑なクエリやエンタープライズアプリケーションに適しています。
Windowsへのインストール:
- PostgreSQL公式サイトからインストーラーをダウンロード
- インストーラーを実行し、パスワードとポート(デフォルト5432)を設定
- 「pgAdmin」コンポーネント(GUI管理ツール)にチェックを入れる
macOSへのインストール:
brew install postgresql@16
brew services start postgresql@16
Linux(Ubuntu)へのインストール:
sudo apt update
sudo apt install postgresql postgresql-contrib
sudo systemctl start postgresql
SQLite
SQLiteは軽量な組み込みデータベースで、サーバーのインストールが不要なため、学習や小規模プロジェクトに最適です。
Windowsへのインストール:
- SQLiteダウンロードページから
sqlite-tools-win64をダウンロード - 任意のディレクトリに解凍し、そのディレクトリをシステムPATHに追加
macOS / Linuxへのインストール:
# macOS(通常プリインストール済み)
brew install sqlite
# Linux
sudo apt install sqlite3
インストール確認:
sqlite3 --version
(2) コマンドラインでデータベースに接続する
コマンドラインはデータベースと対話する最も直接的な方法です。
MySQLに接続:
mysql -u root -p
# パスワードを入力してMySQLの対話型インターフェースにアクセス
入力後、プロンプトがmysql>に変わり、SQLステートメントを入力できるようになります。
PostgreSQLに接続:
# psqlクライアントを使用
psql -U postgres
# データベースを指定
psql -U postgres -d mydb
入力後、プロンプトがmydb=#に変わります。
SQLiteに接続:
# データベースファイルを作成または開く
sqlite3 mydb.db
# ファイルが存在しない場合は自動的に作成されます
入力後、プロンプトがsqlite>に変わります。
データベースコマンドラインの終了:
| データベース | 終了コマンド |
|---|---|
| MySQL | exit; または quit; |
| PostgreSQL | \q |
| SQLite | .exit または Ctrl+D |
(3) GUIツール
ビジュアルインターフェースを好む場合は、以下のツールを推奨します:
| ツール | 対応データベース | 特徴 | 価格 |
|---|---|---|---|
| DBeaver | MySQL / PostgreSQL / SQLite / ほぼすべてのデータベース | 機能が豊富、プラグインが充実 | 無料(コミュニティ版) |
| Navicat | MySQL / PostgreSQL / SQLite | 美しいインターフェース、スムーズな操作 | 有料 |
| DB Browser for SQLite | SQLite | SQLite専用、軽量 | 無料 |
| pgAdmin | PostgreSQL | 公式製品 | 無料 |
| MySQL Workbench | MySQL | 公式製品 | 無料 |
DBeaverインストール例(推奨):
- DBeaver公式サイトからコミュニティ版をダウンロード
- インストール後、起動して「New Database Connection」をクリック
- データベースタイプを選択(例:MySQL)
- ホスト、ポート、ユーザー名、パスワードを入力
- 「Test Connection」をクリック — 成功すれば使用準備完了です
(4) オンラインSQL練習プラットフォーム
現時点ではソフトウェアをインストールしたくない場合は、オンラインプラットフォームで直接練習できます:
| プラットフォーム | URL | 特徴 |
|---|---|---|
| SQL Fiddle | http://sqlfiddle.com | MySQL / PostgreSQL / SQLite対応 |
| DB Fiddle | https://www.db-fiddle.com | モダンなインターフェース、複数バージョン対応 |
| SQLiteOnline | https://sqliteonline.com | ゼロ設定、すぐに利用可能 |
| LeetCode SQL | https://leetcode.cn/problemset/database | 問題で練習、実践的に学習 |
3. 📝 基本構文と使い方
(1) 最初のSQLステートメント:SELECT
SELECTはSQLで最もよく使われるステートメントで、データベースからデータを取得するために使用します。最もシンプルな形式は:
SELECT 式;
最もシンプルなクエリから始めましょう:
SELECT 1;
このステートメントの意味:値1を計算して返します。テーブルは関係ありません — データベースが正常に動作していることを確認するためのものです。
データベース別の構文:
-- MySQL / PostgreSQL / SQLiteで動作
SELECT 1;
-- 文字列を返す
SELECT 'Hello, SQL!';
-- 計算結果を返す
SELECT 2 + 3;
;で終わります。一部のツールでは省略可能ですが、常に記述する習慣をつけましょう。
(2) データベース情報の確認
データベースに接続した後、現在の環境を確認したくなるでしょう:
MySQL:
-- すべてのデータベースを表示
SHOW DATABASES;
-- 現在のデータベースを表示
SELECT DATABASE();
-- バージョンを表示
SELECT VERSION();
PostgreSQL:
-- すべてのデータベースを表示
\l
-- 現在のデータベースを表示
SELECT current_database();
-- バージョンを表示
SELECT version();
SQLite:
-- すべてのテーブルを表示
.tables
-- データベース情報を表示
.database
-- バージョンを表示
SELECT sqlite_version();
SHOWや\lなどのコマンドは各データベース固有の「メタコマンド」であり、標準SQLの一部ではありません。データベース間で移行する際にはこれらの違いに注意してください。
(3) 最初のデータベースとテーブルの作成
正式にSELECTを学ぶ前に、クエリ対象のデータが必要です。データベースとテーブルの作成手順を示します:
MySQLの例:
-- データベースを作成
CREATE DATABASE learn_sql;
-- データベースを切り替え
USE learn_sql;
-- テーブルを作成
CREATE TABLE students (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50) NOT NULL,
age INT,
city VARCHAR(50)
);
-- サンプルデータを挿入
INSERT INTO students (name, age, city) VALUES
('John', 20, 'New York'),
('Jane', 22, 'Los Angeles'),
('Bob', 21, 'Chicago'),
('Alice', 23, 'Houston'),
('Charlie', 20, 'New York');
PostgreSQLの例:
CREATE DATABASE learn_sql;
-- 切断してlearn_sqlに再接続
\c learn_sql
CREATE TABLE students (
id SERIAL PRIMARY KEY,
name VARCHAR(50) NOT NULL,
age INT,
city VARCHAR(50)
);
INSERT INTO students (name, age, city) VALUES
('John', 20, 'New York'),
('Jane', 22, 'Los Angeles'),
('Bob', 21, 'Chicago'),
('Alice', 23, 'Houston'),
('Charlie', 20, 'New York');
SQLiteの例:
-- SQLiteはデータベース作成が不要。直接テーブルを作成
CREATE TABLE students (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
age INTEGER,
city TEXT
);
INSERT INTO students (name, age, city) VALUES
('John', 20, 'New York'),
('Jane', 22, 'Los Angeles'),
('Bob', 21, 'Chicago'),
('Alice', 23, 'Houston'),
('Charlie', 20, 'New York');
CREATE TABLEとINSERT INTOは後のレッスンで詳しく説明します。今はそのまま進めてください。
(4) 最初のSELECTクエリの実行
データが準備できました。クエリを実行してみましょう:
-- すべての生徒の情報を検索
SELECT * FROM students;
出力:
+----+---------+------+-----------+
| id | name | age | city |
+----+---------+------+-----------+
| 1 | John | 20 | New York |
| 2 | Jane | 22 | Los Angeles|
| 3 | Bob | 21 | Chicago |
| 4 | Alice | 23 | Houston |
| 5 | Charlie | 20 | New York |
+----+---------+------+-----------+
特定の列のみクエリ:
-- nameとcityのみ検索
SELECT name, city FROM students;
出力:
+---------+-----------+
| name | city |
+---------+-----------+
| John | New York |
| Jane | Los Angeles|
| Bob | Chicago |
| Alice | Houston |
| Charlie | New York |
+---------+-----------+
4. 🧪 例
(1) サンプル:SELECTでデータベース接続を確認する
データベースをインストールした後、最初に行うことは接続が正常であることを確認することです。
-- データベースが正常に応答することを確認
SELECT 'Database connected!' AS message;
-- 現在の時刻とユーザーを表示
SELECT NOW() AS current_time, CURRENT_USER AS db_user;
SQLiteの構文は少し異なります:
SELECT 'Database connected!' AS message;
SELECT datetime('now') AS current_time;
出力例:
+---------------------+
| message |
+---------------------+
| Database connected! |
+---------------------+
このシンプルなテストで接続問題を迅速にトラブルシューティングできます — このステートメントが実行されれば、環境は正しく設定されています。
(2) サンプル:テーブル作成、データ挿入、クエリ
小さな書籍ライブラリを管理したいとします。
-- booksテーブルを作成
CREATE TABLE books (
id INT PRIMARY KEY,
title VARCHAR(100) NOT NULL,
author VARCHAR(50),
price DECIMAL(8, 2),
publish_year INT
);
-- サンプルデータを挿入
INSERT INTO books (id, title, author, price, publish_year) VALUES
(1, 'Database Systems', 'Connolly', 45.00, 2014),
(2, 'SQL in 10 Minutes', 'Ben Forta', 39.00, 2020),
(3, 'High Performance MySQL', 'Baron Schwartz', 89.00, 2013),
(4, 'PostgreSQL in Action', 'Tan Feng', 69.00, 2018);
-- すべての書籍を検索
SELECT * FROM books;
出力:
+----+-------------------------+-----------------+-------+---------------+
| id | title | author | price | publish_year |
+----+-------------------------+-----------------+-------+---------------+
| 1 | Database Systems | Connolly | 45.00 | 2014 |
| 2 | SQL in 10 Minutes | Ben Forta | 39.00 | 2020 |
| 3 | High Performance MySQL | Baron Schwartz | 89.00 | 2013 |
| 4 | PostgreSQL in Action | Tan Feng | 69.00 | 2018 |
+----+-------------------------+-----------------+-------+---------------+
タイトルと価格のみクエリ:
SELECT title, price FROM books;
*を使用する代わりに列名(title, price)を指定することで、出力をより明確にし、クエリをより効率的にできます。
(3) サンプル:計算とエイリアスを含むクエリ
SQLのSELECTはデータの検索だけでなく、計算も実行できます。
-- 各書籍の出版からの経過年数を計算(2026年基準)
SELECT
title AS book_title,
author AS book_author,
price AS original_price,
price * 0.8 AS discounted_price,
2026 - publish_year AS years_since_publish
FROM books;
出力:
+-------------------------+-------------+----------------+------------------+--------------------+
| book_title | book_author | original_price | discounted_price | years_since_publish|
+-------------------------+-------------+----------------+------------------+--------------------+
| Database Systems | Connolly | 45.00 | 36.00 | 12 |
| SQL in 10 Minutes | Ben Forta | 39.00 | 31.20 | 6 |
| High Performance MySQL | Baron S. | 89.00 | 71.20 | 13 |
| PostgreSQL in Action | Tan Feng | 69.00 | 55.20 | 8 |
+-------------------------+-------------+----------------+------------------+--------------------+
ポイント:
ASキーワードは列にエイリアスを作成し、出力をより読みやすくします- 列に対して算術演算を行えます(例:
price * 0.8) - 定数と列名を混在させられます(例:
2026 - publish_year)
ASキーワードはすべての主要データベースで動作し、SQLの最もよく使われる機能の1つです。
5. 🏢 シナリオ別応用
(1) シナリオ1:開発環境のセットアップ
あなたはバックエンド開発者で、新しいプロジェクトにMySQLデータベースが必要です。以下のタスクを完了してください:
- MySQLをインストールし、サービスを起動
- プロジェクトデータベース
project_dbを作成 - ユーザー情報を格納する
usersテーブルを作成 - テストレコードを挿入して検証
-- ステップ1:データベースを作成
CREATE DATABASE project_db CHARACTER SET utf8mb4;
-- ステップ2:データベースを切り替え
USE project_db;
-- ステップ3:usersテーブルを作成
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(50) NOT NULL UNIQUE,
email VARCHAR(100) NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- ステップ4:テストデータを挿入
INSERT INTO users (username, email) VALUES
('testuser', 'test@example.com');
-- ステップ5:検証
SELECT * FROM users;
(2) シナリオ2:データ分析の準備
あなたはデータアナリストで、CSVデータを素早く確認する必要があります。SQLiteにインポートしてクエリします。
# コマンドラインで操作
sqlite3 sales.db
# テーブルを作成
CREATE TABLE sales (
id INTEGER PRIMARY KEY,
product TEXT,
quantity INTEGER,
unit_price REAL,
sale_date TEXT
);
# CSVデータをインポート(.importコマンドを使用)
.mode csv
.import sales_data.csv sales
# インポート結果を表示
SELECT * FROM sales LIMIT 5;
# 総レコード数を表示
SELECT COUNT(*) AS total_records FROM sales;
.importコマンドはCSVファイルをデータベーステーブルとして素早く読み込むのに非常に便利で、データ探索やアドホック分析に最適です。
▶ サンプル
CREATE DATABASE shop;
USE shop;
❓ よくある質問
📖 まとめ
このレッスンでは、SQL学習のための環境準備を完了しました:
- データベースのインストール — MySQL、PostgreSQL、SQLiteのインストール方法を学びました
- コマンドライン接続 — コマンドラインツールを使用したデータベースへの接続と操作をマスターしました
- GUIツール — DBeaver、Navicat、DB Browserなどのグラフィカルツールを探索しました
- オンラインプラットフォーム — SQL Fiddle、DB Fiddleなどのオンライン練習環境を発見しました
- 最初のクエリ —
SELECTステートメントの基本、クエリ、計算、エイリアスを学びました
環境構築は面倒かもしれませんが、後続のすべての学習の基盤です。料理を学ぶにはまず台所に慣れるのと同じように、道具を知ることで「料理」本身に集中できます。
📝 練習問題
(1) 演習1:環境確認
インストールしたデータベースに接続し、以下のクエリを実行して、出力が正しいことを確認してください:
SELECT 'Hello SQL!' AS greeting, 1 + 1 AS result;
(2) 演習2:商品テーブルの作成とクエリ
以下のフィールドを持つproductsテーブルを作成し、少なくとも3件のレコードを挿入してから、すべてのレコードをクエリしてください:
| フィールド | 型 | 説明 |
|---|---|---|
| id | 整数 | 主キー |
| name | テキスト | 商品名 |
| category | テキスト | カテゴリ |
| price | 小数 | 価格 |
| stock | 整数 | 在庫数 |
(3) 演習3:計算を含むクエリ
演習2のproductsテーブルを使用して、各商品の在庫総額(価格×在庫数)を計算するクエリを書き、出力列に日本語のエイリアスを使用してください。
期待される出力例:
+----------+------+--------+------------+
| 商品名 | 価格 | 在庫数 | 在庫総額 |
+----------+------+--------+------------+
| ... | ... | ... | ... |
+----------+------+--------+------------+
次のレッスン: レッスン3:基本クエリ — SELECTとFROM