Maximilian Eisenstädter: 13 Stück MySQL Fragen mit wenig Perl dabei

Guten Tag!

Hier sind 13 Fragen zu MySQL mit etwas Perl angehaucht:
Danke für etwaige Hilfestellung!

1)  Groß und Kleinschreibung:
   select * from table1 where name LIKE 'AL%'
   gibt sowohl  "alex" als auch "ALEX" und "aLeX"  aus.
   MySQL scheint also nicht Case Sensitive zu sein,
   oder ist das ein Fehler in meiner Installation?
     - Was macht man um es Case Sensitive zu bekommen?

2)  Selektiere "name" und "email" aus "table1" wo
   entweder "name" mit "a" beginnt,  ODER name mit "z" beginnt.
   Eines der beiden muss erfüllt sein,  entweder a%  ODER b%

3)  Nun müssen BEIDE Bedingungen erfüllt werden:
   Selektiere "name" und "email" aus "table1"
   wo "name"  mit "a"  beginnt,  und  das Feld
   "email"  *irgendwo* drinnen die Buchstaben "le" hat.

4)    Kann man count() anwenden,   wenn man ein LIMIT setzt?
     Ich selektiere mit LIMIT 3,5
              (die ersten 3 überspringen,  dann 5 selektieren)
     Es ist wichtig für mich herauszufinden,   wieviele
     Einträge dann tatsächlich selektierbar sind,
     also ob nach den 3 einträgen die er überspringt tatsächlich
    5 Einträge da sind,  oder nur 1, gar keiner, oder doch 4 oder 5...
    Daher muss ich trotz der LIMIT Angabe von 5 Einträgen
    zählen wieviele er Tatsächlich bekommt.

Mir wurde irgendwann mal gesagt, dass COUNT() in
    Verbindung mit LIMIT nicht geht bzw. nicht korrekt ist.
    Infos dazu?

5)   Kann man ein Ergebnis weiter verwenden?
    Zuerst aus table1 das Feld "email" von allen Einträge selektieren,
    deren "name" mit "a" beginnt,
    und dann im "table2"  schauen wo die gleichen emails im Feld "kontakt" steht,
    und davon die "d_id"  ausgeben.
    geht das ohne das Zwischenspeichern zu müssen in einer Programmiersprache?

  1. Wie geht das mit ASC und DESC ?  Ich finde kein Beispiel wo man das verwendet.

  2. Perl:  Heisst es
             $dbh->prepare("query where foo;");
                     oder
             $dbh->prepare("query where foo");

Also mit oder ohne Komma am Ende - innerhalb der Klammern?

  1. Wie geht es  2 Felder gleichzeitig zu selectieren,
      und dann einen speziellen Feldnamen zu verweben den man mit  "AS"  bestimmt?
      Also selectieren irgendwas  AS  <wunschname_des_feldes>

  2. Was kann man   $sth->rows()  sagen statt  COUNT() ?  (Beides zählt)
       Welches ist besser, weches kann was?  Infos?

  3. Wenn man die Ergebnisse zählen will,
        geht  COUNT(*)  genauso wie COUNT(id)
        Wann sollte ich welchem den Vorzug geben?

  4. Das sollte herauskommen:
        select id, name, text from guestbook limit 2,3;
        Ich wollte es mit Platzhaltern lösen.

my $foo=2;
    my $bar=3;
    my $sth = $dbh->prepare("select id, name, text from guestbook limit ?,?");
    $sth->execute($foo, $bar);

Die im execute angegebenen Variablen sollten die ?,? ersetzen.
    Es kommt zwar keine Fehlermeldung,
    aber auch _keine_ Ergebnisse!!

  1. Wie geht das selectieren von Inhalten einem Table und das automatische
        eintragen der Felder in eine andere Tabelle?

  2. Kopieren eines Tables:  table1  mit allem drum und dran (auch dem erstell-zeugs)
        kopieren nach table2.
        Also so wie wenn ich bei einem Directory  cp -R test1 test2  mache.
        Ohne dass der Table vorher existiert.

Vielmals Danke,
     Maximilian Eisenstädter

  1. Hallo Maximilian,

    1)  Groß und Kleinschreibung:
       select * from table1 where name LIKE 'AL%'
       gibt sowohl  "alex" als auch "ALEX" und "aLeX"  aus.
       MySQL scheint also nicht Case Sensitive zu sein,
       oder ist das ein Fehler in meiner Installation?
         - Was macht man um es Case Sensitive zu bekommen?

    Was ist an http://dev.mysql.com/doc/mysql/de/string-comparison-functions.html unklar?

    2)  Selektiere "name" und "email" aus "table1" wo
       entweder "name" mit "a" beginnt,  ODER name mit "z" beginnt.
       Eines der beiden muss erfüllt sein,  entweder a%  ODER b%

    Was ist an http://dev.mysql.com/doc/mysql/de/logical-operators.html unklar?

    3)  Nun müssen BEIDE Bedingungen erfüllt werden:
       Selektiere "name" und "email" aus "table1"
       wo "name"  mit "a"  beginnt,  und  das Feld
       "email"  *irgendwo* drinnen die Buchstaben "le" hat.

    Was ist an http://dev.mysql.com/doc/mysql/de/logical-operators.html unklar?

    [...]

    Das MySQL-Handbuch ist insgesamt sehr auskunftsfreudig, was Deine Fragen angeht.  Du solltest es lesen.

    Freundliche Grüsse,

    Vinzenz

  2. Hallo,

    Hier sind 13 Fragen zu MySQL mit etwas Perl angehaucht:
    Danke für etwaige Hilfestellung!

    siehe Vinzenz.

    Ich gehe mal auf ein paar Fragen ein, zu denen ich was sagen kann und zu denen man im Handbuch wenig Informationen findet.

    3)  und  das Feld
       "email"  *irgendwo* drinnen die Buchstaben "le" hat.

    WHERE INSTR(email,'le') = 0
    sollte schneller sein als
    WHERE email LIKE '%le%'
    http://dev.mysql.com/doc/mysql/de/string-functions.html

    4)   Mir wurde irgendwann mal gesagt, dass COUNT() in
        Verbindung mit LIMIT nicht geht bzw. nicht korrekt ist.
        Infos dazu?

    LIMIT limitiert das Resultset, nachdem es erstellt wurde. COUNT zählt also die Datensätze _bevor_ LIMIT limitiert.

    5)   Kann man ein Ergebnis weiter verwenden?
        Zuerst aus table1 das Feld "email" von allen Einträge selektieren,
        deren "name" mit "a" beginnt,
        und dann im "table2"  schauen wo die gleichen emails im Feld "kontakt" steht,
        und davon die "d_id"  ausgeben.
        geht das ohne das Zwischenspeichern zu müssen in einer Programmiersprache?

    Das könnte ein JOIN sein. Um das zu erkennen müsste man aber die Tabellenstruktur näher kennen.
    Wenn, dann müssen tabelle1 und tabelle2 relational verbunden werden können, z.B. über eine email_id, die in beiden Tabellen steht.
    http://dev.mysql.com/doc/mysql/en/join.html

    1. Wie geht das mit ASC und DESC ?  Ich finde kein Beispiel wo man das verwendet.

    Was ist da unklar?
    ORDER BY feldname ASC - sortiert aufsteigend
    ORDER BY feldname DESC - sortiert abfallend

    1. Wie geht es  2 Felder gleichzeitig zu selectieren,
        und dann einen speziellen Feldnamen zu verweben den man mit  "AS"  bestimmt?
        Also selectieren irgendwas  AS  <wunschname_des_feldes>

    http://dev.mysql.com/doc/mysql/en/problems-with-alias.html

    1. Wenn man die Ergebnisse zählen will,
          geht  COUNT(*)  genauso wie COUNT(id)
          Wann sollte ich welchem den Vorzug geben?

    COUNT(*) zählt über _alle_ Felder in den Datensätze. COUNT(feldname) zählt nur über dieses Feld. Unterschiede gibt es, wenn NULL-Werte in den Felder stehen.

    Bsp:
    tabelle1
    nr      name
    1       a
    2       NULL
    3       c

    SELECT count(*) from tabelle1
    +----------+
    | COUNT(*) |
    +----------+
    |        3 |
    +----------+

    SELECT count(name) from tabelle1
    +-------------+
    | COUNT(name) |
    +-------------+
    |           2 |
    +-------------+

    viele Grüße

    Axel

    1. Hallo,

      3)  und  das Feld
         "email"  *irgendwo* drinnen die Buchstaben "le" hat.
      WHERE INSTR(email,'le') = 0

      müsste für die Aufgabenstellung natürlich
      WHERE INSTR(email,'le') <> 0
      sein.

      viele Grüße

      Axel

  3. Hallo Maximilian,

    Hier sind 13 Fragen zu MySQL mit etwas Perl angehaucht:

    nicht zufällig eine Hausaufgabe, o.ä.?

    1. Wie geht das mit ASC und DESC ?  Ich finde kein Beispiel wo man das verwendet.

    http://dev.mysql.com/doc/mysql/de/select.html (einfach nach ASC suchen).

    1. [...]
          my $foo=2;
          my $bar=3;
          my $sth = $dbh->prepare("select id, name, text from guestbook limit ?,?");

    Zeichenketten werden in Perl doch mit einem Punkt verkette, also:
      my $sth = $dbh->prepare("[...] limit ".$foo.",".$bar);
    warum willst du die erst in der nächsten Zeile einbauen?

    1. Wie geht das selectieren von Inhalten einem Table und das automatische
          eintragen der Felder in eine andere Tabelle?

    vielleicht »INSERT INTO <tabelle> SELECT ...«? (siehe http://dev.mysql.com/doc/mysql/de/handler.html)

    1. Kopieren eines Tables:  table1  mit allem drum und dran (auch dem erstell-zeugs)
          kopieren nach table2.

    mit SHOW CREATE TABLE bekommst du den »CREATE TABLE«-Syntax um die Tabelle zu erstellen und den Inhalt kannst du wieder mit INSERT SELECT einfügen (so macht es zumindest phpMyAdmin :-)).

    Grüße aus Nürnberg
    Tobias

  4. Hier noch ein paar Antworten

    1)  Groß und Kleinschreibung:
         - Was macht man um es Case Sensitive zu bekommen?

    Stichwort BINARY

    5)   Kann man ein Ergebnis weiter verwenden?
        Zuerst aus table1 das Feld "email" von allen Einträge selektieren,
        deren "name" mit "a" beginnt,
        und dann im "table2"  schauen wo die gleichen emails im Feld "kontakt" steht,
        und davon die "d_id"  ausgeben.
        geht das ohne das Zwischenspeichern zu müssen in einer Programmiersprache?

    geht mit table joins
    SELECT table2.d_id FROM table1, table2 WHERE table1.name LIKE 'a%' AND table1.email=table2.kontakt

    1. Perl:  Heisst es [...]
        Also mit oder ohne Komma ( => Semikolon!) am Ende - innerhalb der Klammern?

    Da das m.E. eine Sache der MySQL-API ist, und es bei PHP egal ist, sollte bei Perl auch egal sein. Probier es aus!

    1. Wie geht es  2 Felder gleichzeitig zu selectieren,
        und dann einen speziellen Feldnamen zu verweben den man mit  "AS"  bestimmt?
        Also selectieren irgendwas  AS  <wunschname_des_feldes>

    Meinst du CONCAT bzw. CONCAT_WS ?  SELECT CONCAT(feld1, feld2) AS feldname FROM ...

    1. Was kann man   $sth->rows()  sagen statt  COUNT() ?  (Beides zählt)
         Welches ist besser, weches kann was?  Infos?

    SELECT COUNT() nimmst du, wenn du nur die Anzahl wissen willst. SELECT bla FROM ... und dann die Zeilen zählen nimmst du, wenn du sowohl die Anzahl der Datensätze als auch diese selbst brauchst. Soweit zur Theorie. Wie ich eben las (kenne mich mit Perl nicht so aus), liefert row() insbesondere bei SELECTs nicht immer (datenbankabhängig) die richtigen Ergebnisse.

    1. Das sollte herauskommen:
          select id, name, text from guestbook limit 2,3;
          Ich wollte es mit Platzhaltern lösen.

    my $foo=2;
        my $bar=3;
        my $sth = $dbh->prepare("select id, name, text from guestbook limit ?,?");
        $sth->execute($foo, $bar);
        Die im execute angegebenen Variablen sollten die ?,? ersetzen.
        Es kommt zwar keine Fehlermeldung,
        aber auch _keine_ Ergebnisse!!

    Ich vermute, dass das prepare/execute die variablen Parameter '?' quotiert, so dass am Ende die Abfrage so aussieht: select id, name, text from guestbook limit '2','3'
    und wenn ich das dem MySQL verfüttere, dann erzählt es mir:
    #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''2','3'' at line 1

    1. Wie geht das selectieren von Inhalten einem Table und das automatische
          eintragen der Felder in eine andere Tabelle?

    mit INSERT ... SELECT ...

    1. Kopieren eines Tables:  table1  mit allem drum und dran (auch dem erstell-zeugs)
          kopieren nach table2.
          Also so wie wenn ich bei einem Directory  cp -R test1 test2  mache.
          Ohne dass der Table vorher existiert.

    CREATE TABLE table2 SELECT * FROM table1;

    MySQL kopiert allerdings die Indexe nicht mit.