【例文付き】SQLチートシート – 基本編

2024年3月5日

当サイトはアフィリエイト広告を利用しています。

基本的なSQLの構文をまとめます。上級者になりたい方向けの本も最後に紹介しています。

SELECT 基本

役割

テーブルからレコードの情報を参照するために利用します。

構文

SELECT カラム名, カラム名 FROM テーブル名 WHERE カラム名 比較演算子 値 AND カラム名 比較演算子 値 ORDER BY カラム名 DESC

すべてのカラムを取得したいときにはカラム名の箇所を*にすればOKです。

SELECT * FROM テーブル名

コード例

usersテーブルから名前を取得するSQLです。

SELECT name FROM users WHERE age = 30 ORDER BY id DESC

もう一個例文を載せておきます。WHERE句で文字列を使う場合です。

SELECT name, age FROM users WHERE name = 'shohei'

数値を利用する場合には’は不要でしたが、文字列との比較をするときには必須です。

またWHEREで利用する=などの比較演算子にLIKEを用いると、比較対象の値にワイルドカードが利用可能です。

SELECT name, age FROM users WHERE name LIKE 'sho%'

この例の場合だと、shoheiもshotaも引っかかります。

利用できるワイルドカードは2つです。

%は「0文字以上の任意の文字列」。_は「1文字の任意の文字」です。正規表現とは異なるので注意しましょう。

SELECT 集合関数

役割

SELECTの基本形では取得対象がカラム自体の値になっていましたが、集合関数ではカラムもしくはカラム以外の値に対して何かしらの計算を加えた値を返します。

構文

SELECT 集合関数(カラム名), 集合関数(カラム名) FROM テーブル名

集合関数にはMAX、MIN、AVGなどがあります。

コード例

SELECT MAX(age), AVG(age) FROM users

このコード例ではWHERE句とこの後説明するグループ化をどちらも利用していないので全てのカラムについて集合させた結果を出力します。

SELECT グループ化

役割

特定の条件に合致したレコードをグループ化した(擬似的に一つのレコードにまとめた)上で演算を行います。基本的に集合関数とセットで使います。

構文

SELECT カラム名A, カラムB, 集合関数(カラム名C) FROM テーブル名 GROUP BY カラム名A, カラム名B

GROUP BYを利用した場合、SELECTで指定できるのはGROUP BYで指定したカラムか集合関数のみになる点に注意です。

例えば以下のようなSQL文は実行できません。

SELECT name, AVG(age) FROM users GROUP BY job

job(職業)でグループ化しているので、内部的にできているテーブルはjob以外はぐちゃっとしています。集合関数を使うとぐちゃっとした値をどのように集約させるか決まるのでSELECTできますが、それ以外の値はぐちゃっとした状態が解消されないので、指定できません。

ルールとして覚える必要はありません。まずGROUP BYで作られる一時テーブルを想像してから、何をSELECTできるのか考えれば自然にわかります。

SELECT グループ化 絞り込み

役割

グループ化した上で算出可能になった値を利用して、絞り込みを行うときに利用します。

構文

SELECT カラム名A, 集合関数(カラム名B) FROM テーブル名 GROUP BY カラム名A HAVING 集合関数(カラム名B) 比較演算子 値

役割の補足

絞り込みで使われるものとしてWHERE句が浮かぶと思うのですが、HAVINGとは明確に異なる点があります。それが実行タイミングです。WHERE句はグループ化前に実行されHAVINGはグループ化後に実行されます。

そのためグループ化した後に利用可能な集合関数を利用した絞り込みはHAVINGでのみ利用可能です。

コード例

SELECT name, AVG(age) FROM users GROUP BY job HAVING MAX(age) <= 10

SELECT 重複削除

役割

出力対象の行が全く同じ値であったら、重複を削除して表示します。

構文

SELECT DISTINCT カラム名A, カラムB FROM テーブル名

注意点として、あくまでDISTINCTは出力される行全体にかかっており、カラムAだけに対して重複削除をしているわけではないということです。

コード例

SELECT DISTINCT age, job FROM users

INSERT

役割

レコードを追加します。

構文

INSERT INTO テーブル名 (カラム名, カラム名, カラム名) VALUES (値, 値, 値)

値が文字列の場合には’で囲む必要があるので注意です。あと値が必須のカラムに値を設定しないでINSERTするとエラーになるので注意です。

コード例

INSERT INTO users (name, age, job) VALUES ('shouhei', 29, 'baseball_player')

UPDATE

役割

行の値を更新します。

構文

UPDATE テーブル名 SET カラム名 = 値, カラム名 = 値 WHERE 条件

WHEREをつけない場合、テーブルに存在する全ての行の値が更新されてしまいます。本番環境のDBでやったらとんでもない事故になるので気をつけましょう。

コード例

UPDATE users SET job = 'soccer_player' WHERE name = 'shohei'

DELETE

役割

行を削除します。

構文

DELETE FROM テーブル名 WHERE 条件

WHEREをつけない場合、テーブルに存在する全ての行を削除してしまいます。本番環境のDBでやったらUPDATEを超えるとんでもない大事故になるので気をつけましょう。

コード例

DELETE FROM users WHERE name != 'shohei'

まとめ

この記事ではSQLの基本となる情報をまとめました。

ただし重要な「結合」については記載していません。というのも結合は奥が深く、それだけでかなりの説明量になってしまうからです。結合を業務で利用する、もしくは興味があるという方は以下の記事もご確認ください。

あとSQLの上級者になりたい方にはこちらの本がおすすめ。上級者になりたい中級者向けSQL教本といったらまず名前が上がる本で、この記事では記載していないCASE式などより簡潔にパフォーマンスの良いSQLを書くための技術が詰まっています。

直近でおすすめの本

直近十数冊読んだ中で一番おすすめの本です。

人が行動をするに至るまでのステップを科学的に分析した上で、その結果を習慣と紐付けて解説してくれている本です。

悪い習慣を断ち、良い習慣を継続する方法を詳細に説明してくれています。習慣が人を作っているので、この本の内容を実践できれば人生を大きく好転させられる気がしました。

この本の最初の方に説明があるのですが、複利という考え方があり毎日1パーセントだけの増加でもそれが続くととてつもない倍率になります。これは投資でよく用いられる概念ですが、良い習慣は未来への投資なので習慣にもあてはまります。良い習慣を身に付けるのは早ければ早いほど良いです。

私はまず長時間YouTubeを見てしまう習慣を断って、直近の業務に役立つITの勉強を習慣として身に付けよう思います。