プログラミング備忘録

プログラミングの学習状況をメモしています

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

普段使っているSQLPostgreSQLだが、あまりちゃんと理解していないと感じたのでドットインストールで学習した。

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
('朝です', 'おはよう'),
('昼です', 'こんにちは'),
('夜です', 'こんばんは');

SQL文は、最後にセミコロン;を必ずつけること!

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

今活用しているSQLPostgreSQLなので、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(サイト)

開発者向けのウェブ技術 | MDN

HTMLの、このタグにはこのタグを親として使えるのだろうか、などを調べるときに有用なサイト。

困った時は許可されている内容の部分に着目して、使ってもよいかどうか判断したい。