SQLの基本のき(備忘録)
⚫︎文法
SELECT
select 行の名前 from テーブル名
⚫︎ SELECTのオプション群
- AS・・・as により別名を定義できる (oracleDBは不可)
例)
SELECT 費目 AS ITEM,
UPDATE
UPDATE テーブル名
SET 列名 = 値,列名 = 値
WHERE 条件
DELETE
DELETE FROM テーブル名 WHERE 条件
INSERT
INSERT INTO テーブル名
(列名1,列名2,列名3)
VALUE (’値1’, ’値2’, ‘値3’)
上記の4つのSQL 命令をDML(Data Manipulation Language)という。
命令 | 各命令の固有 | 絞り込み | 検索結果の加工 |
---|---|---|---|
SELECT | 列名••• FROM テーブル名 | WHERE | その他修飾 |
UPDATE | テーブル名 SET 列名 = 値 | WHERE | |
DELETE | FROM テーブル名 | WHERE | |
INSERT | INTO テーブル名(列名) VALUE(値) |
⚫︎WHERE
DBMSはwhereで絞り込んだ値を一行ずつ該当するかチェックを行いながら
操作を行う。
そのため、where句では結果が必ずtrue,falseのどちらかになるものしか書けない
DELETE FROM 家計簿 WHERE 出勤額 > 0
⚫︎比較演算子
比較演算子 | 意味 |
---|---|
= | 左右が等しい |
> | 左は右より小さい |
< | 左は右より大きい |
<= | 左は右 以下 |
>= | 左は右 以上 |
<> | 左右が等しくない |
⚫︎NULL
①IS NULL
②IS NOT NULL
例)
SELECT *
FROM 家計簿
WHERE 出金額 IS NULL
- NULLの意味
①格納すべきデータが不明な状態 (何を登録すべきか不明な場合など)
②データの格納自体が無意味な状態 (出金の操作しか行っていない場合、入金の欄に何かを格納することはそもそも無意味)
⚫︎LIKE
パターンマッチングにLIKEを使う。
パターンマッチング・・・文字列が、あるパターンに合致しているのかを判定する。
LIKE演算子に使える記号
- % 任意の0文字以上の文字列
- _ 任意の1文字
例)
SELECT * FROM 家計簿
WHERE メモ LIKE ‘%1月%’
1月の前後に0文字以上の文字がついている
%1月・・・1月で終わる。
1月_・・・1月で始まりその後ろに任意の文字列を意味する。
※記号を含む文字を検索したい時
ESCAPE句で指定した文字に続く%や_はパターン文字ではなくただの文字として扱われる。
SELECT * FROM テーブル名
WHERE カラム名
LIKE ‘%100$%’ ESCAPE ‘$’
⚫︎BETWEEN
「値1」以上〜 「値2」以下の場合真になる
SELECT *
FROM テーブル名
WHERE カラム名 BETWEEN 値1 AND 値2
⚫︎IN
括弧内に列挙した複数の値のうち、いずれかが一致するかを判定する。
SELECT *
FROM テーブル名
WHERE カラム名 IN ('値1','値2')
NOT IN
どれも一致しないことを判定
SELECT *
FROM テーブル名
WHERE カラム名 NOT IN ('値1','値2')
⚫︎ANY / ALL
ANY
値と比較していずれかが真なら真
SELECT * FROM テーブル名 基本比較演算子 ANY (値1、値2、値3)
ALL
値と比較して全てが真なら真
SELECT * FROM テーブル名 基本比較演算子 ALL (値1、値2、値3)
⚫︎論理演算子
⚫︎AND / OR
UPDATE
SET 価格 = 6200
WHERE 名称 = 'スッキリ勇者クエスト'
AND
販売店 = 'B'
⚫︎NOT演算子
NOT演算子は真偽値の逆転を起こす。
WHERE NOT 販売店 = 'B'
販売店がB以外の行
WHERE 販売店 <> ‘B’ と同意
⚫︎論理演算子の優先度
NOT→AND→OR
(高→低)
⚫︎複数条件の検索の仕方
例)「販売店AかBで売っている、ゲームかDVD」を検索したいとする
※問題のあるコード
SELECT *
FROM テーブル名
where
販売店 = 'A' --条件式1
OR
販売店 = 'B' --条件式2
AND
カテゴリ = 'ゲーム' --条件式3
OR
カテゴリ = 'DVD' --条件式4
この場合ANDが優先されるため、
条件式2と条件式3が優先的に処理される。
欲しかった結果とは違う答えになってしまう。
正しいコード
SELECT *
FROM テーブル名
where
(販売店 = 'A'
OR
販売店 = 'B')
AND
(カテゴリ = 'ゲーム'
OR
カテゴリ = 'DVD')
このようにカッコは優先順位を引き上げることになる。
カッコでくくることによって求めていた答えが得られる。
主キーと複合主キー
主キー(PRIMARY KEY)
- 自然キー(natural key)・・・社員番号など自然に発生した一意の値
- 人工キー(artificial key)、代替キー(surrogate key)・・・管理目的のためだけに割り振られたID
複合主キー(composite key)
単独の列だけでは重複があり判別できないが、複数のerつを組み合わせれば重複の可能性はなくなる。
このように複数の列を1つの主キーとするものを複合主キーと呼ぶ。
⚫︎書き方
- 整形されたSQL 文を書こう
❌
SELECT 費用, 出金額 FROM 家計簿 WHERE 出金額 > 3000
⭕️
SELECT 費用, 出金額
FROM 家計簿
WHERE 出金額 > 3000
- コメントの記述方法
① - - 行末までをコメント
② /* */ 内部をコメント
- リテラル
SQL 文に書かれた具体的なデータ
例)INSERT INTO ‘家計簿’ VALUE(’2024-02-05’, ‘居住費’, 0,)
ここでいうvalueの値がリテラルに当たる。
リテラルのルール
①シングルクォーテーションで括らず記述されたリテラルは、数値情報として扱われる。
②シングルクォーテーションで括られたリテラルは、基本的に文字列情報として扱われる。
③シングルクォーテーションで括られた、かつ’2024-02-25’のような形式のリテラルは日付情報として扱われる。
- データ型
データ種別 | 区分 | 代表的なデータ型 |
---|---|---|
数値 | 整数 | INTEGER , INT |
小数 | DECIMAL, NUMERIC, FLOAT, DOUBLE, REAL | |
文字列 | 固定長型 | CHAR |
可変長型 | VARCHAR | |
日付と時刻 | TIMESTAMP, DATETIME, DATE, TIME |
補足:CHARとVARCHAR
CHAR(固定長型)・・・CHAR(10)の場合、10バイト満たない文字は後ろに空白を追加することで10
バイトぴったりにしてから格納される。郵便番号など桁数が一定のものに使う。
VARCHAER(可変長型)・・・VARCHAER(10)の場合、7バイトなら7バイトのまま、3バイトなら3バイトのまま格納される。氏名や書籍名など、桁数が一定でないものに使う。
Discussion