Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Fragen zu SQL

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von Revan, 18 Mai 2015.

  1. Revan

    Revan Neuer Benutzer

    Ich habe vor kurzem ein Studium angefangen und habe mir Übungsblätter aus höheren Semester schon besorgt, dazu gehört auch Datenbanksystem (SQL-Übung). Und bei mir sind halt ein paar Fragen aufgetreten und hoffe das sie mir jemand von euch vlt. beantworten könnte.


    Aufgaben siehe Anhang/Bild
    Code:
    1a) SELECT  VName, NName
          FROM     Personal
          WHERE  ProjNr=2
    1b) SELECT  VName
           FROM     Persoanl, Abteilung
            WHERE AbtNr=2
    Wird Aufgabe 1 etwa so bearbeitet oder bin ich auf den falschen Dampfer? Und wie wird Aufgabe 2 und 3 gemacht? Könnte mir das jemand vlt. an diesen Aufgaben oder vlt. anderen anderen Beispielen erklären bitte? Vielen Dank im Vorraus!!! Datenbank Übung SQL.jpg Datenbank Übung SQL.jpg
     
    Zuletzt von einem Moderator bearbeitet: 18 Mai 2015
  2. akretschmer

    akretschmer Datenbank-Guru

    Bei 1b hast Du etwas, was Du sehr sicher schon mal nicht willst: einen Cross Join.

    Tipp: gewöhne Dir expliziete JOIN-Syntax an. Google sagt Dir alles wissenswerte dazu. Zu den anderen Aufgaben zeigst Du uns erst einmal Deine Ansätze.

    Und noch ein Tipp: nehme PostgreSQL. Das hat eine saubere Syntax und auch verständlichere Fehlermeldungen als MySQL. Zum lernen und zum produktivem Arbeiten um einiges besser. MySQL verstößt an einigen Stellen gegen die SQL-Norm, realisiert vieles nicht, macht vieles sogar schlicht falsch.
     
  3. ukulele

    ukulele Datenbank-Guru

    Ganz abgesehen von einem Tippfehler in 1b.
     
  4. akretschmer

    akretschmer Datenbank-Guru

    Im übrigen läßt das Model auch nur zu, daß pro Abteilung nur ein Mitarbeiter ist und pro Projekt nur eine Abteilung arbeitet. 2b wäre also 1, mehr gibt das Modell nicht her ;-)
     
  5. Revan

    Revan Neuer Benutzer

    Sorry für die späte Rückmeldung mein Internet ist gestern flöten gegangen. Vielen Dank für die schnelle Antwort akretschmer und habe jetzt noch schnell Join hinzugefügt, hoffe richtig. Leider habe ich 3 nicht hinbekommen, mein Kopf wollte nicht mehr und war verwirrt. Hoffe zu mindestens, dass ich die anderen Aufgaben soweit richtig gemacht habe und mich nicht blamiere (auch wenn es meine erste Erfahrung mit SQL ist xD).
    Code:
    1a) 
    SELECT  VName, NName
    FROM Personal
    WHERE ProjNr=2
    
    b)
    SELECT VName
    FROM Personal
    JOIN Abteilung
    WHERE AbtNr=1
    
    c)
    SELECT VName
    FROM Personal
    JOIN Akte
    WHERE Position='Chef von Obelix'
    
    d)
    SELECT COUNT(Position)
    FROM Personal
    JOIN Akte
    WHERE 'Untergebener von Donald'
    
    e)
    SELECT VName
    FROM Personal
    JOIN Akte
    WHERE Position LIKE '%Berater'
    
    2a)
    SELECT SUM(Gehalt)
    FROM Personal
    
    2b)
    SELECT Projnr,COUNT(*) As 'Anzahl'
    FROM Personal
    GROUP BY Projnr
    
    2c)
    SELECT Telefonnr, COUNT(Telefonnr) As 'Anzahl'
    FROM Personal
    GROUP BY Telefonnr
    Having (Count(Telefonnr)>1)
     
    Zuletzt von einem Moderator bearbeitet: 19 Mai 2015
  6. akretschmer

    akretschmer Datenbank-Guru

    Hast Du das mal getestet?
     
  7. Distrilec

    Distrilec Datenbank-Guru

    - Deine gesamten Joins sind falsch. Auch wenn der Ansatz garnicht verkehrt ist.
    Warum sind Sie falsch? Ganz einfach:
    Jede Join-Clause benötigt eine Bedingung anhand welcher gejoined werden soll (Jede Regel braucht eine Ausnahme: Der Cross Join bildet ein karthesisches Produkt beider gejointen Tabellen und benötigt daher keine On-Clause). Du musst der Datenbank ja irgendwie mitteilen welcher Datensatz von Tabelle A zu welchem Datensatz in Tabelle B gehört.
    Das ganze nennt Sich On-Clause. Hier mal ein kleines Beispiel:
    Code:
    Aufgabe 1b)
    Select Personal.VName
    From   Personal
    
    Inner   Join Abteilung
    On Abteilung.PersNr = Personal.PersNr
    
    Where Abteilung.AbtNr = 1
    Hier teilst du der Datenbank mit das die PersonalNr (Der Primärschlüssel deiner Tabelle "Personal") immer gleich der PersonalNr der Tabelle "Abteilung" ist. Was ein "Inner Join" ist überlasse ich mal deinen Google-Fähigkeiten :)
     
    ukulele gefällt das.
  8. akretschmer

    akretschmer Datenbank-Guru

    Okay, als Hilfe: dazu brauchst Du eine weitere Tabelle, In dieser zählst Du Mitarbeiter und projekt auf.

    Um das mal minimalst zu zeigen:

    Code:
    test=*# create table mitarbeiter(id int primary key);
    CREATE TABLE
    Time: 201,862 ms
    test=*# create table projekt (id int primary key);
    CREATE TABLE
    Time: 2,509 ms
    test=*# create table mitarbeiter_projekt(id_mitarbeiter int references mitarbeiter, id_projekt int references projekt, primary key(id_mitarbeiter, id_projekt));
    CREATE TABLE
    Time: 50,974 ms
    
    Durch die FK-Constraints kannst Du hier nur Mitarbeiter bzw. Projekte hinterlegen, die auch existieren. Durch den PK sicherst Du, daß es keine doppelten Kombinationen von Mitarbeiter und Projekt gibt. (außerdem sollte jede Tabelle einen PK haben)
     

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden