# Seite mit SQL-Aufgaben



## swerflash (13. Oktober 2008)

Hallo,

ich habe eine Seite mit SQL-Aufgaben, leider ohne Lösungen, gefunden.
Ich komme bei zwei Aufgaben nicht weiter. http://sqlzoo.net/de/3a.htm - Aufgabe 1c:

Mein Vorschlag wäre: SELECT song FROM album INNER JOIN track ON album.asin=track.album WHERE album LIKE "Blur";

Scheint aber nicht richtig zu sein. Wie muss es richtig sein und was habe ich eventuell falsch gemacht?

Dann die Aufgabe 2b:
Mein Vorschlag: SELECT title,COUNT(song) AS Ges_Stk FROM album INNER JOIN track ON album.asin=track.album WHERE song LIKE "*Heart*" GROUP BY title;

Funktioniert auch nicht. Wie muss das richtig lauten?

Ich habe weiter erstmal nicht mehr gemacht.

Vielen Dank!

PS: kennt jemand noch solche ähnliche Seiten, wo man LIVE trainieren kann?


----------



## Chumper (13. Oktober 2008)

zu 1c: statt album am ende in der WHERE-Klausel einfach title nehmen:

```
SELECT song FROM album INNER JOIN track ON album.asin=track.album WHERE title LIKE "Blur"
```

Bei 2c musst du statt der Sterne (*) Prozentzeichen verwenden (%) bei Heart:

```
SELECT title,COUNT(song) AS Ges_Stk FROM album INNER JOIN track ON album.asin=track.album WHERE song LIKE "%Heart%" GROUP BY title
```


----------



## swerflash (13. Oktober 2008)

Hey Cool! Besten dank! Dann war ich gar nicht so schlecht, wie ich es mir gedacht habe .

track.album ist ein Primärschlüssel oder? Das heißt, dort steht bestimmt irgendwelche IDs drinne? Warum sind, in der Aufgabestellung oben, auch dsk und posn unterschrichen? Sind das auch Primärschlüsseln?

Das mit % ist mir unbekannt. Ich habe gelesen, dass * für beliebig viele Zeichen steht. Wofür steht hier dann % und warum kann man * nicht verwenden in der Aufgabe 2c.

Danke!


----------



## Chumper (13. Oktober 2008)

In der Mysqlreferenz findet man das hier:



> With LIKE you can use the following two wildcard characters in the pattern:
> Character 	Description
> % 	Matches any number of characters, even zero characters
> _ 	Matches exactly one character


Und ich habe noch nie (*) in einer Abfrage benutzt.

zu deiner ersten Frage:
Da sie unterstrichen sind gehe ich davon aus, dass sie auch Primärschlüssel sind, und dienen zur weiteren Unterscheidung.
Beispiel:

```
album 	       disk 	posn 	song
B0000009VO 	1 	1 	Alison
B0000009VO 	1 	2 	Watching The Detectives
```
hier unterscheidet sich ja nur Posn


----------



## swerflash (13. Oktober 2008)

Danke!

Dann mache ich mal weiter mit Fragen 

2c:

```
SELECT title AS Titel, song AS Titelsong FROM album INNER JOIN track ON album.asin=track.album WHERE song LIKE title;
```

Ich bekomme mehrere Datensätze, was falsch ist, da: 
Wrong Answer. The correct answer has 1 column(s).

2d: 
	
	
	



```
SELECT title as Titel, artist as Band FROM album WHERE title like artist;
```
Wrong Answer. The correct answer has 1 column(s).

Wo ist mein Fehler?


----------



## Chumper (13. Oktober 2008)

"Column" kann man mit Spalte übersetzen, was heisst, dass dein Ergebnis nur eine Spalte haben soll.
Dein Ergebnis ist also nicht falsch, sondern deine Ausgabe:
Zu 2c:

```
SELECT song AS Titelsong FROM album INNER JOIN track ON album.asin=track.album WHERE song LIKE title;
```
Zu 2d:

```
SELECT title as Titel FROM album WHERE title=artist;
```


----------



## swerflash (14. Oktober 2008)

Ah! Danke.

Ich habe eine Frage bezüglich HAVING. Wann muss ich das verwenden? Existiert eine einfache Regel dafür? So weit ich weiß, muss man HAVING benutzen, wenn man bei SELECT eine Aggregatfunktion verwendet hat, da das bei WHERE nicht erlaubt ist. Jedoch kann man ja bei WHERE auch mit Aggregatfunktionen arbeiten, wenn man z.B. folgendes macht: WHERE Preis=(SELECT MAX(Preis) FROM Artikel). Ich habe den Unterschied nicht wirklich verstanden.

Bei der Aufgabe 2d hast du statt LIKE ein = verwendet. Ich habe ausprobiert und es geht mit beiden Varianten. Welche ist jedoch die bessere und warum?

Nochmal vielen Dank für die Hilfe!


----------



## swerflash (14. Oktober 2008)

Bei der Aufgabe 3a komme ich nicht weiter.

Ermittle die Songs, *die auf mehr als 2 Alben erschienen sind*. Zeige dabei auch, wie oft jeder Song auftaucht.

Habe leider keine Idee wie ich überprüfen kann, welche Songs auf mehr als 2 Alben erschienen sind. Das ist mein Anfang:


```
SELECT COUNT(song) as SONG, title FROM album INNER JOIN track ON album.asin=track.album GROUP BY title HAVING COUNT(song)>2;
```


----------



## Biber2 (15. Oktober 2008)

Moin swerflash,

lass dich doch nicht aufs Glatteis führen...
Es war doch nur gefragt, WELCHE Songs WIE OFT auftauchen, wenn es sie mehr als 2x gibt.
Von "auf welchem Album" war gar nicht die Rede.... also braucht Du keine Felder aus der Tabelle "album" und somit auch keinen JOIN.
Sondern nur ein simples

```
SELECT song, COUNT(album) FROM track GROUP BY song
HAVING count(album) > 2
```

That's all.
Nicht mal ein ORDER BY ist gefordert....

Grüße
Biber


----------



## softwareprofi (22. Oktober 2008)

hallo swerflash,

ich habe vor ein paar Jahren auch mit MySQL gearbeitet. Die Webseite sieht ja sehr vielversprechend aus und ist vor allem gut für Anfänger aber auch für Fortgeschrittene geeignet. Ich werde mir die Seite, wenn ich Zeit dafür finde, mal genauer anschauen und auch mal ein paar Aufgaben lösen.
Ich wollte mal fragen in welchem Betrieb sie mit MySQL arbeiten ?

Mit freundlichen Grüßen

Johannes


----------



## nuely (22. Oktober 2008)

swerflash hat gesagt.:


> Das mit % ist mir unbekannt. Ich habe gelesen, dass * für beliebig viele Zeichen steht. Wofür steht hier dann % und warum kann man * nicht verwenden in der Aufgabe 2c.



Wie bereits erwähnt, sind bei "normalen" Abfragen % und _ korrekt. Das * kann bei Oracle und MySQL für reguläre Ausdrücke verwendet werden und erfüllt dann die oben erwähnte Aufgabe.


----------

