>

no big words

NTXT graphics design site

To enjoy the site visual flavours, you have to enable Flash plugin and JavaScript in your browser.

NTXT logo

MySQL - zapytania nie całkiem mądre

Można używać bazy MySQL jak piszą w książkach. Krótkie, proste zapytania z reguły (ale tylko z reguły) wykonują się szybciej niż złączenia, nawet biorąc pod uwagę obróbkę danych w stosownym języku programowania. Czasem jednak chciałoby się zadać jedno polecenie, a wynik zwyczajnie skopiować do arkusza. Bez optymalizacji, sprowadzania do postaci normalnej, itp. Poniżej kilka przykładów.

+ Jeśli nie znajdujesz tu nic ciekawego, zaproponuj coś.



Sumy warunkowe

Zazwyczaj chcąc zliczyć rekordy spełniające pewne kryteria wrzucamy coś w rodzaju:
select count(*) from LOKAL where CENA<100000;
select count(distinct ID) from LOKAL where CENA<100000;
select count(distinct METRAZ) from LOKAL where CENA<100000;
W drugiej wersji odpowiedź będzie identyczna jak w pierwszej, ale już w trzeciej otrzymamy liczbę różnych metraży dostępnych w cenie poniżej 100 tys. To podstawowe rodzaje zapytań zliczających. Kiedy przydałoby się wiedzieć jednocześnie ile jest mieszkań poniżej tej ceny, ile powyżej i jaka jest średnia cena w obu przypadkach, musimy sięgnąć po coś bardziej wyrafinowanego:
select
count(distinct if(CENA<100000, ID, null))
as liczba_mieszkan_tanszych,
avg(if(CENA<100000, CENA, null))
as srednia_cena_mkw_tanszych,
count(distinct if(CENA>100000, ID, null))
as liczba_mieszkan_drozszych,
avg(if(CENA>100000, CENA, null))
as srednia_cena_mkw_drozszych
from LOKAL;


Załóżmy, że mamy tabelkę faktur z kilku lat, z kwotami i datami sprzedaży. Jak jednym zapytaniem porównać miesięczny obrót z dwóch lat? A tak oto:
tabelka FAKTURA: ID KWOTA DATA SPRZEDAWCA_ID KUPUJACY_ID 1 2200 2007-01-05 1 2 2 4300 2007-02-06 1 7 ... select
month(DATA) as miesiac, sum(if(DATA>'2006' and DATA<'2007', KWOTA, 0)) as obrot_2006 sum(if(DATA>'2007' and DATA<'2008', KWOTA, 0)) as obrot_2007 from FAKTURA group by miesiac;

zliczanie rekordów z tabeli A w powiązaniu z rekordami o zadanych cechach z tabeli B

Załóżmy że tabela A to INWESTYCJA [ID, NAZWA, MIEJSCOWOSC], a B to MIESZKANIE [ID, INWESTYCJA_ID, METRAZ, CENA]. Chcemy policzyć, ile różnych inwestycji ma mieszkania o następujących cechach:

  1. metraż do 50 mkw.
  2. cena do 200000 zł
  3. cena do 200000 zł i metraż powyżej 30 mkw.

No i chcemy to od razu w jednym pytaniu oczywiście:
select
count(distinct if(m.METRAZ < 50, i.ID, null)),
count(distinct if(m.CENA < 200000, i.ID, null)),
count(distinct if((m.METRAZ > 30) and (m.CENA < 200000), i.ID, null))
from INWESTYCJA i, MIESZKANIE m
where i.ID = m.INWESTYCJA_ID
group by i.ID;

Zapytania zwraca liczbę różnych inwestycji, w jakich znajdują się zadane rodzaje mieszkań.

+ skomentuj