SQL文の基本となる、select、insert、update、deleteの基本的な使い方を紹介します。
以下、データベースとして、MySQLのサンプルデータベースEmployeesを使っています。SQL実行結果の表示にはphpMyAdminを使用しています。
select構文 SQL文の基本
SQL文の中で、もっとも指定が複雑なのがselect文。
サブクエリとして使ったり、selectの結果をinsert文に渡したりとSQL文の中でも基本となるステートメントです。where条件の指定や、order by句でのソート指定、limit句での最大取得数指定は他のステートメントでも使うことになるので覚えておきましょう。
SELECT [DISTINCT ] [JOIN条件] カラム1 [, カラム2 ...] [FROM テーブル名] [WHERE where条件] [GROUP BY グルーピング条件] [HAVING 集合関数の絞込条件] [ORDER BY ソート指定] [LIMIT オフセット・最大取得数指定]
以下のSQLは、1991年1月1日以降入社の社員数が多い部署の上位5件のdept_name(部署名)とcnt(人数)を出力します。
部署名を取得するために、employees(社員テーブル)、dept_emp(部署・社員紐付けテーブル)、departments(部署テーブル)をjoinし、部署の社員数が7000人以下の場合は、除外しています。
SELECT dept_name, count(*) as cnt FROM employees left join dept_emp on employees.emp_no = dept_emp.emp_no left join departments on dept_emp.dept_no = departments.dept_no where hire_date > '1991-01-01' group by dept_emp.dept_no having count(*) > 7000 order by cnt desc limit 5
実行するとこうなります。
distinctで重複レコードの扱いを指定
取得データが重複した場合は、distinct指定で重複除外が可能です。
【関連記事】
▶SQL distinctのサンプルコード集 group byよりも700倍速い?
join条件を指定
複数テーブルの結合指定をおこないます。1つのクエリで複数のテーブルから、必要なカラムを紐付けて取得することが可能です。
【関連記事】
▶SQL Joinサンプル集 Joinで遅いSQLの原因を調べる方法
where句で検索条件を指定
検索条件を指定します。あいまい検索や、範囲指定、NULL判定など高度な条件も指定可能です。
【関連記事】
▶SQL where句のサンプルコード集 ワイルドカードやサブクエリを使った複雑な条件指定
group by句でグルーピング条件を指定
小計を計算する場合など、カラムにグルーピング条件を指定します。
【関連記事】
▶SQLのgroup byサンプルコード集 count、like、join等の組み合わせ例
having句で集約関数の絞込条件を指定
グルーピングと合わせて使うcount、sum、avgなどの集約関数の絞込条件を指定します。
【関連記事】
▶SQL having 集約関数の絞り込み whereよりもレスポンスが遅い理由とは?
order by句でソート指定
取得レコードの並び替えをおこなうための条件を指定します。
【関連記事】
▶SQL order byでソート指定するサンプルコード集 指定のレコードだけ先頭に並べるには?
limit句でレコード取得のオフセットや最大取得数指定
1クエリでの最大レコード取得数や、取得開始位置(オフセット)を指定します。対象テーブルにレコードが大量にあるなど、クエリのレスポンスが遅くなる場合に有効です。
【関連記事】
▶SQL limitを使ったページング、ランダム抽出、速度改善をおこなう
unionでselect結果の和集合を指定
複数のselect文の結果を和集合として一つにまとめたい場合には、unionを使います。
【関連記事】
▶【意外と知らない?】SQL unionの使い方をわかりやすく説明
case式でカラム指定に分岐ロジックを指定
SQLの条件分岐を組み込みたい場合は、case式を使います。
【関連記事】
▶SQLのCASE式サンプル集 order byやgroup byとの組み合わせもバッチリ
insert構文 レコードを挿入
テーブルにレコードを挿入します。insert文にはwhere指定がありません。重複データがあればupdateの動作をする「ON DUPLICATE KEY UPDATE」は、DBMSによっては指定できない場合があります。
INSERT [INTO] テーブル名 [(カラム1, カラム2,…)] {VALUES} (値1,値2,...) [ ON DUPLICATE KEY UPDATE ] カラム1=値1 [, カラム2=値2] … ]
下記SQLは、employees(社員テーブル)に、データを挿入します。
INSERT INTO `kabuking_practice`.`employees` ( `emp_no`, `birth_date`, `first_name`, `last_name`, `gender`, `hire_date` ) VALUES ( '555555', '2010-10-15', 'Taro', 'Yamada', 'M', '2013-04-01' )
または
select文の結果をテーブルに挿入する場合の構文です。
INSERT [INTO] テーブル名 [(カラム名1[,カラム名2,…])] SELECT ... [ ON DUPLICATE KEY UPDATE ] カラム1=値1 [, カラム2=値2] … ]
下記SQLはemployees(社員テーブル)のデータ全件を、employees2テーブルに挿入します。※employees2テーブルの構造は、employeesテーブルと同一の前提。
insert employees2 select * from employees
【関連記事】
▶【こんな使い方も?】SQL insertの使用方法を徹底的に解説
update構文 レコードを更新
テーブルのレコードを更新します。order by指定の順にデータを更新します。
UPDATE テーブル名 SET カラム1=値1 [, カラム2=値2] … [WHERE where条件] [ORDER BY 更新順序指定] [LIMIT 最大更新数指定]
下記SQLはemployees(社員テーブル)の、emp_no(社員番号)が10002のレコードのfirst_name(姓名の名)をBezalelxに更新します。
UPDATE `employees` SET `first_name` = 'Bezalelx' WHERE `employees`.`emp_no` = 10002
【関連記事】
▶【実例で学ぶ】SQL「UPDATE」文の使い方 基礎・応用編
where句で更新対象レコードを指定
更新するレコードをwhere条件で指定します。指定を誤ると広範囲のデータを上書き更新してしまう可能性があります。
手動でupdateステートメントを発行する場合などは、いったんselect文とwhere句を組み合わせて対象の更新レコードを確認するなどの注意が必要です。
order by句でソート指定
update文でのorder by指定は、更新順序を指定します。
ソートして先頭から3レコードのみ更新したい場合など、limit句と組み合わせるケースもあります。
postgreSQLなど、update文でorder by句を指定できないDBMSもあります。
limit句でレコード取得のオフセットや最大取得数指定
更新対象レコードが大量の場合、テーブルを長時間ロックしてしまわないよう小分けで更新をかけたい場合に使います。
delete構文 レコードを削除
テーブルのレコードを削除します。order by指定の順にデータを削除します。
DELETE FROM テーブル名 [WHERE where条件] [ORDER BY 削除順指定] [LIMIT 最大削除数指定]
下記SQLは、employees(社員テーブル)から、emp_no(社員番号)が10007のレコードを削除します。
DELETE FROM `employees` WHERE `employees`.`emp_no` = 10007
【関連記事】
▶【初心者向け】SQLのDELETE文の使い方を現役SE目線で解説
where句で削除対象レコードを指定
削除するレコードを条件指定します。指定を誤ると必要なデータまで削除してしまう恐れがあります。
手動でSQLを発行する場合には、対象レコード指定のwhere句をselect文と組み合わせて、削除対象を確認しましょう。
【関連記事】
▶SQLで重複を削除するサンプルコード 最新データを残してdeleteするには?
order by句でソート指定
ソートして上位10件を削除したい場合などlimitを組み合わせるケースがあります。
limit句でレコード取得のオフセットや最大取得数指定
order byと組み合わせるケースや、大量データの削除をおこなう際、1クエリで実行するとレスポンスが長時間戻ってこない場合など、小分けでdeleteを実行したい場合などに使います。
【関連記事】
▶SQL limitを使ったページング、ランダム抽出、速度改善をおこなう
まとめ
- select文はデータ取得用のSQL文。各句の指定が最も複雑。
- insertはデータ挿入用。1件挿入と、select結果の挿入が可能。
- updateはデータ更新用。ソートとlimitで上位レコードのみ更新可能。
- deleteはデータ削除用。大量データ処理時にlimitで小分けして処理可能。