Webサイト制作コースのお申し込みはこちら Webサイト制作コースのお申し込みはこちら

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

実行するとこうなります。

SQL実行結果

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で小分けして処理可能。

エンジニアになりたい人に選ばれるプログラミングスクール「ポテパンキャンプ 」

ポテパンキャンプは卒業生の多くがWebエンジニアとして活躍している実践型プログラミングスクールです。 1000名以上が受講しており、その多くが上場企業、ベンチャー企業のWebエンジニアとして活躍しています。

基礎的な学習だけで満足せず、実際にプログラミングを覚えて実践で使えるレベルまで学習したいという方に人気です。 プログラミングを学習し実践で使うには様々な要素が必要です。

それがマルっと詰まっているポテパンキャンプでプログラミングを学習してみませんか?

卒業生の多くがWebエンジニアとして活躍

卒業生の多くがWeb企業で活躍しております。
実践的なカリキュラムをこなしているからこそ現場でも戦力となっております。
活躍する卒業生のインタビューもございますので是非御覧ください。

経験豊富なエンジニア陣が直接指導

実践的なカリキュラムと経験豊富なエンジニアが直接指導にあたります。
有名企業のエンジニアも多数在籍し品質高いWebアプリケーションを作れるようサポートします。

満足度高くコスパの高いプログラミングスクール「ポテパンキャンプ」

運営する株式会社ポテパンは10,000人以上のエンジニアのキャリアサポートを行ってきております。
そのノウハウを活かして実践的なカリキュラムを随時アップデートしております。

代表の宮崎もプログラミングを覚えサイトを作りポテパンを創業しました。
本気でプログラミングを身につけたいという方にコスパ良く受講していただきたいと思っておりますので、気になる方はぜひスクール詳細をのぞいてくださいませ。