2012/10/28

[競技プログラミング][PHP][AtCoder]おとぎの国の高橋君

B - おとぎの国の高橋君

時間制限 : 2sec / スタック制限 : 10MB / メモリ制限 : 64MB

問題文

高橋君の住むAtCoder国では、
私達が普段使用する数字と同様に 10 個のアラビア数字 (0−9) の 10 進数が使われています。
しかし、私達が普段使用する数字は大小関係が 0<1<2<3<4<5<6<7<8<9 の順になっているのに対して、
AtCoder国の数字ではその大小関係が異なっています。
例えば、AtCoder国の数字では 0<9<8<7<6<5<4<3<2<1 の順になっている場合、
AtCoder国では 9 よりも 8 の方が大きいことになります。また、97 よりも 72 の方が大きいことになります。

AtCoder国の数字の大小関係といくつかの数が与えられるので、
AtCoder国の数字の大小関係で昇順に並び替えてください。
なお、私達が普段使用する数字同様、AtCoder国で最も小さい数字は 0 であることは決まっています。

入力

入力は以下の形式で標準入力から与えられる。
b0 b1 ‥‥ b9
N
a0
a1
:
:
aN−1
入力は N+2 行ある。
1 行目には、AtCoder国での 1 桁の数字の大小関係が与えられる。
AtCoder国では b0<b1<…<b9 であることを表している。
b0 は必ず 0 である。
重複する数字は存在せず、0 から 9 までの数字が 1 度ずつ現れる。
2 行目には並び替える数の個数を表す整数 N(1≦N≦777) が与えられる。
3 行目からの N 行には、j+3 行目に並び替える数を表す整数 aj(1≦aj≦777,777,777) が与えられる。

出力

与えられた数をAtCoder国の数字の大小関係にあわせて昇順に並び替え、
標準出力に 1 行に 1 つの数字ずつ出力せよ。
なお、最後には改行を出力せよ。

出典

B: おとぎの国の高橋君 - AtCoder Regular Contest #009 | AtCoder

回答

AtCoder/arc009_2.php at master · wada811/AtCoder
<?php
// デバッグ用関数
function echos($array, $line){
    echo $line . '::k: ' . implode(' ', array_keys($array)) . PHP_EOL;
    echo $line . '::v: ' . implode(' ', $array) . PHP_EOL;
}
// 変換処理はここから
$cardinalNumber = trim(fgets(STDIN));
$cardinalNumbers = explode(' ', $cardinalNumber);
fscanf(STDIN, '%d', $n);
for($i = 0; $i < $n; $i++){
    fscanf(STDIN, '%d', $targetNumbers[]);
}
// echos($targetNumbers, __LINE__);
// 14::k: 0 1 2 3 4 5 6 7 8 9
// 14::v: 1 2 3 4 5 6 7 8 9 10
// targetNumbers の数字をアルファベットに置換
$alphabets = array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j');
$numbers = array_keys($alphabets);
$targetAlphabets = str_replace($numbers, $alphabets, $targetNumbers);
// echos($targetAlphabets, __LINE__);
// 21::k: 0 1 2 3 4 5 6 7 8 9
// 21::v: b c d e f g h i j ba
// このアルファベットを cardinalNumbers の順になるようにソート
$cardinalAlphabets = array();
for($i = 0, $end = count($cardinalNumbers); $i < $end; $i++){
    $cardinalAlphabets[$i] = $alphabets[$cardinalNumbers[$i]];
}
// echos($cardinalAlphabets, __LINE__);
// 29::k: 0 1 2 3 4 5 6 7 8 9
// 29::v: a i b d f e j h g c
// targetAlphabets を cardinalAlphabets の k に置換
$numbers = array_keys($cardinalAlphabets);
$atCoderNumbers = str_replace($cardinalAlphabets, $numbers, $targetAlphabets);
// echos($atCoderNumbers, __LINE__);
// 35::k: 0 1 2 3 4 5 6 7 8 9
// 35::v: 2 9 3 5 4 8 7 1 6 20
// この数値を昇順に並べ替える
asort($atCoderNumbers);
// echos($atCoderNumbers, __LINE__);
// 40::k: 7 0 2 4 3 8 6 5 1 9
// 40::v: 1 2 3 4 5 6 7 8 9 20
// この順の k で targetNumbers を得る
$results = array();
$orders = array_keys($atCoderNumbers);
foreach($orders as $order){
    $results[] = $targetNumbers[$order];
}
// echos($results, __LINE__);
// 49::k: 0 1 2 3 4 5 6 7 8 9
// 49::v: 8 1 3 5 4 9 7 6 2 10
// 出力!
echo implode(PHP_EOL, $results) . PHP_EOL;
?>
変換してソートして逆変換するだけだとか思ってやってみたら結構大変なことになった。
数字をAtCoder国の大小関係の数字に変換しようとしたら
str_replaceで配列を渡すと多重変換されてしまうようだった。
仕方ないので適当にアルファベットを間に挟んで変換していったら混乱したので
デバッグ用関数を作ったら結構すんなり解けた。
間にアルファベットを挟む分だけわかりにくくなっているが、
変換してしまえばasortでソートするだけだし、
ソートすればインデックスがわかるので逆変換しなくても
元の数字をそのインデックスの順に出力するだけで良い。

普段よりB問題から面倒くさかったかも。C問題も難しかったし。
2012/10/27

[競技プログラミング][PHP][AtCoder]元気にお使い!高橋君

A - 元気にお使い!高橋君

時間制限 : 2sec / スタック制限 : 10MB / メモリ制限 : 64MB

問題文

ある日高橋君はお母さんに近くのスーパーまでおつかいを頼まれました。
お母さんに手渡されたおつかいメモには、買ってきて欲しい商品の値段と個数がそれぞれ書かれています。
ただしメモに書かれている値段には消費税が含まれていませんが、全ての商品には消費税が 5% かかります。
高橋君のおつかいに必要な金額を答えなさい。
なお、消費税は 1 円未満は切り捨てます。

入力

入力は以下の形式で標準入力から与えられる。
N
a0 b0
a1 b1
:
:
aN−1 bN−1
入力は N+1 行ある。
1 行目には、購入する商品の品数を表す整数 N(1≦N≦10) が与えられる。
2 行目から N 行の i+2 行目にはある商品の購入したい個数を表す整数 ai(1≦ai≦10) とその単価を表す整数 bi(1≦bi≦1,000) が空白区切りで与えられる。

出力

高橋君のおつかいに必要な金額を標準出力に 1 行で出力せよ。
なお、最後には改行を出力せよ。

出典

A: 元気にお使い!高橋君 - AtCoder Regular Contest #009 | AtCoder

回答

AtCoder/arc009_1.php at master · wada811/AtCoder · GitHub
<?php
fscanf(STDIN, '%d', $n);
$sum = 0;
for($i = 0; $i < $n; $i++){
    fscanf(STDIN, '%d %d', $num, $price);
    $sum += $num * $price;
}
$sum *= 1.05;
echo (int)$sum . PHP_EOL;
?>
個数と単価をかけて合計し、最後に消費税をかけて
小数点以下を切り捨てるだけの簡単なプログラム。
最初切り捨てを読んでなくて WA になったけど。
2012/10/26

[SQLearning][SQLite]データ型と制約の指定

SQL ゼロからはじめるデータベース操作を教材にしてSQLiteを学ぶ
SQL学習連載「SQLearning」の第3回です。

前回: [SQLearning][SQLite]テーブルの作成・確認・削除 | DevAchieve
第3回は「データ型と制約の指定」についてです。

データ型の指定

以下の CREATE 文を例にデータ型と制約の指定について解説します。
CREATE TABLE IF NOT EXISTS products (
    id          INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
    name        TEXT    NOT NULL UNIQUE,
    description TEXT    NULL,
    price       INTEGER NOT NULL CHECK(price > 0),
    tax_free    INTEGER NOT NULL DEFAULT 0 CHECK(tax_free IN (0, 1)),
    reg_date    TEXT    NOT NULL DEFAULT CURRENT_DATE
);
SQLite では動的型付けシステムを使用していて、データ型はカラムではなく値自体に関連付けられます。
ストレージクラスとして定義されていますが、これらはほぼデータ型と同じと考えることができます。
NULL
NULL値
INTEGER
符号付き整数。桁数によって1, 2, 3, 4, 6 バイトで保存される。
REAL
浮動小数点数。8バイトで保存される。
TEXT
文字列。データベースのエンコーディング(UTF-8, UTF-16BE もしくは UTF-16LE)で保存される。
BLOB
バイナリデータ(Binary Large OBject)。入力データがそのまま保存される。

Boolean
真偽値を格納する Boolean 型はありません。かわりに INTEGER 型の 0(false), 1(true) として保存します。
Date 型と Time 型
Date 型, Time 型, DateTime 型はありません。
かわりに組み込みのDate And Time Functionsが INTEGER, TEXT, REAL のいずれかとして保存します。
INTEGER: 1970-01-01 00:00:00 UTC からの秒数である Unix Time
TEXT: ISO8601 表記の文字列("YYYY-MM-DD HH:MM:SS.SSS")
REAL: 先発グレゴリオ暦にしたがった紀元前4714年11月24日、
グリニッジ標準時における正午からのユリウス日数(関連: ユリウス通日)
REAL はちょっと意味がわかりませんね。

また、SQLite では他の RDBMS との互換性のために Type Affinity (型の類似性)という概念が導入されています。
  • TEXT: ストレージクラスの NULL, BLOB, TEXT のすべてのデータを含みます。
  • NUMERIC: ストレージクラスの5つすべてを含みます。データは変換される可能性があります。
  • INTEGER: NUMERIC とほぼ同じ振る舞いをします。違いは CAST 方法のみです。
  • REAL: NUMERIC とほぼ同じ振る舞いをします。違いは浮動少数表現を強制する点です。
  • NONE: 他のストレージクラスへの変換をしません。
Datatypes In SQLite Version 3

制約の指定

NULL と NOT NULL
NULL は NULL値を許容し、NOT NULL は NULL値 を入れることができなくなります。
DEFAULT
デフォルト値を設定することができます。
INSERT時の日時をデフォルト値にすることのできる以下のキーワードを設定することもできます。
CURRENT_TIMEHH:MM:SS 形式
CURRENT_DATEYYYY-MM-DD 形式
CURRENT_TIMESTAMPYYYY-MM-DD HH:MM:SS 形式
PRIMARY KEY
主キーを設定することができます。INTEGER と組み合わせることで AUTOINCREMENT を実現できます。
しかし、その場合はデータ削除に再び同じ値が入ります。
AUTOINCREMENT
明示的に指定するとデータ削除後は削除した値にはならず次に大きい値が入ります。
UNIQUE
指定すると unique(一意な)値のみを受け入れます。
INSERT または UPDATE 時に既存の値と重複した値を指定するとエラーになります。
NULL を許容する場合、それぞれの NULL値は異なる値として扱われます。
CHECK(条件式)
条件式を満たす値のみを許容します。条件式にサブクエリを含めることはできません。
INSERT または UPDATE 時に条件式を満たさない値を指定するとエラーになります。
ver. 3.3.0 からサポートされました。ver. 3.3.0 以前では指定しても無視されます。

SQLite Query Language: CREATE TABLE

次回

次回は「テーブルの変更」についてを予定しています。

SQL ゼロからはじめるデータベース操作 (CD-ROM付) (プログラミング学習シリーズ)
SQL ゼロからはじめるデータベース操作 (CD-ROM付) (プログラミング学習シリーズ)
2012/10/05

[SQLearning][MySQL]データ型・制約の指定

SQL ゼロからはじめるデータベース操作を教材にしてMySQLを学ぶ
SQL学習連載「SQLearning」の第3回です。
前回: [SQLearning][MySQL]テーブルの作成・確認・削除
第3回は「データ型・制約の指定」の指定についてです。

データ型の指定

以下の CREATE 文を例にデータ型と制約の指定について解説します。
CREATE TABLE products (
    id          int(11)      NOT NULL AUTO_INCREMENT COMMENT '商品ID',
    name        varchar(255) NOT NULL UNIQUE         COMMENT '商品名',
    description text                                 COMMENT '商品の説明',
    price       int(11)      NOT NULL                COMMENT '商品の値段',
    tax_free    tinyint(1)   NOT NULL DEFAULT 0      COMMENT '非課税フラグ',
    reg_date    datetime     NOT NULL                COMMENT '登録日',
    PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT '商品テーブル';
int(11)
数値型です。カッコは表示幅です。値の範囲に影響を与えるものではありません。
ZEROFILL を続いて指定することによってスペースで調整される表示幅を 0 で埋めることができます。
値の範囲は -2147483648 ~ 2147483647 ですが、UNSIGNED をつければ 0 ~ 4294967295 になります。
MySQL :: MySQL 5.1 リファレンスマニュアル :: 10.2 数値タイプ
varchar
可変長の文字列型です。カッコは文字数です。(※4.1以前まではバイト数でした)
MySQL :: MySQL 3.23, 4.0, 4.1 Reference Manual :: 10.4.1 The CHAR and VARCHAR Types
(Before MySQL 4.1, the length is interpreted as number of bytes.)
MySQL 5.0.3以前は varchar は 255 バイト まででした。それ以降のバージョンでは 65535 バイト、
メタデータを除き 65532 バイト まで入れることができます。
MySQL :: MySQL 5.0 Reference Manual :: 11.1.6.1 The CHAR and VARCHAR Types
The length can be specified as a value from 0 to 255 before MySQL 5.0.3, and 0 to 65,535 in 5.0.3 and later versions.
文字コードが utf8 の場合は1文字3バイトなのでカッコに指定できるのは(65532/3=)21844くらいまでです。(*1)
それ以上の数を指定すると MySQLが自動的に mediumtext などに変換します。
(*1)メタデータの領域があるのか僕の環境では varchar(21835) までしか varchar として作成できませんでした。
text
可変長の文字列型です。varchar とは異なりデフォルト値を設定できません。
用途としては varchar とほとんど同じですが varchar がテーブルにインラインに格納されているのに対して
text は文字列を別ファイルとして持ち、カラムはファイルへのポインタを持っているようです。
この件については複雑な問題ですが以下の投稿によくまとまっています。
Takahiko HORIUCHI - Google+ - RDBMS に MySQL を採用したシステムで、VARCHAR の代わりに TEXT…
varchar(10000)とかで指定するくらいなら text にした方がパフォーマンス的に良いようです。
tinyint(1)
MySQL によって BOOL / BOOLEAN が内部変換された数値型です。
主にフラグ系の値を格納するのに使います。値の範囲は -127 ~ 128 です。
datetime
日時を格納する日付型です。'YYYY-MM-DD HH:MM:SS'形式で日時を保存します。

データ型は詳しく書くとリファレンスマニュアル並みの分量になるのでココでは簡単に紹介するだけに留めます。
詳しく知りたい方はMySQL :: MySQL 5.1 リファレンスマニュアル :: 10 データタイプを読むといいでしょう。

カラムの制約の指定

NULL と NOT NULL
description は NULL を許容するので NULL を指定していますが、
他のカラムは NULL を入れたくないので NOT NULL を指定します。
DEFAULT
デフォルト値を指定したい場合は DEFAULT [指定したい値] と記述します。
discount カラムはフラグを 0, 1 で管理したいのでデフォルト false で 0 を指定する、などのように使います。
AUTO_INCREMENT
id などのように自動で連番を振りたい場合は AUTO_INCREMENT を指定します。
UNIQUE
すべての値が一意でなければならない制限を指定します。
INSERT または UPDATE 時に既存の値と同じ値になる場合はエラーが発生します。
NULL を許容する場合、すべての NULL値は異なる値として扱われます。
COMMENT
カラムに対するコメントを記述することができます。
SQL 文のコメントとは異なり、SHOW CREATE TABLE 文で CREATE TABLE 文を表示した時にも表示されます。
phpMyAdmin などを使用する場合はコメントが表示されるのでフラグ系の各値の意味を記述しておくと便利です。

テーブルの制約の指定

PRIMARY KEY ( [カラム名] )
このテーブルの主キーを設定することができます。

テーブルの設定

ENGINE
データベースのストレージエンジンを指定することができます。
InnoDB と MyISAM が有名ですが 5.5 では InnoDB がデフォルトなようです。
以下のクエリでストレージエンジンの種類を確認すすることができます。
mysql> SHOW ENGINES;
MySQL :: MySQL 5.1 リファレンスマニュアル :: 12.5.4.13 SHOW ENGINES 構文
また、以下のクエリで各テーブルが使用しているストレージエンジンを確認することができます。
mysql> SHOW TABLE STATUS;
MySQL :: MySQL 5.1 リファレンスマニュアル :: 12.5.4.27 SHOW TABLE STATUS 構文
DEFAULT CHARSET
使用する文字セットを指定することができます。日本語を扱うなら utf8(utf8_general_ci)が一般的です。
以下のクエリでサポートしている文字セットを確認することができます。
mysql> SHOW CHARACTER SET;
MySQL :: MySQL 5.1 リファレンスマニュアル :: 12.5.4.2 SHOW CHARACTER SET 構文
実行結果
MySQL :: MySQL 5.1 リファレンスマニュアル :: 9.10 MySQL でサポートされるキャラクタセットと照合順序
MySQL :: MySQL 5.5 Reference Manual :: 10.1.14 Character Sets and Collations That MySQL Supports
COLLATE
照合順序を設定することができます。文字列を比較する際に順位を決める設定です。
DEFAULT CHARSET が utf8 の場合、省略すると utf8_general_ci が設定されます。
ちなみに utf8_general_ci の ci は case-insensitive の略で、大文字小文字を区別しないという意味なので
大文字小文字を区別したい場合は utf8_bin などを指定します。
以下のようなクエリで照合順序の一覧を表示します。
mysql> SHOW COLLATION like 'utf8%';
MySQL :: MySQL 5.1 リファレンスマニュアル :: 12.5.4.3 SHOW COLLATION 構文
COMMENT
テーブルに対してもコメントを記述することができます。

次回

次回は「テーブルの変更」についてを予定しています。

SQL ゼロからはじめるデータベース操作 (CD-ROM付) (プログラミング学習シリーズ)
SQL ゼロからはじめるデータベース操作 (CD-ROM付) (プログラミング学習シリーズ)
2012/10/04

[SQLearning][SQLite]テーブルの作成・確認・削除

SQL ゼロからはじめるデータベース操作を教材にしてSQLiteを学ぶ
SQL学習連載「SQLearning」の第2回です。

前回: [SQLearning][SQLite]ログインとデータベースの作成・削除 | DevAchieve
第2回は「テーブルの作成・確認・削除」についてです。

テーブルの作成

CREATE TABLE products (
    id          INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
    name        TEXT    NOT NULL,
    description TEXT    NULL,
    price       INTEGER NOT NULL,
    discount    INTEGER NOT NULL DEFAULT 0,
    reg_date    TEXT    NOT NULL
);
すでにテーブルが存在する場合はエラーになりますが IF NOT EXISTS と書くことでエラーを防ぐことができます。
CREATE TABLE IF NOT EXISTS products (
    id          INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
    name        TEXT    NOT NULL,
    description TEXT    NULL,
    price       INTEGER NOT NULL,
    discount    INTEGER NOT NULL DEFAULT 0,
    reg_date    TEXT    NOT NULL
);
SQLite Query Language: CREATE TABLE

テーブルの確認

.tables
テーブルの一覧を表示します。
sqlite> .tables
.schema
CREATE TABLE 文を表示します。
sqlite> .schema products

テーブルの削除

DROP TABLE products;
すでにテーブルが存在する場合はエラーになりますが IF EXISTS と書くことでエラーを防ぐことができます。
DROP TABLE IF EXISTS products;

次回

次回は「データ型・制約の指定」についてを予定しています。

SQL ゼロからはじめるデータベース操作 (CD-ROM付) (プログラミング学習シリーズ)
SQL ゼロからはじめるデータベース操作 (CD-ROM付) (プログラミング学習シリーズ)
2012/10/03

[競技プログラミング][PHP][K2PC Easy]ハンバーガー

A - ハンバーガー(Hamburger)

時間制限 : 1sec / スタック制限 : 128MB / メモリ制限 : 256MB

問題文

kyuridenamidaは, K2PCというレストランでバイトをしている.
彼は受付を担当しているが, 時給が810円と低いので, 時給が893円の厨房を担当したいと考えている.

厨房では, K2PCレストランの(唯一の商品であり)目玉商品であるK2PCハンバーガーを作る仕事が行われている.
ハンバーガーを1個作るには, 肉が1枚, パンが2枚, トッピング類が3個必要である.
今, 肉がa枚, パンがb枚, トッピング類がc個あるとする.
ハンバーガーをN個作るためには, それぞれの材料が残りいくつ必要か求めよ.

入力

a b c
N
1行目に, 今ある肉の枚数, パンの枚数, トッピングの個数を表す整数がこの順に入力される.
2行目に, 作りたいハンバーガーの個数を表す整数が入力される.

出力

それぞれの材料がいくつ必要かを, 肉の枚数, パンの枚数, トッピングの個数の順でスペース区切りで出力せよ.
改行を忘れないように注意すること.

出典

A: ハンバーガー(Hamburger) - Kyuride Kagamiz Programming Contest (Easy) | AtCoder

解答

AtCoder/k2pc_easy_1.php at master · wada811/AtCoder · GitHub
<?php
fscanf(STDIN, "%d %d %d", $a, $b, $c);
fscanf(STDIN, "%d", $n);
$n_a = max($n * 1 - $a, 0);
$n_b = max($n * 2 - $b, 0);
$n_c = max($n * 3 - $c, 0);
echo $n_a . ' ' . $n_b . ' ' . $n_c . PHP_EOL;
?>
なんかやってたから解いてみたけどこれくらいしか解けなかった。
次の問題のビットマニアは問題がまずよくわからなかったし読むのが面倒だった。
2012/10/02

[書評]プログラミングコンテストチャレンジブック [第2版]

プログラミングコンテストチャレンジブック [第2版] ~問題解決のアルゴリズム活用力とコーディングテクニックを鍛える~
秋葉拓哉
マイナビ
発売日:2012-01-28
ブクログでレビューを見る»
実際のプログラミングコンテストで出題された問題などを元に
アルゴリズムの解説をしている本。
深さ優先探索と幅優先探索でわーわー言ってるレベルなので
難しいし白黒だしで睡眠導入剤でした。
本自体は色々な手法や色々な問題を解説していて凄いのだけど
理解するには一つ一つの手法に対してもっと練習問題がないときついと思いました。
AtCoderの問題を@chokudai さんが解答手法を呟いてくれるので
この本でその手法を調べてAtCoderの問題に適用していけば練習になりそうです。
何もなしで、ただ読むだけだと睡眠導入剤にしかならない。途中で読むのを諦めた。

深さ優先探索とか幅優先探索でわーわー言ってるレベルでも徐々にステップアップしていける本があるといいな。
プログラミングコンテストチャレンジブック [第2版] ~問題解決のアルゴリズム活用力とコーディングテクニックを鍛える~
プログラミングコンテストチャレンジブック [第2版] ~問題解決のアルゴリズム活用力とコーディングテクニックを鍛える~
2012/10/01

[SQLearning][MySQL]テーブルの作成・確認・削除

SQL ゼロからはじめるデータベース操作を教材にしてMySQLを学ぶ
SQL学習連載「SQLearning」の第2回です。
第1回: [SQLearning][MySQL]ログインとデータベースの作成・削除
第2回の今回は「テーブルの作成・確認・削除」についてです。

データベースの選択

第1回で作成した shop データベースにテーブルを作成するわけですが、
まずはテーブルを作成するクエリを投げる前にデータベースを選択しなければいけません。
データベースを選択していないとERROR 1046 (3D000): No database selectedというエラーが発生します。
mysql> USE shop;
MySQL :: MySQL 5.1 リファレンスマニュアル :: 12.3.3 USE 構文

テーブルの作成

CREATE TABLE Shohin (
    shohin_id     CHAR(4)       NOT NULL,
    shohin_mei    VARCHAR(100)  NOT NULL,
    shohin_bunrui VARCHAR(32)   NOT NULL,
    hanbai_tanka  INTEGER       ,
    shiire_tanka  INTEGER       ,
    torokubi      DATE          ,
    PRIMARY KEY (shohin_id)
);
すでにテーブルが存在する場合はエラーになりますが IF NOT EXISTS と書くことでエラーを防ぐことができます。
CREATE IF NOT EXISTS TABLE Shohin (
    shohin_id     CHAR(4)       NOT NULL,
    shohin_mei    VARCHAR(100)  NOT NULL,
    shohin_bunrui VARCHAR(32)   NOT NULL,
    hanbai_tanka  INTEGER       ,
    shiire_tanka  INTEGER       ,
    torokubi      DATE          ,
    PRIMARY KEY (shohin_id)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
MySQL :: MySQL 5.1 リファレンスマニュアル :: 12.1.8 CREATE TABLE 構文

テーブルの確認

テーブル情報はいくつかのクエリで確認することができます。
SHOW TABLES 構文
データベースのテーブル一覧を表示します。
mysql> SHOW TABLES;
+----------------+
| Tables_in_shop |
+----------------+
| Shohin         |
+----------------+
MySQL :: MySQL 5.1 リファレンスマニュアル :: 12.5.4.28 SHOW TABLES 構文
DESCRIBE 構文 または SHOW COLUMNS 構文
データ型や制約などを表示します。DESCRIBE 構文は SHOW COLUMNS 構文 のショートカットです。
mysql> DESCRIBE Shohin;
または
mysql> DESC Shohin;
または
mysql> SHOW COLUMNS FROM Shohin;
+---------------+--------------+------+-----+---------+-------+
| Field         | Type         | Null | Key | Default | Extra |
+---------------+--------------+------+-----+---------+-------+
| shohin_id     | char(4)      | NO   | PRI | NULL    |       |
| shohin_mei    | varchar(100) | NO   |     | NULL    |       |
| shohin_bunrui | varchar(32)  | NO   |     | NULL    |       |
| hanbai_tanka  | int(11)      | YES  |     | NULL    |       |
| shiire_tanka  | int(11)      | YES  |     | NULL    |       |
| torokubi      | date         | YES  |     | NULL    |       |
+---------------+--------------+------+-----+---------+-------+
MySQL :: MySQL 5.1 リファレンスマニュアル :: 12.3.1 DESCRIBE 構文
SHOW TABLE STATUS 構文
テーブルに関するさらに詳しい情報を表示します。
mysql> SHOW TABLE STATUS;
+--------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------------+----------+----------------+---------+
| Name   | Engine | Version | Row_format | Rows | Avg_row_length | Data_length | Max_data_length | Index_length | Data_free | Auto_increment | Create_time         | Update_time | Check_time | Collation       | Checksum | Create_options | Comment |
+--------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------------+----------+----------------+---------+
| Shohin | InnoDB |      10 | Compact    |    0 |              0 |       16384 |               0 |            0 |   9437184 |           NULL | 2012-09-29 22:44:57 | NULL        | NULL       | utf8_general_ci |     NULL |                |         |
+--------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------------+----------+----------------+---------+
MySQL :: MySQL 5.1 リファレンスマニュアル :: 12.5.4.27 SHOW TABLE STATUS 構文
SHOW CREATE TABLE 構文
CREATE 文を表示します。
mysql> SHOW CREATE TABLE Shohin;
CREATE TABLE `Shohin` (
  `shohin_id` char(4) NOT NULL,
  `shohin_mei` varchar(100) NOT NULL,
  `shohin_bunrui` varchar(32) NOT NULL,
  `hanbai_tanka` int(11) DEFAULT NULL,
  `shiire_tanka` int(11) DEFAULT NULL,
  `torokubi` date DEFAULT NULL,
  PRIMARY KEY (`shohin_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
MySQL によって自動的に変換されていることがわかります。
MySQL :: MySQL 5.1 リファレンスマニュアル :: 12.5.4.9 SHOW CREATE TABLE 構文

テーブルの削除

mysql> DROP TABLE Shohin;
テーブルが存在していなかった場合はエラーになりますが IF EXISTS と書くことでエラーを防ぐことができます。
mysql> DROP TABLE IF EXISTS Shohin;
MySQL :: MySQL 5.1 リファレンスマニュアル :: 12.1.14 DROP TABLE 構文

次回

次回は「データ型・制約の指定」についてを予定しています。
SQL ゼロからはじめるデータベース操作 (CD-ROM付) (プログラミング学習シリーズ)
SQL ゼロからはじめるデータベース操作 (CD-ROM付) (プログラミング学習シリーズ)

タグ(RSS)