今回はSQLを用いた操作する行の絞り込みについて、まとめていきたいと思います。
過去の関連投稿
「SQLの基礎について学ぶ#01」
「SQLの基礎について学ぶ#02」
「SQLの基礎について学ぶ#03」
1. 複数条件を組み合わせる
ここでは以下のテーブルを使用していきます。
listテーブル
category(分類) | name(名称) | store(販売店) |
---|---|---|
野菜 | にんじん | 販売店A |
果物 | みかん | 販売店A |
野菜 | きゅうり | 販売店B |
果物 | りんご | 販売店B |
肉類 | 牛肉 | 販売店B |
野菜 | キャベツ | 販売店B |
野菜 | トマト | 販売店A |
肉類 | 豚肉 | 販売店A |
論理演算子
代表的な演算子としてAND演算子OR演算子があります。
▶ 2つの条件式の両方が真の場合のみ、真となる(AかつB)
条件式1 AND 条件式2
▶ 2つの条件式のどちらかが真の場合のみ、真となる(AまたはB)
条件式1 OR 条件式2
/* AND演算子 販売店がAかつ分類が野菜の行を取得する */
SELECT *
FROM list
WHERE store = '販売店A'
AND category = "野菜"
結果
category(分類) | name(名称) | store(販売店) |
---|---|---|
野菜 | にんじん | 販売店A |
野菜 | トマト | 販売店A |
/* OR演算子 販売店がAまたは分類が肉類の行を取得する */
SELECT *
FROM list
WHERE store = '販売店A'
OR category = "肉類"
結果
category(分類) | name(名称) | store(販売店) |
---|---|---|
野菜 | にんじん | 販売店A |
果物 | みかん | 販売店A |
肉類 | 牛肉 | 販売店B |
野菜 | トマト | 販売店A |
肉類 | 豚肉 | 販売店A |
論理演算子の優先度
複数の論理演算子が使用されている場合は
(1)NOT、(2)AND、(3)ORの優先順位によって処理が行われます。
よって複数の論理演算子を使用する場合は以下のSQL文ように()括弧を用いて、その評価の優先順位を上げる必要があります。
SELECT *
FROM account
WHERE (store = '販売店A' OR store = '販売店B')
AND (category = '果物' OR category = '肉類')
結果
category(分類) | name(名称) | store(販売店) |
---|---|---|
果物 | みかん | 販売店A |
果物 | りんご | 販売店B |
肉類 | 牛肉 | 販売店B |
肉類 | 豚肉 | 販売店A |
2. 主キーの必要性について
次はこのテーブルを使用して説明します。
accountテーブル
date(日付) | name(項目名) | price(金額) |
---|---|---|
2020-12-03 | お茶 | 100 |
2020-12-03 | お茶 | 100 |
2021-01-02 | 電車代 | 2000 |
上記のテーブルで、1行目のお茶だけ削除したい場合には、どうすればよいのでしょうか?
DELETE FROM account
WHERE name = '2020-12-03' AND price = 100
これでは2行目のお茶も削除してしまいます。データとしては2つの行は全く同じものであるためそれぞれを区別する手段がありません。つまり、ある特定の行だけを区別して操作することができないことを意味します。
▶ 重複するデータが存在してしまうテーブルは構造自体に問題がある!!
▶ これを解決するため主キーという考え方がある。
主キーとなる列を作成する
主キーとは
▶ 主キーによって、テーブル内の1つ1つのデータが識別可能。
▶ 主キーには必ず何らかのデータが格納される。(NULLではない)
▶ 他の行と値が重複しない。
▶ 複数の列を組みわせて複合主キーを構成して、行を識別することもできる。
改善したテーブル⬇⬇⬇
id | date(日付) | name(項目名) | price(金額) |
---|---|---|---|
1 | 2020-12-03 | お茶 | 100 |
2 | 2020-12-03 | お茶 | 100 |
3 | 2021-01-02 | 電車代 | 2000 |
▶ 重複しないIDをデータ毎につけることで、複数の行が絶対重複しないようにする。(例: 会員番号、社員番号など)
まとめ
今回はここまでです!SQLについて引き続き学び、また次回投稿していきたいと思います!!