Język SQL w Delphi

6
1. Kwerendy Język SQL w Delphi Kwerenda jest zleceniem dla programu bazy danych, mającym na celu odszukanie rekordów spelniających określone kryteria. Przykladem kwerendy może być zlecenie odszukania rekordu zawierającego dane osoby o podanym nazwisku lub odszukaniu wszystkich osób pochodzących z jednego miasta. Wyniki obydwu zapytań są różne. W pierwszym przypadku uzyskujemy jeden rekord, a w drugim calą ich grupę. Język SQL (ang. strucured query language ) zostal zaprojektowany przez firmę IBM w celu sprawnej realizacji kwerend w relacyjnych bazach danych. Do wykonania kwerendy w Delphi sluży komponent TQuery. Jej podstawowe wlaściwości: SQL — Zawiera tekst komendy języka SQL, która zostanie wykonana. DatabaseName — Określa nazwę bazy danych, z którą skojarzony zostal zbiór danych. Params — Zawiera parametry przekazywane do komendy SQL. Active — Określa czy zbiór danych jest otwarty, czy nie. 1.1. Przygotowanie do ćwiczenia Aby wykonać ćwiczenie związane z zastosowaniem komponentu TQuery, należy utworzyć nową aplikacjię i dodać do formularza komponent TQuery oraz TDataSource (znajdują się one w zakladce Data Access palety komponentów) oraz komponent TDBGrid (zakladka Data Controls ). W komponencie TQuery należy ustawić wlaściwość DatabaseName na odpowiedni alias bądź ścieżkę dostępu do katalogu, w którym znajduje się baza danych. Daje to dostęp do wszystkich tabel umieszczonych w katalogu bazy danych. W odróżnieniu od komponentu tabeli, który pozwala na dostęp tylko do jednej tabeli, komponent zapytania TQuery umożliwia dostęp do calej bazy, czyli do wszystkich tabel. Oczywiście zastosowanie komponentu TTable oraz TQuery jest inne. Następnie należy polączyć komponent TQuery ze źródlem danych TDataSource poprzez wlaściwość DataSet oraz komponent TDBGrid z komponentem TDataSource poprzez wlaściwość DataSource. W trakcie ćwiczenia należy modyfikować dzialanie komponentu TQuery poprzez ustalanie wartość wlaściwości SQL, a następnie ustalać wartość wlaściwości Active na True. 1.2. Komenda SELECT Komenda SELECT jest podstawową komendą języka SQL, slużącą do zadawania zapytań. Jej podstawową skladnią jest: SELECT co FROM skąd Przyklad: SELECT firma, miasto, rczn zakup FROM klienci Dodanie klauzuli WHERE <Wyrażenie logiczne> pozwala na umieszczenie w zapytaniu tylko tych rekordów, dla których warunek przyjmuje wartość TRUE. Klauzula ORDER BY <wyr> powoduje zmianę porządku wyświetlanych danych.

Transcript of Język SQL w Delphi

Page 1: Język SQL w Delphi

1. Kwerendy

Język SQL w Delphi

Kwerenda jest zleceniem dla programu bazy danych, mającym na celu odszukanie rekordówspełniających określone kryteria. Przykładem kwerendy może być zlecenie odszukania rekorduzawierającego dane osoby o podanym nazwisku lub odszukaniu wszystkich osób pochodzącychz jednego miasta. Wyniki obydwu zapytań są różne. W pierwszym przypadku uzyskujemy jeden rekord,a w drugim całą ich grupę.Język SQL (ang. strucured query language) został zaprojektowany przez firmę IBM w celu sprawnej

realizacji kwerend w relacyjnych bazach danych.Do wykonania kwerendy w Delphi służy komponent TQuery. Jej podstawowe właściwości:

❏ SQL — Zawiera tekst komendy języka SQL, która zostanie wykonana.❏ DatabaseName — Określa nazwę bazy danych, z którą skojarzony został zbiór danych.❏ Params — Zawiera parametry przekazywane do komendy SQL.❏ Active — Określa czy zbiór danych jest otwarty, czy nie.

1.1. Przygotowanie do ćwiczenia

Aby wykonać ćwiczenie związane z zastosowaniem komponentu TQuery, należy utworzyć nowąaplikacjię i dodać do formularza komponent TQuery oraz TDataSource (znajdują się one w zakładceData Access palety komponentów) oraz komponent TDBGrid (zakładka Data Controls).W komponencie TQuery należy ustawić właściwość DatabaseName na odpowiedni alias bądź ścieżkędostępu do katalogu, w którym znajduje się baza danych. Daje to dostęp do wszystkich tabelumieszczonych w katalogu bazy danych. W odróżnieniu od komponentu tabeli, który pozwala nadostęp tylko do jednej tabeli, komponent zapytania TQuery umożliwia dostęp do całej bazy, czylido wszystkich tabel. Oczywiście zastosowanie komponentu TTable oraz TQuery jest inne. Następnienależy połączyć komponent TQuery ze źródłem danych TDataSource poprzez właściwość DataSetoraz komponent TDBGrid z komponentem TDataSource poprzez właściwość DataSource. W trakciećwiczenia należy modyfikować działanie komponentu TQuery poprzez ustalanie wartość właściwościSQL, a następnie ustalać wartość właściwości Active na True.

1.2. Komenda SELECT

Komenda SELECT jest podstawową komendą języka SQL, służącą do zadawania zapytań. Jejpodstawową składnią jest:

SELECT co FROM skąd

Przykład:SELECT firma, miasto, rczn zakup FROM klienci

Dodanie klauzuli WHERE <Wyrażenie logiczne> pozwala na umieszczenie w zapytaniu tylko tychrekordów, dla których warunek przyjmuje wartość TRUE. Klauzula ORDER BY <wyr> powoduje zmianęporządku wyświetlanych danych.

Page 2: Język SQL w Delphi

2 1. Kwerendy

SELECT firma, miasto, rczn_zakup FROM klienciWHERE rczn_zakup > 1000 ORDER BY miasto, firma

Do zapytania domyślnie kierowane są wszystkie rekordy. Dodanie klauzuli DISTINCT zaraz zasłowem SELECT powoduje wykluczenie powtarzających się wierszy.

SELECT biura.nr_biura FROM biura, klienciWHERE biura.nr_biura = klienci.nr_biuraSELECT DISTINCT biura.nr_biura FROM biura, klienciWHERE biura.nr_biura = klienci.nr_biura

Domyślnie wszystkie kolumny wyników zapytań przyjmują nazwę pola, z którego pochodzą dane,ale można nadać im inną nazwę. Nazwa ta jednak musi spełniać wszystkie wymogi nazw pól tabeli.

SELECT nr_klienta AS Numer, firma AS Nazwa FROM klienci

W przypadku, gdy trzeba wybrać wszystkie pola z tabeli, można ich listę zastąpić symbolem *.

SELECT klienci.*, biura.miasto AS BiuroFROM klienci, biuraWHERE klienci.nr_biura = biura.nr_biura ORDER BY firma

Elementy wybrane w zapytaniach mogą być także funkcjami. Oto kilka funkcji, których możnaużywać z elementem wyboru będącym polem lub wyrażeniem zawierającym nazwy pól:

AVG(<element wyb>) Uśrednianie kolumny danych numerycznych,COUNT(<element wyb>) Zlicza elementy wyboru w kolumnie,MIN(<element wyb>) Wyznacza najmniejszą wartość elementu kolumny,MAX(<element wyb>) Wyznacza największą wartość elementu kolumny,SUM(<element wyb>) Sumuje kolumny danych numerycznych.

SELECT AVG(rczn_zakup) AS ŚREDNIA FROM klienciSELECT MIN(rczn_zakup) AS MINIMUM FROM klienciSELECT MAX(rczn_zakup) AS MAKSIMUM FROM klienciSELECT COUNT(rczn_zakup) AS LICZBA FROM klienciSELECT SUM(rczn_zakup) AS SUMA FROM klienci

Jeżeli tworzymy zapytanie z kilku tabel to istnieje możliwość, że nazwy pól w tych tabelach pokryjąsię. W celu rozróżnienia tych pól można umieścić zaraz za nazwą pola lokalny alias, który jest aktualnytylko w czasie wykonywania zapytania. Aliasy lokalne stosowane są również w sytuacji, gdy potrzebnejest uproszczenie nazwy tabeli, bądź jej skrócenie w celu zwiększenia czytelności.

SELECT a.nr_klienta, a.firma, a.miasto, b.miasto AS BiuroFROM klienci a, biura bWHERE a.nr_biura = b.nr_biura ORDER BY a.firma

Page 3: Język SQL w Delphi

1.2. Komenda SELECT 3

Kryterium wyboru umieszczone za klauzulą WHERE można budować z wielu pojedynczych wyrażeńlogicznych używając słów OR lub AND. Można tam umieścić zarówno warunki łączenia tabel jak iodfiltrowywania rekordów. Do budowania pojedynczych wyrażeń logicznych należy stosowaćnastępujących operatorów:= równe,<> różne,> większe,< mniejsze,>= większe równe,<= mniejsze równe,

a także operatorów ALL(<zapytanie wtórne>), ANY | SOME(<zapytanie wtórne>), klauzuli [NOT]BETWEEN <minimum> AND <maksimum>, [NOT] EXIST(<zapytanie wtórne>) oraz [NOT] IN<zbiór wartości> i [NOT] LIKE <wzorzec>. Zapytanie wtórne to polecenie SELECT wewnątrzgłównego polecenia SELECT. W klauzuli WHERE można użyć kilku zapytań wtórnych na tym samympoziomie (nie zagnieżdżonych). W ostatniej klauzuli dopuszcza się występowanie symboliwieloznacznych takich jak:

dowolny znak,% sekwencja dowolnych znaków.

SELECT nr_klienta, firma, miasto, nr_biura FROM klienciWHERE nr_biura != "4" ORDER BY firma

SELECT firma, miasto FROM klienci WHERE rczn_zakup > ALL(SELECT rczn_zakup FROM klienci WHERE miasto = "New York")

SELECT firma, miasto FROM klienci WHERE rczn_zakup > ANY(SELECT rczn_zakup FROM klienci WHERE miasto = "New York")

SELECT * FROM klienci WHERE rczn_zakup BETWEEN 1000 and 2000

SELECT * FROM biura WHERE NOT EXIST (SELECT * FROM klienci, biuraWHERE klienci.nr_biura = biura.nr_biura)

SELECT adres, miasto FROM biura WHERE nr_biura IN ("1","2","3")

SELECT * FROM klienci WHERE miasto LIKE ’N%’

SELECT * FROM klienci WHERE stan LIKE ’_A’

Dodanie klauzuli GROUP BY <kolumna grupowania> powoduje grupowanie wierszy wwygenerowanym wyniku zapytania na podstawie wartości kolumny (kolumn). Pozwala to naprzykładna podsumowanie wartości sprzedaży w filiach firmy, położonych w różnych firmach.Użycie klauzuli HAVING <warunek filtrujacy> pozwala na określenie warunku filtrującego, który

muszą spełniać grupy, aby zostały włączone do wyników kwerendy. Klauzula HAVING powinna zostaćużyta z klauzulą GROUP BY. Może ona zostać użyta z dowolną liczbą warunków filtrujących,połączonych operatorami AND i OR. Można również używać operatora NOT, zmieniającego wartośćlogiczną wyrażeń na przeciwną. Parametr WarunekFiltrujący nie może zawierać kwerendy wtórnej.W klauzuli HAVING wolno używać lokalnych aliasów i funkcji pól. W wypadku, gdy klauzula HAVINGnie zawiera funkcji pól, należy używać klauzuli WHERE, z uwagi na większą szybkość wykonania.

Page 4: Język SQL w Delphi

4 1. Kwerendy

SELECT firma, miasto, rczn_zakup, nr_biura FROM klienci ORDER BYfirma GROUP BY miasto HAVING nr_biura > "2"

Klauzula UNION [ALL] <polecenie select> powoduje połączenie wyników zapytania z wynikieminnego polecenia zapytania. Standardowo klauzula ta sprawdza połączone wyniki i eliminujepowtarzające się wiersze. Dodanie klauzuli ALL spowoduje pominięcie tej eliminacji.

SELECT * FROM klienci WHERE nr_biura = "2" UNIONSELECT * FROM klienci WHERE nr_biura = "4"

Klauzula ORDER BY <elementy porządkujące> uporządkowuje wyniki zapytania. Standardowowyniki zapytania wyświetlane są w kolejności rosnącej. Dodanie klauzuli DESC umożliwia sortowaniew kolejności malejącej.

SELECT klienci.firma, klienci.miasto, biura.miasto FROM klienci, biuraWHERE klienci.nr_biura = biura.nr_biuraORDER BY biura.miasto, klienci.firma DESC

Istnieje możliwość utworzenia sparametryzowanych zapytań (np. w kryterium wyboru). W tymcelu należy, przed uruchomieniem kwerendy, określić wartość parametru Params. Należy wykonać toprogramowo, umieszczając przed wykonaniem zapytania kod programu

Procedure TForm1.Button1Click(Sender: TObject);begin

With Query1 DobeginClose;Unprepare;TryParamByName(’MIASTO’).AsString := Edit1.Text;Prepare;Open;

ExceptOn EDBEngineError DoShowMessage(’Bledna skladnia zapytania SQL.’);

On EDatabaseError DoShowMessage(’Bledny parametr lub zapytanie.’)

endend

end;

W powyższym przypadku komenda zapytania może mieć następującą postać:

SELECT * FROM klienci WHERE UPPER(miasto) = UPPER(:MIASTO)

1.3. „Żywe” kwerendy

Domyślnie wynik wykonania zapytania jest zbiorem danych tylko do odczytu. Zbiór danych, któryotrzymuje się z zapytania, można wyświetlać w obiektach kontrolnych, lecz użytkownicy nie mogą

Page 5: Język SQL w Delphi

1.3. „Żywe” kwerendy 5

tych danych edytować. Aby umożliwić edycję danych zapytania, należy sprawić, aby zwrócony zbiórdanych był „żywy” — możliwy do edycji.Można żądać, aby zapytanie zwróciło „żywy” zbiór danych. Umożliwia to właściwość RequestLive

komponentu TQuery. Aby zbiór danych zwrócony przez zapytanie mógł być edytowany, przezużytkownika, należy ją ustawić na wartość True. Niestety nie zawsze ma się gwarancję na to,że zwrócony zbiór danych będzie edytowalny. Jednak kiedy tylko to możliwe, system BDE usiłujespełniać oczekiwania projektanta. Istnieją pewne ograniczenia, które decydują o tym, czy wynikzapytania będzie można edytować. Głównie zależy to od tego, czy zapytanie jest przetwarzane przezsystem BDE, czy też przez narzędzia serwera baz danych. Niejednorodne złączenia oraz zapytaniarealizowane w bazach lokalnych, takich jak np. Paradox, są wykonywane przez BDE. Zapytaniadotyczące oddalonej bazy danych serwera SQL są analizowane przez sam serwer.To, czy zbiór danych będący wynikiem zapytania może być edytowany, określa właściwość

CanModify, która w przypadku gdy możliwa jest edycja zapytania, zwraca wartość True.Jeśli projektant żąda, aby wynik zapytania mógł być edytowany, ale składnia wyrażenia SELECT

nie pozwala na to, BDE zwróci:

❏ wynik tylko do odczytu w przypadku zapytań wykonywanych na bazach lokalnych typu Paradoxlub dBASE.

❏ kod błędu w przypadku zapytań wykonywanych na oddalonym serwerze SQL.

1.3.1. Wymagania i ograniczenia dla „żywych” wyników zapytania

W przypadku zapytań, które używają lokalnego SQL, BDE oferuje rozszerzone wsparcieedytowalnych, żywych wyników zapytań zarówno opartych na jednej, jak i wielu tabelach. Local SQLjest używany, kiedy zapytanie jest wykonywane dla jednej lub więcej tabel lokalnych typu Paradoxlub dBase, albo dla jednej lub wiecej tabel zdalnego serwera, kiedy nazwy tych tabel w zapytaniu sąpoprzedzone nazwą aliasu bazy danych.Żywy wynik zapytania wykonanego na pojedynczej tabeli lub widoku jest zwracany, gdy zapytanie

to nie zawiera następujących elementów:

❏ klauzuli DISTINCT w wyrażeniu SELECT,❏ złąceń typu INNER, OUTER lub UNION,❏ funkcji agregujących, z klauzulą lub bez klauzuli GROUP BY lub HAVING,❏ podzapytań,❏ klauzul ORDER BY nie bazujących na indeksie❏ gdy zapytanie bazuje na tabelach lub widokach, które nie dają się aktualizować

W przypadku zapytań wykonywanych na oddalonym serwerze SQL, które zawierają wszystkiezapytania wykonane wyłącznie na zdalnym serwerze bazy danych, żywy wynik zapytania jestokraniczony do standardu zdefiniowanego przez SQL-92 oraz przez dodatkowe ograniczenia narzuconeprzez rodzaj serwera.W tym przypadku, żywy wynik zapytania wykonanego na pojedynczej tabeli lub widoku jest

zwracany, gdy zapytanie to nie zawiera następujących elemetnów:

❏ klauzuli DISTINCT w wyrażeniu SELECT,❏ funcji agregujących z klauzulą lub bez klauzuli GROUP BY lub HAVING,❏ odwołań do więcej niż jednej tabeli bazowej lub widoków, które mogą być uaktualniane,❏ podzapytań, które odwołują się do tabeli w klauzuli FROM lub innych tabel.

1.3.2. Aktualizacja wyników zapytania tylko do odczytu

Aplikacja może aktualizować dane zwrócone w zbiorze tylko do odczytu, jeżeli zastosowano trybbuforowania zmian. W celu zaktualizowania zbioru danych tylko do odczytu, należy:

Page 6: Język SQL w Delphi

6 1. Kwerendy

❏ dodać komponent TUpdateSQL do modułu danych lub formularza, który daje mołiwość aktualizacjitakiego wyniku zapytania,

❏ wprowadzic aktualizujące wyrażenie SQL dla właściwości ModifySQL, InsertSQL lub DeleteSQL,❏ dla komponentu TQuery ustawić właściwość CachedUpdate na wartość True.