Dec. 5, 2008

Czyli SQL jakiego być może nie  znacie.

Ale zacznę dowcipem od kolegi z pracy, który naprawdę bardzo mnie rozbawił (pewnie dlatego byłem wtedy w trakcie czytania książki o teorii relacyjnego modelu danych :) )

Przychodzi SQL do baru, tam dwie tabele:
- Can I JOIN You?

:-D

A teraz do rzeczy. Czytałem swego czasu Manual MySQL. Ostatnio postanowiłem odświeżyć sobie w ramach wieczornej literatury moje podręczne notatki z owej tematyki.

I po przeczytaniu doszedłem do wniosku że jest tam kilka ciekawych, fajnych rzeczy, o których często nawet nie wiemy. Może dlatego ze są to rzeczy bardziej zaawansowane, czyli nie potrzebne Kowalskiemu.

I tak choćby bity i notacja b’:

#tworzymy tabelkę
CREATE TABLE t (b BIT(8));

#wstawiamy bity - znaczy dane :)
INSERT INTO t SET b = b’11111111′;
INSERT INTO t SET b = b’1010′;
INSERT INTO t SET b = b’0101′;

#a tu pobieramy sobie wyniki z konwersją między systemami
SELECT b+0, BIN(b+0), OCT(b+0), HEX(b+0) FROM t;

Dalej - może nie takie zaawansowane, bo każdy SQL’ista :) powinien to znać - mianowicie User Defined Variables czyli nasze zmienne w SQL ;)

#przykład z manual’a
SET @t1=0, @t2=0, @t3=0;
SELECT @t1:=(@t2:=1)+@t3:=4,@t1,@t2,@t3;

#no to może jeszcze raz nasze bity
SET @v1 = b’1000001′;
SET @v2 = CAST(b’1000001′ AS UNSIGNED), @v3 = b’1000001′+0;
SELECT @v1, @v2, @v3;

Operator <=> czyli null safe equal. A po co to? Jak ktoś czytał książkę C.J. Date’a, o której pisałem wcześniej - będzie wiedział :)

#ale może przykład wystarczy by ‘przypomnieć’ sobie o co chodzi :)
mysql> SELECT 1 <=> 1, NULL <=> NULL, 1 <=> NULL;
-> 1, 1, 0

Programiści, którzy zapomnieli o konstrukcji w linijce poniżej pewnie się teraz uśmiechną:
SELECT IF(1<2,’yes’,'no’) as wynik;

I niechaj SQL przemówi:
SELECT IF(STRCMP(’test’,'test1′),’no’,'yes’);
:)

Przy okazji: potęga agregacji jest niekwestionowana, ale pamiętam pytanie o problem z DISTINCT + konkretne pole:

#więc:
SELECT COUNT(DISTINCT price) FROM shop;

Co jeszcze? Np. oprogramowanie GIS - mamy tu wsparcie od strony MySQL:

http://dev.mysql.com/doc/refman/5.0/en/opengis-geometry-model.html

Choć jeszcze nie używałem tego w konkretnych projektach np. www + mapy, po godzince zabawy mogę powiedzieć - fajna sprawa.

A na deser eksport tabeli do pliku CSV:
SELECT * INTO OUTFILE ‘/home/dominik/tabela.csv’
FIELDS TERMINATED BY ‘,’ OPTIONALLY ENCLOSED BY ‘”‘
LINES TERMINATED BY ‘\n’
FROM shop;

Oraz coś, co naprawdę może się przydać (ahh, przypominają mi się stare czasy i praca nad pewnym katastrofalnym systemem) - tabela tymczasowa:

CREATE TEMPORARY TABLE tabela (
  id int(10) unsigned NOT NULL auto_increment,
  nazwisko VARCHAR(50) NOT NULL,
  PRIMARY KEY (id)
);

INSERT INTO tabela SET nazwisko=”Thompson”;
INSERT INTO tabela SET nazwisko=”Torvalds”;
SELECT * FROM tabela;

Coś bardziej zaawansowanego? Optymalizacje - performance. Ale przecież to znamy, bo robimy na co dzień ;)

Enjoy! ( and JOIN ;-) )

Napisał Dominik w kategoriach: O programowaniu

  1. 1 odpowiedź do “Ciekawy MySQL”

  2. Fajne, fajne ziom :)

    Napisał ziomX Jul 5, 2009

Musisz być zalogowany aby komentować