🙌

SQLの基本のき(備忘録)

2024/07/21に公開

⚫︎文法

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