SQLコマンドの全体像
SQLコマンドは、役割によっていくつかのグループに分かれます。次の表はよく使うものをまとめたもので、以下の各セクションでそれぞれを実行します。
| コマンド | グループ | 内容 |
|---|---|---|
CREATE TABLE | DDL | 新しいテーブルとその列を定義する |
ALTER TABLE | DDL | 列を追加する、列やテーブルの名前を変える |
DROP TABLE | DDL | テーブルをすべての行ごと削除する |
INSERT | DML | 新しい行を追加する |
UPDATE | DML | 既存の行の値を変更する |
DELETE | DML | 行を削除する |
SELECT | DQL | 行を読み出す。WHERE で絞り込み、ORDER BY で並べ替える |
BEGIN, COMMIT, ROLLBACK | TCL | 変更をまとめ、すべて成功するかすべて失敗するようにする |
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 もありません。