Upgrade to Pro — share decks privately, control downloads, hide ads and more …

第4課 リレーショナルデータベース

ひでシス
November 02, 2016
630

第4課 リレーショナルデータベース

ひでシス

November 02, 2016
Tweet

Transcript

  1. リレーショナルデータベース概観 ユーザーID 名前 メールアドレス 1 ひでシス [email protected] 2 西岡めぐみ [email protected]

    つぶやきID ユーザーID つぶやき 投稿時間 1 1 ちんぽ 2016/11/02 17:13 2 2 ああああああ!!!! 2016/11/02 17:15 3 1 ちんちん 2016/11/02 17:20 4 1 ちん 2016/11/02 17:21 5 2 ああああああああ!!!!!! 2016/11/02 17:25 6 1 ぽ 2016/11/02 17:34 1 0-多 ユーザーテーブル つぶやきテーブル 4
  2. それぞれの名前 つぶやきID ユーザーID つぶやき 投稿時間 1 1 ちんぽ 2016/11/02 17:13

    2 2 ああああああ!!!! 2016/11/02 17:15 3 1 ちんちん 2016/11/02 17:20 4 1 ちん 2016/11/02 17:21 5 2 ああああああああ!!!!!! 2016/11/02 17:25 6 1 ぽ 2016/11/02 17:34 つぶやきテーブル テーブル名 属性(列) 順不同 組(行) 順不同 複数のテーブルをまとめて、「データベース」という 5
  3. 型について データ型 例 Ruby SQLite3 MySQL 整数 21341 Fixnum INTEGER,

    NUMERIC Int 浮動小数点数 値 1.3423 Float REAL Float 文字列 "あああああ" String TEXT Char, Text 日付時刻 2016/11/02 17:35:00 Date, DateTime TEXT DateTime 配列 [1, 34, 3.23, "あ ああ"] Array ない ない ハッシュ {075 => "Kyoto", 03 => "Tokyo"} Hash ない ない 真偽値 true TrueClass, FalseClass NUMERIC Boolean 11
  4. 1. 表を作る(CREATE) CREATE TABLE tweets ( id INTEGER PRIMARY KEY

    AUTOINCREMENT, user_id INTEGER, tweet TEXT, posted_at TEXT ); CREATE TABLE users ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, email TEXT ); 15
  5. 2. データの挿入(INSERT) INSERT INTO users (name, email) VALUES ("hidesys", "[email protected]");

    INSERT INTO tweets (user_id, tweet, posted_at) VALUES (1, "aaaaaa", "2016/11/02 18:00:00"); 16
  6. 10. 並び替え(ORDER BY) SELECT user_id, COUNT(*) AS tweet_count FROM tweets

    GROUP BY user_id HAVING tweet_count > 3 ORDER BY tweet_count; SELECT * FROM tweets ORDER BY user_id; SELECT * FROM tweets ORDER BY user_id DESC; 24
  7. 11. リストの中にある(IN) SELECT * FROM tweets WHERE user_id = 2

    OR user_id = 4 OR user_id = 5; SELECT * FROM tweets WHERE user_id IN (2, 4, 5); 25
  8. 12. 存在(EXISTS) SELECT name FROM users WHERE EXISTS ( SELECT

    * FROM tweets WHERE users.id = tweets.user_id ); 26
  9. なにやっているかわかりますか? SELECT u.name, t2.tweet_count FROM users AS u INNER JOIN

    ( SELECT user_id, COUNT(*) AS tweet_count FROM tweets AS t GROUP BY user_id HAVING tweet_count >= 2 ) AS t2 ON u.id = t2.user_id ORDER BY t2.tweet_count DESC; 27