見出し画像

第4回 SELECTでデータを取得する

こんにちは。

今回はテーブルのレコードを取得します。

レコード...テーブルの1行あたりの単位
カラム...テーブルの1列あたりの単位

画像1

第2回で作った和菓子テーブル↓

CREATE TABLE wagashi
(
No INT NOT NULL PRIMARY KEY,
name VARCHAR (50),
bunrui VARCHAR (50),
konyuubi DATE,
kakaku VARCHAR (10)
)

第3回でインサートした和菓子データ↓

INSERT INTO wagashi/*入れたいテーブル名*/
VALUES
(1,'Sakuramochi'/*桜餅*/,'mochi'/*餅*/,'2020/04/01','100yen'),
(2,'Wakaayu'/*若鮎*/,'mochi'/*餅*/,'2020/04/15','200yen'),
(3,'Oshiruko'/*お汁粉*/,'anko'/*あんこ*/,'2019/11/12','100yen'),
(4,'Mitarashidango'/*みたらし団子*/,'dango'/*団子*/,'2020/1/20','100yen'),
(5,'Dorayaki'/*どら焼き*/,'anko'/*あんこ*/,'2020/2/7','300yen')

今回使う雛形↓

SELECT 
FROM wagashi/*FROMの後ろはテーブル名入れる*/

もくじから気になる項目に飛んでみてください。


1.全てのレコードを取得(*を入れる)

とりあえず全部取得してみましょう。

SELECT *
FROM wagashi /*FROMの後ろはテーブル名入れる*/

*(アスタリスク)...ワイルドカードで「0文字以上」の意味。
ワイルドカード...特殊な文字列。

ワイルドカードについてはうまく説明できないので参考を見たほうがわかりやすいです。
ざっくりイメージですが、「*」単体だと「0文字以上の全て」を持ってきます。
単体以外だと、たとえば「Sakura *」と入れると「Sakura(の後ろに0文字以上あるもの全て)」を持ってきます。
まあ使っていくうちに慣れるのであんまりガチガチに理解しなくてもいいと思います...

参考:ワイルドカード (wildcard)
   ワイルドカードの使い方と意味


さて。F5で実行すると下にテーブルが出てきます。

画像2

こんな感じ。
テーブルに入ってる全部のデータを持ってきました。


2.1つの項目(カラム)名に絞って全レコード取得(項目名を入れる)

縦1列持ってきたいな~という時に使います。

SELECT bunrui/*テーブルに登録されてる項目名入れる*/
FROM wagashi /*FROMの後ろはテーブル名入れる*/

F5で実行。項目(カラム)が絞られたテーブルが出てきます。

画像3

終わり。
CREATE(第2回)とINSERT(第3回)に比べて簡単すぎません...?個人の感想ですが...。


3.複数の項目(カラム)名を絞って全レコード取得(項目名を,で区切って入れる)

複数列持ってきたいな~と思ったとき。区切るだけです。

SELECT name,konyuubi/*テーブルに登録されてる項目名入れる*/
FROM wagashi /*FROMの後ろはテーブル名入れる*/

F5実行。

画像4

ちゃんと指定した項目(カラム)名が持ってこられてますね。えらいぞ~

4.条件を設定して特定のレコードを取得

レコードも絞りたいな~と思ったときに使うやつ。

SELECT *
FROM wagashi /*FROMの後ろはテーブル名入れる*/
WHERE bunrui = 'mochi'

WHEREがしれっと増えましたね。
WHERE is どこ。
英語苦手なのでWhereの意味すらGoogle先生に聞いちゃいました。
意味をコメントで書くとこんな感じです

SELECT */*0文字以上の全て*/
FROM wagashi /*FROMの後ろはテーブル名入れる*/
WHERE bunrui /*どこの? 分類の*/ = 'mochi'/*餅*/

WHEREのうしろに「項目(分類名)名」
=のうしろには「項目(カラム)に入ってる絞りたいデータ名」を入れます。
つまり文章にすると「分類項目の餅だけ持ってきて」というクエリ。
改めて文字起こしするとしょうもなさが際立ちますね。

F5
で実行。

画像5

条件で指定した通り、分類に餅が入ってるレコードだけ持ってきました。すごいぞ~


5.複数の条件を設定して特定のレコードを取得

条件いくつかつけてレコードがほしいかもな~?と思ったときに使えます。
多分一番実用的なのはこれかもしれません。

SELECT *
FROM wagashi /*FROMの後ろはテーブル名入れる*/
WHERE bunrui = 'mochi'
      AND konyuubi/*加えて 購入日の*/ >=/*≧ それかそれ以上*/ '2020/04/10'

ANDが増えました。しかも=の前に不等号がついてます。
書き下し文は「分類が餅で、加えて購入日が2020/4/10以降のもの」です。

F5で実行すると...

画像6

「分類が餅で、加えて購入日が2020/4/10以降のもの」、若鮎だけひっかかりました。

WHEREをつけたあと、実はANDに限らずいろんな条件(比較演算子)を付けられます。
この条件(比較演算子)を覚えるのが多分業務上、肝になってくると思います。個人的には、実際に使用していて出てきた端から逆引きしてよく使う比較演算子だけ覚えてもいいと思います
詳しく知りたい場合は、↓の参考を見てください。

参考:WHERE 句でよく使う比較演算子


おまけ.DISTINCTを入れる

そもそもDISTINCTって何?字面からまったくわからない。
調べたことを要約すると、「ダブってる値が入ってたら一個にする」。
Excelでいうところの重複値の削除みたいなものかな?

早速使ってみましょうか。

SELECT DISTINCT bunrui /*項目(カラム名)を指定*/
FROM wagashi /*FROMの後ろはテーブル名入れる*/

F5で実行

画像7

指定したカラム(分類)のみ、重複値が削除されて出力されました。

画像8

価格を指定した場合。
重複がない項目を指定した場合は普通にカラム指定で全レコードをもってきました。
「SELECT DISTINCT *」にした場合も「SELECT *」と同じ結果が出力されました。
つまりDISTINCTは

・項目(カラム)名を指定しないといけない
・指定されたカラムに重複値がなければそのまま出力される

らしいですね。やっぱりExcelでいうところの重複値の削除じゃん...。


おまけ2 複数テーブルからデータを取得する

事前準備として適当にテーブルを作ります。

CREATE TABLE wagashiKounyusya
(
name VARCHAR (50),
kounyusya VARCHAR (50) NOT NULL,
)

和菓子購入者テーブル。
続けてちゃきっとデータをインサート。

INSERT INTO wagashiKounyusya
VALUES
('Sakuramochi'/*桜餅*/,'Asan'/*Aさん*/),
('Wakaayu'/*若鮎*/,'Asan'/*Aさん*/),
('Oshiruko'/*お汁粉*/,'Csan'/*Cさん*/),
('Mitarashidango'/*みたらし団子*/,'Bsan'/*Bさん*/),
('Dorayaki'/*どら焼き*/,'Csan'/*Cさん*/)

画像9

こんな感じのテーブルができました。

さて本題。

SELECT
wagashi.No,/*和菓子テーブルのNo*/
wagashi.bunrui,/*和菓子テーブルの分類*/
wagashi.konyuubi,/*和菓子テーブルの購入日*/
wagashiKounyusya.kounyusya,/*和菓子購入者テーブルの購入者*/
wagashi.kakaku/*和菓子テーブルの価格*/

FROM
wagashi,
wagashiKounyusya /*FROMの後ろはテーブル名入れる*/

WHERE
wagashi.name = wagashiKounyusya.name/*同じ項目(カラム)名をイコールで繋げる*/

・SELECTの後ろは「テーブル名.カラム名」
・WHEREでテーブル同士のかぶっているカラム名を指定

F5で実行。

画像10

中々に玄人っぽい感じが出てますね。

ちなみに。
もっとシュッとさせたい場合。

SELECT
W.No,
W.bunrui,
W.konyuubi,
WK.kounyusya,
W.kakaku

FROM
wagashi W,
wagashiKounyusya WK /*FROMの後ろはテーブル名入れる*/

WHERE
W.name = WK.name/*カラム名をイコールで繋げる*/

FROMテーブル名の後ろに略称を設定すると、SELECTやWHEREで使っていたテーブル名を略称にすることができます。
略称は好きなものでOK。

画像11

SQLで言ってることは同じなので、同じ結果が得られます。

参考:SELECT文で複数テーブルを結合して取得する


おわりに

SELECT、第2回や第3回に比べるとだいぶわかりやすかった気がします。
ただWHEREが絡んでくると一気に幅が広がる分、めちゃめちゃややこしくなりそうですね。

次回は取得したデータの並び替えをします。


2020/4/22追記 おまけ2を書き足しました。


参考(順不同)
DISTINCTの意味・解説
テーブルから全レコードを取得する
カラム (column)
用語集|レコード

いいなと思ったら応援しよう!