Acg N. .
Temat: Nauka SQL Serwer 2005
A to jeszcze taka informacja dla wszystkich chcących nauczyć się ogólnie SQL. Otóż poza podstawowymi poleceniami (wspólnymi dla silników baz danych różnych dostawców) mamy także szereg rozszerzeń i różnic składniowych. Są w sieci całe tabele porównawcze dla różnych silników, warto przeczytać, jak można osiągnąć daną rzecz w danym "narzeczu".SELECT a,b,c INTO tmp FROM X inaczej zadziała w PL/SQL (X musi być zadeklarowaną wcześniej zmienną, w szczególności może być zmienną "rekordową", co pozwala odczytać cały jeden rekord), a inaczej w T-SQL (X stanie się tabelą, zawierającą wynik zapytania).
SELECT 2+2 zadziała w T-SQL, ale w PL/SQL już potrzeba "FROM dual".
Zabawa ze zmiennymi:
w PL/SQL:
DECLARE zmienna varchar(20);
BEGIN
zmienna := 'Ala ma kota';
DBMS_OUTPUT.PUT_LINE(zmienna);
END;
(swoją drogą nie mam pojęcia, jak wyświetlić zawartość zmiennej tekstowej w selekcie :/
w T-SQL
DECLARE @zmienna VARCHAR(20)
SET @zmienna = 'Ala ma kota'
SELECT @zmienna
i wiele innych różnic. Czasami parsery dwóch silnikó potrafią zrobić to samo, ale wyrażone inaczej (inna składnia), a czasem po prostu nie potrafią czegoś zrobić i trzeba to "obchodzić na okrągło" elementarnymi poleceniami SQL. Dawniej było to np. rankingowanie danych, tabele tymczasowe, zmiana typu kolumny, w której są już dane. Różne jest podejście do "standardów" (dawniej SQL92, teraz bodajże SQL2003)
Inaczej mogą nazywać się funkcje wbudowane (np. daty/czasu, operacji na literałach) - SQLLite i T-SQL na przykład.
Dodatkowo silniki mogą oferować dodatkową funkcjonalność - obsługa XML, szyfrowanie, funkcje systemowe (zwykle blokowane przez dbadminów), dynamiczny SQL (dzięki niemu mogłem czynić "cuda" na polu metod numerycznych :) )
Warto mieć pod ręką porównania, chociażby http://troels.arvin.dk/db/rdbms/
Dobrze jest sobie napisać na szybko jakieś złożone (pod względem róznych konstrukcji) wyrażenie i sprawdzić, czy dany silnik je "strawi". Jak nie, to spróbować pozamieniać wyrażenia innymi, obejść je, aż w końcu uzyska się żądany efekt. Wtedy wiadomo pi razy oko, co można z danym silnikiem zrobić.
Tutaj quick'n'dirty zapytanie do zabawy z SQLLite (bardzo fajna baza! "gada" z .NET), po którym nie wiedziałem za bardzo, czego się spodziewać. Przy takich testach dobrze wrzucić do bazy dane w Unicode i zobaczyć wynik. SQLLite przeszedł pomyślnie test.
SELECT
(CASE WHEN t.id > 100 THEN 'działa CASE :)' END) as XXX,
t.*,
t.nazwisko || CAST(t.id AS VARCHAR(10)) || '!!!!' AS YYY,
(SELECT ID+2 FROM T1 abc where abc.id=t.id) as 'AS ze spacjami !'
FROM T1 t
INNER JOIN T2 tt ON (t.id= tt.id) AND (t.id > 1)
WHERE t.nazwisko in (select nazwisko from T1 ttt where ttt.id> 1)
AND t.nazwisko like '%3%'
UNION
SELECT
(CASE WHEN t.id < 10 THEN '< 10' ELSE t.id END) as XXX,
t.*,
t.nazwisko || ' 1111111' as YYY,
datetime('now','localtime','-3 months', '-1000 years', '-20 days')
FROM T1 t
INNER JOIN T2 tt ON (t.id= tt.id)
ORDER BY id
LIMIT 333
Adrian Olszewski edytował(a) ten post dnia 28.04.09 o godzinie 10:53