* 第3日午後 データベースとSQL実習 [#gaef5153]
* 第3日午後 アセンブラ(CASL)実習 [#re226e6a]

** 目次 [#r061f41b]
** 目次 [#me0b8261]

#contents

** データベースの準備 [#pb8615f7]
** 実習 [#q6787ab1]

*** 「SQLの窓」のインストール [#l0356e16]
+ 「SQLの窓」をダウンロードする。
-- http://vilab.org/dept/summer/winofsql15.lzh
+ ホームディレクトリ(マイ ドキュメント)の中に展開する。
-- フォルダ winofsql15 を D:\ から マイドキュメントにコピーする。
+ 東京の郵便番号データをダウンロードし、Excelで内容を確認する。
-- http://vilab.org/dept/summer/ziptokyo.xls 
+ 「SQLの窓」展開したフォルダの中の db.html をダブルクリックして起動する。
-- winofsql15 の下の db.html
+ 「参照...」ボタンを押して、データベースとして ziptokyo.xls を読み込む。
+ 「select *」ボタンを押して、データベースの内容を確認する。
*** CASL?環境(EduCasl)の設定 [#h050ad0b]

*** Accessでの方法 [#xe2a72b7]
- AccessでSQLを使う方法
-- http://www.pursue.ne.jp/jouhousyo/SQLDoc/try.htm
+ 以下からCASLのエミュレータをダウンロードする。
-- http://vilab.org/summer/educasl.zip
+ 展開して,Setup.Exeを実行(ダブルクリック)する。

*** テーブルの設計 [#wc11d619]
*** EduCaslの実行 [#ba2de7ca]

関係データベースは、「テーブル」(表)から構成されている。テーブルには「カラム」または「フィールド」と呼ばれる縦の欄(項目)があり、ひとつひとつのデータは横一列の「レコード」(行)として並ぶ。
+ ソースコード入力画面が出るので,プログラムを打ち込む。
+ プログラムを入力し終わったら,「アセンブル」でアセンブルする。
+ エラーが出なければ,「実行」ボタンが押せるようになり,実行画面に移れる。
+ 実行画面では,メモリやレジスタの内容を確認しながら,1行ずつ実行できる。

今回は以下のようなテーブルを作る。「旧番号」「新番号」「都道府県名」などの欄がカラムであり、「060, 0600041, 北海道, 札幌市中央区, 大通東」のようなひとまとまりのデータがレコードである。
*** プログラムの実行 [#o10070b1]

|旧番号|新番号 |都道府県名|市区郡町村名    |町村字名|h
|060   |0600041|北海道    |札幌市中央区    |大通東  |
|154   |1540002|東京都    |世田谷区        |下馬    |
|468   |4680039|愛知県    |名古屋市天白区  |西入町  |
|90718 |9071801|沖縄県    |八重山郡与那国町|与那国  |
- 以下のプログラムを入力して,どのような動作をするか調べてみなさい。
- 動作の要点を言葉で説明し,さらにフローチャートを書きなさい。

テーブルの設計ではカラム(各欄)の型を定義します。「型」というのは、そのカラムに入るデータの形式のことで必ず定義します。今回は以下のようになります。テーブルの設計はデータベース構築の肝です。興味があれば、「正規化」と呼ばれるデータベースの論理設計手法を勉強してみてください。
+ メッセージ出力
 HELLO    START
          OUT    BUF,LEN
          RET
 BUF      DC     'HELLO!'
 LEN      DC     6
          END
+ ロードとストア
 EXLD     START
          LD     GR0, DATA1
          LAD    GR1, 20
          ST     GR0, DATA2
          ST     GR1, DATA3 
          RET
 DATA1    DC     10
 DATA2    DS     1
 DATA3    DS     1
          END
+ 演算(減算)
 EXSUB	START
 	LD	GR1,X
 	LD	GR2,Y
 	SUBA	GR1,GR2
 	ST	GR1,Z
 	RET
 X	DC	15
 Y	DC	6
 Z	DS	1
 	END
+ 演算(加算と減算)
 EXSUB  START
         LD      GR0,X
         ADDA    GR0,Y
         SUBA    GR0,Z
         ST      GR0,W
         RET
 X       DC      90
 Y       DC      87
 Z       DC      77
 W       DS      1
         END
+ 条件分岐(if)
 EXIF	START
 	LD	GR1,DATA1
 	CPA	GR1,DATA2
 	JZE	SKIP1
 	LAD	GR2,0
 	JUMP	SKIP2
 SKIP1	LAD	GR2,1
 SKIP2	ST	GR2,ANS
 	RET
 DATA1	DC	5
 DATA2	DC	5
 ANS	DS	1
 	END

|zipcode|>|>||h
|名称  |内容        |型  |属性|h
|oldzip|旧番号      |text||
|newzip|新番号      |text|空欄不可|
|pref  |都道府県名  |text||
|city  |市区郡町村名|text||
|addr  |町字名      |text|空欄不可|
*** 上級課題 [#sa30d548]

+ 繰り返し(while)
 EXLOOP	START
 	LAD	GR1,0	;GR1の初期値を0とする
 LOOP	LD	GR2,GR1
 	LD	GR3,GR2
 	LD	GR4,GR3
 	ADDA	GR1,C1	;GR1を1増やす
 	CPA	GR1,N
 	JMI	LOOP
 	RET
 N	DC	3
 C1	DC	1
 	END
+ ループと演算の組み合わせ
 SUM10      START  ENTRY
 ; データ
 COUNT    DC     10         ; 値10
 C1       DC     1          ; 値1
 TOTAL    DC     0          ; 結果
 ; プログラム
 ; GR1=カウンタ
 ; GR2=総和
 ENTRY    LD     GR1,COUNT  ; カウンタの初期値
          XOR    GR2,GR2    ; 総和の初期値=0
 LOOP     ADDL   GR2,GR1    ; 総和に加算
          SUBL   GR1,C1     ; カウンタから1を引く
          JNZ    LOOP       ; 0でなければLOOPへ飛ぶ
          ST     GR2,TOTAL  ; 総和をストア
          RET
          END
+ DCで確保した数値の内容を4倍するCASLプログラムを作成しなさい。
+ DCで確保した数値の内容が偶数か奇数かを判定するCASLプログラムを作成しなさい。
+ 10以上20未満の整数の合計を計算するCASLプログラムを作成しなさい。

** SQLによるテーブル操作 [#p8459703]
- 上級課題をやった人は,(その分だけ)メールで送っていいです。
 hi-shiozawa@engs.tamagawa.ac.jp
-- メールを出すときは,上記アドレスの「@」は半角の「@」に変更してください。
- もし時間が余ったら申告してください。さらに課題を作ります。

「SQLの窓」では、Excelのワークシート名をworksheetとすると、テーブル名は ''[worksheet$]'' で参照する。この郵便番号データベースの例だと、''zipcodeのかわりに [zipcode$]''と書く必要がある。
** CASL?エミュレータ [#q62cd34b]

*** テーブルの作成(省略) [#t366f18b]
- EduCasl
-- http://www.vector.co.jp/soft/winnt/prog/se369290.html
-- 動かない人は,これを(.NET 1.1)入れる必要があるかも。
--- http://www.microsoft.com/downloads/details.aspx?FamilyID=262d25e3-f589-4842-8157-034d1e7cf3a3&DisplayLang=ja
- Web版CASL?エミュレータ
-- http://www.chiba-fjb.ac.jp/fjb_labo/casl/casl2.cgi
- その他のエミュレータ
-- http://www.vector.co.jp/vpack/filearea/win/prog/casl/
- IPAの純正エミュレータ

>''【基本構文】 create table テーブル名 (カラム名1 カラム型1, カラム名2 カラム型2, ...);''
<
** 参考資料 [#t1246396]

*** テーブルの削除(省略) [#m338309f]
*** CASL?公式 仕様書 [#v053b915]

>''【基本構文】 drop table テーブル名; ''
<
- アセンブラ言語の仕様
-- http://www.jitec.jp/1_01mosikomi/18a_annaisho/18a_11.pdf

*** データを表示する - SELECT文 [#i5975842]
*** おすすめ資料 [#b6ab7358]

>''【基本構文】 select フィールド名 from テーブル名 ; ''
<
- COMET? & CASL?
-- http://www016.upp.so-net.ne.jp/masuda2/text2/casl2/index.html
- CASL入門コーナー
-- http://www5a.biglobe.ne.jp/~teamcasl/caslkozatop.htm
- だれでも一度はアセンブラを学んでおこう!(日経BP ITPro)
-- http://itpro.nikkeibp.co.jp/members/ITPro/ITBASIC/20021218/1/
-- http://itpro.nikkeibp.co.jp/members/ITPro/ITBASIC/20021220/1/
-- http://itpro.nikkeibp.co.jp/members/ITPro/ITBASIC/20021224/1/
-- http://itpro.nikkeibp.co.jp/members/ITPro/ITBASIC/20021225/1/
-- http://itpro.nikkeibp.co.jp/members/ITPro/ITBASIC/20021226/1/

+ 前項で登録したデータを表示してみる。テーブルからレコードを取り出すには、「セレクト(SELECT)文」を使う。
+ 郵便番号と都道府県のみ選択して表示する。
 select newzip,pref from zipcode;
 +---------+--------+
 | newzip  | pref   |
 +---------+--------+
 | 0600041 | 北海道 |
 | 1540002 | 東京都 |
 | 4680039 | 愛知県 |
 | 9071801 | 沖縄県 |
 +---------+--------+
+ すべてのフィールドを表示する場合は、*記号で代用できる。
 select * from zipcode;
*** その他の資料 [#nc749b04]

** データの検索 [#x127fe34]
- アセンブラ言語入門 CASL? (東北福祉大学)
-- http://tfusvsun.tfu.ac.jp/mko/CASL2/index.html
- CプログラマのためのCASLII入門講座
-- http://www.officedaytime.com/dcasl2/pguide/index.html
- CASLII入門
-- http://ww3.tiki.ne.jp/~tno2/shikaku/casl_content.htm
- 計算機の原理とアセンブラ(電気通信大学) 
--http://www.mlab.ice.uec.ac.jp/mit/text/Jikken/casl/casl.html
- 計算機基礎(三重大学)
-- http://www.cs.info.mie-u.ac.jp/~toshi/lectures/introcomp/index.html

テーブル操作のSQL文を使ってみる。データベースの肝の部分。 あらかじめMySQLにログインしてからデータベースを選択しておくこと。

*** データを検索する - WHERE句 [#s0272778]

テーブルからデータ(レコード)を検索するには 「セレクト(SELECT)文」を使う。WHERE句で条件文をしているすることにより、条件にマッチするデータのみを表示できる。
>''【基本構文】 select フィールド名 from テーブル名 where 条件式 ; ''
<
複数の行に分けて書くこともできる。
 select フィールド名
 from テーブル名
 where 条件式 ; 

+ 古い郵便番号が「113」の、すべてのフィールドを表示する。
 select * from zipcode where oldzip='113' ;
+ 市区名が「世田谷区」の、新番号と町村名を表示する。
 select newzip,addr
 from zipcode
 where city='世田谷区' ;
+ 以下のようにすると、条件にマッチするレコードの件数が分かる。
 select count(*)
 from zipcode
 where city='国分寺市' ;
+ 以下のように「リミット(LIMIT)句」を使うと、表示する件数を限定できる。 県名が「新宿区」の、すべてのフィールドを、50件表示する。
 select *
 from zipcode
 where city='新宿区'
 limit 50;

*** ちょっと高度な検索 [#fbffe792]

以下のSQLを理解し、結果を記録してください。

+ 市区郡町村名が「渋谷区」 または 「新宿区」
 select *
 from zipcode
 where city='渋谷区' || city='新宿区' ;
+ 市区郡町村名に「島」が含まれる(likeは文字列比較、%はワイルドカード)
 select *
 from zipcode
 where city like '%島%';
+ 市区郡町村名が「中央区」 かつ 市区郡町村名が「日本橋」で始まる。
 select *
 from zipcode
 where city='中央区' && addr='日本橋%' ;

*** データの挿入 - INSERT文 [#le52b3c1]

>''【基本構文】 insert into テーブル名 (カラム名1, カラム名2, ...) values (カラム値1, カラム値2, ...); ''
<

+ テーブルにデータ(レコード)を作成するには 「インサート(INSERT)文」を使う。
 insert into zipcode
   (oldzip,newzip,pref,city,addr)
  values('060','0600041','北海道','札幌市中央区','大通東');
+ 同様にして、以下のデータを登録してください。
|旧番号|新番号 |都道府県名|市区郡町村名    |町村字名|h
|060   |0600041|北海道    |札幌市中央区    |大通東  |
|468   |4680039|愛知県    |名古屋市天白区  |西入町  |
|90718 |9071801|沖縄県    |八重山郡与那国町|与那国  |

** 課題 [#wb4812fd]

+ 「東京都町田市」の郵便番号の一覧を検索しなさい。
+ 「東京都町田市玉川学園」の郵便番号を検索しなさい。
+ 旧郵便番号が「132」だった地区の住所を検索しなさい。
+ 町字名(addr)が、「霞が関」(または、自分の好きな地名何でもいい。結果が出てくるようにしてください)を含む地区の一覧を検索しなさい。
+ 住所のどこかに「神田」の入っている地名の一覧を検索しなさい。

----


トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS