SRT: Knowledge Base


Toolbox

Lektion 4 – SQL Anleitung

Diese Lektion handelt über ein kurzes Tutorial des Structured Query Language (auch bekannt als SQL). Ein SQL ermöglicht dem Benutzer einen Zugriff auf Daten in einem Verwaltungssystem für relationale Datenbanken, wie z.B. Oracle, Microsoft SQL Server, Access, und viele mehr. Dies ist möglich mit der Erlaubnis des Benutzers die Daten, welche er sehen möchte, zu beschreiben. Zudem erlaubt es SQL dem Benutzer, die Daten in der Datenbank zu definieren und zu manipulieren.

Dieses Dokument beschreibt die Benutzung des SQL und bietet passende Beispiele. Die hier benutzte SQL Anweisung ist ANSI, oder Standard SQL.

Empfehlenswert ist es, diese Seite auszudrucken, um bei Bedarf einfach auf die Information zurückgreifen zu können.

 

Content Summary

  • Basics of the SELECT Statement
  • Conditional Selection
  • Relational Operators
  • Compound Conditions
  • IN & BETWEEN
  • Using LIKE
  • Joins
  • Keys
  • Performing a Join
  • Eliminating Duplicates
  • Aliases & In/Subqueries
  • Aggregate Functions
  • Views
  • Creating New Tables
  • Altering Tables
  • Adding Data
  • Deleting Data
  • Updating Data
  • Indexes
  • GROUP BY & HAVING
  • More Subqueries
  • EXISTS & ALL
  • UNION & Outer Joins
  • Common SQL Questions
  • non-standard SQL
  • Syntax Summary

 

Grundlagen des SELECT Statements

In einer relationalen Datenbank werden Daten in Tabellen aufbewahrt. Ein Beispiel ist eine Tabelle mit Bezug auf die Social Security Number, Name, und Address:

EmployeeAddressTable

SSN FirstName LastName Address City State
512687458 Joe Smith 83 First Street Howard Ohio
758420012 Mary Scott 842 Vine Ave. Losantiville Ohio
102254896 Sam Jones 33 Elm St Paris New York
876512563 Sarah Ackerman 440 U.S. 110 Upton Michigan

Nehmen wir an, dass Sie nun die Adresse der einzelnen Mitarbeiter aufrufen möchten. Wählen Sie hierzu SELECT Statement wie im Folgenden:

SELECT FirstName, LastName, Address, City, State

FROM EmployeeAddressTable;

 

Im Folgenden sehen Sie das Ergebnis Ihrer Abfrage auf der Datenbank:

FirstName LastName Address City State
Joe Smith 83 First Street Howard Ohio
Mary Scott 842 Vine Ave. Losantiville Ohio
Sam Jones 33 Elm St Paris New York
Sarah Ackerman 440 U.S. 110 Upton Michigan

Zur Erklärung, was hier genau passiert ist: Sie haben in der Tabelle EmployeeAddressTable die Daten aufgerufen, speziell die Spalten FirstName, LastName, Address, City und State. Merken Sie, dass die Spaltennamen keine Leerzeichen beinhalten, sondern als ein Wort geschrieben werden und dass die Statements mit einem Semikolon (;) enden. Wenn man alle Zeilen abfragen möchte, lautet die generelle Form eines SELECT statements folgenderweise:

SELECT ColumnName, ColumnName,

FROM TableName;

 

Um alle Spalten einer Tabelle aufzurufen, ohne die Spaltennamen einzugeben, benutzen Sie:

SELECT * FROM TableName;

 

Jedes Datenbankverwaltungssystem (database management system DBMS) und jede Datenbanksoftware hat unterschiedliche Methoden, sich in die Datenbank einzuwählen und SQL Befehle einzugeben; sehen Sie hierzu im lokalen Computer Guru, um in das System zu gelangen und um genaue SQL zu benutzen.

 

Conditional Selection

Um weiter über die SELECT Statements zu diskutieren, betrachten wir eine neue Beispieltabelle (nur für den hypothetischen Gebrauch):

EmployeeStatisticsTable
EmployeeIDNo Salary Benefits Position
010 75000 15000 Manager
105 65000 15000 Manager
152 60000 15000 Manager
215 60000 12500 Manager
244 50000 12000 Staff
300 45000 10000 Staff
335 40000 10000 Staff
400 32000 7500 Entry-Level
441 28000 7500 Entry-Level

 

Relational Operations

Es gibt sechs Relational Operator in SQL. Nach einer kurzen Einführung dieses Operators werden wir uns der Benutzung wenden.

= Equal
<> or != (see manual) Not Equal
< Less Than
> Greater Than
<= Less Than or Equal To
>= Greater Than or Equal To

Die WHERE Klausel dient zur Spezialisierung, um nur bestimmte Zeilen abzubilden, die auf das Kriterium in der WHERE Klausel basieren. Meistens ist dies bereits verständlich, wenn man sich einige wenige Beispiele anguckt.

 

Falls Sie die EMPLOYEEIDNO sehen möchten, die gleich oder mehr als 50.000$ verdienen, benutzen Sie Folgendes:

SELECT EMPLOYEEIDNO

FROM EMPLOYEESTATISTICSTABLE

WHERE SALARY >= 50000;

 

Merken Sie, dass das >= (größer gleich oder gleich) Zeichen verwendet wird, weil wir sehen wollten, wer mehr als 50.000$ und wer genau 50.000$ verdient und diese sollen zusammen aufgelistet werden. Dies zeigt Folgendes:

 

EMPLOYEEIDNO

————

010
105
152
215
244

 

Die WHERE Beschreibung, SALARY >= 50000 ist als eine condition bekannt (eine Operation, die mit True oder False bewertet wird). Dasselbe gilt für Textspalten:

SELECT EMPLOYEEIDNO

FROM EMPLOYEESTATISTICSTABLE

WHERE POSITION = ‚Manager‘;

 

Dies bildet die ID Nummern aller Manager ab. Wählen Sie bei Textspalten generell gleich oder nicht gleich und vergewissern Sie sich, dass der Text, der erscheinen soll, mit einem einzelnen Anführungszeichen auf beiden Seiten des Textes umschlossen ist (‘).

 

More Complex Conditions: Compound Conditions / Logical Operators

Der AND Operator hat zwei oder mehr Konditionen und bildet eine Zeile nur ab, wenn die Datei dieser Zeile alle (ALL) aufgelisteten Konditionen erfüllt (z.B. alle Konditionen mit True). Beispielsweise: stellen Sie alle Mitarbeiter dar, die mehr als 40.000$ verdienen, verwenden Sie hierzu:

SELECT EMPLOYEEIDNO

FROM EMPLOYEESTATISTICSTABLE

WHERE SALARY > 40000 AND POSITION = ‚Staff‘;

 

Der OR Operator hat zwei oder mehr Konditionen, aber gibt die Zeile zurück, wenn irgendeine (ANY) der aufgelisteten Konditionen mit True erscheint. Um alle, die weniger als 40.000$ verdienen oder die weniger Vorteile als 10.000$ haben zu sehen (zusammen gelistet), benutzen Sie folgende Abfrage:

SELECT EMPLOYEEIDNO

FROM EMPLOYEESTATISTICSTABLE

WHERE SALARY < 40000 OR BENEFITS < 10000;

 

AND & OR can be combined, for example:

SELECT EMPLOYEEIDNO

FROM EMPLOYEESTATISTICSTABLE

WHERE POSITION = ‚Manager‘ AND SALARY > 60000 OR BENEFITS > 12000;

 

Zunächst einmal findet SQL die Zeilen, in denen das Gehalt größer ist als 60.000$ und die Spaltenposition ist gleich dem Manager. Bei Auswahl dieser neuen Liste mit den Zeilen sieht SQL, ob irgendwelche dieser Zeilen die vorherige AND Kondition erfüllt oder die Kondition, dass die Vorteilspalte größer ist als 12.000$. Anschließend bildet SQL nur die zweite neue Liste der Zeilen ab, vergisst dabei jedoch nicht, dass diejenigen mit Vorteilen über 12.000$ als OR Operator eingeführt werden, wenn auch die Ergebniskonditionen mit True vermerkt werden. Merke zudem, dass die AND Operation als Erste durchführt wird.

Um diesen Prozess zu generalisieren, durchführt SQL die AND Operation(en), um die Zeilen zu bestimmen, wo die AND Operationen True gehalten werden (Zur Erinnerung: alle Konditionen sind True). Danach werden diese Ergebnisse benutzt, um sie mit den OR Konditionen zu vergleichen und sie bilden nur die übrig gebliebenen Zeilen ab, wo eine der Konditionen, der von den OR Operator zusammengeführt wurden sind, True ist (wo eine Kondition oder ein Ergebnis aus einer AND mit einer anderen Kondition oder eines AND Ergebnisses zusammengepaart ist, um OR zu bewerten, welche als True bewertet wird, sobald beide Werte true sind). Mathematisch bewertet SQL alle Konditionen, dann die AND Paare und dann die ORs (wo beide Operatoren von links nach rechts bewerten).

Betrachtet man ein Beispiel, für eine gegebene Zeile, für die die DBMS die SQL Anweisung Where Klausel bewertet, um zu bestimmen, ob diese Zeile in dem Abfrage-Ergebnis erscheinen soll (die gesamte Where Klausel wird als True bewertet). Die DBMS hat die ganzen Konditionen bewertet und ist schon dabei, die logischen Vergleiche an diesem Ergebnis durchzuführen:

True AND False OR True AND True OR False AND False

First simplify the AND pairs:

False OR True OR False

Now do the OR’s, left to right:

True OR False

True

 

Das Ergebnis ist True, die Zeile durchhält die Abfrage Kondition. Fahren Sie bitte fort mit der nächsten Lektion der NOT’s und der Rangfolge der logischen Operationen. Ich hoffe, diese Lektion hat Ihnen geholfen, die AND’s oder OR’s zu verstehen, obwohl es sich um ein schwer erklärliches Thema handelt (vor allem dann, wenn man eine Version schreibt und der Editor die Veränderungen verliert).

Um OR’s vor AND’s zu benutzen, also wenn Sie eine Liste der Arbeitnehmer mit einem hohen Gehalt (>50.000$) oder einer hohen Vorteil Packung (>10.000$) sehen möchten, und dies nur, wenn man Manager ist, benutzen Sie Klammer:

SELECT EMPLOYEEIDNO

FROM EMPLOYEESTATISTICSTABLE

WHERE POSITION = ‚Manager‘ AND (SALARY > 50000 OR BENEFIT > 10000);

 

IN & BETWEEN

Eine einfache Methode für die Benutzung zusammengesetzter Konditionen geschieht mit IN oder BETWEEN. Wenn Sie beispielsweise alle Manager und Arbeitnehmer auflisten möchten:

SELECT EMPLOYEEIDNO

FROM EMPLOYEESTATISTICSTABLE

WHERE POSITION IN (‚Manager‘, ‚Staff‘);

 

oder wenn die mit größer als oder gleich 30.000$ auflisten möchten, aber weniger als oder gleich 50.000$, dann benutzen Sie:

SELECT EMPLOYEEIDNO

FROM EMPLOYEESTATISTICSTABLE

WHERE SALARY BETWEEN 30000 AND 50000;

 

Um alle aufzulisten, die nicht in dem Bereich vorhanden sind, versuchen Sie:

SELECT EMPLOYEEIDNO

FROM EMPLOYEESTATISTICSTABLE

WHERE SALARY NOT BETWEEN 30000 AND 50000;

 

Ähnlich, NOT IN listet alle Zeilen außer die aus der IN Liste.

Zudem können NOT’s zu den AND’s & OR’s dazugegeben werden, jedoch ist ein NOT ein unärer Operator (bewertet eine Kondition, umkehrt ihren Wert, wobei AND’s & OR’s zwei Konditionen bewerten). Weiterhin werden NOT’s vor den AND’s oder OR’s durchgeführt.

 

SQL Reihenfolge der Logical Operations (jede arbeitet von links nach rechts)

  1. NOT
  2. AND
  3. OR

 

LIKE benutzen

Betrachten Sie die EmployeeStatisticsTable und fordern Sie die Personen an, deren Nachnamen mit dem Buchstaben L beginnen, versuchen Sie Folgendes:

SELECT EMPLOYEEIDNO

FROM EMPLOYEESTATISTICSTABLE

WHERE LASTNAME LIKE ‚L%‘;

 

Das Prozentzeichen (%) zeigt an, welche möglichen Zeichen (Nummer, Buchstabe oder Satzzeichen) oder welche Zeichensätze nach dem L angezeigt werden. Um diese Personen mit dem Anfangsbuchstaben L zu finden, benutzen Sie ‚%L‘, oder ‚%L%‘, falls L in der Mitte des Wortes angezeigt werden soll. ‚%‘ kann für beliebige Zeichen in derselben Position verwendet werden. NOT LIKE zeigt die Zeilen an, die nicht der gegebenen Beschreibung passen. Weitere Möglichkeiten bezüglich der Benutzung von LIKE oder anderen aufgeführten Konditionen sind vorhanden, jedoch hängt es davon ab, welche DBMS benutzt wird; normalerweise sollte man ein Manual oder Systemmanager oder Administrator für die vorhandenen Eigenschaften auf dem eigenen System abfragen, um sicherzugehen, dass die durchzuführende Arbeit möglich und erlaubt ist. Eine mögliche Ablehnung des SQL wird im Folgenden besprochen. Diese Lektion dient nur dazu, eine Idee mit möglichen Abfragen zu gestatten, die in SQL eingegeben werden können.

 

Joins

In dieser Lektion werden wir nur die inner Joins und equijoins betrachten, weil diese generell am häufigsten verwendet werden. Für mehr Information klicken Sie auf die SQL Links am Ende dieses Dokuments.

Gute Datenbankdesigns zeigen, dass jede Tabelle nur Daten über eine einzelne entity auflistet, und detaillierte Information kann nur in einer relationalen Datenbank eingeholt werden, indem man zusätzliche Tabellen benutzt und ebenfalls ein join benutzt:

Betrachten Sie zunächst einmal diese Beispieltabellen:

AntiqueOwners
OwnerID OwnerLastName OwnerFirstName
01 Jones Bill
02 Smith Bob
15 Lawson Patricia
21 Akins Jane
50 Fowler Sam

 

Orders
OwnerID ItemDesired
02 Table
02 Desk
21 Chair
15 Mirror

 

Antiques
SellerID BuyerID Item
01 50 Bed
02 15 Table
15 02 Chair
21 50 Mirror
50 01 Desk
01 21 Cabinet
02 21 Coffee Table
15 50 Chair
01 15 Jewelry Box
02 21 Pottery
21 02 Bookcase
50 01 Plant Stand

 

Keys

Beginnen wir zunächst einmal mit dem Konzept der keys (Schlüssel). Ein primary key ist eine Spalte oder ein Spaltenset, der einmalig den Rest der Daten in einer beliebig gegebener Spalte identifiziert. Beispielsweise identifiziert die OwnerID Spalte einmalig die Zeile in der AntiqueOwners Tabelle. Dies hat zwei Bedeutungen: keine zwei Zeilen werden dieselbe OwnerID haben können. Auch wenn zwei Besitzer dieselben Vor- und Nachnamen haben, stellt die OwnerID Spalte sicher, dass die zwei Besitzer sich nicht gegenseitig verwirren, weil die einzigartige OwnerID Spalte den Besitzer durch die ganze Datenbank verfolgt, und nicht die Namen.

Ein foreign key ist eine Spalte in einer Tabelle, in der die Spalte einen Primärschlüssel gegenüber einer anderen Tabelle darstellt. Dies bedeutet, dass Daten in einer primary key Spalte eine entsprechende Datei in einer anderen Tabelle haben müssen, in der diese Spalte ein Primärschlüssel ist. In der DBMS-Sprache nennt man diese Korrespondenz referential integrity. Beispielsweise stellen in der Antiques Tabelle sowohl die BuyerID als auch die SellerID foreign keys dar, neben der AntiqueOwners Tabelle als primary key (OwnerID; man muss zunächst einmal ein AntiqueOwner sein, bevor man Objekte kaufen oder verkaufen kann). In beiden Tabellen werden die ID Zeilen für die Identifikation der Besitzer oder Käufer und Verkäufer genutzt und die OwnerID stellt die primary key der AntiqueOwner Tabelle dar. Mit anderen Worten, alle dieser ID Daten werden dazu verwendet, sich auf Besitzer, Käufer oder Verkäufer von Antiqua, sich selbst, ohne aktuelle Namen benutzen zu müssen.

 

Performing a Join

Der Grund für diese keys ist der, dass Daten über Tabellen zueinander zugeordnet werden können, ohne diese Daten in jeder Tabelle zu wiederholen – dies ist die Power der Relationalen Datenbanken. Beispielsweise kannst du den Namen der Personen finden, die einen Stuhl kauften, ohne deren vollen Namen in die Antique Tabelle einzugeben. Sie erhalten die Namen beim Zuordnen der Personen, die einen Stuhl kauften, mit den Namen in der AntiqueOwners Tabelle, indem Sie die OwnerID benutzen, welche die Daten in die zwei Tabellen zuordnet. Um die Namen der Personen zu finden, die einen Stuhl kauften, benutzen Sie folgende Abfrage:

SELECT OWNERLASTNAME, OWNERFIRSTNAME

FROM ANTIQUEOWNERS, ANTIQUES

WHERE BUYERID = OWNERID AND ITEM = ‚Chair‘;

 

Merken Sie sich Folgendes über diese Abfrage: beide zusammenhängenden Tabellen sind in der FROM Klausel der Statements aufgelistet. Beachten Sie erstens, dass in der WHERE Klausel der ITEM = ‚Chair‘ Part die Listing auf diejenigen beschränkt, die einen Stuhl kauften (in diesem Beispiel, besitzen). Zweitens, sehen Sie, dass die ID Spalten mit der Benutzung der BUYERID = OWNERID Klausel von einer Tabelle in die andere zugeordnet werden. Nur WHERE ID’s treffen sich über Tabellen und der erworben wurde ist ein Stuhl (wegen dem AND), die Namen werden aus der AntiqueOwners Tabelle aufgelistet. Da die Kondition für die Verbindung ein Gleichheitszeichen benutzt, wird diese Verbindung equijoin genannt. Das Ergebnis dieser Abfrage sind zwei Namen: Smith, Bob & Fowler, Sam.

 

Dot notation bezieht sich auf die Voranstellung der Tabellennamen zu Spaltennamen, um Doppeldeutigkeit zu verhindern:

SELECT ANTIQUEOWNERS.OWNERLASTNAME,

ANTIQUEOWNERS.OWNERFIRSTNAME

FROM ANTIQUEOWNERS, ANTIQUES

WHERE ANTIQUES.BUYERID = ANTIQUEOWNERS.OWNERID AND

ANTIQUES.ITEM = ‚Chair‘;

 

Da die Spaltennamen in jeder Tabelle unterschiedlich sind, war dies nicht notwendig.

 

DISTINGT und Eliminating Duplicates

Lassen Sie uns annehmen, dass Sie nur die Liste der ID und der Namen der Personen auflisten möchten, die eine Antiquität verkauft haben. Natürlich möchten Sie eine Liste, wo jeder Verkäufer nur einmal erscheint und Sie möchten nicht wissen, wie viele Antiquitäten die Person verkauft hat, sondern nur die Tatsache, ob diese Person eine verkauft hat (für die Anzahl, sehen Sie in der nächsten Lektion in die Aggregate Funktion). Dies bedeutet, dass Sie an SQL die Nachricht übermitteln müssen, dass dieser doppelte Zeilen eliminieren soll und jede Person nur einmal auflisten soll. Verwenden Sie dafür das Kennwort DISTINCT.

Zunächst einmal benötigen wir ein Equijoin in der AntiqueOwners Tabelle, um detaillierte Daten über den LastName und FirstName der Person zu erhalten. Merken Sie sich bitte, dass wenn die SellerID Spalte in der Antiquitäten Tabelle ein Fremdschlüssel für die AntiqueOwners Tabelle ist, dann wird ein Verkäufer nur aufgelistet, wenn es eine Zeile in der AntiqueOwners Tabelle gibt, in der die ID und die Namen vorhanden sind. Zudem möchten wir die mehrmaligen Erscheinungen der SellerID in unserer Liste eliminieren und benutzen dafür DISTINCT auf der Spalte, wo die Wiederholungen auftreten.

Nun möchten wir eine Alphabetisierung in der Liste nach LastName, dann FirstName (verknüpft auf LastName), und dann nach OwnerID (verknüpft auf LastName und FirstName). Dafür benutzen wir die ORDER BY Klausel:

SELECT DISTINCT SELLERID, OWNERLASTNAME, OWNERFIRSTNAME

FROM ANTIQUES, ANTIQUEOWNERS

WHERE SELLERID = OWNERID

ORDER BY OWNERLASTNAME, OWNERFIRSTNAME, OWNERID;

 

Wenn alle Personen ein Produkt verkauft haben, erhalten wir eine Liste mit allen Besitzern, alphabetisch nach ihren Nachnamen. Dieser Typ von Verbindung ist in der Kategorie inner joins.

 

Aliases & In/Subqueries

In dieser Lektion werden wir die Aliases, In und die Benutzung der Subqueries behandeln und wie diese in einem 3-Tabellen Beispiel benutzt werden können. Schauen Sie zunächst einmal auf die Abfrage, die den Namen des letzten Besitzers ausdruckt, der eine Bestellung aufgegeben hat und auch, was es für eine Bestellung ist. Nur die Bestellungen werden aufgelistet, die gefüllt werden können (dies bedeutet, dass es einen Käufer gibt, der diesen bestellten Artikel besitzt):

SELECT OWN.OWNERLASTNAME Last Name, ORD.ITEMDESIRED Item Ordered

FROM ORDERS ORD, ANTIQUEOWNERS OWN

WHERE ORD.OWNERID = OWN.OWNERID

AND ORD.ITEMDESIRED IN

(SELECT ITEM

FROM ANTIQUES);

 

Dies gibt:

Last Name Item Ordered

————–  —————–

Smith             Table

Smith             Desk

Akins             Chair

Lawson         Mirror

 

Es gibt mehrere Dinge, die Sie über diese Abfrage wissen sollten:

  1. Die ‚LastName‘ und ‚Item Ordered‘ in der Select Line geben die Überschriften auf dem Report an.
  2. OWN & ORD sind Alias; diese sind neue Namen für die beiden Tabellen, die in der FROM Klausel aufgelistet sind und als Vorzeichen für alle dot notations der Spaltennamen in der Abfrage dienen (siehe oben). Dies eliminiert Mehrdeutigkeiten, vor allem in der equijoin WHERE Klausel, in der beide Tabellen die Spaltennamen OwnerID besitzen. Zudem benachrichtigt die Punktnotation in SQL darüber, dass wir über zwei verschiedene OwnerID’s aus zwei verschiedenen Tabellen sprechen.
  3. Sehen Sie, dass die Bestellungstabelle zunächst in der FROM Klausel gelistet ist; dies garantiert, dass das Listen der Tabelle fertig ist, und die AntiqueOwners-Tabelle nur für detaillierte Informationen benutzt wird (Last Name).
  4. Das allerwichtigste ist, dass AND in der WHERE Klausel die In Subquery zwingt, aufgerufen zu werden (‚=ANY‘ oder ‚=SOME‘ sind zwei gleiche Benutzungen des IN). Die Subquery wird ausgeführt, indem alle Artikel aus der Antiquitäten-Tabelle zurückgegeben werden, bis es keine WHERE Klausel mehr gibt. Anschließend gilt für eine Zeile aus der Orders-Tabelle, dass die ItemDesired in die zurückgegebene Liste aus Artikeln. Sie können sich das so vorstellen: die subquery stellt eine Reihe von Artikeln, in der jede ItemDesired in der Orders-Tabelle verglichen wird; die in der Bedingung True ist, wenn die ItemDesired in dem zurückgegebenem Satz aus der Antiquitäten-Tabelle zutrifft.
  5. Beachten Sie zudem, dass, wenn IN, ‚=ANY’, oder ‚=SOME’ benutzt wird, dass diese Schlüsselbegriffe sich zu alle möglichen Zeilen beziehen, und nicht Spalten. Sie können nicht mehrere Spalten in die subquery als Select-Klausel legen.

 

Miscellaneous SQL Statement    

Aggregate Funktion

Ich werde nun fünf wichtige aggregate Funktion erläutern: SUM, AVG, MAX, MIN und COUNT. Diese werden aggregate Funktion genannt, weil sie die Ergebnisse der Abfragen zusammenfassen und nicht die Zeilen auflisten.

  • SUM () gibt die Summe aller Zeilen, indem die Konditionen der gegebenen Spalten zufriedengestellt werden, bei der die gegebene Spalte numerisch ist.
  • AVG () gibt den Durchschnitt der gegebenen Spalten an.
  • MAX () gibt die größte Zahl in der gegebenen Spalte an.
  • MIN () gibt die kleinste Zahl in der gegebenen Spalte an.
  • COUNT (*) gibt die Nummer der Zeilen an, die die Konditionen zufrieden stellen.

 

Wenn wir uns die Tabellen am Anfang dieses Dokumentes anschauen, betrachten wir weiterhin drei Beispiele:

SELECT SUM(SALARY), AVG(SALARY)

FROM EMPLOYEESTATISTICSTABLE;

 

Diese Abfrage zeigt die Summe aller Gehälter in der Tabelle an und auch den Durchschnittsgehalt aller Einträge in der Tabelle.

SELECT MIN(BENEFITS)

FROM EMPLOYEESTATISTICSTABLE

WHERE POSITION = ‚Manager‘;

 

Diese Abfrage gibt die kleinste Zahl der Vorteilsspalten an, von den Mitarbeitern, die Manager sind, und zwar 12500.

SELECT COUNT(*)

FROM EMPLOYEESTATISTICSTABLE

WHERE POSITION = ‚Staff‘;

 

Diese Abfrage erklärt Ihnen, wie viele Arbeitgeber Personalstatus besitzen (3).

 

Views

In SQL sollten Sie (schauen Sie in Ihrer DBA) Zugang haben, um views für Sie selbst kreieren zu können. Eine view überträgt die Ergebnisse einer Abfrage in eine neue, persönliche Tabelle, welche Sie auch für andere Abfragen benutzen können, in der diese neue Tabelle den view-Namen aus der FROM Klausel erhält. Wenn Sie in eine view eintreten, wird die Abfrage in Ihrer view creation Statement ausgeführt (allgemein). Die Ergebnisse dieser Abfrage sehen genauso aus, wie in einer anderen Tabelle in der Abfrage, die Sie geschrieben haben unter Ausführung der view. Beispielsweise, um eine view zu kreieren:

CREATE VIEW ANTVIEW AS SELECT ITEMDESIRED FROM ORDERS;

 

Schreiben Sie nun eine Abfrage, indem Sie diese view als eine Tabelle benutzen, wo die Tabelle nur eine Auflistung aller Items, die aus der Bestellungstabelle verlangt werden:

SELECT SELLERID

FROM ANTIQUES, ANTVIEW

WHERE ITEMDESIRED = ITEM;

 

Die Abfrage zeigt alle SellerID aus der Antiques-Tabelle, in der das Item in der Tabelle als Antview Sicht erscheint, welches alles an den Items abbildet, das das Einzige in der Orders Tabelle ist. Die Listing wird gebildet, indem Sie die Antique-Items eins-zu-eins durcharbeiten, bis eine Übereinstimmung mit der Antview-Sicht. Views können dazu verwendet werden, Datenbank-Zugriffe einzuschränken, und eine komplexe Abfrage vereinfachen.

 

Creating New Tables

Alle Tabellen innerhalb einer Datenbank müssen in einem bestimmten Zeitpunkt kreiert werden… schauen wir, wie wir die Order-Tabelle erstellen:

CREATE TABLE ORDERS

(OWNERID INTEGER NOT NULL,

ITEMDESIRED CHAR(40) NOT NULL);

 

Dieses Statement gibt die Tabellennamen und benachrichtigt die DBMS über jede Spalte in der Tabelle. Beachten Sie bitte, dass dieses Statement generische Datentypen benutzt, und dass die Datentypen unterschiedlich sein können, abhängig davon, welche DBMS Sie benutzen. Üblicherweise, checken Sie lokale Listings. Einige allgemein generische Datentypen sind:

  • Char(x) – Eine Spalte mit Eigenschaften, in der x eine Nummer ist, die die maximalen Nummer der Eigenschaften nennt, die in der Spalte erlaubt sind (maximum length).
  • Integer – Eine Spalte aus ganzen Nummern, positiv oder negativ.
  • Decimal(x, y) – Eine Spalte mit Dezimalzahlen, wo x die maximale Länge an Ziffern der Dezimalnummern in dieser Spalte ist und y die maximale Nummer der Ziffern, die nach dem Dezimalpunkt erlaubt ist. Das maximale (4,2) Nummer würde 99.99 sein.
  • Date – Eine Spalte mit Daten in einem DBMS-spezifischen Format.
  • Logical – Eine Spalte, die nur zwei Werte beinhalten kann: TRUE oder FALSE.

 

Eine weitere Bemerkung: NOT NULL bedeutet, dass die Spalte einen Wert in jeder Zeile haben muss. Wenn NULL verwendet wurde, diese Spalte sollte in einer gegebenen Zeile frei gelassen sein.

 

Altering Tables

Lassen Sie uns eine Spalte in die Antique Tabelle hinzufügen, um eine Eingabe des Preises eines gegebenen Produktes zu erlauben:

ALTER TABLE ANTIQUES ADD (PRICE DECIMAL(8,2) NULL);

Die Daten für diese neue Spalte kann sowohl aktualisiert als auch zwischengelegt werden, dies sehen Sie im späteren Verlauf dieses Dokumentes.

 

Adding Data

Um in die Tabelle Zeilen hinzuzufügen, benutze Folgendes:

INSERT INTO ANTIQUES VALUES (21, 01, ‚Ottoman‘, 200.00);

Somit wird die Datei al seine neue Zeile in die Tabelle eingefügt, Spalte-für-Spalte, in den vordefinierten Ordner. Lassen Sie uns stattdessen die Reihenfolge ändern und den Preis freilassen:

 

INSERT INTO ANTIQUES (BUYERID, SELLERID, ITEM)

VALUES (01, 21, ‚Ottoman‘);

 

Deleting Data

Lassen Sie uns nun die neue Zeile erneut aus der Datenbank löschen:

DELETE FROM ANTIQUES

WHERE ITEM = ‚Ottoman‘;

 

Falls es jedoch eine weitere Zeile mit ‚Ottoman‘ gibt, wird diese Zeile ebenfalls gelöscht. Lassen Sie uns alle Zeilen löschen (eine, in diesem Fall), welche die spezifische Datei beinhaltet, die wir vorher hinzugefügt hatten:

DELETE FROM ANTIQUES

WHERE ITEM = ‚Ottoman‘ AND BUYERID = 01 AND SELLERID = 21;

 

Updating Data

Lassen Sie uns einen Preis in einer Zeile aktualisieren, die noch keinen Preis aufgelistet hat:

UPDATE ANTIQUES SET PRICE = 500.00 WHERE ITEM = ‚Chair‘;

 

Dies setzt alle Preise von Stühlen auf 500,00. Oben können Sie sehen, dass mehrere WHERE Konditionale, die ein AND benutzen, verwendet werden müssen, um die Aktualisierung zu spezifischeren Zeilen zu limitieren. Zudem sollten weitere Spalten gesetzt werden, die durch ein Komma voneinander getrennt werden.

 

Miscellaneous Topics

Indexes

Indexe erlauben einer DBMS, schneller an Daten zu gelangen (achten sie bitte: diese Eigenschaft ist nicht standard/ nicht vorhanden in allen Systemen). Das System entwickelt diese interne Datenstruktur (Index), welche eine Auswahl von Zeilen hervorruft, wenn die Auswahl an indizierten Spalten angewiesen ist, um schneller zu arbeiten. Dieser Index gibt dem DBMS die Information, wo sich eine bestimmte Zeile in der Tabelle befindet, mit indizierten Spaltenwerte, wie ein Buchverzeichnis, das uns die Seiten zeigt, in denen sich ein bestimmtes Wort befindet. Lassen Sie uns einen Index für die OwnerID in der AntiqueOwners Spalte erstellen:

CREATE INDEX OID_IDX ON ANTIQUEOWNERS (OWNERID);

 

Nun auf den Namen:

CREATE INDEX NAME_IDX ON ANTIQUEOWNERS (OWNERLASTNAME,

OWNERFIRSTNAME);

 

Um einen Index zu beseitigen, benutzen Sie ‚drop‘:

DROP INDEX OID_IDX;

 

Übrigens können Sie auch eine Tabelle ‚droppen‘ (Vorsicht! – dies bedeutet, dass diese Tabelle gelöscht wird). In dem zweiten Beispiel wird der Index in den zwei Spalten gehalten, miteinander aggregiert. Ein merkwürdiges Verhalten kann in dieser Situation auftreten… prüfen Sie zunächst einmal das Handbuch, bevor Sie diese Operation durchführen.

Einige DBMS’s erzwingen keinen Primärschlüssel; mit anderen Worten, die Einzigartigkeit einer Spalte ist nicht gezwungenermaßen automatisch. Das bedeutet, beispielsweise versuchte ich eine andere Zeile in die AntiqueOwners Tabelle einzufügen mit einer OwnerID von 02, einige Systeme werden mir dies erlauben, trotzdem tuen wir es nicht, da die Spalte einmalig für diese Tabelle sein sollte (jeder Zeilenwert sollte unterschiedlich sein). Ein Weg dafür ist, einen einzigartigen Index für die Spalte zu erstellen, die ein Primärschlüssel abbilden soll, um das System zu zwingen, um Duplikaturen zu verbieten:

CREATE UNIQUE INDEX OID_IDX ON ANTIQUEOWNERS (OWNERID);

   

GROUP BY & HAVING

Eine besondere Benutzung von GROUP BY ist die Assoziierung der aggregierten Funktionen mit den Groups of Row. Nehmen Sie zunächst einmal an, dass die Antiques-Tabelle eine Preisspalte hat und jede Zeile einen Wert für diese Spalte darstellt. Wir möchten den Preis vom teuersten Item der einzelnen Besitzer sehen. Somit müssen wir SQL mitteilen, den Erwerb der Besitzer zu gruppieren und uns den maximalen Erwerbspreis mitzuteilen:

SELECT BUYERID, MAX(PRICE)

FROM ANTIQUES

GROUP BY BUYERID;

 

Nehmen wir nun an, dass wir nur den maximalen Erwerbspreis sehen möchten, wenn der Erwerb über 1000$ ist. Hierfür benutzen wir die HAVING Klausel:

SELECT BUYERID, MAX(PRICE)

FROM ANTIQUES

GROUP BY BUYERID

HAVING PRICE > 1000;

 

More Subqueries

Eine weitere gewöhnliche Benutzung der Subqueries beinhaltet die Benutzung von Operators, um eine WHERE Kondition zu ermöglichen und den Select Output einer Subquery einzufügen. Beginnen Sie mit dem Listen der Käufer, die einen teuren Produkt gekauft haben (der Preis des Produktes ist 100$ größer, als der Durchschnittspreis aller erworbenen Produkte):

SELECT BUYERID

FROM ANTIQUES

WHERE PRICE >

SELECT AVG(PRICE) + 100

FROM ANTIQUES);

Die Subquery kalkuliert den Durchschnittspreis und addiert 100$. Anhand dieser Zahl wird ein OwnerID für jedes Produkt ausgedruckt, welches mehr kostet als diese Zahl. Wir könnten DISTINCT OWNERID verwenden, um Duplikate zu eliminieren.

Listen Sie die Nachnamen von denen in der AntiqueOqners Tabelle, nur (ONLY), wenn diese ein Produkt gekauft haben:

SELECT OWNERLASTNAME

FROM ANTIQUEOWNERS

WHERE OWNERID IN

(SELECT DISTINCT BUYERID

FROM ANTIQUES);

 

Die subquery gibt eine Liste mit Käufern zurück und der Nachname wird für einen Antique Besitzer ausgedruckt, wenn die ID des Besitzers in der subquery Liste erscheint (manchmal bekannt als candidate list). Merke: in manchen DBMS’s kann man equal benutzen anstatt von IN, jedoch ist IN eine bessere Wahl, wenn ein Set von der subquery zurückgegeben wird.

 

Im Folgenden sehen wir ein Beispiel für ein Update. Der Gentleman, der ein Bücherregal kaufte, hat in der Datenbank einen falschen Namen… er heisst eigentlich John:

UPDATE ANTIQUEOWNERS

SET OWNERFIRSTNAME = ‚John‘

WHERE OWNERID =

(SELECT BUYERID

FROM ANTIQUES

WHERE ITEM = ‚Bookcase‘);

 

Zuerst findet die subquery die BuyerID der Person(en), die ein Bücherregal kaufte(n), dann wird der Vorname durch die äußere Query aktualisiert.

 

Erinnern Sie sich an die folgende Regel über subqueries: Wenn Sie eine subquery als Teil einer WHERE Kondition haben, muss die Select Klausel in der subquery Spalten haben, die mit der Nummer und dem Typ mit denen in der Where Klausuel der äußeren query übereinstimmen. Mit anderen Worten, falls Sie ‚WHERE ColumnName = (SELECT…);‘ haben, Select muss nur eine Spalte da drin haben, um mit der ColumnName der äußeren Where Klausel übereinzustimmen, zudem müssen Sie in ihrer Art identisch sein (beide integer, oder beider mit den Eigenschaften String, etc.).

 

EXISTS & ALL

EXISTS benutzt eine Subquery als eine Kondition, in der die Kondition gleich TRUE ist, wenn die Subquery eine beliebige Zeile zurückgibt und sie ist gleich FALSE, wenn die Subquery keine Zeile zurückgibt; dies ist eine nicht-intuitive Eigenschaft mit einigen einmaligen Benutzungen. Wenn ein potenzieller Kunde die Liste mit den Owners nur dann sehen möchte, wenn der Shop mit Chairs zu tun hat, dann versuche:

SELECT OWNERFIRSTNAME, OWNERLASTNAME

FROM ANTIQUEOWNERS

WHERE EXISTS

(SELECT *

FROM ANTIQUES

WHERE ITEM = ‚Chair‘);

 

Wenn in der Antique Spalte Chairs vorhanden sind, würde die subquery eine Zeile oder mehrere Zeilen zurückgeben, indem die EXISTS Klausel TRUE gesetzt wird. Als Ergebnis listet SQL die Antique Owners. Falls keine Chairs vorhanden wären, wären keine Zeilen von der äußeren Abfrage zurückgegeben.

ALL ist eine weitere ungewöhnliche Eigenschaft, da alle (ALL) Abfragen für gewöhnlich mit verschiedenen und möglichst einfachen Methoden bearbeitet werden. Eine Beispiel-Abfrage ist die Folgende:

SELECT BUYERID, ITEM

FROM ANTIQUES

WHERE PRICE >= ALL

(SELECT PRICE

FROM ANTIQUES);

 

Dies wird die Artikel mit den größten Preisen und Ihre Käufer zurückgeben (oder bei einer Anknüpfung mehr als ein Artikel). Die Subquery gibt eine Liste aller Preise in der Antiquitäten-Tabelle und die äußere Abfrage geht durch jede Zeile der Antiquitäten-Tabelle, und wenn ihr Preis größer oder gleich die ganzen (ALL) Preise in der Liste ist, ist es aufgelistet, indem die größten Preise der Artikel gegeben werden.

 

UNION & Outer Joins (kurz erklärt)

Es gibt Gelegenheiten, wo Sie vielleicht die Ergebnisse von mehreren Abfragen zusammen sehen möchten, kombiniert mit ihrer Ausgabe; verwenden Sie UNION. Um die Ausgabe der folgenden zwei Abfragen zusammenzuführen, indem die IDs aller Käufer sowie alle diejenigen, die eine Bestellung aufgegeben haben, aufgezeigt werden:

SELECT BUYERID

FROM ANTIQUES

UNION

SELECT OWNERID

FROM ORDERS;

 

Beachten Sie, dass SQL erfordert, dass die Select-Liste (der Spalten) Spalte für Spalte als Datentyp übereinstimmen muss. In diesem Fall haben BuyerID und OwnerID die gleichen Datentypen (Integer). Beachten Sie auch, dass SQL eine automatische duplikat Elimination durchführt, wenn UNION verwendet wird (als wären sie zwei „Gruppen“); in einzelnen Fragen müssen Sie DISTINCT verwenden.

Die Outer Join (äußere Verknüpfung) wird verwendet, wenn eine Join-Abfrage „united“ („geeint“) ist mit den Zeilen, die nicht in der Join enthalten sind. Sie sind besonders nützlich, wenn konstante Text „Flags“ einbezogen werden. Siehe zunächst einmal die Abfrage:

SELECT OWNERID, ‚is in both Orders & Antiques‘

FROM ORDERS, ANTIQUES

WHERE OWNERID = BUYERID

UNION

SELECT BUYERID, ‚is in Antiques only‘

FROM ANTIQUES

WHERE BUYERID NOT IN

(SELECT OWNERID

FROM ORDERS);

 

Die erste Abfrage durchführt eine Verknüpfung, um beliebige Eigentümer, die in beiden Tabellen sind, aufzulisten sind diese in der tag line. Die UNION verbindet diese Liste mit der nächsten Liste. Die zweite Liste wird zunächst von einer Liste dieser IDs, die nicht in der Orders-Tabelle aufgelistet sind, generiert, indem eine Liste mit ID’s ausgeschlossen von der Verbindungs-Abfrage erzeugt wird. Dann wird jede Zeile in der Antiquitäten-Tabelle gescannt, und wenn die BuyerID nicht in dieser Ausschluss-Liste ist, ist es mit seiner notierten Tag aufgeführt. Es könnte einen einfacheren Weg geben, um diese Liste zu erstellen, jedoch ist es schwierig, die Warteschlange als String zu generieren.

Dieses Konzept ist sinnvoll, wenn ein Primärschlüssel zu einem Fremdschlüssel zugeordnet werden kann, aber der Fremdschlüsselwert für einige Primärschlüssel NULL ist. Beispielsweise ist in einer Tabelle der Primärschlüssel ein Verkäufer, und in einer anderen Tabelle sind es Kunden mit ihren Vertriebsmitarbeiter, aufgeführt in der gleichen Zeile. Allerdings, wenn ein Verkäufer keine Kunden hat, wird der Name dieser Person nicht in der Kunden-Tabelle aufgeführt. Die äußere Verknüpfung wird verwendet, wenn die Auflistung aller (all) Verkäufer mit ihren Kunden gedruckt werden soll, egal ob der Verkäufer einen Kunden hat oder nicht – das heißt, dass kein Kunde gedruckt wird ( eine logische NULL-Wert ), wenn der Verkäufer keinen Kunden hat, ist aber in der Verkäufer-Tabelle. Andernfalls wird der Verkäufer mit jedem Kunden aufgelistet.

Ein weiterer wichtiger Punkt über NULLs hat mit Verknüpfungen zu tun: die Reihenfolge der Tabellen in der From-Klausel ist sehr wichtig. Die Regel besagt, dass SQL die zweite Tabelle in die erste einfügt (add). Die erste aufgelistete Tabelle hat Zeilen mit einer Null auf der Verknüpfungs-Spalte. Wenn die zweite Tabelle eine Zeile mit einer Null auf der Verknüpfungs-Spalte hat, wird diese Zeile aus der zweiten Tabelle nicht verbunden, und wird daher mit den Daten der Zeilen der ersten Tabelle berücksichtigt. Dies ist eine weitere Gelegenheit (falls Sie wünschen, dass im Daten im Ergebnis auftauchen), wo eine äußere Verknüpfung häufig verwendet wird. Das Konzept der Null‘s ist wichtig. Daher ist es lohnenswert, sich näher mit diesem Thema zu beschäftigen.

 

Common SQL Questions—Advanced Topics

  1. Warum kann ich nicht die ersten drei Zeilen der Tabelle aufrufen? – Weil in relationalen Datenbanken die Zeilen nicht in einzelnen Reihenfolgen eingesetzt werden, denn das System setzt sie in beliebiger Reihenfolge, sodass Sie nur Zeilen mit SQL Eigenschaften aufrufen können, wie beispielsweise ORDER BY, usw.
  2. Was ist ein DDL und DML? – DDL (Data Definition Language) bezieht sich (in SQL) auf das Create-Table-Statement. DML (Data Manipulation Language) bezieht sich auf die Select, Update, Insert und Delete Statements.
  3. Sind Datenbank-Tabellen nicht einfach nur Dateien? – DBMS’s lagern Daten in Dateien, die von Systemmanagern deklariert werden, bevor neue Tabellen erstellt werden (auf großen Systemen). Aber das System lagert die Daten in ein spezielles Format und kann Daten von einer Tabelle über mehrere Dateien streuen. In der Datenbankenwelt nennt man eine Sammlung von Dateien, die für eine Datenbank erstellt wurde, tablespace. Im Allgemeinen ist in kleinen Systemen alles bezüglich Datenbanken (Definitionen und Tabellendaten) in einer Datei gespeichert.
  4. (Verwandte Frage) Ist die Datenbanktabelle nicht einfach nur eine Tabellenkalkulation? – Nein, aus zwei Gründen. Erstens, Tabellenkalkulationen können Daten in einer Zelle haben, aber eine Zelle ist mehr als eine Zeile-Spalten-Schnittstelle. Abhängig von der Tabellenkalkulations-Software kann eine Zelle kann zudem Formeln und Formate beinhalten, welche Datenbank-Tabellen (derzeit) nicht haben können. Zweitens, Tabellenkalkulations-Zellen sind oftmals von Daten aus anderen Zellen abhängig. In Datenbanken sind ‚Zellen‘ unabhängig, außer wenn Spalten logisch miteinander verknüpft sind (hoffentlich; eine Zeile mit mehreren Spalten zusammen beschreibt eine Entity), und anders als in Primärschlüssel und Fremdschlüssel- Bedingungen, jede Spalte einer Tabelle ist unabhängig von der anderen.
  5. Wie importiere ich eine Textdatei in eine Datenbank? – Dies ist nicht direkt möglich. Hierfür müssen Sie ein Hilfsmittel, wie Oracle’s SQL*Loader benutzen, oder ein Programm schreiben, um die Daten in die Datenbank zu laden. Ein Program, das dies tut, würde einfach durch jede Aufzeichnung einer Textdatei gehen, diese in Spalten aufteilen, und eine Einfügung in die Datenbank durchführen.
  6. Was ist ein Schema? – Ein Schema ist ein logischer Satz aus Tabellen, wie die Antiquitäten-Datenbank oben. Für gewöhnlich wird einfacher als „die Datenbank“ angesehen, aber eine Datenbank kann mehr als nur ein Schema beinhalten. Beispielsweise ist ein Star Schema ein Satz aus Tabellen, wo ein eine große zentrale Tabelle die ganzen wichtigen Informationen hält und ist via Fremdschlüssel mit Dimension-Tabellen verlinkt, die Detailinformationen verfügen und die in einer Verbindung zur Erstellung von detaillierten Reports benutzt werden können.
  7. Zeigen Sie mir ein Beispiel für ein Outer Join. – Also, aus den Fragen, die ich bekam, ist dies ein sehr gewöhnliches Beispiel. Ich werde Ihnen sowohl die Oracle als auch die Access Abfrage aufzeigen.

Sehen Sie sich die folgende Arbeitnehmer-Tabelle an (den Arbeitnehmern wurden Nummern verteilt, für Vereinfachungszwecke):

Name Department
1 10
2 10
3 20
4 30
5 30

 

Nun stellen Sie sich eine Department-Tabelle vor:

Department
10
20
30
40

 

Nehmen Sie nun an, dass Sie die Tabellen miteinander verknüpfen möchten, wo Sie alle Arbeitnehmer und Departments zusammen sehen. Um „null“ Werte aus der employee Tabelle zu erhalten, müssten Sie einen anderen outer join nutzen.

In der Literatur “Oracle: the Complete Reference”, handelt über outer joins. Denke Sie an das (+), welches umgehend nach der Verbindungsspalte der Tabellenspalte folgen muss. So fügen Sie immer dann eine Extrazeile hinzu, wenn keine Übereinstimmung stattfindet. Probieren Sie diese Abfrage in Oracle aus (the + goes on Employee, which adds the null row on no match):

Select E.Name, D.Department

From Department D, Employee E

Where E.Department(+) = D.Department;

 

Dies ist eine linke (outer) Verknüpfung, in Access:

SELECT DISTINCTROW Employee.Name, Department.Department

FROM Department LEFT JOIN Employee ON Department.Department = Employee.Department;

 

Und Sie werden dieses Ergebnis erhalten:

Name Department
1 10
2 10
3 20
4 30
5 30
40

 

  1. Welche generellen Tipps würden Sie mir geben, damit ich meine SQL-Abfragen und Datenbanken besser und schneller gestalten kann (optimieren)?
    • Sie sollten, wenn möglich, Ausdrücke in Selects, wie SELECT ColumnA + ColumnB, usw vermeiden.
    • Minimiere die Zahl der Spalten, die in einer Group By Klausel beinhaltet sind.
    • Falls Sie eine Verknüpfung benutzen, versuchen Sie die Spalten in Tabellen zusammenzufügen (von beiden Tabellen).
    • Bei Zweifel, nutzen Sie den Index.
    • Wenn Sie nicht eine mehrfache Zahl oder eine komplexe Abfrage durchführen, benutzen Sie COUNT (*) (die Zahl der Zeilen, generiert von der Abfrage), lieber als COUNT (Column_Name).
  2. Was ist Normalization? – Normalization ist eine Technik der Datenbankdesign, das nahe legt, dass bestimmte Kriterien bei der Konstruktion eines Tabellen-Layout (Entscheidung, welche Spalten jede Tabelle haben wird, und die Schaffung der Schlüsselstruktur). Die Idee hier ist die Eliminierung der Redundanz der non-key Daten quer durch die Tabellen. Normalization wird in der Regel in Bezug auf die Formen genannt. Ich werde nur die ersten drei vorstellen, obwohl es bekannt ist als übliche Formen (fourth, fifth, Boyce-Codd, usw.).

Erste Normalform bezieht sich auf das Verschieben von Daten in separaten Tabellen, wo die Daten in jeder Tabelle von ähnlicher Art sind und wo jeder Tabelle ein Primärschlüssel gegeben wird.

Das Legen der Daten in die zweite Normalform beinhaltet die Entfernung zu anderen Tabellen-Daten, die nur von einem Teil des Schlüssels abhängig ist. Zum Beispiel, wenn ich die Namen der Antiquitäten-Eigentümer in der Items-Tabelle lassen würde, würde das nicht in der zweiten Normalform sein, weil diese Daten redundant wäre; der Name würde für jedes Element wiederholt werden; als solche wurden die Namen in ihre eigenen Tabellen gesetzt. Die Namen selbst haben nichts mit den Items zu tun, sondern nur die Identität der Käufer und Verkäufer.

Die dritte Normalform beinhaltet das Loswerden von etwas in den Tabellen, die nicht allein von dem Primärschlüssel abhängen.

Es gibt eine gewisse Redundanz zu jeder Form, und wenn Daten in der 3NF (Kurzform für die 3. Normalform), ist es bereits in der 1NF und 2NF. In Bezug auf das Daten-Design sollen Daten so geordnet werden, dass alle Nicht- Primärschlüssel-Spalten nur von den gesamten Primärschlüssel abhängig sind. Wenn Sie einen Blick auf die obigen Beispiele nehmen, werden Sie sehen, dass der Weg durch die Datenbank zu navigieren durch Joins mit gemeinsamen Schlüsselspalten geht.

Zwei weitere wichtige Punkte im Datenbank-Design sind die Benutzung von guten, konsistenten, logischen, vollständigen Namen für die Tabellen und Spalten, und die Verwendung von vollständigen Wörtern in der Datenbank. Am letzten Punkt angelangt wird man sehen, dass meine Datenbank unvollständig ist, da ich numerische Codes zur Identifikation verwende. Normalerweise ist es am besten , wenn möglich, sich Schlüssel einfallen zu lassen, die selbsterklärend sind; Beispielsweise ist ein guter Schlüssel der, für den man die ersten vier Buchstaben des Nachnamens und den ersten Anfangsbuchstaben des Eigentümers, wie JONEB für Bill Jones (oder für „tiebreaking“ Zwecke, fügen Sie Zahlen an das Ende hinzu, um bei zwei oder mehreren Personen mit ähnlichen Namen unterscheiden zu können, wie z.B.: JONEB1, JONEB2, etc.) verwendet.

  1. Was ist der Unterschied zwischen single-row query und multiple-row query und warum ist es wichtig, den Unterschied zu kennen? – Erstens, eine single-row query ist eine Abfrage, die eine Zeile als Ergebnis herausgibt und eine multiple-row query ist eine Abfrage, die mehr als eine Zeile als Ergebnis herausgibt. Ob eine Abfrage eine Zeile oder mehrere Zeilen herausgibt ist einzig und allein abhängig von der Konstruktion (oder Schema) der Tabellen der Datenbank. Als Abfragenersteller müssen Sie sich über das Schema bewusst sein, Sie müssen darauf achten, dass genügend Bedingungen aufgenommen werden und dass Sie Ihre SQL-Anweisungen richtig strukturieren, so dass Sie zum gewünschten Ergebnis kommen (entweder eine oder mehrere Zeilen). Beispielsweise, wenn Sie sich sicher sein wollen, dass eine Abfrage aus der AntiqueOwners-Tabelle nur eine Zeile herausgeben soll, achten Sie auf einen gleichen Zustand der Primärschlüssel-Spalte, OwnerID.Aus drei Gründen ist dies von großer Bedeutung: Erstens, wenn Sie multiple-rows erhalten, obwohl Sie single-rows erwarten oder umgekehrt, dann kann dies bedeuten, dass Ihre Abfrage fehlerhaft ist, die Datenbank unvollständig ist oder aber Sie lernen einfach etwas Neues dazu. Zweitens, wenn Sie ein Update oder eine Delete-Anweisung verwenden, sollten Sie zunächst einmal sicher gehen, dass Ihre erstellte Anweisung, die Operation an der gewünschten Zeile (oder Zeilen) durchführt… oder Sie können mehr Zeilen als beabsichtigt löschen oder aktualisieren. Drittens, alle Abfragen, die in der eingebauten SQL geschrieben sind, müssen gut durchdacht sein, was die Zahl der herausgegebenen Zeilen betrifft. Wenn Sie eine single-row query schreiben, muss nur eine SQL-Anweisung ausgeführt werden, um die erforderliche Programmierlogik zu vervollständigen. Wenn Ihre Abfrage jedoch mehrere Zeilen herausgibt, müssen Sie die Fetch-Anweisung verwenden, und sehr wahrscheinlich wird eine Art von Schleifenstruktur in Ihrem Programm erforderlich, um die Verarbeitung auf jeder herausgegebenen Zeile der Abfrage zu wiederholen.
  1. Was sind relationships (Beziehungen)? – Ein weitere Design-Frage… der Begriff „relationships“ (oft als „relation“) bezieht sich für gewöhnlich auf die Beziehungen zwischen Primär-und Fremdschlüssel zwischen den Tabellen. Dieses Konzept ist wichtig, weil, wenn die Tabellen einer relationalen Datenbank designt sind, müssen diese Beziehungen definiert werden, da sie bestimmen, welche Spalten Primär- oder Fremdschlüssel sind oder nicht sind. Sie kennen bereits das Entity-Relationship- Diagramm, das eine grafische Darstellung von Tabellen in einem Datenbank-Schema ist, mit Linien, die die Spalten in den Tabellen verbindet. Betrachten Sie das Beispieldiagramm am Ende dieses Abschnitts oder einige der unten aufgeführten Websites in Bezug auf dieses Thema, da es viele verschiedene Möglichkeiten gibt, E-R-Diagramme zu zeichnen. Aber lassen Sie uns zunächst einmal die Arten von relationships betrachten…Eine One-to-one relationship bedeutet, dass Sie eine Primärschlüsselspalte haben, die auf eine Fremdschlüsselspalte verknüpft ist, und dass es für jeden Primärschlüsselwert ein Fremdschlüsselwert gibt. Beispielsweise in dem ersten Beispiel, die EmployeeAddressTable, fügen wir eine EmployeeIDNo-Spalte hinzu. Dann bezieht sich die EmployeeAddressTable zum EmployeeStatisticsTable (zweites Tabellen-Beispiel) mittels dieser EmployeeIDNo. Genauer gesagt, jeder Mitarbeiter in der EmployeeAddressTable hat in der EmployeeStatisticsTable Statistiken (eine Zeile von Daten). Auch wenn dies ein konstruiertes Beispiel ist, ist dies eine ‚1-1 ‚ Beziehung. Beachten Sie auch die ‚hat‘ in dicker Schriftart, wenn Sie eine Beziehung ausdrücken möchten, dass Sie die Beziehung unbedingt mit einem Verb beschreiben.Die beiden anderen Arten von relationships können oder können nicht logische Primärschlüssel und Fremdschlüssel-Bedingungen verwenden… es ist eine reine Aufforderung des Designers. Die erste davon ist die one-to-many relationship (‚1-M‘). Dies bedeutet, dass für jeden Wert der Spalte in einer Tabelle es eine oder mehrere Bezugswerte in einer anderen Tabelle gibt. Schlüsselbedingungen können dem Design hinzugefügt werden, oder möglicherweise nur die Verwendung einiger Arten von Identifier-Spalten kann verwendet werden, um die Beziehung herzustellen. Ein Beispiel wäre, dass es für jede OwnerID in der AntiqueOwners-Tabelle eine oder mehrere (Null ist auch zulässig) Artikel in der Antiquitäten-Tabelle gekauft wurde (Verb: kaufen).Schließlich hat die many-to-many relationship (‚M-M‘) in der Regel keine Schlüssel beinhaltet, und generell über den Primärschlüssel verfügt. Das ungewöhnliche Auftreten einer ‚M-M‘ bedeutet, dass eine Spalte in einer Tabelle zu einer anderen Spalte in einer anderen Tabelle bezogen wird und für jeden Wert von einem dieser beiden Spalten es eine oder mehrere Bezugswerte in der entsprechenden Spalte in der anderen Tabelle (und umgekehrt) vorhanden ist/sind, oder eine häufige Möglichkeit, zwei Tische haben eine 1-M-Beziehung zueinander (zwei Beziehungen, eine 1-M geht in jede Richtung). Ein [schlechtes] Beispiel für eine weitere häufige Situation wäre, wenn Sie einen Arbeitsaufgaben-Datenbank hätten, in der eine Tabelle eine Zeile für jeden Mitarbeiter und eine Arbeitsaufgabe hat, und eine weitere Tabelle eine Zeile für jeden Job mit einer der zugeordneten Mitarbeiter hat. Hier würden Sie mehrere Zeilen für jeden Mitarbeiter in der ersten Tabelle haben, eine für jede Arbeitsaufgabe, und mehrere Zeilen für jeden Job in der zweiten Tabelle, eine für jeden Mitarbeiter, der einem Projekt zugeordnet ist. Diese Tabellen haben eine M-M: jeder Mitarbeiter in der ersten Tabelle hat viele Arbeitsaufgaben aus der zweiten Tabelle, und jeder Job hat viele Mitarbeiter, die aus der ersten Tabelle zugeordnet wurden. Was sind einige wichtige Nicht-Standard-SQL-Funktionen (extrem häufige Frage)? – Nun, siehe nächster Abschnitt…

 

Non-standard SQL… ‚check local listings’

  • INTERSECT und MINUS sind wie die UNION Anweisung, außer dass INTERSECT Zeilen produziert, die aussehen wie in zwei Abfragen, und MINUS Zeilen produziert, die aus der ersten Abfrage resultieren, aber nicht aus der zweiten.
  • Report Generation Features: die COMPUTE Klausel ist an das Ende der Abfrage gesetzt, um die Ergebnisse einer aggregierten Funktion an das Ende einer Liste zu platzieren, wie COMPUTE SUM (PRICE); Eine weitere Option ist die Benutzung von „break logic“: definiere eine break, um die Abfrageergebnisse in Gruppen zu teilen, die sich auf Spalten beziehen, wie BREAK ON BUYERID. Um dann ein Ergebnis nach dem Auflisten der Gruppen zu erstellen, benutzen Sie COMPUTE SUM OF PRICE ON BUYERID. Wenn Sie beispielsweise alle dieser drei Klausel benutzen (BREAK first, COMPUTE on break second, COMPUTE overall sum third), würden Sie einen Bericht erhalten, der die Artikel mit ihren BuyerID guppiert, indem eine Summe der Preise nach den Gruppen der BuyerID’s Artikel aufgelistet werden, und nachdem alle Gruppen aufgelistet wurden, die Summe aller Preise gelistet werden und alle mit SQL generierten Kopfzeilen und Linien.
  • Zusätzlich zum oben aufgeführten aggregierten Funktionen erlauben manche DBMS’s mehrere Funktionen, die in der Select-Liste verwendet werden, außer dass diese Funktionen (einige Charakter-Funktionen erlauben multiple-row-Ergebnisse) mit einem individuellen Wert benutzt werden (nicht in Gruppen), auf single-row queries. Die Funktionen werden zudem nur bei bestimmten Datentypen benutzt. Im Folgenden sehen Sie einige Mathematische-Funktionen:
ABS(X) Absolute value-converts negative numbers to positive, or leaves positive numbers alone
CEIL(X) X is a decimal value that will be rounded up.
FLOOR(X) X is a decimal value that will be rounded down.
GREATEST(X,Y) Returns the largest of the two values.
LEAST(X,Y) Returns the smallest of the two values.
MOD(X,Y) Returns the remainder of X / Y.
POWER(X,Y) Returns X to the power of Y.
ROUND(X,Y) Rounds X to Y decimal places. If Y is omitted, X is rounded to the nearest integer.
SIGN(X) Returns a minus if X < 0, else a plus.
SQRT(X) Returns the square root of X.

 

Eigenschafts-Funktionen

LEFT(<string>,X) Returns the leftmost X characters of the string.
RIGHT(<string>,X) Returns the rightmost X characters of the string.
UPPER(<string>) Converts the string to all uppercase letters.
LOWER(<string>) Converts the string to all lowercase letters.
INITCAP(<string>) Converts the string to initial caps.
LENGTH(<string>) Returns the number of characters in the string.
<string>||<string> Combines the two strings of text into one, concatenated string, where the first string is immediately followed by the second.
LPAD(<string>,X,’*‘) Pads the string on the left with the * (or whatever character is inside the quotes), to make the string X characters long.
RPAD(<string>,X,’*‘) Pads the string on the right with the * (or whatever character is inside the quotes), to make the string X characters long.
SUBSTR(<string>,X,Y) Extracts Y letters from the string beginning at position X.
NVL(<column>,<value>) The Null value function will substitute <value> for any NULLs for in the <column>. If the current value of <column> is not NULL, NVL has no effect.

 

Syntax Zusammenfassung – Für Fortgeschrittene

In diesem Abschnitt werden generelle Formen der Anweisungen behandelt, zuzüglich einiger weiterer wichtiger Anweisungen (mit Erklärung). ERINNERN SIE SICH, dass alle dieser Anweisungen auf Ihrem System vorhanden sein können, oder auch nicht. Überprüfen Sie daher die DBMS Dokumentation bezüglich seiner Anwesenheit:

 

ALTER TABLE <TABLE NAME> ADD|DROP|MODIFY (COLUMN SPECIFICATION[S]… see Create Table); –allows you to add or delete a column or columns from a table, or change the specification (data type, etc.) on an existing column; this statement is also used to change the physical specifications of a table (how a table is stored, etc.), but these definitions are DBMS-specific, so read the documentation. Also, these physical specifications are used with the Create Table statement, when a table is first created. In addition, only one option can be performed per Alter Table statement–either add, drop, OR modify in a single statement.

COMMIT; –makes changes made to some database systems permanent (since the last COMMIT; known as a transaction)

CREATE [UNIQUE] INDEX <INDEX NAME>
ON <TABLE NAME> (<COLUMN LIST>); –UNIQUE is optional; within brackets.

CREATE TABLE <TABLE NAME>
(<COLUMN NAME> <DATA TYPE> [(<SIZE>)] <COLUMN CONSTRAINT>,
…other columns); (also valid with ALTER TABLE)
–where SIZE is only used on certain data types (see above), and constraints include the following possibilities (automatically enforced by the DBMS; failure causes an error to be generated):

  1. NULL or NOT NULL (see above)
  2. UNIQUE enforces that no two rows will have the same value for this column
  3. PRIMARY KEY tells the database that this column is the primary key column 
(only used if the key is a one column key, otherwise a PRIMARY KEY 
(column, column, …) statement appears after the last column definition.
  4. CHECK allows a condition to be checked for when data in that column is 
updated or inserted; for example, CHECK (PRICE > 0) causes the system to check that the Price column is greater than zero before accepting the value…sometimes implemented as the CONSTRAINT statement.
  5. DEFAULT inserts the default value into the database if a row is inserted without that column’s data being inserted; for example, BENEFITS INTEGER DEFAULT = 10000
  6. FOREIGN KEY works the same as Primary Key, but is followed by: REFERENCES <TABLE NAME> (<COLUMN NAME>), which refers to the referential primary key.

CREATE VIEW <TABLE NAME> AS <QUERY>;
DELETE FROM <TABLE NAME> WHERE <CONDITION>;

INSERT INTO <TABLE NAME> [(<COLUMN LIST>)] VALUES (<VALUE LIST>);

ROLLBACK; –Takes back any changes to the database that you have made, back to the last time you gave a Commit command…beware! Some software uses automatic committing on systems that use the transaction features, so the Rollback command may not work.

SELECT [DISTINCT|ALL] <LIST OF COLUMNS, FUNCTIONS, CONSTANTS, ETC.>
FROM <LIST OF TABLES OR VIEWS>
[WHERE <CONDITION(S)>]

[GROUP BY <GROUPING COLUMN(S)>]
[HAVING <CONDITION>]
[ORDER BY <ORDERING COLUMN(S)> [ASC|DESC]]; –where ASC|DESC allows the ordering to be done in ASCending or DESCending order

UPDATE <TABLE NAME>
SET <COLUMN NAME> = <VALUE>
[WHERE <CONDITION>]; –if the Where clause is left out, all rows will be updated according to the Set statement

Lizensierung

Die Toolbox wird unter den folgenden 3 Lizenzabkommen angeboten:

  • As a FREE EDITION license, whereby the product is used for non- commercial, educative purposes
  • As an ENTERPRISE license, whereby the product is used within a business context for both IT and Business users
  • As a SOURCE-CODE license, whereby the product’s source code is provided for commercial use within compiled products

Related Articles