Prawo Murphy'ego: Światełko w tunelu? - To reflektory nadjeżdżającego pociągu.
SQL - Składnia języka

Łańcuchy znaków

Łańcuch jest ciągiem znaków ograniczonych apostrofami (') lub cudzysłowami ("), np.:

'to jest napis'
"a to jest inny napis"
Wewnątrz łańcucha znakowego mogą występować znaki o specjalnym znaczeniu, które nie są normalnie wyświetlane. Każdy taki znak musi byś poprzedzony znakiem backslash (\). Nazywane są one znakami escape. W MySQL można używać następujących znaków escape:
\0znak ASCII o kodzie 0 (NUL)
\'znak apostrofu
\"znak cudzysłowu
\bznak backspace
\nznak nowego wiersza
\rznak powrotu karetki
\tznak tabulacji
\zznak ASCII o kodzie 26 (^Z); znak końca pliku tekstowego
\\znak backslash
\%znak procentu (%); używany do szukania znaku % z użyciem wyrażeń regularnych, w których ten znak ma specjalne znaczenia; w innych sytuacjach znak \% traktowany jest jako \%, a nie jako %
\_znak podkreślenia (%); używany do szukania znaku _ z użyciem wyrażeń regularnych, w których ten znak ma specjalne znaczenia; w innych sytuacjach znak \_ traktowany jest jako \_, a nie jako _

Cudzysłów i apostrof można wstawić do łańcucha znakowego również na inne sposoby, co pokazują poniższe przykłady:

mysql> SELECT 'tekst', '"tekst"', '""tekst""', 'tek''st', '\'tekst';
+-------+---------+-----------+--------+--------+
| tekst | "tekst" | ""tekst"" | tek'st | 'tekst |
+-------+---------+-----------+--------+--------+

nmysql> SELECT "tekst", "'tekst'", "''tekst''", "tek""st", "\"tekst";
+-------+---------+-----------+--------+--------+
| tekst | 'tekst' | ''tekst'' | nap"is | "tekst |
+-------+---------+-----------+--------+--------+

Znaków escape należy używać w każdym łańcuch znaków, w którym mogą wystąpić znaki specjalne

 

Liczby

Liczby reprezentowane są przez ciąg cyfr, a jako separatora części ułamkowej używamu kropki (.). Wartości ujemne poprzedzamy znakiem minus (-).

Przykłady poprawnego zapisu liczb:

1221
0
-32
294.42
-32032.6809e+10
148.00

 

Wartości szesnastkowe

MySQL dopuszcza zapis liczb w systemie szesnastkowym (hexadecymalnym). Dotyczy to liczb całkowitych typu integer (64-bittowych).

Przykłady poprawnego zapisu liczb szesnastkowych:

mysql> SELECT x'FF';
         -> 255
mysql> SELECT 0xa+0;
         -> 10
mysql> SELECT 0x5061756c;
         -> Paul

 

Wartość NULL

Wartość NULL oznacza "brak danych" i ma zupełnie inne znaczenie niż zero dla wartości numerycznych lub pusty łańcuch znaków dla typów łańcuchowych.

 

Nazwy baz, tabel, indeksów, kolumn i aliasów

ObiektNazwa doDozwolone znaki
Baza danych64 zn.wszystkie znaki dozwolone w nazwach katalogów z wyjątkiem slash (/), backslash (\) i kropki (.)
Tabela64 zn.wszystkie znaki dozwolone w nazwach plików z wyjątkiem slash (/) i kropki (.)
Kolumna64 zn.wszystkie znaki
Alias255 zn.wszystkie znaki

Poza powyższymi zasadami, w żadnej nazwie nie wolno używać znaków ASCII(0), ASCII(255) oraz apostrofu lub cudzysłowu.

Jeżeli nazwa jest słowem zarezerwowanym lub zawiera znaki specjalne, to musi być zawsze ujęta w odwrotny apostrof (`), co widać w poniższym przykładzie:

mysql> SELECT * FROM `select` WHERE `select`.id > 100;

Mimo, iż dozwolone, to nie jest zalecane używanie nazw zaczynających sie od cyfr, gdyż może to powodować sytuacje niejednoznaczne.

Odwołując sie do kolumn możesz użyć jednego z poniższych formatów:

nazwa_kolumnyodwołanie do kolumny z tabeli użytej w zapytaniu SQL
nazwa_tabeli.
nazwa_kolumny
odwołanie do kolumny z podanej tabeli w aktualnie używanej bazie danych
nazwa_bazy.
nazwa_tabeli.
nazwa_kolumny
odwołanie do kolumny z podanej tabeli w podanej bazie danych
`nazwa_kolumny`odwołanie do kolumny, której nazwa zawiera znaki specjalne lub jest słowem kluczowym

Użycie elementów nazwa_bazy i/lub nazwa_tabeli jest konieczne tylko w sytuacjach, kiedy podanie samej nazwy kolumny jest niejednoznaczne (np. przy łączeniu dwóch tabel, z których każda zawiera pole o takiej samej nazwie).

 

Rozróżnianie wielkości liter w nazwach

W MySQL bazy danych i tabele odpowiadają odpowiednio katalogom i plikom systemowym. Dlatego rozróżnianie wielkości liter w nazwach zależy od systemu operacyjnego, pod którym pracujesz.

Pomimo, iż Windows nie odróżnia wielkości liter w nazwach, to nie wolno w jednej instrukcji SQL używać dla nazwy bazy lub tabeli używać różnej wielkości liter (np.: moja_tabela i MOJA_TABELA), gdyż taka instrukcja nie zostanie wykonana

Aliasy nazw tabel zawsze odróżniają wielkość liter.

Z kolei nazwy kolumn i ich aliasów nigdy nie odróżniają wielkości liter.

 

Komentarze

W instrukcjach MySQL można umieszczać własne komentarze na 3 sposoby:
  • znak # traktuje wszystkie znaki do końca bieżącego wiersza jako komentarz;
     
  • dwuznak -- również traktuje wszystkie znaki do końca bieżącego wiersza jako komentarz (musi jednak wystąpić po nim co najmniej 1 spacja);
     
  • ograniczniki /* ... */ pozwalają wstawić komentarz wielowierszowy.

Wstawiając komentarze wielowierszowe należy przestrzegać 2 ograniczeń:

  • Wewnątrz komentarza każdy cudzysłów i apostrof muszą być domknięte (brak zamknięcia spowoduje błąd);
     
  • znak średnika zawsze jest traktowany jako koniec instrukcji i następujący po nim znak będzie traktowany jako początek nowej instrukcji.

Przykłady komentowania instrukcji SQL:

mysql> SELECT 1 + 1;     # reszta wiersza jest komentarzem
mysql> SELECT 1 + 1;     -- reszta wiersza jest komentarzem
 

 

Słowa zarezerwowane

Aby uniknąć problemów niejednoznaczności wskazane jest unikanie podanych tu słów w nazwach baz, tabel, indeksów, kolumn i aliasów.

Musisz pamiętać również o tym, aby nigdy nie zostawiać spacji między nazwa funkcji a nawiasem otwierającym występującym po tej nazwie. Zostawienie choćby jednej spacji, spowoduje, że nazwa funkcji będzie traktowana jako nazwa pola tabeli.

Lista słów zarezerwowanych:

     ADD             ALL              ALTER           ANALYZE
     AND             AS               ASC             AUTO_INCREMENT
     BDB             BERKELEYDB       BETWEEN         BIGINT
     BINARY          BLOB             BOTHBY          CASCADE
     CASE            CHANGE           CHAR            CHARACTER
     COLUMN          COLUMNS          CONSTRAINT      CREATE
     CROSS           CURRENT_DATE     CURRENT_TIME    CURRENT_TIMESTAMP
     DATABASE        DATABASES        DAY_HOUR        DAY_MINUTE
     DAY_SECOND      DEC              DECIMAL         DEFAULT
     DELAYED         DELETE           DESC            DESCRIBE
     DISTINCT        DISTINCTROW      DOUBLE          DROP
     ELSE            ENCLOSED         ESCAPED         EXISTS
     EXPLAIN         FIELDS           FLOAT           FOR
     FOREIGN         FROM             FULLTEXT        FUNCTION
     GRANT           GROUP            HAVING          HIGH_PRIORITY
     HOUR_MINUTE     HOUR_SECOND      IF              IGNORE
     IN              INDEX            INFILE          INNER
     INNODB          INSERT           INT             INTEGER
     INTERVAL        INTO             IS              JOIN
     KEY             KEYS             KILL            LEADING
     LEFT            LIKE             LIMIT           LINES
     LOAD            LOCK             LONG            LONGBLOB
     LONGTEXT        LOW_PRIORITY     MATCH           MASTER_SERVER_ID
     MEDIUMBLOB      MEDIUMINT        MEDIUMTEXT      MIDDLEINT
     MINUTE_SECOND   MRG_MYISAM       NATURAL         NOT
     NULL            NUMERIC          ON              OPTIMIZE
     OPTION          OPTIONALLY       OR              ORDER
     OUTER           OUTFILE          PARTIAL         PRECISION
     PRIMARY         PRIVILEGES       PROCEDURE       PURGE
     READ            REAL             REFERENCES      REGEXP
     RENAME          REPLACE          REQUIRE         RESTRICT
     RETURNS         REVOKE           RIGHT           RLIKE
     SELECT          SET              SHOW            SMALLINT
     SONAME          SQL_BIG_RESULT   STARTING        SQL_CALC_FOUND_ROWS        
     SSL             STRAIGHT_JOIN    STRIPED         SQL_SMALL_RESULT
     TABLE           TABLES           TERMINATED      THEN
     TINYBLOB        TINYINT          TINYTEXT        TO
     TRAILING        UNION            UNIQUE          UNLOCK
     UNSIGNED        UPDATE           USAGE           USE
     USER_RESOURCES  USING            VALUES          VARBINARY
     VARCHAR         VARYING          WHEN            WHERE
     WITH            WRITE            XOR             YEAR_MONTH
     ZEROFILL
« wstecz   dalej »