Structured Query Language is een standaard databasetaal die wordt gebruikt om relationele databases te maken, te onderhouden en op te vragen. Hieronder volgen enkele interessante feiten over SQL.
- SQL is hoofdletterongevoelig. Maar het is aan te bevelen om sleutelwoorden (zoals SELECT, UPDATE, CREATE, etc) in hoofdletters te gebruiken en door de gebruiker gedefinieerde zaken (zoals tabelnaam, kolomnaam, etc) in kleine letters.
- We kunnen commentaar in SQL schrijven met “-” (dubbel koppelteken) aan het begin van elke regel.
- SQL is de programmeertaal voor relationele databases (hieronder uitgelegd) zoals MySQL, Oracle, Sybase, SQL Server, Postgre, etc. Andere niet-relationele databases (ook wel NoSQL genoemd) zoals MongoDB, DynamoDB, etc gebruiken geen SQL
- Hoewel er een ISO standaard is voor SQL, verschillen de meeste implementaties enigszins in syntax. Dus we kunnen queries tegenkomen die werken in SQL Server, maar niet werken in MySQL.
Wat is een relationele database?
Relationele database betekent dat de gegevens worden opgeslagen en opgehaald in de vorm van relaties (tabellen). Tabel 1 toont de relationele database met slechts één relatie, STUDENT genaamd, waarin ROLL_NO, NAME, ADDRESS, PHONE en AGE van studenten worden opgeslagen.
STUDENT
ROLL_NO | NAME | ADRES | PHONE | Leeftijd |
1 | RAM | DELHI | 9455123451 | 18 |
2 | RAMESH | GURGAON | 9652431543 | 18 |
3 | SUJIT | ROHTAK | 9156253131 | 20 |
4 | SURESH | DELHI | 9156768971 | 18 |
TABEL 1
Dit zijn enkele belangrijke terminologieën die worden gebruikt in termen van relatie.
Attribuut: Attributen zijn de eigenschappen die een relatie definiëren. b.v.; ROLL_NO, NAME etc.
Tuple: Elke rij in de relatie staat bekend als tuple. De bovenstaande relatie bevat 4 tuples, waarvan er een wordt weergegeven als:
1 | RAM | DELHI | 9455123451 | 18 |
Degree: Het aantal attributen in de relatie staat bekend als de graad van de relatie. De hierboven gedefinieerde STUDENT-relatie heeft graad 5.
Cardinaliteit: Het aantal tuples in een relatie staat bekend als cardinaliteit. De hierboven gedefinieerde STUDENT-relatie heeft cardinaliteit 4.
Kolom: Kolom vertegenwoordigt de set van waarden voor een bepaald attribuut. De kolom ROLL_NO wordt uit de relatie STUDENT gehaald.
ROLL_NO
De query’s voor een relationele database kunnen worden ingedeeld in de volgende categorieën:
Data Definition Language: Deze wordt gebruikt om de structuur van de database te definiëren, bijv. CREATE TABLE, ADD COLUMN, DROP COLUMN enzovoort.
Data Manipulation Language: Deze wordt gebruikt om gegevens in de relaties te manipuleren. b.v.; INSERT, DELETE, UPDATE enzovoort.
Data Query Language: Het wordt gebruikt om de gegevens uit de relaties te halen. b.v.; SELECT
Dus eerst zullen we de Data Query Language beschouwen. Een generieke query om gegevens uit een relationele database op te halen is:
- SELECT Attribute_List FROM R1,R2….RM
- ]
- ];
Een deel van de query, weergegeven door statement 1, is verplicht als je gegevens uit een relationele database wilt ophalen. De verklaringen die erin staan zijn optioneel. We zullen kijken naar de mogelijke query-combinatie op relatie zoals weergegeven in tabel 1.
Geval 1: Als we de attributen ROLL_NO en NAME van alle studenten willen opvragen, wordt de query:
SELECT ROLL_NO, NAME FROM STUDENT;
ROLL_NO | NAAM |
1 | RAM |
2 | RAMESH |
3 | SUJIT |
4 | SURESH |
Case 2: Als we ROLL_NO en NAME willen opvragen van de leerlingen van wie de ROLL_NO groter is dan 2, dan wordt de query:
SELECT ROLL_NO, NAME FROM STUDENT WHERE ROLL_NO>2;
ROLL_NO | NAAM |
3 | SUJIT |
4 | SURESH |
CASE 3: Als we alle attributen van studenten willen opvragen, kunnen we * schrijven in plaats van alle attributen te schrijven als:
SELECT * FROM STUDENT WHERE ROLL_NO>2;
ROLL_NO | NAME | ADRES | AGE | |
3 | SUJIT | ROHTAK | 9156253131 | 20 |
4 | SURESH | DELHI | 9156768971 | 18 |
Voorbeeld 4: Als we de relatie in oplopende volgorde op LEEFTIJD willen weergeven, kunnen we ORDER BY-clausule gebruiken als:
SELECT * FROM STUDENT ORDER BY AGE;
ROLL_NO | NAAM | PHONE | AGE | |
1 | RAM | DELHI | 9455123451 | 18 | 2 | RAMESH | GURGAON | 9652431543 | 18 |
4 | SURESH | DELHI | 9156768971 | 18 | 3 | SUJIT | ROHTAK | 9156253131 | 20 |
Note: ORDER BY AGE is gelijkwaardig aan ORDER BY AGE ASC. Als we de resultaten in aflopende volgorde van LEEFTIJD willen opvragen, kunnen we ORDER BY AGE DESC gebruiken.
CASE 5: Als we verschillende waarden van een attribuut of een groep attributen willen ophalen, wordt DISTINCT gebruikt zoals in:
SELECT DISTINCT ADDRESS FROM STUDENT;
ADDRESS
DELHI
GURGAON
ROHTAK
Als DISTINCT niet wordt gebruikt, wordt DELHI twee keer herhaald in de resultatenset. Voordat we GROUP BY en HAVING begrijpen, moeten we eerst de aggregatiefuncties in SQL begrijpen.
AGGRATION FUNCTIONS: Aggregatiefuncties worden gebruikt om wiskundige bewerkingen uit te voeren op gegevenswaarden van een relatie. Enkele van de meest gebruikte aggregatiefuncties in SQL zijn:
- COUNT: Count functie wordt gebruikt om het aantal rijen in een relatie te tellen. vb;
SELECT COUNT (PHONE) FROM STUDENT;
COUNT(PHONE)
- SUM: SUM functie wordt gebruikt om de waarden van een attribuut in een relatie bij elkaar op te tellen. vb;
SELECT SUM (AGE) FROM STUDENT;
SUM(AGE)
Op dezelfde manier kunnen MIN, MAX en AVG worden gebruikt. Zoals we hierboven hebben gezien, retourneren alle aggregatiefuncties slechts 1 rij.
AVERAGE: Het geeft de gemiddelde waarden van de tuppels. Het wordt ook gedefinieerd als som gedeeld door aantal waarden.
Syntax:AVG(attributennaam)
Of
Syntax:SUM(attributennaam)/COUNT(attributennaam)
De bovenstaande syntaxis geeft ook de gemiddelde waarde van tuppels.
MAXIMUM:Hiermee wordt de maximale waarde uit de verzameling tuppels gehaald.
Syntaxis:MAX(attributennaam)
MINIMUM:Hiermee wordt de minimale waarde uit de verzameling tuppels gehaald.
Syntaxis:MIN(attributennaam)
GROUP BY: Group by wordt gebruikt om de tupels van een relatie te groeperen op basis van een attribuut of een groep van attributen. Het wordt altijd gecombineerd met een aggregatiefunctie die op de groep wordt berekend. bijv.;
SELECT ADDRESS, SUM(AGE) FROM STUDENTGROUP BY (ADDRESS);
In deze query wordt SUM(LEEFTIJD) berekend, maar niet voor de hele tabel, maar voor elk adres. d.w.z.; som van LEEFTIJD voor adres DELHI(18+18=36) en op dezelfde manier ook voor andere adressen. De uitvoer is:
ADDRESS | SUM(LEEFTIJD) |
DELHI | 36 |
GURGAON | 18 |
ROHTAK | 20 |
Als we proberen de hieronder gegeven query uit te voeren, zal dit resulteren in een fout omdat, hoewel we SUM(AGE) hebben berekend voor elk adres, er meer dan 1 ROLL_NO zijn voor elk adres dat we hebben gegroepeerd. Dus kan het niet worden weergegeven in de resultatenreeks. We moeten aggregatiefuncties gebruiken op kolommen na het SELECT statement om de resulterende set zinvol te maken wanneer we GROUP BY gebruiken.
SELECT ROLL_NO, ADDRESS, SUM(AGE) FROM STUDENTGROUP BY (ADDRESS);
NOTE: Een attribuut dat geen deel uitmaakt van de GROUP BY-clausule kan niet worden gebruikt voor selectie. Elk attribuut dat deel uitmaakt van de GROUP BY CLAUSE kan worden gebruikt voor selectie, maar het is niet verplicht. Maar we kunnen wel attributen die geen deel uitmaken van de GROUP BY-clausule gebruiken in een aggregrate functie.
Quiz over SQL