Oefening SQL
Ik heb van school (havo 5) oefening gekregen voor SQL, nu kom ik niet uit opdracht 5 13 en 14. Als ik 13 en 14 heb kan ik zelf 15 wel doen denk ik. Kan iemand mij hierbij helpen?
Dit zijn de vragen
Oefen-vragen bij SQL
1. De basisstructuur van een eenvoudige SQL-query bestaat uit:
SELECT …………
FROM …………
WHERE …………
Leg in je eigen woorden uit wat voor soort gegevens er op de stippellijntjes ingevuld moeten worden.
2. Geef bij de tabel klas (hiernaast) het SELECT statement zodat je van iedere leerling de naam en de hobby selecteert.
3. Gebruik dezelfde tabel om enkel de leerlingen met als hobby korfbal te selecteren.
4. Beschrijf de effecten van het gebruik van de statements GROUP BY en ORDER BY.
5. Geef het statement waarmee je een lijst krijgt van de sporten die meer dan 2 keer voorkomen.
6. Beschrijf de werking van de volgende SQL-functies:
a. COUNT(attribuut)
b. SUM(attribuut)
c. AVG(attribuut)
d. MAX(attribuut)
e. MIN(attribuut)
7. Geef het statement waarmee de Leerlingen in een lijst komen die zowel op P1 als PO een 7 of hoger haalden. En zet de namen in alfabetische volgorde.
8. Geef het statement waarmee voor deze klas de gemiddelden op P1 en P0 in beeld komen.
9. Geef het statement waarmee de hoogste score voor P1 en P0 (afzonderlijk) in beeld komt.
10. Wat doet PRIMARY KEY AUTOINCREMENT ?
11. Selecteer op (“dans”, “zwemmen”, “schaken”) m.b.v. een SELECT IN statement
In de tabel GROEPEN wordt van de leerlingen bijgehouden in welke groep ze zitten:
12. Wat is het SELECT statement waarmee je uit deze tabel de ll_ID kunt filteren van alle H3 groepsleden?
13. Gebruik het SELECT statement van opgave 12 om de namen van de leerlingen uit de klas H3 hiermee in beeld te krijgen..
De structuur van de opdracht wordt dus
SELECT … FROM … WHERE … IN ( SELECT … FROM … WHERE…)
14. Gebruik een JOIN om de tabel GROEPEN te koppelen met de tabel klas.
Creëer nu een lijst met de namen van leerlingen uit groep H2.
De structuur van de opdracht wordt dus
SELECT … FROM … WHERE … JOIN … ON
15. Schrijf het statement waarmee je de gemiddelden voor het P0 per groep (H1,H2,H3) in beeld krijgt.
Hierbij mijn antwoorden tot nu toe
/* Het maken van de databases */
CREATE TABLE klas (id INTEGER, naam TEXT, P1 REAL, P0 REAL, Hobby TEXT ) ;
INSERT INTO klas VALUES ( 133944, "Jeroen" ,6.5,6.00,"zwemmen" );
INSERT INTO klas VALUES ( 134131,"Thomas" ,8.0,6.00,"rugby" );
INSERT INTO klas VALUES ( 128081,"Pascal" ,6.0,6.50,"schaken" );
INSERT INTO klas VALUES ( 133838, "Jitka" ,7.5,6.50,"gamen" );
INSERT INTO klas VALUES ( 133783, "Chantal" ,7.3,6.50,"fietsen" );
INSERT INTO klas VALUES ( 133774, "Jan" ,9.5,9.50,"korfbal" );
INSERT INTO klas VALUES ( 128261, "Wietse" ,6.5,7.30,"gamen" );
INSERT INTO klas VALUES ( 133759, "Lisanne" ,6.5,7.30,"korfbal" );
INSERT INTO klas VALUES ( 134296, "Martijn" ,6.0,6.00,"rugby" );
INSERT INTO klas VALUES ( 133901, "Koen" ,8.0,8.00,"racen" );
INSERT INTO klas VALUES ( 133815, "Marijn" ,6.5,6.50,"gamen" );
INSERT INTO klas VALUES ( 127597, "Sieuwert" ,6.0,7.30,"rugby" );
INSERT INTO klas VALUES ( 133797, "Henk" ,6.0,7.50,"schaatsen" );
INSERT INTO klas VALUES ( 133861, "Maike" ,6.5,6.50,"turnen" );
INSERT INTO klas VALUES ( 133826, "Arman" ,7.3,8.00,"dans" );
INSERT INTO klas VALUES ( 133779, "Milou" ,7.3,8.00,"zwemmen" );
INSERT INTO klas VALUES ( 133805, "Tom" ,8.0,6.50,"korfbal" );
INSERT INTO klas VALUES ( 133866, "Twan" ,8.0,8.00,"voetbal" );
INSERT INTO klas VALUES ( 128778, "Waalko" ,6.5,6.00,"voetbal" );
CREATE TABLE groepen (id TEXT,ll_ID INTEGER);
INSERT INTO groepen VALUES ("H1",127597);
INSERT INTO groepen VALUES ("H2",128081);
INSERT INTO groepen VALUES ("H3",128261);
INSERT INTO groepen VALUES ("H1",128778);
INSERT INTO groepen VALUES ("H2",133759);
INSERT INTO groepen VALUES ("H3",133774);
INSERT INTO groepen VALUES ("H2",133779);
INSERT INTO groepen VALUES ("H3",1337830);
INSERT INTO groepen VALUES ("H1",133797);
INSERT INTO groepen VALUES ("H2",133805);
INSERT INTO groepen VALUES ("H3",133815);
INSERT INTO groepen VALUES ("H2",133826);
INSERT INTO groepen VALUES ("H1",133838);
INSERT INTO groepen VALUES ("H2",133861);
INSERT INTO groepen VALUES ("H3",133866);
INSERT INTO groepen VALUES ("H3",133901);
INSERT INTO groepen VALUES ("H1",133944);
INSERT INTO groepen VALUES ("H2",134131);
INSERT INTO groepen VALUES ("H3",134296);
/* Opdracht 1
SELECT is om een data de selecteren
FROM is vanaf waar je het wilt halen
WHERE is dat iets moet voldoen aan een conditie */
/* Opdracht 2 */
SELECT naam, hobby FROM klas;
/* opdracht 3 */
SELECT naam, hobby FROM klas WHERE hobby = "korfbal";
/* Opdracht 4
Met GROUO BY kan je data in groepen opsplitsen met de zelfe waarde
Met ORDER BY kan je data in een "ranglijst" zetten */
/* Opdracht 5 */
SELECT hobby, COUNT(hobby) FROM klas GROUP BY hobby ORDER BY COUNT(hobby) DESC;
/* Opdracht 6
A. Dit geeft het aantal weer van een kolom of database
B. Dit telt alle waardes bij elkaar op
C. Dit rekent het gemiddelde uit van de rij of colom
D. DIt geeft het hoogste getal
E. Dit geeft het laagste getal */
/* Opdracht 7 */
SELECT naam FROM klas WHERE p1 > 7 AND P0 > 7 ORDER BY naam;
/* Opdracht 8 */
SELECT AVG(p1), AVG(p0) FROM klas;
/* Opdracht 9 */
SELECT MAX(p1) FROM klas;
SELECT MAX(p0) FROM klas;
/* Opdracht 10
Dit maakt een uniek nieuw nummer per als er een nieuwe invoer van data komt */
/* Opdracht 11 */
SELECT naam FROM klas WHERE hobby = "dans" OR hobby = "zwemmen" OR hobby ="schaken";
/* Opdracht 12 */
SELECT * FROM groepen WHERE ID = "H3";
/* Opdracht 13 */
/* Opdracht 14 */
https://www.khanacademy.org/computer-programming/sql-oefen-toets/5813887489966080
Ik weet dat het veel is maar ik hoop dat iemand tijd en zin heeft om mij te helpen :)
Coen
Gewijzigd op 26/11/2018 22:21:59 door Coen Niemand
Verder over de JOIN kan je een hoop lezen op internet. Alles voorkauwen doen we natuurlijk liever niet ;-)
Opdracht 11 klopt niet, en moet een SELECT IN() zijn
Gewijzigd op 26/11/2018 23:12:14 door - Ariën -
Opdracht 5 is gelukt, opdracht 11 is nu aangepast en als het goed is ook correct. Nu de laatste paar nog.
SELECT LL_ID
FROM groepen
WHERE ID = "H3"
INNER JOIN klas on naam=naam;
Maar dit werkt ook niet. Ik snap niet wat ik fout doe.
naam en naam? Het gaat om het vergelijken uit twee tabellen. Normaliter zou je een vergelijking op ID-nummer moeten doen, en niet op de naam.
En het antwoord op vraag 7 is dit :
Toevoeging op 27/11/2018 12:50:46:
En misschien een rare vraag, maar kan de meester dit niet uitleggen?
De gast wordt er voor betaald door de belastingbetaler. Vraag maar aan je ouders als die weer klagen dat het schoolgeld omhoog gaat.
En weten je klasgenoten het niet? Jullie zijn toch zo whatsapp savvy.
Onze docent legt niet veel uit, wij hebben inderdaad ook wel een WhatsApp groep maar niemand weet hoe we deze laatste vragen moeten oplossen, vandaar dat ik het hier vraag. Het antwoord van u is niet correct omdat je niet de namen krijgt. Ik ga nu veder met de tips van hierboven
De koppeling moet je bij de ID-nummers leggen.
SELECT LL_ID, naam
FROM groepen
INNER JOIN klas on groepen.LL_ID=klas.ID
Zie ik de ID + naam maar zodra ik
SELECT LL_ID, naam
FROM groepen
WHERE ID = "H3";
INNER JOIN klas on groepen.LL_ID=klas.ID
Krijg ik een error, volgens mij ben ik op het goede pad maar mis ik iets waardoor de code niet klopt
Het is zelfs niet nodig, tenzij je meerdere sql-opdrachten achtereenvolgens uitvoert in een query.
Quote:
Dit is mijn beste antwoord voor 13...
Nee, het is je beste antwoord op vraag 14
Gewijzigd op 27/11/2018 19:15:58 door Adoptive Solution
Adoptive Solution als ik jouw code gebruik krijg ik niks
Volgens mij kan dit afhankelijk van de MySQL instellingen wel of geen hit opleveren.
En waarom een naam en een zelfde naam koppelen? Moet dit niet op een ID's zoals ik al eerder zei?
Gewijzigd op 27/11/2018 19:37:56 door - Ariën -
Met een hoofdletter H werkt het inderdaad. Dit is wel het antwoord op de vraag en ook staat er dat we het via deze constructie moeten doen in de opdracht.
Quote:
14. Gebruik een JOIN om de tabel GROEPEN te koppelen met de tabel klas.
Creëer nu een lijst met de namen van leerlingen uit groep H2.
De structuur van de opdracht wordt dus
SELECT … FROM … WHERE … JOIN … ON
Creëer nu een lijst met de namen van leerlingen uit groep H2.
De structuur van de opdracht wordt dus
SELECT … FROM … WHERE … JOIN … ON
Je moet de namen tonen, dat is wat je in het SELECT-deel doet. Maar je wilt gelijke data uit beide tabellen met elkaar koppelen. Dat zijn dan dus klas.id en groepen.LL_ID
(wel lekker inconsistent dat er afwisselend hoofd- en kleine letters gebruikt worden in de velden.)
Gewijzigd op 27/11/2018 19:49:52 door - Ariën -
Ja dat is voor opdracht 14, het antwoord van Adoptive was voor 13
- Ariën - op 27/11/2018 19:31:23:
Volgens mij kan dit afhankelijk van de MySQL instellingen wel of geen hit opleveren.
Dit kan inderdaad van de database-, tabel- en/of kolom-collation afhangen :). Dit bepaalt namelijk mede of vergelijkingen case-sensitive zijn of niet.
Gewijzigd op 27/11/2018 19:59:26 door Thomas van den Heuvel
Jup, de _ci suffix bepaalt dit.
Pleur onderstaande code in phpmyadmin en je kan zelf met een calculator controleren of het klopt.
Nog wel effe afronden. Maar dat is voor de vervolgcursus.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
SELECT klas.id, klas.naam, klas.P1, klas.P0, klas.hobby, groepen.id, groepen.ll_id
FROM klas
JOIN groepen ON klas.id = groepen.ll_id
WHERE groepen.id = H1'
ORDER BY klas.naam;
SELECT klas.id, klas.naam, klas.P1, klas.P0, klas.hobby, groepen.id, groepen.ll_id
FROM klas
JOIN groepen ON klas.id = groepen.ll_id
WHERE groepen.id = 'H2'
ORDER BY klas.naam;
SELECT klas.id, klas.naam, klas.P1, klas.P0, klas.hobby, groepen.id, groepen.ll_id
FROM klas
JOIN groepen ON klas.id = groepen.ll_id
WHERE groepen.id = 'H3'
ORDER BY klas.naam;
SELECT
( SELECT AVG(klas.P0) FROM klas WHERE klas.id IN ( SELECT groepen.ll_id FROM groepen WHERE groepen.id = 'H1') ) AS gemh1,
( SELECT AVG(klas.P0) FROM klas WHERE klas.id IN ( SELECT groepen.ll_id FROM groepen WHERE groepen.id = H2') ) AS gemh2,
( SELECT AVG(klas.P0) FROM klas WHERE klas.id IN ( SELECT groepen.ll_id FROM groepen WHERE groepen.id = 'H3') ) AS gemh3;
FROM klas
JOIN groepen ON klas.id = groepen.ll_id
WHERE groepen.id = H1'
ORDER BY klas.naam;
SELECT klas.id, klas.naam, klas.P1, klas.P0, klas.hobby, groepen.id, groepen.ll_id
FROM klas
JOIN groepen ON klas.id = groepen.ll_id
WHERE groepen.id = 'H2'
ORDER BY klas.naam;
SELECT klas.id, klas.naam, klas.P1, klas.P0, klas.hobby, groepen.id, groepen.ll_id
FROM klas
JOIN groepen ON klas.id = groepen.ll_id
WHERE groepen.id = 'H3'
ORDER BY klas.naam;
SELECT
( SELECT AVG(klas.P0) FROM klas WHERE klas.id IN ( SELECT groepen.ll_id FROM groepen WHERE groepen.id = 'H1') ) AS gemh1,
( SELECT AVG(klas.P0) FROM klas WHERE klas.id IN ( SELECT groepen.ll_id FROM groepen WHERE groepen.id = H2') ) AS gemh2,
( SELECT AVG(klas.P0) FROM klas WHERE klas.id IN ( SELECT groepen.ll_id FROM groepen WHERE groepen.id = 'H3') ) AS gemh3;
En ondertussen vraag ik aan Arie Slob of ik korting krijg op mijn belasting wegens onbezoldigd parttime meesterschap.
PS ik zie dat 'h1' en 'H1' bij mij geen verschil maakt.
Toevoeging op 27/11/2018 20:59:39:
PS 2 ik gebruik utf8mb4_general_ci voir database en tabellen.
Gewijzigd op 27/11/2018 20:57:59 door Adoptive Solution
Als de kolommen BINARY zijn dan zijn ze wel case sensitive volgens mij, ongeacht de collation, dus het hangt (in dat geval) niet alleen af van de collation.