Arbeiten mit Daten in Azure Data Studio

Abgeschlossen

Nachdem Ihr Datenmodell nun fertig ist, ist es an der Zeit, einige Daten einzufügen und zu ermitteln, wie alle mit den Tabellen erstellten Elemente funktionieren.

In dieser Übung führen Sie SQL-Befehle aus, um zu ermitteln, wie die Tabellen im Datenmodell zusammenhängen und wie die von Ihnen erstellten Regeln erzwungen werden.

Neue Abfragetabelle öffnen

  1. Damit Sie anfangen können, in der Azure SQL-Datenbank mit SQL zu arbeiten, müssen Sie eine neue Abfragetabelle öffnen. Klicken Sie in Azure Data Studio im linken Bereich mit der rechten Maustaste auf den Kartendatenbankserver, und wählen Sie neue Abfrage aus.

    Screenshot showing how to select New Query for a query sheet.

  2. Sobald die neue Abfragetabelle geöffnet ist, stellen Sie über die Dropdownliste Datenbank sicher, dass Sie mit der Azure SQL-Datenbank carddatabaseverbunden sind.

    Screenshot showing how to ensure that you are connected to the carddatabase Azure SQL Database using the Database dropdown.

Arbeiten mit Daten

Im folgenden Abschnitt wird die Abfragetabelle in Azure Data Studio verwendet. Nachdem Sie einen Befehl kopiert und in die Tabelle eingefügt haben, können Sie den SQL-Code hervorheben. Drücken Sie nach dem Hervorheben entweder F5, oder klicken Sie auf die grüne Schaltfläche Ausführen, um den SQL-Code in der Azure SQL-Datenbank auszuführen.

Screenshot showing how to select the green Run button to run the query in the query sheet.

  1. Fügen Sie zunächst per SQL wie folgt eine Zeile in die Kartentabelle ein.

    Hinweis

    Konvertieren Sie zur Vereinfachung des Einfügens von Bildern einfach Text mit dem SQL-Befehl convert in den Datentyp Varbinary.

    insert into dbo.cards (card_name, card_type, card_color, card_power, card_text, card_status, card_art)
    values(N'Duck', N'monster',N'white',10,N'Quack Attack', 1, CONVERT(varbinary(max), 'DUCK_PICTURE_HERE', 0));
    
  2. Fügen Sie als Nächstes mit dem Befehl select in der Kartentabelle folgenden Code zur neuen Zeile in der Datenbank hinzu.

    select * from dbo.cards;
    
  3. In der vorherigen Übung haben Sie festgelegt, dass keine der Spalten NULL-Werte akzeptiert, mit Ausnahme der Spalte card_text. Testen Sie die Regel hier, indem Sie die Spalte card_art weglassen. Führen Sie die folgende Anweisung in der Abfragetabelle aus:

    insert into dbo.cards (card_name, card_type, card_color, card_power, card_text, card_status)
    values(N'Sword', N'weapon',N'black',10,N'S Words', 1);
    

    In der Datenbank wird der Einfügevorgang nicht zugelassen, und Sie werden daran erinnert, welche Regel verletzt wird (Null-Werte in der Spalte card_art).

    Screenshot showing how NULL values in the card_art column are not allowed.

  4. Die folgende SQL-Einfügung verstößt gegen eine andere Regel, die Sie für die Tabelle festgelegt haben. Übergeben Sie hier die Farbe „Braun“, von der Sie wissen, dass es sich um einen nicht akzeptierten Wert handelt. Sie haben die Regel erstellt, dass nur die Farben Orange, Schwarz, Grün, Blau, Weiß und Rot in der Spalte akzeptiert werden.

    insert into dbo.cards (card_name, card_type, card_color, card_power, card_text, card_status, card_art)
    values(N'Sword', N'weapon',N'brown',10,N'S Words', 1, CONVERT(varbinary(max), 'SWORD_PICTURE_HERE', 0));
    

    Wie Sie sehen können, wird diese Einfügung nicht in die Datenbank committet, da sie gegen die Regel für card_color verstoßen hat.

    Screenshot showing how the query violated the rule for card_color by passing in brown.

  5. Wenn Sie zur Tabelle card_translations wechseln, können Sie sehen, wie ein Fremdschlüssel Einfügungen verhindert, die keine entsprechenden Zeilen in der übergeordneten Tabelle enthalten. Mit der folgenden SQL-Anweisung wird versucht, eine Zeile in die Tabelle card_translations einzufügen, jedoch mit einer card_id von 2. Es gibt nur eine Zeile in der Kartentabelle, und die weist die card_id 1 auf. Kopieren Sie die folgende SQL-Anweisung, fügen Sie sie ein, und führen Sie sie in der Abfragetabelle aus:

    Insert into dbo.card_translations(card_id, translation_card_language, translation_card_name, translation_card_text)
    values(2,N'Spanish',N'Pato',N'Ataque de graznar')
    

    Der Fremdschlüssel verhindert das Einfügen wie erwartet:

    Screenshot showing how a foreign key prevents the insert with a card_id not in the cards table.

  6. Mit einer korrekten card_id können Sie eine Zeile in der Übersetzungstabelle erstellen, indem Sie den folgenden SQL-Code in der Abfragetabelle ausführen:

    insert into dbo.card_translations(card_id, translation_card_language, translation_card_name, translation_card_text)
    values(1,N'Spanish',N'Pato',N'Ataque de graznar')
    
  7. Verknüpfen Sie mit einer Zeile in der Kartentabelle und der Tabelle card_translations die beiden Tabellen in einer Abfrage, und rufen Sie alle Zeilen ab, die eine gemeinsame card_id aufweisen:

    select c.card_id 'card_id from cards table', 
           t.card_id 'card_id from card_translation table',
           c.card_name, t.translation_card_name
    from dbo.cards c,
            dbo.card_translations t
    where c.card_id = t.card_id;
    

    Screenshot showing query results from the joined cards and card_translations tables.

  8. Mit der folgenden SQL-Anweisung wird eine Zeile in die Tabelle sets eingefügt. Sie verwenden die integrierte Funktion GETDATE(), um die Daten des heutigen Tages im Format JJJJ-MM-TT einzufügen. Während die GETDATE-Funktion auch Stunden, Minuten und Sekunden zurückgibt, ist der Datentyp date, sodass diese zusätzlichen Zeitdaten abgeschnitten werden.

    insert into dbo.sets (set_name, set_date)
    values(N'First Set', GETDATE());
    

    Führen Sie nun den folgenden SQL-Code aus, um die Zeile in der Tabelle „sets“ anzuzeigen:

    select * from dbo.sets;
    
  9. Eine Karte befindet sich in der Tabelle cards, und ein Satz befindet sich in der Tabelle sets. Mit diesen beiden Zeilen können Sie eine Karte und einen Satz sowohl mit card_id als auch mit set_id in die Tabelle set_lists eingeben. Es gibt zwei Fremdschlüssel in dieser Tabelle. Funktioniert der folgende SQL-Code, wenn Sie versuchen, eine richtige card_id, aber eine falsche set_id in die Tabelle set_lists einzufügen? Führen Sie den folgenden SQL-Code in der Abfragetabelle aus:

    insert into dbo.set_lists (card_id, set_id)
    values(1,23);
    

    Wie erwartet wurde die Einfügung durch einen Fremdschlüsselverstoß blockiert.

    Screenshot showing how an insert into set_lists table was blocked by foreign key violations.

    Das Ausführen der Abfrage mit den richtigen IDs führt zu einer erfolgreichen Einfügung in die Tabelle set_lists. Führen Sie den folgenden SQL-Code in der Abfragetabelle aus:

    insert into dbo.set_lists (card_id, set_id)
    values(1,1);
    
  10. Verwenden Sie mit den Daten in allen vier Tabellen die folgende SQL-Abfrage, um eine Ansicht der in die Datenbank eingegebenen Karten, ihrer Übersetzungen und der Sätze anzuzeigen, zu denen sie gehören. Führen Sie den folgenden SQL-Code in der Abfragetabelle aus:

    select c.card_id, c.card_name, 
            t.translation_card_name, 
            s.set_name, s.set_date
    from dbo.cards c,
            dbo.card_translations t,
            dbo.sets s,
            dbo.set_lists l
    where c.card_id = t.card_id
        and c.card_id = l.card_id
        and s.set_id = l.set_id;
    

    A screenshot showing a SQL query joining all 4 tables.

  11. Wenn Sie sich noch einmal an das Kapitel über Tabelleneinschränkungen erinnern, gab es dort einen Abschnitt zum Thema Unique-Einschränkungen. Mit diesen Einschränkungen können Sie eine Regel auf mindestens eine Spalte anwenden, um sicherzustellen, dass die Tabelle keine doppelten Werte aufweist. Dies ähnelt der Primärschlüsselspalte. Wenn Sie sich die Tabelle set_lists ansehen, haben Sie möglicherweise festgestellt, dass Sie eine card_id und eine set_id mehrmals in diese Tabelle einfügen könnten, um doppelte Daten zu erstellen. Wenn Sie eine Unique-Einschränkung anwenden, können Sie dieses Verhalten verhindern.

    Sie können eine Unique-Einschränkung für die Spalten card_id und set_id erstellen. Diese Unique-Einschränkung legt für die Datenbank Folgendes fest: „Niemand darf eine Zeile mit einer Kombination von card_id und set_id einfügen, die bereits in der Tabelle vorhanden ist.“ Führen Sie den folgenden SQL-Code in der Abfragetabelle aus, um diese Unique-Einschränkung zu erstellen:

    ALTER TABLE dbo.set_lists   
    ADD CONSTRAINT one_card_in_set UNIQUE (card_id, set_id);   
    GO
    

    Versuchen Sie es nun erneut mit dem folgenden SQL-Code:

    insert into dbo.set_lists (card_id, set_id)
    values(1,1);
    

    Es wird ein Fehler angezeigt, der diese Einfügung beendet und doppelte Daten in der Tabelle verhindert.

    Screenshot showing an error stopping duplicate data being inserted using the unique constraint.

    Können Sie sich andere Situationen vorstellen, in denen eine Unique-Einschränkung nützlich sein könnte, um doppelte Daten in der Kartenverweisanwendung zu verhindern?

  12. Damit Sie ein besseres Bild davon erhalten, wie das Datenmodell für die Kartenverweisanwendung aufgebaut ist, können Sie den Tabellen weitere Daten hinzufügen. Führen Sie die folgende SQL-Anweisung in der Abfragetabelle aus:

    declare @cardTable2 table (card_id int);
    declare @cardTable3 table (card_id int);
    declare @cardTable4 table (card_id int);
    declare @cardTable5 table (card_id int);
    insert into dbo.cards (card_name, card_type, card_color, card_power, card_text, card_status, card_art)
    OUTPUT Inserted.[card_id] into @cardTable2
    values(N'Sword', N'weapon',N'white',10,N'+2 Power', 1, CONVERT(varbinary(max), 'SWORD_PICTURE_HERE', 0));
    insert into dbo.cards (card_name, card_type, card_color, card_power, card_text, card_status, card_art)
    OUTPUT Inserted.[card_id] into @cardTable3
    values(N'Caterpillar', N'monster',N'green',10,NULL, 1, CONVERT(varbinary(max), 'CRAWLY_PICTURE_HERE', 0));
    insert into dbo.cards (card_name, card_type, card_color, card_power, card_text, card_status, card_art)
    OUTPUT Inserted.[card_id] into @cardTable4
    values(N'Goblin', N'monster',N'red',10,N'Can set fires', 1, CONVERT(varbinary(max), 'GOBLIN_PICTURE_HERE', 0));
    insert into dbo.cards (card_name, card_type, card_color, card_power, card_text, card_status, card_art)
    OUTPUT Inserted.[card_id] into @cardTable5
    values(N'Full Plate Armor', N'armor',N'black',10,N'+4 Protection', 1, CONVERT(varbinary(max), 'PLATE_ARMOR_PICTURE_HERE', 0));
    declare @card2i int = (select card_id from @cardTable2);
    declare @card3i int = (select card_id from @cardTable3);
    declare @card4i int = (select card_id from @cardTable4);
    declare @card5i int = (select card_id from @cardTable5);
    insert into dbo.card_translations(card_id, translation_card_language, translation_card_name, translation_card_text)
    values(@card2i,N'Spanish',N'Espada',N'+2 Poder')
    insert into dbo.card_translations(card_id, translation_card_language, translation_card_name, translation_card_text)
    values(@card3i,N'Japanese',N'毛虫',NULL)
    insert into dbo.card_translations(card_id, translation_card_language, translation_card_name, translation_card_text)
    values(@card4i,N'French',N'Lutin',N'Puede provocar incendios')
    insert into dbo.card_translations(card_id, translation_card_language, translation_card_name, translation_card_text)
    values(@card5i,N'German',N'Vollständige Plattenpanzerung',N'+4 Schutz')
    insert into dbo.sets (set_name, set_date)
    values(N'Second Set', GETDATE());
    insert into dbo.set_lists (card_id, set_id)
    values(@card2i,1);
    insert into dbo.set_lists (card_id, set_id)
    values(@card3i,1);
    insert into dbo.set_lists (card_id, set_id)
    values(@card4i,1);
    insert into dbo.set_lists (card_id, set_id)
    values(@card3i,2);
    insert into dbo.set_lists (card_id, set_id)
    values(@card4i,2);
    insert into dbo.set_lists (card_id, set_id)
    values(@card5i,2);
    
  13. Wenn Sie diese SQL-Abfrage für den Join mit vier Tabellen erneut ausführen, werden alle Karten, ihre Übersetzungen und die Sätze angezeigt, zu denen sie gehören. Führen Sie die folgende SQL-Anweisung in der Abfragetabelle aus:

    select c.card_id, c.card_name, 
            t.translation_card_language,
            t.translation_card_name, 
            s.set_name, s.set_date
    from dbo.cards c,
            dbo.card_translations t,
            dbo.sets s,
            dbo.set_lists l
    where c.card_id = t.card_id
        and c.card_id = l.card_id
        and s.set_id = l.set_id
    order by s.set_id, c.card_id;
    

    Screenshot showing a SQL query joining all four tables with much more data after the additional data was inserted into the tables.