24日目
今日の学習
Ruby
ハッシュで使用頻度の高いメソッド
- keys ... ハッシュのキーを配列として返す
- values ... ハッシュの値を配列として返す
- has_key? / key? / include? / member? ... ハッシュの中に指定されたキーが存在するか確認する
||= を使った自己代入
X ||= A X = X || A と同義
変数Xが、nil
またはfalse
なら、AをXに代入。
変数Xがnil
でもfalse
でもない場合は、Xが真となるが、もしもnil
またはfalse
ならばAが代入されるという形になる。
Rubyではnil
またはfalse
は偽、それ以外は全て真として扱われる。
!!を使った真偽値の型変換
以下のようなメソッドで、データが存在するかどうかを判定したいとする。
def data_exists? data = find_data if data true else false end end
データが見つかればtrue
を返してくれて、見つからなければfalse
が返ってくる。
このコードを、!!
をつけて値をtrue
またはfalse
のどちらかに変換することで、短くコードを書くことができる。
def data_exists? !!find_data end
!
は否定の演算子で、単体だと真であればfalse
、偽であればtrue
を返すが、もう一度!
をつけて反転させることにより、真であればtrue
、偽であればfalse
の結果を得ることができる。
SQL
普段使っているSQLはPostgreSQLだが、あまりちゃんと理解していないと感じたのでドットインストールで学習した。
PostgreSQL入門 (全16回) - プログラミングならドットインストール
いつもrails generate model ~~~
でデータベースを作っているが、それぞれどういう意味を持つのか理解したい。
rails generate migrationコマンドまとめ - Qiita
このまとめはとても参考になった。
制約
データの型に制約をつけることができる。
- not null :空の値の場合はエラー
- unique :重複した値を許さない
- default :デフォルトの値を決められる
- check :内容のチェックが可能
例えば、titleというフィールドでは5文字以上の入力のみを受け付けたい場合に、check(length(title) > 5)
のように記述する - primary key :not null, unique両方の性質を持つ
:referencesとすることで設定できる
insert文
レコードの挿入ができる。
データを入れたいフィールドを書いたあとに、values
と書いて該当のフィールドに入れたい値を入力していく。
テーブルの列名なし
insert into テーブル名 values('値1' ... )
テーブルの列名あり
insert into テーブル名(テーブルの列名 ... ) values ('値1' ... )
例えば、postsテーブルのtitleフィールドに「タイトル」、bodyフィールドに「こんにちは」と入力する場合は、
insert into posts(title, body) values('朝です', 'おはよう');
と入力する。
なお、一度に沢山のデータを挿入したい場合は、以下のようにデータごとにカンマで区切って書けばOK。
insert into posts(title, body) values ('朝です', 'おはよう'), ('昼です', 'こんにちは'), ('夜です', 'こんばんは');
select文
name, age, class, scoreという情報を持った、usersテーブルがあると仮定する。
*
*
は、全てのフィールドを表示する命令。
usersテーブルの情報を全て閲覧したいときは、以下のように記述する。
select * from users;
一部のフィールドを表示したい
select
の後にフィールド名を指定する。
usersテーブルのname、ageフィールドだけ確認したいときは、以下のように記述する。
select name, age from users;
where句
特定のデータのみ抽出したい場合、where
を使用してレコードを抽出することができる。
例えば、登録されているデータの中で15歳以上の人のデータを取り出したいときは、以下のように記述する。
select * from users where age >= 15;
like句
任意の文字が含まれているレコードを抽出する。
完全一致
nameが[alice]という人を抽出したい場合。
select * from users where name like 'alice';
部分一致(ワイルドカード検索)
上のように、完全一致ではなく部分的に一致している人を抽出したい場合。
%で文字を区切る
nameの最初が[a]から始まる人を抽出したい場合。
select * from users where name like 'a%';
nameの最後が[a]の人を抽出したい場合。
select * from users where name like '%a';
nameのどこかに[a]が入っている人を抽出したい場合。
select * from users where name like '%a%';
レコードの並び替え
order by
order by
の後に、フィールドの名前を書く。
例えば、年齢が小さい順(昇順)に並び替えたい場合は、以下のように記述する。
select * from users order by age;
また、大きい順(降順)に並び替えたい場合は、desc
をつける。
select * from users order by age desc;
order by
の後につけるフィールド名は、複数つけてもいいので、例えばクラス内で年齢が若い順に並べたい場合は、以下のようにする。
select * from users order by class, age;
取得するデータの件数制限
limit
例えば、取得件数を最初の3件のみにしたい場合は、以下のようにする。
select * from users limit 3;
offset
開始位置を指定する場合に使う。データの開始は0からであることに注意。
例えば、登録された4番目のデータから表示したい場合は、以下のようにする。
select * from users offset 3;
レコードの集計
count
レコードの件数が何件かを取得できる。
select count(*) from users; #=> usersテーブルに何件のデータが投稿されているのか分かる
distinct
指定したカラムにおいて重複するデータを取り除いて出力する。カラムにどんなデータがあるのか確認したいときに使える。
select distinct class from users; #=> 例えばA組、B組、C組...など登録されているデータを表示してくれる
sum, avg, group by
データの合計や平均を出すことができる。
例えば、得点(score)の合計や平均を出したい場合は、以下のように記述する。
select sum(score) from users; #=> 得点の合計値を算出 select avg(score) from users; #=> 得点の平均値を算出
もしも、クラスごとに得点の平均値を出したいという場合は、group by
を活用する。
select class, avg(score) from users group by class;
max, min
最大値、最小値を出すことができる。
having
集計したものに対して、さらに条件をつけたい場合はhaving
を使用する。
例えば、クラスの得点の合計値が50以上のものを抽出したい場合は、以下のように記述する。
select class, sum(score) from users group by having sum(score) > 50;
データの更新と削除
updateで更新
update テーブル名 set 列名 = 更新後のデータ
例:tanakaさんはA組だが、B組にクラスを変更したい
update users set class = 'B組' where name = 'tanaka';
delete
delete from テーブル名
このまま書くと全てのデータが消えてしまうが、この後ろに条件をつけると、特定の条件を持ったデータのみを削除することができる。
例:D組の人のデータを削除したい場合
delete from users where class = 'D組'
PostgreSQL
今活用しているSQLがPostgreSQLなので、PostgreSQLに用意されている関数についてもまとめておく。
length
文字数を調べるときに使う関数。
例:名前、名前の文字数を表示させたい場合は、以下のように記述する。
select name, length(name) from users;
concat
文字列を連結させることができる。
例:名前(該当するクラス)のように表示させたい場合は、以下のように記述する。
select concat(name, '(', class, ')') from users; #=> concat ------------ 田中(A組) ...
as
カラム名に別名をつけてデータを取得できる。
例えば、上のconcat
で取得したもののカラムはconcat
となっているが、concatという関数表示を別の名前にしたい場合はasを使用する。
select concat(name, '(', class, ')') as student from users; #=> student ------------ tanaka(A組) ...
substring
文字列の一部を切り出す。
substring(切り取る対象, 文字の開始位置, 長さ)
例:名前の最初一文字目だけを切り出して表示する
select substring(name, 1, 1) as initials from users; #=> initials ----------- t k ...
random
ランダムに抽出することができる。
例:登録されているデータを一つだけランダムに抽出する場合
select * from users order by random() limit 1;
SQLのインデックス
よく使用されるデータに関して、テーブルに索引をつけると検索が早くなるらしい。
ただし、レコードを挿入・更新する際に新しくインデックスが作り直されるので、挿入・更新は遅くなってしまうため、何につけるべきかは考える必要がある。
primari key
には最初からインデックスがついている。
https://style.potepan.com/articles/25208.html
まだ明確に使うべき場所に対して検討がつかないが、頭の片隅に置いておきたい。
HTML
sectionタグとは
何かひとつ、簡単なサイトを作ってみた方がいいかなと思い、HTMLに立ち返ってドットインストールで学習していると、section
タグなるものが出てきた。
Progateで学習しているときは、section
タグを見た記憶がなかったので、div
ではないの?違いは何?となった。
section要素って何?div要素とどう違うの? | なすのWebエンジニア修行ブログ
まったく同じ方が記事を書いていた。
正直なところ、使った方がよりよくなるのは分かるが、ただでさえ何をdiv
で囲めばいいのか困惑しながらProgateを進めていた身としては、さらに要素が増えたということでとても難しく感じる。
Progateが教えてくれない、マークアップの考え方|にゃんこ@マークアップの人|note
マークアップするということが重要であることを説かれている。
分からないから適当でいいやと思わず、間違ってしまってもいいので今度からsection
タグも使ってみようと思った。
MDN(サイト)
HTMLの、このタグにはこのタグを親として使えるのだろうか、などを調べるときに有用なサイト。
困った時は許可されている内容の部分に着目して、使ってもよいかどうか判断したい。