第4回 輪読会 「SQL 第2版: ゼロからはじめるデータベース操作」2024.11.25(月)

SQL 第2版: ゼロからはじめるデータベース操作

 

🚨:理解できなかったところ or 話し合いたい所

👽:素敵ポイント

 

第3章 集約と並び替え

3-1  テーブルを集約して検索する

SQLでデータに対して何らかの操作や計算を行うために「関数」を使う。

 

「テーブル全体の行数を合計する」という計算を行うときはCOUNT関数という道具を使います。まずは、下記5つの関数を覚えておきましょう。

 

COUNT :テーブルのレコード数を数える

SUM :テーブル数値列のデータを合計する

AVG :テーブルの数値列のデータを平均する

MAX :テーブルの任意の列のデータの最大限を求める

MIN :テーブルの任意の列データの最小値を求める

 

👽:COUNT関数は引数によって動作が変わるので注意!!

 

 

 

3-2 テーブルをグループに分ける

 

『『 GROUR BY 句 』』

 

GROUP BY  とは列名ごとでグループ分けすることを指す。

 

「 句の記述序列 」

1 . SELECT  →     2. FROM  → 3 . WHERE  → 4. GROUP BY

 

「 記述例 」

SELECT shohin_bunrui, COUNT(*)
FROM Shohin
GROUP BY shohin_bunrui;

 

「 よくある間違い 」

①SELECT句に余計な列を書いてしまう。

 

→ GROUP BY を使う時は、SELECT句に集約キー以外の列名をかけない

 

②GROUP BYに別名を書いてしまう。

 

→ GROUP BY句につけた別名は使えない!!

 

 

 

3-3 集約した結果に条件を指定する

『『 HAVING句 』』

 

・HAVING句 とは集合に対する条件を指定する際に使用する

・HAVING句とWHERE句は別物

・HAVING句  はGROUP BY の後に書く

 

 

「 句の記述序列 」

1 . SELECT  →     2. FROM  → 3 . WHERE  → 4. GROUP BY → 5. HAVING 

 

「 記述例 」

 
SELECT shohin_bunrui, COUNT(*)
FROM Shohin
GROUP BY shohin_bunrui
HAVING COUNT(*) = 2;

 

 

「  WHERE句との違い 」

列を指定する際、WHERE句を使っていたが、

序列的にGROUP BYの後には使えないので、HAVING句を使う

※使い方としては似ている

 

 

3-4  検索結果を並び替える

『『 ORDER BY句 』』

 

SELECT 文で取り出したデータは順不同なので、指定したい場合にORDER BY句

 

「 句の記述序列 」

1 . SELECT  →     2. FROM  → 3 . WHERE  → 4. GROUP BY →

5. HAVING → 6. ORDER BY

 

「 記述例 」

SELECT shohin_id, shohin_mei, hanbai_tanka, shiire_tanka
FROM Shohin
ORDER BY hanbai_tanka;

 

※ORDER BY にDESCキーワードを指定しないと暗黙に昇順になる

 

<< 記述例応用>>

SELECT shohin_id, shohin_mei, hanbai_tanka, shiire_tanka
FROM Shohin
ORDER BY hanbai_tanka DESC;

※DESCキーワードを指定することで降順、昇順を指定できる。

 

 

 

 

「  WHERE句との違い 」

列を指定する際、WHERE句を使っていたが、

序列的にGROUP BYの後には使えないので、HAVING句を使う

※使い方としては似ている

 

 

 

第一回 輪読会 「SQL 第2版: ゼロからはじめるデータベース操作」2024.11.3(日)

SQL 第2版: ゼロからはじめるデータベース操作

 

🚨:理解できなかったところ or 話し合いたい所

👽:素敵ポイント

 

1. データベースとSQL

1-1 データベースとは

 

DBとは・・

大量の情報を保存し、コンピューターから効率よくアクセスできる様に加工したデータの集まりのこと!!

 

 

『『 データベースは身近に潜んでいる 』』

例) ・病院の診察時、履歴を遡ってくれたり

    ・旅館に訪れた際、数年後もハガキが届いたり

 

#余談ですが(例の2つ目、旅館のハガキが自分でも経験があります。気づかなかっただけで、20年前くらい前から当たり前に使われているのだなぁと感嘆しました)

 

実際にはもっと前から使われていたでしょう。。。

気になって調べて見ましたが、始まりは1959年からだそうです。

www.kogures.com

 

 

DBMS  = データベースマネジメントシステム

 

『『 なぜDBMSが必要なのか 』』

DBMSを使用しない場合のデメリットを多数挙げられていましたが、

要約すると”機密性” , ”多人数での使用” , "大型データ容量に備えて"

上記3つが理由です。

 

 

 

SQL = 構造化問合せ言語 

 

『『 DBMSの種類 』』

用途、年代によってDBMSの種類は使い分けられています。

今回は、リレーショナルデータベース(RDBをメインに取り上げます。

 

リレーショナルデータベースとは・・

「関係データベース」とも呼ばれる。1969年以降、DBMSの中で最も多く利用されていて、Excelのように列と行からなるデータを管理するから人気みたいですSQLを用いて操作をしないといけない

 

 

RDBMSの代表5選

Oracle database

SQL Server

・DB2

PostgreSQL

MySQL

 

🚨:私は、代表5選の内、”PostgreSQ” ”MySQL" しか聞いた事がなかったですが、感覚でどのRDBMSが有名とかあれば聞きたいです。。。。

 

 

 

1-2  データベースの構成

 

RDBMSは、クライアント/サーバー型c/s(型)が最も一般的な形態と言われております。

 

 

「キーワード2つ」

サーバー 

 他のプログラムから要求を受け取り、それに応じて処理を行うプログラム(ソフトウェア)、あるいはそのプログラムがインストールされたマシン(コンピューター)のこと。

 

クライアント

サーバーに要求を出すプログラム(ソフトウェア)、あるいはそのプログラムがインストールされたマシン(コンピュータ)のこと 

 

 

『『 テーブルの構成 』』

・リレーショナルデータベースはデータを「テーブル」で管理。

データベースの中には複数のテーブルを格納する事ができ、必ず行単位でデータを読み書きする

 

1つのセルには1つしかデータを入れられない

 

「 補足 」

テーブルの列(縦)はカラムと呼び、列(横)はレコードと呼ぶ!!

 

 

 

1-3  SQLの概要

SQLとは・・・データベースを操作するために開発された言語

 

『一昔前のSQLRDBMSごとに方言があったが、現在はISO(国際標準機構)が定められている為、標準SQLの書き方を覚える』

 

🚨RDBMSによっては方言でしか書けない場合もあるが、都度調べるようにして取り急ぎ標準SQLのみ書けるようになろ~う

 

『『 sqlの文と種類 』』

SQLは機能により3種類に分けられる。

 

DDL(データ定義言語)

DML(データ操作言語)

・DCL(データ制御言語)

 

*実際にSQLを使うのは、DMLが90%を占めている。

 

SQLの基本ルール 」

 

SQLの文末にはセミコロン「;」を付ける

 

・大文字、小文字は区別されない。(テーブルに保存したデータは区別される)

 

・文字列と日付の定数はシングルクォーテーションで囲む

 

・単語は半角スペースか改行で区切る

 

 

🚨: ?現場レベルの大文字と小文字の使い分けを知りたい。暗黙の了解的なルールがあるのか、知ってる範囲で聞きたい

 

 

 

1-4  テーブルの作成 

 

はじめに、テーブルを格納するためにデータベースを作成する必要があります

 

①データベース → ②テーブル  

 

 

①データベース作成   CREATE DATEBASE <データベース名>;

ex) CREATE DATEBASE shop;

 

 

②テーブル作成  CREATE TABLE<テーブル名>

 

 < データ型 >の指定は必須!!!

 ・INTEGER型(数値の場合に使う *少数はNG)

 ・CHAR型 (文字列型)

 ・VARCHAR型(文字列型)

 ・DATE型(日付)

 

<該当列の制約>も設定する

 

 例えば、NOT NULL制約

 [ shohin_id CHAR(4)  NOT NULL ,]の様に指定することで空欄では登録できずエラーが返されます。

 

 

🚨:テーブル作成では、文末のセミコロンはいらない感じですかね〜?

 

🚨:プライマリーキーの意味がちょっと分かりづらいし説明して欲しいです!!

 

 

余談ですが。。。

 

『『 データベース、テーブルの命名ポイント 』』

・半角アルファベット

・半角数字

・アンダーバー ( _  )

・名前の最初の文字は「半角アルファベット」にする

 

以上4点を確認する⚪︎

 

 

 

 1-5 テーブルの削除と変更

 

『『 テーブル削除(DROP TABLE文) 』』

書き方  DROP TABLE  <TABLE名>;

 

#削除したテーブルは復活できない

#削除したテーブルは復活できない

#削除したテーブルは復活できない

 

『『 テーブル定義の変更(ALTER TABLE文) 』』

書き方 ALTER TABLE <テーブル名> ADD <列の定義>;

 

#テーブル定義を変更したら元に戻せない

#テーブル定義を変更したら元に戻せない

#テーブル定義を変更したら元に戻せない

 

 

時間があれば練習問題にもチャレンジしましょ〜う🏁🔥

 

 

第二回輪読会 Ruby超入門

今回の輪読範囲

Chapter5 「必要な道具を使う」

Chapter6 「組で使う-ハッシュ」

Chapter7 「小さく分割する-メソッド」

 

発表ピックアップ

長いので、気になった所のみをピックアップして発表します。

💡いいなと思ったこと

🍄聞きたいこと、話したいこと

 

5 便利な機能を使う

5-2 メソッドの機能

リファレンスマニュアルとは・・

Rubyのバージョンごとにマニュアルが乗っている辞書の様なもの?

 

🍄使いどきを話し合いたい

docs.ruby-lang.org

 

「末尾に!がつくメソッド」

メソッドの末尾に!がつくメソッドは”破壊的変更”が用いられます。

 

 

 

例)末尾に ! なしでarray2に代入した場合array1自体の配列は変更されません。

※uniqメソッドは重複している要素を取り除くメソッドです

 

末尾に!があるメソッドでarray2に代入した場合

→array1の元の配列も変更される

 

5-5 配列と文字列を変換する

「joinメソッド」

配列の文字列を連結する--joinメソッド

 

*使い方・・・配列とjoinメソッドを定義する!

=>   ["カフェラテ", "チーズケーキ"].join

=>     カフェラテチーズケーキ

 

**joinメソッドには引数を渡すことができる

→引数に入れた文字列が連結部分に入る

 

=> [”カフェラテ”,"チーズケーキ"]join("と")

=> カフェラテとチーズケーキ

 

「splitメソッド」

文字列を区切り文字を分割して配列にするメソッドです

 

*使い方・・・文字列の最後にsplitメソッドを定義する

=> p "カフェラテ チーズケーキ バニラアイス".split

=> ["カフェラテ", "チーズケーキ", "バニラアイス"]

 

**splitメソッドには引数を渡すことができる

→引数に入れた文字列を基準に区切られる

=> p "カフェラテと チーズケーキとバニラアイス".split("と")

=> ["カフェラテ", "チーズケーキ", "バニラアイス"]

6 組で扱う

6-1 オブジェクトを組みで扱う

ハッシュ(Hash)

・・・複数のオブジェクトをまとめる事ができる入れ物です。

ex) {:coffeee => 300, :caffe_latte => 400}

 

シンボル(Symbol)

・・・ハッシュの要素1組をシンボルと呼ぶ。

 

*ハッシュには2つ書き方がある!

1              { :coffee => 300 }

2             { coffee: 300 }

 

🍄実際に見かけるパターンでは2が使われているのが、ほとんどの気がします。。。

 

[ 試したいこと ]

実際にirbを使って

・変数にハッシュを代入

・ハッシュから値を取得する

 

 

*ハッシュにシンボルを追加

 

*ハッシュの繰り返し

🍄式展開する場合はダブルクォーテーション

 

7 メソッド

メソッドとは・・・名前をつけた処理の部品

 

変数にメソッドを代入できる

「悪い例」

実際に変数にメソッドを代入したが、

期待した動きにならなかった。

 

*原因* メソッドにputsメソッドを入れていた

 

 

「 良い例 」

 
メソッドに引数を持たせることもできる

※メソッドの()は省略できる



 

Kyoto.rb 2024.9.29 振り返り

Kyoto.rbに参加して感じたこと

 

まずは、学びの機会を与えてくださった主催者の方々に感謝しつつ

自分の思ったことを記録していこうと思います。

 

 

良かった点

・未経験でエンジニアを目指す方との交流ができて意見交換ができた

→輪読会をするという約束ができた。(Ruby超入門)

 

・エンジニアとしてのキャリア形成の相談に乗ってもらえた

→ 何を扱えるエンジニアになりたいかというビジョンから逆算して必要なスキルを身につけていくことが大事!

 

・なぜ俺たちは学び続けるのかの答えが出た。

→学んだことを全て活かせるかと言うとそんな事はない。

→苦手分野は避けて通れるなら避けても良い(但し、必要に駆られた時は対処できる様にしないといけない。)

 

 

 

悪かった点

・自分の知識では、わからない話題の時に浮かんだ疑問を逐一聞くことができなかった。

→懇親会でも助言いただいたが、とりあえず聞いてみて忙しいと言われたら教えてくれる人を紹介してもらう様に言える様になる。

(自分は、聞く相手方が忙しいのではないかと遠慮してしますことがあったが遠慮しないでいいと言うことかな。。)

 

 

・自分が抱えている「MVCの関係性の理解を深めたい」と言うところで具体例を出せなかった。

→そもそも漠然と思っていた「MVCの関係性の理解を深めたい」と言うだけでは、どこの部分を言っているのか分からなかったと思いました。。。

”自分で、ここの部分を試したが上手く動かなくてどうしたらいいか”など具体的な疑問をぶつけることができれば解決に向かうことができそう!

 

 

感想

とにかくKyoto.rbに参加すると、生のエンジニアの方から意見を頂けるのでそれだけで参加する旨みがあると思っています。

また、初学者の人にも寄り添ってアドバイスを頂けて、毎度実りのある会だなと痛感しております。

 

ですが、デスカッションの時は初心者の自分には、

空中戦すぎてついていけないことも多いです。

そう言った場合でも割り込んで質問できるようになっていかないといけないなとつくづく思います。。。。

 

来月も開催されると言うことでそれまでに、色々聞きたい事を溜めておこうと思います。

 

追記:懇親会の後に書いているので、文が無茶苦茶だったり内容が薄くても多めにみてください(笑)

 

 

current_userについて

「current_userについて」

このコードの理解に苦しんだので、アウトプットするぅーーう

current_userとは・・・権限のチェックに使われるユーザー識別子

 

def current_user
if session[:user_id]
@current_user ||= User.find_by(id: session[:user_id])
end
end

 

<このコードの意味>

current_userメソッドは汎用性が高く、めっちゃ使う。

なので、「DBへの問い合わせ回数がものすごい数行われるのを避けるため」

 

 

<具体的に説明>

・はじめに、if文でsession[:user_id]を持っているかを確認している

 

・User.find_byをかけると毎回DBへの問い合わせが行われている。

 

・一回問い合わせしたらもう問い合わせしない様にできればスマートだね

だから、、、メモ化する!!

 

※メモ化とは・・・一回インスタンス変数にしておけば二度と問い合わせしなくても良くなるということ

⇨current_userがnilだったら初めてFind_byをかける様にする!

 

〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜

「ここが難しかった」

 
@current_user ||= User.find_by(id: session[:user_id])
 

 

@current_userがnilかどうかまず確認する!

(@current_user = @current_user || User.find_by ....)

※左辺の左側がnilだった場合、右側を実行するという式

          ⇩

実行されれば、Find_byされた値が@current_userに代入される

          ⇩

@current_userがnil出ない場合はfind_byはかけられない様になる!

 

「結論」

current_userがnilではない場合find_byが実行されないからDBが小さい容量で済むということ!!

Ruby文法復習weeeeek

自分のメモ用にアウトプット

まだ途中やけど、とりあえずポイント2個✴️

 

目次

[アクセサメソッド(attr_accessor)]

[classメソッドとインスタンスメソッドの違い]

[まとめ]

 

 

 

①アクセサメソッド (attr_accessor)

インスタンスメソッドを開発者が書かなくても良くなる

(つまり、下記コメントアウトしている2つのメソッドをtウィ技師なくて役なるということ!リファクタリングできる〜〜)

 

・アクセサメソッドで学んだクラス外部でインスタンス変数を使う方法を1行で作成する

 

class Car

attr_accessor  :name

 

def initialize(name)  #initializeはnewが使われた時に呼ばれる特殊なメソッド

@name = name

end

 

def hello

puts "Hello! , I am {#@name}"   #式展開したいからダブルクォートで囲む

end

 

#def name

#@name  #ここ定義するとインスタンス変数を呼べる

#end

 

#def name = (value)    ※# がないとエラーになるので注意!

#@name = value

#end

 

end

 

car = Car.new('Kitt')

car.hello

karr = Car.new('Karr')

karr.hello

 

 

②classメソッドとインスタンスメソッドの違い

 

→クラスから直接呼ぶことができるメソッド

(classから直接呼び出せるメソッドってなんやねん。。。)

 

→class外部で下記の方法で呼び出すことが可能⚪︎

class名.メソッド名(引数) #これがクラスメソッド

(class.newしなくても呼び出せるという認識でいいですかね〜?)

 

インスタンスメソッドとは」

→クラス定義をnewメソッドで実体化したものがインスタンス

 

インスタンス名 = class名.new を代入する。

インスタンス名.メソッド名(引数)#これがインスタンスメソッド

 

  1. class Car
  2. @@count = 0
  3. def initialize(name)
  4. @name = name
  5. @@count += 1
  6. end
  7. def hello
  8. puts "Hello! I am #{@name}.#{@@count} instance(s)"
  9. end
  10. def self.info  #classメソッド定義時はselfで定義!
  11. puts "#{@@count} instance(s)"
  12. end
  13. end
  14.  
  15.  
  16. kitt = Car.new('Kitt')
  17. # kitt.hello
  18. Car.info  #呼び出す時はselfを省略できる
  19.  
  20. karr = Car.new('Karr')
  21. # karr.hello
  22. Car.info  #呼び出す時はselfを省略できる
  23.  
  24.  
  25. 出力結果
  26. >1 instance(s)
  27. >2 instance(s)

インスタンス変数が作成されるたびにinitialezeメソッドが呼ばれ、

(@@ccount)がカウントが増えていく!

 

Q、インスタンス名 = class.newした時に自動的にinitializeは呼び出される。では、クラスメソッドを呼び出したときはinitializeメソッドは呼び出されるんか?

 

 

A、classメソッドは、initializeメソッドは自動で呼び出されない。

※インスタントメソッドが自動で呼び出されるのはclass.newした時だけ!

 

 

まとめ

サマーセールでまとめ買いして、最近はUdemyに頼っているが、

Udemyを強くオススメしたいです!!(今更言うなとかは言わんといてな〜w)

 

・動画毎に1,000文字程度のメモを残せる(意外と1000文字ギリギリまで書いてしまうこともある。。)

 

・動画のどの部分でメモを残したのか印を打ってくれる

 

・1つの単元毎の動画時間が短いので進めやすい(続けてみる場合も次の動画がすぐに出てくる)

 

以上。あらした〜

 

ルーティングのネストとは[Rails]

ルーティングのネストについて

いいね機能を制作する前に下調べをしているとネストの意味がわからなかったので調べましたので記録を残します。

 

ネストとは

2つのコントローラーを繋げること!(大体そんなイメージで覚えます。。)

(モデルで言うところの「has_many」と「belongs_to」みたいな感じ)

なぜネストするか

①URLに階層構造ができる

→ネストすることによりURLから、どの投稿に対するコメントなのかわかる様になると言うこと。

もう少し掘り下げると、投稿に対するコメントがあったとすると、そのURLは「/posts/2(user_id)/comment」になる。

つまり、このコメントはあるユーザーの2番目の投稿にコメントをしました。と言うことになります。

 

 

記入方法