Welcome to Scribd. Sign in or start your free trial to enjoy unlimited e-books, audiobooks & documents.Find out more
Download
Standard view
Full view
of .
Look up keyword
Like this
2Activity
0 of .
Results for:
No results containing your search query
P. 1
MYSQL

MYSQL

Ratings:

4.0

(1)
|Views: 31|Likes:
Published by S R Krishnan

More info:

Published by: S R Krishnan on Aug 19, 2008
Copyright:Attribution Non-commercial

Availability:

Read on Scribd mobile: iPhone, iPad and Android.
download as PDF, TXT or read online from Scribd
See more
See less

05/09/2014

pdf

text

original

 
‘Inner Select’ statements in MySQL
Na joinen en group by, de 3de episode in mysql. Het gaat hier over inner selects. Zeg maareen tweede select in een andere genest. Dat kan behoorlijk praktisch zijn in je whereclausule.Je kan deze dingen ook gaan gebruiken in insert, update en delete statements (dat valtonder DML: Data Manipulation Language), maar daar ga ik het in deze tutorial niet overhebben. We houden het louter bij de retrieval, of laat ons zeggen; dé select.Laat ik deze keer mijn vertrouwde voorbeeld maar weer gebruiken, we kennen hetonderhand wel:Nogmaals, voor de verklaring van deze structuur (mocht hij je niet duidelijk zijn), zoekdan even de tutorial ‘Join in MySQL’.Misschien kan ik best even beginnen met een voorbeeld van zo’n inner select. We haddenhet in het voorbeeld bij 'Group By' over de laaste reactie op een bepaald bericht. (In deveronderstelling dat het bericht met de hoogste id, de laatste reactie is.) Daarbij kondenwe geen andere gegevens ophalen dan het id nummer, dat kan nu wel:
SELECT *FROM ReactieWHERE Id = (
SELECT max(Id) FROM Reactie
);
Waarin ik de inner select even rood oplicht.Let erop dat deze steeds tussen haakjes staat. Je ziet meteen wat er gebeurt: de innerselect wordt uitgevoerd en geeft de hoogste 'id' in de tabel met reacties terug. Daarnavergelijkt de buitenste select de id van iedere rij met de uitvoer van de 'inner select'.Voor de mensen die de ‘Group By’ tutorial nog niet lazen. We gebruiken deze structuuromdat het gebruik van een analytische functie in de where clausule uit den boze is.Dit is zeer eenvoudig te verklaren door het feit dat de voorwaarde in een where clausuleop iedere rij apart moet kunnen toegepast worden. Zo kan je in dit geval niet aan éénenkele rij zien of ze al dan niet de grootste id heeft.
 
Let er wel op dat je inner select in dit geval slechts 1 waarde teruggeeft. Een analytischefunctie leent zich er ideaal toe, maar een zeer stricte where clausule kan tot hetzelfderesultaat komen.Wanneer je de gelijkheid wil halen uit een rij van mogelijkheden is er een andere truk. Ikillustreer even met een voorbeeld. Je wil bijvoorbeeld alle mensen uit de database halendie ooit een bericht schreven. Dan kan dat eenvoudig door:
SELECT *FROM LidWHERE Lidnr IN (SELECT Schrijver FROM Bericht);
Merk op dat er uit deze inner select meerdere resultaten voorkomen. Wil je checken of hetlidnr in die lijst voorkomt, gebruik dan het codewoord IN.Iets verder gevorderde lezers zullen nu terecht opmerken dat bovenstaand probleem ookop te lossen is met een join. En effectief:
SELECT DISTINCT l.*FROM Bericht AS b, Lid AS lWHERE b.Schrijver = l.Lidnr
Er zullen nu waarschijnlijk meer voorbeelden komen die op verschillende manier op telossen zijn. Dit aangezien ik de voorbeelden zo eenvoudig en duidelijk mogelijk probeer tehouden. Wanneer je echter ingewikkelde query’s gaat schrijven, zal je merken dat op eenbepaald moment je voorkeur zal uitgaan voor een join of inner select. Zeker wanneer jebeide technieken in één query nodig hebt.Handig in gebruik is ook, wanneer je de IN dan toch min of meer onder knie hebt, de NOTIN, zoals het structuur al zegt, geeft mysql nu de rijen terug die niet in de lijst voorkomen.Een voorbeeld.We willen om inconsistentie in onze database te vermijden even controleren of erberichten bestaan die een id in voortzetting hebben waarvan het oorspronkelijke berichtwerd verwijderd. M.a.w. de voortzetting bevat een id, maar wanneer we die id volgen,vinden we geen bericht:
SELECT *FROM BerichtWHERE Voortzetting NOT IN (SELECT Id FROM Bericht)AND Voortzetting IS NOT NULL;
Waarin we alle rijen ophalen waarvan de voortzetting niet leeg is, maar de id invoortzetting ongeldig is.Het is uiteraard ook mogelijk een where clausule in zo’n inner select in te bouwen. Willenwe nu dezelfde bovenstaande controle uitvoeren. Met als extra dat oorspronkelijkeberichten ook voorzien moeten zijn van schrijver.
SELECT *FROM BerichtWHERE Voortzetting NOT IN (SELECT Id FROM Bericht WHERE Schrijver IS NOT NULL)AND Voortzetting IS NOT NULL;
We halen nu eigenlijk in de inner select alle berichten op waarvan de schrijver is ingevuld.Nu geven we alle berichten weer waarvan de voortzetting is ingevuld, maar deze nummerniet overeenkomt met één van de id’s uit die lijst.

You're Reading a Free Preview

Download
scribd
/*********** DO NOT ALTER ANYTHING BELOW THIS LINE ! ************/ var s_code=s.t();if(s_code)document.write(s_code)//-->