27章 テーブル作成
今までSELECT,INSERT,UPDATE,DELETEコマンドなど学んできました。
今回はテーブルの作成方法について学んでいきましょう。
それではさっそく表を作成する構文を確認していきましょう。
CREATE TABLE文
  [構文] テーブルの作成
 CREATE TABLE 表名
 ( 列名 データ型 ,
  列名 データ型 , …);
複数の列名を指定したい場合、構文のように列名とデータ型を追加していきます。
カンマもあるので忘れずに。
テーブルを作成するためには列とデータ型を指定する必要があります。
データ型は、数値を格納するNUMBER,文字を格納するCHAR,VARCHAR2、
日付を格納するDATE型などその他にもたくさんあります。
テーブル作成時にはこれらのデータ型を指定していきます。
それでは実行例を見ていきましょう。
  SQL> CREATE TABLE test
    2> ( id number(5),
    3>   name varchar2(10)
    4  );
  Table created.
  
今回の例では、数値データを格納するID列、
文字データを格納するNAME列を持つTEST表を作成しました。
では表の構造を確認してみましょう。
  SQL> desc test
   Name                 Null?    Type
   -------------------- -------- ----------------------------
   ID                            NUMBER(5)
   NAME                          VARCHAR2(10)
   
ちゃんと作成されています。
  SQL> select * from test;
  no rows selected
  
まだレコードを追加していないので行は表示されません。
1行挿入してみます。
  SQL> insert into test values (1,'TEST');
  1 row created.
  SQL> select * from test;
          ID NAME
  ---------- ----------
           1 TEST
  SQL> commit;
  Commit complete.
一連の実行例を見ていきました。このようにして表を作成し、行を追加していきます。
データ型
それではデータ型を詳しく確認していきましょう。
NUMBER型
NUMBERは数値データを格納します。
カッコ内には格納する桁数と小数点桁数を指定することができます。
NUMBER(5)と指定した場合は数値の整数5桁を格納できます。
12345  → 「12345」で格納
123.45 → 「123」で格納
123.6   → 「124」で格納(四捨五入)
123456 → NG
123456は6桁となるため、格納できません。
NUMBER(5,2)と指定した場合は小数点第2位までの合計5ケタを格納できます。
123.45 → 「123.45」で格納
123.456 → 「123.46」で格納(四捨五入)
1234  →  NG
12345  →  NG
今回は小数点が2桁、整数は3桁を格納するため、「1234」「12345」は格納できません。
CHAR,VARCHAR2型
CHARとVARCHAR2は文字データを格納します。
CHARは最大2000バイト、VARCHAR2は最大4000バイト格納できます。
CHAR(10),VARCHAR2(10)は10バイトの文字データを格納します。
アルファベットはシングルバイトとよばれ、1字1バイトですが、
カタカナ、ひらがな、漢字はマルチバイトと呼ばれ、2バイト(3バイトの場合もあり)を
必要とする文字となります。
またCHARは固定長、VARCHAR2は可変長のデータ型となります。
固定長とは指定したサイズ分領域が使われるデータ型です。
例えば、以下の様にデータ型を指定したとします。
CHAR(10)      = 'AAA'
VARCHAR2(10)  = 'AAA'
上記の様にAAAという文字を挿入した場合、CHARは必ず10バイトの領域を使用します。
VARCHAR2の場合は3バイトの領域を使用します。
と言っても、両方ともWHERE 列名 = 'AAA'でデータを検索できます。
どちらのデータ型を使うのが良いかというと、これもアプリケーションの要件次第です。
固定長のメリットは予め領域を取る仕様の為、
データがきれいに並んで格納されるメリットがあります。
これはSELECT文の性能が早くなることを意味しますが、
領域を無駄に使用するかもしれません。
可変長の場合はその逆のメリットがあります。
例えば郵便番号は7ケタ、携帯番号は11ケタと今のところ固定です。
このようなデータはCHARのほうが良いです。
ただ、これらは番号なのでNUMBER型を使用する可能性もありますね。
一方、メールアドレスは人によって長さも異なるため、この場合はVARCHAR2を使用します。
データ型の一覧です。
データ型一覧
| データ型 | タイプ | 最大値 | 内容 | 
| NUMBER | 数値 | 38B | 固定小数点数、 浮動小数点数を
 格納
 | 
| CHAR | 文字(固定長) | 2000バイト | 固定長の文字列を格納。デフォルト値は1バイト | 
| VARCHAR2 | 文字(可変長) | 4000バイト | 可変長の文字列を格納。デフォルト値はなし | 
| DATE | 日付 |  | 年、月、日、時、分および秒を格納 | 
| TIMESTAMP | 日付 |  | 年、月、日、時、分および秒を格納。またDATE型では格納されない少数秒も格納 | 
| BLOB | バイナリ | 128テラバイト | バイナリ・データをデータベースに格納 | 
そのほかにも色々なデータ型があるので、マニュアルを参考にしてみてください。
とりあえず実行例を確認していきましょう。
  SQL> CREATE TABLE emp1
    2  ( id number(5),
    3    name varchar2(30),
    4    hire_date date);
  Table created.
  SQL> desc emp1
  
   Name               Null?    Type
   ------------------ -------- ----------------------------
   ID                          NUMBER(5)
   NAME                        VARCHAR2(30)
   HIRE_DATE                   DATE
  SQL> insert into emp1 values (1,'Tom',SYSDATE);
  1 row created.
  SQL> select * from emp1;
          ID NAME            HIRE_DATE
  ---------- --------------- ----------
           1 Tom             19-AUG-13
  SQL> commit;
  Commit complete.
テーブル作成を行うことでアプリケーションで使用する
テーブルを作成することができるようになります。
今回のINSERT文はID列には1、NAME列にはTom、
HIRE_DATE列にはSYSDATE関数により、現在の日付が挿入されました。
  SQL> insert into emp1(id) values (2);
  SQL> select * from emp1;
  
          ID NAME                           HIRE_DATE
  ---------- ------------------------------ ----------
           1 Tom                            19-AUG-16
           2
今回の実行例では、id列だけ値を挿入しているため、
その他の列の値はNULLとなっています。
デフォルト値
INSERT時に指定しなかった列は初期値を
入れておきたいという場合もあるかと思います。
そのような時には、表を作成するときに初期値を設定することができます。
また初期値のことをデフォルト値といいます。
  [構文] デフォルト値
 ( 列名 データ型 DEFAULT デフォルト値,
  列名 データ型 , …);
テーブル作成の構文でデータ型の後にDEFAULTと指定し、
デフォルト値として設定したい値を指定します。
この時、デフォルトの値は必ずデータ型と同じ値を指定してください。
CHAR,VARCHAR2であれば、文字データを指定します。
NUMBERであれば、数値データを指定します。DATEであれば日付データです。
では実行例を見ていきましょう。
  SQL> CREATE TABLE emp2
    2  ( id number(5),
    3    name varchar2(30) DEFAULT 'AAAA',
    4    hire_date date DEFAULT SYSDATE);
 Table created.
  SQL> desc emp2
  Name                Null?    Type
  ------------------- -------- ------------------
  ID                           NUMBER(5)
  NAME                         VARCHAR2(30)
  HIRE_DATE                    DATE
  SQL> insert into emp2(id) values (1);
  1 row created.
  SQL> select * from emp2;
          ID NAME              HIRE_DATE
  ---------- ----------------- ----------
           1 AAAA              19-AUG-16
NAME列にはデフォルト値のAAAA、HIRE_DATE列にはデフォルト値
のSYSDATE関数によって、現在の日付が挿入されていますね。
テーブルに定義されているデフォルト値の確認方法は、データディクショナリで確認します。
データディクショナリは「22章 データディクショナリ」で詳しく紹介しています。
  SQL> SELECT table_name,column_name,data_default
    2  FROM user_tab_columns
    3  WHERE table_name = 'EMP2';
    TABLE_NAME COLUMN_NAME       DATA_DEFAULT
  ------------ ----------------- ---------------
          EMP2 ID                
          EMP2 NAME              AAAA
          EMP2 HIRE_DATE         SYSDATE
いかがでしたでしょうか。テーブルの作成はそこまで難しい構文ではありませんでしたが、
データ型に関しては奥が深いですね。次回は制約についてご紹介していきましょう。