プログラミング

【SQL】これだけ覚えればOK!実務で活躍できるSQL文をご紹介

hebishima.shogo

はい、hebiです。

SQLは、多くの企業が求める重要なスキルの1つです。SQLをマスターすることで、自身の市場価値を向上させ、IT業界で活躍できる機会を増やすことができます。

私が勤めている会社でも、開発業務以外に社内に集まったデータをSQLで抽出し分析する場面が多々あります。SQLはどの会社や業界でも必要なスキルだと改めて感じてます。

そこで、本記事では実際に実務でよく使うSQL文について記事にしたいと思います。

本記事ではPostgreSQLを使って説明しています。

スポンサーリンク

SQLとは

ぺんぎん
ぺんぎん

SQLについて詳しく教えてください!

hebiじぃ
hebiじぃ

うむ!
SQLはサーバー側で動作する言語なのじゃ。
データベースにあるテーブルからクエリ(SQL文)を実行してデータを取得したり追加、更新、削除を行うことができるのじゃ。
基本的な概念や用語を以下に説明するぞ。

  1. データベース: データの集合体を管理する仕組みであり、データベースは、一般的に複数のテーブルから成り立ち、それらの関係性を保持します。
  2. テーブル: データを表形式で格納するための構造です。テーブルは、行(レコード)と列(フィールドまたは属性)で構成されます。例えば、顧客情報を格納するための「Customers」というテーブルを保持します。
  3. クエリ: データベースから情報を取得するための命令です。クエリは、データをフィルタリング、ソート、集計するための条件や操作を含むことができます。例えば、「すべての顧客の名前とメールアドレスを取得する」というクエリを実行できます。
ぺんぎん
ぺんぎん

クエリにはどのような種類があるの?

hebiじぃ
hebiじぃ

業務でよく使うクエリを教えるのじゃ。
以下に説明するぞ。

  1. SELECT文: テーブルからデータを取得するために使用するSQLの基本的な文です。SELECT文を使用して、特定の列や行、または条件に基づいてデータを取得します。
  2. INSERT文: テーブルに新しいデータを挿入するために使用するSQL文です。INSERT文を使用して、新しい行をテーブルに追加できます。
  3. UPDATE文: テーブル内の既存のデータを更新するために使用するSQL文です。UPDATE文を使用して、既存の行の値を更新することができます。
  4. DELETE文: テーブルからデータを削除するために使用されるSQL文です。DELETE文を使用して、特定の行を削除できます。

DB内には以下のようなテーブルがあり、クエリでデータを取得したり、追加、更新、削除を行います。

テーブル例
ぺんぎん
ぺんぎん

なるほど。
テーブルはExcelの表みたいな感じで作られるんだな。

テーブル作成

ぺんぎん
ぺんぎん

テーブルはどうやって作るの?

hebiじぃ
hebiじぃ

テーブルはCREATE TABLE テーブル名で作成することができるのじゃ。
以下のように実行することでテーブルを作成できるぞ。

CREATE TABLE t_customers(
 customer_id SERIAL, -- カラム名:customer_id、型:SERIAL
 name VARCHAR(255) NOT NULL, -- カラム名:name、型:VARCHAR 最大255、必須項目
 email VARCHAR(255) NOT NULL, -- カラム名:email 、型:VARCHAR 最大255、必須項目
 phone VARCHAR(15), -- カラム名:phone 、型:VARCHAR 最大15
 PRIMARY KEY(customer_id) -- customer_idを一意のキーとする(重複して登録できないようにする)
);
 
ポイント
  1. SERIAL型はデータを追加すると自動的に数字を連番で追加してくれます。
  2. NOT NULLを指定すると必須項目になります。
  3. PRIMARY KEYを指定すると、重複した値を登録できなくします。
  4. t_customersの「t_」はトランザクションテーブルという意味合いで付けてますが、社内や現場の規約に従って付いていることが一般的です。マスターテーブルだと「m_」が付いてたりします。

INSERT文

hebiじぃ
hebiじぃ

先にINSERT文から説明するぞ。データが無いとSELECT、UPDATE、DELETEを実行できないからの。

INSERT文はデータを追加するクエリです。

INSERT文には、1件追加する書き方と複数を一括で追加する書き方があります。

パターン1

1件追加パターン

上記で作成したt_customersテーブルに対してデータを追加します。

INSERT 
INTO t_customers(name, email, phone) 
VALUES ('ぺんぎん', 'pen@xx.xx', 'xxxxxxxxxxx')
ポイント

以下のようにデータが入ります。

  • nameカラム→ぺんぎん
  • emailカラム→pen@xx.xx
  • phoneカラム→xxxxxxxxxxx

customer_idにはSERIAL型にしているので連番で自動的にデータが入るためINSERT時には指定していません。

INSERTの場合、PRIMARY KEYにより重複する値を挿入できないようにしている状態で重複する値をINSERTすると一意制約違反が発生するので注意が必要です。

パターン2

複数追加

1回のINSERT文で複数のレコードを追加するにはVALUESをカンマ区切りで指定して追加することができます。

INSERT 
INTO public.t_customers(name, email, phone) 
VALUES
    ('hebiじぃ', 'hebiji@xx.xx', 'xxxxxxxxxxx'),
    ('hebiばぁ', 'hebiba@xx.xx', 'xxxxxxxxxxx')

SELECT文

hebiじぃ
hebiじぃ

SELECT文について説明していくぞ。
SQL文で一番使うのがこのSELECT文なのでよく理解するのじゃぞ。

パターン1

通常取得

レコードを取得する簡単な実行方法です。

SELECT
    -- 取得したいカラム名を列挙します。
    customer_id
    , name
    , email
    , phone
FROM
    -- 取得したいテーブル名を指定します。
    t_customers 

上記を実行するとt_customersテーブルの全てのレコードを取得できます。

ポイント1

全ての項目を取得したい場合は*(アスターリスク)を指定して取得することができます。

SELECT * FROM t_customers

ポイント2

カラム名を物理名ではなく論理名で取得することができます。

SELECT
    -- 取得したいカラム名を列挙します。
    customer_id AS 会員ID
    , name AS 名前
    , email AS メールアドレス
    , phone AS 電話番号
FROM
    -- 取得したいテーブル名を指定します。
    t_customers 
パターン2

件数取得

レコード数を取得したい場合にもSELECT文のCOUNTを利用します。

SELECT
    // カウントを取得
    COUNT(*)
FROM
    t_customers 
パターン3

条件指定で取得

WHERE句を利用することで、条件付きのSELECT文を実行できます。
WHERE句はSELECT文に限らず、UPDATE文、DELETE文でも使用できます。

以下の例ではnameが’hebiじぃ’と一致するレコードを取得します。

SELECT
    customer_id
    , name
    , email
    , phone
FROM
    t_customers
WHERE
    -- nameが'hebiじぃ'と一致するレコードを取得する
    name = 'hebiじぃ'
ポイント1

不一致のデータを取得したい場合は以!=を指定して取得できます。

SELECT
    customer_id
    , name
    , email
    , phone
FROM
    t_customers
WHERE
    -- nameが'hebiじぃ'以外のレコードを取得する
    name != 'hebiじぃ'
ポイント2

あいまい検索を行うことができます。例えば、hebiの文字を含むレコードを取得してみましょう。

SELECT
    customer_id
    , name
    , email
    , phone
FROM
    t_customers
WHERE
    -- nameに'hebi'を含むレコードを取得
    name LIKE '%hebi%'

%の位置によって動作が変わります。

he%: heで始まる任意の文字列。
%bi: biで終わる任意の文字列。

ポイント3

AND条件OR条件で取得することができます。

nameがぺんぎんかつemailがpenを含むレコードを取得してみましょう。(AND条件)

SELECT
    customer_id
    , name
    , email
    , phone
FROM
    t_customers
WHERE
    -- nameが'ぺんぎん'かつemailに'pen'を含む
    name = 'ぺんぎん' AND email LIKE '%pen%'

nameがぺんぎんまたはemailがhebiを含むレコードを取得してみましょう。(OR条件)

SELECT
    customer_id
    , name
    , email
    , phone
FROM
    t_customers
WHERE
    -- nameが'ぺんぎん'またはemailに'hebi'を含む
    name = 'ぺんぎん' OR email LIKE '%hebi%'

UPDATE文

hebiじぃ
hebiじぃ

テーブルのカラムの値を変更したい場合にはUPDATE文を使うぞ!

UPDATE t_customers 
SET
    phone = '08099999999'
    , email = 'hebi@xx.xx'
WHERE
    customer_id = 2

customer_idが2のレコードのemailとphoneが変わったことが分かります。

一度更新すると元に戻せません
WHERE句に誤りがないことを確認し実行しましょう

DELETE文

hebiじぃ
hebiじぃ

レコードを削除するときにはDELETE文を使うぞ!

DELETE 
FROM
    t_customers 
WHERE
    customer_id = 3

hebiばぁのレコードが削除されたことが分かります。

一度削除すると元に戻せません
WHERE句に誤りがないことを確認し実行しましょう

結合

hebiじぃ
hebiじぃ

INSERT文、SELECT文、UPDATE文、DELETE文はどうじゃったかの?

ぺんぎん
ぺんぎん

結構簡単だな!文法も覚えやすいし楽勝だぜ!

hebiじぃ
hebiじぃ

うむ。
次は、テーブル結合について説明していくぞ。

ぺんぎん
ぺんぎん

よろしくおねがいしやす!!

INNER JOIN(内部結合)

ぺんぎんさんの注文情報を取得したい場合、t_customerテーブルには注文情報を持っていないのでt_orderテーブルから取得する必要があります。

ペンギンさんのcustomer_id(一意のキー)とt_ordersのcustomer_idを紐づけることでテーブルを結合します。これをINNER JOIN(内部結合)と言います。

SELECT
    c.customer_id
    , c.name
    , c.email
    , c.phone
    , o.total_price -- 合計金額
FROM
    t_customers AS c
-- t_ordersを結合
INNER JOIN t_orders AS o ON o.customer_id = c.customer_id
  1. 「INNER JOIN t_orders」でt_ordersと結合します。
  2. 「AS c」や「AS o」のようにテーブル名に名前を付けることで
    c.customer_idやo.total_priceのようにアクセスできるようになります。

実行すると以下のようにt_ordersテーブルのtotal_priceを表示することができました。

更にt_ordersにはない商品情報をt_order_itemテーブルと結合して取得してみましょう。

SELECT
    c.customer_id
    , c.name
    , c.email
    , c.phone
    , o.total_price
    , oi.product_name -- 商品名
FROM
    t_customers AS c
INNER JOIN t_orders AS o ON o.customer_id = c.customer_id
-- t_order_itemを結合
INNER JOIN t_order_item AS oi ON o.order_id = oi.order_id

実行すると以下のようにt_order_itemテーブルのproduct_nameを表示することができました。

hebiじぃ
hebiじぃ

複雑なSQL文だとINNER JOINが10以上使用されることもあるのじゃ。

LEFT JOIN(左外部結合)

INNER JOINの場合は、結合条件を満たす行のみを保持して、2つのテーブル間で共通の行を結合します。結合条件が一致する行がない場合、その行は結果に含まれません。

INNER JOINの説明で示した例で言うと、ぺんぎんさんが未購入の場合、t_ordersテーブルにはデータが無いので、ぺんぎんさんのレコードは表示されません。

未購入の会員も取得したい場面が出てくると思いますが、ここでLEFT JOIN (左外部結合)を利用します。

LEFT JOINは左側のテーブルのすべての行を保持し、右側のテーブルとの結合条件を満たす行があれば結合します。結合条件を満たさない右側の行も含まれますが、その場合、右側のテーブルのカラムはNULLになります。

SELECT
    c.customer_id
    , c.name
    , c.email
    , c.phone
    , o.total_price
    , oi.product_name
FROM
    t_customers AS c
LEFT JOIN t_orders AS o ON o.customer_id = c.customer_id
LEFT JOIN t_order_item AS oi ON o.order_id = oi.order_id

ぺんぎんさんのレコードが取得されます。

ただ、結合したテーブルのカラムは全てnullになります。

RIGHT JOIN(右外部結合)

LEFT JOINの逆向きで利用します。

機能としては同じなの割愛します。

hebiじぃ
hebiじぃ

結合を取り入れることでSQLの幅がグッと広がるのじゃよ。
ただし、SQLの使い方が分かったとしてもテーブル構成を把握していないと結合は難しいのじゃ。

これがSQLが難しく感じる要因の1つかもしれんの。

ぺんぎん
ぺんぎん

なるほどな。
でもクエリについて理解できたから、簡単なデータなら取得できそうだな!

hebiじぃ
hebiじぃ

そうじゃな。
では、次回はサーバからデータを取得して、ブラウザにそのデータの一覧を表示する方法を記事するとしようかのう。

最後に

SQL文はいかがだったでしょうか。

業務ではこの記事で紹介したSQL文で賄えると思います。

時にはめちゃくちゃ長いSQL文に悩まされることがありますが、そのようなSQLは作った本人も忘れてしまっているカオスなSQL文だと思いますw

次回はサーバで取得したデータを一覧として表示する記事を書きます。

最後までお読みいただきありがとうございました(^^♪

スポンサーリンク
ABOUT ME
hebi
hebi
エンジニア
フルスタックエンジニアとして活躍中。
HTML5プロフェッショナル認定Level1、Level2所持者です。

未経験の方でも簡単にプログラミングを学べるようにと情報を発信しております。
記事URLをコピーしました