Schlüsselwörter in SQL (MySQL )
Wir zeigen im folgenden die Syntax einer Schemadefinition von SQL.
- Schemadefinition
.------. .------. .------------.
--->( CREATE )--->( SCHEMA )--->| Bezeichner |--->
'------' '------' '------------'
Wörter, die in gerundeten Kästchen von Syntaxdiagrammen vorkommen, werden Schlüsselwörter genannt und dürfen in der Regel nicht als Namen verwendet werden.
Das obenstehende Diagramm liefert also die Schlüsselwörter: »CREATE« und »SCHEMA«.
Das folgende Protokoll zeigt eine Fehlermeldung, die nach dem Versuch, ein Schlüsselwort als Name eines Schemas zu verwenden, ausgegeben wird.
- Konsole
CREATE SCHEMA SCHEMA;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SCHEMA' at line 1
Wenn man besonders vorsichtig sein will, sollte man auch noch Wörter mit nur einem Zeichen (wie »A«) und Wörter, die am Anfang von Schlüsselwörtern vorkommen (wie »OCTET«, das ein Wort aus einer der untenstehenden Tabellen einleitet) oder eine Wortform von Schlüsselwörtern (wie »SCHEMAS«) darstellen, vermeiden, um zu erreichen, daß Namen unter möglichst vielen verschiedenen Datenbanksystemen verwendet werden können.
Anmerkung zu »NAME« und »BEZEICHNUNG«
Das Wort »NAME« ist “vendor reserved ”, das heißt, er wird von einigen großen Herstellern für eigene Zwecke (Erweiterungen) reserviert. Daher wird in diesem Kurs statt dessen vorsichtshalber oft »BEZEICHNUNG« verwendet, obwohl unter MySQL auch »NAME« verwendet werden könnte.
Übungsfragen
? Reservierte Schlüsselwörter
Welche der folgenden Anweisungen könnten Probleme bereiten?
- »CREATE SCHEMA CREATE;«
- »CREATE SCHEMA DATEN;«
Reservierte Schlüsselwörter in Standard-SQL *
Ein Benutzer der Sprache darf beispielsweise einem Schema einen Namen geben. Dabei sollte er allerdings einen bestimmten Teil der Schlüsselwörter vermeiden, nämlich die sogenannten reservierten Schlüsselwörter.
Reservierte Schlüsselwörter sollten nicht als Namen verwendet werden, wenn der Benutzer selber etwas in der Datenbank benennt.
Neben den reservierten Schlüsselwörtern gibt es auch noch einige nicht-reservierte Schlüsselwörter. Es gibt aber keinen wichtigen Grund, die nicht-reservierten Schlüsselwörter zu kennen. Die dem Autor zum Zeitpunkt der Niederschrift bekannten reservierten Schlüsselwörter werden im folgenden genannt.
Man kann davon ausgehen, daß ein Wort ein Schlüsselwort ist, wenn es in einem Syntaxdiagramm vorkommt oder es ein feststehendes Wort ist, das einen Befehl oder einen Teil eines Befehls einleitet. Die Bedeutung dieser Schlüsselwörtern wird durch die SQL -Sprachdefinition festgelegt.
- Reservierte Schlüsselwörter von Standard-SQL
- »ABS«, »ALL«, »ALLOCATE«, »ALTER«, »AND«, »ANY«, »ARE«, »ARRAY«, »ARRAY_AGG«, »AS«, »ASENSITIVE«, »ASYMMETRIC«, »AT«, »ATOMIC«, »AUTHORIZATION«, »AVG«, »BEGIN«, »BETWEEN«, »BIGINT«, »BINARY«, »BLOB«, »BOOLEAN«, »BOTH«, »BY«, »CALL«, »CALLED«, »CARDINALITY«, »CASCADED«, »CASE«, »CAST«, »CEIL«, »CEILING«, »CHAR«, »CHAR_LENGTH«, »CHARACTER«, »CHARACTER_LENGTH«, »CHECK«, »CLOB«, »CLOSE«, »COALESCE«, »COLLATE«, »COLLECT«, »COLUMN«, »COMMIT«, »CONDITION«, »CONNECT«, »CONSTRAINT«, »CONVERT«, »CORR«, »CORRESPONDING«, »COUNT«, »COVAR_POP«, »COVAR_SAMP«, »CREATE«, »CROSS«, »CUBE«, »CUME_DIST«, »CURRENT«, »CURRENT_CATALOG«, »CURRENT_DATE«, »CURRENT_DEFAULT_TRANSFORM_GROUP«, »CURRENT_PATH«, »CURRENT_ROLE«, »CURRENT_SCHEMA«, »CURRENT_TIME«, »CURRENT_TIMESTAMP«, »CURRENT_TRANSFORM_GROUP_FOR_TYPE«, »CURRENT_USER«, »CURSOR«, »CYCLE«, »DATE«, »DAY«, »DAYS«, »DEALLOCATE«, »DEC«, »DECIMAL«, »DECLARE«, »DEFAULT«, »DELETE«, »DENSE_RANK«, »DEREF«, »DESCRIBE«, »DETERMINISTIC«, »DISCONNECT«, »DISTINCT«, »DOUBLE«, »DROP«, »DYNAMIC«, »EACH«, »ELEMENT«, »ELSE«, »END«, »END-EXEC«, »ESCAPE«, »EVERY«, »EXCEPT«, »EXEC«, »EXECUTE«, »EXISTS«, »EXP«, »EXTERNAL«, »EXTRACT«, »FALSE«, »FETCH«, »FILTER«, »FIRST_VALUE«, »FLOAT«, »FLOOR«, »FOR«, »FOREIGN«, »FOREVER«, »FREE«, »FROM«, »FULL«, »FUNCTION«, »FUSION«, »GET«, »GLOBAL«, »GRANT«, »GROUP«, »GROUPING«, »HAVING«, »HOLD«, »HOUR«, »HOURS«, »IDENTITY«, »IN«, »INDICATOR«, »INNER«, »INOUT«, »INSENSITIVE«, »INSERT«, »INT«, »INTEGER«, »INTERSECT«, »INTERSECTION«, »INTERVAL«, »INTO«, »IS«, »JOIN«, »KEEP«, »LAG«, »LANGUAGE«, »LARGE«, »LAST_VALUE«, »LATERAL«, »LEAD«, »LEADING«, »LEFT«, »LIKE«, »LIKE_REGEX«, »LN«, »LOCAL«, »LOCALTIME«, »LOCALTIMESTAMP«, »LOWER«, »MATCH«, »MAX«, »MAX_CARDINALITY«, »MEMBER«, »MERGE«, »METHOD«, »MIN«, »MINUTE«, »MINUTES«, »MOD«, »MODIFIES«, »MODULE«, »MONTH«, »MULTISET«, »NATIONAL«, »NATURAL«, »NCHAR«, »NCLOB«, »NEW«, »NO«, »NONE«, »NORMALIZE«, »NOT«, »NTH_VALUE«, »NTILE«, »NULL«, »NULLIF«, »NUMERIC«, »OCTET_LENGTH«, »OCCURRENCES_REGEX«, »OF«, »OFFSET«, »OLD«, »ON«, »ONLY«, »OPEN«, »OR«, »ORDER«, »OUT«, »OUTER«, »OVER«, »OVERLAPS«, »OVERLAY«, »PARAMETER«, »PARTITION«, »PERCENT_RANK«, »PERCENTILE_CONT«, »PERCENTILE_DISC«, »POSITION«, »POSITION_REGEX«, »POWER«, »PRECISION«, »PREPARE«, »PRIMARY«, »PROCEDURE«, »RANGE«, »RANK«, »READS«, »REAL«, »RECURSIVE«, »REF«, »REFERENCES«, »REFERENCING«, »REGR_AVGX«, »REGR_AVGY«, »REGR_COUNT«, »REGR_INTERCEPT«, »REGR_R2«, »REGR_SLOPE«, »REGR_SXX«, »REGR_SXY«, »REGR_SYY«, »RELEASE«, »RESULT«, »RETURN«, »RETURNS«, »REVOKE«, »RIGHT«, »ROLLBACK«, »ROLLUP«, »ROW«, »ROW_NUMBER«, »ROWS«, »SAVEPOINT«, »SCOPE«, »SCROLL«, »SEARCH«, »SECOND«, »SECONDS«, »SELECT«, »SENSITIVE«, »SESSION_USER«, »SET«, »SIMILAR«, »SMALLINT«, »SOME«, »SPECIFIC«, »SPECIFICTYPE«, »SQL«, »SQLEXCEPTION«, »SQLSTATE«, »SQLWARNING«, »SQRT«, »START«, »STATIC«, »STDDEV_POP«, »STDDEV_SAMP«, »SUBMULTISET«, »SUBSTRING«, »SUBSTRING_REGEX«, »SUM«, »SYMMETRIC«, »SYSTEM«, »SYSTEM_USER«, »TABLE«, »TABLESAMPLE«, »THEN«, »TIME«, »TIMESTAMP«, »TIMEZONE_HOUR«, »TIMEZONE_MINUTE«, »TO«, »TRAILING«, »TRANSLATE«, »TRANSLATE_REGEX«, »TRANSLATION«, »TREAT«, »TRIGGER«, »TRUNCATE«, »TRIM«, »TRIM_ARRAY«, »TRUE«, »UESCAPE«, »UNION«, »UNIQUE«, »UNKNOWN«, »UNNEST«, »UPDATE«, »UPPER«, »USER«, »USING«, »VALUE«, »VALUES«, »VAR_POP«, »VAR_SAMP«, »VARBINARY«, »VARCHAR«, »VARYING«, »VERSION«, »VERSIONING«, »VERSIONS«, »WHEN«, »WHENEVER«, »WHERE«, »WIDTH_BUCKET«, »WINDOW«, »WITH«, »WITHIN«, »WITHOUT«, »YEAR« und »YEARS«.
Zusätzlich zu den Wörtern, die vom SQL -Sprachstandard reserviert wurden, könnten einzelne Datenbankprodukte noch weitere Wörter für ihren eigenen Gebrauch reservieren, die dann ebenfalls vermieden werden sollten. Leider dürfte es aber keine vollständige Liste aller dieser herstellerspezifischen reservierten Wörter geben. Ein Beispiel für ein Wort, das von einigen Datenbankprodukten, aber nicht vom Sprachstandard reserviert ist, ist »NAME«.
Ältere SQL -Standards
Der voranstehende Teil dieser Lektion hier bezieht sich auf den neuesten dem Autor bekannten Entwurf des Sprachstandards. Ältere Versionen des Sprachstandards (wie SQL 1992, SQL 1999 oder SQL 2003) enthalten wieder andere Listen von Wörtern, die reserviert sind und reservieren möglicherweise alle Schlüsselwörter.
- SQL 92 (SQL2)
- »ABSOLUTE«, »ACTION«, »ADD«, »ALL«, »ALLOCATE«, »ALTER«, »AND«, »ANY«, »ARE«, »AS«, »ASC«, »ASSERTION«, »AT«, »AUTHORIZATION«, »AVG«, »BEGIN«, »BETWEEN«, »BIT«, »BIT_LENGTH«, »BOTH«, »BY«, »CASCADE«, »CASCADED«, »CASE«, »CAST«, »CATALOG«, »CHAR«, »CHARACTER«, »CHAR_LENGTH«, »CHARACTER_LENGTH«, »CHECK«, »CLOSE«, »COALESCE«, »COLLATE«, »COLLATION«, »COLUMN«, »COMMIT«, »CONNECT«, »CONNECTION«, »CONSTRAINT«, »CONSTRAINTS«, »CONTINUE«, »CONVERT«, »CORRESPONDING«, »COUNT«, »CREATE«, »CROSS«, »CURRENT«, »CURRENT_DATE«, »CURRENT_TIME«, »CURRENT_TIMESTAMP«, »CURRENT_USER«, »CURSOR«, »DATE«, »DAY«, »DEALLOCATE«, »DEC«, »DECIMAL«, »DECLARE«, »DEFAULT«, »DEFERRABLE«, »DEFERRED«, »DELETE«, »DESC«, »DESCRIBE«, »DESCRIPTOR«, »DIAGNOSTICS«, »DISCONNECT«, »DISTINCT«, »DOMAIN«, »DOUBLE«, »DROP«, »ELSE«, »END«, »END-EXEC«, »ESCAPE«, »EXCEPT«, »EXCEPTION«, »EXEC«, »EXECUTE«, »EXISTS«, »EXTERNAL«, »EXTRACT«, »FALSE«, »FETCH«, »FIRST«, »FLOAT«, »FOR«, »FOREIGN«, »FOUND«, »FROM«, »FULL«, »GET«, »GLOBAL«, »GO«, »GOTO«, »GRANT«, »GROUP«, »HAVING«, »HOUR«, »IDENTITY«, »IMMEDIATE«, »IN«, »INDICATOR«, »INITIALLY«, »INNER«, »INPUT«, »INSENSITIVE«, »INSERT«, »INT«, »INTEGER«, »INTERSECT«, »INTERVAL«, »INTO«, »IS«, »ISOLATION«, »JOIN«, »KEY«, »LANGUAGE«, »LAST«, »LEADING«, »LEFT«, »LEVEL«, »LIKE«, »LOCAL«, »LOWER«, »MATCH«, »MAX«, »MIN«, »MINUTE«, »MODULE«, »MONTH«, »NAMES«, »NATIONAL«, »NATURAL«, »NCHAR«, »NEXT«, »NO«, »NOT«, »NULL«, »NULLIF«, »NUMERIC«, »OCTET_LENGTH«, »OF«, »ON«, »ONLY«, »OPEN«, »OPTION«, »OR«, »ORDER«, »OUTER«, »OUTPUT«, »OVERLAPS«, »PAD«, »PARTIAL«, »POSITION«, »PRECISION«, »PREPARE«, »PRESERVE«, »PRIMARY«, »PRIOR«, »PRIVILEGES«, »PROCEDURE«, »PUBLIC«, »READ«, »REAL«, »REFERENCES«, »RELATIVE«, »RESTRICT«, »REVOKE«, »RIGHT«, »ROLLBACK«, »ROWS«, »SCHEMA«, »SCROLL«, »SECOND«, »SECTION«, »SELECT«, »SESSION«, »SESSION_USER«, »SET«, »SIZE«, »SMALLINT«, »SOME«, »SPACE«, »SQL«, »SQLCODE«, »SQLERROR«, »SQLSTATE«, »SUBSTRING«, »SUM«, »SYSTEM_USER«, »TABLE«, »TEMPORARY«, »THEN«, »TIME«, »TIMESTAMP«, »TIMEZONE_HOUR«, »TIMEZONE_MINUTE«, »TO«, »TRAILING«, »TRANSACTION«, »TRANSLATE«, »TRANSLATION«, »TRIM«, »TRUE«, »UNION«, »UNIQUE«, »UNKNOWN«, »UPDATE«, »UPPER«, »USAGE«, »USER«, »USING«, »VALUE«, »VALUES«, »VARCHAR«, »VARYING«, »VIEW«, »WHEN«, »WHENEVER«, »WHERE«, »WITH«, »WORK«, »WRITE«, »YEAR« und »ZONE«.
- SQL 1999 (SQL3)
- »ABSOLUTE«, »ACTION«, »ADD«, »ALL«, »ALLOCATE«, »ALTER«, »AND«, »ANY«, »ARE«, »AS«, »ASC«, »ASSERTION«, »AT«, »AUTHORIZATION«, »AVG«, »BEGIN«, »BETWEEN«, »BIT«, »BIT_LENGTH«, »BOTH«, »BY«, »CASCADE«, »CASCADED«, »CASE«, »CAST«, »CATALOG«, »CHAR«, »CHARACTER«, »CHAR_LENGTH«, »CHARACTER_LENGTH«, »CHECK«, »CLOSE«, »COALESCE«, »COLLATE«, »COLLATION«, »COLUMN«, »COMMIT«, »CONNECT«, »CONNECTION«, »CONSTRAINT«, »CONSTRAINTS«, »CONTINUE«, »CONVERT«, »CORRESPONDING«, »COUNT«, »CREATE«, »CROSS«, »CURRENT«, »CURRENT_DATE«, »CURRENT_TIME«, »CURRENT_TIMESTAMP«, »CURRENT_USER«, »CURSOR«, »DATE«, »DAY«, »DEALLOCATE«, »DEC«, »DECIMAL«, »DECLARE«, »DEFAULT«, »DEFERRABLE«, »DEFERRED«, »DELETE«, »DESC«, »DESCRIBE«, »DESCRIPTOR«, »DIAGNOSTICS«, »DISCONNECT«, »DISTINCT«, »DOMAIN«, »DOUBLE«, »DROP«, »ELSE«, »END«, »END-EXEC«, »ESCAPE«, »EXCEPT«, »EXCEPTION«, »EXEC«, »EXECUTE«, »EXISTS«, »EXTERNAL«, »EXTRACT«, »FALSE«, »FETCH«, »FIRST«, »FLOAT«, »FOR«, »FOREIGN«, »FOUND«, »FROM«, »FULL«, »GET«, »GLOBAL«, »GO«, »GOTO«, »GRANT«, »GROUP«, »HAVING«, »HOUR«, »IDENTITY«, »IMMEDIATE«, »IN«, »INDICATOR«, »INITIALLY«, »INNER«, »INPUT«, »INSENSITIVE«, »INSERT«, »INT«, »INTEGER«, »INTERSECT«, »INTERVAL«, »INTO«, »IS«, »ISOLATION«, »JOIN«, »KEY«, »LANGUAGE«, »LAST«, »LEADING«, »LEFT«, »LEVEL«, »LIKE«, »LOCAL«, »LOWER«, »MATCH«, »MAX«, »MIN«, »MINUTE«, »MODULE«, »MONTH«, »NAMES«, »NATIONAL«, »NATURAL«, »NCHAR«, »NEXT«, »NO«, »NOT«, »NULL«, »NULLIF«, »NUMERIC«, »OCTET_LENGTH OF«, »ON«, »ONLY«, »OPEN«, »OPTION«, »OR«, »ORDER«, »OUTER«, »OUTPUT«, »OVERLAPS«, »PARTIAL«, »POSITION«, »PRECISION«, »PREPARE«, »PRESERVE«, »PRIMARY«, »PRIOR«, »PRIVILEGES«, »PROCEDURE«, »PUBLIC«, »READ«, »REAL«, »REFERENCES«, »RELATIVE«, »RESTRICT«, »REVOKE«, »RIGHT«, »ROLLBACK«, »ROWS«, »SCHEMA«, »SCROLL«, »SECOND«, »SECTION«, »SELECT«, »SESSION«, »SESSION_USER«, »SET«, »SIZE«, »SMALLINT«, »SOME«, »SQL«, »SQLCODE«, »SQLERROR«, »SQLSTATE«, »SUBSTRING«, »SUM«, »SYSTEM_USER«, »TABLE«, »TEMPORARY«, »THEN«, »TIME«, »TIMESTAMP«, »TIMEZONE_HOUR«, »TIMEZONE_MINUTE«, »TO«, »TRAILING«, »TRANSACTION«, »TRANSLATE«, »TRANSLATION«, »TRIM«, »TRUE«, »UNION«, »UNIQUE«, »UNKNOWN«, »UPDATE«, »UPPER«, »USAGE«, »USER«, »USING«, »VALUE«, »VALUES«, »VARCHAR«, »VARYING«, »VIEW«, »WHEN«, »WHENEVER«, »WHERE«, »WITH«, »WORK«, »WRITE«, »YEAR« und »ZONE«.
MySQL
- MySQL (außer denen, die schon oben unter „SQL3“ erwähnt wurden)
- »ANALYZE«, »ASENSITIVE«, »BEFORE«, »BIGINT«, »BINARY«, »BLOB«, »CALL«, »CHANGE«, »CONDITION«, »DATABASE«, »DATABASES«, »DAY_HOUR«, »DAY_MICROSECOND«, »DAY_MINUTE«, »DAY_SECOND«, »DELAYED«, »DETERMINISTIC«, »DISTINCTROW«, »DIV«, »DUAL«, »EACH«, »ELSEIF«, »ENCLOSED«, »ESCAPED«, »EXIT«, »EXPLAIN«, »FLOAT4«, »FLOAT8«, »FORCE«, »FULLTEXT«, »HIGH_PRIORITY«, »HOUR_MICROSECOND«, »HOUR_MINUTE«, »HOUR_SECOND«, »IF«, »IGNORE«, »INDEX«, »INFILE«, »INOUT«, »INT1«, »INT2«, »INT3«, »INT4«, »INT8«, »ITERATE«, »KEYS«, »KILL«, »LABEL«, »LEAVE«, »LIMIT«, »LINES«, »LOAD«, »LOCALTIME«, »LOCALTIMESTAMP«, »LOCK«, »LONG«, »LONGBLOB«, »LONGTEXT«, »LOOP«, »LOW_PRIORITY«, »MEDIUMBLOB«, »MEDIUMINT«, »MEDIUMTEXT«, »MIDDLEINT«, »MINUTE_MICROSEC-«, »OND«, »MINUTE_SECOND«, »MOD«, »MODIFIES«, »NO_WRITE_TO_BINLOG«, »OPTIMIZE«, »OPTIONALLY«, »OUT«, »OUTFILE«, »PURGE«, »RAID0«, »READS«, »REGEXP«, »RELEASE«, »RENAME«, »REPEAT«, »REPLACE«, »REQUIRE«, »RETURN«, »RLIKE«, »SCHEMAS«, »SECOND_MICROSECOND«, »SENSITIVE«, »SEPARATOR«, »SHOW«, »SONAME«, »SPATIAL«, »SPECIFIC«, »SQLEXCEPTION«, »SQLWARNING«, »SQL_BIG_RESULT«, »SQL_CALC_FOUND_ROWS«, »SQL_SMALL_RESULT«, »SSL«, »STARTING«, »STRAIGHT_JOIN«, »TERMINATED«, »TINYBLOB«, »TINYINT«, »TINYTEXT«, »TRIGGER«, »UNDO«, »UNLOCK«, »UNSIGNED«, »USE«, »UTC_DATE«, »UTC_TIME«, »UTC_TIMESTAMP«, »VARBINARY«, »VARCHARACTER«, »WHILE«, »X509«, »XOR«, »YEAR_MONTH« und »ZEROFILL«.