-- DB問題 コード -- テーブル名 user -- create database "user”; テーブル作成 -- \q -- $ psql -d user --User Tableーーーーーーーーーby usertable.sql create table "user" ( user_id serial primary key, name varchar(50) NOT NULL, age smallint default 0, gender boolean default false ); ーーーーーーーーーーーーーーーーーーーーーーーーーーー 変更するたびに dropするとこと! drop table 名前; \i .sql もう一度読み込む \dt テーブル一覧 \d テーブルの中身を見れる \c - myuser ユーザ変更 DBオーナーの変更 alter table "user" owner to myuser; ----------------------------------------------- --accounttable.sqlーーーーーーーーーーーーーーーー CREATE TABLE "account"( account_id serial primary key, login_id varchar(16) NOT NULL UNIQUE, password varchar(16) NOT NULL, user_id integer NOT NULL, CONSTRAINT "num_user" FOREIGN KEY (user_id) REFERENCES "user" ("user_id") ); -- FOREIGN KEY の指定できな方のでコマンドで後から追加しました。 -- ALTER TABLE account ADD CONSTRAINT "num_user" FOREIGN KEY("user_id") --結果 : --ALTER TABLE account ADD CONSTRAINT "num_user" FOREIGN KEY("user_id") --REFERENCES "user"("user_id"); ------------------------------------------------- -----外部キー-------------------------------------------- ALTER TABLE account ADD CONSTRAINT "num_user" FOREIGN KEY("user_id") REFERENCES "user"("user_id"); --------------------------------------------------------------------------- --問2-3 userテーブルに値を入れる (1行)————————— --1つ目 error --nsert into (“user”,account) (name,age,gender) values ('テスト太郎','30','false','test1','test1'); --user insert into "user"("user_id","name","age","gender") values (DEFAULT,'テスト太郎','30','false'); --account insert into "account"("account_id","login_id","password","user_id") values (DEFAULT,'test1','test1',DEFAULT); --2の4------------------------------------------------------------------------- --------------------------------------------------- --userの順番 user_id name age gender --accountの順番 account_id login_id password user_id ------------------------------------------------- --user INSERT INTO "user"(user_id,name,age,gender) VALUES (1,'テスト花子','32','1') ,(2,'テスト二郎','25',DEFAULT) ,(3,'テスト一郎','50',DEFAULT) ,(4,'センス春子','20','1') ,(5,'センス夏子','20','1') ,(6,'センス秋子','25','1') ,(7,'センス冬子','33','1'); --account INSERT INTO "account"(account_id,login_id,password,user_id) VALUES (2,'test2','test2',2) ,(3,'test3','test3',3) ,(4,'test4','test4',4) ,(5,'test5','test5',5) ,(6,'test6','test6',6) ,(7,'test7','test7',7) ,(8,'test8','test8',8); --2の5----------------- UPDATE BLOG SET タイトル = 'hogehoge' WHERE ID = 2; --user UPDATE "user" SET "name" = 'hoge太郎',"age"='30',"gender"= DEFAULT WHERE user_id = 1; --account UPDATE "account" SET "login_id" = 'test1',"password"= 'test1' WHERE user_id = 1; --2-6 JOIN 内部統合 [ LIKE JOIN ]http://www.cgis.biz/others/postgresql/8/ --name の中のテストを取ってくる --抽出のみ() --SELECT*FROM "user" WHERE "name" LIKE '%テスト%'; --2-6 統合して テスト のデータを抽出する SELECT * FROM "user" NATURAL JOIN "account" WHERE "name" LIKE '%テスト%'; --------------------------------------------------------------------------------------- --2-7 user 年齢が最大 [login_id password]を抽出 ※最大値は関数を使用すること。------ --ageの最大値取得 SELECT max(age) from "user"; --login_id とpasswordを抽出 --error -- SELECT*FROM "user" NATURAL JOIN "account" WHERE "login_id" AND "password"; SELECT*FROM "account" WHERE ("account") in ("login_id","password"); --2つの値を取得したい。 SELECT max(age) from -- (SELECT "age" as from "user" UNION SELECT "password" from "accont") ; SELECT MAX(age) FROM "user" GROP BY "password"; ---------------------------------------------------- --MAX(age) を使って1列全て表示したい SELECT MAX JOIN SELECT * FROM "user" NATURAL JOIN "account" WHERE "age" = (SELECT MAX(age)FROM "user") ; --参考文献 : WHERE 文にMAXを書く方法 --http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=25704&forum=7 --2-8------------------------------------------------------------------------ 書く年代別の平均値が最大のデータをログインIDとパスワードを含めたデータを抽出。 年齢の平均の求め方。 SELECT AVG(age) FROM "user"; 使うであろう単語 GROUP BY div 10 SELECT * FROM "user" NATURAL JOIN "account" WHERE "age" = (SELECT AVG(age)FROM "user" GROUP BY ("age"<30,"age"<40)); 年代10ごとに区切りでだすことができた。 age 表示結果: ageのみ SELECT AVG(age) FROM "user" GROUP BY "age"/10; -------------------------------------------------------------------------- 2-4(INTOを複数行で追加した問題)で追加した「テスト二郎(No3)」のデータを削除する。 ただし、userテーブルにあるデータを削除すると、accountテーブルも自動で削除できるようにする。 ------------------------------------------------------ 準備するもの(vim .sql)バックアップのファイル user_test userのコピー account_test accountのコピー 名前 test_account.sql test_user.sql --------------------------------------------------------- 手順 1外部キー制約を消す 2データを消す (account user) 3もう一度付け直す(外部キー制約) 全てのデータを確認する。 SELECT * FROM "user" NATURAL JOIN "account"; SELECT * FROM "account"; ALTER TABLE "account" DROP CONSTRAINT "num_user"; DELETE FROM "user" WHERE user_id = 3; ALTER TABLE "account" ADD CONSTRAINT "num_user" FOREIGN KEY (user_id) REFERENCES "user" (user_id) ON DELETE CASCADE ON UPDATE CASCADE; ----------------ラストコメント --インサート文なんだけど user_idはシーケンス設定しているから (name, age, gender) values (‘test’, 30, 1) でOK そして、 --数値(int)系は’や”で囲ったらダメ! --囲うと文字列だから!
※不定期に問題の方も追加していきます。