mysql

SQL NULL-SAFE

Written by  on August 6, 2019

Liefert keine Felder zurück, wo eines oder beide Felder NULL sind:

select usr_id from usr_data where (usr_data.a != usr_data.b);

NULL-SAFE – schlägt auch an, wenn eines der Felder NULL ist:

select usr_id from usr_data where NOT (usr_data.a <=> usr_data.b);

MariaDB Doku

SQL Query in Crontab

Written by  on April 16, 2017

Soll ein Cronjob eine SQL Query ausführen, läuft man schnell in ein Problem. Das Prozenzeichen % hat eine Sonderbedeutung in der Crontab. Es erzeugt einen Zeilenumbruch. Das folgende Beispiel funktioniert niemals, weil der Suchbegriff falsch interpretiert wird und ausserdem alles nach dem Suchbegriff abgeschnitten wird:
Hier ein Beispiel:

mysql -e "SELECT * FROM users WHERE name LIKE a%;" database

Ich konnte diesen nicht wirklich schönen Workaround dafür finden.

echo "SELECT * FROM users WHERE name LIKE a\%;" | sed -e 's|\\||g' | mysql database

Das Prozenzeichen wird vor Cron geschützt. sed löscht das quote Zeichen wieder, bevor es an die Datenbank weitergeschickt wird.
Für ganz einfache Dinge reicht das. Ich empfehle aber trotzdem gleich ein Script zu erstellen. Dadurch wird dieser komplexe Teil unnötig und insgesamt besser lesbar.

MINUS in MySQL

Written by  on Oktober 4, 2011

In der relationalen Algebra existiert die einfache Möglichkeit, eine Differenz zwischen zwei Tabellen zu bilden. Das geht über den Operator MINUS oder auch Differenz genannt.
Dazu heißt es:

Bei der Operation R-S werden aus der ersten Relation R alle Tupel entfernt, die auch in der zweiten Relation S vorhanden sind.

Aber MySQL sieht keinen solchen Operator vor.
Die Aufgabe lässt sich aber trotzdem einfach lösen:

mysql&gt; select * from r;
+------+------+------+
| a    | b    | c    |
+------+------+------+
| 1    | 2    | 3    |
| 4    | 2    | 3    |
| 4    | 5    | 6    |
| 2    | 5    | 3    |
| 1    | 2    | 6    |
+------+------+------+
5 rows in set (0.00 sec)

mysql&gt; select * from s;
+------+------+------+
| a    | b    | c    |
+------+------+------+
| 2    | 5    | 3    |
| 2    | 5    | 4    |
| 4    | 5    | 6    |
| 1    | 2    | 3    |
+------+------+------+
4 rows in set (0.00 sec)

mysql&gt; select a,b,c from r where (a,b,c) not in (select a,b,c from s);
+------+------+------+
| a    | b    | c    |
+------+------+------+
| 4    | 2    | 3    |
| 1    | 2    | 6    |
+------+------+------+
2 rows in set (0.00 sec)