データベースとは
各データを複数の表(テーブル)に保存し、表を組み合わせて利用するデータベースをリレーショナルデータベース(RDB)と呼びます。

SQLとは
SQL(エスキューエル)とはリレーショナルデータベースを操作するための言語です。

SQLを用いて、データベースのデータを検索したり、データの追加・更新・削除ができます。

カラムとレコード
縦列はカラム名(列名) と呼ばれ、各列のデータの要素名です。
横列1行分のデータを レコード と呼びます。

 

主キー
主キー(プライマリーキー)とは、あるテーブル内のレコードを特定するための一意な値を持つカラムです。
これまで利用していたテーブル users では、 id が主キーになります。

外部キー
この主キーを他のテーブルに「外部キー」として設定し、テーブル同士のデータを紐付けられます。

これが「リレーション」です。


SQL文
①データの取得(SELECT)
SELECT カラム名 FROM テーブル名

・テーブルの全件取得
 SELECT * FROM users

・データを取得するSQLは、 SELECT からはじめます。SELECTは大文字で書いても小文字で書いてもいいです。
・全カラムを取得する場合は、 * を書きます。

・複数の個別の指定したカラムのデータを取得する場合はSELECT の後ろにカンマ(,)で区切ってカラムを指定します。
 SELECT id, name FROM users


②条件指定(WHERE)
・全データの中から条件を指定して、条件に合うデータだけを取り出せる。
Pythonでは条件式の等号は == と書きますが、SQLでは = と書く

SELECT name, kana FROM users
WHERE id = 2


③複数の条件指定
・WHERE句に AND を使うと複数の条件を指定できます。
・WHERE句内に比較演算子のように値の大小の比較、日付の期間などいろいろな条件を指定できます。
・条件が文字列の場合はシングルクォーテーションかダブルクォーテーションで囲みます

SELECT code, name FROM customers
WHERE zipcode = "210-0007" AND rank = "C"

WHERE句に書ける複数の条件を結合する演算子は AND の他に OR などもあります。

注意点
・表示させたいカラム名をSELECTの後に書く
・条件内容はWHEREの後に書く

※最初は条件指定のカラムをSELECTの後に書いたが、エラーになる。



④データのグルーピング(GROUP BY)
・カラムの値が同じものごとにグルーピングできます。

・GROUP BY句は、指定した列の値でデータをグループにまとめます。例えば、GROUP BY rankとすると、rank列の値でグループ分けされます。

書き方

GROUP BY カラム名

 

書き方での結果の違い

①GROUP BY rankがある場合

 SELECT rank, COUNT(*) FROM customers
 GROUP BY rank

 

 結果 A 10  B  11  C  79

 各ランクごとの合計値がでる

 

 

②GROUP BY rankがない場合

 SELECT rank, COUNT(*) FROM customers
 

 結果 A 100

 全てのランクの値を足した合計数字がでる

 

解説

・COUNT(*)の代わりにCOUNT(カラム)とも記述できます。

・COUNT(*)関数は指定された条件に一致する行の数をカウントします。COUNT(*)は全ての行の数を数えるためのものです。
・取得対象は、SELECT rank, COUNT(*)のようにカラムや関数を指定できます。

そのほか
・SELECT COUNT(*)      取得データは、COUNT(*)というカラムになります。値の合計だけがでる。
・SELECT COUNT(*) AS XXX  ASで名前を付けられるのでXXXというカラムで扱えるようになります。



⑤WHEREとGROUPの組み合わせ
・条件指定とグループ指定を同時に行える

 

SELECT rank, COUNT(*) FROM customers
WHERE user_id = 2 
GROUP BY rank

・WHERE user_id = 2をつけることで、GROUP BYでグルーピングする前に、データを絞り込めます。
※WHEREより先にGROUPを指定するとエラーになるので注意



⑥HAVINGとGROUPの組み合わせ

・GORUP BYでグルーピングした結果に、HAVINGで条件をつけられます。

・主に集計関数(例: COUNT、SUM)の結果に対する条件を指定します。

 

書き方

GROUP BY カラム名 HAVING 関数名 <= 12
 

 

 

コード

SELECT rank, COUNT(*) FROM customers
GROUP BY rank HAVING COUNT(*) <= 12

結果
A    10
B    11

 

解説

HAVING COUNT(*) <= 12をつけることで、GROUP BYでグルーピングした後で、データを絞り込めます。

ここでは、データ数が12個以下という条件をつけています。

rank = Cは79個なので除外されました。

SQLでは、下記の順番に処理します。
FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY


WHEREとHAVINGの違い

・WHEREは行単位での絞り込みを行い、HAVINGはグループ単位での絞り込みを行います。

・WHEREは通常、単一の行を対象にしますが、HAVINGはGROUP BY によって作られたグループ全体に対する条件を指定するため、集計結果に対する絞り込みに使われます。


⑦行数指定
SELECT *
FROM earnings LIMIT 6

LIMIT 数字
何行目までを出すか指定できる


⑧SQLの関数の使い方
関数      説明
COUNT     データ数
MIN      最小
MAX       最大
AVG       平均
SUM       合計


使い方
SELECT ordersum, MIN(total), MAX(total),AVG(total), SUM(total), COUNT(total)
FROM earnings 

GROUP BY ordersum 

LIMIT 6
 

※関数はSELECT文の中で使う

※SELECT 句で集計関数(MIN、MAX、AVG、SUM、COUNTなど)を使用する場合、GROUP BY 句で指定された列と SELECT 句で指定された列は通常同じである必要があります。

これは、GROUP BY 句によってグループ化された結果に対して、各グループ内の集計を行うためです。


⑧IN
・INを使うと「カラムの値に特定の要素が含まれるかどうか」を判断できます。

・条件指定なのでWHERE文と一緒に使う
 

書き方

WHERE カラム名 in (条件の値)

条件の値があるカラム名のみ取得できる

SELECT * FROM earnings
WHERE customer_id IN(1, 2, 3)

WHERE customer_id IN (1, 2, 3)とすることで、customer_idが1, 2, 3のデータを取得できる



⑨複雑なIN関数の使い方

SELECT * FROM earnings
WHERE customer_id IN (
    SELECT id FROM customers WHERE rank = "A")

※別のテーブルのカラムと合わせて条件指定がある場合はWHEREの中に別のテーブル名のSELECT文とWHERE文を書くことができる。
earningsテーブルのcustomer_idとcustomersテーブルのidが外部キーとしてつながっている


解説
取得したい条件
customersテーブルのrankが'A'であるcustomers
earningsテーブルのcustomer_idは、customersテーブルのidに対応します。



⑩部分一致の条件指定(WHERE と LIKE)

○○で終わる値、○○で始まる値など一部が一致している要素の値を取得することができる

 

・書き方

 WHERE カラム名 LIKE "条件指定"

 

LIKEでは、下記の文字が使えます。
・%            

 0文字以上の任意の文字列
 

・_(アンダーバー)    

 任意の1文字

 

 

LIKE %A-G%
 Aで終わる文字列、Gで始まる文字列とそれぞれ一致するレコードを指定できる

 SELECT * FROM items
 WHERE itemcode LIKE "%A-G%"


・LIKE と OR の組み合わせ
SELECT * from items
WHERE itemcode LIKE "%A-G_" OR itemcode LIKE "%A-R_" 

※%は0文字以上の任意の文字列ですが、_は任意の1文字にマッチします。XXXXX-YYという形式であれば、%A-G%の代わりに%A-G_とも書けます。


・ANDとNOTの組み合わせ
SELECT * FROM items
WHERE NOT name LIKE "てぶくろ%" AND NOT name LIKE "マーブル%"
LIMIT 5

 

・NOTで否定する
 ANDは○○かつ○○と2つの条件指定をする
 上記はてぶくろで始まる文字列とマーブルで始まる文字列ではない文字列の取得を行っている


・範囲の条件指定
あるカラムが、指定した範囲内に入っているかどうか(X <= カラム <= Y)は、カラム BETWEEN X AND Y

書き方

WHERE カラム名 BETWEEN 1000 AND 2000


SELECT * FROM items
WHERE price BETWEEN 1501 AND 1599

1501~1599までの間の数字という意味



⑪並べ替え
・昇順

ORDER BY カラム名 ASC

コード
SELECT * FROM items
ORDER BY price ASC
LIMIT 5

ORDER BY price ASCは、ASCは省略して、ORDER BY priceとも書けます。


・降順
ORDER BY カラム名 DESC


・昇順と降順の組み合わせ
priceで昇順でソートし、priceが同じ場合にitemcodeで降順にソートする場合は、ORDER BY price ASC, itemcode DESCのように指定します。



⑫テーブルの結合(JOIN ON)

・複数のテーブルからのカラムの値を一緒に取得したい場合にJOIN ONでテーブルを繋げて、適合するカラム名同士を繋げることで一緒に取得することができる。

・複数のテーブルを使う場合、テーブル.カラムのように指定します。
 

 

書き方

SELECT 取得したいカラム名 from  テーブル名1  JOIN  テーブル名2  ON  条件(共通するカラムを=でつなぐ)

SELECT earnings.id, earnings.total, customers.name FROM earnings
JOIN customers ON earnings.customer_id = customers.id
LIMIT 5

解説
SELECT earnings.id, earnings.total, customers.name FROM earnings

 earningsテーブルのidカラムと、totalカラム、さらに下記の条件に対応するcustomersテーブルのnameカラムを取得します。
 複数のテーブルを使う場合、テーブル.カラムのように指定します。
 

JOIN customers ON earnings.customer_id=customers.id

 JOIN テーブル ON 条件で、内部結合できます。
 ONでは、対応させたい2つのテーブルのカラムをテーブル1.カラム1=テーブル2.カラム2と指定します。


内部結合と外部結合

 





⑬データの挿入(INSERT INTO)
書き方
INSERT INTO テーブル(追加したいカラム名) VALUES (追加したい値)


注意
・テーブル sample の id は同じデータの重複を許さないので、2回同じINSERT文を実行するとエラーになります。

・エラーが発生しました: UNIQUE constraint failed: sample.id
 このようにデータの重複を許さないカラムを「UNIQUE制約のカラム」と呼びます。
 データが重複すると辻褄が合わなくなるようなデータに利用します。

・カラムの数と値の数は同じにします。
 カラムの順番は自由ですが、値の順番と同じにします。
 カラムの指定は省略可能です。省略すると、全てカラムを指定したとみなされます。
 指定されないカラムの値は、デフォルト値が使用されます。



⑭レコードの更新(UPDATE)
・テーブル名の要素のうち、条件にあうカラム名の値を更新する
・条件がない場合(テーブルの全データを更新する場合)は、WHERE句は不要です。

書き方
UPDATE テーブル名 SET カラム名1=値1, カラム名2=値2 WHERE 条件


演習
UPDATE users SET name="王貞治" WHERE id=1

解説
・SET 句では、指定した列の値を新しい値に更新します。

・WHERE 句は、更新する行を特定する条件を指定します。このクエリでは WHERE id=1 となっており、id 列が1の行が対象となります。

・usersテーブルでid=1となる全レコード(ここでは1件)について、name='王貞治'と更新します。



⑮レコードの削除(DELETE)
データベースのレコードを削除できます。

書き方

・条件にあうテーブルのカラムを削除
 DELETE FROM テーブル名 WHERE 条件

 

・テーブルを全件削除

 DELETE FROM テーブル名


・条件の後に対象のレコードを記述する