Tipps und Regeln zu MySQL

MySQL-Anweisungen sollten zur besseren Lesbarkeit groß geschrieben werden und um diese von den Spalten-Bezeichnungen zu unterscheiden.

Tabellennamen und Spalten-Bezeichnungen können in Backtick (oder Backquote, deutsch für "rückwärts geneigtes Hochkomma") `name` gesetzt werden (Backticks erzeugt man mit der Umschalt + Apostroph-Taste).

Spalten-Bezeichnungen oder Tabellennamen dürfen keine MySQL-Anweisungen, Umlaute und Sonderzeichen enthalten. Außerdem muss die Groß.- und Kleinschreibung beachtet werden.

CREATE
Bei den Feldtypen BLOB und TEXT ist keine Angabe der maximalen Länge erlaubt.

INSERT
Die Anzahl der Spalten-Bezeichnungen und einzufügender Werte muss immer identisch sein. Spalten-Bezeichnungen dürfen nicht, Werte müssen von Hochkommata (einfache Anführungszeichen) eingeschlossen werden.

SELECT
Bei der Abfrage auf Gleichheit darf kein doppeltes Gleichzeichen (==) wie bei PHP verwendet werden. Bei der LIMIT-Angabe beginnt der erste Parameter (Startwert) bei 0. Ist der erste Wert (Startwert) gleich Null, kann man ihn weglassen, z. B. LIMIT 3 (gibt die ersten drei Zeilen aus).

DELETE
Der Aufruf von DELETE ohne Bedingung (WHERE) leert die gesamte Tabelle.

 

Ein langer SQL-Befehl sollte in mehrere Zeilen aufgeteilt werden, erstens macht es den Befehl übersichtlicher und zweitens wird bei einer Fehlermeldung die betreffende Zeile mit ausgegeben.

$sql = "SELECT 
          `vorname`,
          `name`,
          `strasse`,
          `hausnummer`,
          `plz`,
          `ort`,
          `vorwahl`,
          `telefon`
     FROM 
          `kunden` 
     WHERE 
          `ort` = 'Berlin' 
     ORDER BY 
          `name` 
     LIMIT 
          0,20";

Wichtig ist ein sauberer Stil beim schreiben von PHP/MySQL, dann schleichen sich weniger Fehler ein und gemachte Fehler findet man schneller.

Reservierte Wörter in MySQL

Der Parser bei MySQL kann die Syntax nur dann korrekt erkennen, wenn bestimmte Ausdrücke für SQL reserviert bleiben. Wenn Sie diese Wörter als Spalten-Bezeichnungen benutzen wollen, müssen Sie diese in Backticks setzen (maskieren).

Mein Tipp: Maskieren Sie immer und überall. Das spart Ihnen die Mühe zu überlegen, ob Sie auf das maskieren verzichten können und gegebenenfalls eine zeitaufwendige Fehlersuche.

ACCESSIBLE ADD ALL
ALTER ANALYZE AND
AS ASC ASENSITIVE
BEFORE BETWEEN BIGINT
BINARY BLOB BOTH
BY CALL CASCADE
CASE CHANGE CHAR
CHARACTER CHECK COLLATE
COLUMN CONDITION CONSTRAINT
CONTINUE CONVERT CREATE
CROSS CURRENT_DATE CURRENT_TIME
CURRENT_TIMESTAMP CURRENT_USER CURSOR
DATABASE DATABASES DAY_HOUR
DAY_MICROSECOND DAY_MINUTE DAY_SECOND
DEC DECIMAL DECLARE
DEFAULT DELAYED DELETE
DESC DESCRIBE DETERMINISTIC
DISTINCT DISTINCTROW DIV
DOUBLE DROP DUAL
EACH ELSE ELSEIF
ENCLOSED ESCAPED EXISTS
EXIT EXPLAIN FALSE
FETCH FLOAT FLOAT4
FLOAT8 FOR FORCE
FOREIGN FROM FULLTEXT
GRANT GROUP HAVING
HIGH_PRIORITY HOUR_MICROSECOND HOUR_MINUTE
HOUR_SECOND IF IGNORE
IN INDEX INFILE
INNER INOUT INSENSITIVE
INSERT INT INT1
INT2 INT3 INT4
INT8 INTEGER INTERVAL
INTO IS ITERATE
JOIN KEY KEYS
KILL LEADING LEAVE
LEFT LIKE LIMIT
LINEAR LINES LOAD
LOCALTIME LOCALTIMESTAMP LOCK
LONG LONGBLOB LONGTEXT
LOOP LOW_PRIORITY MASTER_SSL_VERIFY_SERVER_CERT
MATCH MEDIUMBLOB MEDIUMINT
MEDIUMTEXT MIDDLEINT MINUTE_MICROSECOND
MINUTE_SECOND MOD MODIFIES
NATURAL NOT NO_WRITE_TO_BINLOG
NULL NUMERIC ON
OPTIMIZE OPTION OPTIONALLY
OR ORDER OUT
OUTER OUTFILE PRECISION
PRIMARY PROCEDURE PURGE
RANGE READ READS
READ_ONLY READ_WRITE REAL
REFERENCES REGEXP RELEASE
RENAME REPEAT REPLACE
REQUIRE RESTRICT RETURN
REVOKE RIGHT RLIKE
SCHEMA SCHEMAS SECOND_MICROSECOND
SELECT SENSITIVE SEPARATOR
SET SHOW SMALLINT
SPATIAL SPECIFIC SQL
SQLEXCEPTION SQLSTATE SQLWARNING
SQL_BIG_RESULT SQL_CALC_FOUND_ROWS SQL_SMALL_RESULT
SSL STARTING STRAIGHT_JOIN
TABLE TERMINATED THEN
TINYBLOB TINYINT TINYTEXT
TO TRAILING TRIGGER
TRUE UNDO UNION
UNIQUE UNLOCK UNSIGNED
UPDATE USAGE USE
USING UTC_DATE UTC_TIME
UTC_TIMESTAMP VALUES VARBINARY
VARCHAR VARCHARACTER VARYING
WHEN WHERE WHILE
WITH WRITE XOR
YEAR_MONTH ZEROFILL  

SELECT-Anweisung

Vermeiden Sie das Abfragen sämtlicher Spalten in einer SELECT-Anweisung (SELECT *).

Das Abfragen sämtlicher Spalten in einer SELECT-Anweisung ist in 90% aller Fälle überflüssig. Meist benötigt man nur bestimmte Spalten, dann sollte man auch nur diese Spalten abfragen. Natürlich ist es als Programmierer einfacher, einfach ein "SELECT *" zu nutzen, als jeder benötigte Spalte einzeln zu tippen, aber die zweite Variante ist auf jeden Fall Ressourcen sparender. Dabei geht es nicht nur um die Geschwindigkeit von MySQL, sondern auch um den Speicherbedarf des Skripts.