9.2.2 Квалификаторы идентификаторов
Имена объектов могут быть неквалифицированными или квалифицированными. Неквалифицированное имя разрешено в контекстах, где интерпретация имени однозначна. Квалифицированное имя включает по меньшей мере один квалификатор для уточнения контекста интерпретации, переопределяя контекст по умолчанию или предоставляя отсутствующий контекст.
Например, данное утверждение создаёт таблицу с использованием неквалифицированного имени t1:
CREATE TABLE t1 (i INT);
Поскольку t1 не содержит квалификатора для указания базы данных, утверждение создаёт таблицу в базе данных по умолчанию. Если базы данных по умолчанию не существует, возникает ошибка.
Данное утверждение создаёт таблицу с использованием квалифицированного имени db1.t1:
CREATE TABLE db1.t1 (i INT);
Поскольку db1.t1 включает квалификатор базы данных db1, утверждение создаёт t1 в базе данных с именем db1, независимо от базы данных по умолчанию. Квалификатор обязательно должен быть указан, если нет базы данных по умолчанию. Квалификатор может быть указан, если база данных по умолчанию существует, для указания базы данных, отличной от базы данных по умолчанию, или для явного указания базы данных, если база данных по умолчанию совпадает с указанной.
Квалификаторы обладают следующими характеристиками:
Неквалифицированное имя состоит из одного идентификатора. Квалифицированное имя состоит из нескольких идентификаторов.
Компоненты имени из нескольких частей должны быть разделены точками (
.) символами. Начальные части имени из нескольких частей действуют как квалификаторы, влияющие на контекст, в котором следует интерпретировать конечный идентификатор.Символ квалификатора является отдельным токеном и не обязательно должен быть непрерывным с ассоциированными идентификаторами. Например,
tbl_name.col_nameиtbl_name . col_nameэквивалентны.Если какие-либо компоненты имени из нескольких частей требуют кавычек, их следует указывать индивидуально, а не заключать всё имя в кавычки. Например, напишите
`my-table`.`my-column`, а не`my-table.my-column`.Зарезервированное слово, следующее за точкой в квалифицированном имени, должно быть идентификатором, поэтому в этом контексте его не нужно заключать в кавычки.
-
Синтаксис
означает таблицу.tbl_nametbl_nameв базе данных по умолчанию.ПримечаниеЭтот синтаксис устарел начиная с MySQL 5.7.20; ожидается его удаление в будущих версиях MySQL.
Разрешенные квалификаторы для имён объектов зависят от типа объекта:
-
Имя базы данных является полностью квалифицированным и не требует квалификатора:
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Столбец col_nameиз таблицыtbl_nameбазы данных по умолчаниюdb_name.tbl_name.col_nameСтолбец col_nameиз таблицыtbl_nameбазы данныхdb_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;
Аналогично, для извлечения из таблицы t в базе данных db1 и из таблицы t в базе данных db2 в одном и том же утверждении, вы должны квалифицировать ссылки на таблицы: для ссылок на столбцы в этих таблицах квалификаторы требуются только для имён столбцов, которые встречаются в обеих таблицах. Предположим, что столбец 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;
© 2025 Oracle
Licensed under the GPLv2 License.