Kuonen SQL

Beispielkatalog

Jedes Beispiel ist zugleich ein Test: der Katalog läuft im Testlauf gegen einen echten Server und muss sein hinterlegtes Ergebnis liefern — was hier steht, ist genau das, was ausgeführt wird.

Abfragen

Zeilen mit Filter und Sortierung

Jede Tabelle ist ein Feld der Abfrage. where, orderBy, limit und offset stehen als Argumente; die Werte sind immer Parameter, nie Teil des SQL-Textes.

{ pruefstand_kunden(where: {Ort: {eq: "Bern"}}, orderBy: [{Name: DESC}]) { Id Name Ort } }
Erwartetes Ergebnis
Antwort
{"pruefstand_kunden":[{"Id":"3","Name":"Clara","Ort":"Bern"},{"Id":"1","Name":"Anna","Ort":"Bern"}]}

distinct_on: je Ort der erste Kunde

T-SQL kennt kein DISTINCT ON; der Server übersetzt es in ROW_NUMBER() OVER (PARTITION BY …). Je Wertekombination bleibt die erste Zeile nach orderBy.

{ pruefstand_kunden(distinct_on: [Ort], orderBy: [{Ort: ASC}, {Id: ASC}]) { Ort Name } }
Erwartetes Ergebnis
Antwort
{"pruefstand_kunden":[{"Ort":"Bern","Name":"Anna"},{"Ort":"Zürich","Name":"Bruno"}]}

Verschachtelung

Kunden mit ihren Bestellungen und deren Summe

Ein Fremdschlüssel ist in beide Richtungen ein Feld. Die Bestellungen aller Kunden kommen mit einer einzigen Abfrage, nicht mit einer je Kunde; das Aggregat rechnet die Datenbank, je Kunde.

{ pruefstand_kunden(orderBy: [{Id: ASC}]) {
    Name
    pruefstand_bestellungen(orderBy: [{Id: ASC}]) { Betrag }
    pruefstand_bestellungen_aggregate { count sum { Betrag } }
} }
Erwartetes Ergebnis
Antwort
{"pruefstand_kunden":[{"Name":"Anna","pruefstand_bestellungen":[{"Betrag":"10.00"},{"Betrag":"20.50"}],"pruefstand_bestellungen_aggregate":{"count":2,"sum":{"Betrag":"30.50"}}},{"Name":"Bruno","pruefstand_bestellungen":[{"Betrag":"5.25"}],"pruefstand_bestellungen_aggregate":{"count":1,"sum":{"Betrag":"5.25"}}},{"Name":"Clara","pruefstand_bestellungen":[],"pruefstand_bestellungen_aggregate":{"count":0,"sum":{"Betrag":null}}}]}

Mutationen

Einfügen und Löschen in einer Transaktion

Eine Mutation ist eine Transaktion: alle Wurzelfelder laufen nacheinander, scheitert eines, ist alles zurückgenommen. Dieses Beispiel legt einen Kunden an und löscht ihn wieder — und hinterlässt keine Spur.

mutation {
  neu: insert_pruefstand_kunden(objects: [{Name: "Dora", Ort: "Basel"}]) { affected_rows returning { Name Ort } }
  weg: delete_pruefstand_kunden(where: {Name: {eq: "Dora"}}) { affected_rows }
}
Erwartetes Ergebnis
Antwort
{"neu":{"affected_rows":1,"returning":[{"Name":"Dora","Ort":"Basel"}]},"weg":{"affected_rows":1}}