Inleiding tot de gestructureerde querytaal SQL. SQL - Encyclopedie van programmeertalen

Vandaag gaan we in op het computeronderwerp, dus dit artikel zal in de eerste plaats van bijzonder belang zijn voor programmeurs. Wij, beste lezer, zullen het hebben over de taal van gestructureerde zoekopdrachten, die in het Engels is gecodeerd als SQL (Structured Query Language). Laten we dus ter zake komen. Laten we het nu hebben over wat SQL is en waarvoor het nodig is.

Structured Query Language is een universele taal voor het creëren, wijzigen en beheren van informatie die deel uitmaakt van relationele databases. Aanvankelijk was SQL de belangrijkste manier om met data te werken. Hiermee kan de gebruiker de volgende acties uitvoeren:

  • het maken van een nieuwe tabel in de database (DB);
  • nieuwe records toevoegen aan bestaande tabellen;
  • archiefstukken bewerken;
  • volledige verwijdering van records;
  • het selecteren van een record uit verschillende tabellen in overeenstemming met gespecificeerde voorwaarden;
  • het uiterlijk en de structuur van een of meer tabellen wijzigen.

Naarmate het zich ontwikkelde, veranderde SQL enorm en werd het verrijkt met nieuwe handige functies, waardoor het steeds meer op een echte programmeertaal begon te lijken. Tegenwoordig is SQL het enige mechanisme dat applicatiesoftware en een database kan koppelen. Dat is wat SQL is.

SQL kent verschillende typen queries. Het is vermeldenswaard dat elke SQL-query ofwel een verzoek om gegevens uit de gewenste database impliceert, ofwel een toegang tot de database met de verplichte wijziging van gegevens daarin. In dit verband is het gebruikelijk om de volgende soorten verzoeken te onderscheiden:

  • het creëren of wijzigen van nieuwe of bestaande objecten in de database;
  • data ontvangen;
  • nieuwe gegevens aan de tabel toevoegen;
  • gegevens verwijderen;
  • toegang tot een databasebeheersysteem (DBMS).

Iets over de voor- en nadelen van dit gegevensverwerkingssysteem.

Voordelen van SQL

  • Onafhankelijkheid van het bestaande DBMS in het gegeven systeem. SQL-teksten zijn universeel voor veel DBMS'en. Deze regel is echter van toepassing op eenvoudige taken die verband houden met het verwerken van gegevens in tabellen.
  • De aanwezigheid van SQL-standaarden helpt de taal te "stabiliseren".
  • Declarativiteit. Dit voordeel is dat de programmeur bij het werken met gegevens alleen de informatie selecteert die moet worden gewijzigd of aangepast. Hoe dit zal gebeuren, wordt automatisch bepaald op softwareniveau van het DBMS zelf.

Nadelen van SQL

  • SQL volgt niet het relationele gegevensmodel. In dit opzicht vervangt SQL de Tutorial D-taal, die echt relationeel is.
  • De complexiteit van SQL bepaalt het doel ervan. De taal is zo complex dat alleen een programmeur deze kan gebruiken. Hoewel het oorspronkelijk bedoeld was als een controletool waar de gemiddelde gebruiker mee zou werken.
  • Enige inconsistentie van normen. Veel bedrijven die DBMS ontwikkelen, voegen hun eigen functies toe aan het SQL-taaldialect, wat de universaliteit van de taal aanzienlijk beïnvloedt.

Nog een laatste vraag: wat is SQL Server? Dit is een databasebeheersysteem dat is ontwikkeld binnen de muren van het bekende bedrijf Microsoft. Dit systeem werkt met succes met databases van zowel pc's thuis als met grote databases van grote ondernemingen. In dit marktsegment is SQL Server meer dan concurrerend.

Laten we MySQL in een notendop onthouden. Deze applicatie wordt doorgaans gebruikt als een server die verzoeken ontvangt van lokale of externe clients. MySQL kan ook worden opgenomen in zelfstandige programma's. Opgemerkt moet worden dat deze applicatie een van de meest flexibele gegevensbeheersystemen is, omdat deze veel verschillende soorten tabellen bevat.

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 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 een cursus SQL voor Dummies te volgen, ontvangt u gedetailleerde informatie over de commando's die worden gebruikt bij het maken van query's. 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 is zijn taak om de gebruiker in staat te stellen verschillende informatie uit de database te verplaatsen of daar in te voeren.

Soorten 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 zelfs gewone internetgebruikers deze zonder problemen zouden kunnen 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 in een paar weken volledig bestuderen.

SQL-TAAL: GEGEVENSMANIPULATIE

IN DEZE LEZING...

· Het doel van de Structure Query Language (SQL) en zijn speciale rol bij het werken met databases.

· Geschiedenis van het ontstaan ​​en de ontwikkeling van de SQL-taal.

· Schrijven van SQL-statements.

· Informatie ophalen uit databases met behulp van de SELECT-instructie.

· constructie van SQL-instructies gekenmerkt door de volgende kenmerken:

· het gebruik van de WHERE-constructie om rijen te selecteren die aan verschillende voorwaarden voldoen;

· het sorteren van zoekopdrachtresultaten met behulp van de ORDER BY-constructie;

· gebruik van SQL-aggregatiefuncties;

· het groeperen van geselecteerde gegevens met behulp van het GROUP BY-construct;

· gebruik van subquery's;

· gebruik van tabeljoins;

· toepassing van bewerkingen met verzamelingen (UNION, INTERSECT, EXCEPT).

· Wijzigingen aanbrengen in de database met behulp van INSERT-, UPDATE- en DELETE-instructies.

Een van de talen die ontstond als gevolg van de ontwikkeling van het relationele datamodel is SQL, dat inmiddels zeer wijdverbreid is geworden en feitelijk de standaardtaal voor relationele databases is geworden. De SQL-taalstandaard werd in 1986 vrijgegeven door het Amerikaanse National Standards Institute (ANSI) en in 1987 nam de International Organization for Standardization (ISO) deze standaard over als een internationale standaard. Momenteel wordt de SQL-taal ondersteund door honderden verschillende typen DBMS'en, ontwikkeld voor een grote verscheidenheid aan computerplatforms, variërend van personal computers tot mainframes.

Deze lezing gebruikt de ISO-definitie van SQL.

Inleiding tot SQL-taal

In dit deel zullen we kijken naar het doel van de SQL-taal, kennis maken met de geschiedenis ervan en de redenen analyseren waarom deze nu zo belangrijk is geworden voor databasetoepassingen.

Doel van de SQL-taal

Elke taal die is ontworpen om met databases te werken, moet de gebruiker de volgende mogelijkheden bieden:

· databases en tabellen maken met een volledige beschrijving van hun structuur;



· Basisbewerkingen voor gegevensmanipulatie uitvoeren, zoals het invoegen, wijzigen en verwijderen van gegevens uit tabellen;

· Voer eenvoudige en complexe query's uit.

Bovendien moet de databasetaal alle bovengenoemde problemen oplossen met minimale inspanning van de kant van de gebruiker, en moeten de structuur en syntaxis van de opdrachten vrij eenvoudig en gemakkelijk te leren zijn.

En ten slotte moet de taal universeel zijn, d.w.z. voldoen aan een erkende standaard, die het gebruik van dezelfde syntaxis en commandostructuur mogelijk maakt bij het overstappen van het ene DBMS naar het andere. De moderne SQL-taalstandaard voldoet aan bijna al deze vereisten.

SQL is een voorbeeld van een taal voor gegevenstransformatie, of een taal die is ontworpen om met tabellen te werken om invoergegevens om te zetten in de gewenste uitvoervorm. De SQL-taal, gedefinieerd door de ISO-standaard, bestaat uit twee hoofdcomponenten:

· Data Definition Language (DDL), ontworpen om databasestructuren te definiëren en de toegang tot gegevens te controleren;

· Data Manipulation Language (DML), ontworpen voor het ophalen en bijwerken van gegevens.

Vóór de komst van de SQL3-standaard bevatte SQL alleen opdrachten voor het definiëren en manipuleren van gegevens; het ontbrak aan commando's om de voortgang van berekeningen te controleren. Met andere woorden, deze taal had geen IF ... THEN ...ELSE, GO TO, DO ... WHILE en andere commando's die waren ontworpen om de voortgang van het rekenproces te controleren. Dergelijke taken moesten programmatisch worden opgelost, met behulp van programmeer- of taakcontroletalen, of interactief, als resultaat van acties die door de gebruiker zelf werden uitgevoerd. Vanwege deze onvolledigheid zou de SQL-taal vanuit het oogpunt van de organisatie van het computerproces op twee manieren kunnen worden gebruikt. De eerste betrof interactief werk, waarbij de gebruiker individuele SQL-instructies invoerde vanaf de terminal. De tweede was het inbedden van SQL-instructies in procedurele taalprogramma's.

Voordelen van de SQL3-taal, waarvan de formele definitie in 1999 werd aangenomen:

· De SQL-taal is relatief eenvoudig te leren.

· Het is een niet-procedurele taal, dus er moet worden gespecificeerd welke informatie moet worden verkregen, en niet hoe deze kan worden verkregen. Met andere woorden: voor de SQL-taal zijn geen methoden voor gegevenstoegang vereist.

· Net als de meeste moderne talen ondersteunt SQL een gratis formaat voor het schrijven van instructies. Dit betekent dat individuele operatorelementen niet aan vaste posities op het scherm worden gekoppeld terwijl u typt.

· De commandostructuur wordt gespecificeerd door een reeks trefwoorden, dit zijn gewone Engelse woorden, zoals CREATE TABLE - Een tabel maken, INSERT - Invoegen, SELECT - Selecteren.

Bijvoorbeeld:

MAAK TABEL [Verkoop] ​​( (S), [Objectnaam] VARCHAR(15), [Kosten] DECIMAL(7,2));

INSERT IN [Object] WAARDEN ("SG16", "Bruin", 8300);

SELECT , [Objectnaam], [Kosten];

VAN [Verkoop]

WAAR [Kosten] > 10000;

· De SQL-taal kan door een breed scala aan gebruikers worden gebruikt, waaronder databasebeheerders (DBA's), managementpersoneel van bedrijven, applicatieprogrammeurs en vele andere eindgebruikers uit verschillende categorieën.

Momenteel zijn er internationale standaarden voor de SQL-taal die deze formeel definiëren als de standaardtaal voor het maken en manipuleren van relationele databases, wat het in werkelijkheid ook is.

Geschiedenis van de SQL-taal

De geschiedenis van het relationele datamodel, en indirect van de SQL-taal, begon in 1970 met de publicatie van een baanbrekend artikel van E.F. Codd, die destijds bij het IBM-onderzoekslaboratorium in San Jose werkte. In 1974 publiceerde D. Chamberlain, die in hetzelfde laboratorium werkte, een definitie van een taal genaamd "Structured English Query Language", of SEQUEL. Een herziene versie van deze taal, SEQUEL/2, werd in 1976 uitgebracht; vervolgens moest de naam om juridische redenen worden gewijzigd in SQL - de afkorting SEQUEL werd al door filologen gebruikt. Maar tot op de dag van vandaag spreken veel mensen het SQL-acroniem nog steeds uit als "sequel", hoewel het officieel wordt aanbevolen om het te lezen als "es-qu-el".

In 1976 bracht IBM een prototype DBMS uit, gebaseerd op de SEQUEL/2-taal, genaamd "System R". Het doel van deze proef was om de haalbaarheid van de implementatie van het relationele model te testen. Naast andere positieve aspecten kan het belangrijkste resultaat van dit project worden beschouwd als de ontwikkeling van de SQL-taal zelf. De wortels van deze taal gaan echter terug naar de SQUARE-taal (Specifying Queries as Rational Expressions), die de voorloper was van de SQL-taal. System R-project De SQUARE-taal is ontwikkeld als een onderzoeksinstrument voor het implementeren van relationele algebra door middel van in het Engels gecomponeerde zinnen.

Eind jaren zeventig bracht het bedrijf dat nu Oracle Corporation is geworden, het Oracle DBMS uit. Misschien is dit de allereerste commerciële implementatie van een relationeel DBMS gebouwd met behulp van de SQL-taal.

Even later verscheen het INGRES DBMS, met behulp van de QUEL-querytaal.

Deze taal was meer gestructureerd dan SQL, maar de semantiek kwam minder dicht bij het gewone Engels. Later, toen SQL werd aangenomen als de standaardtaal voor relationele databases, werd het INGRES DBMS volledig geconverteerd om het te gebruiken. In 1981 bracht IBM zijn eerste commerciële relationele DBMS uit, genaamd SQL/DS (voor de DOS/VSE-omgeving). In 1982 werd een versie van dit systeem uitgebracht voor de VM/CMS-omgeving, en in 1983 - voor de MVS-omgeving, maar al onder de naam DB2.

In 1982 begon het Amerikaanse National Standards Institute (ANSI) te werken aan de Relation Database Language (RDL), op basis van conceptdocumenten ontvangen van IBM Corporation. In 1983 raakte de Internationale Organisatie voor Standaardisatie (ISO) bij dit werk betrokken. De gezamenlijke inspanningen van beide organisaties culmineerden in de release van de SQL-taalstandaard. De naam RDL werd in 1984 verlaten en de concepttaal werd opnieuw ontworpen om dichter bij bestaande implementaties van de SQL-taal te staan.

De originele versie van de standaard, die in 1987 door ISO werd uitgebracht, lokte een golf van kritiek uit. In het bijzonder wees Date, een bekende onderzoeker op dit gebied, erop dat de standaard kritische functies wegliet, waaronder controles op referentiële integriteit en enkele relationele operatoren.

Bovendien merkte hij de buitensporige redundantie van de taal op: hetzelfde verzoek kon in verschillende versies worden geschreven. Het merendeel van de kritiek werd als eerlijk erkend en de nodige aanpassingen werden aan de norm aangebracht voordat deze werd gepubliceerd. Er werd echter besloten dat het belangrijker was om de standaard zo snel mogelijk vrij te geven, zodat deze kon dienen als een gemeenschappelijke basis waarop zowel de taal zelf als de implementaties ervan verder konden worden ontwikkeld, in plaats van te wachten tot alle kenmerken die verschillend waren deskundigen die als verplicht werden beschouwd, werden gedefinieerd en overeengekomen voor een soortgelijke taal.

In 1989 publiceerde ISO een amendement op de standaard die functies voor gegevensintegriteit definieerde. In 1992 werd de eerste substantieel herziene versie van de ISO-standaard, ook wel SQL2 of SQL-92 genoemd, uitgebracht. Hoewel sommige functies voor het eerst in deze standaard zijn gedefinieerd, zijn veel ervan al geheel of gedeeltelijk geïmplementeerd in een of meer commerciële implementaties van de SQL-taal.

En de volgende versie van de standaard, die gewoonlijk SQL3 wordt genoemd, werd pas in 1999 uitgebracht. Deze versie biedt aanvullende ondersteuning voor objectgeoriënteerde gegevensbeheerfuncties.

Functies die door ontwikkelaars van commerciële implementaties aan de taalstandaard worden toegevoegd, worden extensies genoemd. De SQL-taalstandaard definieert bijvoorbeeld zes verschillende soorten gegevens die in databases kunnen worden opgeslagen. In veel implementaties wordt deze lijst aangevuld met verschillende extensies. Elke implementatie van een taal wordt een dialect genoemd. Er zijn geen twee dialecten die volledig identiek zijn en er is momenteel geen dialect dat volledig voldoet aan de ISO-norm.

Bovendien breiden databaseontwikkelaars, naarmate databaseontwikkelaars nieuwe functionaliteit aan hun systemen toevoegen, voortdurend hun SQL-dialecten uit, waardoor individuele dialecten steeds meer van elkaar gaan verschillen. De basiskern van de SQL-taal blijft echter min of meer gestandaardiseerd voor alle implementaties.

Hoewel de oorspronkelijke concepten van de SQL-taal door IBM waren ontwikkeld, bracht het belang ervan al snel andere ontwikkelaars ertoe hun eigen implementaties te creëren. Momenteel zijn er letterlijk honderden producten op de markt verkrijgbaar die zijn gebouwd met behulp van de SQL-taal, en we horen voortdurend over de release van steeds meer nieuwe versies.

SQL-taalfunctionaliteit

De belangrijkste functionaliteit van de SQL-taal wordt hieronder gegeven.

Definitie van gegevens. Deze SQL-functie is een beschrijving van de structuur van de ondersteunde gegevens en de organisatie van relationele relaties (tabellen). Operators voor het maken van een database, het maken van tabellen en het verkrijgen van toegang tot gegevens zijn bedoeld om deze te implementeren.

Database creatie. Gebruik de instructie CREATE DATABASE om een ​​nieuwe database te maken. De instructiestructuur specificeert de naam van de database die moet worden gemaakt.

Tabellen maken. De basistabel wordt gemaakt met behulp van de instructie CREATE TABLE. Deze instructie specificeert de veldnamen, de gegevenstypen ervoor en de lengte (voor sommige gegevenstypen). SQL gebruikt de volgende gegevenstypen:

INTEGER – geheel getal;

CHAR – tekenwaarde;

VARCHAR – tekenwaarde, alleen niet-lege tekens worden opgeslagen;

DECIMAL – decimaal getal;

FLOAT – drijvende-kommagetal;

DUBBELE PRECISIE – zwevende komma met dubbele precisie;

DATETIME – datum en tijd;

BOOL – Booleaanse waarde.

De instructie voor het maken van een tabel specificeert beperkingen voor kolomwaarden en voor de tabel. Mogelijke beperkingen worden weergegeven in de tabel. 4.8

Tabel 4.8 Beperkingen op gedefinieerde gegevens

Voor een relationeel datamodel is het specificeren van een externe sleutel (FOREIGNKEY) essentieel. Wanneer u refererende sleutels declareert, moet u de juiste beperkingen op de kolom plaatsen, zoals NOT NULL.

In een SQL-instructie duidt CHECK semantische beperkingen aan die de gegevensintegriteit garanderen, zoals het beperken van de set geldige waarden voor een bepaalde kolom.

U kunt de instructie create table niet meer dan één keer in dezelfde tabel gebruiken. Als er na de creatie onnauwkeurigheden in de definitie worden ontdekt, kunnen er wijzigingen worden aangebracht met behulp van de ALTER TABLE-instructie. Deze verklaring is bedoeld om de structuur van een bestaande tabel te wijzigen: u kunt een veld verwijderen of toevoegen aan een bestaande tabel.

Data manipulatie. Met SQL kan een gebruiker of toepassingsprogramma de inhoud van een database wijzigen door nieuwe gegevens in te voegen, bestaande gegevens te verwijderen of te wijzigen.

Nieuwe gegevens invoegen is een procedure voor het toevoegen van rijen aan een database en wordt uitgevoerd met behulp van de INSERT-instructie.

Gegevenswijziging omvat wijzigingen in waarden in een of meer kolommen van een tabel en wordt uitgevoerd met behulp van een UPDATE-instructie. Voorbeeld:

SET-bedrag=bedrag+1000,00

WAAR bedrag>0

Rijen verwijderen vanuit een tabel met behulp van de DELETE-instructie. De syntaxis van de operator is:

VAN tafel

De WHERE-clausule is optioneel, maar als deze niet is opgenomen, worden alle vermeldingen in de tabel verwijderd. Het is handig om de SELECT-instructie te gebruiken met dezelfde syntaxis als de DELETE-instructie om vooraf te testen welke records worden verwijderd.

Zorgen voor gegevensintegriteit. Met de SQL-taal kunt u tamelijk complexe integriteitsbeperkingen definiëren, waarvan de naleving wordt gecontroleerd voor alle databasewijzigingen. Het monitoren van de resultaten van transacties, het verwerken van fouten die optreden en het coördineren van parallel werk met de database van verschillende applicaties of gebruikers wordt verzorgd door de COMMIT (registreert de succesvolle voltooiing van de huidige transactie en het begin van een nieuwe) en ROLLBACK (de noodzaak voor een rollback - automatisch herstel van de databasestatus naar het begin van de transactie) operators.

Gegevensbemonstering is een van de belangrijkste databasefuncties die overeenkomt met de SELECT-instructie. Een voorbeeld van het gebruik van de operator is in de vorige sectie besproken.

In SQL kunt u geneste reeksen query's (subquery's) maken. Er zijn bepaalde typen query's die het beste kunnen worden geïmplementeerd met behulp van subquery's. Deze zoekopdrachten omvatten zogenaamde bestaanscontroles. Laten we aannemen dat u gegevens wilt verkrijgen over studenten die geen zevenpuntscijfer hebben. Als een lege set wordt geretourneerd, betekent dit maar één ding: elke student heeft minstens één zo'n cijfer.

Tabellen koppelen. Met SQL-instructies kunt u gegevens uit meer dan één tabel ophalen. Eén manier om dit te doen is door tabellen te koppelen met behulp van één gemeenschappelijk veld.

De SELECT-instructie moet een beperking bevatten voor het matchen van de waarden van een specifieke kolom (veld). Vervolgens worden alleen die rijen waarin de waarden van de opgegeven kolom overeenkomen, uit de gerelateerde tabellen opgehaald. De kolomnaam wordt alleen samen met de tabelnaam aangegeven; anders zal de verklaring dubbelzinnig zijn.

U kunt andere typen tabelkoppelingen gebruiken: de INTER JOIN-operator (inner join) zorgt ervoor dat de resulterende set records overeenkomende waarden in gerelateerde velden bevat. Met Outer joins (OUTER JOIN) kunt u in het queryresultaat alle rijen uit de ene tabel en de overeenkomstige rijen uit een andere tabel opnemen

Toegangscontrole. SQL zorgt voor synchronisatie van databaseverwerking door verschillende applicatieprogramma's, waardoor gegevens worden beschermd tegen ongeoorloofde toegang.

Gegevenstoegang in een omgeving met meerdere gebruikers wordt beheerd met behulp van GRANT- en REVOKE-instructies. In elke instructie is het noodzakelijk om de gebruiker, het object (tabel, weergave) waarvoor de machtigingen zijn ingesteld, en de machtigingen zelf te specificeren. De GRANT-instructie geeft gebruiker X bijvoorbeeld de mogelijkheid om gegevens uit de PRODUCT-tabel op te halen:

VERLEEN SELECTIE OP PRODUCT AAN X

De REVOKE-instructie trekt alle eerder verleende machtigingen in.

SQL insluiten in applicatieprogramma's. Echte applicaties worden meestal in andere talen geschreven die SQL-code genereren en deze als ASCII-tekst doorgeven aan het DBMS.

De IBM-standaard voor SQL-producten regelt het gebruik van de ingebouwde SQL-taal. Bij het schrijven van een applicatieprogramma is de tekst een combinatie van opdrachten uit de hoofdprogrammeertaal (bijvoorbeeld C, Pascal, Cobol, Fortran, Assembler) en SQL-opdrachten met bijvoorbeeld een speciaal voorvoegsel. ExecSQL. De structuur van SQL-instructies is uitgebreid om hosttaalvariabelen in een SQL-constructie op te nemen.



De SQL-processor wijzigt het type programma in overeenstemming met de vereisten van de compiler van de hoofdprogrammeertaal. De functie van de compiler is het vertalen (vertalen) van een programma van de bronprogrammeertaal naar een taal die dicht bij de machinetaal ligt. Na compilatie is het applicatieprogramma (applicatie) een onafhankelijke module.

SQL-dialecten

Moderne relationele DBMS'en gebruiken dialecten van de SQL-taal om gegevens te beschrijven en te manipuleren. Een subset van de SQL-taal waarmee u een database kunt maken en beschrijven, wordt DDL (Data Definition Language) genoemd.

Aanvankelijk heette de SQL-taal SEQUEL (Structured English Query Language), vervolgens SEQUEL/2 en vervolgens eenvoudigweg SQL. Tegenwoordig is SQL de de facto standaard voor relationele DBMS'en.

De eerste taalstandaard verscheen in 1989: SQL-89 en werd ondersteund door vrijwel alle commerciële relationele DBMS'en. Het was algemeen van aard en onderhevig aan ruime interpretatie. De voordelen van SQL-89 kunnen worden beschouwd als de standaardisatie van de syntaxis en semantiek van operators voor bemonstering en gegevensmanipulatie, evenals de fixatie van middelen om de integriteit van de database te beperken. Er ontbrak echter zo'n belangrijk onderdeel als manipulatie van databaseschema's. De onvolledigheid van de SQL-89-standaard leidde tot de verschijning in 1992. de volgende versie van de SQL-taal.

SQL2 (of SQL-92) omvat vrijwel alle noodzakelijke zaken: manipulatie van databaseschema's, transactie- en sessiebeheer, ondersteuning voor client-server-architecturen of tools voor applicatieontwikkeling.

De volgende stap in de ontwikkeling van de taal is de SQL 3-versie. Deze versie van de taal wordt aangevuld met een triggermechanisme, de definitie van een willekeurig gegevenstype en een objectextensie.

Momenteel zijn er drie niveaus van de taal: beginner, gemiddeld en compleet. Veel fabrikanten van hun DBMS gebruiken hun eigen SQL-implementaties, tenminste gebaseerd op het initiële niveau van de overeenkomstige ANSI-standaard, en met enkele uitbreidingen die specifiek zijn voor een bepaald DBMS. In tafel 4.9 geeft voorbeelden van SQL-dialecten.

Tabel 4.9 SQL-dialecten

DBMS Zoektaal
Systeem R DBMS SQL
DB2 SQL
Toegang SQL
SYBASE SQL overal Watcom-SQL
SYBASE SQL-server Transact_SQL
Mijn SQL SQL
Orakel PL/SQL

Objectgeoriënteerde databases gebruiken de objectquerytaal OQL (Object Query Language). De OQL-taal was gebaseerd op het SELECT-commando van de SQL2-taal en voegde de mogelijkheid toe om een ​​query naar een object of verzameling objecten te sturen, evenals de mogelijkheid om methoden aan te roepen binnen een enkele query.

De compatibiliteit van veel gebruikte SQL-dialecten bepaalt de compatibiliteit van het DBMS. Het SYBASE SQL Anywhere DBMS is dus zo compatibel mogelijk voor een DBMS van deze klasse met het SYBASE SQL Server DBMS. Een van de aspecten van deze compatibiliteit is de ondersteuning in SYBASE SQL Anywhere van een dergelijk dialect van de SQL-taal als Transact-SQL. Dit dialect wordt gebruikt in SYBASE SQL Server en kan samen met het eigen SQL-dialect in SYBASE SQL Anywhere worden gebruikt - Watcom-SQL.

Controle vragen

1. Hoe kan een DBMS worden geclassificeerd?

2. Welke databasemodellen bestaan ​​er?

3. Wat zijn de belangrijkste elementen van informatiemodellen?

4. Welke soorten relaties tussen entiteiten bestaan ​​er?

5. Wat zijn ER-diagrammen en waarvoor worden ze gebruikt?

6. Wat kunt u doen met de tabelnormalisatieprocedure?

7. Wat zijn de taal- en softwaretools van het DBMS?

8. Welk type MS Access DBMS is het?

9. Wat zijn de belangrijkste doelstellingen van het MS Access DBMS?

10. Waar worden de belangrijkste SQL-operatoren voor gebruikt?

Programmeertaal

SQL (Structured Query Language) is een databasebeheertaal voor relationele databases. SQL zelf is geen Turing-complete programmeertaal, maar de standaard maakt het mogelijk om procedurele uitbreidingen ervoor te creëren die de functionaliteit ervan uitbreiden tot een volwaardige programmeertaal.

De taal werd in de jaren zeventig gemaakt onder de naam "SEQUEL" voor het System R-databasebeheersysteem (DBMS). Later werd het omgedoopt tot "SQL" om handelsmerkconflicten te voorkomen. In 1979 werd SQL voor het eerst gepubliceerd als een commercieel product, Oracle V2.

De eerste officiële taalstandaard werd in 1986 door ANSI en in 1987 door ISO aangenomen. Sindsdien zijn er nog een aantal versies van de standaard gemaakt, waarvan sommige de vorige herhalen met kleine variaties, terwijl andere belangrijke nieuwe functies hebben gekregen.

Ondanks het bestaan ​​van standaarden verschillen de meest voorkomende SQL-implementaties zo sterk dat de code zelden van het ene DBMS naar het andere kan worden geporteerd zonder significante wijzigingen aan te brengen. Dit komt door de lengte en complexiteit van de standaard, maar ook door het gebrek aan specificatie op een aantal belangrijke implementatiegebieden.

SQL is gemaakt als een eenvoudige, gestandaardiseerde manier om gegevens in een relationele database op te halen en te manipuleren. Het werd later complexer dan bedoeld en werd een tool voor ontwikkelaars in plaats van een tool voor eindgebruikers. Momenteel blijft SQL (meestal zoals geïmplementeerd door Oracle) de meest populaire databasebeheertalen, hoewel er een aantal alternatieven bestaan.

SQL bestaat uit vier afzonderlijke delen:

  1. Data Definition Language (DDL) wordt gebruikt om de datastructuren te definiëren die in de database zijn opgeslagen. Met DDL-instructies kunt u individuele objecten in de database maken, wijzigen en verwijderen. Geldige objecttypen zijn afhankelijk van het gebruikte DBMS en omvatten doorgaans databases, gebruikers, tabellen en een aantal kleinere ondersteunende objecten zoals rollen en indexen.
  2. Datamanipulatietaal (DML) wordt gebruikt om gegevens in de database op te halen en te wijzigen. Met DML-instructies kunt u gegevens in tabellen ophalen, invoegen, wijzigen en verwijderen. Soms worden selectieinstructies voor het ophalen van gegevens niet beschouwd als onderdeel van DML, omdat ze de status van de gegevens niet veranderen. Alle DML-instructies zijn declaratief van aard.
  3. Data Access Definition Language (DCL) wordt gebruikt om de toegang tot gegevens in de database te controleren. DCL-instructies zijn van toepassing op bevoegdheden en bieden u de mogelijkheid rechten te verlenen en in te trekken om bepaalde DDL- en DML-instructies op bepaalde databaseobjecten toe te passen.
  4. Transaction Control Language (TCL) wordt gebruikt om de verwerking van transacties in de database te controleren. Typisch omvatten TCL-instructies commit om wijzigingen door te voeren die tijdens een transactie zijn aangebracht, rollback om ze terug te draaien en savepoint om de transactie in verschillende kleinere delen op te splitsen.

Opgemerkt moet worden dat SQL een declaratief programmeerparadigma implementeert: elke instructie beschrijft alleen de vereiste actie, en het DBMS beslist hoe deze moet worden uitgevoerd, d.w.z. plant de elementaire handelingen die nodig zijn om een ​​actie uit te voeren en voert deze uit. Om de mogelijkheden van SQL effectief te kunnen gebruiken, moet een ontwikkelaar echter begrijpen hoe het DBMS elke instructie parseert en het uitvoeringsplan ervan maakt.

Voorbeelden:

Hallo Wereld!:

Voorbeeld voor versies Oracle 10g SQL, Oracle 11g SQL

De tekenreeks 'Hallo wereld!' wordt geselecteerd uit de ingebouwde dubbele tabel, die wordt gebruikt voor zoekopdrachten waarvoor geen toegang tot echte tabellen nodig is.

selecteer "Hallo, wereld!" van dubbel;

Factoriaal:

Voorbeeld voor versies Oracle 10g SQL, Oracle 11g SQL

SQL ondersteunt geen lussen, recursie of door de gebruiker gedefinieerde functies. Dit voorbeeld demonstreert een mogelijke oplossing met behulp van:

  • pseudo-kolomniveau om pseudo-tabellen t1 en t2 te maken met getallen van 1 tot 16,
  • aggregatiefunctie som, waarmee je de elementen van een set kunt optellen zonder expliciet een lus te gebruiken,
  • en de wiskundige functies ln en exp, waarmee u het product (nodig om de faculteit te berekenen) kunt vervangen door een som (geleverd door SQL).

De regel “0! = 1” wordt niet opgenomen in de resulterende reeks rijen, omdat een poging om ln(0) te evalueren resulteert in een uitzondering.

Fibonacci-getallen:

Voorbeeld voor versies Oracle 10g SQL, Oracle 11g SQL

SQL ondersteunt geen lussen of recursie, en het aaneenschakelen van velden uit verschillende rijen in een tabel of query is geen standaard aggregatiefunctie. In dit voorbeeld wordt gebruik gemaakt van:

  • Binet's formule en wiskundige functies ROUND, POWER en SQRT voor het berekenen van het n-de Fibonacci-getal;
  • pseudo-kolomniveau om een ​​pseudo-tabel t1 te creëren met getallen van 1 tot 16;
  • ingebouwde functie SYS_CONNECT_BY_PATH voor geordende aaneenschakeling van de ontvangen nummers.

SELECTEER VERVANGEN (MAX (SYS_CONNECT_BY_PATH (fib || ", ", "/" )), "/" , "" ) || "..." fiblist FROM (SELECT n, fib, ROW_NUMBER () OVER (ORDER BY n) r FROM (selecteer n, round ((power ((1 + sqrt (5)) * 0. 5, n ) - power ((1 - sqrt (5 )) * 0 . 5 , n )) / sqrt (5 )) fib van (selecteer niveau n van dubbele verbinding op niveau<= 16 ) t1 ) t2 ) START WITH r = 1 CONNECT BY PRIOR r = r - 1 ;

Hallo Wereld!:

Voorbeeld voor versies van Microsoft SQL Server 2005, Microsoft SQL Server 2008 R2, Microsoft SQL Server 2012, MySQL 5, PostgreSQL 8.4, PostgreSQL 9.1, sqlite 3.7.3

selecteer "Hallo, wereld!" ;

Factoriaal:

Voorbeeld voor versies van Microsoft SQL Server 2005, Microsoft SQL Server 2008 R2, Microsoft SQL Server 2012

Er wordt een recursieve definitie van faculteit gebruikt, geïmplementeerd via een recursieve query. Elke queryregel bevat twee numerieke velden, n en n!, en elke volgende regel wordt berekend met behulp van de gegevens van de vorige.

Je kunt alleen gehele faculteiten tot en met 20 berekenen!. Wanneer u 21 probeert te berekenen! De fout "Rekenkundige overloopfout" treedt op, d.w.z. het bitraster loopt over.

Voor reële getallen is de faculteit 100! (Om dit te doen, moet u in het voorbeeld bigint vervangen door float in de derde regel)

Fibonacci-getallen:

Voorbeeld voor versies van Microsoft SQL Server 2005, Microsoft SQL Server 2008 R2, Microsoft SQL Server 2012

Er wordt iteratieve bepaling van Fibonacci-getallen gebruikt, geïmplementeerd via een recursieve query. Elke zoekregel bevat twee aangrenzende getallen in de reeks, en de volgende regel wordt berekend als (laatste getal, som van getallen) van de vorige regel. Alle getallen behalve het eerste en het laatste verschijnen dus twee keer, zodat het resultaat alleen de eerste getallen van elke regel bevat.

Factoriaal:

Voorbeeld voor versies Oracle 10g SQL, Oracle 11g SQL

Dit voorbeeld demonstreert het gebruik van de modeloperator, beschikbaar in Oracle 10g, waarmee queryreeksen als array-elementen kunnen worden behandeld. Elke regel bevat twee velden: het regelnummer n en de faculteit f.

selecteer n || "! = " || f faculteit van duaal model retourneert alle rijen dimensie met ( 0 d ) maatregelen ( 0 f , 1 n ) regels itereren ( 17 ) ( f [ iteratie_nummer ] = decoderen ( iteratie_nummer , 0 , 1 , f [ iteratie_nummer - 1 ] * iteratie_nummer ) , n [ iteratie_nummer ] = iteratie_nummer );

Fibonacci-getallen:

Voorbeeld voor versies Oracle 10g SQL, Oracle 11g SQL

Dit voorbeeld demonstreert het gebruik van de modeloperator, beschikbaar in Oracle 10g, waarmee queryreeksen als array-elementen kunnen worden behandeld. Elke regel bevat twee velden: het Fibonacci-getal zelf en de aaneenschakeling van alle getallen kleiner dan of gelijk aan dit getal. Het iteratief samenvoegen van getallen in dezelfde query die ze genereert, is eenvoudiger en sneller dan het aggregeren als een afzonderlijke bewerking.

selecteer max(s) || ", ..." van (selecteer s uit dubbel model retourneer alle rijendimensie met ( 0 d ) metingen ( cast (" " as varchar2 (200 )) s , 0 f ) regels itereren ( 16 ) ( f [ iteratie_nummer ] = decoderen (iteratie_nummer, 0, 1, 1, 1, f [ iteratie_nummer - 1 ] + f [ iteratie_nummer - 2 ]), s [ iteratie_nummer ] = decoderen ( iteratie_nummer, 0, to_char (f [ iteratie_nummer ]), s [ iteratie_nummer - 1 ] ||. ", " ||.char (f [ iteratie_nummer ])) );

Factoriaal:

Voorbeeld voor MySQL 5-versies

selecteer concat (cast (t2 . n als char ), "!= " , cast (exp (sum (log (t1 . n ))) als char )) uit ( selecteer @ i : = @ i + 1 AS n uit TABEL , (selecteer @ i : = 0 ) als sel1 limiet 16 ) t1 , ( selecteer @ j : = @ j + 1 AS n uit TABEL , (selecteer @ j : = 0 ) als sel1 limiet 16 ) t2 waarbij t1 . N<= t2 . n group by t2 . n

Fibonacci-getallen:

Voorbeeld voor MySQL 5-versies

Vervang TABLE door elke tabel waartoe u toegang hebt, zoals mysql.help_topic .

selecteer concat (group_concat (f separator ", " ), ", ..." ) uit (selecteer @ f : = @ i + @ j as f , @ i : = @ j , @ j : = @ f uit TABEL , (selecteer @ i : = 1 , @ j : = 0 ) sel1 limiet 16 ) t

Hallo Wereld!:

Voorbeeld voor versies Oracle 10g SQL, Oracle 11g SQL

In dit voorbeeld wordt een anoniem PL/SQL-blok gebruikt dat een bericht afdrukt naar standaarduitvoer met behulp van het pakket dbms_output.

begin dbms_output . put_line("Hallo wereld!"); einde ;

Factoriaal:

Voorbeeld voor versies Oracle 10g SQL, Oracle 11g SQL

Dit voorbeeld demonstreert de iteratieve berekening van faculteit met behulp van PL/SQL.

declareer n nummer:= 0; f-getal := 1 ; beginnen terwijl (n<= 16 ) loop dbms_output . put_line (n || "! = " || f ); n : = n + 1 ; f : = f * n ; end loop ; end ;

Fibonacci-getallen:

Voorbeeld voor versies Oracle 10g SQL, Oracle 11g SQL

In dit voorbeeld wordt iteratieve bepaling van Fibonacci-getallen gebruikt. Reeds berekende getallen worden opgeslagen in een varray-datastructuur - een analoog van een array.

declareer typevector is varray (16) van getal; fib-vector := vector(); ik nummer; svarchar2(100); begin fib. verlengen(16); fib (1):= 1; fib (2):= 1; s : = fib (1 ) || ", " || fib(2) || , "; voor i in 3 .. 16 lus fib (i) : = fib (i - 1) + fib (i - 2); s := s || fib(i) || , "; eind lus; dbms_uitvoer. put_line (s || "..." ); einde ;

Kwadratische vergelijking:

Voorbeeld voor versies Oracle 10g SQL, Oracle 11g SQL

Dit voorbeeld is getest in SQL*Plus, TOAD en PL/SQL Developer.

Met Pure SQL kunt u tijdens het uitvoeren van query's variabelen introduceren in de vorm van vervangbare variabelen. Om zo'n variabele te definiëren, moet de naam ervan (in dit geval A, B en C) worden gebruikt met een ampersand & ervoor wanneer er naar de variabele moet worden verwezen. Wanneer de query wordt uitgevoerd, wordt de gebruiker gevraagd de waarden in te voeren van alle vervangende variabelen die in de query worden gebruikt. Zodra de waarden zijn ingevoerd, wordt elke verwijzing naar een dergelijke variabele vervangen door de bijbehorende waarde en wordt het resulterende verzoek uitgevoerd.

Er zijn verschillende manieren om waarden voor vervangende variabelen in te voeren. In dit voorbeeld wordt de eerste verwijzing naar elke variabele voorafgegaan door een dubbel ampersand && in plaats van een enkel ampersand. Op deze manier wordt de waarde voor elke variabele slechts één keer ingevoerd en worden alle daaropvolgende verwijzingen ernaar vervangen door dezelfde waarde (bij gebruik van een enkele ampersand in SQL*Plus moet de waarde voor elke verwijzing naar dezelfde variabele afzonderlijk worden ingevoerd ). In PL/SQL Developer moeten alle verwijzingen naar variabelen worden voorafgegaan door een enkel &-teken, anders zal de ORA-01008-fout 'Niet alle variabelen gebonden' optreden.

De eerste regel van het voorbeeld specificeert het teken voor het decimaalteken, dat wordt gebruikt bij het converteren van wortelgetallen naar tekenreeksen.

Het verzoek zelf bestaat uit vier verschillende verzoeken. Elke query retourneert een string met het resultaat van de berekening in een van de gevallen (A=0, D=0, D>0 en D<0) и ничего — в трех остальных случаях. Результаты всех четырех запросов объединяются, чтобы получить окончательный результат.

sessieset wijzigen NLS_NUMERIC_CHARACTERS = "; selecteer 'Geen kwadratische vergelijking'. ans van dual waarbij && A = 0 unie selecteer "x = " || to_char (-&& B / 2 /& A ) van dual waarbij & A != 0 en & B *& B - 4 *& A *&& C = 0 unie selecteer "x1 = " || to_char ((-& B + sqrt (& B *& B - 4 *& A *& C )) / 2 /& A ) || ", x2 = " || to_char (-& B - sqrt (& B *& B - 4 *& A *& C )) / 2 /& A van dubbel waarbij & A != 0 en & B *& B - 4 *& A *& C > 0 unie selecteer "x1 = (" || to_char (-& B / 2 /& A ) || "," || to_char (sqrt (-& B *& B + 4 *& A *& C ) / 2 /& A ) || "), " || "x2 = (" || naar_char (-& B / 2 /& A ) || "," || naar_char (- sqrt (-& B *& B + 4 *& A *& C ) / 2 /& A ) || ")" van dubbel waarbij & A != 0 en & B *& B - 4 *& A *& C< 0 ;