開始55日目〜超初心者、文系、30代のスタート〜
本日学んだこと:
SQL(Structured Query Language)はリレーショナルデータベース(RDB)の操作を行うための言語
リレーショナルデータベースとは、私たちが今まで使ってきたように、データをテーブルという表形式の構造で管理するデータベースのこと
Webアプリケーションを作成する際は一般的にリレーショナルデータベースが使用される。
接続先を誤った場合:
/github unsubscribe yousan/typescript3_jest_circleとslackに入力すれば、接続が解除される。
SQLについて:
SHOW DATABASES;
→ターミナルで実行すると、データベースを一覧で表示するSQL文。
CREATE DATABASE;
→ターミナルで実行すると、指定した名前のデータベースが作成。
USE;
→ターミナルで実行すると、データベースを選択するSQL文。
SHOW TABLES;
→ターミナルで実行すると、選択したデータベースに存在するテーブルを一覧で表示するSQL文。
CREATE TABLE;
→ターミナルで実行すると、テーブルを作成するためのSQL文です。
SHOW columns FROM テーブル名;
→ターミナルで実行すると、実行結果から、テーブルにあるカラムを確認できる。
ALTER TABLE文;
カラムの追加・修正・削除はすべてテーブル構造の変更です。
1つのカラムを追加する場合
→ALTER TABLE テーブル名 ADD カラム名 カラムの型;
2つ以上のカラムを追加する場合
→ALTER TABLE テーブル名 ADD (カラム名 カラムの型, ……);
ALTER TABLE テーブル名 CHANGE 古いカラム名 新しいカラム名 新しいカラムの型;
→カラムの修正を行う。
→カラムの削除を行う。
INSERT;
→テーブルにデータを登録するためのSQL文です。
全てをカラムに入れる場合;
INSERT INTO テーブル名 VALUES(値1, 値2, 値3);
特定のカラムのみに値を入れる場合;
INSERT INTO テーブル名(カラム名1, カラム名2) VALUES(値1, 値2);
データの更新にはUPDATE文を使用します。UPDATE テーブル名 SET 変更内容 WHERE 条件;
テーブルにあるデータを削除するためにはDELETE文を使用します。DELETE FROM テーブル名 WHERE 条件;
ターミナルからではなくSequelProからSQL文を実行する理由
・検索は長いSQL文を要するが、タイプミスをしたときにその部分だけを直せば再実行が出来る
・検索は場合によって非常に多くの出力を伴うが、それによって実行したSQL文が流れることがないため見やすい
・SQL文の文末に " ; "(セミコロン)を付ける必要がない
データベースについて
基本的な検索構文:
FROM テーブル名→テーブル名の指定
SELECT句においては、アスタリスクが"全てのカラムを取得する"という意味のワイルドカードとして定義がされているため、このように指定することで全てのカラムの取得が出来た。
WHERE 条件→取得するレコードの条件を指定し、その条件が正のレコードを取得。
例文)
WHERE id = 1
WHERE family_name = "阿部"
WHERE id <= 5
AND演算子は複数の条件を指定して式を作り、その条件が全て正であるとき、式が正となります。
WHERE a AND b
OR演算子は複数の条件を指定して式を作り、その条件のうちどれか1つ以上が正となれば、式は正となります。
WHERE a OR b
NOT演算子は1つの条件を指定して式を作り、式の正誤はその条件と逆のものになります。
WHERE NOT a
BETWEEN演算子は1つのカラムに対し上限と下限を指定して式を作り、カラムの値がその範囲に含まれるとき、その式は正になるという演算子です。
WHERE カラム名 BETWEEN 下限 AND 上限
IN演算子は1つのカラムに対しリストを指定して、カラムの値がそのリストに含まれるとき、その式は正になるという演算子です。
WHERE カラム名 IN (値1, 値2, ……)
CONCAT関数は複数の文字列を連結させることが出来る関数です。
CONCAT(文字列1, 文字列2, ……)
SELECT句でデータを取得するとき、AS句を併用すると、そのカラムに別名を付けることが出来ます。
SELECT 取得するデータ AS 別名
DISTINCTキーワードを使用すると、指定したカラムの値が重複する行を除外してデータを取得することが出来ます。
SELECT DISTINCT カラム名
GROUP BY句を使用すると、指定したカラムが同じ値を持つデータを1つのグループとしてまとめることが出来ます。
GROUP BY カラム名
COUNT関数はグループ化されたデータに対して使用することが出来る集計関数の一つです。
COUNT関数はカラムを指定して使用することで、そのカラムの値がNULLでないデータの行数を取得することが出来ます。
SELECT COUNT(カラム名)
SELECT COUNT(*)←NULLも含めてデータを取得する。
JOINを使用すると、指定したそれぞれのテーブルの、カラムの値が一致するデータを結合することが出来ます。
JOIN句はFROM句のあとに記述し、結合の対象となるテーブルを指定します。
そしてそれぞれのテーブルの結合するカラムをONの後に=(イコール)を用いて指定します。
FROM テーブル名1
JOIN テーブル名2 ON テーブル名1.カラム名1 = テーブル名2.カラム名2
例文)
FROM shifts
JOIN users ON shifts.user_id = users.id
→このSQL文は、
「"shifts"テーブルに"users"テーブルを結合させます。
"shifts"テーブルの各行には、その行の"user_id"が"users"テーブルの"id"と一致する行を結合させます。」
→各テーブルに別名を付け、その名前で扱うのが良い
FROM shifts s
JOIN users u ON s.user_id = u.id
→FROMやJOINでテーブル名を指定する際、ついでにそのテーブルの別名も指定しています。
このとき別名は、"shifts"テーブルならs、"users"テーブルならuのように、各テーブル名の頭文字を取ってあげるのが一般的となります。
●データベース設計について
サービスで扱うデータを定義することエンティティ
→サービスの中で管理する必要のある概念(情報)を指します。
例えば、SNSなどのサービスでは「ユーザー」や「投稿内容」、「コメント」などの情報を管理する必要があります。これらの情報がエンティティにあたります。
エンティティの属性
映画というエンティティであれば、タイトルや説明、公開日、監督などが属性。
リレーションとは、エンティティとエンティティとの間に存在する関係性のこと
例)映画には、その映画を撮った監督がいます。こういった場合映画と監督の2つのエンティティには関係性がある。
データベース設計の手順
- データベースで管理するデータ(エンティティ)を決める
- それぞれのデータの持つ属性を決める
- エンティティ同士の関係性を決める(リレーション)
- データを実際にデータベースのテーブルとして定義する
キーには以下の2種類があります。
- 主キー・・・テーブルの中で他のレコードとの区別をつける識別子となるカラム
- 外部キー・・・関連する他のテーブルのレコードの主キーを値として持つカラム
一意性制約はテーブル内で重複するデータを禁止する制約です。
emailカラムに対して一意性制約を設定すると同じemailのレコードは保存できなくなります。
では、実際に一意性制約の挙動を確認してみましょう。
一意性制約はテーブル内で重複するデータを禁止する制約です。emailカラムに対して一意性制約を設定すると同じemailのレコードは保存できなくなります。
add_index :テーブル名, :カラム名, unique: true
主キー制約は、主キーである属性値が必ず存在してかつ重複していないことを保証する制約です。
外部キー制約とは、外部キーに対応するレコードが必ず存在することを保証する制約です。
インデックスのデメリット:
- データを保存・更新する速度が遅くなる
- データベースの容量を使う
User.where(name: '山田太郎', email: 'taro@mail.com')
→検索速度が向上する。
明日やること:
カリキュラムを進める(SassもしくはBEMまで)。
感想:
毎回こんな調子で、エンジニアになれるのか。
そもそも課題をクリアできるのか。
あまりにも人より遅すぎるんじゃないのか。
人前では出さないようにしているが、正直つらい、きつい、苦しい、何も面白さを感じなくなった。
今回エンジニアを目指すと公言しているが、このままだと、とてもじゃないが公言できるレベルではない。