見出し画像

SQL・SELECT文の基本

はじめに

SQLのアウトプットです。
今回はSELECT文の基本をおさらいします。
※RDBMSの説明や、テーブルの説明は省略させていただきます。

学習に使用した教材・参考資料

学習手順

  1. SQLとは

  2. SELECT文とは

  3. SELECT文の基本

  4. WHERE句の使い方

  5. COUNT関数の使い方

  6. ORDER BY句の使い方

  7. GROUP BY句の使い方

  8. HAVING句の使い方

  9. INNER JOINの使い方

  10. LIKEの使い方

  11. BETWEENの使い方

  12. INの使い方

  13. CREATE VIEWの使い方


1. SQLとは


RDBMSをコントロールする為の言語である。

2. SELECT文とは


テーブルからデータを抽出、取得する為の命令文である。

3. SELECT文の基本


書き方

SELECT カラム(列)名 
FROM テーブル名;

例えば以下のfoodlistテーブルからnameカラムのデータを取得する場合は以下のように記述する。
又は、複数のカラムのデータを取得したい場合は、カラム名とカラム名の間に [,]カンマを入れて連結すると指定した複数のカラムデータを取得できる。

・foodlistテーブル
# nameカラムからデータを取得するクエリ

SELECT name 
FROM foodlist;

結果として以下のように取得される

nameカラム

全てのカラムのデータを取得したい場合は以下のように記述

# 全てのカラムのデータを取得する場合は * をSELECTに記述する

SELECT * FROM foodlist;

以下のようにテーブルに入っているデータ全てを取得できる

foodlist


4. WHERE句の使い方


使い方

SELECT カラム名 
FROM テーブル名 
WHERE 条件式;

例えば以下のfoodlistテーブルから¥300以上するnameカラムにある食材を取得したい場合があるとする、その時に条件式を利用して比較演算子を利用することで可能になる。

# foodlistテーブルから値段が¥300以上するnameカラムにある食材を取得する

SELECT name 
FROM foodlist 
WHERE price >= 300;
foodlistテーブル

結果として以下のようになる

比較演算子

条件式には比較演算子は必須である

a > b       aがbより大きい
a < b       bがaより大きい
a >= b      aはb以上
a <= b      bはa以上
a = b       aとbは等しい
a <> b      aとbは等しくない


5. COUNT関数の使い方


使い方

SELECT COUNT(*)
FROM テーブル名;

例えば、foodlistテーブルから¥300以下の食材は何個あるか知りたい場合は以下のようになる

# foodlistテーブルから¥300以下の食材は何個あるか知りたい

SELECT COUNT(*)
FROM foodlist
WHERE price <= 300;
foodlistテーブル

結果として以下のように返ってくる

COUNT(*)

カラム名を別名で表示させる

COUNT(*)関数だと表示されるカラム名が何のカウントをしているか分からないのでカウント名を別名で表示することができる
以下のように[AS]を記述してカラム名を記述する

# カラム名に"300円以下の食材数"と表示させる

SELECT COUNT(*) AS "300円以下の食材数"
FROM foodlist
WHERE price <= 300;

結果として以下のようになる

AS "300円以下の食材数"

Point

COUNT(*)はカラムと同じ扱いと考えるので、必ずSELECTの後に記述する


6. ORDER BY句の使い方


使い方

SELECT カラム名 
FROM テーブル名 
ORDER BY 並べ替えの基準となるカラム名;

例えば、値段の安い順番に並べ替えてデータを取得したい場合に使える、デフォルトでは昇順に並び替えてくれるようになっている。

# 食材のnameとpriceを値段の安い順番に並べ替えて取得する

SELECT name, price 
FROM members 
ORDER BY price;
foodlistテーブル

結果として以下のように返ってくる

ORDER BY

降順に取得したい場合は DESC を使う

ORDER BY はデフォルトだと昇順に並べ替えてくれるが、逆に降順に並べ替えたい時は DESC を最後に記述する。

# 値段が高い順に並べ替えて取得するには DESC を使う

SELECT name, price 
FROM members 
ORDER BY price DESC;

以下のようになる

DESC


7. GROUP BY句の使い方


使い方

SELECT カラム名 
FROM テーブル名 
GROUP BY 集約キー;

例えば、foodlistテーブルにある食材の値段が同じ価格の物どおしをグループにて、その数を取得したい場合に使える。

# foodlistテーブルにある食材の値段が同じものは何個あるか知りたい

SELECT price, COUNT(*) 
FROM members 
GROUP BY price;


foodlistテーブル

結果は以下のとおり

GROUP BY

GROUP BYを使用する注意点

GROUP BYはORDER BYとは違い注意する制約がいくつかある、それを知らないとエラーの原因になるので注意が必要。

  1. SELECT句で使用できるのは、GROUP BYで使用した集約キー、定数、集約関数だ。nameなどは表示できないのでエラーになる。

  2. AS で別名を命名できない、COUNT(*)を使用しているので、別名をカラム名に命名できそうだが、GROUP BYでは使えない。

  3. GROUP BY では並べ替えて取得する機能はない、ORDER BYが必要になる

Point

GROUP BYは集計する用途に使用するといいと思う。


8. HAVING句の使い方


使い方

SELECT カラム名 
FROM テーブル名
GROUP BY 集約キー HAVING グループの値に対する条件式;

例えば、foodlistテーブルから同じ値段の食材をグループ化して、そのグループで特定の条件を満たしているグループを取得したい場合に使える。
以下の場合だと、同じ値段の食材が2つあるグループを知りたい場合だ。

# foodlistテーブルの食材の同じ値段が2つあるグループを知りたい

SELECT price, COUNT(*) 
FROM foodlist
GROUP BY price 
HAVING COUNT(*) = 2;


foodlistテーブル

結果は以下になる

HAVING

foodlistテーブルには¥100と¥150と¥300の食材が2種類づつあることが確認できた。


9. INNER JOIN句の使い方


使い方

SELECT カラム名 
FROM テーブル名1
INNER JOIN テーブル名2 ON 結合の条件;

例えば、以下のfoodlistテーブルとoriginlistテーブルがある、INNER JOINを利用して、2つのテーブルを結合したデータを取得したいので、foodlistテーブルのorigin_idカラムとoriginlistテーブルのidカラムを紐づけて結合する
条件式で[=]を使用してoriginlist.id = foodlist.origin_idの数字が同じものを紐づけている。

# foodlistとoriginlistを結合した全てのデータを取得したい

SELECT * 
FROM foodlist
INNER JOIN originlist ON originlist.id = foodlist.origin_id;
foodlistテーブル
originlistテーブル

結果は以下のようになる
foodlistにあるバナナとパイナップルはorigin_idが1なので、産地はoriginlistのidが1のエクアドルと紐づいてるのが確認できる、他の食材は全てorigin_idがユニークなので産地がバラけている、たまたまです。

INNER JOIN


10. LIKEの使い方


使い方

SELECT カラム名 
FROM テーブル名 
WHERE 検索対象の対象のカラム名 
LIKE '検索文字';

LIKEは文字列の部分一致検索をする時に使える。
例えば、foodlistテーブルのnameカラムに「○○さい」という後方に「さい」を含む食材があるか確認したい場合に使える、「はくさい」「ちんげんさい」「さんさい」「てんさい」等がある、その中で「はくさい」の「値段」を取得したい場合は以下のようになる。
LIKEに記述する%は文字の部分一致検索で使用する、
前方一致:('検索文字%')
中間一致:('%検索文字%')
後方一致:('%検索文字')

# foodlistのnameカラムに後方一致で「さい」とつく食材があるか検索して、さらに値段を取得したい

SELECT name, price
FROM foodlist
WHERE name
LIKE '%さい';
foodlistテーブル

結果は以下のようになる

LIKE


11. BETWEENの使い方


使い方

SELECT カラム名 
FROM テーブル名
WHERE 条件対象のカラム名 
BETWEEN 指定範囲 AND 指定範囲;

最初に理解しておくことは、比較演算子を利用することで、BETWEENを使わなくても同じことができるということです。
ここではBETWEENの使い方をおさらいするので、比較演算子については触れません。

foodlistテーブルで¥200から¥300の食材を取得したい場合は以下のように取得します。
※BETWEENで指定した範囲は指定した数値自体を含みます。

# foodlistテーブルの食材で¥200から¥300の食材と値段を取得する

SELECT name, price
FROM foodlist
WHERE price
BETWEEN 200 AND 300;
foodlistテーブル

結果はこうなる

BETWEEN


12. INの使い方


使い方

SELECT カラム名 
FROM テーブル名
WHERE 条件対象のカラム名 
IN (検索キーワード);

foodlistテーブルから¥150と¥250の食材を取得したい場合は以下のようにクエリを記述する

# foodlistから¥150と¥250の食材を取得したい

SELECT name, price
FROM foodlist
WHERE price
IN (150, 250);
foodlistテーブル

結果はこうなる

IN

※反対にNOT INを利用すると指定したクエリ以外のものを取得いてくれる、NOTをつけるかつけないかの違いです。


13. CREATE VIEWの使い方


使い方

CREATE VIEW ビュー名 (<ビューのカラム名1>, <ビューのカラム名2>, ...)
AS
<SELECT文>;

<SELECT実行文>;

例えば、SELECT文で取得した内容を何回か使い回したい場合があるとする、だけどそのクエリを毎回記述するのは面倒だし、もっと便利な方法はないのか?となる。
そんな場合にCREATE VIEWを利用することがベストプラクティスになる。

以下の内容はfoodlistテーブルにあるcategoryをグループ分けして、それをCREATE VIEWに保存し、何度も取得できるようにしたクエリ。

# foodlistのcategoryをグループ分けして取得して、それをCREATE VIEWに保存して何度も取得できるようにする

CREATE VIEW FoodCategoryCount (category, count_category)    <--保存するビュー名を定義
AS
SELECT category, COUNT(*)                     <-- 実行したいSELECT文を定義
FROM foodlist
GROUP BY category;

//以下を実行すればCREATE VIEWに保存したクエリを何度も実行取得できる
SELECT category, count_product            <-- 保存したビューを実行 
FROM FoodCategoryCount;
foodlistテーブル

実行結果は以下のようになる、CREATE VIEWで保存しtSELECT文により作成されたFoodCategoryCountテーブルを取得できた。

FoodCategoryテーブル

VIEWの削除

使い方

DROP VIEW ビュー名;

上記で作成したFoodCategoryCountビューを削除する

DROP VIEW FoodCategoryCount;

Point

CREATE VIEWで保存されているのは、SELECT文であり、テーブルが保存されている訳ではない。



この記事が気に入ったらサポートをしてみませんか?