Functionaliteit van de SQL-taal. Inleiding tot MS SQL Server en T-SQL

Elke SQL-opdracht begint met een trefwoord - een werkwoord dat de actie beschrijft die door de opdracht moet worden uitgevoerd, zoals CREATE. Een team kan een of meer zinnen hebben. De zin beschrijft de gegevens waarmee het team werkt, of bevat verhelderende informatie over de actie die door het team wordt uitgevoerd. Elke clausule begint met een sleutelwoord, zoals WHERE (waar) Sommige clausules in het commando zijn vereist, andere niet. Sommige zinnen kunnen aanvullende trefwoorden, uitdrukkingen bevatten. Veel suggesties bevatten tabel- of veldnamen. Namen moeten tussen 1 en 18 tekens lang zijn, beginnen met een letter en mogen geen spaties of speciale leestekens bevatten. Sleutelwoorden kunnen niet als namen worden gebruikt.

52. SQL (Structured Query Language) - Structured Query Language Is de standaard zoektaal voor het werken met relationele databases.

SQL bevat geen traditionele instructies die de stroom van programma's regelen, het bevat alleen een reeks standaardinstructies voor toegang tot gegevens die zijn opgeslagen in een database.

De SQL-taal kan worden gebruikt om toegang te krijgen tot de database in twee modi: wanneer interactief werk en in toepassingsprogramma's.

Met behulp van SQL kan een gebruiker snel antwoorden krijgen op alle, inclusief vrij complexe vragen, in een interactieve modus, terwijl het implementeren van deze vragen in een andere taal een bijbehorend programma zou vereisen. In applicatieprogramma's die in bepaalde programmeertalen zijn geschreven, wordt SQL gebruikt als: ingebouwd taal voor toegang tot de database.

Kenmerkend voor de SQL-taal als geheel, kan men de volgende kenmerken onderscheiden:

· Structuur op hoog niveau, die doet denken aan het Engels;

· Onafhankelijkheid van specifieke DBMS;

· Beschikbaarheid van ontwikkelende standaarden;

· De mogelijkheid om interactieve zoekopdrachten uit te voeren om gegevens op te halen en hun structuur te wijzigen;

· Softwaretoegang tot databases;

· Ondersteuning voor client / server-architectuur;

· Uitbreidbaarheid en ondersteuning voor objectgeoriënteerde technologieën;



· De mogelijkheid om toegang te krijgen tot gegevens op internet.

De belangrijkste functies van de SQL-taal:

SQL- interactieve zoektaal... Gebruikers voeren interactief SQL-commando's in om gegevens op te halen en op het scherm weer te geven, en om wijzigingen aan te brengen in de database;

SQL- database programmeertaal... SQL-opdrachten worden in toepassingen ingevoegd om toegang te krijgen tot de database;

SQL- taal voor databasebeheer... De databasebeheerder kan SQL gebruiken om de structuur van de database te definiëren en de toegang tot gegevens te regelen;

SQL- taal voor het maken van client / server-applicaties... In applicatieprogramma's wordt SQL gebruikt als een middel om communicatie via een lokaal netwerk te organiseren met een databaseserver die gedeelde gegevens opslaat, enz.

55. Mogelijkheden van taal De SQL-taal, die voldoet aan de nieuwste standaarden SQL: 2003, SQL: 1999, is een zeer rijke en complexe taal, waarvan alle mogelijkheden moeilijk onmiddellijk te vatten, laat staan ​​te begrijpen. Daarom moet je de taal opdelen in niveaus. In een van de classificaties die de SQL-standaard biedt, is deze taal onderverdeeld in "basis" (invoer), "gemiddeld" (gemiddeld) en "volledig" (volledig). Het basisniveau bevat ongeveer veertig commando's die op basis van hun functionaliteit in categorieën kunnen worden gegroepeerd.

MAAK TABEL Details (NOMZ INT, NAAM CHAR (15), JAAR INT, SEX CHAR (3))

DROP TABEL Details

ALTER TABEL Informatie (SEMPOL CHAR (10))

MAAK WEERGAVE Klasse M1 ALS SELECTEER * VAN Klasse WHERE GROUP = "M-1"

INVOEREN IN Informatie WAARDEN (980101, "IVANOV I. I.", 1980, "HUBAND")

VERWIJDEREN UIT Details WAAR NOMZ = 980201

UPDATE Details SET VOLLEDIGE NAAM = "I.I. KRAVTSOVA" WAAR NOMZ = 980201

SELECTEER * UIT Informatie WHERE VOLLEDIGE NAAM = "SIDOROV S. S." OF Volledige naam = "PETROV P. P."

54. Gegevenstypen en uitdrukkingen Om toegang te krijgen tot een relationele tabel in SQL, moet u een opdracht schrijven (instellen). KIEStrefwoord vertelt de DBMS welke actie deze opdracht zal ondernemen. Query-opdrachten beginnen met een trefwoord. Naast SELECT kunnen dit woorden zijn CREËREN- creëren, INSERT-invoegen, VERWIJDEREN- verwijderen, VERBINDEN- in te vullen en etc.

VAN - een sleutelwoord zoals SELECT dat in elke opdracht voorkomt. Het wordt gevolgd door een spatie gevolgd door de naam van de tabellen die als informatiebron worden gebruikt. De namen van tabellen en velden moeten 1 tot 18 tekens bevatten, beginnen met een letter en mogen geen spaties of speciale tekens bevatten.

WAAR een trefwoord gevolgd door een predikaat is een voorwaarde die aan een record in de tabel wordt gesteld, waaraan het moet voldoen om in de selectie te verdwijnen.

BESTELLEN DOOR - sorteren van de weergegeven records (Asc - in oplopende volgorde, Desc - in aflopende volgorde. Als het sorteertype niet is opgegeven, gebeurt het sorteren in oplopende volgorde).

CHAR (lengte) CHARACTER (lengte)Tekenreeksen met constante lengte

INTEGER INTHele getallen

KLEINKlein geheel getal

NUMERIEK (precisie, graad) DECIMAAL (precisie, graad DEC (precisie, graad)Vast punt nummer

ZWEVEN (precisie)Drijvende komma nummer

Dubbele precisiegetallen met float zap hoge precisie

Uitdrukkingen in SQL worden ze gebruikt om criteria in te stellen voor het selecteren van gegevens of het uitvoeren van bewerkingen op waarden die uit een database worden gelezen. Expressies zijn een specifieke reeks databasevelden, constanten, functies, verbonden door operators.

constanten worden gebruikt om specifieke gegevenswaarden aan te geven. Vaste-puntconstanten, bijvoorbeeld: 21 -375.18 62.3

Drijvende-kommaconstanten, bijvoorbeeld: 1.5Е7 -3.14Е9 2.5Е-6 0.783Е24

Stringconstanten moet tussen enkele aanhalingstekens staan. Voorbeelden van dergelijke constanten: "Minsk" "New York" "Ivanov I. I."

Missende waarde(NUL). SQL ondersteunt het verwerken van ontbrekende gegevens met het concept van ontbrekende waarde.

De meeste SQL-georiënteerde DBMS ondersteunen de zogenaamde geaggregeerde (samenvatting) functies... Veelgebruikte aggregatiefuncties zijn onder meer:

· GRAAF- het aantal waarden in de tabelkolom;

· SOM- de som van de waarden in de kolom;

· AVG- het rekenkundig gemiddelde van de waarden in de kolom;

· MAX- de maximale waarde in de kolom;

· MIN Is de minimumwaarde in de kolom.

U kunt het volgende gebruiken in uitdrukkingen: typen operators:

· rekenkundig: + (toevoeging), - (aftrekken), * (vermenigvuldiging), / (afdeling);

· relatie: = (gelijk),> (groter dan),< (меньше), >= (groter dan of gelijk aan),<= (меньше или равно), <>(niet gelijk);

· denkspelletje: EN(logische "EN"), OF(logische "OF"), NIET(logische ontkenning);

56. Commando's voor het beheren van transacties stelt u in staat om de integriteit van de database te waarborgen.

SQL-transactie Zijn meerdere opeenvolgende SQL-commando's die als een enkele eenheid moeten worden uitgevoerd.

In SQL-taal wordt transactieverwerking geïmplementeerd met behulp van twee opdrachten: VERBINDEN en TERUGROLLEN... Ze beheren de wijzigingen die door een groep teams worden aangebracht. Opdracht VERBINDEN meldt de succesvolle afronding van de transactie. Het informeert het DBMS dat de transactie is voltooid, dat alle opdrachten met succes zijn uitgevoerd en dat er geen inconsistenties zijn opgetreden in de database. Opdracht TERUGROLLEN meldt een mislukte afronding van de transactie. Het informeert het DBMS dat de gebruiker de transactie niet wil voltooien en het DBMS moet alle wijzigingen die als gevolg van de transactie in de database zijn aangebracht, negeren. In dit geval brengt het DBMS de database terug in de staat waarin deze zich bevond voordat de transactie werd uitgevoerd.

Commando's VERBINDEN en TERUGROLLEN worden voornamelijk in de programmamodus gebruikt, hoewel ze ook in de interactieve modus kunnen worden gebruikt.

57. Toegang krijgen tot besturingsopdrachten verwijst naar opdrachten voor het uitvoeren van administratieve functies die het recht (privilege) toewijzen of intrekken om de databasetabellen op een bepaalde manier te gebruiken. Elke gebruiker van de database heeft bepaalde rechten met betrekking tot de objecten van de database.

Rechten Zijn dat acties met het object die de gebruiker kan uitvoeren. Rechten kunnen in de loop van de tijd veranderen: oude kunnen worden geannuleerd, nieuwe worden toegevoegd. De volgende rechten worden verleend:

INSERT - het recht om gegevens aan de tabel toe te voegen;

UPDATE - het recht om de gegevens van de tabel te wijzigen;

VERWIJDEREN - het recht om gegevens uit de tabel te verwijderen;

· REFERENTIES - het recht om de primaire sleutel te definiëren.

58 Taal inbedden in applicatieprogramma's ...Naar inbouw verwijst naar opdrachten die zijn ontworpen om toegang tot de database te implementeren vanuit toepassingsprogramma's die in een bepaalde programmeertaal zijn geschreven.

Laatst bijgewerkt: 24.06.2017

SQL Server is een van de meest populaire databasebeheersystemen (DBMS) ter wereld. Dit DBMS is geschikt voor een breed scala aan projecten: van kleine applicaties tot grote high-load projecten.

SQL Server is gemaakt door Microsoft. De eerste versie werd uitgebracht in 1987. En de huidige versie is versie 16, die in 2016 is uitgebracht en zal worden gebruikt in de huidige tutorial.

SQL Server is lange tijd een databasebeheersysteem voor alleen Windows geweest, maar sinds versie 16 is het ook beschikbaar op Linux.

SQL Server wordt gekenmerkt door functies als:

    Uitvoering. SQL Server is erg snel.

    Betrouwbaarheid en veiligheid. SQL Server biedt gegevensversleuteling.

    Eenvoud. Dit DBMS is relatief eenvoudig om mee te werken en te beheren.

Het centrale aspect in MS SQL Server, zoals in elk DBMS, is de database. Een database is een opslagplaats van gegevens die op een specifieke manier zijn georganiseerd. Het is niet ongebruikelijk dat een database fysiek een bestand op een harde schijf vertegenwoordigt, hoewel deze toewijzing niet vereist is. Databasebeheersystemen of DBMS'en worden gebruikt om databases op te slaan en te beheren. En alleen MS SQL Server is zo'n DBMS.

Om databases te organiseren, gebruikt MS SQL Server een relationeel model. Dit databasemodel is in 1970 ontwikkeld door Edgar Codd. En vandaag is het eigenlijk de standaard voor het organiseren van databases.

Het relationele model gaat uit van opslag van gegevens in de vorm van tabellen, die elk bestaan ​​uit rijen en kolommen. Elke rij bevat een afzonderlijk object en de kolommen bevatten de kenmerken van dat object.

Een primaire sleutel wordt gebruikt om elke rij in de tabel te identificeren. Een of meer kolommen kunnen fungeren als primaire sleutel. Door de primaire sleutel te gebruiken, kunnen we verwijzen naar een specifieke rij in de tabel. Dienovereenkomstig kunnen twee rijen niet dezelfde primaire sleutel hebben.

Door middel van sleutels kan de ene tabel aan de andere worden gekoppeld, dat wil zeggen, koppelingen kunnen tussen twee tabellen worden georganiseerd. En de tabel zelf kan worden weergegeven als een "relatie".

De taal SQL (Structured Query Language) wordt gebruikt om te communiceren met de database. Een client (bijvoorbeeld een extern programma) stuurt een query in SQL met behulp van een speciale API. Het DBMS interpreteert en voert het verzoek correct uit en stuurt het resultaat vervolgens naar de client.

SQL is oorspronkelijk bij IBM ontwikkeld voor een databasesysteem genaamd System/R. Tegelijkertijd werd de taal zelf SEQUEL (Structured English Query Language) genoemd. Hoewel noch de database, noch de taal zelf uiteindelijk officieel werden gepubliceerd, wordt de term SQL zelf traditioneel vaak uitgesproken als een 'vervolg'.

In 1979 werd Relational Software Inc. ontwikkelde het eerste databasebeheersysteem, Oracle genaamd, dat gebruikmaakte van de SQL-taal. Vanwege het succes van dit product werd het bedrijf omgedoopt tot Oracle.

Vervolgens begonnen andere databasesystemen te verschijnen die SQL gebruikten. Uiteindelijk, in 1989, codificeerde het American National Standards Institute (ANSI) de taal en publiceerde het zijn eerste standaard. Daarna werd de standaard periodiek geactualiseerd en aangevuld. De laatste update vond plaats in 2011. Maar ondanks het bestaan ​​van een standaard gebruiken databaseleveranciers vaak hun eigen implementaties van de SQL-taal, die enigszins van elkaar verschillen.

Er zijn twee smaken van de SQL-taal: PL-SQL en T-SQL. PL-SQL wordt gebruikt in DBMS als Oracle en MySQL. T-SQL (Transact-SQL) wordt gebruikt in SQL Server. Dat is de reden waarom T-SQL in deze tutorial wordt overwogen.

Afhankelijk van de taak die de T-SQL-opdracht uitvoert, kan het een van de volgende typen zijn:

    DDL (Data Definition Language). Dit type bevat verschillende opdrachten die een database, tabellen, indexen, opgeslagen procedures, enz. creëren. Over het algemeen zijn gegevens gedefinieerd.

    In het bijzonder kunnen we de volgende commando's aan dit type toeschrijven:

    • CREATE: Maakt database-objecten (de database zelf, tabellen, indexen, enz.)

      ALTER: wijzigt database-objecten

      DROP: laat database-objecten vallen

      TRUNCATE: verwijdert alle gegevens uit tabellen

    DML (Data Manipulatie Taal). Dit type omvat opdrachten voor het selecteren van gegevens, bijwerken, toevoegen, verwijderen - in het algemeen al die opdrachten waarmee we gegevens kunnen manipuleren.

    De volgende commando's zijn van dit type:

    • SELECT: haalt gegevens op uit DB

      UPDATE: werkt gegevens bij

      INSERT: voegt nieuwe gegevens toe

      VERWIJDEREN: verwijdert gegevens

    DCL (Data Control Language). Dit type bevat opdrachten die gegevenstoegangsrechten beheren. Dit zijn in het bijzonder de volgende opdrachten:

    • GRANT: verleent gegevenstoegangsrechten

      REVOKE: trekt gegevenstoegangsrechten in

Leran2002 9 april 2015 om 12:31 uur

Tutorial over de SQL-taal (DDL, DML) aan de hand van het voorbeeld van het MS SQL Server-dialect. Deel een

  • Microsoft SQL-server,
  • SQL
  • zelfstudie

Waar gaat deze tutorial over?

Deze tutorial is zoiets als een "stempel van mijn geheugen" voor de SQL-taal (DDL, DML), d.w.z. dit is informatie die zich tijdens mijn professionele activiteit heeft verzameld en voortdurend in mijn hoofd wordt opgeslagen. Dit is voor mij een voldoende minimum, dat het vaakst wordt gebruikt bij het werken met databases. Als het nodig is om completere SQL-constructies te gebruiken, wend ik me meestal tot de MSDN-bibliotheek op internet voor hulp. Naar mijn mening is het heel moeilijk om alles in je hoofd te houden, en daar is ook geen specifieke behoefte aan. Maar het is erg handig om de basisconstructies te kennen, omdat: ze zijn in bijna dezelfde vorm toepasbaar in veel relationele databases zoals Oracle, MySQL, Firebird. De verschillen zitten vooral in datatypes, die in detail kunnen verschillen. Er zijn niet zo veel basisconstructies van de SQL-taal, en met constante oefening worden ze snel onthouden. Om bijvoorbeeld objecten (tabellen, beperkingen, indexen, enz.) te maken, is het voldoende om een ​​teksteditor van de omgeving (IDE) bij de hand te hebben om met de database te werken, en het is niet nodig om visuele hulpmiddelen te bestuderen die zijn aangescherpt voor werken met een specifiek type database (MS SQL, Oracle, MySQL, Firebird, ...). Het is ook handig omdat alle tekst voor je ogen staat en je niet talloze tabbladen hoeft te doorlopen om bijvoorbeeld een index of een beperking te maken. Door constant met een database te werken, gaat het creëren, wijzigen en vooral opnieuw maken van een object met behulp van scripts vele malen sneller dan wanneer het in de visuele modus wordt gedaan. Ook in de scriptmodus (dienovereenkomstig, met de nodige zorgvuldigheid), is het gemakkelijker om de regels voor het benoemen van objecten in te stellen en te controleren (mijn subjectieve mening). Daarnaast zijn scripts handig in gebruik wanneer wijzigingen in de ene database (bijvoorbeeld een testdatabase) in dezelfde vorm moeten worden overgedragen naar een andere (productieve) database.

De SQL-taal is opgedeeld in verschillende delen, hier bespreek ik de 2 belangrijkste delen ervan:
  • DML - Taal voor gegevensmanipulatie, die de volgende constructies bevat:
    • SELECT - gegevensselectie
    • INSERT - nieuwe gegevens invoegen
    • UPDATE - gegevensupdate
    • VERWIJDEREN - gegevens verwijderen
    • SAMENVOEGEN - gegevens samenvoegen
Omdat Ik ben een beoefenaar, er zal weinig theorie als zodanig in deze tutorial zijn, en alle constructies zullen worden uitgelegd met praktische voorbeelden. Daarnaast geloof ik dat een programmeertaal, en met name SQL, alleen in de praktijk te beheersen is, door het zelf te voelen en te begrijpen wat er gebeurt als je deze of gene constructie uitvoert.

Deze tutorial is gebaseerd op het Step by Step-principe, d.w.z. het is noodzakelijk om het achtereenvolgens te lezen en bij voorkeur onmiddellijk na de voorbeelden. Maar als u onderweg meer wilt weten over een opdracht, gebruik dan een specifieke zoekopdracht op internet, bijvoorbeeld in de MSDN-bibliotheek.

Bij het schrijven van deze tutorial werd de MS SQL Server database versie 2014 gebruikt, om de scripts uit te voeren die ik gebruikte MS SQL Server Management Studio (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. De belangrijkste tool in SQL Server Management Studio is Object Explorer, waarmee de gebruiker serverobjecten kan bekijken, ophalen en manipuleren. Deze tekst is gedeeltelijk ontleend aan Wikipedia.

Gebruik de knop Nieuwe query om een ​​nieuwe scripteditor te maken:

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

Om een ​​specifieke opdracht (of een groep opdrachten) uit te voeren, selecteert u deze en drukt u op de knop Uitvoeren of de F5-toets. Als er op dit moment slechts één commando in de editor is, of je moet alle commando's uitvoeren, dan hoef je niets te selecteren.

Na het uitvoeren van scripts, vooral degenen die objecten maken (tabellen, kolommen, indexen), om de wijzigingen te zien, gebruikt u de update vanuit het contextmenu, waarbij u de juiste groep (bijvoorbeeld tabellen), de tabel zelf of de groep Kolommen daarin markeert.

Eigenlijk is dit alles wat we moeten weten om de hier gegeven voorbeelden uit te voeren. De rest van het SSMS-hulpprogramma is gemakkelijk zelf te leren.

Een beetje theorie

Een relationele database (RDB, of verder in de context van gewoon een database) is een verzameling tabellen die met elkaar verbonden zijn. Een database is grofweg een bestand waarin gegevens gestructureerd zijn opgeslagen.

DBMS is een beheersysteem voor deze databases, d.w.z. het is een set tools om met een specifiek type database te werken (MS SQL, Oracle, MySQL, Firebird, ...).

Opmerking
Omdat in het echte leven, in de omgangstaal, zeggen we meestal: "Oracle DB", of zelfs gewoon "Oracle", wat eigenlijk "Oracle DBMS" betekent, dan zal in de context van deze tutorial de term DB soms worden gebruikt. Uit de context denk ik dat het wel duidelijk zal zijn waar het over gaat.

Een tabel is een verzameling kolommen. Kolommen kunnen ook velden of kolommen worden genoemd, al deze woorden zullen als synoniemen worden gebruikt om hetzelfde uit te drukken.

De tabel is het hoofdobject van de RDB, alle RDB-gegevens worden regel voor regel in de kolommen van de tabel opgeslagen. Strings, records zijn ook synoniemen.

Voor elke tabel, evenals voor de kolommen, worden namen gegeven, waarmee ze vervolgens worden benaderd.
Een objectnaam (tabelnaam, kolomnaam, indexnaam, etc.) in MS SQL mag maximaal 128 tekens lang zijn.

Als referentie- in de ORACLE database mogen objectnamen maximaal 30 karakters lang zijn. Daarom moet u voor een specifieke database uw eigen regels ontwikkelen voor het benoemen van objecten om binnen de limiet van het aantal tekens te blijven.

SQL is een taal waarmee u query's in een database kunt uitvoeren 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 aan te maken en te wijzigen, d.w.z. om tabellen en links te maken/wijzigen/verwijderen.
  • DML-taal maakt manipulatie van tabelgegevens mogelijk, d.w.z. met haar lijnen. Hiermee kunt u gegevens uit tabellen selecteren, nieuwe gegevens aan tabellen toevoegen en bestaande gegevens bijwerken en verwijderen.

Er zijn 2 soorten opmerkingen die in SQL kunnen worden gebruikt (enkelregelig en meerregelig):

Enkele regel opmerking
en

/ * commentaar met meerdere regels * /

Eigenlijk zal dit voldoende zijn voor de theorie.

DDL - Taal voor gegevensdefinitie

Denk bijvoorbeeld aan een tabel met gegevens over werknemers, in de gebruikelijke vorm voor een persoon die geen programmeur is:

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

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

  • Personeelsnummer - geheel getal
  • Volledige naam - tekenreeks
  • Geboortedatum - datum
  • E-mail - tekenreeks
  • Positie - tekenreeks
  • Afdeling - tekenreeks
Kolomtype is een kenmerk dat aangeeft wat voor soort 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 MS SQL-notatie Beschrijving
String met variabele lengte varchar (N)
en
nvarchar (N)
Met het getal N kunnen we de maximaal mogelijke rijlengte voor de bijbehorende kolom specificeren. Als we bijvoorbeeld willen zeggen dat de waarde van de kolom "naam" maximaal 30 tekens kan bevatten, moeten we deze instellen op het type nvarchar (30).
Het verschil tussen varchar en nvarchar is dat varchar tekenreeksen opslaat in ASCII-indeling, waarbij één teken 1 byte is, en nvarchar tekenreeksen opslaat in Unicode-indeling, waarbij elk teken 2 bytes is.
Het varchar-type mag alleen worden gebruikt als u er 100% zeker van bent dat het veld geen Unicode-tekens hoeft op te slaan. Varchar kan bijvoorbeeld worden gebruikt om e-mailadressen op te slaan omdat: ze bevatten meestal alleen ASCII-tekens.
String met vaste lengte char (N)
en
nchar (N)
Dit type verschilt van een tekenreeks met variabele lengte doordat als de tekenreeks minder dan N tekens lang is, deze altijd naar rechts wordt opgevuld tot de lengte van N met spaties en in deze vorm in de database wordt opgeslagen, d.w.z. het neemt precies N tekens in beslag in de database (waarbij één teken 1 byte in beslag neemt voor char en 2 bytes voor nchar). In mijn praktijk wordt dit type zeer zelden gebruikt, en als het wordt gebruikt, wordt het voornamelijk gebruikt in het char (1)-formaat, d.w.z. wanneer het veld wordt gedefinieerd door één 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 is van -2 147 483 648 tot 2 147 483 647. Gewoonlijk is dit het hoofdtype dat wordt gebruikt om identifiers in te stellen.
Echt of echt getal vlot Simpel gezegd zijn dit getallen waarin een decimaalteken (komma) kan voorkomen.
datum datum Als u alleen de Datum in de kolom wilt opslaan, die uit drie componenten bestaat: Getal, Maand en Jaar. Bijvoorbeeld 15-02-2014 (15 februari 2014). Dit type kan gebruikt worden voor de kolom "Toelatingsdatum", "Geboortedatum", etc. in gevallen waarin het voor ons belangrijk is om alleen de datum vast te leggen, of wanneer de tijdcomponent niet belangrijk voor ons is en kan worden weggegooid of als deze niet bekend is.
Tijd tijd Dit type kan worden gebruikt als alleen tijdgegevens in een kolom moeten worden opgeslagen, d.w.z. Uren, minuten, seconden en milliseconden. Bijvoorbeeld 17:38: 31.3231603
Bijvoorbeeld de dagelijkse "Vertrektijd van de vlucht".
datum en tijd datum Tijd Met dit type kunt u zowel Datum als Tijd tegelijkertijd opslaan. Bijvoorbeeld 15.02.2014 17:38: 31.323
Dit kan bijvoorbeeld de datum en tijd van een evenement zijn.
Vlag beetje Dit type is handig voor het opslaan van waarden zoals "Ja" / "Nee", waarbij "Ja" wordt opgeslagen als 1, en "Nee" wordt opgeslagen als 0.

Ook mag de veldwaarde, als deze niet verboden is, niet worden opgegeven, hiervoor wordt het NULL-sleutelwoord gebruikt.

Laten we, om de voorbeelden uit te voeren, een testbasis maken met de naam Test.

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

MAAK DATABASE-test
U kunt de database verwijderen met het commando (je moet heel voorzichtig zijn met dit commando):

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

GEBRUIK-Test
U kunt ook de Testdatabase selecteren in de vervolgkeuzelijst in het SSMS-menugebied. Als ik aan het werk ben, gebruik ik vaak deze manier van schakelen tussen bases.

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

MAAK TABEL [Medewerkers] ([Personeelsnummer] int, [Volledige naam] nvarchar (30), [geboortedatum] datum, nvarchar (30), [Functie] nvarchar (30), [Afdeling] nvarchar (30))
In dit geval moeten we de namen tussen vierkante haken plaatsen [...].

Maar in de database is het voor meer gemak beter om alle namen van objecten in het Latijnse alfabet te specificeren en geen spaties in de namen te gebruiken. In MS SQL, meestal in dit geval, begint elk woord met een hoofdletter, bijvoorbeeld voor het veld "Personeelsnummer" zouden we de naam PersonnelNumber kunnen instellen. U kunt ook cijfers in de naam gebruiken, bijvoorbeeld Telefoonnummer1.

op een notitie
In sommige DBMS kan de volgende naamgevingsindeling "PHONE_NUMBER" de voorkeur hebben, deze indeling wordt bijvoorbeeld vaak gebruikt in ORACLE DB. Uiteraard is het bij het specificeren van de veldnaam wenselijk dat deze niet samenvalt met de trefwoorden die in het DBMS worden gebruikt.

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

DROP TABEL [Medewerkers]
Een tabel met werknemers kan bijvoorbeeld "Werknemers" heten, en de velden kunnen als volgt worden genoemd:

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

Laten we nu onze tabel maken:

MAAK TABEL Werknemers (ID int, Naam nvarchar (30), Verjaardagsdatum, E-mail nvarchar (30), Functie nvarchar (30), Afdeling nvarchar (30))
U kunt de optie NOT NULL gebruiken om de vereiste kolommen op te geven.

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

Het ID-veld bijwerken ALTER TABLE Werknemers ALTER COLUMN ID int NOT NULL - het veld Naam bijwerken ALTER TABLE Werknemers ALTER COLUMN Naam nvarchar (30) NOT NULL

op een notitie
Het algemene concept van de SQL-taal voor de meeste DBMS'en blijft hetzelfde (tenminste, ik kan dit beoordelen aan de hand van de DBMS'en waarmee ik heb gewerkt). Het verschil tussen DDL in verschillende DBMS'en ligt voornamelijk in gegevenstypen (hier kunnen niet alleen hun namen verschillen, maar ook de details van hun implementatie), de details van de implementatie van de SQL-taal kunnen ook enigszins verschillen (dwz de essentie van de commando's is hetzelfde, maar er kunnen kleine verschillen zijn in het dialect, helaas, maar er is geen standaard). Als u de basisprincipes van SQL kent, kunt u gemakkelijk van het ene DBMS naar het andere overschakelen, 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 is een eenvoudige analogie voldoende.

Tabel maken TABEL MAKEN Medewerkers (ID int, - in ORACLE, int type is het equivalent (wrapper) voor nummer (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)); - het bijwerken van de ID- en Naam-velden (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 zoals in MS SQL, deze wordt hieronder getoond) WIJZIG TABEL Medewerkers ADD CONSTRAINT PK_Employees PRIMAIRE SLEUTEL (ID);
Voor ORACLE zijn er verschillen in de implementatie van het varchar2-type, de codering hangt af van de database-instellingen en de tekst kan worden opgeslagen, bijvoorbeeld in UTF-8-codering. Bovendien kan de veldlengte in ORACLE zowel in bytes als in tekens worden ingesteld, hiervoor worden extra opties BYTE en CHAR gebruikt, die achter de veldlengte worden gespecificeerd, bijvoorbeeld:

NAAM varchar2 (30 BYTE) - de veldcapaciteit zal 30 bytes zijn NAAM varchar2 (30 CHAR) - de veldcapaciteit zal 30 tekens zijn
Welke optie standaard wordt gebruikt BYTE of CHAR, in het geval van een eenvoudige aanduiding van het type varchar2 (30) in ORACLE, hangt af van de database-instellingen, het kan soms ook worden ingesteld in de IDE-instellingen. Over het algemeen kan het soms gemakkelijk zijn om in de war te raken, daarom, in het geval van ORACLE, als het varchar2-type wordt gebruikt (en dit is hier soms gerechtvaardigd, bijvoorbeeld bij het gebruik van UTF-8-codering), geef ik er de voorkeur aan expliciet te schrijven CHAR (omdat het meestal handiger is om de tekenreekslengte in tekens te lezen).

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

INSERT Werknemers (ID, Functie, Afdeling) WAARDEN (1000, N "Directeur", N "Administratie"), (1001, N "Programmeur", N "IT"), (1002, N "Accountant", N "Accountant" ), (1003, N "Senior Programmeur", N "IT")
In dit geval zal het INSERT-commando ook een fout genereren, aangezien: bij het invoegen hebben we de waarde van het vereiste veld Naam niet opgegeven.
Als we deze gegevens al in de originele tabel hadden, dan zou het commando "ALTER TABLE Employees ALTER COLUMN ID int NOT NULL" succesvol zijn voltooid, en het commando "ALTER TABLE Employees ALTER COLUMN Name int NOT NULL" zou een foutmelding hebben gegenereerd , dat er NULL (niet-gespecificeerde) waarden in het veld Naam staan.

Voeg waarden toe voor het veld Naam en vul de gegevens opnieuw in:


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

Laten we eerst de tabel verwijderen met de opdracht:

DROP TAFEL Medewerkers
Laten we nu een tabel maken met verplichte kolommen ID en Naam:

MAAK TABEL Werknemers (ID int NOT NULL, Naam nvarchar (30) NOT NULL, Verjaardagsdatum, E-mail nvarchar (30), Positie nvarchar (30), Afdeling nvarchar (30))
Je kunt ook NULL schrijven achter de naam van de kolom, wat betekent dat NULL-waarden (niet gespecificeerd) erin zullen worden toegestaan, maar dit is niet nodig, omdat dit kenmerk standaard wordt aangenomen.

Als het daarentegen nodig is om de bestaande kolom optioneel te maken voor het vullen, gebruiken we de volgende opdrachtsyntaxis:

WIJZIG TABEL Werknemers WIJZIG KOLOM Naam nvarchar (30) NULL
Of gewoon:

WIJZIG TABEL Werknemers WIJZIG KOLOM Naam nvarchar (30)
Met deze opdracht kunnen we ook het type veld wijzigen in een ander compatibel type of de lengte ervan wijzigen. Laten we bijvoorbeeld het veld Naam uitbreiden tot 50 tekens:

WIJZIG TABEL Werknemers WIJZIG KOLOM Naam nvarchar (50)

Hoofdsleutel

Bij het maken van een tabel is het wenselijk dat deze een unieke kolom heeft of een set kolommen die uniek is voor elk van zijn rijen - een record kan uniek worden geïdentificeerd aan de hand van deze unieke waarde. Deze waarde wordt de primaire sleutel van de tabel genoemd. Voor onze tabel Medewerkers kan zo'n unieke waarde de ID-kolom zijn (die het "Personeelsnummer van de werknemer" bevat - zelfs als deze waarde in ons geval uniek is voor elke werknemer en niet kan worden herhaald).

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

WIJZIG TABEL Werknemers ADD CONSTRAINT PK_Employees PRIMAIRE SLEUTEL (ID)
Waarbij "PK_Employees" de naam is van de beperking die verantwoordelijk is voor de primaire sleutel. Meestal wordt het voorvoegsel "PK_" gebruikt om de primaire sleutel een naam te geven, gevolgd door de tabelnaam.

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

ALTER TABLE table_name ADD CONSTRAINT constraint_name PRIMAIRE SLEUTEL (veld1, veld2, ...)
Het is vermeldenswaard dat in MS SQL alle velden die zijn opgenomen in de primaire sleutel NIET NULL mogen zijn.

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

DROP TAFEL Medewerkers
En laten we het dan maken met behulp van 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 PRIMAIRE SLEUTEL (ID) - beschrijf PK tenslotte velden als beperking)
Vul na het maken de gegevens in de tabel in:

VOEG werknemers in (ID, functie, afdeling, naam) WAARDEN (1000, N "Directeur", N "Administratie", N "Ivanov I.I."), (1001, N "Programmer", N "IT", N " Petrov PP " ), (1002, N" Accountant ", N" Accounting ", N" Sidorov SS "), (1003, N" Senior programmeur ", N" IT ", N" Andreev A. A.")
Als de primaire sleutel in de tabel alleen uit de waarden van één kolom bestaat, kan de volgende syntaxis worden gebruikt:

MAAK TABEL Werknemers (ID int NOT NULL CONSTRAINT PK_Employees PRIMARY KEY, - specificeer als een kenmerk van het veld Naam nvarchar (30) NOT NULL, Verjaardagsdatum, E-mail nvarchar (30), Positie nvarchar (30), Afdeling nvarchar (30))
In feite kan de naam van de beperking worden weggelaten, in welk geval deze een systeemnaam krijgt (zoals "PK__Employee__3214EC278DA42077"):

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

MAAK TABEL Werknemers (ID int NOT NULL PRIMAIRE SLEUTEL, Naam nvarchar (30) NOT NULL, Verjaardagsdatum, E-mail nvarchar (30), Positie nvarchar (30), Afdeling nvarchar (30))
Maar ik zou aanraden om altijd expliciet de naam van de beperking op te geven voor persistente tabellen, aangezien: door een expliciet gegeven en begrijpelijke naam, zal het later gemakkelijker te manipuleren zijn, u kunt het bijvoorbeeld verwijderen:

ALTER TABLE Werknemers DROP CONSTRAINT PK_Employees
Maar zo'n korte syntaxis, zonder de namen van 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 samenvatten

Tot nu toe hebben we de volgende opdrachten behandeld:
  • MAAK TAFEL tabelnaam (opsomming van velden en hun typen, beperkingen) - wordt gebruikt om een ​​nieuwe tabel in de huidige database te maken;
  • DROP TAFEL table_name - dient om een ​​tabel uit de huidige database te verwijderen;
  • WIJZIG TABEL tafel naam WIJZIG KOLOM kolomnaam… - wordt gebruikt om het type van een kolom bij te werken of om de instellingen ervan te wijzigen (bijvoorbeeld om het NULL- of NOT NULL-kenmerk op te geven);
  • WIJZIG TABEL tafel naam BEPERKING TOEVOEGEN constraint_name HOOFDSLEUTEL(field1, field2, ...) - een primaire sleutel toevoegen aan een bestaande tabel;
  • WIJZIG TABEL tafel naam DROP-BEPERKING constraint_name - verwijdert de beperking uit de tabel.

Een beetje over tijdelijke tafels

Fragment uit MSDN. Er zijn twee soorten tijdelijke tabellen in MS SQL Server: lokaal (#) en globaal (##). Lokale tijdelijke tabellen zijn alleen zichtbaar voor hun makers totdat de verbinding met de SQL Server-instantie wordt beëindigd, zodra ze voor het eerst zijn gemaakt. Lokale tijdelijke tabellen worden automatisch verwijderd nadat een gebruiker de verbinding met een 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 deze tabellen verwijzen, de verbinding met het SQL Server-exemplaar verbreken.

Tijdelijke tabellen worden aangemaakt in de tempdb-systeemdatabase, d.w.z. door ze te maken, vervuilen we de hoofdbasis niet, anders zijn de tijdelijke tabellen volledig identiek aan gewone tabellen, ze kunnen ook worden verwijderd met behulp van het DROP TABLE-commando. Lokale (#) tijdelijke tabellen worden vaker gebruikt.

U kunt de opdracht CREATE TABLE gebruiken om een ​​tijdelijke tabel te maken:

MAAK TABEL #Temp (ID int, Naam nvarchar (30))
Aangezien een tijdelijke tabel in MS SQL vergelijkbaar is met een gewone tabel, kunt u deze ook zelf neerzetten met het DROP TABLE-commando:

DROP TABEL #Temp

Er kan ook een tijdelijke tabel (zoals een gewone tabel zelf) worden gemaakt en onmiddellijk worden gevuld met gegevens die worden geretourneerd door een query met behulp van de SELECT ... INTO-syntaxis:

SELECT ID, Name INTO #Temp FROM Employees

op een notitie
Implementatie van tijdelijke tabellen kan verschillen in verschillende DBMS'en. In ORACLE en Firebird DBMS moet de structuur van tijdelijke tabellen bijvoorbeeld vooraf worden gedefinieerd met de opdracht CREATE GLOBAL TEMPORARY TABLE die de details van het opslaan van gegevens erin aangeeft, waarna de gebruiker deze tussen de hoofdtabellen ziet en ermee werkt zoals met een gewone tafel.

Databasenormalisatie - opsplitsen in subtabellen (naslagwerken) en relaties definiëren

Onze huidige werknemerstabel heeft het nadeel dat de gebruiker elke tekst kan invoeren in de velden Positie en Afdeling, wat in de eerste plaats vol fouten zit, aangezien een werknemer eenvoudig "IT" als afdeling kan specificeren, en een tweede werknemer, voor voer bijvoorbeeld "IT-afdeling" in bij de derde "IT". Hierdoor zal het onduidelijk zijn wat de gebruiker bedoelde, d.w.z. Zijn deze medewerkers medewerkers van dezelfde afdeling, of wordt de gebruiker zelf omschreven en zijn dit 3 verschillende afdelingen? Bovendien zijn we in dit geval niet in staat om de gegevens correct te groeperen voor een rapport, waar het nodig kan zijn om het aantal werknemers in de context van elke afdeling weer te geven.

Het tweede nadeel is de hoeveelheid opslag van deze informatie en de duplicatie ervan, d.w.z. voor elke medewerker wordt de volledige naam van de afdeling aangegeven, waarvoor ruimte in de database nodig is om elk teken van de afdelingsnaam op te slaan.

Het derde nadeel is de complexiteit van het bijwerken van deze velden als de naam van een positie verandert, bijvoorbeeld als u de positie "Programmer" moet hernoemen naar "Junior Programmer". In dit geval moeten we wijzigingen aanbrengen in elke regel van de tabel, waarin de Positie gelijk is aan "Programmer".

Om deze tekortkomingen te voorkomen, wordt de zogenaamde normalisatie van de database toegepast - deze wordt opgesplitst in subtabellen, referentietabellen. Het is niet nodig om de jungle van theorie in te gaan en te bestuderen wat normale vormen zijn, het is voldoende om de essentie van normalisatie te begrijpen.

Laten we 2 tabellen "Posities" en "Afdelingen" maken, de eerste heet Posities en de tweede respectievelijk Afdelingen:

CREATE TABLE Posities (ID int IDENTITY (1,1) NOT NULL CONSTRAINT PK_Positions PRIMARY KEY, Name nvarchar (30) NOT NULL) CREATE TABLE Afdelingen (ID int IDENTITY (1,1) NOT NULL CONSTRAINT PK_Departments PRIMARY KEY, Name nvarchar (30 ) NIET NUL)
Merk op dat we hier de nieuwe IDENTITY-optie hebben gebruikt, die zegt dat de gegevens in de ID-kolom automatisch worden genummerd, beginnend bij 1, met een stap van 1, d.w.z. bij het toevoegen van nieuwe records krijgen ze achtereenvolgens de waarden 1, 2, 3, enz. toegewezen. Dergelijke velden worden gewoonlijk auto-incrementing genoemd. Er kan slechts één veld met de eigenschap IDENTITY in een tabel worden gedefinieerd, en gewoonlijk, maar niet noodzakelijk, is zo'n veld de primaire sleutel voor die tabel.

op een notitie
In verschillende DBMS'en kan de implementatie van velden met een teller op hun eigen manier worden gedaan. In MySQL wordt zo'n veld bijvoorbeeld gedefinieerd met de optie AUTO_INCREMENT. Eerder in ORACLE en Firebird kon deze functionaliteit worden geëmuleerd met SEQUENCE. Maar voor zover ik weet, heeft ORACLE nu de optie GEGENEREERD ALS IDENTITEIT toegevoegd.

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

Vul het veld Naam van de tabel Posities in met unieke waarden uit het veld Positie van de tabel Werknemers VOEG Posities in (Naam) SELECTEER DISTINCT Positie FROM Medewerkers WHERE Position IS NOT NULL - verwijder records waarvan de positie niet is opgegeven
Laten we hetzelfde doen voor de tabel Afdelingen:

INSERT Afdelingen (Naam) SELECTEER AFDELING UIT Medewerkers WAAR Afdeling NIET NULL is
Als we nu de tabellen Posities en Afdelingen openen, zien we een genummerde set waarden voor het ID-veld:

KIES * UIT Posities

KIES * UIT Afdelingen

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

Voeg een veld toe voor de functie ID ALTER TABLE Employees ADD PositionID int - voeg een veld toe voor de ID van de afdeling ALTER TABLE Employees ADD DepartmentID int
Het type van de referentievelden moet hetzelfde zijn als in de referenties, in dit geval is het int.

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

WIJZIG TABEL Werknemers TOEVOEGEN PositionID int, DepartmentID int
Nu zullen we links (referentiebeperkingen - BUITENLANDSE SLEUTEL) voor deze velden schrijven, zodat de gebruiker niet in deze velden de waarden kan schrijven die afwezig zijn bij de ID-waarden die in de naslagwerken worden gevonden.

ALTER TABLE Werknemers ADD CONSTRAINT FK_Employees_PositionID FOREIGN KEY (PositionID) REFERENTIES Posities (ID)
En we zullen hetzelfde doen voor het tweede veld:

ALTER TABLE Werknemers ADD CONSTRAINT FK_Employees_DepartmentID FOREIGN KEY (DepartmentID) REFERENTIES Afdelingen (ID)
Nu kan de gebruiker alleen ID-waarden uit de bijbehorende map in deze velden invoeren. Om een ​​nieuwe afdeling of functie te kunnen gebruiken, zal hij dus eerst een nieuw record moeten toevoegen aan de corresponderende directory. Omdat posities en afdelingen worden nu in één enkele kopie in mappen opgeslagen, en om de naam te wijzigen, volstaat het om deze alleen in de map te wijzigen.

De naam van de referentiebeperking is meestal een samengestelde, deze bestaat uit het voorvoegsel "FK_", dan volgt de naam van de tabel en na het onderstrepingsteken staat de naam van het veld dat verwijst naar de identifier van de referentietabel.

De identifier (ID) is meestal een interne waarde die alleen voor links wordt gebruikt en welke waarde daar wordt opgeslagen, is in de meeste gevallen absoluut onverschillig, dus u hoeft niet te proberen gaten in de reeks getallen die ontstaan tijdens het werken met de tabel, bijvoorbeeld na het verwijderen van records uit het naslagwerk.

ALTER TABLE tabel ADD CONSTRAINT constraint_name FOREIGN KEY (field1, field2, ...) REFERENCES reference_table (field1, field2, ...)
In dit geval wordt in de tabel "dir_table" de primaire sleutel weergegeven door een combinatie van verschillende velden (field1, field2, ...).

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

UPDATE e SET PositionID = (SELECT ID FROM Positions WHERE Name = e.Position), DepartmentID = (SELECT ID FROM Departments WHERE Name = e.Department) FROM Medewerkers e
Laten we eens kijken wat er is gebeurd door de query uit te voeren:

KIES * VAN Medewerkers

Dat is alles, de velden PositieID en AfdelingID worden ingevuld overeenkomstig de functies en afdelingen met identifiers. De velden Positie en Afdeling in de tabel Medewerkers zijn niet nodig, u kunt deze velden verwijderen:

WIJZIG TABEL Medewerkers DROP COLUMN Positie, afdeling
Nu heeft de tabel de volgende vorm gekregen:

KIES * VAN Medewerkers

ID kaart Naam Verjaardag E-mail Positie-ID Afdelings-ID
1000 Ivanov II NUL NUL 2 1
1001 Petrov PP NUL NUL 3 3
1002 Sidorov SS NUL NUL 1 2
1003 Andreev AA NUL NUL 4 3

Die. als gevolg daarvan hebben we de opslag van overbodige informatie afgeschaft. Nu kunnen we aan de hand van de positie- en afdelingsnummers hun namen op unieke wijze bepalen met behulp van de waarden in de referentietabellen:

SELECT e.ID, e.Name, p.Name PositionName, d.Name Afdelingsnaam VAN Medewerkers e LEFT JOIN Departments d ON d.ID = e.DepartmentID LEFT JOIN Posities p ON p.ID = e.PositionID

In de objectinspecteur kunnen we alle objecten zien die voor deze 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 link maken. Laten we bijvoorbeeld nog een ManagerID-veld toevoegen aan onze tabel met medewerkers, die zal verwijzen naar de medewerker aan wie deze medewerker ondergeschikt is. Laten we een veld maken:

WIJZIG TABEL Medewerkers ADD ManagerID int
NULL is toegestaan ​​in dit veld, het veld zal leeg zijn als er bijvoorbeeld geen meerderen boven de medewerker staan.

Laten we nu een BUITENLANDSE SLEUTEL maken in de tabel Werknemers:

ALTER TABLE Werknemers ADD CONSTRAINT FK_Employees_ManagerID BUITENLANDSE SLEUTEL (ManagerID) REFERENTIES Werknemers (ID)
Laten we nu een diagram maken en kijken hoe de relaties tussen onze tabellen eruit zien:

Als resultaat zouden we de volgende afbeelding moeten zien (de tabel Werknemers is gekoppeld aan de tabellen Posities en Afdelingen, en verwijst ook naar zichzelf):

Ten slotte moet worden gezegd dat referentiesleutels extra opties kunnen bevatten ON DELETE CASCADE en ON UPDATE CASCADE, die vertellen hoe te handelen bij het verwijderen of bijwerken van een record waarnaar wordt verwezen in de referentietabel. Als deze opties niet zijn gespecificeerd, kunnen we de ID in de referentietabel niet wijzigen voor het record waarnaar er koppelingen zijn uit een andere tabel, ook kunnen we een dergelijk record niet uit de referentie verwijderen totdat we alle regels verwijderen die verwijzen naar dit record, of we werken de koppelingen in deze regels bij naar een andere waarde.

Laten we bijvoorbeeld de tabel opnieuw maken met de ON DELETE CASCADE-optie voor FK_Employees_DepartmentID:

DROP TABEL Werknemers MAAK TABEL Werknemers (ID int NOT NULL, naam nvarchar (30), verjaardagsdatum, e-mail nvarchar (30), PositionID int, DepartmentID int, ManagerID int, CONSTRAINT PK_Employees PRIMARY KEY (ID), CONSTRAINT FK_Employees_DepartmentID FOREIGN KEY (Afdeling ) REFERENTIES Afdelingen (ID) ON DELETE CASCADE, CONSTRAINT FK_Employees_PositionID FOREIGN KEY (PositionID) REFERENCES Posities (ID), CONSTRAINT FK_Employees_ManagerID FOREIGN KEY (ManagerID) REFERENTIES Posities ID (ID), II VALSERTUES "1000 "19550219", 2,1, NULL), (1001, N "Petrov PP", "19831203", 3,3,1003), (1002, N "Sidorov SS", "19760607", 1,2,1000) , (1003, N "Andreev AA", "19820417", 4,3,1000)
Laten we de afdeling met ID 3 verwijderen uit de tabel Afdelingen:

DELETE Afdelingen WHERE ID = 3
Laten we eens kijken naar de gegevens in de tabel Werknemers:

KIES * VAN Medewerkers

ID kaart Naam Verjaardag E-mail Positie-ID Afdelings-ID Manager-ID
1000 Ivanov II 1955-02-19 NUL 2 1 NUL
1002 Sidorov SS 1976-06-07 NUL 1 2 1000

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

De ON UPDATE CASCADE-optie gedraagt ​​zich op dezelfde manier, maar het werkt wanneer de ID-waarde in de zoekopdracht wordt bijgewerkt. Als we bijvoorbeeld de positie-ID in de vacaturedirectory wijzigen, wordt de afdelings-ID in de tabel Werknemers bijgewerkt naar de nieuwe ID-waarde die we in de directory hebben opgegeven. Maar in dit geval zal het eenvoudigweg niet mogelijk zijn om dit aan te tonen, aangezien de ID-kolom in de Afdelingen-tabel heeft de IDENTITEIT-optie, waardoor we het volgende verzoek niet kunnen uitvoeren (verander afdelings-ID 3 in 30):

UPDATE Afdelingen SET ID = 30 WHERE ID = 3
Het belangrijkste is om de essentie van deze 2 opties te begrijpen ON DELETE CASCADE en ON UPDATE CASCADE. Ik gebruik deze opties in zeer zeldzame gevallen en ik raad u aan goed na te denken voordat u ze gebruikt in een verwijzingsbeperking. als u per ongeluk een record uit de opzoektabel verwijdert, kan dit tot grote problemen leiden en een kettingreactie veroorzaken.

Laten we afdeling 3 herstellen:

Geef toestemming om IDENTITY-waarde toe te voegen / te wijzigen SET IDENTITY_INSERT Afdelingen AAN INSERT Afdelingen (ID, naam) VALUES (3, N "IT") - verbied het toevoegen / wijzigen van IDENTITY-waarde SET IDENTITY_INSERT Afdelingen UIT
Laten we de tabel Werknemers volledig opschonen met de opdracht TRUNCATE TABLE:

TRUNCATE TAFEL Medewerkers
En nogmaals, laad de gegevens er opnieuw in met behulp van de vorige INSERT-opdracht:

INSERT Werknemers (ID, Naam, Verjaardag, Positie-ID, Afdeling-ID, Manager-ID) VALUES (1000, N "Ivanov I.I.", "19550219", 2,1, NULL), (1001, N "Petrov P.P." , "19831203", 3 3,1003), (1002, N "Sidorov SS", "19760607", 1,2,1000), (1003, N "Andreev AA", "19820417", 4,3,1000)

Laten we samenvatten

Op dit moment zijn er voor zover wij weten nog een paar DDL-commando's toegevoegd:
  • De IDENTITY-eigenschap toevoegen aan een veld - hiermee kunt u dit veld automatisch laten invullen (tellerveld) voor de tabel;
  • WIJZIG TABEL tafel naam TOEVOEGEN list_of_fields_with_characteristics - hiermee kunt u nieuwe velden aan de tabel toevoegen;
  • WIJZIG TABEL tafel naam DROP KOLOM list_of_field - hiermee kunt u velden uit de tabel verwijderen;
  • WIJZIG TABEL tafel naam BEPERKING TOEVOEGEN constraint_name VREEMDE SLEUTEL(velden) REFERENTIES reference_table (fields) - hiermee kunt u de relatie tussen de tabel en de referentietabel definiëren.

Andere beperkingen - UNIEK, STANDAARD, CONTROLE

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

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

ALTER TABLE Werknemers ADD CONSTRAINT UQ_Employees_Email UNIEK (E-mail)
Nu kan de gebruiker niet voor meerdere medewerkers hetzelfde e-mailadres invoeren.

De uniciteitsbeperking wordt gewoonlijk als volgt genoemd - eerst komt het voorvoegsel "UQ_", dan de naam van de tabel en na het onderstrepingsteken is er de naam van het veld waarop deze beperking wordt toegepast.

Dienovereenkomstig, als een combinatie van velden uniek zou moeten zijn in de context van tabelrijen, dan vermelden we ze gescheiden door komma's:

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

Laten we een nieuw veld Afspraakdatum toevoegen aan de tabel Werknemers en het de naam HireDate geven en zeggen dat de standaardwaarde voor dit veld de huidige datum is:

WIJZIG TABEL Werknemers TOEVOEGEN Huurdatum datum NIET NULL STANDAARD SYSDATETIME ()
Of als de HireDate-kolom al bestaat, kan de volgende syntaxis worden gebruikt:

WIJZIG TABEL Werknemers TOEVOEGEN STANDAARD SYSDATETIME () VOOR HireDate
Hier heb ik de naam van de beperking niet gespecificeerd, aangezien in het geval van DEFAULT was ik van mening dat dit niet zo kritisch is. Maar als je het op een vriendschappelijke manier doet, dan moet je denk ik niet lui zijn en een normale naam geven. Dit gebeurt als volgt:

ALTER TABLE Werknemers ADD CONSTRAINT DF_Employees_HireDate STANDAARD SYSDATETIME () VOOR HireDate
Aangezien deze kolom voorheen niet bestond, wordt bij het toevoegen aan elk record de huidige datumwaarde in het veld HireDate ingevoegd.

Bij het toevoegen van een nieuw record wordt de huidige datum natuurlijk ook automatisch ingevoegd, als we deze niet expliciet instellen, d.w.z. wordt niet gespecificeerd in de lijst met kolommen. Laten we dit met een voorbeeld laten zien zonder het veld HireDate op te geven in de lijst met toegevoegde waarden:

VOEG werknemers in (ID, naam, e-mail) WAARDEN (1004, N "Sergeev S.S.", " [e-mail beveiligd]")
Laten we eens kijken wat er gebeurd is:

KIES * VAN Medewerkers

ID kaart Naam Verjaardag E-mail Positie-ID Afdelings-ID Manager-ID Huur datum
1000 Ivanov II 1955-02-19 [e-mail beveiligd] 2 1 NUL 2015-04-08
1001 Petrov PP 1983-12-03 [e-mail beveiligd] 3 4 1003 2015-04-08
1002 Sidorov SS 1976-06-07 [e-mail beveiligd] 1 2 1000 2015-04-08
1003 Andreev AA 1982-04-17 [e-mail beveiligd] 4 3 1000 2015-04-08
1004 Sergeev SS NUL [e-mail beveiligd] NUL NUL NUL 2015-04-08

De beperking CHECK wordt gebruikt wanneer het nodig is om de in het veld ingevoegde waarden te controleren. Laten we deze beperking bijvoorbeeld opleggen aan het veld personeelsnummer, dat de identificatiecode (ID) van de werknemer is. Laten we, gebruikmakend van deze beperking, stellen dat het personeelsbestand een waarde tussen 1000 en 1999 moet hebben:

WIJZIG TABEL Werknemers ADD CONSTRAINT CK_Employees_ID CHECK (ID TUSSEN 1000 EN 1999)
De beperking heeft meestal dezelfde naam, eerst komt het voorvoegsel "CK_", dan de naam van de tabel en de naam van het veld waarop deze beperking wordt opgelegd.

Laten we proberen een ongeldige invoer 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-mail beveiligd]")
Laten we nu de ingevoegde waarde wijzigen in 1500 en ervoor zorgen dat het record wordt ingevoegd:

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

WIJZIG TABEL Werknemers UNIEK TOEVOEGEN (E-mail) WIJZIG TABEL Werknemers VOEG CONTROLE TOE (ID TUSSEN 1000 EN 1999)
Maar dit is geen goede gewoonte en het is beter om de naam van de beperking expliciet te specificeren, aangezien om er later achter te komen, wat moeilijker zal zijn, moet je het object openen en zien waarvoor het verantwoordelijk is.

Met een goede naam is veel informatie over de beperking direct te herkennen aan de naam.

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

DROP TAFEL Medewerkers
En we zullen het opnieuw maken 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 STANDAARD SYSDATETIME (), - voor STANDAARD gooi ik CONSTRAINT PK_Employees PRIMARY KEY uitzondering (ID), CONSTRAINT FK_Employees_DepartmentID FOREIGN KEY (DepartmentID) REFERENCES Afdelingen (ID), CONSTRAINT FK_Employees_PositionID FOREIGN KEY (PositionID) REFERENCES Posities (ID), CONSTRINT UQ_Employees_Email UNIQUEQUE (e-mail)

VOEG werknemers in (ID, naam, verjaardag, e-mail, positie-ID, afdelings-ID) VALUES (1000, N "Ivanov I.I.", "19550219", " [e-mail beveiligd]", 2,1), (1001, N" Petrov P.P. "," 19831203 "," [e-mail beveiligd]", 3,3), (1002, N" Sidorov S.S. "," 19760607 "," [e-mail beveiligd]", 1,2), (1003, N" Andreev A.A. "," 19820417 "," [e-mail beveiligd]",4,3)

Een beetje over indexen die zijn gemaakt bij het maken van PRIMARY KEY en UNIQUE-beperkingen

Zoals u in de bovenstaande schermafbeelding kunt zien, werden bij het maken van 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 GECLUSTERD en voor alle andere indexen als NIET GECLUSTERD. Het moet gezegd worden dat niet alle DBMS het concept van een geclusterde index hebben. Een tabel kan slechts één CLUSTERED-index hebben. GECLUSTERD - betekent dat tabelrecords op deze index worden gesorteerd, je kunt ook zeggen dat deze index directe toegang heeft tot alle tabelgegevens. Dit is als het ware de hoofdindex van de tabel. Meer ruwweg is het een index die aan de tafel is vastgeschroefd. De geclusterde index is een zeer krachtige tool die u kan helpen uw zoekopdrachten te optimaliseren, houd daar voorlopig rekening mee. Als we willen vertellen dat de geclusterde index niet in de primaire sleutel moet worden gebruikt, maar voor een andere index, moeten we bij het maken van de primaire sleutel de optie NONCLUSTERED specificeren:

ALTER TABLE table_name ADD CONSTRAINT constraint_name PRIMAIRE SLEUTEL NIET GECLUSTERD (veld1, veld2, ...)
Laten we bijvoorbeeld de beperkingsindex PK_Employees niet-geclusterd en de beperkingsindex UQ_Employees_Email geclusterd maken. Allereerst zullen we 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 opties GECLUSTERD en NIET GECLUSTERD:

ALTER TABEL Werknemers ADD CONSTRAINT PK_Employees PRIMAIRE SLEUTEL NIET-CLUSTERED (ID) ALTER TABLE Werknemers ADD CONSTRAINT UQ_Employees_Email UNIEKE CLUSTERED (E-mail)
Nu, na het ophalen uit de tabel Werknemers, kunnen we zien dat de records zijn gesorteerd op de geclusterde UQ_Employees_Email-index:

KIES * VAN Medewerkers

ID kaart Naam Verjaardag E-mail Positie-ID Afdelings-ID Huur datum
1003 Andreev AA 1982-04-17 [e-mail beveiligd] 4 3 2015-04-08
1000 Ivanov II 1955-02-19 [e-mail beveiligd] 2 1 2015-04-08
1001 Petrov PP 1983-12-03 [e-mail beveiligd] 3 3 2015-04-08
1002 Sidorov SS 1976-06-07 [e-mail beveiligd] 1 2 2015-04-08

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

Maar in dit geval is dit slechts een voorbeeld dat de essentie van de geclusterde index laat zien, aangezien hoogstwaarschijnlijk zullen zoekopdrachten naar de tabel Werknemers worden gedaan door het ID-veld, en in sommige gevallen kan het zelf als naslagwerk fungeren.

Voor opzoekacties is het meestal raadzaam om de geclusterde index op de primaire sleutel te bouwen, aangezien: in verzoeken verwijzen we vaak naar een directory-ID om bijvoorbeeld de naam te verkrijgen (Positie, Afdeling). Hier herinneren we ons wat ik hierboven schreef, dat de geclusterde index directe toegang heeft tot de rijen van de tabel, en hieruit volgt dat we de waarde van elke kolom kunnen krijgen zonder extra overhead.

Het is voordelig om een ​​geclusterde index toe te passen op de meest bemonsterde velden.

Soms wordt een sleutel in tabellen gemaakt door een surrogaatveld. In dat geval is het handig om de CLUSTERED-indexoptie op te slaan voor een meer geschikte index en de NONCLUSTERED-optie op te geven bij het maken van een surrogaat-primaire sleutel.

Laten we samenvatten

In dit stadium hebben we kennis gemaakt met alle soorten beperkingen, in hun eenvoudigste vorm, die worden gemaakt door een commando van de vorm "ALTER TABLE table_name ADD CONSTRAINT constraint_name ...":
  • HOOFDSLEUTEL- hoofdsleutel;
  • VREEMDE SLEUTEL- het opzetten van koppelingen en het controleren van de referentiële integriteit van gegevens;
  • UNIEK- stelt u in staat om uniciteit te creëren;
  • REKENING- laat de juistheid van de ingevoerde gegevens toe;
  • STANDAARD- hiermee kunt u de standaardwaarde instellen;
  • Het is ook vermeldenswaard dat alle beperkingen kunnen worden verwijderd met het commando “ WIJZIG TABEL tafel naam DROP-BEPERKING constraint_name ".
We hebben ook gedeeltelijk het onderwerp indexen aangeroerd en het concept van cluster geanalyseerd ( GECLUSTERD) en niet-geclusterd ( NIET-GECLUSTERD) inhoudsopgave.

Maak stand-alone indexen

Zelfredzaamheid verwijst hier naar indexen die niet zijn gemaakt voor een PRIMARY KEY of UNIEKE beperking.

Indexen per veld of velden kunnen worden aangemaakt met het volgende commando:

CREATE INDEX IDX_Employees_Name ON Werknemers (Naam)
Ook hier kunt u de opties CLUSTERED, NONCLUSTERED, UNIQUE specificeren, en u kunt ook de sorteerrichting specificeren voor elk afzonderlijk veld ASC (standaard) of DESC:

MAAK UNIEKE NIET-GECLUSTERDE INDEX UQ_Employees_EmailDesc ON werknemers (e-mail DESC)
Bij het maken van een niet-geclusterde index kan de optie NIET-GECLUSTERD worden vrijgegeven omdat: het is de standaardinstelling en wordt hier eenvoudig weergegeven om de positie van de optie GECLUSTERD of NIET GECLUSTERD in de opdracht aan te geven.

U kunt de index verwijderen met het volgende commando:

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

Laten we de tabel bijvoorbeeld weer laten vallen:

DROP TAFEL Medewerkers
En we zullen het opnieuw maken met alle gemaakte beperkingen en indexen 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 CONSTRAINT DF_Employees_HireDate DEFAULT SYSDATETIME (), ManagerID int, CONSTRAINT PK_Employees), PRIMAIRE SLEUTEL CONSTRAINT FK_Employees_DepartmentID FOREIGN KEY (DepartmentID) REFERENCES Afdelingen (ID), CONSTRAINT FK_Employees_PositionID FOREIGN KEY (PositionID) REFERENCES Posities (ID), CONSTRAINT FK_Employees_ManagerID FOREIGN ID (e-mail) 1000
Laten we tot slot onze medewerkers in de tabel invoegen:

INSERT Werknemers (ID, Naam, Verjaardag, E-mail, Positie-ID, Afdelings-ID, Manager-ID) VALUES (1000, N "Ivanov I.I.", "19550219", " [e-mail beveiligd]", 2,1, NULL), (1001, N" Petrov P.P. "," 19831203 "," [e-mail beveiligd]", 3,3,1003), (1002, N" Sidorov S.S. "," 19760607 "," [e-mail beveiligd]", 1,2,1000), (1003, N" Andreev A.A. "," 19820417 "," [e-mail beveiligd]",4,3,1000)
Bovendien is het vermeldenswaard dat u waarden in een niet-geclusterde index kunt opnemen door ze op te geven in INCLUDE. Die. in dit geval zal de INCLUDE-index enigszins lijken op een geclusterde index, alleen is de index nu niet vastgebout aan de tabel, maar zijn de benodigde waarden vastgebout aan de index. Dienovereenkomstig kunnen dergelijke indexen de prestaties van selectiequery's (SELECT) aanzienlijk verbeteren. Als alle vermelde velden in de index aanwezig zijn, is het misschien helemaal niet nodig om de tabel te openen. Maar dit vergroot natuurlijk de omvang van de index, aangezien de waarden van de vermelde velden worden gedupliceerd in de index.

Fragment uit MSDN. Algemene opdrachtsyntaxis voor het maken van indexen

MAAK [UNIEK] [GECLUSTERD | NONCLUSTERED] INDEX indexnaam AAN (kolom [ASC | DESC] [, ... n]) [INCLUDE (kolomnaam [, ... n])]

Laten we samenvatten

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

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

DDL-conclusie

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

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

Veel succes met deze prachtige taal genaamd SQL.

Structured Query Language of SQL is een declaratieve programmeertaal voor gebruik in quasi-relationele databases. Veel van de originele SQL-functies zijn gebruikt voor tupelberekening, maar recente uitbreidingen van SQL bevatten steeds meer relationele algebra.
SQL is oorspronkelijk gemaakt door IBM, maar veel leveranciers hebben hun eigen dialecten ontwikkeld. Het werd als norm aangenomen door het American National Standards Institute (ANSI) in 1986 en ISO in 1987. In de SQL-programmeertaalstandaard heeft ANSI verklaard dat de officiële uitspraak van SQL "es que el" is. Veel databaseprofessionals gebruikten echter de slanguitspraak van Sequel, die de oorspronkelijke naam van de taal, Sequel, weerspiegelt, die later werd gewijzigd vanwege merk- en naamconflicten tussen IBM. Programmeren voor beginners.
SQL programmeertaal werd herzien in 1992 en deze versie staat bekend als SQL-92 in. Daarna werd 1999 opnieuw herzien om SQL: 1999 (AKA SQL3) te worden. Programmeren voor Dummies. SQL 1999 ondersteunt objecten die voorheen niet werden ondersteund in andere versies, maar het was pas eind 2001 dat slechts enkele databasebeheersystemen SQL-implementaties ondersteunden: 1999.
SQL, hoewel gedefinieerd als ANSI en ISO, heeft veel variaties en uitbreidingen, waarvan de meeste hun eigen kenmerken hebben, zoals de PL / SQL-implementatie van Oracle Corporation of de Transact-SQL-implementatie van Sybase en Microsoft, die de basisprincipes van programmeren kan verwarren. Het is ook niet ongebruikelijk dat commerciële implementaties ondersteuning weglaten voor de belangrijkste kenmerken van de standaard, zoals gegevenstypen als datum en tijd, en de voorkeur geven aan hun eigen versie. Als gevolg hiervan, in tegenstelling tot ANSI C of ANSI Fortran, die gewoonlijk van platform naar platform kunnen worden geport zonder grote structurele veranderingen, kunnen SQL-programmeertaalquery's zelden worden overgedragen tussen verschillende databasesystemen zonder grote wijzigingen. De meeste mensen op het gebied van databases zijn van mening dat dit gebrek aan compatibiliteit opzettelijk is om elke ontwikkelaar te voorzien van zijn eigen databasebeheersysteem en om de klant aan een specifieke database te binden.
Zoals de naam al doet vermoeden, is de SQL-programmeertaal ontworpen voor een specifiek, beperkt doel: het opvragen van gegevens in een relationele database. Als zodanig is het een set programmeertaalinstructies voor het maken van gegevensmonsters, in plaats van een proceduretaal zoals C of BASIC, die zijn ontworpen om een ​​veel breder scala aan problemen op te lossen. Taaluitbreidingen zoals "PL / SQL" zijn ontworpen om deze beperking aan te pakken door procedurele elementen voor SQL toe te voegen met behoud van de voordelen van SQL. Een andere benadering is om SQL-query's toe te staan ​​om procedurele programmeertaalcommando's in te sluiten en interactie aan te gaan met de database. Oracle en anderen ondersteunen bijvoorbeeld de Java-taal in een database, terwijl u met PostgreSQL functies in Perl, Tcl of C kunt schrijven.
Een grapje over SQL: "SQL is noch gestructureerd, noch een taal." De grap is dat SQL geen Turing-taal is. ...

Selecteer * van T
C1 C2
1 een
2 B
C1 C2
1 een
2 B
Selecteer C1 uit T
C1
1
2
C1 C2
1 een
2 B
Selecteer * uit T waarbij C1 = 1
C1 C2
1 een

Gegeven een tabel T, zal de Select * from T-query alle elementen van alle rijen in de tabel weergeven.
Van dezelfde tabel zal de Select C1 from T-query de items uit kolom C1 van alle rijen in de tabel weergeven.
Uit dezelfde tabel geeft de query Select * from T waar C1 = 1 alle elementen van alle rijen weer waar de waarde van kolom C1 "1" is.

SQL-trefwoorden

SQL-woorden zijn onderverdeeld in een aantal groepen.

De eerste is Taal voor gegevensmanipulatie of DML(taal voor gegevensbeheer). DML is een subset van de taal die wordt gebruikt om databases te doorzoeken, gegevens toe te voegen, bij te werken en te verwijderen.

  • SELECT is een van de meest gebruikte DML-commando's en stelt de gebruiker in staat om een ​​query op te geven als een vaste beschrijving van het gewenste resultaat. De query specificeert niet hoe de resultaten moeten worden gelokaliseerd - het vertalen van de query in een vorm die in de database kan worden uitgevoerd, is de taak van het databasesysteem, meer specifiek de query-optimizer.
  • INSERT wordt gebruikt om rijen (formele set) toe te voegen aan een bestaande tabel.
  • UPDATE wordt gebruikt om gegevenswaarden in een bestaande rij in een tabel te wijzigen.
  • DELETE definitie van bestaande rijen die uit de tabel moeten worden verwijderd.

Van drie andere trefwoorden kan worden gezegd dat ze in de DML-groep vallen:

  • BEGIN WORK (of START TRANSACTION, afhankelijk van het dialect van SQL) kan worden gebruikt om het begin te markeren van een databasetransactie die ofwel alles ofwel helemaal niets voltooit.
  • COMMIT stelt vast dat alle gegevens veranderen nadat de bewerkingen zijn opgeslagen.
  • ROLLBACK specificeert dat alle gegevenswijzigingen sinds de laatste vastlegging of terugdraaiing moeten worden vernietigd, tot het punt dat als een "terugdraaiing" in de database werd vastgelegd.

COMMIT en ROLLBACK worden gebruikt op gebieden zoals transactiecontrole en vergrendeling. Beide instructies beëindigen alle huidige transacties (sets van bewerkingen op de database) en geven alle vergrendelingen vrij bij het wijzigen van gegevens in tabellen. De aan- of afwezigheid van BEGIN WORK of een vergelijkbare instructie hangt af van de specifieke SQL-implementatie.

De tweede groep trefwoorden behoort tot de groep Data Definition Language of DDL (Data Definition Language). DDL stelt de gebruiker in staat om nieuwe tabellen en gerelateerde items te definiëren. De meeste commerciële SQL-databases hebben hun eigen DDL-extensies die controle geven over niet-standaard, maar meestal vitale elementen van een bepaald systeem.
De belangrijkste punten van DDL zijn de commando's maken en verwijderen.

  • CREATE definieert de objecten (zoals tabellen) die in de database moeten worden gemaakt.
  • DROP bepaalt welke bestaande objecten in de database worden verwijderd, meestal permanent.
  • Sommige databasesystemen ondersteunen ook het ALTER-commando, waarmee de gebruiker een bestaand object op verschillende manieren kan wijzigen, bijvoorbeeld door kolommen aan een bestaande tabel toe te voegen.

De derde groep SQL-sleutelwoorden is: Data Control Language of DCL (Data Control Language). DCL is verantwoordelijk voor de toegangsrechten tot gegevens en stelt de gebruiker in staat te bepalen wie toegang heeft om de gegevens in de database te bekijken of te manipuleren. Er zijn hier twee belangrijke trefwoorden:

  • GRANT - Hiermee kan de gebruiker bewerkingen uitvoeren
  • REVOKE - verwijdert of beperkt het vermogen van de gebruiker om bewerkingen uit te voeren.

Databasesystemen die gebruikmaken van SQL

  • InterBase
  • MySQL
  • Orakel
  • PostgreSQL
  • SQL-server

Hoe word je een professional in website-ontwikkeling en begin je geld te verdienen? Voordelige videocursussen met een inleidende introductie.