オブジェクト名は、修飾されていない場合と修飾されている場合があります。 名前の解釈があいまいでないコンテキストでは、修飾されていない名前を使用できます。 修飾名には、デフォルトコンテキストをオーバーライドするか、欠落しているコンテキストを提供することによって解釈コンテキストを明確にするための修飾子が少なくとも 1 つ含まれています。
たとえば、次のステートメントは、修飾されていない名前 t1
を使用してテーブルを作成します:
CREATE TABLE t1 (i INT);
t1
にはデータベースを指定する修飾子が含まれていないため、このステートメントはデフォルトデータベースにテーブルを作成します。 デフォルトのデータベースがない場合は、エラーが発生します。
次のステートメントは、修飾名 db1.t1
を使用してテーブルを作成します:
CREATE TABLE db1.t1 (i INT);
db1.t1
にはデータベース修飾子 db1
が含まれているため、このステートメントは、デフォルトのデータベースに関係なく、db1
という名前のデータベースに t1
を作成します。 デフォルトのデータベースがない場合は、修飾子を指定する必要があります。 修飾子は、デフォルトデータベースがある場合、デフォルトとは異なるデータベースを指定する場合、またはデフォルトが指定したものと同じ場合にデータベースを明示的にする場合に指定できます。
クオリファイアには次の特性があります:
修飾されていない名前は単一の識別子で構成されます。 修飾名は複数の識別子で構成されます。
複数部分名のコンポーネントは、ピリオド (
.
) 文字で区切る必要があります。 マルチパート名の最初の部分は、最終識別子を解釈するコンテキストに影響する修飾子として機能します。修飾子文字は別個のトークンであり、関連付けられた識別子と隣接する必要はありません。 たとえば、
tbl_name.col_name
とtbl_name . col_name
は同等です。複数部分名のコンポーネントを引用符で囲む必要がある場合、名前全体を引用符で囲むのではなく、各コンポーネントを個別に引用符で囲んでください。 たとえば、
`my-table.my-column`
ではなく、`my-table`.`my-column`
と記述します。修飾名内でピリオドのあとに続く予約語は識別子である必要があるため、そのコンテキストでは引用符で囲む必要はありません。
オブジェクト名に使用できる修飾子は、オブジェクトタイプによって異なります:
-
データベース名は完全修飾名であり、修飾子を取りません:
CREATE DATABASE db1;
-
テーブル、ビューまたはストアドプログラム名には、データベース名修飾子を指定できます。
CREATE
ステートメントの修飾されていない名前と修飾名の例:CREATE TABLE mytable ...; CREATE VIEW myview ...; CREATE PROCEDURE myproc ...; CREATE FUNCTION myfunc ...; CREATE EVENT myevent ...; CREATE TABLE mydb.mytable ...; CREATE VIEW mydb.myview ...; CREATE PROCEDURE mydb.myproc ...; CREATE FUNCTION mydb.myfunc ...; CREATE EVENT mydb.myevent ...;
-
トリガーはテーブルに関連付けられるため、任意の修飾子がテーブル名に適用されます:
CREATE TRIGGER mytrigger ... ON mytable ...; CREATE TRIGGER mytrigger ... ON mydb.mytable ...;
-
次のテーブルに示すように、カラム名には、そのカラムを参照するステートメントのコンテキストを示す複数の修飾子を指定できます。
カラム参照 意味 col_name
ステートメントで使用されるいずれかのテーブルのカラム col_name
にその名前のカラムが含まれている場合tbl_name.col_name
デフォルトデータベースのテーブル tbl_name
のカラムcol_name
db_name.tbl_name.col_name
データベース db_name
のテーブルtbl_name
のカラムcol_name
つまり、カラム名にはテーブル名修飾子を指定でき、テーブル名修飾子自体にはデータベース名修飾子を指定できます。
SELECT
ステートメントでの修飾されていないカラム参照および修飾されたカラム参照の例:SELECT c1 FROM mytable WHERE c2 > 100; SELECT mytable.c1 FROM mytable WHERE mytable.c2 > 100; SELECT mydb.mytable.c1 FROM mydb.mytable WHERE mydb.mytable.c2 > 100;
修飾されていない参照があいまいでないかぎり、ステートメントでオブジェクト参照の修飾子を指定する必要はありません。 カラム c1
がテーブル t1
、t2
のみの c2
および t1
と t2
の両方の c
に出現するとします。 c
への修飾されていない参照は、両方のテーブルを参照するステートメントであいまいであり、どのテーブルを意味するかを示すために t1.c
または t2.c
として修飾する必要があります:
SELECT c1, c2, t1.c FROM t1 INNER JOIN t2
WHERE t2.c > 100;
同様に、データベース db1
のテーブル t
および同じステートメントのデータベース db2
のテーブル t
から取得するには、テーブル参照を修飾する必要があります: これらのテーブルのカラムを参照する場合、修飾子は両方のテーブルに表示されるカラム名にのみ必要です。 カラム c1
がテーブル db1.t
、db2.t
のみの c2
および db1.t
と db2.t
の両方の c
に出現するとします。 この場合、c
はあいまいであり、修飾する必要がありますが、c1
および c2
は次のようにする必要はありません:
SELECT c1, c2, db1.t.c FROM db1.t INNER JOIN db2.t
WHERE db2.t.c > 100;
テーブルのエイリアスを使用すると、修飾カラム参照をより簡単に書き込むことができます:
SELECT c1, c2, t1.c FROM db1.t AS t1 INNER JOIN db2.t AS t2
WHERE t2.c > 100;