Erfassen Sie Ihre Fortschritte
Trailhead-Startseite
Trailhead-Startseite

Von SQL zu SOQL

Lernziele

Nachdem Sie diese Lektion abgeschlossen haben, sind Sie in der Lage, die folgenden Aufgaben auszuführen:

  • Verstehen der Vorteile der Force.com-Objekte.
  • Erkennen der Ähnlichkeiten und Unterschiede zwischen SQL und SOQL.
  • Erstellen einer einfachen SOQL-Anweisung mithilfe der Workbench.
  • Erstellen von komplizierteren Beziehungsabfragen.
  • Erstellen von aggregierten Abfragen.

Verstehen der Force.com-Objekte

Die Force.com-Plattform bietet eine leistungsstarke Datenbank mit zahlreichen Funktionen, die das Erstellen von Anwendungen erleichtern und beschleunigen. Wenn Sie sich mit SQL Server auskennen, wissen Sie, dass die Daten in Tabellen und Zeilen gespeichert werden. Die Datenbank in Force.com verwendet zum Speichern von Daten jedoch Objekte. Objekte bieten alle Funktionen wie eine Tabelle und zusätzliche Verbesserungen, durch die sie noch leistungsstärker und vielseitiger werden. Jedes Objekt umfasst eine bestimmte Anzahl an Feldern, die den Spalten einer Datenbank entsprechen. Die Daten werden in Datensätzen des Objekts gespeichert, die wiederum den Zeilen einer Datenbank entsprechen. Aber warten Sie, es gibt noch mehr!

Es gibt zwei Arten von Objekten:

  1. Standardobjekte – Dies sind Objekte, die bereits in Salesforce enthalten sind. Einige häufig verwendete CRM-Objekte sind 'Accounts', 'Contacts', 'Opportunities' und 'Leads'.

  2. Benutzerdefinierte Objekte – Hierbei handelt es sich um neue Objekte, die Sie erstellen, um Informationen speziell für Ihre Anwendung zu speichern. Benutzerdefinierte Objekte erweitern die durch Standardobjekte bereitgestellten Funktionen. Wenn Sie beispielsweise eine Anwendung zum Nachvollziehen des Produktinventars entwickeln, könnten Sie die benutzerdefinierten Objekte 'Merchandise', 'Orders' oder 'Invoices' erstellen.

Wie Sie sich wahrscheinlich schon denken können, können Objekte Beziehungen aufweisen, die festlegen, in welcher Beziehung Datensätze in einem Objekt zu Datensätzen in einem anderen Objekt stehen. Dabei handelt es sich im Wesentlichen um primäre und Fremdschlüssel, die jedoch viel flexibler sind, sodass Sie Ihr Datenmodell leichter konzipieren und umsetzen können.

Unabhängig davon, ob es sich um Standardobjekte oder benutzerdefinierte Objekte handelt: Force.com-Objekte stellen nicht nur eine Struktur zum Speichern von Daten bereit, sondern sie stellen auch leistungsstarke Benutzeroberflächenelemente zur Verfügung, über die die Benutzer mit den Daten arbeiten können, wie beispielsweise Registerkarten, Layouts von Feldern auf einer Seite und Listen mit verwandten Datensätzen. Bei der Standardfunktionalität ist es nicht erforderlich, ein ORM zu implementieren, eine Benutzeroberfläche für CRUDing Data zu schreiben oder Tabellen zu erstellen. Diese Standardfunktionalität wird Ihnen von der Plattform automatisch zur Verfügung gestellt. Zusätzlich verfügen Objekte über integrierte Support-Funktionen, wie z. B. Zugriffsverwaltung, Validierung, Formeln und Verlaufsverfolgung. Alle Attribute eines Objekts werden mit Metadaten beschrieben, sodass Datensätze leicht über eine visuelle Oberfläche oder programmgesteuert erstellt und geändert werden können.

Dadurch wird deutlich, dass Objekte viel mehr sind als nur Container zum Speichern von Daten. Sie bieten einen großen Funktionsumfang, der Ihnen die Freiheit gibt, spezifische Funktionen für Ihre Anwendung zu erstellen. Weitere Informationen zum Erstellen von benutzerdefinierten Objekten, Feldern, Beziehungen und vielem mehr finden Sie im Modul zur Datenmodellierung.

Ähnlich aber nicht identisch

Die Chancen stehen ziemlich gut, dass Sie als .NET-Entwickler gut mit SQL Server zurechtkommen. Außerdem stehen die Chancen ziemlich gut, dass Sie mit dem Schreiben von Ad-hoc-Abfragen in SQL vertraut sind. Also dachten wir uns, dass die beste Methode, um Ihnen eine ähnliche Sprache näherzubringen, die speziell für Salesforce entwickelt wurde, nämlich SOQL, oder Salesforce Object Query Language, in einem Vergleich zwischen beiden Sprachen besteht.

Das Erste, was man wissen sollte, ist, dass SOQL nur verwendet wird, um Abfragen mit der SELECT-Anweisung durchzuführen, obwohl beide als Abfragesprachen bezeichnet werden. SOQL hat keine äquivalenten INSERT-, UPDATE- und DELETE-Anweisungen. In der Salesforce-Welt erfolgt die Datenmanipulation unter Einsatz eines Satzes von Methoden, der DML (Data Manipulation Language) genannt wird. Mit DML werden wir uns später noch mehr befassen. Jetzt müssen Sie erst einmal wissen, wie Sie Salesforce-Daten mithilfe der von SOQL bereitgestellten SELECT-Anweisung abfragen.

Ein großer Unterschied, den Sie direkt feststellen werden, besteht darin, dass SOQL über nichts wie SELECT * verfügt. Da SOQL Salesforce-Daten ausgibt und diese Daten in einer mandantenfähigen Umgebung existieren, in der jeder quasi 'die Datenbank teilt', schreit ein Platzhalter wie * geradezu nach Ärger. Ehrlich gesagt ist es einfach zu leicht, eine neue SQL-Abfrage abzusetzen und SELECT * FROM SOME-TABLE einzugeben, ganz besonders, wenn Sie die Namen der Tabellenfelder nicht kennen. Diese Aktion könnte andere Mandanten in Ihren gemeinsam genutzten Umgebungen ernsthaft beeinträchtigen. Würden Sie sonntags morgens um 7 Uhr den Rasen mähen? Das ist einfach unverschämt und unhöflich.

In SOQL geben Sie den Namen jedes Feldes an, das ausgegeben wird. Darüber hinaus ist die SELECT-Anweisung, die SOQL bietet, ähnlich wie in SQL. Sie werden es ziemlich einfach finden, SOQL-Abfragen zu schreiben. Hier finden Sie alles, was Sie wissen müssen. Obwohl SQL und SOQL einander ähnlich sind, sind sie nicht identisch. SOQL unterstützt einige der erweiterten Funktionen nicht, während die SQL SELECT-Anweisung dies tut. Auf der Salesforce-Plattform brauchen Sie all diese Extrafunktionen jedoch einfach nicht. SOQL bietet alles, was Sie brauchen, sodass Sie sich wie zuhause fühlen.

Erstellen einer Abfrage mit der Workbench

Wenn vom Schreiben von SOQL-Abfragen die Rede ist, fragen Sie sich bestimmt, wie das geht. Ein einfacher Weg für den Anfang besteht darin, das webbasierte Salesforce-Tool Workbench zu verwenden. Wir wissen, wie sehr .NET-Entwickler Tools lieben, und dieses leistungsstarke Tool bietet Administratoren und Entwicklern viele Möglichkeiten, um mithilfe von Force.com-APIs auf ihre Organisationen zuzugreifen.

Jetzt konzentrieren wir uns erst einmal auf den Einsatz der Workbench zum Erstellen von SOQL-Abfragen, aber wenn Sie mal etwas Zeit haben, durchsuchen Sie doch schon mal die Workbench und schauen sich an, was sie alles anbietet. Das wird Ihnen bestimmt gefallen. Registrieren Sie sich für eine kostenlose Developer Edition (DE) und

  1. navigieren Sie dann zu https://workbench.developerforce.com/login.php.
  2. Wählen Sie als Umgebung Production aus.
  3. Wählen Sie die letzte API-Version aus dem Dropdown-Menü 'API Version' aus.
  4. Akzeptieren Sie die Bedingungen des Dienstes und klicken Sie auf Login with Salesforce.
  5. Geben Sie Ihre Anmeldeinformationen ein und klicken Sie auf Log in.
  6. Um der Workbench Zugang zu Ihren Informationen zu gewähren, klicken Sie auf Allow.
  7. Nachdem Sie sich angemeldet haben, wählen Sie queries > SOQL Query aus.
  8. Wählen Sie Account als Objekt aus.

Bitte beachten Sie, dass Sie ein Objekt ausgewählt haben und keine Tabelle. Die Daten bleiben in den Objekten bestehen. Tatsächlich werden Sie sObjects genannt, wie in Salesforce Objects, und sie sind fest in die Force.com-Plattform integriert, sodass es leicht ist, mit ihnen zu arbeiten.

  1. Halten Sie die Strg-Taste gedrückt und wählen Sie aus der Liste der Felder CreatedDate, Name, Phone, Type aus. Während Sie das Objekt und die Felder auswählen, wird die SOQL-Abfrage in dem Textfeld für Sie erstellt. Sie sieht wie folgt aus:

    SELECT CreatedDate, Name, Phone, Type FROM Account
    
  2. Klicken Sie auf Query, um die in Form einer Liste ausgegebenen Ergebnisse anzuzeigen. Schauen Sie sich in den Ergebnissen den Wert an, der im Feld 'CreatedDate' ausgegeben wurde.

Leider sind die Datums- und Uhrzeitfelder in Salesforce genauso kompliziert und schwierig zu bearbeiten wie in SOQL und SQL. Erfreulicherweise bietet Salesforce verschiedene Datumsfunktionen, die die Arbeit mit ihnen in SOQL erträglicher machen. Und während Sie sich in der Dokumentation umsehen, schauen Sie sich an, wie SOQL mit Währungsfeldern umgeht, da sie ebenfalls etwas anders sind, insbesondere bei Organisationen, die Geschäfte in mehreren Währungen tätigen.

Filtern der Ergebnisse

In SOQL werden nur zwei Klauseln benötigt: SELECT und FROM. Die WHERE-Klausel ist optional. Als guter Entwickler aber (der Sie ja sicherlich sind), möchten Sie bestimmt in nahezu alle Abfragen, die Sie schreiben, eine WHERE-Klausel einfügen. Es macht keinen Sinn, mehr Daten auszugeben, als Sie benötigen.

Wieder einmal ist es am einfachsten, mithilfe der Workbench zu sehen, wie dies funktioniert.

  1. Nachdem Sie sich bei der Workbench angemeldet haben, wählen Sie queries > SOQL Query aus.
  2. Wählen Sie Contact als Objekt aus.
  3. Halten Sie die Ctrl-Taste gedrückt und wählen Sie aus der Liste der Felder AccountId, Email, Id, LastName aus. Während Sie das Objekt und die Felder auswählen, wird die SOQL-Abfrage in dem Textfeld für Sie erstellt.
  4. Klicken Sie auf Query, um die in Form einer Liste ausgegebenen Ergebnisse anzuzeigen. Sie sieht wie folgt aus:

    SELECT AccountId, Email, Id, LastName FROM Contact
    

Bei dieser Abfrage werden alle Kontakte in Ihrer Organisation ausgegeben. Bei einer Entwicklungsorganisation ist diese Liste u. U. klein. Bei den meisten Organisationen in der Realität kann es sich bei der Zahl der ausgegebenen Kontakte um Tausende handeln, weshalb Sie immer in Betracht ziehen sollten, Ihre SOQL-Abfragen mit einer WHERE-Klausel zu filtern, und zwar ganz besonders diejenigen, die in Apex-Code verwendet werden.

  1. Wählen Sie aus der Dropdown-Liste der Filterergebnisse den Eintrag Email aus.

  2. Wechseln Sie mit der Tab-Taste zum nächsten Feld und klicken Sie auf den Pfeil im Dropdown-Feld, um eine Liste der möglichen Operatoren anzuzeigen.

  3. Wählen Sie aus der Liste contains aus, wechseln Sie dann mit der Tab-Taste zum letzten Feld und geben Sie .net ein. Die erstellte Abfrage sieht wie folgt aus:

    SELECT AccountId, Email, Id, LastName FROM Contact WHERE Email LIKE '%.net%'
    

Haben Sie gesehen, was passiert ist? Die Abfrage, die Sie erstellt haben, beinhaltet nicht das Wort contains. Stattdessen verwendet sie LIKE. Die Abfrage beinhaltet außerdem die erforderlichen einfachen Anführungszeichen (da 'Email' ein Textfeld ist) sowie vor- und nachgestellte Prozentzeichen, die angeben, dass es sich um eine Suche mit Platzhaltern handelt.

Hinweis: Die Verwendung von Platzhaltern, und insbesondere von vor- und nachgestellten Platzhaltern wie im Beispiel oben, gilt nicht als bewährte Praxis. In einer späteren Lektion erfahren Sie mehr darüber, wie Sie effiziente Abfragen erstellen; jetzt merken Sie sich erst einmal, dass Sie Suchen mit Platzhaltern wie diese nach Möglichkeit vermeiden sollten.

  1. Wenn Sie schon einmal dabei sind, fahren Sie fort und sortieren die Ergebnisse nach dem Nachnamen, indem Sie aus den Sortierergebnissen mittels der Dropdown-Liste LastName auswählen.
  2. Lassen Sie die anderen Standardwerte in der Reihenfolge bei A bis Z und mit den Nullen an erster Stelle. Ihre Abfrage sieht nun wie folgt aus:

    SELECT AccountId,Email,Id,LastName FROM Contact
      WHERE Email LIKE '%.net%' ORDER BY LastName ASC NULLS FIRST
    
  3. Klicken Sie auf Query, um die Ergebnisse in Form einer sortierten Liste auszugeben.

Bitte beachten Sie ganz besonders, dass es in den Ergebnissen zwei ID-Felder gibt: AccountId und Id. Diese Felder enthalten eine eindeutige aus 18 Zeichen bestehende Zeichenfolge die von der Plattform zugewiesen wurden, als die Datensätze 'Account' und 'Contact' erstellt wurden. Das Feld 'AccountID' ist mit dem Datensatz 'Account' verbunden, dem dieser bestimmte 'Contact' zugewiesen wurde. Im SQL-Zusammenhang ist dies eine Fremdschlüssel-Beziehung. Das ID-Feld steht in Beziehung zu dem Kontakt. Im SQL-Zusammenhang stellt es den primären Schlüssel dar.

Während wir uns hiermit Fremdschlüssel-Beziehungen beschäftigen, fragen Sie sich möglicherweise gerade, wie Sie Tabellen in SOQL miteinander verbinden. Ganz einfach: gar nicht! SOQL hat keine entsprechende JOIN-Klausel. Aber keine Sorge, das ist positiv zusehen.

Eine andere Art von Verknüpfung

Sicher wird es Sie nicht überraschen, dass Salesforce die Dinge etwas anders angeht, als Sie es gewohnt sind, wenn es um das Kombinieren von Objekten oder Tabellen geht. Anstatt Tabellen mithilfe einer JOIN-Klausel zu verbinden, schreiben Sie so genannte Beziehungsabfragen.

'Und was ist das?' werden Sie sagen. Das ist eine sehr wichtige Frage!

Salesforce verwendet eine Parent-Child-Beziehung, um zwei Objekte zu verbinden. Genau wie SQL verwendet SOQL einen Fremdschlüssel, um diese beiden Objekte zu verbinden, aber in SOQL ist die Abfragesyntax eine andere. Wir werden Ihnen hier nicht die Unwahrheit erzählen. Zuallererst fühlt sich diese neue Syntax wahrscheinlich etwas eigenartig an, da Sie mit Objekten und nicht mit Zeilen arbeiten. Wenn Sie sich aber erst einmal an die Grundlagen gewöhnt haben, werden Sie es viel leichter finden, Beziehungsabfragen zu schreiben als in SQL Verknüpfungen zu schreiben.

SOQL verfügt über zwei grundlegende Beziehungsabfragetypen, die Sie sich merken müssen:

  • Child-to-parent
  • Parent-to-children

Beide funktionieren unterschiedlich. Da Sie bereits einige Felder für die häufig kombinierten Objekte 'Account' und 'Contact' kennengelernt haben, beginnen wir mit ihnen. Jetzt ist es erst einmal wichtig, dass Sie wissen, dass 'Account' der Parent ist und 'Contact' das Child.

Schreiben einer Child-to-Parent-Abfrage

Nehmen wir einmal an, Sie möchten eine Abfrage schreiben, die 'Account'- und 'Contact'-Daten ausgibt. Zum einen können Sie eine Child-to-Parent-Abfrage schreiben. Diese Beziehungsabfrage verwendet die 'Punktnotation', um auf Daten aus dem Parent zuzugreifen, d. h. ein Punkt trennt den Beziehungsnamen von dem Namen des Felds, das abgefragt wird.

Um zu sehen, wie das funktioniert, werden wir Schritt für Schritt eine Beziehungsabfrage schreiben, die eine Liste mit Kontakten ausgibt, und zwar einschließlich des Namens des verbundenen Accounts. Jetzt verwenden wir aber zunächst anstelle der Workbench die Registerkarte 'Query Editor' in der Entwicklerkonsole.

  1. Wählen Sie in Ihrer DE-Organisation Ihr Name > Developer Console aus, um die Entwicklerkonsole zu öffnen.
  2. Klicken Sie in der Entwicklerkonsole im unteren Bereich auf die Registerkarte Query Editor.
  3. Löschen Sie den vorhandenen Code und fügen Sie den folgenden Ausschnitt ein:

    SELECT FirstName, LastName, Account.Name FROM Contact
    
  4. Klicken Sie auf Execute.

  5. Die Abfrageergebnisse enthalten drei Spalten. Scrollen Sie durch die Ergebnisse. Einige Ergebnisse unter dem Feld 'Account.name' sind null, da nicht alle Kontakte mit einem Account verbunden sind.

Da wir uns denken können, dass Sie wahrscheinlich immer noch in SQL-Zusammenhängen denken, stellen Sie sich einmal dieses Szenario vor. Wenn Sie zwei SQL-Tabellen namens 'Account' und 'Contact' mit einer Eins-zu-Viele-Beziehung zwischen den Tabellen hätten, wie würden Sie dann vorgehen, um eine SQL-Abfrage zu schreiben, die dieselben Daten ausgibt?

Sie würden natürlich eine Verknüpfung verwenden. In diesem Fall brauchen Sie jedoch eine richtige äußere Verknüpfung, da Sie eine äquivalente Abfrage brauchen, die alle Kontakte ausgibt, und zwar auch diejenigen, die nicht mit einem Account verbunden sind. Und das könnte in etwa wie folgt aussehen:

    SELECT c.FirstName, c.LastName, a.Name FROM Account a
    RIGHT JOIN Contact c ON (c.AccountId = a.Id)

Gehen Sie jetzt zurück und schauen sich die äquivalente SOQL-Abfrage an, die, falls Sie sich nicht erinnern, wie folgt lautete:

    SELECT FirstName, LastName, Account.Name FROM Contact

Die SOQL-Abfrage sieht viel einfacher aus, oder?

Um ehrlich zu sein, können Beziehungsabfragen manchmal auch ganz schön verzwickt sein, ganz besonders dann, wenn Sie sich anschauen, wie der Beziehungsname für benutzerdefinierte Objekte lautet. Um mehr über das Konvertieren von SQL-Abfragen in SOQL-Abfragen zu erfahren, schauen Sei sich dieses Praktische Schulungsvideo an.

Ein außerordentlich wichtiger Punkt, über den Sie sich bei diesen Abfragearten im Klaren sein müssen, ist, dass Sie mit der Punktnotation fünf Ebenen nach oben traversieren können. So können Sie vom Child zum Parent zum Grandparent zum Great Grandparent etc. gehen.

Schreiben von Parent-to-Children-Abfragen

Parent-to-Children-Abfragen arbeiten ebenfalls mit dem Beziehungsnamen, wobei sie ihn jedoch in einer so genannten geschachtelten 'Select'-Abfrage verwenden. Wie beim letzten Abfragetyp lässt sich dieser besser anhand eines Beispiels erläutern.

Dieses Mal schreiben wir eine Abfrage vom Parent-Account-Objekt und lassen sie eine geschachtelte Abfrage einschließen, die auch Daten über jeden einzelnen verbundenen Kontakt ausgibt.

  1. Klicken Sie in der Entwicklerkonsole im unteren Bereich auf die Registerkarte Query Editor.
  2. Löschen Sie den vorhandenen Code und fügen Sie den folgenden Ausschnitt ein:

    SELECT Name, (Select FirstName, LastName FROM Contacts) FROM Account
    

Der Beziehungsname in der geschachtelten Abfrage verwendet den Namen 'Contacts' im Plural und nicht im Singular. Es ist wichtig, dass Sie dieses Detail verstehen, denn das ist genau der Punkt, über den viele stolpern. Bei Beziehungsabfragen muss der Parent-to-Child-Beziehungsname im Plural stehen.

Bei benutzerdefinierten Objekten steht der Beziehungsname nicht nur im Plural; zusätzlich werden ihm noch zwei Unterstriche und ein 'r' angehängt. Der Beziehungsname für das benutzerdefinierte Objekt 'My_Object__c' lautet beispielsweise 'My_Objects__r'.

  1. Klicken Sie auf Execute.
  2. Die Abfrageergebnisse enthalten zwei Spalten. Bitte beachten Sie im folgenden Bild, wie die Ergebnisse in der Spalte 'Contacts' angezeigt werden. Da jeder Account in der Regel mit mehreren Kontakten verbunden ist, werden der erste und der letzte Name im JSON-Format angezeigt.

In Developer Console angezeigte SOQL-Abfrageergebnisse

Schauen wir uns auch hier an, wie dieselbe Abfrage in SQL geschrieben wird. Bei dieser Abfrage ist das SQL-Äquivalent eine linke äußere Verknüpfung zu Folgendem:

    SELECT a.Name, c.FirstName, c.LastName
    FROM Account a
    LEFT JOIN Contact c ON (a.Id = c.AccountId)

Die SQL-Abfrage ergibt alle 'Account'-Datensätze und alle mit diesen Accounts verbundenen Kontakte. Die in SQL ausgegebenen Daten sind nicht als JSON formatiert. Abgesehen davon ergeben die SQL- und SOQL-Abfragen jedoch dieselben Ergebnisse.

An dieser Stelle fragen Sie sich möglicherweise, ob SOQL Aliasnamen unterstützt. Das ist der Fall, jedoch nicht so, wie Sie daran in SQL gewöhnt sind. SOQL hat kein AS-Schlüsselwort. Sie können Aliasnamen verwenden, um Objektnamen in SOQL-Abfragen darzustellen, aber bei Feldnamen funktionieren Aliasnamen nur bei aggregierten Abfragen, mit denen wir uns als Nächstes beschäftigen werden.

Zur Erinnerung: Um tiefer in dieses Thema einzutauchen, schauen Sie sich das praktische Schulungsvideo an, das Sie unter dem entsprechenden Link im Abschnitt 'Ressourcen' aufrufen können.

Was ist mit Aggregaten?

Ja, SOQL hat Aggregate und sie funktionieren so ziemlich genau so, wie Sie es erwarten würden. Nun ja, so gut wie. Bei der Arbeit mit Aggregaten müssen Sie sich unbedingt darüber im Klaren sein, dass Ihr Ergebnis bei den meisten Funktionen als AggregateResult-Typ ausgegeben wird.

Die Funktionen, die Sie in SOQL verwenden können, sind diejenigen, die in der nachfolgenden Tabelle genannt sind. Weitere Einzelheiten zu den einzelnen Funktionen finden Sie in den offiziellen Dokumenten.

SOQL-Aggregatfunktionen

Funktion Beschreibung
AVG() Gibt den durchschnittlichen Wert eines numerischen Felds zurück.
COUNT() und COUNT(fieldName) und COUNT_DISTINCT() Gibt die Anzahl der Zeilen zurück, die den Abfragekriterien entsprechen.
MIN() Gibt den Mindestwert eines Felds zurück.
MAX() Gibt den Höchstwert eines Felds zurück.
SUM() Gibt die Gesamtsumme eines numerischen Felds zurück.

Um eine Datensatzzahl für eine bestimmte Tabelle namens 'Account' in SQL zu erhalten, gehen Sie in etwa wie folgt vor:

SELECT COUNT(*) FROM Account

In SOQL sieht dieselbe Abfrage so aus:

SELECT COUNT() FROM Account

Ziemlich ähnlich, oder?

Wo sie sich unterscheiden, hängt davon ab, welche Version der Zählfunktion Sie verwenden, da sie unterschiedliche Dinge zurückgeben. Die Funktion COUNT() ohne Feldnamen ist eine ältere Version, die vor anderen Aggregatfunktionen zur Verfügung stand. Sie gibt eine Ganzzahl zurück und ist der Funktion count(*) in SQL sehr ähnlich.

Count(fieldName) ist eine neuere Version, die die Anzahl der Zeilen zurückgibt, in denen der Feldname einen anderen Wert als Null hat. Anders ist, dass sie dieses Ergebnis als Liste von aggregierten Ergebnissen zurückgibt und nicht als Einzelwert.

Sehen wir sie uns einmal in Aktion an.

  1. Klicken Sie in der Entwicklerkonsole im unteren Bereich auf die Registerkarte Query Editor.
  2. Löschen Sie den vorhandenen Code und fügen Sie den folgenden Ausschnitt ein:

    SELECT COUNT() FROM Account
    
  3. Klicken Sie auf Execute. Die Abfrageergebnisse zeigen die Gesamtzahl der Zeilen mit einer Zahl daneben.

  4. Gehen Sie zurück zur Registerkarte 'Query Editor' und ändern Sie die Abfrage so, dass sie wie folgt lautet:

    SELECT COUNT(Id) FROM Account
    
  5. Klicken Sie auf Execute. Jetzt wird als Abfrageergebnis nur eine Zeile ausgegeben und eine Spalte, in der die Gesamtzahl der Datensätze angezeigt wird.

Bis zu diesem Punkt haben wir noch nicht viel dazu gesagt, wie Sie mit den Daten umgehen, die auf Ihre SOQL-Abfragen zurückgegeben werden. Warum aber das Unvermeidliche hinauszögern? Rollen wir also die Ärmel hoch und schauen wir uns einige aggregierte Daten genau an.

Wir werden ein wenig in Apex eintauchen; wenn Sie aber nicht alles verstehen, macht das nichts. Wir werden später genauer darauf eingehen.

  1. Klicken Sie in der Entwicklerkonsole auf Debug > Open Execute Anonymous Window.
  2. Löschen Sie den vorhandenen Code und fügen Sie den folgenden Ausschnitt ein:

    List<AggregateResult> results  = [SELECT Industry, count(Id) total
        FROM Account GROUP BY Industry];
    
    for (AggregateResult ar : results) {
        System.debug('Industry: ' + ar.get('Industry'));
        System.debug('Total Accounts: ' + ar.get('total'));
    }
    

Bitte beachten Sie, wie wir einen Aliasnamen für die Summe sowie die GROUP BY-Klausel verwendet haben. In SOQL können Sie nur Felder in aggregierten Abfragen mit einem Aliasnamen versehen, die die GROUP BY-Klausel verwenden.

  1. Stellen Sie sicher, dass Open Log ausgewählt ist, und klicken Sie auf Execute. Es wird eine Registerkarte mit dem Ausführungsprotokoll angezeigt.
  2. Wählen Sie die Option Debug Only aus, damit Sie nur die Debug-Anweisungen in dem Protokoll sehen.

Weitere Infos

Neben der GROUP BY-Klausel bietet SOQL andere Gruppierungsklauseln wie z. B. GROUP BY ROLLUP, GROUP BY CUBE und GROUPING. Diese Klauseln sind hilfreich bei der Überprüfung der Ergebnisse, wenn bei einer Abfrage Werte aus verschiedenen verbundenen Tabellen ausgegeben werden. Mit GROUP BY CUBE können Sie Zwischensummen für alle Kombinationen aus gruppierten Feldern in den Abfrageergebnissen errechnen. Um mehr über diese Klauseln zu erfahren, schauen Sie sich das Dokument "GROUP BY" im Abschnitt "Ressourcen" an.

Aggregierte Funktionen unterstützen außerdem eine optionale HAVING-Klausel ähnlich der HAVING-Klausel in SQL Server, sodass Sie sich hier zu Hause fühlen sollten. Grundsätzlich lässt sie Sie die Ergebnisse filtern, die eine aggregierte Funktion ausgibt. Weitere Informationen finden Sie im Abschnitt 'Ressourcen'.

Ressourcen