SQL Sql Übungen

MisterWoox

Cadet 3rd Year
Registriert
Okt. 2016
Beiträge
39
Hallo liebe Community,

Sollte mich in SQL ein bisschen einfinden, was wäre der beste weg? (Buch? (Welches) Online tut?)

Danke für jede Hilfe

LG
 
Was mir vor einiger Zeit gut geholfen hat, sich in SQL ein zu arbeiten:
http://sqlzoo.net/

Angenehme Übungen, die bei den Basics anfangen.

Mfg,
Phaidan
 
Bei SQL muss man nun eher das Verständnis für relationale Datenbanken aufbauen. Übungen sind schön und gut, aber die Syntax von SQL ist jetzt nicht soooo das Problem für Leute mit Programmiererfahrung.
Hier fände ich ein Buch hilfreicher wie beim Programmieren lernen.
 
Hallo MisterWoox,

die w3schools sind ganz OK und ohne Anmeldepflicht.
http://www.w3schools.com/sql/default.asp

Tutorials mit solchen Mist sollten unbedingt ignoriert werden:
SELECT *
FROM Tabelle1, Tabelle2
WHERE Tabelle1.SpalteX = Tabelle2.SpalteY



SELECT *
Nur zum testen, niemals im Echtbetrieb, weil es unnötig Ressourcenaufwendig ist alle Spalten auszugeben.

FROM Tabelle1, Tabelle2
Tabellen immer per (INNER/LEFT/RIGHT )JOIN verknüpfen, alles andere schränkt die Möglichkeiten ein und wird unübersichtlich.

WHERE Tabelle1.SpalteX = Tabelle2.SpalteY
JOIN-Bedingungen gehören NIEMALS ins WHERE, da unübersichtlich und ins INNER JOIN zwingt.

Korrekt wäre also
Code:
SELECT
   Artikel.Nr AS ArtikelNr
  ,Artikel.Bez
  ,Auftrag.Datum
  ,Auftrag.Nr  AS AuftragsNr
FROM Tabelle1
LEFT JOIN Tabelle2
          ON Artikel.Id = Auftrag.ArtikelId
WHERE Artikel.Bez LIKE '%monitor%
AND Auftrag.Datum >= '01.10.2016'
 
Zuletzt bearbeitet:
Was heißt denn ein bisschen einfinden?:D Einfache Datenbanken konstruieren und Abfragen darauf ausführen hat man schnell raus. Würde fast sagen ein Buch ist Overkill. Gehts dir wirklich darum mit größen Mengen oder komplexen Datenbanken zu arbeiten kommen schnell verkettete Joins, Indizes, Trigger, Stored Functions usw. ins Spiel. Hier wäre ein ausführliches Buch evtl. hilfreich.
 
Ich habe SQL im MS-Office gelernt. Hier gibt es MS Access. Du kannst dir selbst Tabellen bauen und das Ergebnis von SQL-Abfragen einfach nachvollziehen. Wenn man MS-Office besitzt, ist das ein sehr einfacher Weg.

@Yxcv
Du schreibst man soll keine cross joins machen. Kannst du auch begründen weshalb?
Ich verwende das immer zum Jahresabschluss ala:
Select Table1.Year + '-' + Table2.Month from Table1,Table2

Somit erhält man nach Einfügen des neuen Jahres in Table1 immer alle 12 Perioden auf einen Streich (Table2 enthält 12 Monate).
Wie löst du so etwas?
 
Makkaroni schrieb:
@Yxcv
Du schreibst man soll keine cross joins machen.
Ich denke er schreibt nur man soll den JOIN Befehl ins FROM packen und nicht über die WHERE Bedingung steuern.

Makkaroni schrieb:
Ich verwende das immer zum Jahresabschluss ala:
Select Table1.Year + '-' + Table2.Month from Table1,Table2
Sieht irgendwie unsinnig aus. Woher weist du jetzt was in Tabelle2 zum Jahr aus Tabelle1 gehört? Oder war das nur ein Teil deines Statements? Vielleicht verstehe ich was falsch.^^
In welcher SQL Umgebung nutzt man der "+" Operator zum Zusammenfügen von Spalten. Kenne das sonst nur mittels CONCAT, "&" oder "||".:)
 
Zuletzt bearbeitet:
Er fügt keine Spalten zusammen, sondern verkettet strings (varchar oder was auch immer). Das funktioniert einwandfrei z.B. in Access und MS SQL Server.
 
Enurian schrieb:
Er fügt keine Spalten zusammen, sondern verkettet strings (varchar oder was auch immer).
Meinte ich damit ja auch.:D Glaube aber inzwischen sollte man auch unter MS SQL (<2012) auch eher concat verwenden. Es sei denn man will explizit Null als Rückgabe, sobald ein Wert Null ist. Aber Danke für die Rückmeldung.
 
G00fY schrieb:
Meinte ich damit ja auch.:D Glaube aber inzwischen sollte man auch unter MS SQL (<2012) auch eher concat verwenden. Es sei denn man will explizit Null als Rückgabe, sobald ein Wert Null ist. Aber Danke für die Rückmeldung.

Folgende Zielstellung:
Zum Jahresabschluss - der nicht kalendarisch sondern über das Programm gesteuert wird - benötige ich 12 neue Perioden: 2017-01 bis 2017-12
Ich habe 2 Tabellen: 1 für Jahre u. eine für Monate. Die für Monate hat immer 12 Werte. Die für Jahre wird am Jahresabschluss jeweils um das neue Jahr erhöht. Über einen cross join (zu deutsch Kreuzprodukt) erhalte ich dadurch, dass ich die Tabellen nicht im join aufführe 12 weitere Datensätze. Sehr elegant wie ich finde ...
 
Hmm, kann man vielleicht so machen aber weiß jetzt auch nicht was du unter Jahresabschluss verstehst. Lässt sich ohne Blick aufs Ganze schlecht sagen, obs elegant ist. Aber stimme dir natürlich zu, es gibt Fälle in denen ein Cross Join Sinn macht.

Ansonsten schrieb yxcv aber wie ich das sehe auch nicht explizit davon, cross join nicht zu nutzen, sondern davon die Bedingung eines (inner) join nicht über das where zu steuern. Damit trennt man die Werte über die verknüpft wird von den Werten die die Ergebnismenge eingrenzen. Dagegen ist grundsätzlich nichts auszusetzen.:)
 
Zuletzt bearbeitet:
Makkaroni schrieb:
Folgende Zielstellung:
Zum Jahresabschluss - der nicht kalendarisch sondern über das Programm gesteuert wird - benötige ich 12 neue Perioden: 2017-01 bis 2017-12
Ich habe 2 Tabellen: 1 für Jahre u. eine für Monate. Die für Monate hat immer 12 Werte. Die für Jahre wird am Jahresabschluss jeweils um das neue Jahr erhöht. Über einen cross join (zu deutsch Kreuzprodukt) erhalte ich dadurch, dass ich die Tabellen nicht im join aufführe 12 weitere Datensätze. Sehr elegant wie ich finde ...

In der Regel optimiert der Query Optimizer das weg. Das kann man sehr gut im Query Plan. Im professionellen Oracle Umfeld ist das Gang und Gäbe. Kenne kaum einen Oracler, der den Inner Join wirklich als Inner Join schreibt.
 
Makkaroni schrieb:
Folgende Zielstellung:
Zum Jahresabschluss - der nicht kalendarisch sondern über das Programm gesteuert wird - benötige ich 12 neue Perioden: 2017-01 bis 2017-12
Ich habe 2 Tabellen: 1 für Jahre u. eine für Monate. Die für Monate hat immer 12 Werte. Die für Jahre wird am Jahresabschluss jeweils um das neue Jahr erhöht. Über einen cross join (zu deutsch Kreuzprodukt) erhalte ich dadurch, dass ich die Tabellen nicht im join aufführe 12 weitere Datensätze. Sehr elegant wie ich finde ...
Üblicherweise wird dazu eine Zeit-Tabelle angelegt (siehe auch OLAP-Zeitdimension).
Viele DBMS generieren dies mit Bordmitteln. Falls deines nicht, gibt es haufenweise fertige Skripte zum download.

Drexel schrieb:
In der Regel optimiert der Query Optimizer das weg. Das kann man sehr gut im Query Plan. Im professionellen Oracle Umfeld ist das Gang und Gäbe. Kenne kaum einen Oracler, der den Inner Join wirklich als Inner Join schreibt.
Ersetze "professionellen Umfeld " durch "amateur Bereich" und es passt.
Optimizer sind dazu gedacht die letzten Prozente zu optimieren, nicht um generell Blödsinn auszubügeln.
Niemand mit echtem Know-how schreibt solchen unübersichtlichen Code. Völlig unabhängig von der verwendeten DB.
 
Zuletzt bearbeitet:
Zurück
Oben