/// BANGBOO BLOG ///

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

November 16, 2009

Ora Ora Ora Ora Ora

忘れ易いルール、お触り。無駄無駄無駄無駄無駄無駄ッ

■DML
null値はもっとも大きな値
集計関数はNULLを無視する
文字列は'で囲む
取得したいカラムは集計関数に使われるカラムを除いて全てGroupBy句に入れる(複数指定すると複数行の組合せになり思うように集計できない場合がある)
集計関数の条件はhaving句を使用する(where句は元のデータに対するもの)、having句には集計関数が入る(下に例を載せた)
SQLワイルドカード:複数文字%,1文字_
WINワイルドカード:複数文字*,1文字?
エスケープ文字はescape句で設定。like句の後ろにつく。escape '\'
日付と文字列の変換が必要To_char関数とTo_date関数を使用する
to_char(column,'yyyy/mm/dd hh24:mi:ss')
to_date('2009/02/21','yyyy/mm/dd')
横幅を大きくするset line 150
縦を大きくするset pages 30
unionはdistinctが掛かる、全取得はunion all
inner join onは両方のテーブルにあるものだけ、どちらかだけにあるのは無くなるイメージ
left outer join onは左側のテーブルにしかないものも表示、左に右の該当部をくっつけるイメージ
right outer join onは右側のテーブルにしかないものも表示、右に左の該当部をくっつけるイメージ
full outer join onは全ての行を表示

trancateは高速だがロールバックできない,deleteはロールバックできる

■テーブル結合4種
1対1、1対多の結合を行う
1対多でも行数が増えるが、多対多は全組合せになり行数が比例関数的に増えてしまう
多対多になるのはテーブル設計が悪いのでは?
1)inner join - on () 両方あるものを表示、欠けがでる
2)left outer join - on () どちらかは欠けがなく表示
3)right outer join - on ()  どちらかは欠けがなく表示
4)full outer join - on ()  欠けがなく表示

select URIID,NAME,UKYAKUID from URIAGE left outer join TORIHIKI
 on (URIAGE.UKYAKUID = TORIHIKI.ID)
select URIID,NAME,UKYAKUID from TORIHIKI right outer join URIAGE
 on (URIAGE.UKYAKUID = TORIHIKI.ID)
select URIID,NAME,UKYAKUID from TORIHIKI full outer join URIAGE
 on (URIAGE.UKYAKUID = TORIHIKI.ID)
select 伝票番号,行番号,処理日,商品名,担当者名,顧客名,数量 from 売上データ
 left outer join 商品マスタ on 売上データ.商品ID = 商品マスタ.商品ID
 left outer join 担当者マスタ on 売上データ.担当者ID = 担当者マスタ.担当者ID
 left outer join 顧客マスタ on 売上データ.顧客ID = 顧客マスタ.顧客ID
 order by 伝票番号,行番号

■なおjoin on句 と where句での結合の違い
1)select * from A, B where A.a = B.a and A.c = 3;
2)select * from A inner join B on A.a = B.a where A.c = 3;
両者は同じ結果、前者の方が古くからある構文,後者が新しい構文
https://okwave.jp/qa/q8090979.html

■WHEREとJOIN ONで条件を指定した場合の違い
SELECT * FROM movies LEFT OUTER JOIN counts ON counts.movie_id = movies.id WHERE counts.date_at = '2012-12-16';
 WHERE句はJOINが終わってから評価される→Outer joinでも12/16でない映画が含まれなくなる
この問題の解決にはWHERE句に条件を指定するのでなくJOIN ONの追加条件として指定する
SELECT * FROM movies LEFT OUTER JOIN counts ON counts.movie_id = movies.id AND counts.date_at = '2012-12-16';
 結合前に12/16のカウントを外した上で、Outer joinするので全映画が出力される
http://hakutoitoi.hatenablog.com/entry/2012/12/17/005208

■多対多、1対多の行数
社員と職域、社員と手当、それぞれ結合しても多の行数(1x多)になる
多x多の行数になる、多対多の結合は行わないこと
-- データ挿入:社員
INSERT INTO employee (no,name) VALUES (1, '田中');
INSERT INTO employee (no,name) VALUES (2, '鈴木');
INSERT INTO employee (no,name) VALUES (3, '佐藤');
-- データ挿入:職域
INSERT INTO joblevel (no,res) VALUES (1, '部長');
INSERT INTO joblevel (no,res) VALUES (1, '課長');
INSERT INTO joblevel (no,res) VALUES (2, '平');
-- データ挿入:手当
INSERT INTO compensation (no,allow) VALUES (1, '住宅');
INSERT INTO compensation (no,allow) VALUES (1, '交通');
INSERT INTO compensation (no,allow) VALUES (2, '住宅');
-- 1対多
select * from EMPLOYEE
 inner join JOBLEVEL on EMPLOYEE.ID = JOBLEVEL.ID
-- 多対多
select * from EMPLOYEE
 inner join JOBLEVEL on EMPLOYEE.ID = JOBLEVEL.ID
 inner join COMPENSATION on EMPLOYEE.ID = COMPENSATION.ID

■Group by/having/where
取得したいカラムは集計関数に使われるカラムを除いて全てGroupBy句に入れるの例
select distinct boss from fun_test_data
select department, avg(salary) from fun_test_data group by department
select boss, avg(salary) from fun_test_data group by boss
select department, boss, avg(salary) from fun_test_data group by department, boss

集計関数の条件はhaving句を使用する(where句は元のデータに対するもの)、having句には集計関数が入る例
select department, count(department), avg(salary) from fun_test_data where department!="営業" group by department;
select department, count(department), avg(salary) from fun_test_data where department!="営業" group by department having avg(salary) > 45;
※moreにデータをDDLを置いておくので操作して感じる

■テーブル設計、制約
CONSTRAINT pk_uriage PRIMARY KEY (伝票番号, 行番号),
CONSTRAINT fk_shohin FOREIGN KEY (商品ID) REFERENCES 商品マスタ(商品ID)
CONSTRAINT ck_gender CHECK (性別=0 OR 性別=1)
制約は列に指定しても、うしろで指定してもどちらでもよい
CONSTRAINTのキー名を省略するとオラクルが勝手につける
主キーにはNULLは入らない
ユニークキーにはNULLを入れてもよい
NOT NULLの未入力はエラー

■シーケンス
シーケンスはオブジェクトとして表とは別に作成する
デクリメントはできないので修正はDROPして作成し直す
DUALはダミー表
nextvalはインクリした後の値
currvalは現在地
create sequence testseq
select testseq.nextval from dual
select testseq.currval from dual
insert into URIAGE (URIID,URIDATE,UKYAKUID) values (testseq.nextval,'09-11-16','101')
drop sequence testseq

■ビュー
頻繁に行われるような問い合わせをスキーマに格納しておく
集約等をしなければパフォーマンスには問題がない。次を使うとパフォーマンスが落ちる。OLAP 関数(RANK, DENSE_RANK, ROW_NUMBER 等)、集約関数(AVG, COUNT, SUM, MIN, MAX)、集合演算子( UNION, INTERSECT, EXCEPT 等 )
ビューは検索だけでなく、データの追加、更新、削除も行える※使用しない方が良い?
create view 売上ビュー as
 select 伝票番号,行番号,処理日,商品名,担当者名,顧客名,数量 from 売上データ
 left outer join 商品マスタ on 売上データ.商品ID = 商品マスタ.商品ID
 left outer join 担当者マスタ on 売上データ.担当者ID = 担当者マスタ.担当者ID
 left outer join 顧客マスタ on 売上データ.顧客ID = 顧客マスタ.顧客ID
 order by 伝票番号,行番号
select * from 売上ビュー

■要件定義/外部設計/内部設計
http://www3.alpha-net.ne.jp/users/design1/takeda/SystemDesign/SystemDesign.htm

■インデックス
1)インデックスが効かない
関数 where datediff(now(),mod_date)>180
式 where col1 / 2 = 0
否定構文 where col1 != 3
Like検索(前方一致除く) where col1 like '%string%'とかwhere col1 like '%string'とか
2)複合インデックスでは指定順が重要
index a
 create index idxA1 on tbl (col1);
 create index idxA2 on tbl (col2);
 -> where col1 = x > idxA1が使用される
 -> where col2 = x > idxA2が使用される
 -> where col1 = x AND col2 = x > idxA1か2のどちらかが使用される
index b
 create index idxB1 on tbl (col1, col2);
 -> where col1 = x > idxB1が使用される
 -> where col2 = x > インデックスは使用されない
 -> where col1 = x AND col2 = x > idxB1が使用される,indexA1,A2より高速
index c
 create index idxC1 on tbl (col2, col1);
 -> where col1 = x > インデックスは使用されない
 -> where col2 = x > idxC1が使用される
 -> where col1 = x AND col2 = x > idxC1が使用される,indexA1,A2より高速


twitter
Hatena
Google Buzz
newsing
Yahoo!
Buzzurl
Technorati
del.icio.us
Choix
Iza!
Livedoor Clip
Facebook
Evernote
 

Posted by funa : 06:54 PM | Web | Comment (0) | Trackback (0)


PhotoGallery


TWITTER
Search

Mobile
QR for cellphone  QR for smart phone
For mobile click here
For smart phone click here
Popular Page
#1Web
#2Hiace 200
#3Gadget
#4The beginning of CSSレイアウト
#5Column
#6Web font test
#7Ora Ora Ora Ora Ora
#8Wifi cam
#9みたらし団子
#10Arcade Controller
#11G Suite
#12PC SPEC 2012.8
#13Javascript
#14REMIX DTM DAW - Acid
#15RSS Radio
#16Optimost
#17通話SIM
#18Attachment
#19Summer time blues
#20Enigma
#21Git
#22Warning!! Page Expired.
#23Speaker
#24Darwinian Theory Of Evolution
#25AV首相
#26htaccess mod_rewite
#27/// BANGBOO BLOG /// From 2016-01-01 To 2016-01-31
#28竹書房
#29F☆ck CSS
#30Automobile Inspection
#31No ID
#32Win7 / Win10 Insco
#33Speaker
#34Arcade Controller
#35Agile
#36G Suite
#37Personal Information Privacy Act
#38Europe
#39Warning!! Page Expired.
#40GoogleMap Moblile
#41CSS Selectors
#42MySQL DB Database
#43Ant
#44☆od damnit
#45Teeth Teeth
#46Itinerary with a eurail pass
#47PHP Developer
#48Affiliate
#49/// BANGBOO BLOG /// From 2019-01-01 To 2019-01-31
#50/// BANGBOO BLOG /// From 2019-09-01 To 2019-09-30
#51/// BANGBOO BLOG /// On 2020-03-01
#52/// BANGBOO BLOG /// On 2020-04-01
#53Windows env tips
#54恐慌からの脱出方法
#55MARUTAI
#56A Rainbow Between Clouds‏
#57ER
#58PDF in cellphone with microSD
#59DJ
#60ICOCA
#61Departures
#62Update your home page
#63CSS Grid
#64恐慌からの脱出方法
#65ハチロクカフェ
#66/// BANGBOO BLOG /// On 2016-03-31
#67/// BANGBOO BLOG /// From 2017-02-01 To 2017-02-28
#68/// BANGBOO BLOG /// From 2019-07-01 To 2019-07-31
#69/// BANGBOO BLOG /// From 2019-10-01 To 2019-10-31
#70/// BANGBOO BLOG /// On 2020-01-21
#71Bike
#72Where Hiphop lives!!
#73The team that always wins
#74Tora Tora Tora
#75Blog Ping
#76無料ストレージ
#77jQuery - write less, do more.
#78Adobe Premire6.0 (Guru R.I.P.)
#79PC SPEC 2007.7
#80Google Sitemap
#81Information privacy & antispam law
#82Wifi security camera with solar panel & small battery
#83Hope get back to normal
#84Vice versa
#85ハイエースのメンテ
#86Camoufla
#87α7Ⅱ
#88Jack up Hiace
#89Fucking tire
#90Big D
#914 Pole Plug
#925-year-old shit
#93Emancipation Proclamation
#94Windows env tips
#95Meritocracy
#96Focus zone
#97Raspberry Pi
#98Mind Control
#99Interview
#100Branding Excellent
Category
Recent Entry
Trackback
Comment
Archive
<     July 2020     >
Sun Mon Tue Wed Thi Fri Sat
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Link