物件名稱可以是未限定或已限定的。在名稱的解讀不模稜兩可的情況下,允許使用未限定的名稱。已限定的名稱至少包含一個限定詞,以藉由覆寫預設的上下文或提供遺失的上下文來釐清解讀的上下文。
例如,此陳述式使用未限定的名稱 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
中,c2
只出現在 t2
中,而 c
出現在 t1
和 t2
中。在參考這兩個資料表的陳述式中,任何對 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
中,c2
只出現在 db2.t
中,而 c
出現在 db1.t
和 db2.t
中。在這種情況下,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;