This document describes the use of SQL and provides appropriate examples. The SQL statement used here is ANSI, or Standard SQL.
It is recommended that you print this page for easy reference when you need the information.
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
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 |
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 |
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 |
= | Equal |
<> or != (see manual) | Not Equal |
< | Less Than |
> | Greater Than |
<= | Less Than or Equal To |
>= | Greater Than or Equal To |
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)- NOT
- AND
- OR
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 |
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:- Die ‚LastName‘ und ‚Item Ordered‘ in der Select Line geben die Überschriften auf dem Report an.
- 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.
- 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).
- 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.
- 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.
- 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.
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.
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- 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.
- 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.
- 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.
- (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.
- 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.
- 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.
- 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.
Name | Department |
1 | 10 |
2 | 10 |
3 | 20 |
4 | 30 |
5 | 30 |
Department |
10 |
20 |
30 |
40 |
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 |
- 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).
- 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.
- 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.
- 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…
- 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. |
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. |
- NULL or NOT NULL (see above)
- UNIQUE enforces that no two rows will have the same value for this column
- 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.
- 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.
- 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
- FOREIGN KEY works the same as Primary Key, but is followed by: REFERENCES <TABLE NAME> (<COLUMN NAME>), which refers to the referential primary key.
- 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