Verschachtelte Abfragen bei MySQLdb

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
Python93
User
Beiträge: 36
Registriert: Mittwoch 13. Juni 2012, 07:50

Hallo zusammen,
ich habe eine kurze Frage.

Ich habe folgende Datenbank:
+---------+---------------------+-----------+---------+-------------+----------+--------+-----------+--------------------+
| ID | Datum YYYY-MM-DD | server | Lictype | Lizenz | Version | Anzahl | MaxAnzahl | sonstiges |
+---------+---------------------+-----------+---------+-------------+----------+--------+-----------+--------------------+

Ich benötige alle Datensätze vom Server 'ABCD' und 'ABCD2' bei denen die Lizenz = 'bla', 'blubb', 'foo' ist.

Mein Statement sieht bisher so aus:

Code: Alles auswählen

"SELECT * FROM zeile WHERE server LIKE 'ABCD' OR  'ABCD2' AND WHERE lizenz LIKE 'bla' OR 'blubb' OR 'foo'"
Stimmt das Statement? Da ich in der DB knapp 1Mio Einträge habe, dauert das "Probier es aus" nunmal pro Durchlauf knapp 30min.
Bitte helft mir und verbessert mein Statement, vielen Lieben Dank!

Freundliche Grüße, Python93
Ich benutze:
- Python 2.7
- Windows XP
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Python93 hat geschrieben:Stimmt das Statement?
Nein, du hast ``OR`` falsch verstanden.
Python93 hat geschrieben:Da ich in der DB knapp 1Mio Einträge habe, dauert das "Probier es aus" nunmal pro Durchlauf knapp 30min.
Warum hast du keine kleinere Datenbank für Tests?
Das Leben ist wie ein Tennisball.
BlackJack

@Python93: Das geht so nicht weil ``OR`` in SQL so nicht funktioniert, genausowenig wie das in Python so funtkionieren würde. Das ist keine natürliche Sprache wo man das Oder so interpretieren könnte, also ``if a == b or c:`` könnte man als Mensch verstehen als „a gleich b oder a gleich c”, aber der Rechner versteht das als ``(a == b) or c``. In Python ist das syntaktisch richtig weil jeder Wert auch einen „Wahrheitsgehalt” hat. In SQL weiss ich jetzt gerade nicht ob das überhaupt legal ist, aber es ist in jedem Fall semantisch falsch. Du willst ``if a == b or a == c:`` beziehungsweise ``if a in [b, c]:``. Beides kann man mit den entsprechenden Operatoren auch in SQL ausdrücken.

``WHERE`` kommt in Deinem Ausdruck zweimal vor, das ist auch falsch.

Warum verwendest Du ``LIKE`` statt ``=`` wenn Du sowieso keine Platzhalter verwendest? *Das* könnte der Hauptgrund sein warum das langsam ist. Letztendlich ist das mit der Laufzeit eine schwache Begründung es nicht wenigstens soweit zu bringen, dass eine syntaktisch korrekte Anfrage gestellt wird. Denn Syntaxfehler werden sofort gemeldet. Die 30 Minuten mag ich auch nicht so ganz glauben, es sei denn die hängen wirklich am ``LIKE``. Du könntest zum testen auch eine kleinere Tabelle erstellen mit einem Ausschnitt der tatsächlichen Tabelle und/oder mit Testdaten.
Python93
User
Beiträge: 36
Registriert: Mittwoch 13. Juni 2012, 07:50

Ich verstehe. Dann habe ich das "OR" wohl missverstanden.
Wie kann man dann überhaupt solche verschachtelten Abfragen machen? Ich bin nicht wirklich ein SQL-Kenner :oops:

Ich bereite mir eine kleinere DB auf. Danke für den Tipp.
Ich benutze:
- Python 2.7
- Windows XP
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hier hast du doch gar keine verschachtelten Abfragen. Was du willst ist doch wahrscheinlich einfach nur:

Code: Alles auswählen

SELECT *
FROM zeile
WHERE
    (server='ABCD' OR server='ABCD2') AND
    (lizenz='bla' OR lizenz='blubb' OR lizenz='foo')
Das Leben ist wie ein Tennisball.
BlackJack

@Python93: Ich sehe da nichts verschachteltes an der Abfrage. Das ist eine ganz normale und einfache Anfrage die Du da stellen willst. Arbeite ein SQL-Tutorial durch. Das sind absolute Grundlagen. Learn SQL The Hard Way ist zwar noch nicht fertig, aber es ist für einen Start in SQL IMHO durchaus schon geeignet.
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

@Python93: der Ausdruck heißt: "SELECT * FROM zeile WHERE server in ('ABCD', 'ABCD2') AND lizenz in ('bla', 'blubb', 'foo')"
wenn der aber bei 1.3Mio Einträgen länger als 30s braucht, würde ich den Server aus den 80er-Jahren durch ein moderneres Gerät ersetzen.
Antworten