SQL
SQL (Structured Query Language, oorspronkelijk SEQUEL[1]) is een ANSI/ISO-standaardtaal voor een relationeel databasemanagementsysteem (DBMS). Het is een gestandaardiseerde taal die gebruikt kan worden voor taken zoals het bevragen en het aanpassen van gegevens in een relationele database. SQL kan met vrijwel alle moderne relationele databaseproducten worden gebruikt.
SQL is een vierde-generatie-taal (G4-taal) omdat ze niet imperatief maar declaratief is, zoals Prolog.[2][3]
Beschrijving
[bewerken | brontekst bewerken]SQL is gebaseerd op de relationele algebra en werd in de loop van de jaren zeventig ontwikkeld door IBM (San José). Sinds het ontstaan van SQL hebben verschillende SQL-versies het levenslicht gezien. In de loop van de jaren 80 werd SQL gestandaardiseerd, gevolgd door renovaties als SQL-92, SQL-99, SQL-2003 en verder.[4]
Bijna elk DBMS heeft zijn eigen extra functies toegevoegd aan SQL-92. Dit maakt dat computerprogramma's waarbij de database-interface werd geschreven met behulp van SQL niet noodzakelijk zonder problemen kunnen worden gemigreerd van de ene naar de andere SQL-compatibele database. In vele gevallen werd door de ontwikkelaar van de software een SQL-functie gebruikt die alleen bestaat in de SQL-implementatie van één specifiek DBMS.
In eerste instantie werd SQL ontwikkeld als een vraagtaal voor de eindgebruiker. Het idee was dat businessmanagers SQL zouden gebruiken om bedrijfsgegevens te analyseren. Achteraf is gebleken dat SQL te complex is om door eindgebruikers toegepast te worden. Het gebruik van SQL impliceert immers een volledige kennis van de structuur van de te ondervragen database. Tegenwoordig benadert de programmeur van de applicatie de database met SQL via een application programming interface (API), zoals ODBC of ADO (Windows), JDBC (Java) of een productspecifieke API. SQL is dus in essentie omgevormd van een taal voor eindgebruikers tot een brug tussen applicaties en databases.
SQL kan worden opgedeeld in vier onderdelen: de query language, de data manipulation language (DML), de data control language (DCL) en de data definition language (DDL).
Werking
[bewerken | brontekst bewerken]SQL maakt voor de communicatie met het DBMS gebruik van zogenaamde query's. Een query is een ASCII-tekenreeks en is een opdracht die naar het DBMS wordt verzonden. Het DBMS zal de opdracht interpreteren en uitvoeren en stuurt eventueel gegevens terug naar het opdrachtgevende programma.
Een SQL-query ziet er bijvoorbeeld als volgt uit:
SELECT *
FROM tblKlanten
WHERE tblKlanten.krediet < 0;
De betekenis van bovenstaande query is als volgt:
SELECT
: hierachter wordt geplaatst welke velden (kolommen) worden geselecteerd; * betekent 'alle velden'.FROM
: hierachter komt de naam van de tabel, in dit gevaltblKlanten
.WHERE
: hierachter komen veldnamen met waarden waaraan de velden moeten voldoen.
In dit geval: alle records waarvan het veldkrediet
in de tabeltblKlanten
kleiner is dan 0.
Met SQL is het mogelijk om tabellen aan te maken, te wijzigen, te vullen en te verwijderen.
Een tabel maken
[bewerken | brontekst bewerken] CREATE TABLE tabelnaam (
veldNaam1 veldtype1 [NOT NULL] [PRIMARY KEY | UNIQUE]
,veldNaam2 veldtype2 [NOT NULL] [PRIMARY KEY | UNIQUE]
[, ...] );
Een tabel verwijderen
[bewerken | brontekst bewerken] DROP TABLE tabelnaam;
Een tabel vullen
[bewerken | brontekst bewerken] INSERT INTO tabelnaam [veldnaam1 [,veldnaam2 [, ....]]]
VALUES (waarde1[,waarde2[,...]]);
Een tabel lezen
[bewerken | brontekst bewerken] SELECT veldna(a)m(en)
FROM Tabelnaam
[WHERE conditie]
[GROUP BY veldnaam [, veldnaam ...]]
[HAVING conditie2]
[ORDER BY veldnaam [ASC | DESC] [, veldnaam [ASC | DESC] ...]];
Gegevens bijwerken
[bewerken | brontekst bewerken] UPDATE <tabel-naam> SET veldnaam=waarde, veldnaam2=waarde2 WHERE conditie;
SQL-sleutelwoorden staan in HOOFDletters, niet verplichte code tussen [ en ], herhalingen met ...
SQL-uitdrukkingen
[bewerken | brontekst bewerken]uitdrukking | beschrijving | query |
---|---|---|
CREATE DATABASE
|
nieuwe database | CREATE DATABASE database_naam;
|
CREATE TABLE
|
nieuwe tabel | CREATE TABLE tabel_naam(kolom1 text, kolom2 integer [, ...] ) ;
|
INSERT
|
nieuwe gegevens in de tabel toevoegen | INSERT INTO tabelnaam (kolom1, kolom2 [, ...] ) VALUES (waarde1, waarde2 [, ...] );
|
SELECT
|
gegevens uit een tabel selecteren | SELECT kolom1, kolom2 [, ...] FROM tabelnaam where conditie;
|
UPDATE
|
bestaande rijen (Engels: rows) wijzigen | UPDATE tabelnaam SET kolom1 = waarde1 [, ...] WHERE conditie;
|
DELETE
|
rijen wissen uit een tabel | DELETE FROM tabelnaam WHERE conditie;
|
TRUNCATE
|
alle rijen wissen uit een tabel | TRUNCATE TABLE tabelnaam;
|
DROP
|
tabel geheel wissen uit de database | DROP TABLE tabelnaam;
|
Transacties
[bewerken | brontekst bewerken]Een transactie bestaat uit een reeks van een of meer databasebewerkingen. De transactie maakt mogelijk dat zo'n reeks bewerkingen ofwel allemaal, ofwel geen van alle worden doorgevoerd.
Een voorbeeld is de database van een bank, waarbij bij een overboeking eerst het saldo van rekening A met een SQL-opdracht wordt verlaagd, en daarna het saldo van rekening B met een SQL-opdracht wordt verhoogd. Als er een fout plaatsvindt nádat het saldo op rekening A is verlaagd, maar vóordat het saldo op rekening B is verhoogd, 'verdwijnt' het bedrag. De database is dan "inconsistent". Deze ongewenste toestand kan worden voorkomen door de twee SQL-opdrachten binnen een transactie af te werken.
Een transactie kan expliciet worden gestart (BEGIN WORK
of BEGIN TRANSACTION
) of impliciet bij de eerste lees- of schrijfopdracht sinds de voorgaande transactie (of sinds het sessiebegin).
Er zijn twee commando's om een transactie af te sluiten:
COMMIT
: De transactie wordt doorgevoerd. Als het commit-commando door de database succesvol wordt uitgevoerd dan zijn de bewerkingen definitief in de database opgeslagen. Sommige statements bevatten een impliciete commit. Soms is het mogelijk zelf een impliciete commit te definiëren.ROLLBACK
ofABORT
: De transactie wordt niet doorgevoerd. De gegevens houden de waarde die ze hadden vóór de transactie. Bij sommige databases wordt automatisch een rollback uitgevoerd als er een fout optreedt gedurende een transactie.
De syntaxis en manier van werken verschillen enigszins per databasesysteem zoals DB2, MySQL, Oracle, PostgreSQL, SQLite en andere.
Zo gaat in Oracle het uitvoeren van DDL (gegevensdefinitietaal) impliciet gepaard aan een commit, en zo'n opdracht kan dus niet worden teruggedraaid (geROLLBACKt). In PostgreSQL daarentegen kunnen DDL-opdrachten in een transactie worden uitgevoerd en vervolgens ongedaan gemaakt via ROLLBACK.
BEGIN WORK;
UPDATE tabel SET kolom1 = waarde1, kolom2 = waarde2 WHERE kolomID = eenID;
COMMIT;
Zie ook
[bewerken | brontekst bewerken]- ↑ Interview with Donald D. Chamberlin (pagina's 12 en 16)
- ↑ Imperative vs Declarative (kopje SQL) Philip Roberts, 2 april 2013 op latentflip (gearchiveerd)
- ↑ Prolog and Natural-Language Analysis Pereira/Shieber, 1987-2002 op mtome
- ↑ Don't Tell Anyone: The SQL Standard is Public! modern-sql.com over ontwikkeling van standaard-SQL (1992-2016)