Heggenschaar, kappersschaar
Sommige dingen zijn gemakkelijk met sommige apparaten maar andere dingen weer een stuk moeilijker. Zo kan men met een heggenschaar eenvoudig een heg netjes maken maar is deze minder geschikt om een kapsel mee te fatsoeneren.
Een inleiding tot een voor slechts een klein gezelschap interessant gegeven. Ergens in 1988 of 1989 was ik net Database Administrator bij de Detam. Wij werkten met het Codasyl Netwerk DBMS IDS-2 op een Honeywell-Bull DPS8 mainframe met GCOS8 als Operating System. In die tijd blaakte Bull van het zelfvertrouwen en grapte men dat GCOS stond voor God's Chosen Operating System. Nu piepen ze wel anders.
Relationele database management systemen (RDBMS) waren in opmars en samen met Data Administrator Jan Dijkstra bezocht ik een seminar van professor dr. J.F. Vandenbulcke. Hij vertelde ons over de taal SQL (Structured Query Language) en hoe gemakkelijk men, vergeleken met talen als Cobol of C, er gegevens uit databases mee kon opvragen.
Stel men heeft een tabel met de naam SPELERS. Het enige (relevante) attribuut is het veld BONDSNUMMER. Een rapport met alle gegevens, gesorteerd op bondsnummer krijgt men met de volgende query: SELECT BONDSNUMMER FROM SPELERS ORDER BY BONDSNUMMER DESC.
Heel eenvoudig. Maar hoe krijgt men als resultaat alleen de drie hoogste bondsnummers? Vreemd genoeg is dat in standaard SQL plotseling veel complexer:
SELECT BONDSNUMMER
FROM SPELERS A
WHERE 3 > (SELECT COUNT(*) FROM SPELERS B WHERE A.BONDSNUMMER < B.BONDSNUMMER)
ORDER BY BONDSNUMMER DESC;
Soms is rond beter, soms vierkant. Zijn er hier nog programmeurs in de zaal?
Comments
Ik weet niets van pure SQL, alleen van MySQL, maar daarmee kan ik de uitvoer van de query gewoon limiteren tot de eerste 3 resultaten.
Posted by: ijsbrand | January 29, 2010 7:32 PM
In MS Access kan het met:
SELECT TOP 3 BONDSNUMMER
FROM SPELERS
ORDER BY BONDSNUMMER DESC;
Posted by: Laurent | January 29, 2010 7:33 PM
Ik zeg: excel! :-)
Posted by: Pascale | January 29, 2010 7:56 PM
Werkte men toen niet ook samen met Burroughs?
Posted by: Terrebel | January 29, 2010 10:11 PM
te lang geleden turbo pascal gehad, weet niet meer hoe dat in Turbo pascal geschreven zou moeten worden, in excel zou het nog wel lukken denk ik (ga nu niet mijn hersenen pijnigen het is vrijdag avond en heb net happy hour met kippepoten en polar achter de rug.
over projecten gesproken, Santabarbaraplantation.com moet je eens bekijken, het is echt zo groen op curacao dit moment, en als je me niet gelooft stuur ik je wel wat foto's, leuk stukje achtertuin om een balletje te slaan.
Posted by: ennu | January 29, 2010 11:08 PM
Gelukkig heb ik meer verstand van Belgische biersoorten en Spaanse Brandy.
Posted by: El Alcalde | January 30, 2010 4:29 AM
niet echt!
Posted by: Henk | January 30, 2010 4:46 AM
Huh?!
Posted by: Trezeguet | January 30, 2010 9:41 AM
@IJsbrand: Ansi SQL is de standaard voor deze taal. Oracle, MySQL, SQL Server etc. zijn allemaal dialecten met (nuttige) toevoegingen. Het mooie van dit voorbeeld is dat je zonder een truc de juiste deelverzameling overhoudt.
@Laurent: Precies, de TOP-functie is zo'n toevoeging. Toch is dat minder mooi, maar ja nostalgie. Er zijn ook mensen die vinden dat het echte autorijden handgeschakeld en zonder ESP is.
@Pascale: Ik zeg: okay, laat de belastingdienst al hun gegevens maar eens in een Excel-sheet proppen. Dan gaat het ZEKER mis, haha.
@Terrebel: Neen, Burroughs was juist een concurrent van Bull. Burroughs heeft Sperry overgenomen en werd toen Unisys. Tegenwoordig verleent dit bedrijf informatietechnologie services.
( http://nl.wikipedia.org/wiki/Unisys )
@Ennu: Turbo Pascal, later gevolgd door Tubro C, was lange tijd mijn favoriete programmeertaal. Het is een 3GL en record-georienteerd terwijl SQL een tabel- ofwel bestands-georienteerde taal is. Dit is echter totaal niet van belang als men net bij 30 graden Polar en kippenbouten naar binnen gewerkt heeft. Santabarbaraplantation.com klinkt interessant. Onze achtertuin is op dit moment wit.
@El Alcalde: Dat is ook veel belangrijker. Ik weet er nog niet genoeg van, ga me vanavond weer wat verder verdiepen in de wereld die Westmalle heet.
@Henk: Taxichauufeurs dan?
@Trezeguet: Lees het nog maar een keer rustig door... ;-)
Posted by: CasaSpider | January 30, 2010 10:06 AM
Als je iets snapt is het eenvoudig ja, meestal!
Posted by: Renesmurf | January 30, 2010 4:00 PM
$link = mysql_connect ($host, $user, $pw) or die;
mysql_select_db("blogbase",$link) or die;
$qset = mysql_query("SELECT name, popularity FROM bloggers WHERE blogger_id = 'CS'");
$row = mysql_fetch_assoc($qset);
print $row["name"].' - '.$row["popularity"];
Resultaat: "CasaSpider - Very"
Posted by: R van InR | January 30, 2010 8:57 PM
Sheesh.
Posted by: Irene | January 30, 2010 9:05 PM
@Renesmurf: Het is nu eenmaal gemakkelijker een koe van achteren in de kont te kijken.
@RvanInR: Perl! Knap stukje programmeerwerk, maar heb je het resultaat ook getest? Testen, daar ontbreekt het vaak aan.
@Irene: Ja, zeg dat wel. Wat is de populariteit van 'SD' trouwens? Ik gok: 'Ultimate'.
Posted by: CasaSpider | January 31, 2010 10:39 AM
Dit resultaat testen wij dagelijks en al gedurende vele jaren ;-)
Posted by: R van InR | January 31, 2010 11:26 AM
Als .netter met Linq...
var first3Spelers =
(
from s in Spelers
select s //Voor het gehele spelers object
select new { s.Voornaam, s.Naam } //Voor alleen 2 velden in een nieuw object.
).Take(3);
Natuurlijk hebben we in Linq ook nog de .Skip of de .SkipWhile of .TakeWhile
Gebruik van deze code is op eigen risico, niet getest;)
Vind de foutafhandeling in .net toch iets vriendelijker, "Catch" ipv "die" zoals perl en php volgens mij ook...
Posted by: Carolus | January 31, 2010 2:16 PM
@RvanInR: Dank u wel, helaas is het met bloggen net zoals met films maken: je bent zo goed als je laatste film...
@Carolus: Ik heb nooit met Linq gewerkt. Een vraagje: Hoe is bepaald dat hiermee de hoogste drie bondsnummers worden geselecteerd? Ik zie nergens een sortering, laat staan een in aflopende volgorde.
Posted by: CasaSpider | January 31, 2010 2:36 PM
Het scherpe oog van een dba... "orderby s.Bondsnummer desc" direct na de select ontbreekt nog.
Posted by: Carolus | January 31, 2010 8:44 PM
@Carolus: Mijn gewone ogen hebben -6 maar het DBA-oog is goed getraind... ;-)
Posted by: CasaSpider | February 4, 2010 7:28 PM
Bondsnummer moet wel uniek zijn, anders krijg je niet de drie hoogsten :-) Veiliger zou zijn om een GROUP BY te gebruiken en sneller om een cross join te gebruiken.
SELECT * FROM Gebruikers WHERE Clue > 0
(0) rows affected...
Posted by: Henri Koppen | February 11, 2010 8:33 AM