Microsoft SQL Server DatabaseManagement Relationale DBMS Michael Grube (MCSA und MCT) MG SOFTWARE ENTWICKLUNG 1 Inhaltsverzeichnis Vorwort ................................................................................................................................................... 3 Der Datenbankentwurf und Lebenszyklus .............................................................................................. 4 Die Unterteilung beginnt mit .......................................................................................................... 4 Das Datenbankmodell ............................................................................................................................. 5 Beispiel für ein Relationales Datenbankmodell .............................................................................. 6 ER-Modell ................................................................................................................................................ 7 Attribute in einer Entität ......................................................................................................................... 8 Primärschlüssel (Primary Key) ................................................................................................................. 8 Eindeutiger Primärschlüssel ............................................................................................................ 9 Zusammengesetzter Primärschlüssel .............................................................................................. 9 Künstlicher Primärschlüssel............................................................................................................. 9 Fremdschlüssel (Foreign Key) .......................................................................................................... 9 1:1 Beziehung in relationalen Datenbanken ................................................................................. 10 1:n Beziehung in relationalen Datenbanken ................................................................................. 10 m:n Beziehung in relationalen Datenbanken ................................................................................ 10 Normalisierung ...................................................................................................................................... 11 Erste Normalform (1NF) ................................................................................................................ 12 Zweite Normalform (2NF) ............................................................................................................. 12 Dritte Normalform (3NF) ............................................................................................................... 13 Referentielle Datenintegrität ................................................................................................................ 16 Einfüge-Anomalie .......................................................................................................................... 16 Änderungs-Anomalie ..................................................................................................................... 16 Lösch-Anomalie ............................................................................................................................. 16 Datenbank Index ................................................................................................................................... 17 Welche Arten von Datenbank-Indizes existieren? ........................................................................ 17 SQL (Structed Query Language) ............................................................................................................ 19 SQL – eine Datenbanksprache ....................................................................................................... 19 SQL SELECT Befehl ......................................................................................................................... 19 SQL DISTINCT Befehl ...................................................................................................................... 20 SQL AND & OR Operatoren ........................................................................................................... 22 SQL IN Operator............................................................................................................................. 24 SQL BETWEEN Befehl .................................................................................................................... 25 SQL LIKE Befehl .............................................................................................................................. 25 SQL ORDER BY ............................................................................................................................... 27 SQL GROUP BY Befehl.................................................................................................................... 28 MGS (2016) for DBMS-Systems 2 SQL Abarbeitungsreihenfolge........................................................................................................ 29 Aggregieren ........................................................................................................................................... 29 SQL SUM() Funktion ...................................................................................................................... 29 SQL Min() Funktion ........................................................................................................................ 30 SQL Max() Frunktion ...................................................................................................................... 30 SQL Count() Frunktion ................................................................................................................... 31 Mengenoperationen und Unterabfragen.............................................................................................. 32 Union ............................................................................................................................................. 32 Union all......................................................................................................................................... 32 Intersect......................................................................................................................................... 32 Except ............................................................................................................................................ 33 ALL und ANY Operanten ................................................................................................................ 33 IN Operant / Unterabfragen .......................................................................................................... 34 Verknüpfen von Objekten (JOINS)......................................................................................................... 35 Wie funktioniert ein SQL Join? ...................................................................................................... 36 Datenmanipulation (Insert, Update, Delete) ........................................................................................ 37 INSERT ........................................................................................................................................... 37 UPDATE.......................................................................................................................................... 38 DELETE ........................................................................................................................................... 39 OUTPUT-Klausel............................................................................................................................. 40 MERGE-Klausel .............................................................................................................................. 42 MGS (2016) for DBMS-Systems 3 Vorwort Bevor die Daten fließen … Um relationale Datenbanken entwickeln zu können, sollte man zuvor die Überlegung anstreben, was genau und in welcher Form gespeichert werden soll und wie Sicher muss das sein. Die Entwicklung und die Verwaltung sind zwei verschiedene Dinge, die nur erschwert kombinierbar sind. Grundsätzlich ist der erste Entwurf einer Datenbank eine „Vorab“-Geschichte. Die Datenbank weißt bestimmte Eigenschaften und Attribute auf, die wie schon erwähnt, zuvor festgelegt werden. Im Nachhinein die Struktur zu ändern, kann unter Umständen zu Problemen führen. Aus diesem Grund werden die Datenbanken „fast“ immer auf die klassische Methode entworfen. Früher nannte man das noch Reißbrett. Da im Bereich der IT heutzutage alles am PC entworfen wird, was natürlich auch schneller geht, schleichen sich unter Umständen kleine Fehler mit ein, die auf die klassische Art wahrscheinlich sofort aufgefallen wären. Fehler die während der Entwicklung auffallen, sind zunächst nicht weiter tragisch und können korrigiert werden. Sind aber erst einmal Daten gespeichert, ist eine nachträgliche Änderung nur schwer Umsetzbar, da die vorhandenen Daten das Ändern unter Umständen nicht unterstützen. Aber nicht nur die Fehler, sondern auch Änderungen der physischen Datenstruktur führt zu Problemen. Moderne Systeme, wie den Microsoft SQL Server® oder vergleichbare DBMS-Systeme können Fehler erkennen, bevor sie entstehen. Aber auch hier gilt, dass System ist immer nur so Schlau wie die Person, die das Ganze bedient. ☺ Als Liebhaber von Datenbanken bin ich im Namen Microsoft und deren Produkte deutschlandweit Unterwegs und gebe Referate und Trainings in allen Schichten der Industrie und Seminarhäuser greifen auf meine Erfahrung als Trainer zurück, welches ich sehr gerne in Anspruch nehme. Mir macht es immer wieder Freude zu sehen, wie die Teilnehmer mehr und mehr Verständnis über diese Speicherform, von Informationen, kennen lernen und dass auch in der Praxis richtig umsetzen. In diesem Handout sind Beispiele, Grafiken und Texte erwähnt, die ich in diesem Zusammenhang selbst recherchiert habe. Sollten Sie Texte und Grafiken erkennen, wundern Sie sich nicht. Ich habe Namenhafte Seiten besucht, um Ihnen einen Überblick außerhalb fachlicher Literatur geben zu können. MGS (2016) for DBMS-Systems 4 Der Datenbankentwurf und Lebenszyklus Die Entwicklung einer Datenbank wird in unterschiedlichen Phasen unterteilt und ist je nach Software-Anforderung in Projektteilschritte unterteilt. Zunächst findet jedoch die Analyse statt. Darin wird der Umfang der Software bestimmt und der daraus resultierenden Datenbank. Die Datenbank an sich ein Lebenszyklus gemeinsam mit der Software, die je nach Anforderungen ergänzt werden kann. Sind jedoch bestimmte Workflows notwendig, ist ein Rückplanung (entfernen von Funktionen / Tabellen) nur noch bedingt möglich. Daher bestimmt die genaue Analyse, die Meilensteine der Projektphasen, die maximalen Kosten, die Datenbankstruktur und das Funktionen. Die Unterteilung beginnt mit a. b. c. d. e. f. Anforderungen Konzeptioneller Entwurf Logischer Entwurf Physischer Entwurf Test Implementierung der Anwendung Die Datenbank wird unter den folgenden Schemas konzipiert. Sie muss Vollständigkeit und Korrektheit aufweisen, Minimalität und Modifizierbarkeit muss gegeben sein. Die Datenbank kann in unterschiedlichsten Projektmodellen geplant werden. Meistens wird das klassische „Wasserfallmodell“ eingesetzt. Sollte die Zeit das zulassen, werden wir ein solches Beispiel erarbeiten. Die Datenbank besteht aus Tabellen, Sichten (Abfragen), Funktionen und Prozeduren. Diese Auflistung nennt man auch Objekte. Tabellen dienen dazu, alle der Struktur entsprechenden Daten zu verwalten. Unabhängig davon, wie Komplex und welche Datenmenge dahintersteckt. Zu den wichtigsten Bestandteilen der Tabelle dienen die Datentypen und Integrität. Daher ist die Normalisierung der Daten sehr wichtig. Sie dient dazu, die Integrität der Daten aufrecht zu halten, sowie Redundanzen zu vermeiden. Dazu aber später mehr… Sehen Sie sich das nachfolgende Kapitel über das Datenbankmodell an. MGS (2016) for DBMS-Systems 5 Das Datenbankmodell Ein Datenbankmodell ist die theoretische Grundlage für eine Datenbank und legt fest, auf welche Art und Weise die Daten in dem Datenbanksystem gespeichert und bearbeitet werden können. Ein Datenbankmodell von heute kann sehr komplex werden, da immer mehr Informationen in einem Datenbankmodell abgebildet und modelliert werden müssen. Die Wahl des richtigen Datenbankmodells ist heute wichtiger denn je, da die Datenmengen in einem enormen Tempo anwachsen und die Anforderungen sich ständig ändern. Aufbau eines Datenbankmodells Das Datenbankmodell bildet das Fundament und besteht aus 3 wichtigen Faktoren: Generische Datenstruktur Generische Operatoren Integritätsbedingungen Das weitverbreitetste Datenbankmodell ist das relationale Datenbankmodell. Der Vollständigkeit werden aber auch die anderen Datenbankmodelle erwähnt. Hierarchisches Datenbankmodell Netzwerkdatenbankmodell Objektorientiertes Datenbankmodell Das Relationale Datenbankmodell ist das am weitverbreitetste Modell, das in der Datenbankentwicklung als Standard genutzt wird. Die Grundlage dieses Datenbankmodells ist die Relation. Sie stellt eine mathematische Beschreibung einer Tabelle und ihre Beziehung zu anderen möglichen Tabellen dar. Die Operationen auf diese Relationen werden durch die relationale Algebra bestimmt. Des Weiteren ist die relationale Algebra auch die Grundlage für die Datenbanksprache SQL. Auch wenn die mathematische Gewichtung und die Abstraktion der Daten in diesem Modell sehr stark ist, sind relationale Datenbankmodelle vergleichsweise sehr einfach und flexibel zu erstellen und zu steuern. MGS (2016) for DBMS-Systems 6 Eigenschaften vom Relationalen Datenbankmodell Das relationale Datenbankmodell besteht aus drei wichtigen Faktoren: Eine Datenbank kann man sich unter einer Ansammlung von Tabellen und Beziehungen vorstellen, die miteinander verknüpft sind. Jede Zeile (auch Tupel genannt) in einer Tabelle ist ein Datensatz (Record). Jedes Tupel besteht aus einer großen Reihe von Attributen (Eigenschaften), den Spalten der Tabelle. Ein Relationsschema legt dabei die Anzahl und den Typ der Attribute für eine Tabelle fest. Des Weiteren können Verknüpfungen (Beziehungen) über sogenannte Primärschlüssel hergestellt werden, um bestimme Attribute, die den gleichen Primärschlüssel oder in einer Detailtabelle als Fremdschlüssel besitzen, abzufragen. Beispiel für ein Relationales Datenbankmodell Ein gutes Beispiel für ein Relationales Datenbankmodell ist ein Modell, das eine Beziehung zwischen einem Kunden, seiner Rechnung, den Rechnungspositionen und den darin enthaltenen Artikeln widerspiegelt: Dieses Beispiel für ein Relationales Datenbankmodell kann nur durch eine korrekte Normalisierung und deren Normalformen erstellt werden. Um dieses Beispiel genauer zu verstehen, sehen Sie weiter unten das Thema „Normalisierung“ genauer an. Weiterhin muss man sich mit den Datentypen und die Primär,- und Fremdschlüssel beschäftigen. Zunächst aber schauen wir auf das ER-Modell. MGS (2016) for DBMS-Systems 7 ER-Modell Das Entity-Relationship Modell – abgekürzt mit ER-Modell oder ERM – dient als Grundlage für einen Datenbankentwurf. Bevor mittels SQL angefangen wird, Tabellen und Beziehungen anzulegen, wird erst mal mittels ER-Modell geplant, wie die Datenbankstruktur aufgebaut und funktionieren soll. Entity Relationship Modell erstellen – Aber warum? Der Einsatz von ER-Modellen ist in der Praxis ein gängiger Standard für die Datenmodellierung, auch wenn es unterschiedliche grafische Darstellungsformen von Datenbankmodellen gibt. Mithilfe des Entity Relationship Modells soll eine Typisierung von Objekten, ihrer relationalen Beziehungen untereinander und der über sie zu führenden Attribute, stattfinden. Guten Datenbankentwickler können in kurzer Zeit sehr komplexe Entity Relationship Modelle verstehen und umsetzen. Entitäten, Attribute, Beziehungen – Entity-Relationship-Modell Die Grundelemente eines jeden Entity-Relationship-Modells bilden: Entitäten, Beziehungen und Attribute. Diese werden grafisch wie folgt dargestellt: Um was genau es sich bei diesen Elementen handelt, klären die folgenden Punkte: Eine Entität ist ein individuell identifizierbares Objekt der Wirklichkeit. Eine Beziehung ist eine Verknüpfung / Zusammenhang zwischen zwei oder mehreren Entitäten. Ein Attribut ist eine Eigenschaft, die im Kontext zu einer Entität steht. MGS (2016) for DBMS-Systems 8 Erklärung zum ER-Modell: Ein Mitarbeiter hat einen Namen. Ein Projekt hat einen Namen, ein Datum und ein Budget. Ein Mitarbeiter kann mehrere Projekte leiten, aber nur ein Projekt kann von genau einem Mitarbeiter geleitet werden. Diese Notation nennt man Chen-Notation und ist ein gängiger Standard in der Praxis der Datenmodellierung. Diese Notation beinhaltet die Kardinalität, die näher im Kapitel Beziehung in Datenbanken behandelt wird. Entitäten in einer Datenbank In einer Datenbank ist eine Entität ein konkretes Objekt bzw. ein konkreter Sachverhalt der sich eindeutig von anderen Entitäten des gleichen Entitätstyps unterscheidet. Ein Entität-Typ beschreibt die Ausprägungen eines Objektes oder Sachverhaltes durch die Angabe von Attributen. Er gibt demnach an, welche Eigenschaften eine konkrete Entität aufweist. Übertragen auf eine Datenbank, ist eine Entität ein Tupel (Datensatz) einer Relation (Tabelle). Die Relation stellt den Entität-Typ dar und deren Spalten die Attribute. Eine Eigenschaft entspricht dem konkreten Attributwert. Die einzelnen Entitäten werden in den unterschiedlichen Tabellen erfasst, sodass diese einen für den Anwender definierten Ausschnitt aus der realen Welt darstellen. Die Tabelle „Kunde“ enthält demnach Entitäten (= Tupel bzw. Datensätze) mit den Attributen Name und weiteren persönlichen Angaben, die wiederum unterschiedliche Attributwerte annehmen. Attribute in einer Entität Jede Entität besitzt eine bestimmbare Anzahl an Attributen (Ausprägungen bzw. Eigenschaften), die sich eindeutig von anderen Entitäten des gleichen Entitätstyps abgrenzen. Eine Eigenschaft ist ein konkreter Attributwert, den ein zuvor definiertes Attribut annehmen kann. Die Attribute stellen einen „Bauplan“ dar, der eine abstrakte Abbildung der Wirklichkeit ist. Welche Arten von Attributen gibt es? Die Attribute in einer Entität können unterschiedlich aufgebaut sein. Man unterscheidet zwischen zusammengesetzte, mehrwertige und abgeleitete Attribute. Wichtig ist, wenn man eine Entität modelliert, dass schon immer vorab die erste Normalform der Normalisierung befolgt wird. So umgeht man spätere Modellierungsprobleme, wenn die zweite und dritte Normalform anstehen. Schauen wir uns die Attribute und die Keys entsprechend an. Einzelne oder zusammengesetzte Keys bilden die Eindeutigkeit der Datensätze. Primärschlüssel (Primary Key) Der Primärschlüssel kommt in relationalen Datenbanken zum Einsatz und wird zur eindeutigen Identifizierung eines Datensatzes verwendet. In einer normalisierten Datenbank besitzen alle Tabellen einen Primärschlüssel. Der Wert eines Primärschlüssels muss in einer Tabelle einmalig sein, da er jeden Datensatz eindeutig kennzeichnet. Des Weiteren wird er häufig als Datenbank-Index verwendet, um die Daten auf der Festplatte abzulegen. MGS (2016) for DBMS-Systems 9 Welche Arten von Primärschlüssel gibt es? Der Primärschlüssel einer Relation kann unterschiedlich aufgebaut sein. Man unterscheidet zwischen eindeutige, zusammengesetzte und künstliche Primärschlüssel. Eindeutiger Primärschlüssel Hierbei handelt es sich um einen eindeutigen Schlüssel der in einer Spalte der Tabelle gespeichert wird. Als Spalte kann ein Attribut des Datensatzes verwendet werden, das für jeden Eintrag in der Tabelle einen einmaligen Wert annimmt. Als eindeutiges Primärschlüsselattribut könnte beispielsweise die Sozialversicherungsnummer in einer Mitarbeitertabelle verwendet werden. Zusammengesetzter Primärschlüssel Ist ein Datensatz anhand eines Attributes nicht eindeutig identifizierbar, so kann der Primärschlüssel auch aus einer Kombination mehrerer Attribute bestehen. Dabei muss sichergestellt werden, dass jede dieser Kombinationen nur einmalig auftritt. Ein zusammengesetzter Primärschlüssel kann z.B. der Vor- und Nachname, sowie das Geburtsdatum sein. Künstlicher Primärschlüssel Gibt es in einer Tabelle keine eindeutigen Spalten bzw. Kombinationen aus Spalten, so kann auch auf einen künstlichen Schlüssel zurückgegriffen werden. Dieser ist auch als Surrogate Key bekannt und wird als zusätzliche Spalte in einer Tabelle eingefügt. In der Praxis wird häufig eine fortlaufende Ganzzahlenfolge verwendet, um einen Datensatz eindeutig identifizieren zu können. Fremdschlüssel (Foreign Key) Der Fremdschlüssel kann Bestandteil einer Tabelle in einer relationalen Datenbank sein. Dabei handelt es sich um eine Schlüsselspalte, die auf einen Primärschlüssel einer anderen oder aber derselben Tabelle verweist. Welche Fremdschlüsselarten gibt es? Es kann sich dabei um einen einfachen oder zusammengesetzten Schlüssel handeln. Das hängt davon ab, wie der Primärschlüssel der referenzierten Tabelle aufgebaut ist. Aufgrund der referentiellen Integrität, kann der Fremdschlüssel nur Werte annehmen die in der Referenztabelle vorhanden sind. Zudem kann eine beliebige Anzahl von Datensätzen den gleichen Fremdschlüsselwert aufweisen. Beispiel für den Einsatz eines Fremdschlüssels In einer normalisierten Tabelle die Kontakte verwaltet, kann beispielsweise zu einer Person ein Unternehmen referenziert werden. In der Tabelle „Ansprechpartner“ wird „Susi Meier“ und ihre Telefonnummer angelegt. Ihr Unternehmen wird aus der Tabelle „Unternehmen“ referenziert, das wäre dann beispielsweise die „ABC GmbH“. Über die Referenz können bei einer Abfrage die Anschrift und andere Fakten zum Unternehmen aus der Tabelle „Unternehmen“ abgerufen werden. Beziehungen in Datenbanken Zwischen Relationen (Tabellen/Entitäten) können Beziehungen in einer Datenbank bestehen. Angenommen man hat eine Relation „Mütter“ und eine Relation „Kinder“ – denkbar wären nun vier Möglichkeiten von Assoziationen / Beziehungen zwischen den Tabellen. MGS (2016) for DBMS-Systems 10 Beziehungen zwischen Tabellen erstellen – So geht’s In einem Datenbankmodell können folgende Beziehungen auftreten: Jede Mutter hat exakt ein Kind. Jede Mutter hat ein oder kein Kind. Jede Mutter hat mindestens ein Kind. Jede Mutter hat eine beliebige Anzahl von Kindern (Mehr als 1, dann spricht man von Geschwistern) Kardinalität von Beziehungen in relationalen Datenbanken Die Kardinalität von Beziehungen definiert wie viele Entitäten eines Entitätstyps mit genau einer Entität des anderen am Beziehungstyp beteiligten Entitätstyps (und umgekehrt) in Relation(Beziehung) stehen können oder müssen. Die Kardinalität von Beziehungen ist in relationalen Datenbanken in folgenden Formen vorhanden: 1:1 Beziehung, 1:n Beziehung und m:n Beziehung. 1:1 Beziehung in relationalen Datenbanken In einer „eins zu eins“-Beziehung in relationalen Datenbanken ist jeder Datensatz in Tabelle A genau einem Datensatz in Tabelle B zugeordnet und umgekehrt. Diese Art von Beziehung sollte in der Modellierung vermieden werden, weil die meisten Informationen, die auf diese Weise in Beziehung stehen, sich in einer Tabelle befinden können. Eine 1:1-Beziehung verwendet man nur, um eine Tabelle aufgrund ihrer Komplexität zu teilen oder um einen Teil der Tabelle aus Gründen der Zugriffsrechte zu isolieren. 1:n Beziehung in relationalen Datenbanken Eine „eins zu viele“-Beziehung relationalen Datenbanken ist der häufigste Beziehungstyp. In einer 1:n-Beziehung können einem Datensatz in Tabelle A mehrere passende Datensätze in Tabelle B zugeordnet sein, aber einem Datensatz in Tabelle B ist nie mehr als ein Datensatz in Tabelle A zugeordnet. m:n Beziehung in relationalen Datenbanken Bei „viele zu viele“-Beziehung in relationalen Datenbanken können jedem Datensatz in Tabelle A mehrere passende Datensätze in Tabelle B zugeordnet sein und umgekehrt. Diese Beziehungen können nur über eine dritte Tabelle, eine Verbindungstabelle C, realisiert werden. Die Verbindungstabelle C enthält in der Regel nur die Fremdschlüssel der beiden anderen Tabellen (A/B). Der Primärschlüssel der Verbindungstabelle wird aus diesen beiden Fremdschlüsseln gebildet. Daraus folgt, dass eine m:n Beziehung in Wirklichkeit zwei 1:n Beziehungen sind. MGS (2016) for DBMS-Systems 11 Normalisierung Unter Normalisierung eines relationalen Datenbankmodells versteht man die Aufteilung von Attributen in mehrere Relationen (Tabellen) mithilfe der Normalisierungsregeln und deren Normalformen, sodass eine Form entsteht, die keine vermeidbaren Redundanzen mehr enthält. Warum wird eine Normalisierung durchgeführt? Ziel der Normalisierung ist eine redundanzfreie Datenspeicherung zu erstellen. Redundanzfrei bedeutet, dass Daten entfernt werden können, ohne dass es zu Informationsverlusten kommt. Weiterhin soll die Normalisierung Anomalien entfernen. Im Normalisierungsprozess gibt es fünf Normalformen, welche im Folgenden genauer erklärt werden. Ziele der Normalisierung Beseitigung von Redundanzen Vermeidung von Anomalien (funktionelle und transitive Abhängigkeiten) Erstellung eines klar strukturierten Datenbankmodells Hier möchte ich auf Redundanzen, sowie 1-3 Normalform eingehen. Redundanzen in Datenbanken Redundanzen in Datenbanken sind ein Zeichen für ein schlechtes Datenbankdesign. Redundanzen sind doppelte Informationen in einer Datenbank bzw. Datenbank-Tabelle. Man spricht von einer redundanzfreien Datenbank, wenn alle doppelte Informationen entfernt werden können, ohne das ein Informationsverlust stattfindet. Wie kann ich Redundanzen vermeiden? Redundanzen können mittels der Normalisierung entfernt werden. Die Normalisierung entfernt doppelte Informationen, ohne das ein Informationsverlust in anderen Relationen stattfindet. Wann lässt man Redundanzen zu? Ab und zu kann eine Redundanz aber auch wahre Wunder wirken, wenn es um die Performance in einer Datenbank geht. Besonders in anderen Fällen von relationalen Datenbanken wie im Data Warehouse oder im Business Intelligence-Bereich werden ganz bewusst Redundanzen eingebaut, um zeit- und performanceaufwändige SQL-Abfragen zu verbessern. In solchen Fällen spricht man von der „Kontrollierten Redundanz“, die Mithilfe der Denormalisierung von Datenbanken erreicht wird. MGS (2016) for DBMS-Systems 12 Erste Normalform (1NF) Die Erste Normalform (1NF) ist dann gegeben, wenn alle Informationen in einer Tabelle atomar vorliegen. Diesen Satz kann man in vielen Datenbank Büchern nachlesen, doch was bedeutet das wirklich? Es bedeutet, dass jede Information innerhalb einer Tabelle eine eigene Tabellenspalte bekommt und zusammenhängende Informationen, wie zum Beispiel die Postleitzahl (PLZ) und der Ort, nicht in einer Tabellenspalte vorliegen dürfen. Erste Normalform Definition Ein Relationstyp (Tabelle) befindet sich in der ersten Normalform (1NF), wenn die Wertebereiche der Attribute des Relationstypen atomar sind. Erste Normalform Beispiel Gegeben sei die folgende Rechnungstabelle: ReNr. 187 Datum 01.01.2016 Name Max Mustermann Straße Musterstr. 1 Ort 12345 Musterort Artikel Stift Anzahl 2 Preis 1,00 € Nach der Anwendung der Ersten Normalform (1NF) sieht das Ergebnis wie folgt aus: ReNr 187 Datum 01.01.2016 Name Mustermann Vorname Max Straße Musterstr. 1 PLZ 12345 Ort Musterort Artikel Stift Anzahl 2 Preis 1,00 € Die erste Normalform (1NF) ist dann erfüllt, wenn die Wertebereiche der Attribute des Relationstypen atomar sind. Zweite Normalform (2NF) Die zweite Normalform ist ein wichtiger Schritt zu einer voll normalisierten relationalen Datenbank. Sie prüft, ob eine vollständige funktionale oder nur eine funktionale Abhängigkeit von Werten zu einer bestimmten Teilmenge existiert. Die zweite Normalform wird meistens schon indirekt erreicht, wenn der Datenbankentwickler mit der Erstellung eines ER-Modells beschäftigt ist. Die logische Aufspaltung von komplexen Sachverhalten zwingt den Datenbankentwickler Geschäftsprozesse in Relationen abzubilden. Gute Datenbankentwickler brauchen für die Zweite Normalform kein Modell auf dem Papier, sondern können Geschäftsprozesse direkt mit dem Kunden besprechen und zeitnah in einer Datenbankapplikation implementieren. MGS (2016) for DBMS-Systems 13 Zweite Normalform Definition Ein Relationstyp (Tabelle) befindet sich genau dann in der zweiten Normalform (2NF), wenn er sich in der ersten Normalform (1NF) befindet und jedes Nichtschlüsselattribut von jedem Schlüsselkandidaten voll funktional abhängig ist. Zweite Normalform Beispiel Gegeben sei wieder folgende Rechnungstabelle: ReNr 187 Datum 01.01.2016 Name Muster Vorname Max Straße Musterstr. 1 PLZ 12345 Ort Musterort Artikel Stift Stk. 2 Preis 1,00 € Nach der Anwendung der Zweiten Normalform (2NF) sieht das Ergebnis wie folgt aus: Neue Tabelle: „Rechnung“ Nr 187 Datum 01.01.2016 KundenNr 007 Neue Tabelle: „Kunde“ KundeNr 007 Name Mustermann Vorname Max Straße Musterstr. 1 PLZ 12345 Ort Musterort Neue Tabelle: „Rechnungsposition“ RePosNr 1 ReNr 187 ArtNr 69 Anzahl 2 Neue Tabelle „Artikel“ ArtNr 69 Artikel Stift Preis 1,00 € Da ein Name (Nachname) nicht eindeutig ist, wird jedem Kunden eine Kundennummer (KundeNr) zugeordnet. Diese ist der Primärschlüssel der neuen Tabelle „Kunde“. Danach wird das gleiche mit den Artikeln durchgeführt. Des Weiteren wird eine Rechnungspositionstabelle eingebaut, da eine Rechnung von einem Kunden eine Vielzahl von Rechnungspositionen mit verschiedenen Artikeln beinhalten kann. Die Spalten, die von einem Schlüsselkandidaten nicht vollständig funktional abhängig sind, werden in einer Untertabelle ausgelagert. Der Teil des Schlüsselkandidaten, von dem eine ausgelagerten Spalte funktional abhängig ist, wird Primärschlüssel der neuen Tabelle. In der zweiten Normalform werden auch die ersten Beziehungen in Datenbanken festgelegt. Dritte Normalform (3NF) Die Dritte Normalform ist das Ziel einer erfolgreichen Normalisierung in einem relationalen Datenbankmodell. Sie verhindert einerseits Anomalien und Redundanzen in Datensätzen und andererseits bietet sie genügend Performance für SQL-Abfragen. MGS (2016) for DBMS-Systems 14 Die Dritte Normalform ist oft ausreichend, um die perfekte Balance aus Redundanz, Performance und Flexibilität für eine Datenbank zu gewährleisten. Sehr gute Datenbankentwickler können mit der Dritten Normalform die perfekte Balance in ihrem Datenmodell herstellen, um neue Probleme aus der realen Welt in ein relationales Datenbankmodell einzupflegen. Dritte Normalform Definition Ein Relationstyp befindet sich genau dann in der dritten Normalform (3NF), wenn er sich in der zweiten Normalform (2NF) befindet und kein Nichtschlüsselattribut transitiv von einem Kandidatenschlüssel abhängt. Dritte Normalform Beispiel Gegeben sei die folgende Kundentabelle: KundenNr 007 Name Mustermann Vorname Max Straße Musterstr. 1 PLZ 12345 Ort Musterort Nach der Anwendung der Dritten Normalform (3NF) sieht das Ergebnis wie folgt aus: Neue Tabelle: „Kunden“ KundenNr 007 Name Mustermann Vorname Max Straße Musterstr. 1 PLZ 12345 Neue Tabelle: „Postleitzahl“ PLZ 12345 Ort Musterort In der Tabelle „Kunden“ sind die Attribute „Vorname“, „Straße“ und „PLZ“ abhängig vom Attribut „Name“, nicht vom Primärschlüssel „KundenNr“. Außerdem ist „Ort“ abhängig von „PLZ“. Die transitiv abhängigen Spalten werden in eine weitere Untertabelle ausgelagert, da sie nicht direkt vom Schlüsselkandidaten abhängen, sondern nur indirekt. Normalisierung und Abhängigkeiten Die Normalisierung von Daten in einer Datenbank bringt funktionale Abhängigkeiten zwischen diesen Informationen mit sich. Jeder Relationstyp hat verschiedene Informationen in sich und besitzt damit auch unterschiedliche Ausprägungen von funktionalen Abhängigkeiten. Dabei wird zwischen der funktionalen, voll funktionalen und transitiven Abhängigkeit unterschieden. Im folgenden Artikel stellen wir euch die jeweiligen Abhängigkeitsformen und deren Ausprägung kurz vor. Funktionale Abhängigkeit Eine Funktionale Abhängigkeit zwischen Attribut Y und Attribut X liegt dann vor, wenn es zu jedem X genau ein Y gibt. MGS (2016) for DBMS-Systems 15 Voll funktionale Abhängigkeit Eine vollständig funktionale Abhängigkeit liegt dann vor, wenn dass Nicht-Schlüsselattribut nicht nur von einem Teil der Attribute eines zusammengesetzten Schlüsselkandidaten funktional abhängig ist, sondern von allen Teilen eines Relationstyps. Die vollständig funktionale Abhängigkeit wird mit der 2. Normalform (2NF) erreicht. Transitive Abhängigkeit Eine transitive Abhängigkeit liegt dann vor, wenn Y von X funktional abhängig und Z von Y, so ist Z von X funktional abhängig. Diese Abhängigkeit ist transitiv. Die transitive Abhängigkeit wird mit 3. Normalform (3NF) erreicht. MGS (2016) for DBMS-Systems 16 Referentielle Datenintegrität Im Bereich der relationalen Datenbanken wird die referentielle Integrität dazu verwendet die Konsistenz und die Integrität der Daten sicherzustellen. Dazu werden Regeln aufgestellt, wie und unter welchen Bedingungen ein Datensatz in die Datenbank eingetragen wird. Bei der referentiellen Integrität können Datensätze die einen Fremdschlüssel aufweisen nur dann gespeichert werden, wenn der Wert des Fremdschlüssels einmalig in der referenzierten Tabelle existiert. Im Falle, dass ein referenzierter Wert nicht vorhanden ist, kann der Datensatz nicht gespeichert werden. Warum wird die Referentielle Integrität benötigt? Eine Datenbank kann schnell in einen inkonsistenten Zustand geraten. Im ungünstigsten Fall liegt eine nicht-normalisierte Datenbank vor, die starke Redundanzen aufweist. Dabei können Anomalien im Datenbestand auftreten, die verschiedene Formen annehmen. Man spricht hier von Einfüge-, Lösch- und Änderungsanomalien. Tritt eine oder mehrerer dieser Anomalien auf, kann das zur Verfälschung oder Löschung von Informationen führen. Einfüge-Anomalie Eine Einfüge-Anomalie tritt auf, wenn ein Datensatz gespeichert werden soll und dieser keine oder kein eindeutigen Primärschlüsselwerte aufweist. Das Einfügen in eine Tabelle ist somit nicht möglich. Informationen können nicht gespeichert werden und gehen womöglich verloren. Das kann zum Beispiel der Fall sein, wenn für die Speicherung der Kundendaten zu Verifizierungszwecken die Personalausweisnummer als Primärschlüssel verwendet wird, diese aber leider vom Sachbearbeiter nicht erfasst werden konnte. Der Datensatz des Kunden kann nicht gespeichert werden. Änderungs-Anomalie Man spricht von einer Änderungs-Anomalie, wenn eine Entität redundant in einer oder sogar in mehreren Tabellen enthalten ist und bei einer Aktualisierung nicht alle berücksichtigt werden. Dadurch kommt es zur Inkonsistenz im Datenbestand. Es kann möglicherweise nicht mehr nachvollzogen werden welcher Wert der gültige Datensatz ist. Dieser Sachverhalt lässt sich gut an einer Auftragstabelle darstellen. Diese speichert neben der Auftragsnummer auch den Namen eines Kunden und dessen Bestellung. Ein Kunde kann mehrere Bestellungen aufgegeben haben, wobei jede Bestellung in einem Datensatz erfasst wird. Wird nun aufgrund eines Schreibfehlers nachträglich der Name des Kunden „Reiher“ in „Reier“ bei einem Datensatz geändert, führt dies zu einem inkonsistenten Datenbestand. Nach der Änderung liegen demnach Aufträge für scheinbar zwei verschiedene Kunden vor und zwar für einen Kunden „Reiher“ und einen Kunden „Reier“. Lösch-Anomalie Enthalten die Datensätze einer Tabelle mehrere unabhängige Informationen, so kann es leicht zu Lösch-Anomalien kommen. Da sich die Daten in einem nicht-normalisierten Zustand befinden, kann durch Löschen eines Datensatzes ein Informationsverlust entstehen. Die Ursache liegt darin, dass in einer Tabelle unterschiedliche Sachverhalte gespeichert werden. Am Beispiel einer nichtnormalisierten Mitarbeitertabelle soll dies kurz skizziert werden. In der Mitarbeitertabelle werden die Personalnummer, der Name und die Abteilung gespeichert. Der Mitarbeiter „Krause“, der als einziger in der Abteilung „Lager“ war, ist aus dem Unternehmen ausgetreten und wird daher aus der MGS (2016) for DBMS-Systems 17 Datenbank gelöscht. Da die Abteilung in der gleichen Tabelle gespeichert wird, verschwindet das „Lager“ aus der Datenbank, da „Herr Krause“ ja als einziger dieser Abteilung zugeordnet war. Datenbank-Anomalien auflösen Die beschriebenen Anomalien treten durch ein schlechtes Datenbank-Design auf. Daraus ergibt sich auch die redundante Datenhaltung. Um diese zu vermeiden, müssen die Tabellen einer Datenbank normalisiert werden. Die Normalisierung umfasst in der Praxis drei Stufen und sorgt für eine redundanzfreie und nach Entitätstyp getrennte Datenhaltung. Datenbank Index Der Datenbankindex ist eine Datenstruktur mit deren Hilfe die Abfrageoptimierung gesteigert werden kann. Mittels einer Indextabelle werden die Daten sortiert auf dem Datenträger abgelegt. Der Index selbst stellt einen Zeiger dar, der entweder auf einen weiteren Index oder auf einen Datensatz zeigt. Dadurch findet eine Trennung von Daten- und Index-Strukturen statt. Welche Arten von Datenbank-Indizes existieren? Bei Datenbanken unterscheidet man generell zwei Arten von Indizes. Zum einen gibt es gruppierte Indizes (Clustered Index). Zum anderen gibt es nicht-gruppierte Indizes (Nonclustered Index). Ohne Indizes auf einer Tabelle müsste die Datenbank die Informationen (Datensatz) sequentiell suchen, was selbst mit modernster Hardware und Software viel Zeit beanspruchen kann. Gruppierte Indizes (Clustered Index) Bei der Verwendung eines gruppierten Index werden die Datensätze entsprechend der Sortierreihenfolge ihres Index-Schlüssels gespeichert. Wird für eine Tabelle beispielsweise eine Primärschlüssel-Spalte „ID“ angelegt, so stellt diese den Index-Schlüssel dar. Pro Tabelle kann nur ein gruppierter Index erstellt werden. Dieser kann jedoch aus mehreren Spalten zusammengesetzt sein. Nicht-gruppierte Indizes (Nonclustered Index) Besitzt eine Tabelle einen gruppierten Index, so können weitere nicht-gruppierte Indizes angelegt werden. Dabei zeigen die Einträge des Index auf den Speicherbereich des gesamten Datensatzes. Die Verwendung eines nicht-gruppierten Index bietet sich an, wenn regelmäßig nach bestimmten Werten in einer Spalte gesucht wird z.B. dem Namen eines Kunden. Bei einer Abfrage wird nun zuerst nach dem Namen gesucht. Werden weitere Daten zum Kunden benötigt, so können diese über den gruppierten Index, der mit dem Namen abgelegt wurde, abgerufen werden. Bei einem nicht-gruppierten Index ist es nicht notwendig, dass dessen Werte eindeutig sein müssen. Zudem kann auch dieser aus mehreren Spalten zusammengesetzt sein. Darüber hinaus gibt es noch weitere sehr spezielle und zum Teil proprietäre Indizes, die in bestimmten Datenbanken verwendet werden. Beispielsweise der Bitmap-Index, der im Data Warehouse eingesetzt wird. Vorteile von Datenbank Indizes Der Einsatz von Indizes empfiehlt sich für Datenbanken die großen Datenmengen speichern und sehr häufig abgefragt werden. Hier kommt es darauf an welche Informationen dabei eine zentrale Rolle spielen. MGS (2016) for DBMS-Systems 18 Welcher Index bei einer Abfrage tatsächlich verwendet wird, entscheidet in letzter Instanz der Abfrageoptimierer der Datenbank. Dieser erstellt für eine Abfrage mehrere Ausführungspläne, um die Kosten für die Abfrage zu ermitteln. Wird diese nun ausgeführt, wählt er den kostengünstigsten Ausführungsplan. Dieser berücksichtigt nicht nur Indizes, sondern auch die Systemauslastung. Nachteile eines Datenbank Index Das Anlegen von Indexstrukturen führt zur Belegung von Plattenspeicher und kann bei einer großen Anzahl von Indizes einen nicht unerheblichen Speicherverbrauch verursachen. Ein weiterer Nachteil ist, dass der Einsatz von Indizes zu einem größeren Aufwand beim Schreiben von Datensätzen führt. Das Datenbankmanagementsystem muss in diesem Fall auch den Index berücksichtigen und diesen entsprechend laden. Hier gilt, je mehr Indizes eine Tabelle hat, desto größer ist der Performance-Verlust beim Speichern neuer Datensätze. Nachdem Sie nun eine Menge über die Datenbankstrukturen, Aufbau und Struktur der Tabellen gelesen haben, schauen wir uns nun an, wie Sie den Inhalt der Datenbank auslesen können, sofern Sie die Berechtigung dazu haben. Gerade der MS SQL Server liegt ein hohes Maß an Sicherheit zugrunde. MGS (2016) for DBMS-Systems 19 SQL (Structed Query Language) Die Abkürzung SQL steht für „Structured Query Language“ und ist eine Datenbanksprache zur Erstellung von Datenbankstrukturen in relationalen Datenbanken, sowie zum Bearbeiten und Abfragen die darauf basierenden Datenbestände. SQL – eine Datenbanksprache Die Datenbanksprache SQL basiert auf der relationalen Algebra, ihre Syntax ist recht einfach aufgebaut und semantisch an die englische Umgangssprache angelehnt. In der Bezeichnung SQL ist das englische Wort “query” (Abfrage) enthalten. Mit Abfragen werden Daten in der Datenbank abgerufen und dem Benutzer mittels einer Anwendersoftware bereitgestellt. SQL SELECT Befehl Der SQL SELECT Befehl ist der Grundstein für zahlreiche SQL-Abfragen, die auf eine Datenbank ausgeführt werden können. Mithilfe des SQL Select Befehls ist es möglich, Daten aus einer oder mehreren Tabellen über ein JOIN (Verbindung) abzufragen. Ein SQL Select Befehl sollte niemals mit einem Stern, also SELECT * FROM Tabelle ausgeführt werden, da dann alle Treffer der SQL SELECT Abfrage zurückgeliefert werden. Ein Datenbankentwickler sollte seine Suchmenge immer eingrenzen und evtl. mit der Funktion TOP, z.B. SELECT TOP 10 * FROM Tabelle1 eingrenzen. SQL SELECT Syntax Die SQL Syntax einer SELECT-Abfrage ist wie folgt aufgebaut: SELECT Spaltenname1, Spaltenname2, Spaltenname3 FROM Tabellenname Mithilfe des SELECT Befehls wird definiert, welche Spalten einer Tabelle nach der Ausführung der Abfrage dargestellt werden sollen. SQL SELECT Beispiel Gegeben sei folgende Tabelle namens „Mitarbeiter“: Nachname Müller Meier Schulze Niebaum Richter Vorname Daniel Dennis Holger Michael Julia Gehalt 2435 2090 3410 3675 1201 Abteilung Einkauf Vertrieb Produktmanagement Geschäftsführung Empfang Möchte man von dieser Tabelle nur den Nachnamen der Mitarbeiter sowie ihr Gehalt ausgeben, ist folgender SQL – Befehl einzugeben: SELECT Nachname, Gehalt FROM MITARBEITER MGS (2016) for DBMS-Systems 20 Das Ergebnis der SQL Select Abfrage würde wie folgt aussehen: Nachname Müller Meier Schulze Niebaum Richter Gehalt 2435 2090 3410 3675 1201 SQL DISTINCT Befehl Der SQL DISTINCT Befehl wird in einer SQL Select Abfrage direkt hinter dem Select platziert. Mithilfe des DISTINCT Befehls werden Redundanzen, die in einer Tabelle auftreten können, ausgeblendet und die Werte werden jeweils nur einmal angezeigt. Der Befehl Distinct kommt weniger in relationalen Datenbanken vor. Er wird häufiger in einem Data Warehouse und der Report-Erstellung genutzt, also dort wo durchaus Redundanzen auftreten können. SQL DISTINCT Syntax Die SQL Syntax einer Select-Distinct-Abfrage ist wie folgt aufgebaut: SELECT DISTINCT Spaltenname FROM Tabellenname Mithilfe des DISTINCT wird definiert, welche Spalte auf Redundanzen geprüft werden soll. SQL DISTINCT Beispiel Gegeben sei folgende Tabelle namens „PKW“: PKWNR 1 2 4 5 6 Modell Auto A Auto B Auto A Auto D Auto E Preis 65.000,00€ 72.000,00€ 80.000,00€ 80.000,00€ 78.000,00€ Anhand der Tabelle können wir erkennen, dass sie nicht redundanzfrei ist. Um nun alle PKW redundanzfrei anzuzeigen, wird der SQL Distinct Befehl wie folgt eingesetzt: MGS (2016) for DBMS-Systems 21 SELECT DISTINCT Modell FROM PKW Das Ergebnis würde wie folgt aussehen: Modell Auto A Auto B Auto D Auto E Obwohl das Modell „Auto A“ in der Tabelle PKW zweimal vorkommt, wird es in der SQL Abfrage mittels Distinct-Befehl nur einmal angezeigt und gilt somit als redundanzfrei. SQL WHERE Befehl Mithilfe des SQL WHERE-Befehls werden in SQL Abfragen nur bestimmten Datensätze ausgewählt. Der SQL WHERE-Befehl funktioniert im Prinzip wie ein Filter, der es ermöglicht, nur Datensätze anzuzeigen, die bestimmte Kriterien erfüllen. Soll ein SQL Statement eine bestimmte Bedingung erfüllen, muss eine WHERE-Bedingung eingebaut und erfüllt werden, damit die Abfrage eine Ergebnismenge liefern kann. SQL WHERE Syntax Die SQL Syntax einer Select-Abfrage mit WHERE ist wie folgt aufgebaut: SELECT Spaltenname FROM Tabellenname WHERE Spaltenname = Wert Mithilfe des WHERE wird definiert, welche Bedingung positiv erfüllt werden muss, damit die richtige Ergebnismenge geliefert wird. Die Ergebnismenge kann mithilfe der folgenden Vergleichsoperatoren oder Prädikate, spezifiziert werden: T-SQL-Sprachelemente: Prädikate und Operatoren Elemente: Prädikate Prädikate und Operatoren: IN, BETWEEN, LIKE Vergleichsoperatoren =, >, <, >=, <=, <>, !=, !>, !< Logische Operatoren AND, OR, NOT arithmetische Operatoren +, -, *, /, % Verkettung + SQL WHERE Beispiel Gegeben sei folgende Tabelle namens „Mitarbeiter“: Nachname Heinrich Löffler Schulz Schröder Nussbaum MGS (2016) for DBMS-Systems Vorname Daniel Dennis Holger Michael Julia Gehalt 2435 2090 3410 3675 1201 Abteilung Einkauf Vertrieb Produktmanagement Geschäftsführung Empfang 22 Nun möchte man den Nachnamen der Mitarbeiter und deren Gehälter auflisten. Allerdings soll die Spalte „Gehalt“ eine bestimmte Bedingung erfüllen. Es sollen alle Mitarbeiter und deren Gehälter angezeigt werden, bei denen das Gehalt über 2095 Euro beträgt. Das SQL Statement mit der WHERE-Bedingung würde wie folgt aussehen: SELECT NACHNAME, VORNAME, GEHALT, ABTEILUNG FROM MITARBEITER WHERE GEHALT > 2095 Das Ergebnis würde wie folgt aussehen: Nachname Heinrich Schulz Schröder Vorname Daniel Holger Michael Gehalt 2435 3410 3675 Abteilung Einkauf Produktmanagement Geschäftsführung In diesem Beispiel haben wir das „größer als“ – Zeichen verwendet – einen Vergleichsoperator. SQL kann mit allen gängigen Vergleichsoperatoren (siehe oben) umgehen. Wir könnten also genauso gut eine Abfrage erstellen, welche nur Datensätze anzeigt, bei denen das Gehalt „kleiner als“ 2095 Euro beträgt. SQL AND & OR Operatoren Die SQL AND & OR Operatoren werden in SQL-Where Bedingungen eingebaut, um bestimme Abfrageergebnisse ein- bzw. auszugrenzen. Der Einsatz der Operatoren folgt der booleschen Algebra, die man aus dem Mathematikunterricht kennt und einfach zu verstehen. Mithilfe des AND Operators werden SQL Bedingungen zusammengefasst. Der OR Operator sorgt für eine Unterscheidung zwischen zwei oder mehreren SQL Bedingungen. Wichtig ist zu beachten, dass ein OR Operator in der booleschen Algebra immer schwerer wiegt, als ein AND Operator. SQL AND Syntax Die SQL Syntax einer Select-Abfrage mit WHERE und AND ist wie folgt aufgebaut: SELECT Spaltenname FROM Tabellenname WHERE Spaltenname1 = Wert1 AND Spaltenname2 = Wert2 SQL OR Syntax Die SQL Syntax einer Select-Abfrage mit WHERE und OR ist wie folgt aufgebaut: SELECT Spaltenname FROM Tabellenname WHERE Spaltenname1 = Wert1 OR Spaltenname2 = Wert2 MGS (2016) for DBMS-Systems 23 SQL WHERE AND Beispiel Gegeben sei eine Tabelle namens „Mitarbeiter“: Nachname Gerhardt Müller Schulze Opitz Meier Vorname Sabine Dennis Holger Heiko Julia Gehalt 2435 2090 3410 3675 1201 Geschlecht w m m m w Nun möchte man alle Mitarbeiter, deren Gehalt und ihr Geschlecht anzeigen. Dabei sollen zwei Bedingungen gelten: Es sollen alle Frauen, die mehr als 2000 Euro verdienen, angezeigt werden: Das SQL-Statement mit der AND-Bedingung würde wie folgt aussehen: SELECT NACHNAME, VORNAME, GEHALT, GESCHLECHT FROM MITARBEITER WHERE GESCHLECHT ='w' AND GEHALT > 2000 Das Ergebnis würde wie folgt aussehen: Nachname Gerhardt Vorname Sabine Gehalt 2435 Geschlecht w SQL WHERE OR Beispiel Gegeben sei wieder die Tabelle namens „Mitarbeiter“: Nachname Gerhardt Müller Schulze Opitz Meier Vorname Sabine Dennis Holger Heiko Julia Gehalt 2435 2090 3410 3675 1201 Geschlecht w m m m w Nun möchten man alle Mitarbeiter und deren Gehälter anzeigen. Dabei sollen zwei Bedingungen mit einer OR-Bedingung verknüpft werden und gelten: Es sollen alle Mitarbeiter, die weniger als 2000 Euro und mehr als 3000 Euro verdienen, angezeigt werden: Das SQL-Statement mit der OR-Bedingung würde wie folgt aussehen: SELECT NACHNAME, VORNAME, GEHALT, GESCHLECHT FROM MITARBEITER WHERE GEHALT < 2000 OR GEHALT > 3000 Das Ergebnis würde wie folgt aussehen: Nachname Schulze Opitz Meier MGS (2016) for DBMS-Systems Vorname Holger Heiko Julia Gehalt 3410 3675 1201 Geschlecht m m w 24 SQL IN Operator Der SQL IN Operator wird in SQL-Where Bedingungen eingebaut, um mehrere Abfrageergebnisse in einer SQL-Anweisung zu bündeln. Damit kann der IN Operator leicht mehrere OR Operatoren ersetzen und vereinfacht damit die Struktur von komplexen OR-Bedingungen. Der SQL IN Operator kann auch Ergebnismengen mit NOT ausschließen. Um bestimmte Ergebnismengen auszuschließen, muss das Wort NOT hinzugefügt werden. SQL IN Syntax Die SQL Syntax einer Select-Abfrage mit WHERE und IN ist wie folgt aufgebaut: SELECT Spaltenname FROM Tabellenname WHERE Spaltenname IN ('Wert1','Wert2') SQL IN Beispiel Gegeben sei eine Tabelle namens „Mitarbeiter“: Nachname Reinhardt Schönbaum Wegner Schulz Richter Vorname Melinda Jakob Lutz Dorothea Heiko Gehalt 2435 2090 3410 1201 3675 Geschlecht w m m w m Nun möchten wir alle Mitarbeiter mit dem folgenden Vornamen ermitteln: Heiko, Dorothea und Melinda: Das SQL-Statement mit der IN-Bedingung würde wie folgt aussehen: SELECT NACHNAME, VORNAME, GEHALT, GESCHLECHT FROM MITARBEITER WHERE VORNAME IN ('Heiko', 'Dorothea', 'Melinda') Das Ergebnis würde wie folgt aussehen: Nachname Reinhardt Schulz Richter Vorname Melinda Dorothea Heiko Gehalt 2435 1201 3675 Geschlecht w w m Wichtig: In einer SQL Select Abfrage kann der IN Operator nicht mit Wildcards gefüllt werden wie beim LIKE Operator. MGS (2016) for DBMS-Systems 25 SQL BETWEEN Befehl Der SQL BETWEEN Befehl wird in SQL-Where Bedingungen eingebaut, um einen bestimmten Bereich eines Abfrageergebnisses in einer SQL-Anweisung zu bündeln. Oft wird der SQL BETWEEN Befehl für Datumsbereiche von zwei Datumsangaben genutzt, um alle Informationen in diesem Bereich zu ermitteln. SQL BETWEEN Syntax SELECT Spaltenname FROM Tabellenname WHERE Spaltenname BETWEEN 'DATUM1' AND 'DATUM2' SQL BETWEEN Beispiel Gegeben sei eine Tabelle namens „Mitarbeiter“: Nachname Wegner Müller Schulz Richter Schröder Vorname Lutz Melanie Dorothea Heiko Lukas Geburtstag 12.12.1983 01.04.1978 13.02.1990 15.08.1995 24.07.1980 SELECT NACHNAME, VORNAME, GEBURTSTAG FROM MITARBEITER WHERE GEBURTSTAG BETWEEN '19800101' AND '19930101' Das Ergebnis würde wie folgt aussehen: Nachname Wegner Schulz Schröder Vorname Lutz Dorothea Lukas Geburtstag 12.12.1983 13.02.1990 24.07.1980 SQL LIKE Befehl Der SQL LIKE Befehl ermöglicht eine Suche auf der Grundlage eines vorher definierten regulären Musters anstelle eines festen Suchbegriffs (wie bei SQL IN) oder der Definition eines Bereichs (wie bei SQL BETWEEN). Oft wird der SQL Like Befehl in Texten bzw. Zeichenketten verwendet, um mit regulären Mustern Ergebnisse zurückzuliefern. SQL LIKE Befehl Syntax Die SQL Syntax einer Select-Abfrage mit WHERE und LIKE kann wie folgt aufgebaut werden: SELECT Spaltenname FROM Tabellenname WHERE Spaltenname LIKE 'MUSTER' MGS (2016) for DBMS-Systems 26 Das ‚MUSTER‘ kann nachfolgenden Strukturen aufgebaut werden: • • • • ‚L_S‘: Alle Zeichenketten die mit einem ‚L‘ beginnen, inklusive einem Folgezeichen und mit einem ‚S‘ enden. ‚BEST%‘: Alle Zeichenketten, die mit ‚BEST‘ beginnen. ‚%UNG‘: Alle Zeichenketten, die auf ‚UNG‘ enden. ‚%ST%‘: Alle Zeichenketten, die an irgendeiner Stelle das Muster ‚ST‘ enthalten. SQL LIKE Befehl Beispiel Gegeben sei eine Tabelle namens „Mitarbeiter“: Nachname Richard Wagner Rosenkreuz Lutter Poller Vorname Juliana Jakob Max Juliane Moritz Gehalt 1350 5790 4410 1271 5034 Geschlecht w m m w m Nun wollen wir alle Mitarbeiter auswählen, wo der Vorname mit R beginnt, 8 Folgezeichen besitzt und auf z endet: Das SQL-Statement mit der LIKE-Bedingung würde wie folgt aussehen: SELECT NACHNAME, VORNAME, GEHALT, GESCHLECHT FROM MITARBEITER WHERE NACHNAME LIKE 'R________z' Das Ergebnis würde wie folgt aussehen: Nachname Rosenkreuz Vorname Max Gehalt 4410 Geschlecht m Nun wollen wir alle Mitarbeiter auswählen, wo der Nachname mit Lu beginnt: Das SQL-Statement mit der LIKE-Bedingung würde wie folgt aussehen: SELECT NACHNAME, VORNAME, GEHALT, GESCHLECHT FROM MITARBEITER WHERE NACHNAME LIKE 'Lu%' Nachname Lutter MGS (2016) for DBMS-Systems Vorname Juliane Gehalt 1271 Geschlecht w 27 SQL ORDER BY Der SQL ORDER BY-Befehl ermöglicht eine Sortierung auf der Grundlage einer vorher definierten Sortierungsreihenfolge. Der SQL ORDER BY Befehl wird in vielen Anwendungen in Form von Sortierungsfiltern oder Buttons zum Sortieren dargestellt. SQL ORDER BY Syntax Die SQL Syntax einer Select-Abfrage mit ORDER BY kann wie folgt aufgebaut werden: SELECT Spaltenname FROM Tabellenname ORDER BY Spaltenname Sortierungsparameter Der ‚Sortierungsparameter‘ kann nachfolgenden Strukturen aufgebaut werden: • • ASC: Das Ergebnis wird aufsteigend sortiert DESC: Das Ergebnis wird absteigend sortiert SQL ORDER BY Beispiel Gegeben sei folgende Tabelle namens „PKW“: PKWNR 1 2 3 4 5 Modell Auto A Auto B Auto C Auto D Auto E Preis 80.000,00€ 72.000,00€ 102.000,00€ 85.000,00€ 78.000,00€ Nun wollen wir die Pkw’s nach ihrem Preis aufsteigend sortieren: Das SQL-Statement mit der ORDER BY-Bedingung würde wie folgt aussehen: SELECT PKWNR, MODELL, PREIS FROM PKW ORDER BY PREIS ASC Das Ergebnis würde wie folgt aussehen: PKWNR 2 5 1 4 3 Modell Auto B Auto E Auto A Auto D Auto C Preis 72.000,00€ 78.000,00€ 80.000,00€ 85.000,00€ 102.000,00€ Nun wollen wir die Pkw’s nach ihrem Modell aufsteigend und nach dem Preis absteigend sortieren: Das SQL-Statement mit der ORDER BY-Bedingung würde wie folgt aussehen: SELECT PKWNR, MODELL, PREIS FROM PKW ORDER BY MODELL ASC, PREIS DESC Das Ergebnis würde wie folgt aussehen: PKWNR 2 4 1 4 5 MGS (2016) for DBMS-Systems Modell Auto B Auto C Auto C Auto D Auto E Preis 72.000,00€ 102.000,00€ 80.000,00€ 85.000,00€ 78.000,00€ 28 SQL GROUP BY Befehl Durch das SQL GROUP BY–Statement ist es möglich eine Ergebnismenge zu gruppieren. Dieser SQLBefehl wird häufig in Kombination mit den Aggregatfunktionen verwendet. Zu den Aggregatfunktionen gehören die Befehle AVG, COUNT, MAX, MIN, SUM. SQL GROUP BY Syntax Die SQL GROUP BY Syntax einer Select-Abfrage mit GROUP BY ist wie folgt aufgebaut: SELECT Spaltenname FROM Tabellenname [WHERE Bedingung] GROUP BY Spaltenname Mithilfe des GROUP BY wird definiert, wie die Datenmenge gruppiert werden soll. Die Ergebnismenge kann nach mehreren Spalten gruppiert werden SQL GROUP BY Beispiel Gegeben sei folgende Tabelle namens „Auto“: Auto Auto 1 Auto 2 Auto 3 Auto 4 KM-Stand 30 000km 10 000km 20 000km 30 000km Baujahr 2002 2010 2010 2001 Wir sind nun ein Autoverkäufer und möchten wissen, wie viele Autos das Baujahr 2010 in unserem Repertoire besitzen. Das SQL Statement mit der GROUP BY-Bedingung würde wie folgt aussehen: SELECT Baujahr, COUNT(Baujahr) AS Count(Baujahr) FROM Auto WHERE Baujahr = ‘2010‘ GROUP BY Baujahr Das Ergebnis würde wie folgt aussehen: Baujahr 2010 MGS (2016) for DBMS-Systems Count(Baujahr) 2 29 SQL Abarbeitungsreihenfolge Grundlegendes zur logischen Reihenfolge der Vorgänge in SELECT-Anweisungen (Abarbeitungsreihenfolge) • • • Elemente einer SELECT-Anweisung Logische Abfrageverarbeitung Anwenden der logischen Reihenfolge von Vorgängen zum Schreiben von SELECTAnweisungen Element Rolle SELECT Legt fest, welche Spalten zurückzugeben sind FROM Legt die abzufragende(n) Tabelle(n) fest WHERE GROUP BY HAVING ORDER BY Filtert Zeilen nach einem Prädikat Ordnet Zeilen nach Gruppen an Filtert Gruppen nach einem Prädikat Sortiert die Ausgabe Die Reihenfolge, in der eine Abfrage geschrieben wird, ist nicht die Reihenfolge, in der sie von SQL Server ausgewertet wird 5. 1. 2. 3. 4. 6. SELECT FROM WHERE GROUP HAVING ORDER BY Aggregieren SQL SUM() Funktion Die SQL SUM Funktion summiert die Werte einer Tabellenspalte und liefert sie zurück. Die SQL SUM Funktion ist aus den Unternehmen nicht mehr wegzudenken, da besonders in den Abteilungen des Vertriebs- und Finanz-Controlling Summenwerte mittels der SUM Funktion erstellt werden müssen. SQL SUM() Funktion Syntax Die SQL SUM() Funktion kann in einer Select-Abfrage wie folgt eingebaut werden: SELECT SUM(Spaltenname1) FROM Tabellenname Mithilfe der SUM() Funktion werden die Werte der Tabellenspalte aufsummiert und angezeigt. MGS (2016) for DBMS-Systems 30 SQL SUM() Funktion Beispiel Gegeben sei folgende Tabelle namens „PKW“: PKWNR 1 2 3 Modell Auto A Auto B Auto C Preis 25.000,00€ 30.000,00€ 28.000,00€ Nun wollen wir den Gesamtwert aller PKW’s feststellen. Das erfolgt mittels der SUM-Funktion. Das SQL-Statement mit der SUM-Funktion würde wie folgt aussehen: SELECT SUM(PREIS) FROM PKW Preis 83.000,00€ SQL Min() Funktion Die SQL MIN Funktion ermittelt den niedrigsten Wert einer Tabellenspalte und liefert ihn zurück. Die SQL MIN Funktion kann genutzt werden, um ein Extremum (Tiefpunkt) in Tabellenspalten festzustellen. Im Reporting werden oft Höchstwerte um negative oder positive Werte hervorzuheben. SELECT MIN(Preis) FROM PKW Gegeben sei folgende Tabelle namens „PKW“: PKWNR 1 2 3 Modell Auto A Auto B Auto C Preis 30.000,00€ 35.000,00€ 90.000,00€ Das Ergebnis sieht wie folgt aus: Preis 30.000,00€ SQL Max() Frunktion Neben der Min() Funktion, die den kleinesten Wert aus einem Datensatz ermittelt, wird mit der Max() Funktion, der höchste Wert ermittelt. In unserem Beispiel sähe das wie folgt aus: SELECT MAX(Preis) FROM PKW PKWNR 1 2 3 Das Ergebnis sieht wie folgt aus: Preis 90.000,00€ MGS (2016) for DBMS-Systems Modell Auto A Auto B Auto C Preis 30.000,00€ 35.000,00€ 90.000,00€ 31 SQL Avg() Funktion Wie auch der Max() und Min() Funktion wird sehr häufig auch nach dem Mittelwert gefragt. Auch dazu gibt es eine Funktion, die wie folgt beschrieben wird. SELECT AVG(Preis) FROM PKW Gegeben sei folgende Tabelle namens „PKW“: PKWNR 1 2 3 Modell Auto A Auto B Auto C Preis 30.000,00€ 35.000,00€ 90.000,00€ Das Ergebnis sieht wie folgt aus: Preis 51.666,66€ SQL Count() Frunktion Die SQL COUNT-Funktion zählt(COUNT) die Anzahl von ausgewählten Datensätzen. Für diese Aggregatfunktion gibt man einfach das Schlüsselwort COUNT an, inklusive der Spalte der zu zählenden Datensätzen in den Klammern an. Es werden alle Datensätze gezählt, deren Wert nicht NULL ist. SQL Count wird oft verwendet um bestimme Datenquellen auf ihre Richtigkeit zu vergleichen. In unserem Beispiel sähe das wie folgt aus: SELECT Count(*) FROM PKW PKWNR 1 2 3 4 Das Ergebnis sieht wie folgt aus: Preis 3 MGS (2016) for DBMS-Systems Modell Auto A Auto B Auto C Auto D Preis 62.000,00€ 72.000,00€ NULL 78.000,00€ 32 Mengenoperationen und Unterabfragen Mengenoperationen verbindet min. 2 Objekte miteinander und bilden ein gemeinschaftliches Ergebnis. Das folgenden 2 Tabellen werden verwendet Tabelle student Tabelle lehrender matrikel_nr name vorlesung ---------------------------911574 Meier Java 676676 Schulz Datenbanken matrikel_nr name vorlesung -----------------------------878999 Kowa Datenbanken 665544 Müller XML Union UNION bildet die Vereinigung zweier Relationen indem Zeilen der ersten Menge oder des ersten Operanden mit allen Zeilen der zweiten Menge zusammengefasst werden. Zeilen, die in der Ergebnismenge zweimal vorkommen, werden zu einer einzigen Zeile zusammengefaßt. Die Datentypen der Spalten müssen kompatibel sein, d.h. es muß entweder ein impliziter Cast (z.B. int auf double) möglich sein, oder wenn dies nicht möglich ist, muß ein expliziter Cast erfolgen. - dies bezieht sich auch auf die Anordnung der Spalten in der Abfrage. SELECT name FROM student UNION SELECT name FROM lehrender Das Ergebnis sieht wie folgt aus. Meier Schulz Kowa Müller Union all Der Operand UNION ALL liefert alle Werte, die von der linken und von der rechten Abfrage zurückgegeben werden, gleichgültig, ob Duplikate vorhanden sind oder nicht. Wenn die Duplikate nicht mitangezeigt werden sollen, ist UNION ALL in der SQL-Abfrage durch UNION zu ersetzen, der die doppelten Datensätze und NULL-Werte schon von vorne an entfernt. Intersect INTERSECT überprüft die Zeilen der beiden Eingangsmengen und gibt nur jene Zeilen aus, die in der linken vorkommt. Auch hier werden vor dem Erstellen der Ergebnismenge die redundanten Zeilen ausgeschaltet. Gibt alle eindeutigen Werte zurück, die von den Abfragen auf der linken und rechten Seite des INTERSECT-Operators zurückgegeben werden. SELECT vorlesung FROM student INTERSECT SELECT vorlesung FROM lehrender Das Ergebnis sieht wie folgt aus: Datenbanken MGS (2016) for DBMS-Systems 33 Except EXCEPT gibt eindeutige Zeilen aus der linken Eingabeabfrage zurück, die nicht von der rechten Eingabeabfrage ausgegeben werden. SELECT vorlesung FROM student EXCEPT SELECT vorlesung FROM lehrender Das Ergebnis sieht wie folgt aus: Java ALL und ANY Operanten Sie werden in Suchbedingungen zusammen mit einem Vergleichsoperator, wie z.B. =, <, >,... verwendet. Wird ein solcher Vergleichsoperator mit einem der Schlüsselwörter ANY oder ALL kombiniert, dann ist als rechter Operand (Ausdruck) eine Unterabfrage zugelassen, die eine Ergebnismenge zurückliefert. Wird auf ANY oder ALL verzichtet und nur ein Vergleichsoperator verwendet, so darf der rechte Operand (Ausdruck) nur eine Unterabfrage sein, die nur einen Datensatz zurückliefert. Linker und rechter Operand müssen Ausdrücke mit gleicher Struktur (vereinigungskonform) sein: gleiche Anzahl an Spalten, gleiche Datentypen, gleiche Reihenfolge der Spalten. Ist einer der Operanden (Ausdrücke) leer (NULL) bzw. eine leere Ergebnismenge, dann wird die Bedingung im Sinne der dreiwertigen Logik zu UNKNOWN ausgewertet. Beispiele: Welche Kunden aus Köln tätigen mehr Umsatz als irgendein Kunde aus Bonn? Kölner mit wenigstens so viel Umsatz wie der "geringste" Bonner. SELECT * FROM Kunden WHERE Ort = 'Köln' AND Umsatz >= ANY (SELECT * FROM Kunden WHERE Ort = 'Bonn'); Welche Kunden aus Köln tätigen mehr Umsatz als alle Kunden aus Bonn? Kölner mit mehr Umsatz wie der "meiste" Bonner. SELECT * FROM Kunden WHERE Ort = 'Köln' AND Umsatz >= ALL (SELECT * FROM Kunden WHERE Ort = 'Bonn'); MGS (2016) for DBMS-Systems 34 IN Operant / Unterabfragen Der IN-Operator prüft, ob ein zu vergleichender Ausdruck in einer Menge von Werten vorkommt. Wenn ja, dann wird TRUE zurückgeliefert, wenn nicht, dann FALSE und wenn NULL-Werte in der Vergleichsmenge vorkommen bzw. der zu vergleichende Ausdruck NULL ist, dann wird im Sinne der dreiwertigen Logik UNKNOWN zurückgeliefert. Es gibt zwei verschiedene Syntax. Einmal kann mit einer Liste konstanter Werte verglichen werden, zum anderen mit der Ergebnismenge einer Unterabfrage. Der IN-Operator kann in beliebigen Suchbedingungen verwendet werden und mit NOT negiert werden. Damit der Operator syntaktisch ausführbar ist, müssen einige Restriktionen eingehalten werden. Wird eine Liste konstanter Werte verwendet, so darf diese Liste keine Duplikate enthalten und alle Werte müssen vom gleichen Datentyp sein. Zudem muss immer gelten, dass der zu vergleichende Ausdruck und die konstanten Werte bzw. die Spaltenliste der Unteranfrage über die gleiche Struktur verfügen, was heißt, dass die Datentypen gleich sein müssen, die Anzahl der Spalten gleich sein muss und auch die Reihenfolge der Spalten. Die Spalten müssen nicht gleich heißen. Im Grunde gilt hier auch die Anforderung der Vereinigungskonformität. Für Vergleiche mit einer Unteranfrage ist ein semantisch analoger Operator der EXISTS-Operator. Während bei der Verwendung des unären EXISTS explizit auf die Korrelation geachtet werden muss, ergibt sich beim IN-Operator die Korrelation automatisch aufgrund der Syntax des binären IN. Beim IN werden automatisch Spalten der oberen und der unteren Anfrage in Beziehung gesetzt, weil die oberen Spalten ja den zu vergleichenden Ausdruck darstellen und die unteren Spalten die Spalten der SELECT-Liste sind. Selektieren Sie alle Artikel, für die kein Auftrag vorliegt! SELECT TNr, Bezeichnung FROM Artikel WHERE TNr NOT IN (SELECT TNr FROM Auftragspositionen); Welche Artikel sind von Typ 'Fahrrad', 'Inliner', 'Skateboard'? SELECT TNr, Bezeichnung FROM Artikel WHERE Artikel_Typ IN ('Fahrrad', 'Inliner', 'Skateboard'); Überraschendes Ergebnis SELECT TNr, Bezeichnung FROM Artikel WHERE Artikel_Typ IN ('Fahrrad', 'Inliner', NULL); Diese Abfrage liefert unabhängig von den tatsächlichen Werten in der Spalte Artikel_Typ keinen Wert zurück, da der Vergleich mit einem NULL-Werte nach der dreiwertigen Logik dreiwertigen Logik den Wert UNKNOWN ergibt. MGS (2016) for DBMS-Systems 35 Verknüpfen von Objekten (JOINS) SQL JOINS – Grundlagen eines SQL JOINS In relationalen Datenbanksystemen werden Informationen aus einem oder mehrere Anwendungssysteme systematisch gespeichert. Die Zusammengehörigkeit der Daten ergibt sich aus dem logischen Datenbankdesign, die meist in Form eines Entity-Relationship-Modells dokumentiert ist. Die Struktur der Datenbank leitet sich aus den einzelnen Typen dieses Modells ab. Um Redundanzen beim Speichern zu vermeiden, werden die Informationen auf verschiedene Tabellen verteilt. Zur Erhaltung der logischen Zusammengehörigkeit werden FremdschlüsselBeziehungen zwischen den Tabellen aufgebaut. Muss das Datenbanksystem eine Anfrage verarbeiten, bei der Informationen aus mehreren Tabellen benötigt werden, ist es erforderlich die einzelnen Datensätze der Tabellen wieder zusammenzuführen. Dadurch werden die ursprünglichen Informationen wiederhergestellt. Dies wird in SQL-Datenbanken mit Hilfe von SQL JOINS (Verbünden) umgesetzt. Mit einem SQL Join werden mehrere Tabellen verknüpft, die in einer Beziehung zueinanderstehen. MGS (2016) for DBMS-Systems 36 Wie funktioniert ein SQL Join? Die Verbindung der Tabellen erfolgt mit speziellen Schlüsselwörtern. Neben dem Namen des anzuwendenden Joins, man unterscheidet vier Join-Arten, muss zusätzlich eine ON-Bedingung angegeben werden. Eine Ausnahme gibt es beim CROSS JOIN und beim NATURAL JOIN. In der ONBedingung werden die zu vergleichenden Spalten der beiden Tabellen angegeben. Ein Vergleich erfolgt durch die Operatoren gleich, ungleich, kleiner, größer usw. Dabei können die Namen der Spalten verschieden sein. Es ist jedoch darauf zu achten, dass sie die logische Beziehung zwischen den Datensätzen widerspiegeln. Neben den zusätzlichen Schlüsselwörtern kann auch die WHERE-Klausel verwendet werden, um die Ergebnismenge bezüglich anderer Merkmale einzuschränken. Welche Arten von SQL Joins gibt es? Im SQL-Standard wird generell zwischen sechs Join-Typen unterschieden, die sich in Art und Anwendung unterscheiden: Cross-Joins Inner Joins Left Joins Right Joins Full Outer Joins Self Join Im folgenden Beispiel wird gezeigt, wie die Categories-Tabelle (Kategorien) und die Products-Tabelle (Artikel) über das CategoryID-Feld (Kategorie-Nr.) verknüpft werden können: SELECT CategoryName, ProductName FROM Categories INNER JOIN Products ON Categories.CategoryID = Products.CategoryID; Im folgenden Beispiel wird gezeigt, wie Sie die Tabellen Categories und Products für das Feld CategoryID verknüpfen. Die Abfrage erzeugt eine Liste aller Kategorien, einschließlich der Kategorien, die keine Produkte enthalten: SELECT CategoryName, ProductName FROM Categories LEFT JOIN Products ON Categories.CategoryID = Products.CategoryID; Durch die Verbindung der Objekte sind Ihnen keine Grenzen gesetzt. Durch Schlüsselkreys verbundene Objekte lassen sich beliebig erweitern. Einzige Bedingung ist, dass der Datentyp der verbundenen Objekte identisch ist. MGS (2016) for DBMS-Systems 37 Datenmanipulation (Insert, Update, Delete) Grundlegend verstehen wir im SQL, 4 Befehle. Den Select-Befehl haben wir bereits im oberen Bereich kennen gelernt. Diese liefert Ihnen alle Daten, sofern Sie Berechtigung vorliegt. WICHTIG: Falls Sie bislang noch wenig Erfahrung mit Datenbank-Befehlen haben: Beachten Sie, dass es auf dieser Ebene des Zugriffs keinen 'Rückgängig-Button' mehr gibt, wie Sie ihn vielleicht von Word oder Excel gewohnt sind. Eine Datenbank stellt einen elementaren Datenspeicher dar, INSERT/UPDATE/DELETE verändert diesen Speicher direkt. Und was Sie eingefügt, geändert oder gelöscht haben, ist unwiderruflich eingefügt, geändert und gelöscht. Falls es in Programmen wie Word einen Rückgängig-Button gibt, so setzt dies in irgendeiner Form eine Datenbankstruktur voraus, welche sich die zuletzt durchgeführten Aktionen merkt und diese zurücksetzt. Benötigen Sie auf der Ebene einer Datenbank eine Historie, so muss diese explizit in Form eines Tabellenschemas erstellt und zu einer Zeile nicht nur die aktuellen Werte, sondern zusätzlich das Änderungsdatum erfasst werden. Alternativ kann man eine zusätzliche Tabelle erstellen und immer die drei letzten Versionen in dieser ablegen. Der Insert-Befehl schreibt Daten der Tabellen-Regel hinein. Dazu bestehen mehrere Möglichkeiten. Sie können bestimmte Werte in einer Tabelle einfügen, oder bestehend aus anderen Tabellen/Views sich die Daten über den Select-Befehl auslesen. INSERT Einfaches Einfügen deren Feldreihenfolge bekannt sind. Dazu ist es wichtig zu wissen, dass die Felder der Reihe nach eingefügt werden müssen. INSERT INTO Tabellenname VALUES (1, ‘Max Mustermann‘, NULL, ‘Musterstrasse 1a‘); Mehrfaches Einfügen INSERT INTO Tabellenname VALUES (1, ‘Max Mustermann‘, NULL, ‘Musterstrasse 1a‘), (2, ‘Martin Schulze‘, ‘Uwe‘, ‘Unter der Brücke 12‘); Einfaches Einfügen deren Feldreihenfolge angegeben werden, weil nur diese Felder beschrieben werden sollen. INSERT INTO Tabellenname (AdressNr, Name, Zuname, Strasse) VALUES (1, ‘Max Mustermann‘, NULL, ‘Musterstrasse 1a‘); Selbstverständlich ist auch so ein mehrfaches Einfügen möglich. Einfügen von Daten mit einer Identitätsspalte. INSERT INTO Tabellenname (AdressNr, Name, Zuname, Strasse) VALUES (NEWID(), ‘Max Mustermann‘, NULL, ‘Musterstrasse 1a‘); Einfügen von Daten aus anderen Tabellen / Views INSERT INTO Tabellenname (AdressNr, Name, Zuname, Strasse) SELECT (AdressNr, Name, Vorname, Strasse from Adressen where AdressNr IN (1,2,5,47,52)); MGS (2016) for DBMS-Systems 38 UPDATE Der Update-Befehl manipuliert ein oder mehrere Datensätze in einem Batch. Zunächst wird die zu aktualisierende Tabelle angegeben. Nach SET folgt die Liste der zu aktualisierenden Zellen, für die rechts vom Gleichheitszeichen der neue Wert angegeben wird. Im ANSI-Standard kann anschließend eine JOIN-Verknüpfung folgen, durch welche die von der Aktualisierung betroffenen Zeilen genauer eingeschränkt werden. Schließlich werden mit einer WHERE-Klausel einzelne Zeilen ausgewählt. Update einer Tabelle ohne Verknüpfung mit anderen Tabellen. UPDATE <Tabelle> SET <Name einer Spalte> = <Ausdruck aus Spalten, Konstanten, Funktionen> [, weitere Spaltennamen = Ausdruck] WHERE <Bedingung> Update einer Tabelle mit JOIN UPDATE <Tabelle | View> SET <Name einer Spalte> = <Ausdruck aus Spalten, Konstanten, Funktionen> [, weitere Spaltennamen = Ausdruck] [FROM <Tabelle> [INNER | LEFT | RIGHT] JOIN <Tabelle> ON <Spalte-1 = Spalte-2>] WHERE <Bedingung> Beispiele UPDATE ARTIKEL SET Gesamt = 0 Einfachste Version einer Update-Anweisung: Eine Spalte wird mit einem neuen Wert, hier mit der Konstanten 0 belegt, die Aktualisierung wird für alle Zeilen ausgeführt. UPDATE ARTIKEL SET Gesamt = A_PREIS Jeder Zelle 'Gesamt' ist die Zelle 'A_PREIS' derselben Zeile zugeordnet. Also wird der Wert der letzteren in die Zelle 'Gesamt' kopiert. UPDATE ARTIKEL SET Gesamt = A_PREIS * 1.19 Dasselbe wie zuvor, nun ergänzt um die Multiplikation mit einer Konstanten. Eine solche Spalte mag bsp. den Bruttopreis eines Artikels enthalten. UPDATE ARTIKEL SET Gesamt = A_PREIS * 1.19 WHERE A_PREIS > 100 Nun wird die Menge der zu aktualisierenden Zeilen eingeschränkt auf, dass nicht alle, sondern nur jene Zeilen aktualisiert werden, deren Preis vor der Aktualisierung größer 100 ist. MGS (2016) for DBMS-Systems 39 Deterministische und nichtdeterministische Anweisungen: Bei UPDATE-Befehlen mit JOIN-Klausel muss sichergestellt sein, dass der JOIN zu jeder zu aktualisierenden Zeile nur einen Ausdruck liefert. Ist dies der Fall, so spricht man von deterministischen Anweisungen. Ansonsten handelt es sich um eine nichtdeterministische Anweisung, deren Ergebnis nicht eindeutig definiert ist. Denn in diesem Fall ist nicht vorhersehbar, welcher Ausdruck tatsächlich in die Zelle eingetragen wird. Dieses Problem taucht hauptsächlich dann auf, wenn eine Spalte in der Grundtabelle aktualisiert werden soll und im JOIN eine Detailtabelle herangezogen wird, so dass in der Detailtabelle kein, ein oder mehrere Datensätze für die Grundzeile zur Verfügung stehen. DELETE Der DELETE-Befehl entfernt Daten aus der Tabelle / View. Sofern Sie die Berechtigung haben, wird der SQL Server die Daten löschen. Bitte bedenken Sie an dieser Stelle, dass es auch hier kein Rückgängig-Button gibt. Zunächst einmal kann der Datensatz nicht ohne weiteres widerhergestellt werden. Um Datensätze, die versehentlich gelöscht wurden, ist ein erhöhter administrativer Aufwand Notwendig. Löscht den gesamten Inhalt der Tabelle Artikel DELETE FROM Artikel; Löscht den Inhalt der Tabelle Artikel mit der Artikelnummer 11, 12 und 13 DELETE FROM Artikel WHERE ArtikelNr IN (11, 12, 13); Löschen von Artikel unter Berücksichtigung einer Unterabfrage. Hier werden alle Artikel gelöscht die nicht in den Auftragspositionen vorhanden sind. DELETE FROM Artikel WHERE ArtikelNr NOT IN (Select ArtikelNr from Auftragspositionen); Weitere Beispiele Verwenden von DELETE mit der TOP-Klausel Im folgenden Beispiel werden 2.5 % der Zeilen aus der Tabelle Artikel gelöscht. DELETE TOP (2.5) FROM Artikel MGS (2016) for DBMS-Systems 40 OUTPUT-Klausel Eine INSERT-, UPDATE- oder DELETE-Anweisung mit einer OUTPUT-Klausel gibt Zeilen auch dann an den Client zurück, wenn bei der Anweisung ein Fehler auftritt und ein Rollback ausgeführt wird. Wenn bei der Ausführung der Anweisung ein Fehler auftritt, sollte das Ergebnis nicht verwendet werden. DELETE Artikel OUTPUT DELETED.*; Gibt alle Zeilen aus der Delete – Tabelle zurück, die zuvor in Artikel gelöscht wurden. In diesem Beispiel wird die ersten 5 Artikel aus der Auftragspositionen-Tabelle gelöscht, mit dem Kriterium ArtikelNr = 5 DELETE TOP(5) Auftragspositionen OUTPUT deleted.* WHERE ArtikelNr = 7; Verwenden Sie den READPAST-Tabellenhinweis in UPDATE- und DELETE-Anweisungen, wenn es in Ihrem Szenario möglich ist, dass mehrere Anwendungen einen destruktiven Lesevorgang aus einer Tabelle ausführen. So werden Sperrkonflikte verhindert, die entstehen, wenn eine andere Anwendung bereits den ersten berechtigten Datensatz in der Tabelle liest. DELETE TOP(5) Auftragspositionen WITH (READPAST) OUTPUT deleted.* WHERE ArtikelNr = 7; MGS (2016) for DBMS-Systems 41 Ein weiteres Beispiel aus der Microsoft-MSDN USE tempdb; GO CREATE TABLE dbo.table1 ( id INT, employee VARCHAR(32) ); GO INSERT INTO dbo.table1 VALUES (1, 'Fred') ,(2, 'Tom') ,(3, 'Sally') ,(4, 'Alice'); GO DECLARE @MyTableVar TABLE ( id INT, employee VARCHAR(32) ); PRINT 'table1, before delete' SELECT * FROM dbo.table1; DELETE FROM dbo.table1 OUTPUT DELETED.* INTO @MyTableVar WHERE id = 4 OR id = 2; PRINT 'table1, after delete' SELECT * FROM dbo.table1; PRINT '@MyTableVar, after delete' SELECT * FROM @MyTableVar; --Results --table1, before delete --id employee ------------- -------------------------------1 Fred --2 Tom --3 Sally --4 Alice ---table1, after delete --id employee ------------- -------------------------------1 Fred --3 Sally --@MyTableVar, after delete --id employee ------------- -------------------------------2 Tom --4 Alice MGS (2016) for DBMS-Systems 42 MERGE-Klausel Führt Einfüge-, Update- oder Löschvorgänge in einer Zieltabelle anhand der Ergebnisse eines Joins mit einer Quelltabelle aus. Sie können z. B. zwei Tabellen synchronisieren, indem Sie Zeilen in einer Tabelle anhand von Unterschieden, die in der anderen Tabelle gefunden wurden, einfügen, aktualisieren oder löschen. WICHTIG: Es ist wichtig, dass nur die Spalten aus der Zieltabelle angegeben werden, die für Abgleichszwecke verwendet werden. Geben Sie also Spalten aus der Zieltabelle an, die mit der entsprechenden Spalte der Quelltabelle abgeglichen werden. Versuchen Sie nicht, die Abfrageleistung zu optimieren, indem Sie Zeilen in der Zieltabelle in der ON-Klausel herausfiltern, beispielsweise durch Angabe von AND NOT target_table.column_x = value. Dadurch kann es zu unerwarteten und falschen Ergebnissen kommen. MERGE dbo.tblArtikelGruppen g USING dbo.xGruppenMerge1 as m ON g.ArtGr = m.ArtGr WHEN MATCHED AND (g.ArtGrText != m.ArtGrText) THEN UPDATE SET g.ArtGrText = m.ArtGrText WHEN NOT MATCHED BY TARGET THEN INSERT (ArtGr, ArtGrText) VALUES (m.ArtGr, m.ArtGrText) WHEN NOT MATCHED BY SOURCE THEN DELETE; Wie wende ich MERGE nun an? Auf den ersten Blick wirkt der MERGE Befehl ein wenig “unübersichtlich”. MERGE <Ziel> USING <qQuelle> ON <Bedingung> WHEN MATCHED THEN <meist ein Update> WHEN NOT MATCHED THEN <meist ein Insert>; Wie muss ein MERGE Befehl gelesen werden? Also, wir haben hinter dem MERGE das sogenannte “Ziel” und hinter dem USING die “Quelle”. Über das ON werden diese beiden verbunden (join). Nun kommt das WHEN MATCHED THEN. Hier kommt unsere Aktion hin, welche ausgeführt wird bei einer Erfüllung der Bedingung. Ok, und bei WHEN NOT MATCHED kommt halt die Aktion, wenn die Bedingung nicht erfüllt wurde. Soweit ganz einfach, oder? Hier ein erstes einfaches Beispiel: MERGE Ziel as t USING Quelle as s ON t.bk = s.bk WHEN MATCHED THEN update set t.bk = s.bk, t.attribute1 = s.attribute1, t.attribute2 = s.attribute2 WHEN NOT MATCHED THEN insert (bk, attribute1, attribute2) values (s.bk, s.attribute1, s.attribute2); MGS (2016) for DBMS-Systems 43 Das war doch schon nicht schlecht. Nun ist es aber so, dass hier wenn immer der BK (BusinessKey, Geschäftsschlüssel aus der DWH Lehre…) gleich ist auch ein Update durchgeführt wird. Das sollte natürlich nur sein, wenn sich was an den Attributen geändert hat! Eine erste Idee wäre nun die ON Klausel zu erweitern, aber dadurch würden wir unser Ziel nicht erreichen, da dann ja der Vergleich auf den BK nicht mehr passt. Wir benötigen eigentlich eine Zweiteilung der Bedingung, also wenn BK gleich und Attribute ungleich. MERGE unterstützt dies, indem wir das “WHEN MATCHED” erweitern! MERGE DimTarget as t USING ELTSource as s ON t.bk = s.bk WHEN MATCHED AND (t.attribute1 != s.attribute1 or t.attribute2 != s.attribute2) THEN update set t.bk = s.bk, t.attribute1 = s.attribute1, t.attribute2 = s.attribute2 WHEN NOT MATCHED THEN insert (bk, attribute1, attribute2) values (s.bk, s.attribute1, s.attribute2); Resultat: Der Vorteil der Verwendung von MERGE ist, dass Quelle und Ziel nur einmal durchlaufen werden müssen für alle Operationen, da für alles nur ein Abfrageplan erstellt wird. Gerade bei größeren Datenmengen kann die Verarbeitungsart deutlich beschleunigt werden! Hinzu kommt, dass die Statements kürzer werden. Dennoch ist Obacht geboten, denn falsch verknüpfte Felder führen zu unerwarteten Fehlern. MGS (2016) for DBMS-Systems 44 Abschluss: Ich möchte mit diesem kleinen Handout natürlich keine fachliche Literatur ersetzen. Betrachten Sie diese Informationen hier als eine Art „Wissensermittlung DBMS Grundwissen“. Falls Ihnen dieser kleine EX-Kurs im Rahmen relationale Datenbanken ein wenig mehr Durchblick verschafft hat, freue ich mich über ein Feedback (NEUDEUTSCH like) MGS (2016) for DBMS-Systems