Menu

SQLコマンド一覧:よく使うSQL文を例つきで解説

毎日使うSQLコマンドを、役割ごと(DDL、DML、DQL、TCL)に分けて紹介します。どれもSQLiteでそのまま実行できる例つきです。

このページのコードはエディタで実行できます - 編集してすぐに結果を確認できます。

SQLコマンドの全体像

SQLコマンドは、役割によっていくつかのグループに分かれます。次の表はよく使うものをまとめたもので、以下の各セクションでそれぞれを実行します。

コマンドグループ内容
CREATE TABLEDDL新しいテーブルとその列を定義する
ALTER TABLEDDL列を追加する、列やテーブルの名前を変える
DROP TABLEDDLテーブルをすべての行ごと削除する
INSERTDML新しい行を追加する
UPDATEDML既存の行の値を変更する
DELETEDML行を削除する
SELECTDQL行を読み出す。WHERE で絞り込み、ORDER BY で並べ替える
BEGIN, COMMIT, ROLLBACKTCL変更をまとめ、すべて成功するかすべて失敗するようにする

DDLはデータ定義言語、DMLはデータ操作言語、DQLはデータ問い合わせ言語、TCLはトランザクション制御言語の略です。名前よりも大事なのは分け方で、DDLはデータベースの形を変え、DMLはその中身を変えます。

CREATE TABLE:テーブルを定義する

CREATE TABLE はテーブルに名前を付け、列とその型やルールを並べます。このページのほかのコマンドはどれも、操作するテーブルが必要です。

CREATE TABLE のページでは、NOT NULL、UNIQUE、DEFAULT などのルールを説明しています。

INSERT:行を追加する

INSERT INTO は1行、または複数行を追加します。列を並べてから、同じ順番で値を並べます。

id 列は自動で埋まりました。INTEGER PRIMARY KEY の列は、値を省略すると次の番号が入ります。詳しくは INSERT を参照してください。

SELECT:行を読み出す

SELECT は最もよく書くコマンドです。列を選び、WHERE で行を絞り込み、ORDER BY で並べ替えます。

WHERE の条件を満たす行だけが、成績の高い順に返されます。詳しくは SELECTの基本 と WHERE を参照してください。

UPDATE:行を変更する

UPDATE は既存の行に新しい値を設定します。どの行を変えるかは WHERE 句で決まり、省略するとすべての行が変わります。

WHERE 句がどの行に当てはまるか自信がないときは、先に SELECT として実行してみましょう。ほかのパターンは UPDATE のページにあります。

DELETE:行を削除する

DELETE FROM は WHERE 句に当てはまる行を削除します。UPDATE と同じく、句がなければすべての行が対象になります。

Chenの行が消え、ほかの行はそのままです。DELETE も参照してください。

ALTER TABLEとDROP TABLE:テーブルを変更・削除する

ALTER TABLE は行を失わずに既存のテーブルを変更します。DROP TABLE はテーブルを完全に削除します。

新しい列は、値を入れるまで既存の行では NULL になります。SQLiteで何ができるかは ALTER TABLEとDROP TABLE にまとめています。

JOIN:テーブルを結合する

JOIN は、共通の列で対応付けて、2つのテーブルの行を一度に読み出します。

Borisは履修登録がないので、INNER JOIN では結果に含まれません。LEFT JOIN なら、科目を空にしたまま残ります。

GROUP BY:行を集計する

GROUP BY は同じ値を持つ行を1行にまとめ、COUNT や AVG のような集計関数が各グループを要約します。

さらに詳しくは 集計関数 と GROUP BYとHAVING を参照してください。

BEGIN、COMMIT、ROLLBACK:変更をまとめる

トランザクションを使うと、複数の変更を1つとして扱えます。COMMIT はすべてを確定し、ROLLBACK はすべてを取り消します。

送金はコミットされ、2つ目の変更はロールバックされたので、最終的にAdaは70、Borisは80になります。いつ使うべきかは トランザクション で説明しています。

SQLiteで違う点

このページのコマンドは標準SQLなので、ここで学んだことはMySQLやPostgreSQLでも役立ちます。ただし実行できる例はSQLite向けに書かれていて、大規模なデータベースでは次の3点が変わります。

  • テーブルの一覧。 例ではSQLite独自のスキーマテーブル sqlite_master を読んでいます。MySQLでは SHOW TABLES、PostgreSQLではビュー information_schema.tables(または psql の \dt)を使います。
  • IDの自動採番。 SQLiteでは INTEGER PRIMARY KEY として宣言した列が新しい行に自動で番号を振ります。INSERT の例で id を省いているのはそのためです。MySQLでは列に AUTO_INCREMENT を、PostgreSQLではIDENTITY列(GENERATED BY DEFAULT AS IDENTITY)か SERIAL を指定します。
  • 権限とスキーマの変更。 SQLiteのデータベースはユーザーアカウントを持たない1つのファイルなので、GRANT や REVOKE はありません。また ALTER TABLE で列の型を変更することもできません。

よくある質問

SQLの基本コマンドは何ですか?

日常の作業のほとんどは5つでまかなえます。テーブルを定義する CREATE TABLE、行を追加する INSERT、行を読み出す SELECT、行を変更する UPDATE、行を削除する DELETE です。その次に ALTER TABLE、DROP TABLE、JOIN、GROUP BY と、トランザクションのコマンド BEGIN、COMMIT、ROLLBACK が続きます。

DDLとDMLの違いは何ですか?

DDL(データ定義言語)はデータベースの構造を変えるもので、CREATE、ALTER、DROP がこれに当たります。DML(データ操作言語)はテーブルの中の行を変えるもので、INSERT、UPDATE、DELETE です。SELECT は読み出すだけなので、DQLとして別に分類されることがよくあります。

SQLコマンドは大文字と小文字を区別しますか?

区別しません。SELECT、select、Select のどれでも動きます。キーワードを大文字で書くのは、テーブル名や列名と見分けやすくするための慣習です。ただし引用符の中の文字列はそのまま比較されるので、大文字と小文字を区別しない比較を指定しない限り、SQLiteでは 'Ada' と 'ada' は別の文字列です。

これらのコマンドはMySQLやPostgreSQLでも同じように動きますか?

これらの文は標準SQLなので、3つのデータベースで意味は同じで、ここで学んだことはそのまま役立ちます。ただし実行できる例はSQLite向けに書かれています。テーブル一覧はここでは sqlite_master から読み、自動採番のIDはMySQLでは AUTO_INCREMENT、PostgreSQLではIDENTITY列が必要で、SQLiteには GRANT も REVOKE もありません。

Coddy programming languages illustration

Coddyでコードを学ぼう

始める