[SQL] Opdracht

Pagina: 1
Acties:

  • Rfce
  • Registratie: Oktober 2001
  • Laatst online: 26-09-2024

Rfce

Veni, Vidi, Vici

Topicstarter
OK ik weet niet of ik zoiets dergelijks mag vragen, maar ik moet een SQL opdracht bedenken inc. uitwerkingen (voor school)! Nu heb ik het volgende bedacht... kunnen jullie er even naar kijken??

In een gegevensbank wordt de verkoop van huizen geregistreerd. Een huis kan bij verschillende makelaars in de verkoop staan.
Telkens als een potentiële koper bij één van de makelaars een bod doet op een huis dat deze in de verkoop heeft, wordt dit geregistreerd. Een koper kan meer dan één bod doen.

De gegevensstructuur met als record-typen KOPER, MAKELAAR, BOD, HUIS en GEMEENTE met relatie record-typen:
Afbeeldingslocatie: http://roy.essershome.nl/sql.jpg

Attributen voor de bestaande identiteiten:
MAKELAAR (mk_id, mk_naam, gm_naam)
HUIS (hs_id, hs_naam, gm_naam, verkocht, tekoop)
KOPER (ko_id, ko_naam, bd_naam, bod_waarde)
BOD (bd_id, bd_naam, vraag_prijs, verk_prijs)
GEMEENTE (gm_id, gm_naam, bd_naam)

Opdrachten:

1) Welke makelaars hebben het huis Zonnenvloed in de verkoop staan, waarbij de vraag_prijs hoger is dan 150.000?

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
SELECT mk_naam
FROM MAKELAARS
WHERE GM_naam IN
    ( SELECT gm_naam, bd_naam
        FROM GEMEENTE
        WHERE gm_naam IN
            ( SELECT gm_naam
                FROM HUIS
                WHERE hs_naam = "Zonnenvloed" 
                AND  tekoop = "j"
                AND  verkocht = "n")
            AND bd_naam IN 
                            ( SELECT bd_naam
                                FROM BOD
                                WHERE vraag_prijs > 150000 ));

2) Op welke huizen is nog geen bod gedaan?
code:
1
2
3
4
5
6
7
8
9
10
11
SELECT hs_naam, gm_naam
FROM    HUIS H
WHERE NOT EXISTS 
        ( SELECT *
          FROM GEMEENTE
          WHERE gm_naam = H.gm_naam
              AND H.gm_naam IN 
                        ( SELECT *
              FROM     HUIS
              WHERE  tekoop = "n"
                AND  verkocht = "n");

3) Welke makelaar(s) gaan over huis Zeezicht of huis Meerkade?
code:
1
2
3
4
5
6
7
8
9
10
SELECT mk_naam
FROM MAKELAAR
WHERE gm_naam IN  
            ( SELECT gm_naam
            FROM GEMEENTE
            WHERE gm_naam = 
                ( SELECT gm_naam
                            FROM HUIS
                            WHERE hs_naam = "Zeezicht"
                    OR hs_naam = "Meerkade"));

4) Welke makelaars hebben bij de gemeente een unieke naam?
code:
1
2
3
4
5
6
7
SELECT mk_naam
FROM MAKELAAR M1
WHERE M1.mk_naam NOT IN
            ( SELECT mk_naam
              FROM  MAKELAAR M2
              WHERE  gm_naam = M1.gm_naam
                AND  mk_id <> M1.mk_id);

5) Selecteer de makelaars in de gemeente Heerlen met meer dan dan 6 huizen!
code:
1
2
3
4
5
6
7
8
9
10
11
SELECT mk_naam
FROM MAKELAAR 
WHERE gm_naam IN 
                ( SELECT gm_naam
                FROM GEMEENTE
                WHERE gm_naam = 
                     ( SELECT gm_naam, hs_naam
                     FROM    HUIS
                 WHERE gm_naam = "Heerlen"
                         GROUP BY hs_naam
                 HAVING COUNT(*) > 6));

6) Geef de huizen waar een koper kans op maakt (bod_waarde >= vraag_prijs) of waarvan de makelaar "Huis&Co" heet, maak gebruik van UNION!
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
SELECT hs_naam, gm_naam
FROM  HUIS
WHERE gm_naam = 
        ( SELECT gm_naam, bd_naam
            FROM GEMEENTE
            WHERE bn_naam IN 
                ( SELECT bd_naam
                FROM KOPER
                WHERE bod_waarde >= 
                        ( SELECT vraag_prijs
                    FROM    BOD
                        WHERE vraag_prijs != NULL )));
UNION
( SELECT gm_naam
  FROM    GEMEENTE
  WHERE gm_naam IN 
    ( SELECT mk_naam, gm_naam
      FROM     MAKELAAR
      WHERE   mk_naam = "Huis&Co"));

7) Verhoog elk bod van makelaar "Gezellig-wonen" met 10%
code:
1
2
3
4
5
6
7
8
9
UPDATE BOD
SET bod_waarde = bod_waarde * 1.1
WHERE bd_naam IN 
        ( SELECT gm_naam,bd_naam
      FROM    GEMEENTE
      WHERE gm_naam = 
        ( SELECT mk_naam, gm_naam
          FROM    MAKELAAR
          WHERE mk_naam = "Gezellig-wonen" ));

8 ) Geef een melding voor: De kolom hs_id in de tabel HUIS moet zijn ingevult, tevens uniek! (je checkt dus even die tabel)
code:
1
2
3
4
5
SELECT DISTINCT "Het huis met de naam ",hs_naam," heeft geen uniek id!" 
FROM HUIS
GROUP BY hs_id
HAVING hs_id IS NULL
OR COUNT(*) > 1;


9) Wat is het gemiddelde, het laagste en het hoogste bod wat er is gedaan op het huis Heidebloem?
code:
1
2
3
4
5
6
7
8
9
SELECT AVG(bod_waarde), MIN(bod_waarde), MAX(bod_waarde)
FROM KOPER
WHERE bd_naam IN 
            ( SELECT gm_naam, bd_naam
              FROM GEMEENTE
          WHERE gm_naam IN 
                ( SELECT gm_naam, hs_naam
                          FROM HUIS
                          WHERE hs_naam = "Heidebloem"));

10) Geef de naam van de huizen die zijn verkocht onder makelaar "Piet, of die nog te koop staan onder makelaar "Jan"!
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
SELECT hs_naam
FROM HUIS
WHERE verkocht  =  "j"
AND gm_naam IN 
        ( SELECT gm_naam, mk_naam
            FROM MAKELAAR 
            WHERE mk_naam = "Piet")
UNION
SELECT hs_naam
FROM HUIS
WHERE tekoop =  "j";
AND gm_naam IN 
        ( SELECT gm_naam, mk_naam
            FROM MAKELAAR 
            WHERE mk_naam = "Jan");

euh...ja


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 23:30

NMe

Quia Ego Sic Dico.

En wat is het nu dat je verwacht dat wij doen? Maak gewoon een testdatabase in Access of MySQL ofzo en test of het werkt?

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • zwippie
  • Registratie: Mei 2003
  • Niet online

zwippie

Electrons at work

Zeg, laat dit gewoon even door je docent nakijken!

laat dergelijke replies in 't vervolg maar achterwege

[ Voor 46% gewijzigd door whoami op 04-03-2004 13:20 ]

How much can you compute with the "ultimate laptop" with 1 kg of mass and 1 liter of volume? Answer: not more than 10^51 operations per second on not more than 10^32 bits.


  • Reveller
  • Registratie: Augustus 2002
  • Laatst online: 05-12-2022

Reveller

Hopla!

Volgens mij heb jij enkele dagen geleden met eenzelfde post al een slotje gekregen...dus drie keer raden wat er met deze post gebeurt ;). Als het je om een compliment te doen is - bij deze dan: "Je bent een geweldig goede programmeur en je docent kan trots op je zijn!"

[ Voor 57% gewijzigd door Reveller op 04-03-2004 12:51 . Reden: edit ]

"Real software engineers work from 9 to 5, because that is the way the job is described in the formal spec. Working late would feel like using an undocumented external procedure."


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 23:30

NMe

Quia Ego Sic Dico.

Het ziet er inderdaad wel netjes uit ja... Queries met 3 subqueries heb je trouwens maar HEEL zelden nodig, dus misschien dat dat in jouw oplossing ook korter kan.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • EfBe
  • Registratie: Januari 2000
  • Niet online
doe wat aan die naamgeving vna die velden! Alleen daarom zou je al een onvoldoende moeten krijgen (alleen dan leer je het af, ik kan het weten heb ooit ook zo een tentamen niet gehaald op de UT) mk_id, wat is dat? Gebruik dan: MakelaarID. Beter leesbaar.

Bij 3) moet je IN ( ) gebruiken, geen OR clause, dat kost nl. megaveel performance (dubbele tablescan)

10) klopt niet, je selecteert 2 velden in de subquery en dat mag niet. Subqueries behoren single column results op te leveren.

Het zijn wel erg veel subqueries. Die zijn veelal niet vooruit te branden. OOit aan joins gedacht? :)

[ Voor 43% gewijzigd door EfBe op 04-03-2004 13:05 ]

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 23:30

NMe

Quia Ego Sic Dico.

EfBe schreef op 04 maart 2004 @ 13:02:
Het zijn wel erg veel subqueries. Die zijn veelal niet vooruit te branden. OOit aan joins gedacht? :)
Is dat zo? Ik dacht dat het (bijna) geen verschil maakte?

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • whoami
  • Registratie: December 2000
  • Laatst online: 00:40
Je kunt idd beter joinen ipv gebruik te maken van subqueries.

Daarnaast is het ook beter dat je zoveel mogelijk joined of selecteert op Id's ipv op de namen:

code:
1
select blaat from tabel where id in ( select id .... )

Maar goed, bovenstaande kan je dus idd beter herschrijven naar een join.

https://fgheysels.github.io/


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

NMe84 schreef op 04 maart 2004 @ 13:12:
[...]

Is dat zo? Ik dacht dat het (bijna) geen verschil maakte?
Dat hangt er maar helemaal van af wat je ermee doet... een join kan op basis van z'n condition vaak al met de indexen besluiten dat ie stapels data niet nodig gaat hebben, terwijl iedere subquery in principe volledig uitgevoerd moet worden (en dus alle non-indexed data ook moet doorpompen).

En wat betreft dat slotje: toen was het een vraag of wij de opdracht konden bedenken, en daar zit weinig nuttigs of constructiefs in. Nu heeft ie zelf de opdracht reeds bedacht en kunnen we daar gezellig over bomen, en dat zie ik een stuk liever :)

Professionele website nodig?


  • EfBe
  • Registratie: Januari 2000
  • Niet online
NMe84 schreef op 04 maart 2004 @ 13:12:
[...]

Is dat zo? Ik dacht dat het (bijna) geen verschil maakte?
Dat dacht ik ook, totdat ik eens goed ging kijken :) Joins zijn erg simpel te optimaliseren door een optimizer, waarbij je bv eerst kijkt welke table de minste rows heeft, daar begin je en dan heb je een veel smallere join set voor de grotere tables :)

Subqueries daarentegen moeten eerst worden uitgevoerd, en daarna worden meegenomen in een filter. Bekijk maar eens wat execution plans: (northwind)

query 1
code:
1
2
3
4
5
6
SELECT  Customers.*
FROM    Customers INNER JOIN Orders ON
    Customers.CustomerID = Orders.CustomerID
    INNER JOIN [Order Details] ON
    [Order Details].OrderID = Orders.OrderID
WHERE   [Order Details].ProductID = 2


query 2
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
SELECT  * 
FROM    Customers 
WHERE   CustomerID IN
(
    SELECT  CustomerID 
    FROM    Orders
    WHERE   OrderID IN
    (
        SELECT  OrderID
        FROM    [Order Details]
        WHERE   ProductID =2
    )
)


Punt is alleen, dat je bij joins soms dubbele waarden krijgt. Met DISTINCT is dat niet altijd op te lossen. Mocht dat echter geen probleem zijn, dan heb je een snelheids winst van 33% te pakken in bovenstaande query :)

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


  • whoami
  • Registratie: December 2000
  • Laatst online: 00:40
EfBe schreef op 04 maart 2004 @ 14:20:
[...]


Dat dacht ik ook, totdat ik eens goed ging kijken :) Joins zijn erg simpel te optimaliseren door een optimizer, waarbij je bv eerst kijkt welke table de minste rows heeft, daar begin je en dan heb je een veel smallere join set voor de grotere tables :)

Punt is alleen, dat je bij joins soms dubbele waarden krijgt. Met DISTINCT is dat niet altijd op te lossen. Mocht dat echter geen probleem zijn, dan heb je een snelheids winst van 33% te pakken in bovenstaande query :)
Mierenneuken: je statistics moeten dan wel up - to - date zijn. :+ :P

https://fgheysels.github.io/


  • Rfce
  • Registratie: Oktober 2001
  • Laatst online: 26-09-2024

Rfce

Veni, Vidi, Vici

Topicstarter
ok alvast bedankt voor de reacties :)

Ik ga iig ff de boel aanpassen ivm naamgeving!

euh...ja


  • EfBe
  • Registratie: Januari 2000
  • Niet online
whoami schreef op 04 maart 2004 @ 14:22:
Mierenneuken: je statistics moeten dan wel up - to - date zijn. :+ :P
dat gaat vanzelf :P En dan nog: beide varianten hebben dan problemen bij het niet hebben van juiste statistics. De join query wordt alleen maar sneller, de subquery variant blijft gelijk presteren.

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


  • Rfce
  • Registratie: Oktober 2001
  • Laatst online: 26-09-2024

Rfce

Veni, Vidi, Vici

Topicstarter
ik wil toch gebruik gaan maken van die join functie... wat moet ik nu precies aanpassen, om het goed te laten verlopen??

euh...ja


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

EfBe schreef op 04 maart 2004 @ 13:02:
10) klopt niet, je selecteert 2 velden in de subquery en dat mag niet. Subqueries behoren single column results op te leveren.
Das niet waar, zowel in SQL-spec als in daadwerkelijke implementaties kan je dat zo doen:
code:
1
2
3
4
5
acm=# select * from verjaardagen where (naam, verjaardag) IN (SELECT * FROM verjaardagen );
 naam  |     verjaardag
-------+---------------------
 arjen | 1980-01-01
 remko | 1977-01-01


(maar het moet aan weerszijden van de IN wel evenveel zijn natuurlijk)
Het zijn wel erg veel subqueries. Die zijn veelal niet vooruit te branden. OOit aan joins gedacht? :)
Een goede optimizer kan het tot min of meer dezelfde executie herschrijven, maar de optimizer een handje helpen is natuurlijk altijd verstandig.

[ Voor 5% gewijzigd door ACM op 17-03-2004 15:17 ]


  • Rfce
  • Registratie: Oktober 2001
  • Laatst online: 26-09-2024

Rfce

Veni, Vidi, Vici

Topicstarter
en welke optimizer is aan te bevelen??

euh...ja


  • whoami
  • Registratie: December 2000
  • Laatst online: 00:40
Rfce schreef op 17 maart 2004 @ 16:10:
en welke optimizer is aan te bevelen??
De 'optimizer' is een stukje van het DBMS dat je gebruikt, die het execution plan voor je query gaat gaan bepalen.

https://fgheysels.github.io/


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

Rfce schreef op 17 maart 2004 @ 16:10:
en welke optimizer is aan te bevelen??
De optimizer is een intern onderdeel van je DBMS die geparste SQL-queries naar een intern zo optimaal mogelijke vorm omzet alvorens te executen ;)

Professionele website nodig?


  • Rfce
  • Registratie: Oktober 2001
  • Laatst online: 26-09-2024

Rfce

Veni, Vidi, Vici

Topicstarter
ow, maar wacht ff, ik ben niets aan het testen, dit staat gewoon allemaal op papier... dus ik kan zo niet 1-2-3 de code optimaliseren!
Ik had eigenlijk in gedachte, van welke alternate keys ik nodig zou hebben bijv. op die join goed te kunnen laten werken!!

euh...ja


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

Rfce schreef op 17 maart 2004 @ 16:32:
ow, maar wacht ff, ik ben niets aan het testen, dit staat gewoon allemaal op papier... dus ik kan zo niet 1-2-3 de code optimaliseren!
Ik had eigenlijk in gedachte, van welke alternate keys ik nodig zou hebben bijv. op die join goed te kunnen laten werken!!
Ik neem aan dat je 'foreign keys' bedoelt, en dan nog snap ik je vraag niet :)

Professionele website nodig?


  • whoami
  • Registratie: December 2000
  • Laatst online: 00:40
Ik snap het ook niet?
Je hebt toch zelf het datamodel gemaakt, dus weet je zelf ook wel welke relaties er tussen jouw tabellen liggen, en welke velden de foreign key en primary key zijn welke je moet gebruiken om te joinen?

https://fgheysels.github.io/


  • Rfce
  • Registratie: Oktober 2001
  • Laatst online: 26-09-2024

Rfce

Veni, Vidi, Vici

Topicstarter
ik heb dus alleen gebruik gemaakt van primary key's (zoals je kunt zien in het modelletje)....
Maar nu wil ik het dus "verbeteren" door dus idd foreign key's eraan toe te voegen/kennen, zodat ik gebruik kan maken van die joints!!

euh...ja


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

Rfce schreef op 17 maart 2004 @ 17:23:
ik heb dus alleen gebruik gemaakt van primary key's (zoals je kunt zien in het modelletje)....
Maar nu wil ik het dus "verbeteren" door dus idd foreign key's eraan toe te voegen/kennen, zodat ik gebruik kan maken van die joints!!
Uhm volgens mij moet jij je boek weer eens even vanaf pagina 1 openslaan. Je bent dus met een relationele database aan het werken zonder een idee wat het relationeel maakt.... :?

Professionele website nodig?


  • Varienaja
  • Registratie: Februari 2001
  • Laatst online: 14-06-2025

Varienaja

Wie dit leest is gek.

Wat ik nou niet snap, en waarover ik nog geen commentaar lees:

Hoe kom je erbij om 'bod' op deze manier te modelleren? Een bod wordt gedaan door een persoon op een huis. Hoe kom je er in vredesnaam bij om in de tabel 'bod' een verwijzing naar 'gemeente' op te nemen???

Het hele datamodel slaat nergens op eigenlijk.. Een makelaar kan alleen maar huizen in z'n eigen gemeente verkopen? Een huis kan meerdere vraagprijzen hebben? En wat doet een 'verkoopprijs' in een 'bod'????? Een huis heeft geen vraagprijs zolang er nog niet geboden is?

[ Voor 53% gewijzigd door Varienaja op 17-03-2004 17:40 ]

Siditamentis astuentis pactum.


  • Guldan
  • Registratie: Juli 2002
  • Laatst online: 24-05 23:58

Guldan

Thee-Nerd

hmm, je database ontwerp kloppt idd niet helemaal vooral als je geen relationeel databse ontwerp hebt.

Maar Vreemde sleutels zijn waarden in een tabel die in een andere tabel de primary key zijn. (primaire sleutel, sorry voor de taalwisseling).Ik weet niet of je op de hoogte bent van relationeel database ontwerp. Anders zou ik daar eerst ff naar zoeken.

[edit] dat klonk wel erg cru.Bedoelde het niet zo. Ik weet niet of er uberhaupt gekeken wordt naar het ontwerp.Qua relationele databases en regels etc.

[ Voor 18% gewijzigd door Guldan op 17-03-2004 18:33 ]

You know, I used to think it was awful that life was so unfair. Then I thought, wouldn't it be much worse if life were fair, and all the terrible things that happen to us come because we actually deserve them?

Pagina: 1