■表の基本要素
- 表名
- 列名
- 列のデータ型(それぞれの列に必要)
■オプション
- 列の制約
- 表の制約
- (表を置く)表領域名
- 記憶領域パラメータ
■補足
表領域名を指定せずに表を作成した場合、表は
作成したユーザのデフォルト表領域に作成される。
(作成したユーザにデフォルト表領域の指定がない場合、SYSTEM表領域に作成される。)
↓
ユーザ作成時、デフォルト表領域の指定は行うべきである。
(ただし、QUOTAの指定も同時に行わないと意味がない!)
■構文
CREATE TABLE 表名 (
列名 列のデータ型,
[列名 列のデータ型]
)
[TABLESPACE 表領域名]
[記憶領域パラメータ];■表名・列名の命名規則
- 長さは30バイトまで
- 先頭は数字以外の文字(全角の数字も使用不可:「1」は×、「一」はOK)
- 英数字(0〜9、A〜Z、a〜z)、漢字、ひらがな、カタカナが使用可
(半角カタカナは使うべきではない)- 記号は「$」「_」「#」のみ使用可
- Oracleの予約語は使用不可
- 大文字/小文字は区別されない(すべて大文字で登録される)
- 同一スキーマ内で重複する名前は使用不可(違うスキーマ内では可)
例)、CREATE TABLE syokuin_master (id NUMBER(6), name VARCHAR2(50));
- テーブル名「syokuin_master」、列名「id」「name」は、すべて大文字で登録される。
- Oracleでは大文字、小文字は区別されないので、どちらを使っても検索できる。
SELECT * FROM syokuin_master;
SELECT * FROM SYOKUIN_MASTER;■命名規則の例外
表名や列名を””(ダブルクォーテーション)で囲んで作成すると、「$」「_」「#」以外の記号を使用したり、大文字/小文字を区別した名前を付けられる。
例)、CREATE TABLE "syokuin_master" (id NUMBER, name VARCHAR2);
- テーブル名「syokuin_master」は小文字、列名「id」「name」は大文字で登録される。
- SELECT * FROM syokuin_master;
では検索できない。
SELECT * FROM "syokuin_master";
なら検索できる。■補足
CREATE TABLEを実行するには、次の条件を満たしているユーザで行う必要がある。
- CREATE TABLE権限を持つ
- テーブルを格納する予定の表領域に対して、クォータを持つ
■DESCRIBEコマンド
SQL*Plusのコマンド(データ・ディクショナリではない)。
列の名前とデータ型、NOT NULL制約の状態を表示する。使い方)DESC(RIBE) 表名
■データ・ディクショナリ
- USER_TABLES
- 同一スキーマ内のテーブル名などを表示
- USER_TAB_COLUMNS
- 同一スキーマ内のテーブルの列情報などを表示
DESCRIBE命令で、各データディクショナリの項目を確認しよう。
また、実際に使ってみよう。
■構文
DROP TABLE 表名;
- 表を削除できるのは、
表のオーナー(作成者)だけである。- 表削除後、ロールバックで
削除を取り消すことはできない。
(CREATE TABLE, DROP TABLEはDDL文のため)- 親と子の関係にある2表(Accessでいうリレーションシップの張ってある表)を削除する際はオプションが必要(7−5で解説)。
■データ型の種類
- 1.VARCHAR2:可変長文字列型
- 長さが可変である文字列データを格納。定義時に最大何バイトかを指定しなければならない。
- 2.CHAR:固定長文字列型
- 長さが固定されている文字列データを格納。長さを省略した場合(デフォルト)は1(バイト)。
- 3.LONG:可変長文字列型
- 長さが可変である文字列データを格納。最大文字長の指定は不要(指定するとエラー)。
- 4.NUMBER:数値型
- 数値(整数、実数)データを格納。定義時に全体の桁数と小数点以下の桁数を指定しなければならない。小数点以下の桁数を省略した場合(デフォルト)は0桁。
- 5.DATE:日付時刻型
- 日付と時刻のデータを格納(日付のみ、時刻のみではない)。日付のみ入力すると、時刻は0時0分0秒に、時刻のみ入力すると、日付は入力した日付になる。精度は秒単位。
- 6.RAW:可変長バイナリデータ型
- 長さが可変であるバイナリデータを格納。定義時に最大何バイトかを指定しなければならない。
- 7.LONGRAW:可変長バイナリデータ型
- RAW型の限界よりも大きなバイナリデータを格納。索引(インデックス)は作成できない。また、1つの表に1つの列しか作成できない。
- 8.BLOB:可変長バイナリデータ型
- LONGRAW型の限界よりも大きなバイナリデータを格納(最大4GB)。索引は作成できない。また、1つの表に2つ以上の列を作成でき、BLOB型の列のみを表とは別の表領域に格納できる。
- 9.CLOB:可変長文字列型
- 最大4GBの可変長文字列データを格納。ただし、Shift-JISやEUCを扱うデータベースでは定義できない(日本語環境では使えない)。
- 10.BFILE:ファイルポインタ型
- 外部ファイルへのポインタを格納。データベース外のファイルを参照できる。(Oracle8より実装)
- 11.NCHAR、NVARCHAR2、NCLOB:各国キャラクタセット用
- 2バイトの文字のみを扱うキャラクタセットで作成されたデータベースでのみ使用可能なデータ型。
■データの切り捨て
表からデータを削除するにはDELETE文を、表自体を削除するにはDROP TABLE文を使用するが、もう1つ、
TRUNCATE TABLEというDCLがある。《構文》
TRUNCATE TABLE 表名; 《機能》
- 指定したテーブルのデータを全て削除する(表自身は残る)。
- WHERE句で削除する範囲を指定することはできない(全件削除のみ)。
- ROLLBACKで
削除データを元に戻すことはできない。- ロールバックデータを残さないため、DELETE FROM 表名;よりも
高速に処理できる。
問題1
表名と列名の命名規則として正しいものを答えよ。
- ORDERという名前の表を作成できる
- 名前に「−(ハイフン)」を使用できる(””で囲まないものとする)
- 名前の長さは30バイトまでである
- 同じユーザが所有する複数の表には、同じ名前をつけることができる
- 同じユーザが所有する複数の表には、 表の格納場所(表領域)が違えば同じ名前をつけることができる
問題2
SQL文を実行したら、次のような結果になった。
SQL> CREATE TABLE a(id number, name varchar2(30));
表が作成されました。
SQL> CREATE TABLE aa(2_id number, 2_name varchar2(30));
エラー行:1:エラーが発生しました。2つめのSQL文がエラーになった原因を説明せよ。
問題3
表の全行を削除するが、この削除作業はアプリケーションの仕様から考えて、取り消されるという可能性を考慮する必要はない。この場合、どのSQLを使うべきか答えよ。
- DELETE
- DROP
- TRUNCATE
- RENAME