Anfänger-SQL-Abschnitt: Vermeidung wiederholter Ausdrücke

Ich bin völlig neu in SQL, aber sagen wir mal, dass ich im StackExchange Data Explorer nur die Top 15 Benutzer nach Reputation auflisten möchte, und ich habe so etwas geschrieben:

SELECT TOP 15 DisplayName, Id, Reputation, Reputation/1000 As RepInK FROM Users WHERE RepInK > 10 ORDER BY Reputation DESC 

Derzeit gibt es einen Error: Invalid column name 'RepInK' , was meiner Meinung nach Sinn macht, weil RepInK keine Spalte in Users . Ich kann das leicht beheben, indem ich WHERE Reputation/1000 > 10 sage und im Wesentlichen die Formel wiederhole.

Also sind die Fragen:

  • Kann ich die RepInK Spalte in der WHERE Klausel tatsächlich verwenden?
    • Muss ich vielleicht eine virtuelle Tabelle / Sicht mit dieser Spalte erstellen und dann eine SELECT/WHERE Abfrage SELECT/WHERE ?
  • Kann ich einen Ausdruck nennen, zB Reputation/1000 , also muss ich die Namen nur an einigen Stellen anstelle der Formel wiederholen?
    • Wie nennst du das? Ein Substitutionsmakro? Eine function? Eine gespeicherte Prozedur?
  • Gibt es ein SQL-Quicksheet, ein Glossar mit Begriffen, eine Sprachspezifikation, alles, was ich verwenden kann, um schnell die Syntax und Semantik der Sprache zu erlernen?
    • Ich verstehe, dass es verschiedene "Geschmacksrichtungen" gibt?

Kann ich die RepInK-Spalte in der WHERE-Klausel tatsächlich verwenden?

Nein, aber Sie können sicher sein, dass Ihre database einmal ausgewertet wird (Reputation / 1000) , auch wenn Sie sie sowohl in den SELECT Feldern als auch in der WHERE Klausel verwenden.

Muss ich vielleicht eine virtuelle Tabelle / Sicht mit dieser Spalte erstellen und dann eine SELECT / WHERE-Abfrage ausführen?

Ja, eine view ist eine Option, um komplexe Abfragen zu vereinfachen.

Kann ich einen Ausdruck nennen, zB Reputation / 1000, also muss ich die Namen nur an einigen Stellen anstelle der Formel wiederholen?

Sie könnten eine benutzerdefinierte function erstellen, die Sie so etwas wie convertToK nennen convertToK , die den rep-Wert als Argument erhalten würde und das Argument durch 1000 dividiert. Für einen trivialen Fall wie den in Ihrem Beispiel ist dies jedoch oft nicht praktikabel.

Gibt es ein SQL-Quicksheet, ein Glossar mit Begriffen, eine Sprachspezifikation, alles, was ich verwenden kann, um schnell die Syntax und Semantik der Sprache zu erlernen?

Ich empfehle Übung. Vielleicht möchtest du dem mysql- Tag auf Stack Overflow folgen, wo viele Anfängerfragen jeden Tag gestellt werden. Laden Sie MySQL herunter , und wenn Sie glauben, dass eine Frage in Ihrer Reichweite ist, versuchen Sie, eine Lösung zu finden. Ich denke, das wird Ihnen helfen, schneller zu werden, sowie die Sprachfunktionen kennen zu lernen. Es gibt keine Notwendigkeit, die Antwort zuerst zu posten, denn es gibt einige ziemlich schnelle Waffen auf dem Thema hier, aber mit etwas Übung bin ich sicher, dass du in der Lage sein wirst, einige Punkte nach Hause zu bringen 🙂

Ich verstehe, dass es verschiedene "Geschmacksrichtungen" gibt?

Die Flavors sind eigentlich Erweiterungen zu ANSI SQL . databasehersteller erweitern die SQL-Sprache normalerweise mit Erweiterungen wie Transact-SQL und PL / SQL .

Sie könnten einfach die WHERE-Klausel neu schreiben

 where reputation > 10000 

Dies wird nicht immer bequem sein. Alternativ können Sie eine Inline-view verwenden:

 SELECT a.DisplayName, a.Id, a.Reputation, a.RepInK FROM ( SELECT TOP 15 DisplayName, Id, Reputation, Reputation/1000 As RepInK FROM Users ORDER BY Reputation DESC ) a WHERE a.RepInK > 10 

In Bezug auf etwas wie benannte Ausdrücke, während es mehrere mögliche Alternativen gibt, wird der Abfrageoptimierer am besten tun, nur die Formel Reputation / 1000 long-hand schreiben. Wenn Sie wirklich eine ganze Gruppe von Abfragen mit dem gleichen bewerteten Wert ausführen müssen, ist es am besten, eine Sicht mit dem definierten Feld zu erstellen, aber dies sollte nicht für eine einmalige Abfrage durchgeführt werden.

Als Alternative (und in Fällen, in denen die performance kein großes Problem darstellt) könnten Sie Folgendes versuchen:

 SELECT TOP 15 DisplayName, Id, Reputation, RepInk FROM ( SELECT DisplayName, Id, Reputation, Reputation / 1000 as RepInk FROM Users ) AS table WHERE table.RepInk > 10 ORDER BY Reputation DESC 

obwohl ich nicht glaube, dass dies von allen SQL-Dialekten unterstützt wird, und wiederum, der Optimierer wird wahrscheinlich eine viel schlechtere Arbeit leisten, die diese Art von Sache (da es die SELECT gegen die volle Benutzer-Tabelle ausführt und dann dieses Ergebnis filtert). Für einige Situationen ist diese Art von Abfrage jedoch angemessen (es gibt einen Namen dafür … Ich zeichne im Moment eine Leerstelle).

Als ich mit SQL anfing, fand ich die W3-Schulreferenz persönlich als meinen ständigen Haltepunkt. Es passt zu meinem Stil, etwas zu sein, auf das ich schauen kann, um eine schnelle Antwort zu finden und weiterzumachen. Um die database wirklich zu nutzen, ist es jedoch notwendig, sich in die Dokumentation des Anbieters einzuarbeiten.

Obwohl SQL "standarisiert" ist, leider (obwohl glücklicherweise zum Teil), implementiert jeder databaseanbieter seine eigene Version mit eigenen Erweiterungen, was dazu führen kann, dass eine ganz andere Syntax am besten geeignet ist (für eine Diskussion der Inkompatibilitäten verschiedener databaseen zu einem Thema finden Sie in der SQLite-Dokumentation zur NULL-Behandlung, insbesondere Standardfunktionen, zB zur Behandlung von DATEs und TIMEs, unterscheiden sich je nach Anbieter, und es gibt andere, drastischere Unterschiede (insbesondere keine Subselects unterstützen oder JOINs richtig behandeln) Wenn Sie sich um einige Details kümmern, enthält dieses Dokument sowohl die Standardformulare als auch die Abweichungen für mehrere wichtige databaseen.

Sie können sich in der Order By Klausel auf RepInK beziehen, aber in der Where Klausel müssen Sie den Ausdruck wiederholen. Aber wie andere gesagt haben, wird es nur einmal ausgeführt.

Es gibt bereits gute Antworten auf das technische Problem, daher werde ich nur auf einige der übrigen Fragen eingehen.

Wenn Sie nur mit dem DataExplorer arbeiten, sollten Sie sich mit der SQL server-Syntax vertraut machen, da diese gerade ausgeführt wird. Der beste Ort, um das zu finden, ist natürlich die reference von MSDN .

Ja, es gibt verschiedene Variationen in der SQL-Syntax. Zum Beispiel ist die TOP Klausel in der Abfrage, die Sie angegeben haben, SQL server-spezifisch; in MySQL würden Sie stattdessen die LIMIT Klausel verwenden (und diese Schlüsselwörter erscheinen nicht unbedingt an derselben Stelle in der Abfrage!).