Einfache mysql < DATEI Frage

Einfache mysql < DATEI Frage

am 18.12.2006 21:46:03 von Kay Schulz

Hallo zusammen,

ich habe ein Script mit einigen select Statements.
Um nicht mehrere Dateien zu haben habe ich
die Statements in eine Datei geschrieben.
Diese rufe ich mit
mysql < datei
auf.
Nun würde ich aber gerne sehen, was ausgegeben wird.
so erhalte ich nur Tabellen und weiss nicht immer
was es für welche sind.
Daher würde ich gerne jedem select eine Art echo
voranstellen.
aber wie?
Beispiel:
echo Würste im Dezember 2006
select ...
echo Würste in Januar 2007
select ...
echo Brot im Dezember 2006
select ...

Geht das irgendwie?
Danke
Kay

Re: Einfache mysql < DATEI Frage

am 18.12.2006 21:57:15 von Thomas Rachel

Kay Schulz wrote:

> aber wie?
> Beispiel:
> echo Würste im Dezember 2006
> select ...
> echo Würste in Januar 2007
> select ...
> echo Brot im Dezember 2006
> select ...

# Möglichkeit 1
select 'Würste im Dezember';
select ...;

# Möglichkeit 2
select 'Würste', 'Januar', 2007;
select ...;

etc.


Thomas
--
Vorsicht! Das Vorhandensein dieser Signatur berechtigt nicht zu
unüberlegten Handlungen!

Re: Einfache mysql < DATEI Frage

am 18.12.2006 22:03:14 von Christoph Schmidt

Kay Schulz schrieb:
> Hallo zusammen,
>
> ich habe ein Script mit einigen select Statements.
> Um nicht mehrere Dateien zu haben habe ich
> die Statements in eine Datei geschrieben.
> Diese rufe ich mit
> mysql < datei
> auf.
> Nun würde ich aber gerne sehen, was ausgegeben wird.
> so erhalte ich nur Tabellen und weiss nicht immer
> was es für welche sind.
> Daher würde ich gerne jedem select eine Art echo
> voranstellen.
> aber wie?
> Beispiel:
> echo Würste im Dezember 2006
> select ...
> echo Würste in Januar 2007
> select ...
> echo Brot im Dezember 2006
> select ...
>
> Geht das irgendwie?
> Danke
> Kay

Lebberworscht oder Blutworscht?

SCNR

Christoph

Re: Einfache mysql < DATEI Frage

am 18.12.2006 22:13:42 von Axel Schwenke

Kay Schulz wrote:

> ... würde ich gerne jedem select eine Art echo voranstellen.
> aber wie?
> Beispiel:
> echo Würste im Dezember 2006
> select ...

Wie wäre es mit

SELECT "Würste im Dezember 2006" AS naechste_tabelle
?


XL

Re: Einfache mysql < DATEI Frage

am 19.12.2006 02:43:43 von Thomas Rachel

Thomas Rachel wrote:

>> echo Brot im Dezember 2006
>> select ...
>
> # Möglichkeit 1
> select 'Würste im Dezember';
> select ...;
>
> # Möglichkeit 2
> select 'Würste', 'Januar', 2007;
> select ...;

Vielleicht auch (je nach Inhalt der Tabelle, vor allem, wenns eh nur zur
Anzeige dient):

select ... AS "Brot im Bezember 2006", ...;

dann wirds direkt zur Spaltenüberschrift in der auszugebenden Tabelle.


Thomas
--
Jabber-ID: glglgl@amessage.info (keine Email-Adresse!)
Warum Jabber, was ist das und wie geht das?
http://de.wikibooks.org/wiki/Jabber-Kompendium:_Schnelleinst ieg

Re: Einfache mysql < DATEI Frage

am 19.12.2006 08:03:27 von Kay Schulz

> # Möglichkeit 1
> select 'Würste im Dezember';
> select ...;
>
> # Möglichkeit 2
> select 'Würste', 'Januar', 2007;
> select ...;
Hallo Thomas,

hilft, aber er zeigt die Kommentarzeilen
immer doppelt dar.
Kann man dem mysql Skript auch Parameter
übergeben?
Beispiel:
mysql < script 12
select * from Tabelle where month=$1:
???

Danke
Kay

Re: Einfache mysql < DATEI Frage

am 19.12.2006 12:18:51 von Claus Reibenstein

Kay Schulz schrieb:

> Kann man dem mysql Skript auch Parameter
> übergeben?
> Beispiel:
> mysql < script 12

Du suchst sed und Pipelines:

sed -e 's/$1/12/g' script | mysql

Das ist aber keine MySQL-Frage, sondern eine Frage des korrekten Umgangs
mit der Unix-Kommandozeile. Dass die heutige Mäuseschubsergeneration
damit so ihre Schwierigkeiten hat, ist nicht weiter verwunderlich ...

Gruß. Claus
--
,~°O O
O ,´ / |/|\
/ |¯`. Das neue Hochzeits-Branchenbuch im Internet ,´ / | |\
/__| `~...............................................~´ /___|/ /

Re: Einfache mysql < DATEI Frage

am 19.12.2006 13:21:11 von Thomas Rachel

Kay Schulz wrote:

>> # Möglichkeit 1
>> select 'Würste im Dezember';
>> select ...;
>>
>> # Möglichkeit 2
>> select 'Würste', 'Januar', 2007;
>> select ...;
> Hallo Thomas,
>
> hilft, aber er zeigt die Kommentarzeilen
> immer doppelt dar.

Klar, weil es einfach nur Tabellen (Result-Sets) mit einer Zeile sind.

Die Spaltennamen lauten also ebenso wie der Inhalt.

select 'Inhalt' as titel;


> Kann man dem mysql Skript auch Parameter
> übergeben?

Nein.

Abhilfe könnte m4 sein:

script.m4 sieht so aus:
select * from Tabelle where month=MONAT

Aufruf erfolgt mit
m4 -D=11 script.m4 | mysql

oder, falls kein m4 vorhanden ist:

sed -e "s/MONAT/11/" script.m4 | mysql

> ???

"???" bedeutet was?


Thomas
--
Jabber-ID: glglgl@amessage.info (keine Email-Adresse!)
Warum Jabber, was ist das und wie geht das?
http://de.wikibooks.org/wiki/Jabber-Kompendium:_Schnelleinst ieg

Re: Einfache mysql < DATEI Frage

am 19.12.2006 13:45:29 von Thomas Rachel

Kay Schulz wrote:

>> # Möglichkeit 1
>> select 'Würste im Dezember';
>> select ...;
>>
>> # Möglichkeit 2
>> select 'Würste', 'Januar', 2007;
>> select ...;
> Hallo Thomas,
>
> hilft, aber er zeigt die Kommentarzeilen
> immer doppelt dar.

Klar, weil es einfach nur Tabellen (Result-Sets) mit einer Zeile sind.

Die Spaltennamen lauten also ebenso wie der Inhalt.

select 'Inhalt' as titel;


> Kann man dem mysql Skript auch Parameter
> übergeben?

Nein.

Abhilfe könnte m4 sein:

script.m4 sieht so aus:
select * from Tabelle where month=MONAT

Aufruf erfolgt mit
m4 -D=11 script.m4 | mysql

oder, falls kein m4 vorhanden ist:

sed -e "s/MONAT/11/" script.m4 | mysql

> ???

"???" bedeutet was?


Thomas
--
Jabber-ID: glglgl@amessage.info (keine Email-Adresse!)
Warum Jabber, was ist das und wie geht das?
http://de.wikibooks.org/wiki/Jabber-Kompendium:_Schnelleinst ieg

Re: Einfache mysql < DATEI Frage

am 20.12.2006 09:28:11 von Kay Schulz

>
> Du suchst sed und Pipelines:
>
> sed -e 's/$1/12/g' script | mysql
>
Hi
danke. Genau so was wollte ich vermeiden.
Naja, danke,muss ich also doch was selber programmieren.
Kay

Re: Einfache mysql < DATEI Frage

am 20.12.2006 11:09:33 von Claus Reibenstein

Kay Schulz schrieb:

>> sed -e 's/$1/12/g' script | mysql
>
> danke. Genau so was wollte ich vermeiden.

Dann hast Du eine der Grundphilosophien des Unix-Systems nicht
verstanden. Dort wird vieles mittels fertiger Bausteine in dieser Form
erledigt.

> Naja, danke,muss ich also doch was selber programmieren.

Also wenn Dir dieser Einzeiler schon zu viel ist ...

Gruß. Claus
--
,~°O O
O ,´ / |/|\
/ |¯`. Das neue Hochzeits-Branchenbuch im Internet ,´ / | |\
/__| `~...............................................~´ /___|/ /

Re: Einfache mysql < DATEI Frage

am 20.12.2006 15:09:32 von Kay Schulz

> Dann hast Du eine der Grundphilosophien des Unix-Systems nicht
> verstanden. Dort wird vieles mittels fertiger Bausteine in dieser Form
> erledigt.

Sorry,
ich war mal UNIX Sysadmin. Lange her aber einiges ist hängen geblieben.
Ich wollte nur wissen, weil ich mysql nicht kenne und mit Dbs eh
wenig am Hut habe, ob es bestimmte Möglichkeiten gibt.
Nicht mehr und nicht weniger.


>
>> Naja, danke,muss ich also doch was selber programmieren.
>
> Also wenn Dir dieser Einzeiler schon zu viel ist ...

Nein, aber es bleibt nicht bei einem Einzeiler (es waren
ja nur Beispiele um die Grundlagen von mysql besser
zu verstehen)
und ich finde diese Lösung auch nicht sonderlich prickelnd.
Da schreibe ich lieber ein kleines Java GUI, dass aus ein
paar Mausklicks die entsprechenden Selects macht.
Da ich ein paar Klassen aus früheren Zeiten habe dürfte
das nicht so aufwändig werden. Ich muss halt vieles nachlesen.
Aber gebacken bekomme ich das schon.
Danke für Eure Hilfe.
Kay

Re: Einfache mysql < DATEI Frage

am 20.12.2006 16:49:54 von Axel Schwenke

Kay Schulz wrote:

> Kann man dem mysql Skript auch Parameter übergeben?

Da gibts einige Varianten:

Direkte Übergabe geht nicht, aber indirekt über Nutzervariablen schon.
Gesetzt den Fall, du hast die Variablen $foo und $bar und willst die an
das SQL-Skript baz.sql übergeben:

$ echo "SET @foo='$foo';\nSET@bar='$bar';\n" >params.sql
$ cat params.sql baz.sql | mysql ...

Die Variablen kannst du dann in baz.sql als @foo und @bar referen-
zieren. Diese Art Variablen wird im MySQL-Server als Teil der
MySQL-Verbindung gehalten.


Mit MySQL kommt das "mysqltest" Programm, das ursprünglich für die
Abarbeitung von Testskripten (Regression-Testsuite) gedacht ist.
Man kann das aber auch nehmen, um einfach ein File mit SQL-Statements
auszuführen. Das hat echo, lokale Variablen und kann auch include.

http://dev.mysql.com/doc/mysqltest/en/index.html


Schließlich könntest du dein SQL-Skript in Form einer stored procedure
im MySQL-Server ablegen. Damit würde der mysql-Aufruf so aussehen:

$ mysql -e "call my_fancy_precedure($foo, $bar)"



XL

Re: Einfache mysql < DATEI Frage

am 20.12.2006 17:48:23 von Thomas Rachel

Axel Schwenke wrote:

> Direkte Übergabe geht nicht, aber indirekt über Nutzervariablen schon.
> Gesetzt den Fall, du hast die Variablen $foo und $bar und willst die an
> das SQL-Skript baz.sql übergeben:
>
> $ echo "SET @foo='$foo';\nSET@bar='$bar';\n" >params.sql
> $ cat params.sql baz.sql | mysql ...

Stimmt, an die Variante hab ich gar nicht gedacht.

Dann ist aber noch einfacher:

$ { echo "SET @foo='$foo'; SET @bar='$bar'; " ; cat bat.sql; } | mysql ...

> Die Variablen kannst du dann in baz.sql als @foo und @bar referen-
> zieren. Diese Art Variablen wird im MySQL-Server als Teil der
> MySQL-Verbindung gehalten.

Dito.


Thomas
--
Jabber-ID: glglgl@amessage.info (keine Email-Adresse!)
Warum Jabber, was ist das und wie geht das?
http://de.wikibooks.org/wiki/Jabber-Kompendium:_Schnelleinst ieg

Re: Einfache mysql < DATEI Frage

am 20.12.2006 17:52:30 von Thomas Rachel

Kay Schulz wrote:

> Da schreibe ich lieber ein kleines Java GUI, dass aus ein
> paar Mausklicks die entsprechenden Selects macht.

Wenn Du eh schreiben willst, wäre vielleicht eine Mittelösung, zwar auf GUI
zu verzichten, jedoch eine (Skript-) Sprache zu verwenden, bei der man
etwas mehr Möglichkeiten hat als in der Shell.

In Python könntest Du das Ganze beispielsweise in geeignete dict()s kapseln,
die Du vorher auswertest und deren Werte Du in die Verbindung eingehen
läßt, bevor Du die eigentlichen Queries ausfürst.

Oder Du erstellst eine Konfigurationsdatei mit Deinen Werten, liest die ein
(auch wieder mit Python, oder mit Perl, oder ...) und verfährst analog.

Oder was auch immer; Grenzen sind fast keine gesetzt.


Thomas
--
Das Fleisch war willig, aber das Gras war naß.

Re: Einfache mysql < DATEI Frage

am 02.01.2007 10:07:52 von Kay Schulz

> Also wenn Dir dieser Einzeiler schon zu viel ist ...
Hi Claus,

es sind zwar keine Einzeiler aber mit sed
und mysql und so weiter habe ich einiges
hinbekommen was ich wollte. Und entsprechende
Views haben mir auch geholfen.
Vielen Dank.
Frage:
Kann ich in sql Werte aus 2 select Anfragen subtrahieren?
Kay

Re: Einfache mysql < DATEI Frage

am 02.01.2007 11:17:36 von Markus Mann

Kay Schulz wrote:
>
> Kann ich in sql Werte aus 2 select Anfragen subtrahieren?

Wenn du

select felda - feldb
from tabelle
where

meinst, dann geht das problemlos (solange die beiden Felder einen
numerischen Typ haben).

Ciao.
--
Markus Mann
];-)

Re: Einfache mysql < DATEI Frage

am 02.01.2007 13:31:36 von Kay Schulz

> select felda - feldb
> from tabelle
> where
>
> meinst, dann geht das problemlos (solange die beiden Felder einen
> numerischen Typ haben).

Hi
danke für die Antwort.
Ich habe folgendes:
a=select sum(wert) from tabelle where feld='in';
b=select sum(wert) from tabelle where feld='out';
ich will a-b

Kay

Re: Einfache mysql < DATEI Frage

am 02.01.2007 20:28:47 von Dominik Echterbruch

Kay Schulz wrote:
> danke für die Antwort.
> Ich habe folgendes:
> a=select sum(wert) from tabelle where feld='in';
> b=select sum(wert) from tabelle where feld='out';
> ich will a-b

SELECT SUM(CASE feld = 'in' THEN wert ELSE 0-wert END) FROM tabelle;

So oder so ähnlich sollte es gehen. 0-wert habe ich nur deswegen
geschrieben, weil ich mich nicht sicher war, ob MySQL mit einem
einfachen -wert klar kommt.

Grüße,
Dominik
--
Norbert Melzer in d.c.d.mysql:
F: Wie verstehe ich diese FAQ am besten?
A: Studieren Sie Datanbank-Design und lesen Sie anschliessend alles nochmal

Re: Einfache mysql < DATEI Frage

am 05.01.2007 21:08:10 von Kay Schulz

Dominik Echterbruch schrieb:
> Kay Schulz wrote:
>> danke für die Antwort.
>> Ich habe folgendes:
>> a=select sum(wert) from tabelle where feld='in';
>> b=select sum(wert) from tabelle where feld='out';
>> ich will a-b
>
> SELECT SUM(CASE feld = 'in' THEN wert ELSE 0-wert END) FROM tabelle;
>
> So oder so ähnlich sollte es gehen. 0-wert habe ich nur deswegen
> geschrieben, weil ich mich nicht sicher war, ob MySQL mit einem
> einfachen -wert klar kommt.
>
> Grüße,
> Dominik
suppi danke.
so geht es bei mir
select sum(case when reinraus='in' then wert else -wert end) from tabelle;

Kay