Blog 入門

【新卒向け】SQL入門 - はじめてのデータベース操作

データベースはなぜExcelではだめなのか、SQLはなぜ「何が欲しいか」を書くだけで動くのか。仕組みの理解から、SELECT・WHERE・INSERT・UPDATE・DELETEの基本操作、事故を防ぐ実行習慣まで順番に解説する入門記事。

11 min read Updated: 2026.07.22 [AI生成]

業務システムの裏には、ほぼ必ずデータベースがいる

会社の業務システムを想像してみてください。社員の情報、勤怠の記録、商品の在庫、注文の履歴。これらのデータは、どこかに保存されていなければ画面に表示できません。

「Excelファイルに保存すればいいのでは」と思うかもしれません。実際、小さなデータならそれで回ります。ただ、業務システムの規模になると無理が出てきます。数十人が同時に同じファイルを開いて書き込もうとしたら壊れます。数百万行になると開くだけで固まります。「注文を登録した瞬間に在庫も減らす」という2つの更新を、途中で電源が落ちても矛盾が残らないように行うことも、Excelにはできません。

この「大量のデータを、複数の利用者から、壊れないように読み書きする」仕事を専門に引き受けるソフトウェアが**データベース管理システム(DBMS)**です。MySQL、PostgreSQL、SQL Server、Oracle Databaseといった名前を聞いたことがあるかもしれません。これらはすべてDBMSの製品名です。

その中でも最も広く使われているのがリレーショナルデータベースという方式で、データをテーブル(表)の形で管理します。1行が1件のデータ(、レコード)、縦の並びが項目(、カラム)。見た目はExcelのシートによく似ていますが、「プログラムから安全に大量に読み書きするための仕組み」が備わっている点が決定的に違います。

SQLは「何が欲しいか」を伝える言語

そのデータベースに対して、「このデータをください」「この行を書き換えてください」と依頼するための言語がSQL(Structured Query Language)です。

SQLには、多くのプログラミング言語と違う大きな特徴があります。「どうやって取ってくるか」を書かず、「何が欲しいか」だけを書くという点です。

たとえば「営業部の社員一覧が欲しい」とき、ファイルを開いて、1行ずつ読んで、部署の列を比較して……という手順は一切書きません。「employeesテーブルから、部署が営業の行をください」と書くだけで、探し方はDBMSが自分で考えてくれます。レストランで「カレーください」と注文するのに似ています。調理手順を指示する必要はなく、何が欲しいかを決まった形式で伝えればいい。この形式を覚えることが、SQL学習のほぼすべてです。

DBMSごとに方言(細かい書き方の違い)はありますが、基本の文法は共通です。ここから、データ操作の基本4つ——取得(SELECT)・追加(INSERT)・更新(UPDATE)・削除(DELETE)を順番に見ていきます。

練習環境を用意する — SQLite

読むだけでは身につかないので、手を動かせる環境を先に作ります。おすすめはSQLiteです。サーバーの構築が不要で、1つのファイルが1つのデータベースになるという手軽さが特長です。macOSには標準で入っています。Windowsはsqlite.orgの「Precompiled Binaries for Windows」からzipをダウンロードして展開するだけです。

ターミナル(PowerShell)で次を実行すると、練習用データベースが作られて対話モードに入ります。

sqlite3 practice.db

まず、この記事で使うテーブルを作ってデータを入れます。そのまま貼り付けて実行してください。

-- Create the employees table
CREATE TABLE employees (
  id INTEGER PRIMARY KEY,
  name TEXT NOT NULL,
  department TEXT,
  salary INTEGER
);

-- Insert sample rows
INSERT INTO employees (name, department, salary) VALUES
  ('sato', 'Sales', 300000),
  ('suzuki', 'Engineering', 320000),
  ('takahashi', 'Sales', 280000),
  ('tanaka', 'Engineering', 350000);

CREATE TABLEはテーブルの設計図を宣言する文です。列の名前と型(INTEGERは整数、TEXTは文字列)を並べています。PRIMARY KEYは「各行を一意に識別する列」という指定で、NOT NULLは「この列は空を許さない」という制約です。制約を設計図の段階で宣言しておくと、おかしなデータはDBMSが入り口で弾いてくれます。データの品質をアプリ側の注意力ではなく仕組みで守る——これがデータベースの思想です。

INSERT INTOが行の追加です。どの列に((name, department, salary))、どの値を(VALUES以降)入れるかを対にして書きます。idを書いていないのは、INTEGER PRIMARY KEYの列はSQLiteが自動で連番を振ってくれるためです。

SELECT — 欲しいデータを取り出す

4つの操作のうち、実務で圧倒的に使用頻度が高いのがSELECTです。

SELECT name, department FROM employees;

読み方は「FROM employees(employeesテーブルから)SELECT name, department(nameとdepartmentの列を取り出す)」。英語の語順とは逆に、FROMから読むと意味が取りやすいです。

列を全部欲しいときは*(すべての列)が使えます。

SELECT * FROM employees;

ただし実務のプログラムでは、*ではなく列名を明示する書き方が好まれます。理由は2つあります。必要な列だけ取るほうが通信量・メモリの無駄がないこと。そして、後からテーブルに列が追加・並び替えされても、プログラムが受け取るデータの形が変わらないことです。「動くかどうか」だけでなく「変更に強いかどうか」で書き方を選ぶ、というのは今後いろいろな場面で出てくる判断基準です。

WHERE — 条件で絞り込む

全行ではなく条件に合う行だけ欲しいとき、WHERE句を付けます。

SELECT name, salary FROM employees WHERE department = 'Engineering';

「departmentが’Engineering’である行だけに絞って、nameとsalaryを取り出す」という意味になります。実行すると、suzukiとtanakaの2行だけが返ってくるはずです。

ここでつまずきやすいポイントを2つ挙げます。

  • 文字列はシングルクォート' 'で囲む。多くのプログラミング言語と違い、SQLではダブルクォートは別の意味(列名やテーブル名の引用)に使われます。
  • 比較は=が1つ。JavaやJavaScriptの==に慣れていると=を代入と読みたくなりますが、SQLのWHERE句では=が「等しい」です。

条件はANDORでつなげられ、><などの比較も使えます。

SELECT name FROM employees WHERE department = 'Sales' AND salary >= 300000;

そしてもう1つ重要なこと。WHEREは「SELECTのオプション」ではなく、どの行を対象にするかを決める独立した仕組みです。次に見るUPDATEとDELETEでも同じWHEREを使います。ここがこの記事で一番大事な安全装置になります。

UPDATE・DELETE — 書き換えは「対象の指定」がすべて

既存の行の値を書き換えるのがUPDATEです。

UPDATE employees SET salary = 340000 WHERE name = 'suzuki';

「employeesテーブルの、nameが’suzuki’の行の、salaryを340000にする」。SETが変更内容、WHEREが対象の指定です。

行を削除するのがDELETEです。

DELETE FROM employees WHERE id = 3;

さて、ここで手を止めて考えてほしいことがあります。もしWHERE句を書き忘れたら何が起きるでしょうか。

-- DO NOT run this: updates EVERY row
UPDATE employees SET salary = 0;

エラーにはなりません。SQLとしては「全行が対象」という正しい文なので、全社員の給与が0になります。DELETEでWHEREを忘れれば全行が消えます。これはSQLの初心者事故として最も有名なもので、実際の業務データベースで起きれば大きな障害になります。

だからこそ、実務では次の習慣が徹底されています。UPDATEやDELETEを実行する前に、同じWHERE句でSELECTを実行して対象行を確認する。

-- 1. Check which rows will be affected
SELECT * FROM employees WHERE name = 'suzuki';

-- 2. Then update with the exact same WHERE clause
UPDATE employees SET salary = 340000 WHERE name = 'suzuki';

SELECTの結果が想定どおりの行数・内容であることを見てから、WHERE句をそのまま流用して書き換えを実行する。地味ですが、この一手間が自分を守ります。ツールに慣れることよりも、こういう「事故らない手順」を体に入れることのほうが、新人のうちは価値があります。

NULLという落とし穴

最後に、初心者が必ず一度は引っかかるNULLに触れておきます。NULLは「値が入っていない」ことを表す特別な状態です。サンプルデータに1行追加してみます。

INSERT INTO employees (name, department, salary) VALUES ('yamada', NULL, 290000);

このyamadaを「部署が未設定の人」として探したくなったとき、直感的にはこう書きたくなります。

SELECT name FROM employees WHERE department = NULL;  -- returns nothing

ところがこれは1行も返しません。NULLは「値がない」状態なので、=で比較すると結果は真にも偽にもならない、というルールがあるためです。NULLを条件にするときは専用の書き方を使います。

SELECT name FROM employees WHERE department IS NULL;

= NULLは効かない、IS NULLを使う」。今は丸暗記で構いません。NULLの扱いはベテランでも間違える領域なので、「NULLが絡むと比較の常識が変わる」ということだけ覚えておけば十分です。

まとめと次の一歩

  • データベースは「大量のデータを、複数の利用者から、壊れないように読み書きする」ための専門ソフトで、リレーショナルデータベースはテーブル(行と列)でデータを管理する
  • SQLは「どうやって」ではなく**「何が欲しいか」を決まった形式で伝える**言語
  • 基本操作は SELECT(取得)・INSERT(追加)・UPDATE(更新)・DELETE(削除)の4つで、対象行の指定はどれも同じWHERE句
  • UPDATE・DELETEの前には同じWHEREでSELECTして対象を確認する。この習慣が事故を防ぐ
  • NULLの比較は=ではなくIS NULL

次の一歩としておすすめなのは、練習用データベースに自分の身近なデータ——たとえば行ってみたい店のリストや読んだ本の記録——でテーブルを1つ作り、4つの操作を一通り試してみることです。自分のデータだと結果の正しさが自分で判断できるので、学習の回転が速くなります。

その先には、テーブルを複数に分けて組み合わせるJOINという大きなテーマが待っています。「なぜテーブルを分けるのか」という設計の話とセットで、いずれこのブログでも扱う予定です。

※ この記事はAIが自動生成したものです。本記事の内容は執筆時点の情報であり、正確性を保証するものではありません。ご利用の際は免責事項をご確認ください。

Share

Related / 関連記事

関連記事

Comments / コメント

コメント