![見出し画像](https://assets.st-note.com/production/uploads/images/74887651/rectangle_large_type_2_8a55b7c67a081326a0c9ed31c03c1230.png?width=1200)
SQL・SELECT文の基本
はじめに
SQLのアウトプットです。
今回はSELECT文の基本をおさらいします。
※RDBMSの説明や、テーブルの説明は省略させていただきます。
学習に使用した教材・参考資料
学習手順
SQLとは
SELECT文とは
SELECT文の基本
WHERE句の使い方
COUNT関数の使い方
ORDER BY句の使い方
GROUP BY句の使い方
HAVING句の使い方
INNER JOINの使い方
LIKEの使い方
BETWEENの使い方
INの使い方
CREATE VIEWの使い方
1. SQLとは
RDBMSをコントロールする為の言語である。
2. SELECT文とは
テーブルからデータを抽出、取得する為の命令文である。
3. SELECT文の基本
書き方
SELECT カラム(列)名
FROM テーブル名;
例
例えば以下のfoodlistテーブルからnameカラムのデータを取得する場合は以下のように記述する。
又は、複数のカラムのデータを取得したい場合は、カラム名とカラム名の間に [,]カンマを入れて連結すると指定した複数のカラムデータを取得できる。
![](https://assets.st-note.com/img/1647873717087-rIklCzdJo0.png)
# nameカラムからデータを取得するクエリ
SELECT name
FROM foodlist;
結果として以下のように取得される
![](https://assets.st-note.com/img/1647874385173-OAXcYLUfes.png)
全てのカラムのデータを取得したい場合は以下のように記述
# 全てのカラムのデータを取得する場合は * をSELECTに記述する
SELECT * FROM foodlist;
以下のようにテーブルに入っているデータ全てを取得できる
![](https://assets.st-note.com/img/1647874878586-KrAAUh0bkH.png)
4. WHERE句の使い方
使い方
SELECT カラム名
FROM テーブル名
WHERE 条件式;
例
例えば以下のfoodlistテーブルから¥300以上するnameカラムにある食材を取得したい場合があるとする、その時に条件式を利用して比較演算子を利用することで可能になる。
# foodlistテーブルから値段が¥300以上するnameカラムにある食材を取得する
SELECT name
FROM foodlist
WHERE price >= 300;
![](https://assets.st-note.com/img/1647875321301-asBpOcbpaK.png)
結果として以下のようになる
![](https://assets.st-note.com/img/1647876026319-slr9UVgiZz.png)
比較演算子
条件式には比較演算子は必須である
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;
![](https://assets.st-note.com/img/1647875321301-asBpOcbpaK.png)
結果として以下のように返ってくる
![](https://assets.st-note.com/img/1647877430228-uGJndHtu6x.png)
カラム名を別名で表示させる
COUNT(*)関数だと表示されるカラム名が何のカウントをしているか分からないのでカウント名を別名で表示することができる
以下のように[AS]を記述してカラム名を記述する
# カラム名に"300円以下の食材数"と表示させる
SELECT COUNT(*) AS "300円以下の食材数"
FROM foodlist
WHERE price <= 300;
結果として以下のようになる
![](https://assets.st-note.com/img/1647878226239-Kq3a38alGg.png)
Point
COUNT(*)はカラムと同じ扱いと考えるので、必ずSELECTの後に記述する
6. ORDER BY句の使い方
使い方
SELECT カラム名
FROM テーブル名
ORDER BY 並べ替えの基準となるカラム名;
例
例えば、値段の安い順番に並べ替えてデータを取得したい場合に使える、デフォルトでは昇順に並び替えてくれるようになっている。
# 食材のnameとpriceを値段の安い順番に並べ替えて取得する
SELECT name, price
FROM members
ORDER BY price;
![](https://assets.st-note.com/img/1647875321301-asBpOcbpaK.png)
結果として以下のように返ってくる
![](https://assets.st-note.com/img/1647879274894-9AIw8nYqzd.png)
降順に取得したい場合は DESC を使う
ORDER BY はデフォルトだと昇順に並べ替えてくれるが、逆に降順に並べ替えたい時は DESC を最後に記述する。
# 値段が高い順に並べ替えて取得するには DESC を使う
SELECT name, price
FROM members
ORDER BY price DESC;
以下のようになる
![](https://assets.st-note.com/img/1647879780039-bPx8VFNKPG.png)
7. GROUP BY句の使い方
使い方
SELECT カラム名
FROM テーブル名
GROUP BY 集約キー;
例
例えば、foodlistテーブルにある食材の値段が同じ価格の物どおしをグループにて、その数を取得したい場合に使える。
# foodlistテーブルにある食材の値段が同じものは何個あるか知りたい
SELECT price, COUNT(*)
FROM members
GROUP BY price;
![](https://assets.st-note.com/img/1647875321301-asBpOcbpaK.png)
結果は以下のとおり
![](https://assets.st-note.com/img/1647880834428-IkVkLLyjDj.png)
GROUP BYを使用する注意点
GROUP BYはORDER BYとは違い注意する制約がいくつかある、それを知らないとエラーの原因になるので注意が必要。
SELECT句で使用できるのは、GROUP BYで使用した集約キー、定数、集約関数だ。nameなどは表示できないのでエラーになる。
AS で別名を命名できない、COUNT(*)を使用しているので、別名をカラム名に命名できそうだが、GROUP BYでは使えない。
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;
![](https://assets.st-note.com/img/1647875321301-asBpOcbpaK.png)
結果は以下になる
![](https://assets.st-note.com/img/1647882701435-oMYbBei0Ej.png)
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;
![](https://assets.st-note.com/img/1648014001737-AYxOVAqIOF.png?width=1200)
![](https://assets.st-note.com/img/1648014070090-Qv02lOtqfc.png)
結果は以下のようになる
foodlistにあるバナナとパイナップルはorigin_idが1なので、産地はoriginlistのidが1のエクアドルと紐づいてるのが確認できる、他の食材は全てorigin_idがユニークなので産地がバラけている、たまたまです。
![](https://assets.st-note.com/img/1648015862002-hly9OwyrSe.png?width=1200)
10. LIKEの使い方
使い方
SELECT カラム名
FROM テーブル名
WHERE 検索対象の対象のカラム名
LIKE '検索文字';
例
LIKEは文字列の部分一致検索をする時に使える。
例えば、foodlistテーブルのnameカラムに「○○さい」という後方に「さい」を含む食材があるか確認したい場合に使える、「はくさい」「ちんげんさい」「さんさい」「てんさい」等がある、その中で「はくさい」の「値段」を取得したい場合は以下のようになる。
LIKEに記述する%は文字の部分一致検索で使用する、
前方一致:('検索文字%')
中間一致:('%検索文字%')
後方一致:('%検索文字')
# foodlistのnameカラムに後方一致で「さい」とつく食材があるか検索して、さらに値段を取得したい
SELECT name, price
FROM foodlist
WHERE name
LIKE '%さい';
![](https://assets.st-note.com/img/1648014001737-AYxOVAqIOF.png?width=1200)
結果は以下のようになる
![](https://assets.st-note.com/img/1648018559146-YXMPFiLFrv.png)
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;
![](https://assets.st-note.com/img/1648014001737-AYxOVAqIOF.png?width=1200)
結果はこうなる
![](https://assets.st-note.com/img/1648021368242-F4BKRA7BWF.png)
12. INの使い方
使い方
SELECT カラム名
FROM テーブル名
WHERE 条件対象のカラム名
IN (検索キーワード);
例
foodlistテーブルから¥150と¥250の食材を取得したい場合は以下のようにクエリを記述する
# foodlistから¥150と¥250の食材を取得したい
SELECT name, price
FROM foodlist
WHERE price
IN (150, 250);
![](https://assets.st-note.com/img/1648014001737-AYxOVAqIOF.png?width=1200)
結果はこうなる
![](https://assets.st-note.com/img/1648022805578-NLoukCB14y.png)
※反対に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;
![](https://assets.st-note.com/img/1648014001737-AYxOVAqIOF.png?width=1200)
実行結果は以下のようになる、CREATE VIEWで保存しtSELECT文により作成されたFoodCategoryCountテーブルを取得できた。
![](https://assets.st-note.com/img/1648027334727-fIfkN2m9Pj.png)
VIEWの削除
使い方
DROP VIEW ビュー名;
例
上記で作成したFoodCategoryCountビューを削除する
DROP VIEW FoodCategoryCount;
Point
CREATE VIEWで保存されているのは、SELECT文であり、テーブルが保存されている訳ではない。