SQL Noobfrage zu WHERE und NOT IN

R

r_

Gast
Hey zusammen,

kleine Noobfrage aus dem Bereich SQL, die ich/wir seit 20 Minuten inkl. Google Suche einfach nicht lösen können. Vermutlich einfach grad nen Brett vorm Kopf bzw. Tomaten vor den Augen.

Anyways....

Der Befehl

Code:
SELECT *
from J
WHERE CITY IN (SELECT CITY FROM S);

funktioniert (entsprechende Tabelle vorausgesetzt) einwandfrei und so wie er soll.

Wollen wir aber eine City herausfiltern, die zwar in J aber nicht in S ist, funktioniert das nicht.

Code:
SELECT *
from J
WHERE CITY NOT IN (SELECT CITY FROM S);

Woran liegt das? NOT IN müsste man doch eigentlich so benutzen können? Nach 10 Minuten rumspielen bin ich der Meinung dass es wegen NOT IN nicht funktioniert, obwohl [NOT] in laut diversen SQL Tutorial so anwendbar sein sollte.

Mersi schonmal.

Gruß,
 
Zuletzt bearbeitet:
Versorge uns doch mal mit ein paar Daten aus den Tabellen J und S
 
Glaub wir habens nun gerafft.

Lag daran, dass in der Tabelle S eine City mit NULL aneglegt war. Mit einer anderen Tabelle mit lauter vollständigen Einträgen hat der Befehl funktioniert.
 
Code:
select * from j
where not exists
( select * from s where s.primarykey=j.primarykey );
 
ralle_h schrieb:
Glaub wir habens nun gerafft.

Lag daran, dass in der Tabelle S eine City mit NULL aneglegt war. Mit einer anderen Tabelle mit lauter vollständigen Einträgen hat der Befehl funktioniert.

Fieser Stolperstein :D SELECT * FROM J WHERE CITY NOT IN (SELECT CITY FROM S WHERE CITY IS NOT NULL);

Vergleiche mit Null geben immer false, sogar Null mit null verglichen ergibt false. Folglich ist jede Stadt aus J nicht in S, weil jede Stadt verglichen mit Null false ergibt :D
 
Danke für die Erklärung, dass muss man sich erstmal verinnerlichen.

Kleine Frage noch zum Thema NULL:

Prämisse: Es ist ein Eitrag mit einer unbekannten CITY (NULL) vorhanden.

Code:
SELECT COUNT(CITY)
FROM S
WHERE CITY IS NULL;

Gibt als Ergebnis 0 zurück, obwohl ein Eintrag mit City = NULL vorhanden ist.

Code:
SELECT COUNT(*)
FROM S
WHERE CITY IS NULL;

Gibt allerdings ein 1 Ergebnis zurück.

Das liegt daran, dass NULL nicht gezählt werden kann da Null eine Aussage ist aber keinen Wert hat? Hab ich die Erklärung so richtig verstanden?

Daher:
Null als Wert => 0 Ergebnisse
Null als Teil einer Zeile bzw. eines Eintrags, also als "Aussage" => 1 Ergebnis

Passt das so?
 
COUNT(city) zählt nur die Zeilen der Spalte (city), welche nicht NULL sind - insofern macht die WHERE-Bedingung "city IS NULL" keinen Sinn.

COUNT(*) zählt immer ALLE Zeilen, unabhängig ob NULL oder nicht.

Selbst wenn alle Spalten/Zeilen in einer Tabelle NULL sind, liefert COUNT(*) immer alle die Zeilen zurück.
 
Zurück
Oben