Een selectie materialen voor het bestuderen van databases en SQL. SQL leren

  • Handleiding

Waar gaat deze tutorial over?

Deze tutorial is zoiets als een “stempel van mijn geheugen” in de SQL-taal (DDL, DML), d.w.z. dit is informatie die zich onderweg heeft verzameld professionele activiteit en zit voortdurend in mijn hoofd opgeslagen. Dit is voor mij een voldoende minimum, dat het meest wordt gebruikt bij het werken met databases. Als het nodig is om completer te gebruiken SQL-constructies, dan wend ik mij meestal voor hulp tot de MSDN-bibliotheek op internet. Naar mijn mening is het erg moeilijk om alles in je hoofd te houden, en daar is geen specifieke behoefte aan. Maar het kennen van de basisstructuren is erg nuttig, omdat... ze zijn in vrijwel dezelfde vorm toepasbaar in veel relationele databases, zoals Oracle, MySQL, Firebird. De verschillen zitten vooral in de datatypen, die op detail kunnen verschillen. Er zijn niet veel fundamentele SQL-constructies, en als je voortdurend oefent, worden ze snel uit het hoofd geleerd. Om bijvoorbeeld objecten (tabellen, beperkingen, indexen, enz.) te maken, volstaat het om teksteditor omgeving (IDE) voor het werken met een database, en het is niet nodig om visuele hulpmiddelen te bestuderen die zijn afgestemd op het werken met een specifiek type database (MS SQL, Oracle, MySQL, Firebird, ...). Dit is ook handig omdat alle tekst voor uw ogen staat en u niet door talloze tabbladen hoeft te bladeren om bijvoorbeeld een index of beperking te maken. Bij vaste baan met een database is het maken, wijzigen en vooral opnieuw maken van een object met behulp van scripts vele malen sneller dan wanneer je het in de visuele modus doet. Ook in de scriptmodus (en dienovereenkomstig met de nodige zorg) is het gemakkelijker om de regels voor het benoemen van objecten in te stellen en te controleren (mijn subjectieve mening). Bovendien zijn scripts handig in gebruik wanneer wijzigingen in de ene database (bijvoorbeeld test) in dezelfde vorm moeten worden overgebracht naar een andere database (productief).

De SQL-taal is opgedeeld in verschillende delen, hier zal ik kijken naar de 2 belangrijkste delen:
  • DML – Data Manipulation Language, die de volgende constructies bevat:
    • SELECT – gegevensselectie
    • INSERT – nieuwe gegevens invoegen
    • UPDATE – gegevensupdate
    • DELETE – gegevens verwijderen
    • MERGE – gegevens samenvoegen
Omdat Ik ben een beoefenaar; er zal als zodanig weinig theorie in dit leerboek staan, en alle constructies zullen worden uitgelegd aan de hand van praktische voorbeelden. Daarnaast ben ik van mening dat een programmeertaal, en dan vooral SQL, alleen onder de knie kan worden door oefening, door het zelf te ervaren en te begrijpen wat er gebeurt als je een of ander construct uitvoert.

Dit leerboek is gemaakt volgens het Step by Step-principe, d.w.z. je moet het in volgorde lezen en bij voorkeur meteen de voorbeelden volgen. Maar als u onderweg meer over een bepaald commando wilt leren, gebruik dan een specifieke zoekopdracht op internet, bijvoorbeeld in de MSDN-bibliotheek.

Voor het schrijven van deze tutorial is gebruik gemaakt van de MS SQL-database. Serverversie 2014, ik gebruikte MS SQL Server om scripts uit te voeren Managementstudio(SSMS).

Kort over MS SQL Server Management Studio (SSMS)

SQL Server Management Studio (SSMS) is een hulpprogramma voor Microsoft SQL Server voor het configureren, beheren en beheren van databasecomponenten. Dit hulpprogramma bevat een scripteditor (die we voornamelijk zullen gebruiken) en een grafisch programma dat werkt met serverobjecten en instellingen. Het belangrijkste hulpmiddel van SQL Server Management Studio is Object Explorer, waarmee de gebruiker serverobjecten kan bekijken, ophalen en beheren. Deze tekst Gedeeltelijk overgenomen van Wikipedia.

Om een ​​nieuwe scripteditor te maken, gebruikt u de knop “Nieuwe query”:

Om de huidige database te wijzigen kunt u de vervolgkeuzelijst gebruiken:

Om een ​​specifieke opdracht (of groep opdrachten) uit te voeren, selecteert u deze en drukt u op de knop “Uitvoeren” of de toets “F5”. Als er momenteel slechts één opdracht in de editor staat, of als u alle opdrachten moet uitvoeren, hoeft u niets te selecteren.

Nadat u scripts hebt uitgevoerd, vooral scripts die objecten maken (tabellen, kolommen, indexen), kunt u, om de wijzigingen te zien, vernieuwen gebruiken vanuit het contextmenu door de juiste groep (bijvoorbeeld Tabellen), de tabel zelf of de groep Kolommen daarin te markeren.

Eigenlijk is dat alles wat we moeten weten om de hier gegeven voorbeelden te voltooien. De rest van het SSMS-hulpprogramma is eenvoudig zelf te leren.

Een beetje theorie

Een relationele database (RDB, of hierna in de context eenvoudigweg DB) is een verzameling onderling verbonden tabellen. Een database is grofweg een bestand waarin gegevens in gestructureerde vorm worden opgeslagen.

DBMS – Databasebeheersysteem, d.w.z. dit is een set tools om met een specifiek type database te werken (MS SQL, Oracle, MySQL, Firebird, ...).

Opmerking
Omdat in het leven zeggen we in de omgangstaal meestal: “Oracle DB”, of zelfs gewoon “Oracle”, wat eigenlijk “Oracle DBMS” betekent, en in de context van dit leerboek zal soms de term DB worden gebruikt. Uit de context denk ik dat het duidelijk zal zijn waar we het precies over hebben.

Een tabel is een verzameling kolommen. Kolommen kunnen ook velden of kolommen worden genoemd; al deze woorden worden gebruikt als synoniemen die hetzelfde uitdrukken.

De tabel is het hoofdobject van de RDB; alle RDB-gegevens worden rij voor rij opgeslagen in de kolommen van de tabel. Lijnen en records zijn ook synoniemen.

Voor elke tabel, evenals voor de kolommen, worden namen gespecificeerd waarmee ze vervolgens worden benaderd.
De naam van een object (tabelnaam, kolomnaam, indexnaam, etc.) kan in MS SQL hebben maximale lengte 128 tekens.

Als referentie– in de ORACLE-database mogen objectnamen een maximale lengte van 30 tekens hebben. Daarom moet u voor een specifieke database uw eigen regels voor de naamgeving van objecten ontwikkelen om aan de limiet van het aantal tekens te voldoen.

SQL is een taal waarmee u een database kunt bevragen met behulp van een DBMS. In een specifiek DBMS kan de SQL-taal een specifieke implementatie hebben (een eigen dialect).

DDL en DML zijn een subset van de SQL-taal:

  • De DDL-taal wordt gebruikt om de databasestructuur te creëren en te wijzigen, d.w.z. om tabellen en relaties te maken/wijzigen/verwijderen.
  • Met de DML-taal kunt u tabelgegevens manipuleren, d.w.z. met haar lijnen. Hiermee kunt u gegevens uit tabellen selecteren, nieuwe gegevens aan tabellen toevoegen en bestaande gegevens bijwerken en verwijderen.

In SQL kunt u 2 soorten commentaar gebruiken (enkelregelig en meerregelig):

Eén regel commentaar
En

/* commentaar met meerdere regels */

Eigenlijk is dit genoeg voor de theorie.

DDL – Taal voor gegevensdefinitie

Beschouw bijvoorbeeld een tabel met gegevens over werknemers, in een vorm die bekend is voor iemand die geen programmeur is:

IN in dit geval de kolommen van de tabel hebben de volgende namen: Personeelsnummer, Volledige naam, Geboortedatum, E-mail, Functie, Afdeling.

Elk van deze kolommen kan worden gekarakteriseerd door het type gegevens dat het bevat:

  • Personeelsnummer – geheel getal
  • Volledige naam – tekenreeks
  • Geboortedatum - datum
  • E-mail – tekenreeks
  • Positie - tekenreeks
  • Afdeling - lijn
Kolomtype is een kenmerk dat aangeeft welk type gegevens een bepaalde kolom kan opslaan.

Om te beginnen is het voldoende om alleen de volgende basisgegevenstypen te onthouden die in MS SQL worden gebruikt:

Betekenis Notatie in MS SQL Beschrijving
Lijn variabele lengte Varchar(N)
En
nvarchar(N)
Met behulp van het getal N kunnen we de maximaal mogelijke stringlengte voor de overeenkomstige kolom specificeren. Als we bijvoorbeeld willen zeggen dat de waarde van de kolom “Naam” maximaal 30 tekens kan bevatten, moeten we het type instellen op nvarchar(30).
Het verschil tussen varchar en nvarchar is dat je met varchar tekenreeksen in ASCII-indeling kunt opslaan, waarbij één teken 1 byte beslaat, en dat nvarchar tekenreeksen opslaat in Unicode-indeling, waarbij elk teken 2 bytes beslaat.
Het type varchar mag alleen worden gebruikt als u er 100% zeker van bent dat dit veld niet hoeft te worden opgeslagen Unicode-tekens. Varchar kan bijvoorbeeld worden gebruikt om adressen op te slaan E-mail, omdat ze bevatten meestal alleen ASCII-tekens.
Snaar met vaste lengte teken(N)
En
nchar(N)
Dit type verschilt van een string met variabele lengte doordat als de lengte van de string kleiner is dan N tekens, deze altijd aan de rechterkant wordt opgevuld tot een lengte van N met spaties en in deze vorm in de database wordt opgeslagen, d.w.z. in de database neemt het precies N karakters in beslag (waarbij één karakter 1 byte voor char en 2 bytes voor nchar in beslag neemt). In mijn praktijk wordt dit type zeer zelden gebruikt, en als het wel wordt gebruikt, wordt het voornamelijk in het char(1)-formaat gebruikt, d.w.z. wanneer een veld wordt gedefinieerd door één enkel teken.
Geheel getal int Met dit type kunnen we alleen gehele getallen in de kolom gebruiken, zowel positief als negatief. Ter referentie (nu is dit niet zo relevant voor ons): het bereik van getallen dat het int-type toestaat, loopt van -2.147.483.648 tot 2.147.483.647. Meestal is dit het hoofdtype dat wordt gebruikt om identificatiegegevens te specificeren.
Echt of reëel getal vlot Als we praten in eenvoudige taal, dan zijn dit getallen die een decimaalteken (komma) mogen bevatten.
datum datum Als de kolom alleen de Datum hoeft op te slaan, die uit drie componenten bestaat: Dag, Maand en Jaar. Bijvoorbeeld 15-02-2014 (15 februari 2014). Dit type kan worden gebruikt voor de kolom “Opnamedatum”, “Geboortedatum”, etc., bijv. in gevallen waarin het voor ons belangrijk is om alleen de datum vast te leggen, of wanneer de tijdcomponent voor ons niet belangrijk is en kan worden weggegooid, of als deze niet bekend is.
Tijd tijd Dit type kan worden gebruikt als de kolom alleen tijdgegevens hoeft op te slaan, d.w.z. Uren, minuten, seconden en milliseconden. Bijvoorbeeld 17:38:31.3231603
Bijvoorbeeld dagelijks 'Vertrektijd vlucht'.
datum en tijd datum Tijd Met dit type kunt u tegelijkertijd zowel de datum als de tijd opslaan. Bijvoorbeeld 15-02-2014 17:38:31.323
Dit kan bijvoorbeeld de datum en tijd van een gebeurtenis zijn.
Vlag beetje Dit type is handig om waarden in de vorm “Ja”/“Nee” op te slaan, waarbij “Ja” wordt opgeslagen als 1 en “Nee” wordt opgeslagen als 0.

Ook mag de veldwaarde, als deze niet verboden is, niet worden opgegeven; het trefwoord NULL wordt voor dit doel gebruikt.

Om de voorbeelden uit te voeren, gaan we een testdatabase maken met de naam Test.

Een eenvoudige database (zonder op te geven aanvullende parameters) kan worden gemaakt door de volgende opdracht uit te voeren:

DATABASE MAKEN Test
Je kunt de database verwijderen met het commando (je moet heel voorzichtig zijn met dit commando):

DROP DATABASE-test
Om naar onze database over te schakelen, kunt u het commando uitvoeren:

GEBRUIK Test
U kunt ook de Testdatabase selecteren in de vervolgkeuzelijst in het SSMS-menugebied. Tijdens het werken gebruik ik deze manier van schakelen tussen databases vaak.

Nu kunnen we in onze database een tabel maken met de beschrijvingen zoals ze zijn, met spaties en Cyrillische tekens:

TABEL MAKEN [Medewerkers]([Personeelsnummer] int, [Naam] nvarchar(30), [Geboortedatum] date, nvarchar(30), [Positie] nvarchar(30), [Afdeling] nvarchar(30))
In dit geval zullen we de namen tussen vierkante haakjes moeten zetten […].

Maar voor meer gemak is het in de database beter om alle objectnamen in het Latijn op te geven en geen spaties in namen te gebruiken. In MS SQL begint in dit geval meestal elk woord met een hoofdletter. Voor het veld “Personeelsnummer” kunnen we bijvoorbeeld de naam Personeelsnummer instellen. U kunt ook cijfers in de naam gebruiken, bijvoorbeeld Telefoonnummer1.

Op een briefje
In sommige DBMS'en kan het volgende naamgevingsformaat “PHONE_NUMBER” meer de voorkeur hebben; dit formaat wordt bijvoorbeeld vaak gebruikt in de ORACLE-database. Bij het opgeven van een veldnaam is het uiteraard wenselijk dat deze niet samenvalt met de trefwoorden die in het DBMS worden gebruikt.

Om deze reden kunt u de syntaxis van vierkante haakjes vergeten en de tabel [Employees] verwijderen:

DROP TABLE [Medewerkers]
Een tabel met werknemers kan bijvoorbeeld de naam “Werknemers” krijgen, en de velden ervan kunnen de volgende namen krijgen:

  • ID – Personeelsnummer (werknemer-ID)
  • Naam - volledige naam
  • Verjaardag – Geboortedatum
  • E-mail – E-mail
  • Positie - Positie
  • Afdeling - Afdeling
Heel vaak wordt het woord ID gebruikt om een ​​identificatieveld een naam te geven.

Laten we nu onze tabel maken:

TABEL MAKEN Medewerkers(ID int, Naam nvarchar(30), Verjaardagsdatum, E-mailadres nvarchar(30), Functie nvarchar(30), Afdeling nvarchar(30))
Om de vereiste kolommen op te geven, kunt u de optie NOT NULL gebruiken.

Voor een bestaande tabel kunnen velden opnieuw worden gedefinieerd met behulp van de volgende opdrachten:

ID-veld bijwerken ALTER TABLE Medewerkers ALTER COLUMN ID int NOT NULL -- update Naamveld ALTER TABLE Medewerkers ALTER COLUMN Naam nvarchar(30) NOT NULL

Op een briefje
Het algemene concept van de SQL-taal blijft voor de meeste DBMS'en hetzelfde (althans, dit is wat ik kan beoordelen op basis van de DBMS'en waarmee ik heb gewerkt). De verschillen tussen DDL in verschillende DBMS'en liggen voornamelijk in de gegevenstypen (niet alleen hun namen kunnen hier verschillen, maar ook de details van hun implementatie), en de specifieke kenmerken van de implementatie van de SQL-taal kunnen ook enigszins verschillen (dat wil zeggen de de essentie van de commando's is hetzelfde, maar er kunnen kleine verschillen in dialect zijn, helaas, maar er is niet één standaard). Als u de basisprincipes van SQL onder de knie heeft, kunt u eenvoudig van het ene DBMS naar het andere overstappen, omdat... In dit geval hoeft u alleen de details van de implementatie van opdrachten in het nieuwe DBMS te begrijpen, d.w.z. in de meeste gevallen zal het eenvoudigweg trekken van een analogie volstaan.

Een tabel maken CREATE TABLE Medewerkers(ID int, -- in ORACLE is het int-type het equivalent (wrapper) voor number(38) Naam nvarchar2(30), -- nvarchar2 in ORACLE is equivalent aan nvarchar in MS SQL Verjaardagsdatum, E-mail nvarchar2(30) , Positie nvarchar2(30), Afdeling nvarchar2(30)); -- bijwerken van de velden ID en Naam (hier wordt MODIFY(...) gebruikt in plaats van ALTER COLUMN) ALTER TABLE Werknemers MODIFY(ID int NOT NULL,Name nvarchar2(30) NOT NULL); -- PK toevoegen (in dit geval ziet de constructie eruit als in MS SQL, deze wordt hieronder weergegeven) ALTER TABLE Medewerkers ADD CONSTRAINT PK_Employees HOOFDSLEUTEL(ID KAART);
Voor ORACLE zijn er verschillen wat betreft de implementatie van het varchar2-type; de ​​codering ervan is afhankelijk van de database-instellingen en de tekst kan bijvoorbeeld worden opgeslagen in UTF-8-codering. Daarnaast kan de veldlengte in ORACLE zowel in bytes als in karakters worden opgegeven, hiervoor worden extra opties BYTE en CHAR gebruikt, die achter de veldlengte worden opgegeven, bijvoorbeeld:

NAAM varchar2(30 BYTE) -- de veldcapaciteit is 30 bytes NAAM varchar2(30 CHAR) -- de veldcapaciteit is 30 tekens
Welke optie standaard zal worden gebruikt BYTE of CHAR, in het geval van het simpelweg specificeren van het varchar2(30) type in ORACLE, hangt af van de database-instellingen, en kan soms worden ingesteld in de IDE-instellingen. Over het algemeen kun je soms gemakkelijk in de war raken, dus in het geval van ORACLE, als het type varchar2 wordt gebruikt (en dit is hier soms gerechtvaardigd, bijvoorbeeld bij gebruik van UTF-8-codering), geef ik er de voorkeur aan om expliciet CHAR te schrijven (aangezien het is meestal handiger om de lengte van de string in karakters te berekenen).

Maar in dit geval, als er al gegevens in de tabel staan, is het voor een succesvolle uitvoering van opdrachten noodzakelijk dat de velden ID en Naam in alle rijen van de tabel worden ingevuld. Laten we dit met een voorbeeld demonstreren: gegevens in de tabel invoeren in de velden ID, Positie en Afdeling; dit kan met het volgende script:

INSERT Medewerkers(ID,Functie,Afdeling) WAARDEN (1000,N"Directeur",N"Administratie"), (1001,N"Programmeur",N"IT"), (1002,N"Accountant",N"Accounting" ), (1003,N"Senior Programmeur",N"IT")
In dit geval genereert de opdracht INSERT ook een fout, omdat Bij het invoegen hebben we de waarde van het vereiste veld Naam niet opgegeven.
Als we deze gegevens al in de originele tabel hadden, zou het commando “ALTER TABLE Employees ALTER COLUMN ID int NOT NULL” met succes worden uitgevoerd, en zou het commando “ALTER TABLE Employees ALTER COLUMN Name int NOT NULL” een foutmelding opleveren, dat het veld Naam NULL (niet-gespecificeerde) waarden bevat.

Laten we waarden toevoegen voor het veld Naam en de gegevens opnieuw invullen:


De NOT NULL optie kan ook direct gebruikt worden bij het aanmaken van een nieuwe tabel, d.w.z. in de context van de opdracht CREATE TABLE.

Verwijder eerst de tabel met behulp van de opdracht:

DROP TABLE Medewerkers
Laten we nu een tabel maken met de vereiste kolommen ID en Naam:

TABEL MAKEN Werknemers(ID int NOT NULL, Naam nvarchar(30) NOT NULL, Verjaardagsdatum, E-mailadres nvarchar(30), Positie nvarchar(30), Afdeling nvarchar(30))
Je kunt ook NULL achter de kolomnaam schrijven, wat betekent dat NULL-waarden (niet gespecificeerd) erin zijn toegestaan, maar dit is niet nodig, aangezien dit kenmerk standaard wordt geïmpliceerd.

Als u daarentegen een bestaande kolom optioneel wilt maken, gebruik dan de volgende opdrachtsyntaxis:

ALTER TABEL Medewerkers ALTER KOLOM Naam nvarchar(30) NULL
Of gewoon:

ALTER TABEL Medewerkers ALTER KOLOM Naam nvarchar(30)
Met dit commando kunnen we ook het veldtype wijzigen in een ander compatibel type, of de lengte ervan wijzigen. Laten we het veld Naam bijvoorbeeld uitbreiden naar 50 tekens:

ALTER TABEL Medewerkers ALTER KOLOM Naam nvarchar(50)

Hoofdsleutel

Bij het maken van een tabel is het wenselijk dat deze een unieke kolom of een reeks kolommen heeft die uniek is voor elk van de rijen. Een record kan op unieke wijze worden geïdentificeerd aan de hand van deze unieke waarde. Deze waarde wordt de primaire sleutel van de tabel genoemd. Voor onze tabel Werknemers zou een dergelijke unieke waarde de ID-kolom kunnen zijn (die het “Personeelsnummer van de werknemer” bevat - ook al is deze waarde in ons geval uniek voor elke werknemer en kan deze niet worden herhaald).

U kunt een primaire sleutel voor een bestaande tabel maken met behulp van de opdracht:

ALTER TABEL Werknemers VOEG CONSTRAINT toe PK_Employees PRIMAIRE SLEUTEL(ID)
Waarbij "PK_Employees" de naam is van de beperking die verantwoordelijk is voor de primaire sleutel. Normaal gesproken wordt de primaire sleutel benoemd met het voorvoegsel “PK_”, gevolgd door de tabelnaam.

Als de primaire sleutel uit meerdere velden bestaat, moeten deze velden tussen haakjes worden vermeld, gescheiden door komma's:

ALTER TABLE tabelnaam ADD CONSTRAINT beperkingsnaam PRIMAIRE SLEUTEL(veld1,veld2,…)
Het is vermeldenswaard dat in MS SQL alle velden die in de primaire sleutel zijn opgenomen, het NOT NULL-kenmerk moeten hebben.

De primaire sleutel kan ook direct worden bepaald bij het maken van een tabel, d.w.z. in de context van de opdracht CREATE TABLE. Laten we de tabel verwijderen:

DROP TABLE Medewerkers
En dan maken we het met de volgende syntaxis:

MAAK TABEL Werknemers(ID int NOT NULL, Naam nvarchar(30) NOT NULL, Verjaardagsdatum, E-mail nvarchar(30), Positie nvarchar(30), Afdeling nvarchar(30), CONSTRAINT PK_Employees PRIMARY KEY(ID) -- beschrijf PK daarna alle velden als beperking)
Vul na het maken de tabel met gegevens:

INSERT Medewerkers(ID,Positie,Afdeling,Naam) WAARDEN (1000,N"Directeur",N"Administratie",N"Ivanov I.I."), (1001,N"Programmeur",N"IT",N" Petrov P.P." ), (1002,N"Accountant",N"Accounting",N"Sidorov S.S."), (1003,N"Senior Programmeur",N"IT",N"Andreev A.A."")
Als de primaire sleutel in een tabel alleen uit de waarden van één kolom bestaat, kunt u de volgende syntaxis gebruiken:

TABEL MAKEN Medewerkers(ID int NOT NULL CONSTRAINT PK_Employees PRIMARY KEY, -- specificeer als kenmerk van het veld Naam nvarchar(30) NOT NULL, Verjaardagsdatum, E-mail nvarchar(30), Positie nvarchar(30), Afdeling nvarchar(30) )
In feite hoeft u de naam van de beperking niet op te geven; in dat geval krijgt deze een systeemnaam toegewezen (zoals “PK__Employee__3214EC278DA42077”):

TABEL MAKEN Werknemers(ID int NOT NULL, Naam nvarchar(30) NOT NULL, Verjaardagsdatum, E-mailadres nvarchar(30), Positie nvarchar(30), Afdeling nvarchar(30), PRIMAIRE SLEUTEL(ID))
Of:

TABEL MAKEN Werknemers(ID int NOT NULL PRIMAIRE SLEUTEL, Naam nvarchar(30) NOT NULL, Verjaardagsdatum, E-mailadres nvarchar(30), Positie nvarchar(30), Afdeling nvarchar(30))
Maar ik zou aanraden dat je voor permanente tabellen altijd expliciet de naam van de beperking instelt, omdat Met een expliciet gespecificeerde en begrijpelijke naam zal het gemakkelijker zijn om deze later te manipuleren; u kunt deze bijvoorbeeld verwijderen:

ALTER TABEL Werknemers DROP CONSTRAINT PK_Employees
Maar zo'n korte syntaxis, zonder de namen van de beperkingen op te geven, is handig om te gebruiken bij het maken van tijdelijke databasetabellen (de naam van de tijdelijke tabel begint met # of ##), die na gebruik worden verwijderd.

Laten we het samenvatten

Tot nu toe hebben we de volgende commando's bekeken:
  • MAAK TABEL tabelnaam (lijst met velden en hun typen, beperkingen) – gebruikt om een ​​nieuwe tabel in de huidige database te maken;
  • DRUPTAFEL tabelnaam – gebruikt om een ​​tabel uit de huidige database te verwijderen;
  • WIJZIG TABEL tafel naam WIJZIG KOLOM column_name... – gebruikt om het kolomtype bij te werken of de instellingen ervan te wijzigen (bijvoorbeeld om het kenmerk NULL of NOT NULL in te stellen);
  • WIJZIG TABEL tafel naam BEPERKING TOEVOEGEN beperkingsnaam HOOFDSLEUTEL(veld1, veld2,...) – een primaire sleutel toevoegen aan een bestaande tabel;
  • WIJZIG TABEL tafel naam DALINGSBEPERKING constraint_name – verwijdert een beperking uit de tabel.

Een beetje over tijdelijke tabellen

Uittreksel uit MSDN. Er zijn twee soorten tijdelijke tabellen in MS SQL Server: lokaal (#) en globaal (##). Lokale tijdelijke tabellen zijn alleen zichtbaar voor de makers ervan totdat de verbindingssessie met het SQL Server-exemplaar eindigt wanneer ze voor het eerst worden gemaakt. Lokale tijdelijke tabellen worden automatisch verwijderd nadat een gebruiker de verbinding met het exemplaar van SQL Server heeft verbroken. Globale tijdelijke tabellen zijn zichtbaar voor alle gebruikers tijdens verbindingssessies nadat deze tabellen zijn gemaakt, en worden verwijderd wanneer alle gebruikers die naar die tabellen verwijzen, de verbinding met het exemplaar van SQL Server verbreken.

Er worden tijdelijke tabellen gemaakt in de tempdb-systeemdatabase, d.w.z. Door ze te maken verstoppen we de hoofddatabase niet; anders zijn tijdelijke tabellen volledig identiek aan gewone tabellen; ze kunnen ook worden verwijderd met de opdracht DROP TABLE. Lokale (#) tijdelijke tabellen worden vaker gebruikt.

Om een ​​tijdelijke tabel te maken, kunt u de opdracht CREATE TABLE gebruiken:

MAAK TABEL #Temp(ID int, Naam nvarchar(30))
Omdat een tijdelijke tabel in MS SQL vergelijkbaar is met een gewone tabel, kan deze ook worden verwijderd met behulp van het DROP TABLE-commando:

DROP TAFEL #Temp

U kunt ook een tijdelijke tabel maken (zoals een gewone tabel) en deze onmiddellijk vullen met de gegevens die door de query worden geretourneerd met behulp van de SELECT ... INTO-syntaxis:

SELECTEER ID,Naam IN #Temp VAN Werknemers

Op een briefje
De implementatie van tijdelijke tabellen kan in verschillende DBMS'en verschillen. In de ORACLE en Firebird DBMS moet de structuur van tijdelijke tabellen bijvoorbeeld vooraf worden bepaald door de opdracht CREATE GLOBAL TEMPORARY TABLE, waarbij de details worden aangegeven van het opslaan van gegevens daarin, waarna de gebruiker deze tussen de hoofdtabellen ziet en ermee werkt. zoals bij een gewone tafel.

Databasenormalisatie – opsplitsen in subtabellen (directories) en verbindingen identificeren

Onze huidige tabel Werknemers heeft het nadeel dat de gebruiker in de velden Positie en Afdeling elke tekst kan invoeren, die vooral vol fouten zit, aangezien hij voor de ene medewerker eenvoudigweg “IT” als afdeling kan aangeven, en voor een tweede medewerker bijvoorbeeld Voer bijvoorbeeld “IT-afdeling” in, de derde heeft “IT”. Hierdoor zal het onduidelijk zijn wat de gebruiker bedoelde, d.w.z. Zijn deze medewerkers medewerkers van dezelfde afdeling, of heeft de gebruiker zichzelf beschreven en zijn dit 3 verschillende afdelingen? Bovendien zullen we in dit geval de gegevens voor sommige rapporten niet correct kunnen groeperen, waarbij het nodig kan zijn om het aantal werknemers per afdeling weer te geven.

Het tweede nadeel is het opslagvolume van deze informatie en de duplicatie ervan, d.w.z. Voor elke medewerker wordt de volledige naam van de afdeling aangegeven, waardoor er ruimte in de database nodig is om elk teken van de afdelingsnaam op te slaan.

Het derde nadeel is de moeilijkheid om deze velden bij te werken als de naam van een functie verandert, bijvoorbeeld als u de functie “Programmeur” moet hernoemen naar “Junior Programmeur”. In dit geval zullen we wijzigingen moeten aanbrengen in elke rij van de tabel waarvan de positie gelijk is aan "Programmeur".

Om deze tekortkomingen te voorkomen wordt gebruik gemaakt van zogenaamde databasenormalisatie, waarbij deze wordt opgesplitst in subtabellen en referentietabellen. Het is niet nodig om de jungle van theorieën in te gaan en te bestuderen wat ze zijn normale vormen, is het voldoende om de essentie van normalisatie te begrijpen.

Laten we 2 directorytabellen "Posities" en "Afdelingen" maken, laten we de eerste Posities en de tweede respectievelijk Afdelingen noemen:

MAAK TABEL Posities(ID int IDENTITEIT(1,1) NOT NULL CONSTRAINT PK_Positions PRIMARY KEY, Naam nvarchar(30) NOT NULL) MAAK TABEL Afdelingen(ID int IDENTITY(1,1) NOT NULL CONSTRAINT PK_Departments PRIMARY KEY, Naam nvarchar(30 ) NIET NUL)
Merk op dat we hier de nieuwe IDENTITEITsoptie hebben gebruikt, die zegt dat de gegevens in de ID-kolom automatisch worden genummerd, beginnend bij 1, in stappen van 1, d.w.z. Bij het toevoegen van nieuwe records krijgen deze opeenvolgend de waarden 1, 2, 3, etc. toegewezen. Dergelijke velden worden gewoonlijk automatisch ophogen genoemd. Voor een tabel kan slechts één veld gedefinieerd zijn met de IDENTITY-eigenschap, en meestal, maar niet noodzakelijkerwijs, is dat veld de primaire sleutel voor die tabel.

Op een briefje
In verschillende DBMS'en kan de implementatie van velden met een teller anders gebeuren. In MySQL wordt een dergelijk veld bijvoorbeeld gedefinieerd met de optie AUTO_INCREMENT. In ORACLE en Firebird kon deze functionaliteit voorheen worden geëmuleerd met behulp van SEQUENCE. Maar voor zover ik weet heeft ORACLE nu de optie GEGENEREERD ALS IDENTITEIT toegevoegd.

Laten we deze tabellen automatisch invullen, op basis van de huidige gegevens die zijn vastgelegd in de velden Positie en Afdeling van de tabel Werknemers:

We vullen het veld Naam van de tabel Posities met unieke waarden uit het veld Positie van de tabel Werknemers INSERT Positions(Name) SELECT DISTINCT Position FROM Employees WHERE Position IS NOT NULL - verwijder records waarvoor de positie niet is opgegeven
Laten we hetzelfde doen voor de tabel Afdelingen:

INSERT Departments(Name) SELECT DISTINCT Department FROM Werknemers WAAR Afdeling NIET NULL is
Als we nu de tabellen Posities en Afdelingen openen, zien we een genummerde reeks waarden voor het ID-veld:

SELECTEER * VAN Posities

SELECTEER * VAN Afdelingen

Deze tabellen zullen nu de rol spelen van naslagwerken voor het specificeren van functies en afdelingen. We zullen nu verwijzen naar functie- en afdelings-ID's. Laten we eerst nieuwe velden maken in de tabel Werknemers om identificatiegegevens op te slaan:

Voeg een veld toe voor positie-ID ALTER TABLE Medewerkers ADD PositionID int -- voeg een veld toe voor afdelings-ID ALTER TABLE Medewerkers ADD DepartmentID int
Het type referentievelden moet hetzelfde zijn als in mappen, in dit geval is het int.

U kunt ook meerdere velden tegelijk aan de tabel toevoegen met één opdracht, waarbij u de velden gescheiden door komma's opsomt:

ALTER TABEL Medewerkers TOEVOEGEN PositieID int, AfdelingID int
Laten we nu links (referentiebeperkingen - FOREIGN KEY) voor deze velden schrijven, zodat de gebruiker niet de mogelijkheid heeft om in deze velden waarden te schrijven die niet tot de ID-waarden in de mappen behoren.

ALTER TABEL Werknemers VOEG CONSTRAINT toe FK_Employees_PositionID FOREIGN KEY(PositionID) REFERENTIES Posities(ID)
En we doen hetzelfde voor het tweede veld:

TABEL WIJZIGEN Medewerkers TOEVOEGEN CONSTRAINT FK_Employees_DepartmentID FOREIGN KEY(AfdelingsID) REFERENTIES Afdelingen(ID)
Nu kan de gebruiker in deze velden alleen ID-waarden uit de overeenkomstige map invoeren. Om een ​​nieuwe afdeling of functie te kunnen gebruiken, zal hij dus eerst een nieuw item aan de overeenkomstige directory moeten toevoegen. Omdat Functies en afdelingen worden nu in één enkele kopie in mappen opgeslagen, dus om de naam te wijzigen volstaat het om deze alleen in de map te wijzigen.

De naam van een referentiebeperking is doorgaans een samengestelde naam, bestaande uit het voorvoegsel "FK_", gevolgd door de tabelnaam en gevolgd door een onderstrepingsteken, gevolgd door de naam van het veld dat verwijst naar de referentietabel-ID.

Een identificatie (ID) is meestal een interne waarde die alleen voor relaties wordt gebruikt en welke waarde daar wordt opgeslagen, is in de meeste gevallen volkomen onverschillig, dus het is niet nodig om te proberen gaten in de reeks getallen weg te werken die tijdens het werken ontstaan met de tabel, bijvoorbeeld na het verwijderen van records uit de directory.

ALTER TABLE tabel ADD CONSTRAINT beperkingsnaam FOREIGN KEY(veld1,veld2,…) REFERENTIES referentie_tabel(veld1,veld2,…)
In dit geval wordt in de tabel “reference_table” de primaire sleutel weergegeven door een combinatie van verschillende velden (veld1, veld2,...).

Laten we nu de velden PositieID en AfdelingID bijwerken met ID-waarden uit de mappen. Laten we hiervoor de opdracht DML UPDATE gebruiken:

UPDATE e SET PositionID=(SELECT ID FROM Posities WHERE Name=e.Position), AfdelingID=(SELECT ID FROM Afdelingen WHERE Name=e.Afdeling) FROM Medewerkers e
Laten we eens kijken wat er gebeurt als u het verzoek uitvoert:

SELECTEER * VAN Medewerkers

Dat is alles, de velden PositieID en AfdelingID zijn gevuld met de identificatiegegevens die overeenkomen met posities en afdelingen; deze velden zijn niet langer nodig in de tabel Werknemers. U kunt deze velden verwijderen:

ALTER TABEL Medewerkers DROP COLUMN Positie,Afdeling
Nu ziet onze tabel er als volgt uit:

SELECTEER * VAN Medewerkers

ID kaart Naam Verjaardag E-mail PositieID AfdelingID
1000 Ivanov I.I. NUL NUL 2 1
1001 Petrov P.P. NUL NUL 3 3
1002 Sidorov S.S. NUL NUL 1 2
1003 Andreev A.A. NUL NUL 4 3

Die. Uiteindelijk zijn we verlost van de opslag van overbodige informatie. Nu kunnen we op basis van de functie- en afdelingsnummers hun namen ondubbelzinnig bepalen aan de hand van de waarden in de referentietabellen:

SELECT e.ID,e.Name,p.Name Positienaam,d.Name Afdelingsnaam FROM Medewerkers e LEFT JOIN Afdelingen d ON d.ID=e.AfdelingID LEFT JOIN Posities p ON p.ID=e.PositionID

In de objectinspecteur kunnen we alle objecten zien die voor een bepaalde tabel zijn gemaakt. Vanaf hier kunt u verschillende manipulaties met deze objecten uitvoeren, bijvoorbeeld objecten hernoemen of verwijderen.

Het is ook vermeldenswaard dat de tabel naar zichzelf kan verwijzen, d.w.z. U kunt een recursieve koppeling maken. Laten we bijvoorbeeld nog een veld ManagerID toevoegen aan onze tabel met medewerkers, waarin wordt aangegeven aan welke medewerker hij rapporteert deze medewerker. Laten we een veld maken:

ALTER TABEL Medewerkers TOEVOEGEN ManagerID int
Dit veld staat een NULL-waarde toe; het veld zal leeg zijn als er bijvoorbeeld geen meerderen over de werknemer zijn.

Laten we nu een FOREIGN KEY maken voor de tabel Werknemers:

ALTER TABEL Werknemers VOEG CONSTRAINT toe FK_Employees_ManagerID FOREIGN SLEUTEL (ManagerID) REFERENTIES Werknemers(ID)
Laten we nu een diagram maken en kijken hoe de relaties tussen onze tabellen er uitzien:

Als resultaat zouden we het volgende beeld moeten zien (de tabel Werknemers is verbonden met de tabellen Posities en Afdelingen, en verwijst ook naar zichzelf):

Ten slotte is het de moeite waard om te zeggen dat referentiesleutels extra opties ON DELETE CASCADE en ON UPDATE CASCADE kunnen bevatten, die aangeven hoe zich te gedragen bij het verwijderen of bijwerken van een record waarnaar wordt verwezen in de referentietabel. Als deze opties niet zijn opgegeven, kunnen we de ID in de directorytabel niet wijzigen voor een record waarnaar wordt verwezen vanuit een andere tabel, en kunnen we zo'n record ook niet uit de directory verwijderen totdat we alle rijen hebben verwijderd die naar dit record verwijzen. of laten we de verwijzingen in deze regels bijwerken naar een andere waarde.

Laten we bijvoorbeeld de tabel opnieuw maken waarin de optie ON DELETE CASCADE wordt opgegeven voor FK_Employees_DepartmentID:

DROP TABLE Medewerkers CREATE TABLE Medewerkers(ID int NOT NULL, Naam nvarchar(30), Verjaardagsdatum, E-mail nvarchar(30), PositieID int, AfdelingsID int, ManagerID int, CONSTRAINT PK_Employees PRIMARY KEY (ID), CONSTRAINT FK_Employees_DepartmentID FOREIGN KEY(AfdelingsID) ) REFERENTIES Afdelingen(ID) BIJ DELETE CASCADE, CONSTRAINT FK_Employees_PositionID FOREIGN KEY(PositionID) REFERENCES Posities(ID), CONSTRAINT FK_Employees_ManagerID FOREIGN KEY (ManagerID) REFERENTIES Werknemers(ID)) INSERT Werknemers (ID,Naam,Verjaardag,PositieID,AfdelingID,Man agerID )WAARDEN (1000,N"Ivanov I.I.","19550219",2,1,NULL), (1001,N"Petrov P.P.","19831203",3,3,1003), (1002 ,N"Sidorov S.S. ","19760607",1,2,1000), (1003,N"Andreev AA","19820417",4,3,1000)
Laten we de afdeling met ID 3 verwijderen uit de tabel Afdelingen:

VERWIJDER Afdelingen WAAR ID=3
Laten we eens kijken naar de gegevens in de tabel Werknemers:

SELECTEER * VAN Medewerkers

ID kaart Naam Verjaardag E-mail PositieID AfdelingID ManagerID
1000 Ivanov I.I. 1955-02-19 NUL 2 1 NUL
1002 Sidorov S.S. 1976-06-07 NUL 1 2 1000

Zoals u kunt zien, zijn de gegevens voor afdeling 3 uit de tabel Medewerkers ook verwijderd.

De optie ON UPDATE CASCADE gedraagt ​​zich op dezelfde manier, maar is effectief bij het bijwerken van de ID-waarde in de directory. Als we bijvoorbeeld de ID van een positie in de positiedirectory wijzigen, wordt in dit geval de AfdelingID in de tabel Werknemers bijgewerkt naar de nieuwe ID-waarde die we in de directory hebben ingesteld. Maar in dit geval zal het simpelweg niet mogelijk zijn om dit aan te tonen, omdat de ID-kolom in de Afdelingentabel heeft de IDENTITEIT-optie, waardoor we de volgende query niet kunnen uitvoeren (wijzig afdelings-ID 3 in 30):

UPDATE Afdelingen SET ID=30 WHERE ID=3
Het belangrijkste is om de essentie van deze 2 opties ON DELETE CASCADE en ON UPDATE CASCADE te begrijpen. Ik gebruik deze opties zeer zelden en raad u aan goed na te denken voordat u ze opgeeft in een referentiebeperking, omdat Als u per ongeluk een item uit een directorytabel verwijdert, kan dit tot grote problemen leiden en een kettingreactie veroorzaken.

Laten we afdeling 3 herstellen:

We geven toestemming om IDENTITY-waarde toe te voegen/wijzigen SET IDENTITY_INSERT Afdelingen AAN INSERT Departments(ID,Name) VALUES(3,N"IT") - we verbieden het toevoegen/wijzigen van IDENTITY-waarde SET IDENTITY_INSERT Afdelingen UIT
Laten we de tabel Werknemers volledig leegmaken met de opdracht TRUNCATE TABLE:

AFKORTE TABEL Medewerkers
En opnieuw zullen we de gegevens erin opnieuw laden met behulp van de vorige INSERT-opdracht:

INSERT Medewerkers (ID,Naam,Verjaardag,PositieID,AfdelingsID,ManagerID)VALUES (1000,N"Ivanov I.I.","19550219",2,1,NULL), (1001,N"Petrov P.P." ,"19831203",3 ,3,1003), (1002,N"Sidorov S.S.","19760607",1,2,1000), (1003,N"Andreev A.A.","19820417" ,4,3,1000)

Laten we het samenvatten

Op dit moment zijn er nog een aantal DDL-commando's aan onze kennis toegevoegd:
  • Door de IDENTITY-eigenschap aan een veld toe te voegen – kunt u van dit veld een automatisch ingevuld veld (tellerveld) voor de tabel maken;
  • WIJZIG TABEL tafel naam TOEVOEGEN list_of_fields_with_characteristics – hiermee kunt u nieuwe velden aan de tabel toevoegen;
  • WIJZIG TABEL tafel naam DALEN KOLOM list_fields – hiermee kunt u velden uit de tabel verwijderen;
  • WIJZIG TABEL tafel naam BEPERKING TOEVOEGEN beperkingsnaam VREEMDE SLEUTEL(velden) REFERENTIES table_reference (velden) – hiermee kunt u de relatie tussen de tabel en de referentietabel definiëren.

Andere beperkingen – UNIEK, STANDAARD, CONTROLEREN

Met behulp van een UNIEKe beperking kun je zeggen dat de waarde voor elke rij in een bepaald veld of een bepaalde reeks velden uniek moet zijn. In het geval van de tabel Werknemers kunnen we een dergelijke beperking opleggen aan het veld E-mail. Vul de e-mail vooraf in met waarden als deze nog niet zijn gedefinieerd:

UPDATE Medewerkers SET E-mail = " [e-mailadres beveiligd]" WHERE ID=1000 UPDATE Werknemers SET E-mail=" [e-mailadres beveiligd]" WHERE ID=1001 UPDATE Werknemers SET E-mail=" [e-mailadres beveiligd]" WHERE ID=1002 UPDATE Werknemers SET E-mail=" [e-mailadres beveiligd]"WAAR ID=1003
Nu kunt u een uniciteitsbeperking opleggen aan dit veld:

WIJZIG TABEL Werknemers VOEG CONSTRAINT TOE UQ_Employees_Email UNIQUE(Email)
Nu kan de gebruiker niet voor meerdere medewerkers hetzelfde e-mailadres invoeren.

Een unieke beperking wordt gewoonlijk als volgt genoemd: eerst komt het voorvoegsel “UQ_”, dan de naam van de tabel en na het onderstrepingsteken komt de naam van het veld waarop deze beperking wordt toegepast.

Als een combinatie van velden uniek moet zijn in de context van tabelrijen, dan vermelden we ze gescheiden door komma's:

ALTER TABLE tabelnaam ADD CONSTRAINT beperkingsnaam UNIQUE(veld1,veld2,…)
Door een DEFAULT-beperking aan een veld toe te voegen, kunnen we een standaardwaarde specificeren die zal worden vervangen als dit veld bij het invoegen van een nieuw record niet wordt vermeld in de lijst met velden van het INSERT-commando. Deze beperking kan direct worden ingesteld bij het maken van de tabel.

Laten we een nieuw veld 'Inhuurdatum' toevoegen aan de tabel Werknemers en dit HireDate noemen en zeggen dat de standaardwaarde voor dit veld is De huidige datum:

ALTER TABLE Werknemers ADD HireDate datum NOT NULL DEFAULT SYSDATETIME()
Of als de HireDate-kolom al bestaat, kan de volgende syntaxis worden gebruikt:

ALTER TABLE Werknemers VOEG STANDAARD SYSDATETIME() TOE VOOR HireDate
Hier heb ik de naam van de beperking niet gespecificeerd, omdat... in het geval van DEFAULT ben ik van mening dat dit niet zo cruciaal is. Maar als je het op een goede manier doet, dan denk ik dat je niet lui hoeft te zijn en een normale naam moet bedenken. Dit gebeurt als volgt:

WIJZIG TABEL Werknemers VOEG CONSTRAINT toe DF_Employees_HireDate STANDAARD SYSDATETIME() VOOR HireDate
Dat is hoe van deze kolom bestond nog niet eerder, en wanneer u deze aan elke record toevoegt, wordt de huidige datumwaarde ingevoegd in het veld HireDate.

Bij het toevoegen van een nieuw item wordt uiteraard ook de huidige datum automatisch ingevoegd, tenzij we deze expliciet instellen, d.w.z. We zullen dit niet aangeven in de lijst met kolommen. Laten we dit met een voorbeeld laten zien zonder het HireDate-veld op te geven in de lijst met toegevoegde waarden:

INSERT Medewerkers(ID,Naam,E-mail)VALUES(1004,N"Sergeev S.S."," [e-mailadres beveiligd]")
Laten we eens kijken wat er gebeurd is:

SELECTEER * VAN Medewerkers

ID kaart Naam Verjaardag E-mail PositieID AfdelingID ManagerID Huur datum
1000 Ivanov I.I. 1955-02-19 [e-mailadres beveiligd] 2 1 NUL 2015-04-08
1001 Petrov P.P. 1983-12-03 [e-mailadres beveiligd] 3 4 1003 2015-04-08
1002 Sidorov S.S. 1976-06-07 [e-mailadres beveiligd] 1 2 1000 2015-04-08
1003 Andreev A.A. 1982-04-17 [e-mailadres beveiligd] 4 3 1000 2015-04-08
1004 Sergejev S.S. NUL [e-mailadres beveiligd] NUL NUL NUL 2015-04-08

De CHECK-controlebeperking wordt gebruikt wanneer het nodig is om de waarden te controleren die in een veld zijn ingevoegd. Laten we deze beperking bijvoorbeeld opleggen aan het personeelsnummerveld, dat voor ons een werknemersidentificatie (ID) is. Met behulp van deze beperking zeggen we dat personeelsaantallen een waarde van 1000 tot 1999 moeten hebben:

WIJZIG TABEL Werknemers TOEVOEGEN BEPERKING CK_Employees_ID CHECK(ID TUSSEN 1000 EN 1999)
De beperking wordt meestal op dezelfde manier genoemd, eerst met het voorvoegsel “CK_”, vervolgens de naam van de tabel en de naam van het veld waaraan deze beperking wordt opgelegd.

Laten we proberen een ongeldig record in te voegen om te controleren of de beperking werkt (we zouden de bijbehorende foutmelding moeten krijgen):

INSERT Werknemers(ID,E-mail) WAARDEN(2000," [e-mailadres beveiligd]")
Laten we nu de ingevoegde waarde wijzigen in 1500 en ervoor zorgen dat de record wordt ingevoegd:

INSERT Werknemers(ID,E-mail) WAARDEN(1500," [e-mailadres beveiligd]")
U kunt ook UNIQUE- en CHECK-beperkingen maken zonder een naam op te geven:

WIJZIG TABEL Medewerkers VOEG UNIEK TOE (E-mail) WIJZIG TABEL Medewerkers VOEG CHEQUE TOE (ID TUSSEN 1000 EN 1999)
Maar dit is geen goede praktijk en het is beter om de naam van de beperking expliciet te specificeren, omdat Om er later achter te komen, wat moeilijker zal zijn, moet je het object openen en kijken waar het verantwoordelijk voor is.

Met een goede naam kan veel informatie over de beperking rechtstreeks uit de naam worden afgeleid.

En dienovereenkomstig kunnen al deze beperkingen onmiddellijk worden gecreëerd bij het maken van een tabel, als deze nog niet bestaat. Laten we de tabel verwijderen:

DROP TABLE Medewerkers
En we zullen het opnieuw creëren met alle gemaakte beperkingen met één CREATE TABLE-opdracht:

MAAK TABEL Werknemers(ID int NOT NULL, Naam nvarchar(30), Verjaardagsdatum, E-mail nvarchar(30), PositionID int, DepartmentID int, HireDate date NOT NULL DEFAULT SYSDATETIME(), -- voor DEFAULT maak ik een uitzondering CONSTRAINT PK_Employees PRIMAIRE SLEUTEL (ID), CONSTRAINT FK_Employees_DepartmentID FOREIGN KEY(AfdelingsID) REFERENTIES Afdelingen(ID), CONSTRAINT FK_Employees_PositionID FOREIGN KEY(PositionID) REFERENTIES Posities(ID), CONSTRAINT UQ_Employees_Email UNIQUE (E-mail), CONSTRAINT CK_Employees_ID CHECK (ID TUSSEN EN 10 00 EN 1999) )

INSERT Medewerkers (ID,Naam,Verjaardag,E-mail,PositieID,AfdelingsID)VALUES (1000,N"Ivanov I.I.","19550219"," [e-mailadres beveiligd]",2,1), (1001,N"Petrov P.P.","19831203"," [e-mailadres beveiligd]",3,3), (1002,N"Sidorov S.S.","19760607"," [e-mailadres beveiligd]",1,2), (1003,N"Andreev A.A.","19820417"," [e-mailadres beveiligd]",4,3)

Iets over de indexen die worden gemaakt bij het maken van PRIMARY KEY- en UNIQUE-beperkingen

Zoals u in de bovenstaande schermafbeelding kunt zien, werden bij het maken van de PRIMARY KEY- en UNIQUE-beperkingen automatisch indexen met dezelfde namen (PK_Employees en UQ_Employees_Email) gemaakt. Standaard wordt de index voor de primaire sleutel gemaakt als GCLUSTERED, en voor alle andere indexen als NIET-GECLUSTERD. Het is de moeite waard om te zeggen dat het concept van een clusterindex niet in alle DBMS'en beschikbaar is. Een tabel kan slechts één GCLUSTERED-index hebben. GCLUSTERED – betekent dat de tabelrecords worden gesorteerd op deze index. We kunnen ook zeggen dat deze index directe toegang heeft tot alle gegevens in de tabel. Dit is als het ware de hoofdindex van de tabel. Nog grover gezegd: dit is een index die aan een tabel is bevestigd. Een geclusterde index is een zeer krachtig hulpmiddel dat kan helpen bij het optimaliseren van zoekopdrachten, maar laten we dit voorlopig onthouden. Als we willen aangeven dat de geclusterde index niet op de primaire sleutel moet worden gebruikt, maar op een andere index, moeten we bij het maken van de primaire sleutel de optie NONCLUSTERED opgeven:

ALTER TABLE tabelnaam ADD CONSTRAINT beperkingsnaam PRIMARY KEY NONCLUSTERED(veld1,veld2,…)
Laten we bijvoorbeeld de beperkingsindex PK_Employees niet-geclusterd maken, en de beperkingsindex UQ_Employees_Email geclusterd. Laten we eerst deze beperkingen verwijderen:

ALTER TABLE Werknemers DROP CONSTRAINT PK_Employees ALTER TABLE Werknemers DROP CONSTRAINT UQ_Employees_Email
Laten we ze nu maken met de GECLUSTERDE en NIET-GECLUSTERDE opties:

ALTER TABLE Medewerkers ADD CONSTRAINT PK_Employees PRIMAIRE SLEUTEL NIET GECLUSTERD (ID) ALTER TABLE Medewerkers ADD CONSTRAINT UQ_Employees_Email UNIEK GCLUSTERED (E-mail)
Als we nu een keuze maken uit de tabel Werknemers, zullen we zien dat de records worden gesorteerd op de geclusterde index UQ_Employees_Email:

SELECTEER * VAN Medewerkers

ID kaart Naam Verjaardag E-mail PositieID AfdelingID Huur datum
1003 Andreev A.A. 1982-04-17 [e-mailadres beveiligd] 4 3 2015-04-08
1000 Ivanov I.I. 1955-02-19 [e-mailadres beveiligd] 2 1 2015-04-08
1001 Petrov P.P. 1983-12-03 [e-mailadres beveiligd] 3 3 2015-04-08
1002 Sidorov S.S. 1976-06-07 [e-mailadres beveiligd] 1 2 2015-04-08

Voorheen, toen de geclusterde index de PK_Employees-index was, werden records standaard gesorteerd op het ID-veld.

Maar in dit geval is dit slechts een voorbeeld dat de essentie van een geclusterde index laat zien, omdat Hoogstwaarschijnlijk zullen er zoekopdrachten worden uitgevoerd naar de tabel Werknemers met behulp van het ID-veld en in sommige gevallen zal deze misschien zelf als een directory fungeren.

Voor mappen is het doorgaans raadzaam dat de geclusterde index op de primaire sleutel wordt gebouwd, omdat bij verzoeken verwijzen we vaak naar de directory-ID om bijvoorbeeld de naam (Functie, Afdeling) te verkrijgen. Laten we hier onthouden wat ik hierboven schreef, dat een geclusterde index directe toegang heeft tot tabelrijen, en hieruit volgt dat we de waarde van elke kolom kunnen krijgen zonder extra overhead.

Het is voordelig om een ​​clusterindex toe te passen op velden die het vaakst worden bemonsterd.

Soms worden tabellen gemaakt met een sleutel op basis van een surrogaatveld; in dit geval kan het handig zijn om de indexoptie GCLUSTERED op te slaan voor een geschiktere index en de optie NIET-GECLUSTERD te specificeren bij het maken van een surrogaat-primaire sleutel.

Laten we het samenvatten

Op in dit stadium we hebben kennis gemaakt met alle soorten beperkingen, in hun eenvoudigste vorm, die worden gemaakt door een commando als “ALTER TABLE tabel_naam ADD CONSTRAINT constraint_name …”:
  • HOOFDSLEUTEL- hoofdsleutel;
  • VREEMDE SLEUTEL– het opzetten van verbindingen en het bewaken van de referentiële integriteit van data;
  • UNIEK– stelt je in staat uniekheid te creëren;
  • REKENING– stelt u in staat de juistheid van de ingevoerde gegevens te garanderen;
  • STANDAARD– hiermee kunt u een standaardwaarde instellen;
  • Het is ook vermeldenswaard dat alle beperkingen kunnen worden verwijderd met het commando “ WIJZIG TABEL tafel naam DALINGSBEPERKING beperkingsnaam".
We hebben ook gedeeltelijk het onderwerp indexen besproken en het concept van cluster onderzocht ( GECLUSTEREERD) en niet-geclusterd ( NIET-GECLUSTEREERD) inhoudsopgave.

Zelfstandige indexen maken

Met onafhankelijk bedoelen we hier indexen die niet zijn gemaakt onder de PRIMARY KEY- of UNIQUE-beperking.

Indexen op een veld of velden kunnen worden gemaakt met de volgende opdracht:

INDEX MAKEN IDX_Employees_Name AAN Werknemers(naam)
Ook hier kunt u de opties GCLUSTERED, NONCLUSTERED, UNIQUE opgeven, en u kunt ook de sorteerrichting van elk afzonderlijk veld ASC (standaard) of DESC opgeven:

MAAK EEN UNIEKE NIET-GECLUSTERDE INDEX UQ_Employees_EmailDesc ON Employees (E-mail DESC)
Bij het maken van een niet-geclusterde index kan de optie NONCLUSTERED worden weggelaten, omdat dit wordt standaard geïmpliceerd en wordt hier eenvoudigweg weergegeven om de positie van de optie CLUSTERED of NONCLUSTERED in de opdracht aan te geven.

U kunt de index verwijderen met het volgende commando:

DROP INDEX IDX_Employees_Name ON Werknemers
Eenvoudige indexen, maar ook beperkingen, kunnen worden gemaakt in de context van de opdracht CREATE TABLE.

Laten we de tabel bijvoorbeeld opnieuw verwijderen:

DROP TABLE Medewerkers
En we zullen het opnieuw maken met alle gemaakte beperkingen en indexen met één CREATE TABLE-opdracht:

TABEL MAKEN Medewerkers(ID int NOT NULL, Naam nvarchar(30), Verjaardagsdatum, E-mail nvarchar(30), PositionID int, DepartmentID int, HireDate date NOT NULL CONSTRAINT DF_Employees_HireDate DEFAULT SYSDATETIME(), ManagerID int, CONSTRAINT PK_Employees PRIMARY KEY (ID ), CONSTRAINT FK_Employees_DepartmentID FOREIGN KEY(AfdelingsID) REFERENTIES Afdelingen(ID), CONSTRAINT FK_Employees_PositionID FOREIGN KEY(PositieID) REFERENTIES Posities(ID), CONSTRAINT FK_Employees_ManagerID FOREIGN KEY (ManagerID) REFERENTIES Werknemers(ID), CONSTRAINT UQ_Emplod_E mail UNIEK(E-mail), BEPERKING CK_Employees_ID CHECK(ID TUSSEN 1000 EN 1999), INDEX IDX_Employees_Name(Naam))
Laten we tot slot onze medewerkers in de tabel plaatsen:

INSERT Medewerkers (ID,Naam,Verjaardag,E-mail,PositieID,AfdelingsID,ManagerID)VALUES (1000,N"Ivanov I.I.","19550219"," [e-mailadres beveiligd]",2,1,NULL), (1001,N"Petrov P.P.","19831203"," [e-mailadres beveiligd]",3,3,1003), (1002,N"Sidorov S.S.", "19760607", " [e-mailadres beveiligd]",1,2,1000), (1003,N"Andrejev A.A.","19820417"," [e-mailadres beveiligd]",4,3,1000)
Bovendien is het vermeldenswaard dat u waarden kunt opnemen in een niet-geclusterde index door ze op te geven in INCLUDE. Die. in dit geval zal de INCLUDE-index enigszins doen denken aan een geclusterde index, alleen nu is de index niet aan de tabel gekoppeld, maar zijn de benodigde waarden aan de index gekoppeld. Dienovereenkomstig kunnen dergelijke indexen de prestaties van selectiequery's (SELECT) aanzienlijk verbeteren; als alle genoemde velden in de index voorkomen, is toegang tot de tabel mogelijk helemaal niet nodig. Maar dit vergroot uiteraard de omvang van de index, omdat... de waarden van de vermelde velden worden gedupliceerd in de index.

Uittreksel uit MSDN. Algemene opdrachtsyntaxis voor het maken van indexen

MAAK [UNIEK] [GECLUSTEREERD | NIET-GECLUSTERED ] INDEX indexnaam AAN (kolom [ ASC | DESC ] [ ,...n ]) [ INCLUDE (kolomnaam [ ,...n ]) ]

Laten we het samenvatten

Indexen kunnen de snelheid van het ophalen van gegevens verhogen (SELECT), maar indexen verlagen de snelheid van het wijzigen van tabelgegevens, omdat Na elke wijziging moet het systeem alle indexen voor een specifieke tabel opnieuw opbouwen.

Het is raadzaam om voor elk geval de optimale oplossing te vinden, gouden gemiddelde zodat zowel de bemonsterings- als de gegevenswijzigingsprestaties op het juiste niveau zijn. De strategie voor het maken van indexen en het aantal indexen kan van veel factoren afhangen, zoals hoe vaak de gegevens in de tabel veranderen.

Conclusie over DDL

Zoals u kunt zien, is DDL niet zo ingewikkeld als het op het eerste gezicht lijkt. Hier kon ik bijna alle hoofdstructuren laten zien met behulp van slechts drie tabellen.

Het belangrijkste is om de essentie te begrijpen, en de rest is een kwestie van oefenen.

Veel succes met het beheersen van deze prachtige taal genaamd SQL.

Tegenwoordig worden SQL-cursussen “voor dummies” steeds populairder. Dit is heel eenvoudig uit te leggen, omdat je in de moderne wereld steeds vaker zogenaamde “dynamische” webdiensten tegenkomt. Ze onderscheiden zich door een redelijk flexibele schil en zijn gebaseerd op Alle beginnende programmeurs die besluiten websites te wijden, schrijven zich allereerst in voor SQL-cursussen "voor dummies".

Waarom deze taal leren?

Allereerst wordt SQL onderwezen om een ​​grote verscheidenheid aan applicaties verder te creëren voor een van de meest populaire blog-engines van vandaag: WordPress. Na het voltooien van een paar eenvoudige lessen kunt u zoekopdrachten van elke complexiteit maken, wat de eenvoud van deze taal alleen maar bevestigt.

Wat is SQL?

Of er is een gestructureerde zoektaal gemaakt met maar één doel: deze in vrij korte tijd vaststellen, toegankelijk maken en verwerken. Als u de betekenis van SQL kent, begrijpt u dat deze server is geclassificeerd als een zogenaamde “niet-procedurele” taal. Dat wil zeggen dat de mogelijkheden alleen een beschrijving omvatten van alle componenten of resultaten die u in de toekomst op de site wilt zien. Maar wanneer geeft niet precies aan welke resultaten er zullen worden behaald. Elk Nieuw verzoek in deze taal is het als een extra “bovenbouw”. De zoekopdrachten worden uitgevoerd in de volgorde waarin ze in de database worden ingevoerd.

Welke procedures kunnen met deze taal worden uitgevoerd?

Ondanks zijn eenvoud kunt u met de SQL-database een grote verscheidenheid aan query's maken. Dus wat kunt u doen als u deze belangrijke programmeertaal leert?

  • maak een grote verscheidenheid aan tafels;
  • ontvangen, opslaan en wijzigen van ontvangen gegevens;
  • wijzig de tabelstructuren naar eigen goeddunken;
  • combineer de ontvangen informatie in enkele blokken;
  • bereken de ontvangen gegevens;
  • zorgen voor volledige bescherming van informatie.

Welke opdrachten zijn het populairst in deze taal?

Als u besluit de cursus SQL voor Dummies te volgen, ontvangt u deze gedetailleerde informatie over de opdrachten die worden gebruikt om er query's mee te maken. De meest voorkomende vandaag de dag zijn:

  1. DDL is een commando dat gegevens definieert. Het wordt gebruikt om een ​​grote verscheidenheid aan objecten in de database aan te maken, te wijzigen en te verwijderen.
  2. DCL is een commando dat gegevens manipuleert. Het wordt gebruikt om verschillende gebruikers toegang te geven tot informatie in de database, maar ook om tabellen of weergaven te gebruiken.
  3. TCL is een team dat een verscheidenheid aan transacties beheert. Het belangrijkste doel is om de voortgang van een transactie te bepalen.
  4. DML - manipuleert de ontvangen gegevens. Het doel is om de gebruiker in staat te stellen te bewegen diverse informatie uit de database of voer het daar in.

Typen rechten die op deze server bestaan

Privileges verwijzen naar de acties die een bepaalde gebruiker kan uitvoeren in overeenstemming met zijn status. Het meest minimale is natuurlijk een reguliere login. Uiteraard kunnen privileges in de loop van de tijd veranderen. Oude zullen worden verwijderd en nieuwe zullen worden toegevoegd. Tegenwoordig weet iedereen die SQL Server-cursussen "voor dummies" volgt dat er verschillende soorten toegestane acties zijn:

  1. Objecttype - de gebruiker mag alleen opdrachten uitvoeren met betrekking tot een specifiek object dat zich in de database bevindt. Tegelijkertijd verschillen de rechten voor verschillende objecten. Ze zijn ook niet alleen gebonden aan een bepaalde gebruiker, maar ook aan tabellen. Als iemand, met behulp van zijn mogelijkheden, een tafel heeft gemaakt, wordt hij als de eigenaar ervan beschouwd. Daarom heeft hij het recht om nieuwe rechten toe te kennen aan andere gebruikers met betrekking tot de informatie daarin.
  2. Het systeemtype is het zogenaamde dataauteursrecht. Gebruikers die dergelijke rechten hebben gekregen, kunnen verschillende objecten in de database aanmaken.

Geschiedenis van SQL

Deze taal is in 1970 gemaakt door IBM Research Laboratory. Destijds was de naam enigszins anders (SEQUEL), maar na een paar jaar gebruik werd deze gewijzigd, waardoor deze een beetje werd ingekort. Desondanks spreken veel wereldberoemde programmeerexperts de naam zelfs vandaag de dag nog steeds op de ouderwetse manier uit. SQL is gemaakt met één enkel doel: een taal uitvinden die zo eenvoudig zou zijn dat deze ook zonder gebruikt zou kunnen worden bijzondere problemen zelfs gewone internetgebruikers kunnen het leren. Een interessant feit is dat SQL destijds niet de enige dergelijke taal was. In Californië ontwikkelde een andere groep specialisten een soortgelijke Ingres, maar deze werd nooit wijdverspreid. Vóór 1980 waren er verschillende varianten van SQL die slechts een klein beetje van elkaar verschilden. Om verwarring te voorkomen werd in 1983 een standaardversie gemaakt, die nog steeds populair is. Met SQL-cursussen "voor dummies" kunt u veel meer over de dienst leren en deze binnen een paar weken volledig bestuderen.

Een selectie boeken, videocursussen en online bronnen voor het bestuderen van databases, de grondbeginselen van relationele theorie en de SQL-taal.

Boeken

Alan Bewley "SQL leren" (2007)

Dit boek is een uitstekende keuze voor degenen die aan het begin staan ​​van het lastige pad van het leren van SQL. Het stelt je niet alleen in staat de noodzakelijke basiskennis te verwerven, maar vertelt je ook over de meest populaire subtiliteiten en krachtige taalhulpmiddelen die door ervaren programmeurs worden gebruikt.
Veel leerboeken over databases, relationele theorie en SQL staan ​​vol met saaie theoretische concepten. Dit boek vormt een aangename uitzondering vanwege de lichte, levendige stijl. De auteur presenteert de lezer vakkundig informatie over SQL-expressies en -blokken, voorwaardetypen, joins, subquery's en nog veel meer.
Om de opgedane kennis in de praktijk te consolideren, creëert de auteur een MySQL-trainingsbasis en geeft hij vele praktische voorbeelden van vragen die al het gepresenteerde theoretische materiaal bestrijken.

Chris Fiaily "SQL" (2013)


Het boek gaat over de ANSI SQL-92 (SQL2) taalversie. Het beschrijft in detail hoe u de querytaal kunt gebruiken om de overeenkomstige problemen bij het ophalen en wijzigen van gegevens en het werken met objecten van de databasestructuur op te lossen. Alle voorbeelden worden uitgebreid toegelicht.
In deze publicatie wordt bijzondere aandacht besteed aan de verschillen in SQL-dialecten bij de implementatie van de meest voorkomende DBMS'en: MySQL, Oracle, MS SQL Server en PostgreSQL.
Het boek is bedoeld voor iedereen die zelfstandig de taal SQL wil leren of zijn kennis over dit onderwerp wil verbeteren.

Anthony Molinaro "SQL. Verzameling recepten" (2009)


Deze publicatie is bedoeld voor degenen die al enige kennis van SQL hebben en hun vaardigheden op dit gebied willen verbeteren. Het zal ook erg nuttig zijn voor database-experts, aangezien de auteur voorbeelden geeft van het oplossen van problemen in verschillende DBMS'en: DB2, Oracle, PostgreSQL, MySQL en SQL Server.
Het boek helpt u te leren hoe u SQL kunt gebruiken om een ​​breder scala aan problemen op te lossen: van bewerkingen in een database tot het ophalen van gegevens en het verzenden ervan via het netwerk naar toepassingen.
Je leert vensterfuncties en speciale operators gebruiken, evenals geavanceerde technieken voor het werken met datawarehouses: histogrammen maken, gegevens in blokken samenvatten, aggregaties met glijdende bereiken uitvoeren, lopende bedragen en subtotalen genereren. U kunt rijen uitbreiden naar kolommen en vice versa, berekeningen binnen een rij vereenvoudigen en de resultatenset dubbel uitvouwen, en tekenreekstraversal uitvoeren, waardoor u SQL kunt gebruiken om een ​​tekenreeks te ontleden in tekens, woorden of gescheiden tekenreeksen elementen. Met de door de auteur voorgestelde technieken kunt u de code van uw toepassingen optimaliseren en nieuwe mogelijkheden voor u openen in de SQL-taal.

Alex Kriegel et al. “SQL. Gebruikersbijbel, 2e editie (2010)


Het boek is uniek omdat elk hoofdstuk de implementaties van bepaalde zoekopdrachten in de dialecten van de drie toonaangevende DBMS'en vergelijkt. Dit maakt het een uitgebreide en praktische gids voor de SQL-taal voor ontwikkelaars, van beginners tot goeroes, een soort desktopgids.
De publicatie behandelt onderwerpen vanaf de basis tot transacties en vergrendelingen, functies en databasebeveiliging.
Aan het eind worden nog een aantal aanvullende onderwerpen gepresenteerd: SQL-naar-XML-integratie, OLAP business intelligence en meer.

Eric Redmond, Jim R. Wilson "Zeven databases in zeven weken." Inleiding tot moderne databases en NoSQL-ideologie" (2015)

Het boek beschrijft de meeste van de moderne bases gegevens met open broncode: Redis, Neo4J, CouchDB, MongoDB, HBase, PostgreSQL en Riak. Voor elke basis worden voorbeelden gegeven van het werken met echte data, waarin de belangrijkste ideeën en sterke punten worden gedemonstreerd.
Dit boek zal licht werpen op de sterke en zwakke punten van elk van de zeven databases en u leren hoe u de database kunt kiezen die het beste aan uw behoeften voldoet.

Martin Graber “SQL voor gewone stervelingen” Laurie, 2014, 382 pagina's (11,2 MB pdf)

Het boek kan omschreven worden als een gids voor beginners. Structured Query Language - SQL, een programmeertaal voor het maken en beheren van relationele databases (een toegepast, logisch model voor het construeren van een reeks databases). Het boek is bedoeld voor het eenvoudigste (laagste) opleidingsniveau op IT-gebied, dat wil zeggen voldoende kennis om het schoolcurriculum te dekken. Maar dit betekent niet dat het handleidingmateriaal slechts een inleiding tot deze programmeertaal is - nee, SQL wordt behoorlijk diepgaand beschreven (verklaring van de auteur).

Elk hoofdstuk voegt nieuwe gegevens toe die onderling verbonden concepten en definities beschrijven. Al het daaropvolgende materiaal is gebaseerd op het voorgaande, dat eerder is besproken, met een bespreking van praktische zaken aan het einde van het hoofdstuk voor een betere verwerking van de opgedane kennis. De antwoorden vindt u in bijlage A.

In de eerste zeven hoofdstukken wordt een inleiding tot SQL gegeven, die u absoluut moet lezen als u een handleiding als SQL voor beginners gebruikt. De volgende zeven hoofdstukken (8 tot en met 14) behandelen meer complexe voorbeelden: gecombineerde zoekopdrachten, zoekopdrachten naar meerdere tabellen tegelijk. Andere kenmerken van SQL: het maken en bewerken van tabellen, het invoeren en instellen van waarden, het openen en sluiten van de toegang tot gemaakte tabellen - worden uiteengezet in de hoofdstukken 15 tot en met 23. Tenslotte over de structuur van databases en de mogelijkheid om SQL te gebruiken in programma's die in andere talen zijn ontwikkeld. . De bijlagen bieden richtlijnen voor SQL-opdrachten en antwoorden op opdrachten. Het boek is ideaal voor beginners om SQL te leren.
ISBN: 978-5-85582-301-1

Hoofdstuk 1. Inleiding tot relationele databases 1
Wat is een relationele database? 3
Databasevoorbeeld 5
Resultaten 7

Hoofdstuk 2. Inleiding tot SQL 9
Hoe werkt SQL? 10
Verschillende gegevenstypen 12
Resultaten 15

Hoofdstuk 3. SQL gebruiken om gegevens uit tabellen op te halen 17
Vorming van het verzoek 18
Een voorbeeld definiëren - WHERE-clausule 24
Resultaten 26

Hoofdstuk 4. Relationele en Booleaanse operatoren gebruiken om meer te creëren complexe predikaten 29
Relationele operatoren 30
Booleaanse operatoren 32
Resultaten 37

Hoofdstuk 5. Gebruik speciale operatoren onder omstandigheden" 39
Exploitant IN 40
Exploitant TUSSEN 41
Operator LIKE 44
IS NULL-operator 47
Resultaten 49

Hoofdstuk 6. Gegevens samenvatten met behulp van de aggregatiefunctie 51
Wat zijn aggregatiefuncties? 52
Resultaten 61

Hoofdstuk 7. Queryresultaten opmaken 63
Tekenreeksen en expressies 64
Uitvoervelden bestellen 67
Resultaten 71

Hoofdstuk 8. Meerdere tabellen gebruiken in één query 75
Tabellen verbinden 76
Resultaten 81

Hoofdstuk 9 Een samenvoegbewerking waarvan de operanden worden weergegeven door één enkele tabel 83
Hoe twee exemplaren van dezelfde tabel samen te voegen 84
Resultaten 90

Hoofdstuk 10. Zoekvragen nesten 93
Hoe worden subquery's uitgevoerd? 94
Resultaten 105

Hoofdstuk 11. Gerelateerde subquery's 107
Hoe u gerelateerde subquery's vormt 108
Resultaten 115

Hoofdstuk 12. De EXISTS-operator gebruiken 117
Hoe werkt de EXISTS-instructie? 118
EXISTS gebruiken met gerelateerde subquery's 119
Resultaten 124

Hoofdstuk 13. Met behulp van de operators ANY, ALL en SOME 127
Speciale operator ELK of SOMMIG 128
Speciale operator ALL 135
Werking van ELKE. ALL en BESTAAT voor gegevensverlies of
met onbekende gegevens 139
Resultaten 143

Hoofdstuk 14. Met behulp van de UNION-clausule 145
Meerdere verzoeken combineren in één 146
UNION gebruiken met ORDER BY 151
Resultaten 157

Hoofdstuk 15. Nulwaarden invoeren, verwijderen en wijzigen 159
DML 160 Update-opdrachten
Waarden invoeren 160
Exclusief rijen uit tabel 162
Veldwaarden wijzigen 163
Resultaten 165

Hoofdstuk 16. Subquery's gebruiken met updateopdrachten 167
Subquery's gebruiken in INSERT 168
Subquery's gebruiken met DELETE 170
Subquery's gebruiken met UPDATE 174
Resultaten 177

Hoofdstuk 17. Tabellen maken 178
CREATE TABLE 179-opdracht
Indexen 181
Een tabel wijzigen die al is aangemaakt 182
Tabel 183 uitzondering
Resultaten 185

Hoofdstuk 18. Beperkingen op de set geldige gegevenswaarden 186
Beperkingen in tabellen 195
Resultaten 197

Hoofdstuk 19. Ondersteuning van gegevensintegriteit 198
Buitenlandse en bovenliggende sleutels 199
FOREIGN KEY-beperkingen 204
Wat er gebeurt als u updateopdracht 209 uitvoert
Resultaten 211

Hoofdstuk 20. Inleiding tot weergaven 212
Wat zijn weergaven? 212
CREATE VIEW 221-opdracht
Resultaten 223

Hoofdstuk 21. Waarden wijzigen met behulp van weergaven 224
Weergaven bijwerken 228
Waarden selecteren die in weergaven zijn geplaatst 232
Resultaten 235

Hoofdstuk 22. Toegangsrechten voor gegevens definiëren 236
Gebruikers 237
Overdracht van privileges 241
Intrekking van privileges 245
Andere soorten privileges 247
Resultaten 249

Hoofdstuk 23. Globale aspecten van SQL 250
Tabellen hernoemen 252
Hoe wordt de database gehost voor de gebruiker? 253
Wanneer wordt verandering permanent? 255
Hoe SQL werkt met meerdere gebruikers tegelijk Resultaten 259

Hoofdstuk 24. Hoe u de orde in een SQL-database kunt handhaven 261
Systeemcatalogus 262

De theoretische grondslagen van het SQL Server 2012 DBMS worden op een eenvoudige en toegankelijke manier onderzocht. Installatie, configuratie en ondersteuning van MS SQL Server 2012 wordt beschreven. Omvat het maken van een database, het wijzigen van tabellen en hun inhoud, query's, indexen, weergaven, triggers, opgeslagen procedures en door de gebruiker gedefinieerde functies.
De implementatie van beveiliging met behulp van authenticatie, encryptie en autorisatie wordt getoond. Er wordt aandacht besteed aan het automatiseren van DBMS-beheertaken. Bespreekt het maken van gegevensback-ups en het uitvoeren van systeemherstel. Beschrijft Microsoft Analysis Services, Microsoft Reporting Services en andere hulpmiddelen voor bedrijfsanalyse. De technologie van het werken met XML-documenten, ruimtelijk gegevensbeheer, zoeken in volledige tekst en nog veel meer. Voor beginnende programmeurs.

In de moderne wereld heeft informatie de hoogste waarde, maar het is net zo belangrijk om deze informatie te kunnen beheren. Dit boek gaat over de SQL-querytaal en databasebeheer. Het materiaal wordt gepresenteerd van een beschrijving van basisquery's tot complexe manipulaties met behulp van joins, subquery's en transacties. Als je de organisatie en het beheer van databases wilt begrijpen, zal dit boek geweldig zijn. praktische gids en zal u voorzien van alle benodigde hulpmiddelen. Het bijzondere aan deze uitgave is unieke manier presentatie van materiaal dat O'Reilly's Head First-serie onderscheidt van de vele saaie boeken over programmeren.

In dit boek leert u hoe u met SQL-opdrachten en -instructies kunt werken, relationele databases kunt maken en configureren, databaseobjecten kunt laden en wijzigen, krachtige query's kunt uitvoeren, de prestaties kunt verbeteren en beveiliging kunt opbouwen. Je leert hoe je DDL-statements en API's gebruikt, XML- en Java-scripts integreert, SQL-objecten gebruikt, webservers maakt, met externe toegang werkt en gedistribueerde transacties uitvoert.
In dit boek vindt u informatie over het werken met in-memory databases, streaming en embedded databases, databases voor mobiele en handheld apparaten, en nog veel meer.

SQL for Mere Mortals is een volledige introductie tot een gestructureerde querytaal, speciaal geschreven voor beginners.

Als u geen ervaring hebt met het beheren van databases, leert dit boek u hoe u eenvoudig en vloeiend met SQL kunt werken, met behulp van eenvoudige query's en complexe bewerkingen. SQL onder de knie krijgen:

- Begrijp de concepten die verband houden met databasebeheer via een beknopte en eenvoudige introductie in relationele databases.
— Volg deze instructies om eenvoudige SQL-opdrachten te gebruiken om informatie in gegevenstabellen te vinden en te manipuleren. Leer gegevens vakkundig te selecteren, samen te vatten en te beheren.
— Werk effectief met samengestelde gegevenstabellen door geavanceerde zoektechnieken toe te passen op meer dan één tabel tegelijk, en complexe zoekvragen en subquery's te construeren.
— Creëer nieuwe datatabellen voor handelsapplicaties. Leer belangrijke principes van effectief databaseontwerp en technieken voor het garanderen van gegevensintegriteit en beveiliging.
— Leer SQL gebruiken met programmeertalen met behulp van een speciaal hoofdstuk voor programmeurs.

SQL is ouder dan de meesten van ons, dus ik kan niet beweren dat ik via dit boek bijzondere dingen overbreng. Wat deze titel uniek maakt, is het slanke formaat. Als je op zoek bent naar een echte compacte praktische gids over SQL, dan is dit boek iets voor jou. Voor beginners heb ik geprobeerd een oceaan tot een emmer te beperken om ze in de kortst mogelijke tijd uit te rusten met SQL-kennis. De SQL-taal is te omvangrijk en het blootleggen van elk aspect van deze enorme taal is een zeer vervelende taak. Afgezien van de minst gebruikte functies, wordt dit boek uitgerold om zich te concentreren op de meer operationele gebieden van de taal. Het is bedoeld om u te helpen snel zelf SQL te leren. Het volgt een tutorialbenadering waarbij honderden praktische oefeningen worden aangeboden, aangevuld met illustraties, om u in korte tijd SQL te leren. Zonder enige overdrijving zal het boek SQL in recordtijd blootleggen. Het boek behandelt expliciet een gratis platform van 's werelds nummer 1 DBMS om SQL bloot te leggen: Oracle Database Express Edition. Ik heb voor Oracle XE gekozen omdat het gratis kan worden ontwikkeld, geïmplementeerd en gedistribueerd; snel te downloaden; en eenvoudig te beheren.

Beginnen Met Oracle PL/SQL kunt u aan de slag met het gebruik van de ingebouwde taal die elke Oracle-ontwikkelaar en databasebeheerder moet kennen. Oracle Database zit boordevol ingebouwde applicatiefuncties die gratis te gebruiken zijn, en PL/SQL is uw ticket om deze functies vanuit uw eigen code te leren kennen en gebruiken. Hiermee kunt u bedrijfslogica in de database centraliseren, applicatielogica ontlasten en database- en applicatiebeheertaken automatiseren.

Auteur Don Bales biedt in het begin Oracle PL/SQL een snelle en met voorbeelden gevulde tutorial. Leer van Don's uitgebreide ervaring om de meest gebruikte aspecten van PL/SQL te ontdekken, zonder tijd te verspillen aan obscure en verouderde functies.

Boek “SQL. De User's Bible is uniek omdat elk hoofdstuk implementaties van de SQL-querytaalstandaard in de drie toonaangevende DBMS'en vergelijkt. Het resultaat is een uitgebreide en praktische gids voor databasegebruikers, van beginners tot professionals. Dit boek on SQL combineert op handige wijze theorie met praktijk, bevat een beschrijving van nieuwe technologieën en stelt u in staat de talrijke nuances van de SQL-querytaalstandaard en de implementaties ervan te begrijpen. Het kan worden gebruikt als naslagwerk - een soort bureaubladhulpmiddel.
— Leer de basisprincipes van SQL-querytaal en relationele databases
— Beheers het werken met tabellen, weergaven, reeksen en andere databaseobjecten
— Leer transacties en vergrendelingen te gebruiken in een omgeving met meerdere gebruikers
— Ontdek de functies die worden aangeboden door de SQL-standaard en drie toonaangevende databaseleveranciers
— Leer hoe u toegang krijgt tot metadata en hoe u databasebeveiligingscontroles kunt implementeren
- Ontdek aanvullende onderwerpen: SQL-naar-XML-integratie, OLAP business intelligence en meer

Als u over basiskennis van HTML beschikt, kunt u met behulp van het boek van Robin Nixon, een ervaren ontwikkelaar en auteur van talrijke bestverkochte boeken over webmastering, gemakkelijk leren hoe u dynamische sites kunt maken die worden gekenmerkt door hoog niveau interactie met gebruikers.
Ontdek de combinatie van PHP en MySQL, leer hoe ze het gemakkelijker maken om moderne websites te maken en leer hoe je JavaScript-mogelijkheden aan deze technologieën kunt toevoegen om hightech applicaties te creëren.
Deze gids bekijkt elke technologie afzonderlijk, laat zien hoe je PHP, MySQL en javascript kunt combineren tot een samenhangend geheel en introduceert de nieuwste webprogrammeerconcepten. Met behulp van gedetailleerde voorbeelden en testvragen in elk hoofdstuk kunt u de bestudeerde stof in de praktijk consolideren.

Deze gids helpt u:
- meester PHP-basisprincipes en objectgeoriënteerd programmeren;
— MySQL grondig bestuderen, beginnend met de databasestructuur en eindigend met het opstellen van complexe queries;
— webpagina's maken die PHP en MySQL gebruiken om formulieren en andere HTML-elementen te combineren;
— javascript leren, beginnend met functies en gebeurtenisafhandeling en eindigend met toegang tot het documentobjectmodel (DOM);
- gebruik bibliotheken en softwarepakketten, waaronder het Smarty-systeem, de PEAR-programmarepository en de Yahoo! Gebruikersomgeving;
— voer Ajax-oproepen en verander uw website in een zeer dynamische informatieomgeving;
— bestanden en afbeeldingen uploaden naar de website en ermee werken, de door de gebruiker ingevoerde gegevens controleren;
— zorg voor de veiligheid van uw applicaties.

Query's worden niet snel genoeg uitgevoerd? Vraagt ​​u zich af wat de in-memory databasefuncties in 2014 zijn? Ben je de telefoontjes van gefrustreerde gebruikers beu? Grant Fritchey's boek SQL Server Query Performance Tuning is het antwoord op uw prestatieproblemen met SQL Server-query's. Het boek is herzien om de allernieuwste functies en technieken voor prestatie-optimalisatie te behandelen, met name inclusief de nieuw toegevoegde, in-memory databasefuncties die voorheen bekend stonden onder de codenaam Project Hekaton. Dit boek biedt de hulpmiddelen die u nodig hebt om uw vragen te benaderen met het oog op prestaties.

Met SQL Server Query Performance Tuning krijgt u inzicht in de oorzaken van slechte prestaties, hoe u deze kunt identificeren en hoe u deze kunt oplossen. Je leert proactief te zijn bij het vaststellen van prestatiebaselines met behulp van tools als Performance Monitor en Extended Events. Je leert knelpunten herkennen en ongedaan maken voordat de telefoon gaat. Je leert ook enkele snelle oplossingen, maar de nadruk ligt op het ontwerpen voor prestaties en het correct uitvoeren ervan, en op het voorkomen van problemen voordat deze zich voordoen. Verras uw gebruikers. Zet die rinkelende telefoon stil. Breng de principes en lessen van SQL Server Query Performance Tuning vandaag nog in de praktijk.

Behandelt de in-memory-functies van Project Hekaton
Helpt prestatiebaselines vast te stellen en deze te monitoren
Gidsen voor het oplossen van problemen en het elimineren van knelpunten die gebruikers frustreren
Wat je gaat leren
— Stel prestatiebasislijnen vast en monitor deze
— Herken en elimineer knelpunten die tot trage prestaties leiden
— Implementeer indien nodig snelle oplossingen en volg langetermijnoplossingen
— Implementeer best practices in T-SQL om het prestatierisico te minimaliseren
— Ontwerp met de prestaties die u nodig heeft door zorgvuldig query- en indexontwerp
— Profiteer van de allernieuwste functies voor prestatie-optimalisatie in SQL Server 2014
— Begrijp de nieuwe databasefuncties in het geheugen die voorheen de codenaam Project Hekaton droegen

Het boek SQL in 10 minuten biedt eenvoudige en praktische oplossingen voor wie snel resultaat wil boeken. Nadat u alle 22 lessen heeft doorlopen, die elk niet meer dan 10 minuten duren, leert u alles wat u nodig heeft om te oefenen met SQL. De in het boek gegeven voorbeelden zijn geschikt voor IBM DB2, Microsoft Access, Microsoft SQL Server, MySQL, Oracle, PostgreSQL, SQLite, MariaDB en Apache OpenOffice Base. Visuele voorbeelden helpen u te begrijpen hoe SQL-instructies zijn gestructureerd. Tips suggereren snelkoppelingen naar oplossingen. Waarschuwingen helpen u veelvoorkomende fouten te voorkomen. Notities zullen verdere verduidelijking verschaffen.


2024, leally.ru - Uw gids in de wereld van computers en internet