Złączenia pułapki i nowe możliwości
|
|
- Magdalena Wójcik
- 8 lat temu
- Przeglądów:
Transkrypt
1 X Konferencja PLOUG Kościelisko Październik 2004 Złączenia pułapki i nowe możliwości Jarosław Gramacki, Artur Gramacki Uniwersytet Zielonogórski Instytut Informatyki i Elektroniki ul. Podgórna 50, , Zielona Góra j.gramacki@iie.uz.zgora.pl, a.gramacki@iie.uz.zgora.pl Abstrakt Celem niniejszego artykułu jest omówienie dostępnych w systemie Oracle rodzajów połączeń (ang. joins) tabel relacyjnych. Zagadnienie łączenia tabel jest tak stare, jak zasady, na których opiera się model relacyjny. Niemniej liczba dostępnych w systemie Oracle siedmiu (!) różnych terminów posiadających w swej nazwie frazę join (Equijoins, Self Joins, Cartesian Products, Inner Joins, Outer Joins, Antijoins, Semijoins), powoduje, że pozornie proste zagadnienia stają się często źródłem wielu błędów. Ważnym przykładem zastosowania połączeń są też tzw. zapytania hierarchiczne, w których połączenia występują w sposób niejawny. Sprawę komplikuje ponadto wprowadzona niedawno (począwszy od wersji 9i) obsługa nowej składni połączeń wynikającej z implementacji w bazie Oracle kolejnych elementów standardu SQL/99. Niektóre opisane tam możliwości nie były ponadto (w sposób bezpośredni) dostępne we wcześniejszych wersjach bazy. W referacie przedstawiono opisane wyżej zagadnienia na odpowiednio dobranych przykładach. Pokazano również, że nawet pozornie proste zapytania kierowane do bazy mogą wymagać budowy ciekawych zapytań z połączeniami. Z uwagi na przyjęty zakres pracy, nie zajmowano się problemami systemowej optymalizacji zapytań. Pominięto więc takie zagadnienia jak np. indeksacja, partycjonowanie, widoki zmaterializowane, podpowiedzi dla optymalizator (ang. hints), itd. Informacje o autorach: dr inż. Artur Gramacki pracuje w Instytucie Informatyki i Elektroniki Uniwersytetu Zielonogórskiego na stanowisku adiunkta. Jego zainteresowania koncentrują się wokół szeroko rozumianych zagadnień związanych z bazami danych, w szczególności firmy Oracle. Oprócz prowadzenia zajęć dydaktycznych stara się wykorzystywać swoją wiedzę uczestnicząc w różnych projektach informatycznych z tego zakresu. Brał udział w trzech projektach, których celem było przygotowanie systemów wspomagających działalność Uniwersytetu Zielonogórskiego. dr inż. Jarosław Gramacki jest pracownikiem naukowym w Instytucie Informatyki i Elektroniki Uniwersytetu Zielonogórskiego. Zajmuje się projektowaniem, wykonywaniem oraz wdrażaniem aplikacji bazodanowych usprawniających szeroko rozumiane zarządzanie Uczelnią. Od wielu lat prowadzi również zajęcia dydaktyczne dotyczące projektowania baz danych, działania i administrowania systemami zarządzania bazami danych oraz wykorzystania technologii Oracle w budowie aplikacji użytkowych.
2 260 Jarosław Gramacki, Artur Gramacki
3 Złączenia pułapki i nowe możliwości Wstęp Dane zgromadzone w bazie danych są użyteczne tylko wówczas, gdy potrafimy z nich poprawnie i bezbłędnie skorzystać. Jedyną metodą dostępu do danych bazy relacyjnej jest język SQL i to niezależnie od platformy programistycznej, z której korzystamy [ORASQL]. Zapytania w tym języku pojawiają się zawsze nawet, gdy są bardzo skrzętnie ukryte przed użytkownikiem. Ważnym zagadnieniem w ramach języka SQL są połączenia relacji (tabel) pomiędzy sobą i w konsekwencji obsługa tychże połączeń z poziomu języka SQL. Niniejszy artykuł poświęcony jest w całości omówieniu wybranych aspektów połączeń w relacyjnej bazie danych Oracle. 2. Model danych 1 Przy opisie jakichkolwiek zagadnień dotyczących języka SQL konieczny jest odpowiedni, adekwatny do opisywanych problemów, schemat tabel relacyjnych wraz z ich powiązaniami. Na Rysunku 1 przedstawiono wykorzystywany w pracy model relacyjny. Większość tabel tworzy klasyczny wręcz model używany w wielu pracach dotyczących relacyjnych baz danych i pochodzi z oryginalnego schematu demonstracyjnego systemu Oracle o nazwie HR (ang. human resources) szczegółowo omawiany jest on w [HRSchema]. Wymieńmy jednak kilka jego niedogodności, które będą istotne w pracy: 1. Kolumna Employees.manager_ID dopuszcza wartość NULL. 2. Kolumna Employees.department_ID dopuszcza wartość NULL. 3. Kolumna Departments.manager_ID dopuszcza wartość NULL. 4. Wygodna na etapie modelowania, ale sprawiająca trudności w użyciu i podatna na błędy, relacja wewnętrzna Employees.employee_ID -> Employees.manager_ID. 5. W tabeli Sport_enrollment (patrz następny akapit) pracownik może zapisać się do sekcji sportowej, która akurat nie jest prowadzona w danym sezonie (np. sekcja tenisa jest oferowana w sezonie letnim). Na potrzeby pracy rozszerzono ten model 2. Tabele Sports oraz Sport_enrollment (nie występują one w oryginalnym schemacie HR) opisują prowadzone w firmie ligi sportowe i pracowników, którzy zapisali się na dane rozgrywki. Potrójny klucz primary (na wszystkich kolumnach tabeli Sport_enrollment) utworzono aby bezkosztowo uniemożliwić wielokrotne zapisanie się tego samego pracownika na te same rozgrywki. Część z wymienionych wyżej właściwości (1, 2, 3) może być efektem celowo przyjętych założeń i z formalnego punktu widzenia nie stanowi błędu. Właściwość 4 można by zastąpić odpowiednią strukturą typu master-detail (mniej podatna na błędy), jednak wtedy należałoby z góry ustalić ilość poziomów podległości pracowników. Właściwość 5 jest wynikiem pewnego niedbalstwa projektanta bazy. Bez problemu można było utworzyć odpowiednie ograniczenie, np. poleceniem: ALTER TABLE Sport_enrollment ADD CONSTRAINT xxx_fk FOREIGN KEY (discipline, season_id) REFERENCES Sports (discipline, season_id); 1 W pracy wszystkie nazwy tabel pisane są małymi literami + pierwsza litera duża (np. Departments), nazwy kolumn w całości małymi literami (np. title), aliasy dla kolumn to jedna bądź dwie duże litery (np. J, SE). 2 Wszystkie skrypty wykorzystywane w pracy można otrzymać kontaktując się z autorami.
4 262 Jarosław Gramacki, Artur Gramacki LOCATIONS LOCATION_ID <pk> NUMBER(4) not null STREET_ADDRESS VARCHAR2(40) null POSTAL_CODE VARCHAR2(12) null CITY VARCHAR2(30) not null STATE_PROVINCE VARCHAR2(25) null COUNTRY_ID <fk> CHAR(2) null LOC_ID_PK LOC_CITY_IX LOC_COUNTRY_IX LOC_STATE_PROVINCE_IX LOCATION_ID = LOCATION_ID DEPARTMENTS DEPARTMENT_ID <pk> NUMBER(4) not null DEPARTMENT_NAME <ak> VARCHAR2(30) not null MANAGER_ID <fk> NUMBER(6) nul l LOCATION_ID <fk,ak> NUMBER(4) nul l DEPT_ID_PK DEPT _LOCAT ION_IX COUNTRY_ID = COUNTRY_ID COUNTRIES COUNTRY_ID <pk> CHAR(2) not null COUNTRY_NAME VARCHAR2(40) nul l REGION_ID <fk> NUMBER nul l COUNTRY_C_ID_PK REGION_ID = REGION_ID REGIONS REGION_ID <pk> NUMBER not null REGION_NAME VARCHAR2(25) nul l REG_ID_PK DEPARTMENT_ID = DEPARTMENT_ID EMPLOYEE_ID = MANAGER_ID DEPARTMENT_ID = DEPARTMENT_ID JOB_HISTORY EMPLOYEE_ID <pk,fk> NUMBER(6) not null START_DATE <pk> DATE not null END_DATE DATE not null JOB_ID <fk> VARCHAR2(10) not null DEPARTMENT_ID <fk> NUMBER(4) nul l JHIST_EMP_ID_ST_DATE_PK JHIST_DEPARTMENT_IX JHIST_EMPLOYEE_IX J HIST _JOB_IX J OB_ID = J OB_ ID JOB_ID = JOB_ID JOBS JOB_ID <pk> VARCHAR2(10) not null JOB_TITLE <ak> VARCHAR2(35) not null MIN_SALARY NUMBER(6) nul l MAX_SALARY NUMBER(6) nul l JOB_ID_PK SPORT_ENROLLMENT DISCIPLINE <pk,fk> VARCHAR2(20) not null SEASON_ID <pk,fk> NUMBER(3) not null EMPLOYEE_ID <pk,fk> NUMBER(7) not null S_ENROLL_DIS_SEA_EMP_PK S_ENROLL_DIS_IX S_ENROLL_SEA_IX S_ENROLL_EMP_IX EMPLOYEE_ID = EMPLOYEE_ID EMPLOYEE_ID = EMPLOYEE_ID SPORTS DISCIPLINE <pk> VARCHAR(20) not null SEASON_ID <pk> NUMBER(3) not null D ISC IPLINE = D ISC IPLINE SEASON_ID = SEASON_ID EMPLOYEES EMPLOYEE_ID <pk> NUMBER(6) not null FIRST_NAME VARCHAR2(20) nul l LAST_NAME VARCHAR2(25) not null <ak> VARCHAR2(25) not null PHONE_NUMBER VARCHAR2(20) nul l HIRE_DATE DATE not null JOB_ID <fk> VARCHAR2(10) not null SALARY NUMBER(8,2) null COMMISSION_PCT NUMBER(2,2) nul l MANAGER_ID <fk> NUMBER(6) nul l DEPARTMENT_ID <fk> NUMBER(4) nul l EMP_EMP_ID_PK EMP_DEPARTMENT_IX EMP_JOB_IX EMP_MANAGER_IX EMP_NAME_IX EMPLOYEE_ID = MANAGER_ID EMPLOYEE_ID = EMPLOYEE_ID SALARY_HISTORY EMPLOYEE_ID <pk,fk> NUMBER(7) not null SALARY NUMBER(11,2) not null END_DATE <pk> DATE not null SHIST_EMP_EDATE_PK SHIST_EMPLOYEE IX Patrz opis w tekście Rys. 1. Model relacyjny HR uzupełniony dodatkowe tabele (zaznaczone ciemniejszym kolorem) Ponieważ jednak do czasu zauważenia błędu wprowadzono (tak zakładamy) dużą ilość brudnych danych (pracownicy pozapisywali się do sekcji, do których chcieliby należeć w wygodnych dla nich okresach, interpretując wprowadzone wpisy jako swoistą listę życzeń) więc dodanie ograniczenia nie wchodzi (przynajmniej na razie) w grę. Innym, często spotykanym w praktyce powodem niemożności usunięcia opisanego błędu jest brak odpowiednich uprawnień. Osobami, które najczęściej budują zapytania do bazy są programiści raportów, którzy w poprawnie administrowanym środowisku mają jedynie uprawnienia do obiektów schematu. W stosunku do oryginalnego schematu HR usunięto również występujące w nim jawne błędy projektowe. W tabeli Departments dodano ograniczenie unique dla kolumn department_name oraz location_id. W tabel Jobs dodano ograniczenie unique dla kolumny job_title. Oba ograniczenia oznaczono na schemacie symbolem <ak>. Dodano również tabelę Salary_history. W oryginalnym schemacie HR można zapamiętywać historię zmian miejsca pracy pracownika (kolumna Employees.department_ID) lub zmian stanowiska (kolumna Employees.job_ID). Jest to implementacja tzw. wersjowania relacji. Brakuje natomiast możliwości zapamiętywania np. zmian płacy pracownika (kolumna Employ-
5 Złączenia pułapki i nowe możliwości 263 ees.salary), czyli tzw. wersjowania atrybutów. Obsługę tą zapewnia właśnie tabela Salary_history. Dane do niej zapisywane są z użyciem analogicznego wyzwalacza do tego, który w oryginalnej wersji schematu HR obsługuje wpisy do tabeli Job_history. Abstrahując jednak od powyższej dyskusji, w praktyce często przychodzi nam pracować na modelu takim jaki jest (nie mamy możliwości zmiany modelu). Dużego znaczenia nabiera wtedy poprawne konstruowanie zapytań opartych na danym modelu. 3. Połączenia w systemie Oracle Połączenia zajmują ważne miejsce w każdej bazie relacyjnej i są to bardzo newralgiczne elementy. Dokumentacja systemu Oracle poświęca im jednak stosunkowo niewiele miejsca, dodatkowo prawie zupełnie nie zwracając uwagi na różne związane z nimi niuanse, gdyż prezentowane tam przykłady są typu zawsze zadziała. Ponadto w oryginalnej dokumentacji systemu Oracle pojawia się siedem pojęć, w których używana jest fraza join 3, zestawiono je poniżej. Zdaniem autorów część z nich, jakkolwiek poprawna, wprowadza zbędne zamieszanie w i tak już skomplikowanej materii. W nawiasach podano również inne, pojawiające się w różnych publikacjach nazwy, które jednak nie pojawiają się w dokumentacji Oracle. W Tabeli 1 krótko opisano każde z połączeń: (Natural Joins), Equijoins, Self Joins, Cartesian Products, Inner Joins (Simple Joins), Outer Joins, Antijoins, Semijoins, (Theta Joins). Tabela 1. Różne używane pojęcia związane z połączeniami relacyjnymi Nazwa Natural Joins Equijoins Self Joins Opis Połączenie dwóch lub więcej tabel poprzez kolumny o tych samych nazwach. W praktyce chodzi z reguły o połączenia równościowe. Dotyczy połączenia opisanego operatorem porównania. Nie wspomina się o żadnych dodatkowych zagadnieniach / założeniach szczegółowych. Dotyczy połączenia w obrębie jednej tabeli. Tabela ta musi więc dwa razy pojawić się w klauzuli (z reguły z dwoma różnymi aliasami). Nie wspomina się tu jednak o ew. strukturze hierarchicznej, która z reguły jest opisywana poprzez relację zdefiniowaną w jednej tabeli dla dwóch kolumn (a te wymagają z reguły zastosowania specjalizowanych operatorów). 3 Wszędzie użyto pisowni zgodnej z używaną w oryginalnej dokumentacji firmy Oracle.
6 264 Jarosław Gramacki, Artur Gramacki Nazwa Cartesian Products Inner Joins (Simple Joins) Outer Joins Antijoins Semijoins Theta Joins Opis Wynik połączenia dwóch lub więcej tabel, dla których nie podano warunku połączenia. Każdy wiersz z jednej tabeli połączony zostanie z każdym wierszem drugiej tabeli. Poza rzadkimi przypadkami szczególnymi, jest to z reguły wynik błędu w zapytaniu. Dosyć ogólne pojęcie. Połączenie dwóch lub więcej tabel, które zwraca w wyniku tylko wiersze pasujące do warunku połączenia. Nie mówi się nic o obsłudze wierszy niepasujących, które z reguły należy złączyć zewnętrznie (Outer Joins) Rozszerzenie wyniku połączenia typu Inner Joins o wiersze niepasujące Rozróżnia się połączenia zewnętrzne lewostronne (Left Outer Joins), prawostronne (Right Outer Joins), pełne (Full Outer Joins). Połączenie zwracające wiersze, które NIE pasują do podanego warunku. Połączenie z warunkiem EXISTS. Duplikaty zostają usunięte. Połączenie nierównościowe. Połączenie dwóch relacji dla kryterium połączenia innym niż równość. Z analizy zawartości Tabeli 1 wynika, że istnienie przynajmniej kilku z podanych tam pojęć jest dyskusyjne, gdyż służą one do opisu stosunkowo wąskiego zbioru zapytań. Z drugiej strony niektóre nazwy opisują bardzo ogólne właściwości, typowe raczej dla całego podejścia relacyjnego. Zebrano je jednak w pracy dla pokazania (zdaniem autorów nieuzasadnionego) trendu w tworzeniu nie zawsze ułatwiających życie, bytów. 4. Przykłady Z uwagi na ograniczoną objętość pracy, w pozostałej jej części zamieszczono jedynie pewną liczbę przykładów ilustrujących wybrane zagadnienia dotyczące połączeń relacyjnych oraz krótkie komentarze tychże przykładów. Część przykładów zaczerpnięto z prac [Genni00] [Czupr03], dostosowując je do używanego w artykule schematu. Przykłady starano się dobrać tak, aby pojawiały się w nich problemy. Nie oznacza to oczywiście, że wyczerpano temat. Wręcz przeciwnie jedynie zasygnalizowano go. W poniższych przykładach, gdzie to tylko było możliwe, zastosowano nową (dostępną począwszy od wersji 9i) składnię połączeń zdefiniowaną w standardzie SQL/99 4. Należy jednak zaznaczyć, że nowa składnia NIE wprowadza żadnej nowej funkcjonalności, której nie było w systemie do tej pory. Czyni jednak zapytania bardziej zgodnymi z normą ANSI-SQL 5. Zapytanie takie uruchomione na innej platformie bazodanowej (zgodnej z ANSI-SQL) powinno (przynajmniej teoretycznie) zadziałać bez żadnych modyfikacji. Przykład 1 połączenia naturalne R.region_id, Rr.region_name, C.country_id, region_id, R.region_name, C.country_id, 4 W wielu publikacjach pojawia się taka właśnie nazwa. Należy ją jednak traktować jako umowny skrót. Równie dobry skrót byłby SQL/2003 Poprawna nazwa normy to: ANSI/ISO/IEC 9075-[tu numer od 1 do 14]: Norma dostępna na stronie za $125!
7 Złączenia pułapki i nowe możliwości 265 C.country_name Countries C, Regions R C.region_id = R.region_id AND LOWER(R.region_name) LIKE '%europe%'; C.country_name Countries C NATURAL JOIN Regions R LOWER(R.region_name) LIKE '%europe%'; Dla składni ANSI, często w takim przypadku pojawia się błąd: ORA-25155: column used in NATURAL join cannot have qualifier. Stąd zamiast R.region_id musi być region_id (nawet pomimo istnienia aliasów tabel). Wydaje się, że używanie klauzuli NATURAL JOIN, NIE powinno być zalecane. Łatwo bowiem o (trudny do wykrycia) błąd, który wystąpi po dodaniu do schematu kolumny, która przypadkowo będzie nazywała się tak samo, jak kolumna w zapytaniu używającym NATURAL JOIN. System Oracle implementuje tą składnię, ale wynika to chyba raczej z potrzeby zapewnienia zgodności ze standardem ANSI, którego użyteczność w przypadku NATURAL JO- IN jest jednak mocno dyskusyjna. Nowa składnia umożliwia rozdzielenie warunków połączenia od innych warunków w klauzuli tu ograniczających wyniki do regionów europejskich. W dotychczasowej składni oba występowały w klauzuli i dla złożonych zapytań trudno było odróżnić je od siebie. Przykład 2 nowa składnia połączeń, pierwsza wersja D.department_name, E.last_name ' ' e.first_name Name, E.hire_date Employees E, Departments D E.department_id = D.department_id AND E.job_id = 'IT_PROG'; D.department_name, E.last_name ' ' e.first_name Name, E.hire_date Employees E JOIN Departments D USING(department_id) E.job_id = 'IT_PROG'; Jeśli w zapytaniu ANSI zamiast: Employees E JOIN Departments D USING(department_id) zapiszemy: Employees E NATURAL JOIN Departments D otrzymamy zły wynik. W powyższym przykładzie natura zagrożenia jest inna niż zagrożenie sygnalizowane w Przykładzie 1. Tabele Employees oraz Departments łączą DWIE relacje i dlatego należy doprecyzować, o które połączenie chodzi. Umożliwia to klauzula USING. Klauzuli USING można używać tylko wówczas, gdy odpowiednie kolumny obu tabel mają takie same nazwy. Tradycyjna składnia jest wolna od takich zagrożeń, gdyż warunek połączenia podany jest jawnie. Klauzula USING subtelnie psuje jednak semantykę zapytania. Nie uda się np. D.department_name, D.department_ID, E.department_ID,... gdyż zapytanie zakończy się błędem: ORA column part of USING clause cannot have qualifier. W tradycyjnej składni błąd ten nie wystąpi.
8 266 Jarosław Gramacki, Artur Gramacki W klauzuli USING nie ma ograniczenia na ilość kolumn w niej wymienianych. Zapytanie jak poniżej jest jak najbardziej poprawne: discipline, -- Błąd, gdy S.discipline - patrz opis wyżej season_id, SE.employee_ID Sports S INNER JOIN Sport_enrollment SE USING (discipline, season_id); Zamiast JOIN można użyć dłuższej, ale bardziej opisowej wersji INNER JOIN, która podkreśla, że chodzi o złączenie wewnętrzne (w odróżnieniu od omawianych za chwilę złączeń zewnętrznych). Oracle nie wymusza jednak tego, co jest niekonsekwencją, gdyż w złączeniach zewnętrznych odpowiednie słowo (OUTER JOIN), jest obowiązkowe. Należy więc przypuszczać, że wśród programistów zapanuje duża dowolność w jego stosowaniu. Klauzula USING istotnie zwiększa czytelność zapytania. Przykład 3a nowa składnia połączeń, druga wersja D.department_name, E.last_name ' ' e.first_name Name, S.discipline, S.season_ID Employees E, Departments D, Sport_enrollment S E.department_id = D.department_id AND E.employee_ID = S.employee_ID AND E.job_id = 'IT_PROG'; D.department_name, E.last_name ' ' e.first_name Name, S.discipline, S.season_ID Employees E INNER JOIN Departments D ON (E.department_id = D.department_id) INNER JOIN Sport_enrollment S ON (E.employee_ID = S.employee_ID) E.job_id = 'IT_PROG'; Sens zastosowania klauzuli ON sprowadza się jedynie do (eleganckiego) rozdzielenia warunków połączenia od innych warunków logicznych W tradycyjnej składni wszystkie warunki występowały razem w ramach klauzuli. Przykład 3b nowa składnia połączeń, porównanie ON oraz USING S.discipline, S.season_ID, SE.employee_ID Sports S, Sport_enrollment SE S.discipline = SE.discipline AND S.season_id = SE.season_id; -- wersja z USING discipline, -- tu alias zabroniony season_id, -- tu alias zabroniony SE.employee_ID Sports S INNER JOIN Sport_enrollment SE USING (discipline, season_id) -- wersja z ON S.discipline, -- tu alias obowiązkowy S.season_ID, -- tu alias obowiązkowy SE.employee_ID Sports S INNER JOIN Sport_enrollment SE ON S.discipline = SE.discipline AND S.season_id = SE.season_id;
9 Złączenia pułapki i nowe możliwości 267 Wersje z USING i ON są w tym przypadku równoważne, gdyż odpowiednie kolumny łączonych tabel mają takie same nazwy. W praktyce nie zawsze jednak ma to miejsce. Klauzula ON jest mniej czytelna od klauzuli USING. Mając wybór lepiej zastosować USING. W klauzuli ON może pojawić się dowolne wyrażenie logiczne. Niemniej w praktyce większość zapytań to zapytania równościowe (Equijoins), w których porównujemy odpowiednie kolumny dwóch tabel. zwracamy uwagę na obowiązkowość / niedozwoloność stosowania aliasów przy nazwach kolumn. Przykład 3c nowa składnia połączeń, połączenia wielokrotne S.discipline, S.season_ID, E.employee_ID, -- tu alias konieczny E.last_name Sports S, Sport_enrollment SE, Employees E S.discipline = SE.discipline AND S.season_id = SE.season_id AND E.employee_ID = SE.employee_ID discipline, season_id, employee_id, -- teraz tu alias zabroniony E.last_name Sports S INNER JOIN Sport_enrollment SE USING (discipline, season_id) INNER JOIN Employees E USING (employee_id) Połączenia wielokrotne są możliwe. INNER JOIN uwypukla kolejność połączeń wielokrotnych. Oracle domyślnie wykonuje połączenia w kierunku od lewej do prawej. Najpierw połączenie Sports z Sport_enrollment a następnie wynik tego połączenia z Employees. Można to jednak zmienić stosując w odpowiednim miejscu nawiasy. Przykład 4 - połączenia nierównościowe E.job_id, J.job_title, E.first_name ' ' E.last_name Name, J.min_salary '--' J.max_salary "Przedział", E.salary Employees E, Jobs J E.salary BETWEEN J.min_salary AND J.max_salary ORDER BY E.last_name; E.job_id, J.job_title, E.first_name ' ' E.last_name Name, J.min_salary '--' J.max_salary "Przedział", E.salary Employees E INNER JOIN Jobs J ON (E.salary BETWEEN J.min_salary AND J.max_salary) ORDER BY E.last_name; Przykład pokazuje połączenie nierównościowe (ang. Theta Joins). Zdecydowanie rzadziej używane niż połączenia równościowe. W powyższym przykładzie wyświetlono listę pracowników oraz, na bazie tabeli Jobs, sprawdzono, czy zarobki poszczególnych pracowników mieszczą się w widełkach. Można przykładowo zauważyć, że pracownik o nazwisku Abel, pracujący na stanowisku Sales Re-
10 268 Jarosław Gramacki, Artur Gramacki presentative (tego jednak z przestawionego zapytania nie odczytamy) zarabia kwotę 11000, która to kwota mieści się w przedziale dla pięciu innych stanowisk. Połączenie jest bardzo pracochłonne do wykonania. Wymaga najpierw utworzenia iloczynu kartezjańskiego a następnie wybraniu z niego wierszy, dla których zadany warunek jest spełniony. -- Wynik zapytania JOB_ID JOB_TITLE NAME Przedział SALARY SA_REP Finance Manager Ellen Abel ,00 SA_REP Accounting Manager Ellen Abel ,00 SA_REP Sales Representative Ellen Abel ,00 SA_REP Sales Manager Ellen Abel ,00 SA_REP Marketing Manager Ellen Abel ,00 SA_REP Purchasing Manager Ellen Abel ,00 SA_REP Accountant Sundar Ande ,00 SA_REP Public Accountant Sundar Ande , rows selected (Dla iloczynu kartezjańskiego 2033 rekordów) Przykład 5 - połączenia Antijoins -- Antijoins E.job_id, E.first_name ' ' E.last_name Name, E.salary Employees E department_id NOT IN ( department_id Departments location_id BETWEEN 1700 AND 2700); -- Antijoins Nie dotyczy -- Equijoins E.job_id, E.first_name ' ' E.last_name Name, E.salary Employees E, Departments D E.department_id = D.department_id AND D.location_ID NOT BETWEEN 1700 AND 2700; -- Equijoins E.job_id, E.first_name ' ' E.last_name Name, E.salary Employees E INNER JOIN Departments D USING (department_id) D.location_ID NOT BETWEEN 1700 AND 2700; -- Antijoins Plany wykonania STATEMENT FILTER TABLE ACCESS FULL EMPLOYEES TABLE ACCESS BY INDEX ROWID DEPARTMENTS INDEX RANGE SCAN DEPT_LOCATION_IX -- Equijoins STATEMENT CONCATENATION TABLE ACCESS BY INDEX ROWID EMPLOYEES
11 Złączenia pułapki i nowe możliwości 269 NESTED LOOPS TABLE ACCESS BY INDEX ROWID DEPARTMENTS INDEX RANGE SCAN DEPT_LOCATION_IX INDEX RANGE SCAN EMP_DEPARTMENT_IX TABLE ACCESS BY INDEX ROWID EMPLOYEES NESTED LOOPS TABLE ACCESS BY INDEX ROWID DEPARTMENTS INDEX RANGE SCAN DEPT_LOCATION_IX INDEX RANGE SCAN EMP_DEPARTMENT_IX Przykład pokazuje zapytanie, w którym interesuje nas BRAK zachodzenia danej relacji (połączenie Antijoins). Pokazano pracowników pracujących na wydziałach zlokalizowanych w wybranych lokalizacjach (poprzez negacje pozostałych). Dla Antijoins występuje podzapytanie. Nowa składnia jest wiec bezprzedmiotowa. Ten sam wynik osiągnąć można stosując zwykłe połączenia równościowe dwóch tabel. Plan wykonania zapytania Equijoins w stosunku do planu zapytania Antijoins będzie jednak bardziej złożony. W planie dla Antijoins występuje jednakże operacja TABLE ACCESS FULL. W konkurencyjnym planie wszędzie korzystamy z indeksów. Decyzję, czy użyć połączenia Antijoins, czy zwykłego równościowego Equijoins powinna poprzedzić analiza planu zapytania pod kątem ewentualnych korzyści / strat. Do tej pory nie zwracano uwagi na fakt, że wiele wierszy będących de facto oczekiwanym wynikiem zapytania, NIE zostanie wyświetlonych. Z reguły będzie tak z powodu istnienia pewnej ilości kolumn <foreign key> dopuszczających wartości NULL. W efekcie pewna ilość wierszy nie będzie spełniała warunków połączenia i nie pojawi się na ekranie. Błędy wynikające z istnienia w schemacie wspomnianych kolumn NULL są bardzo trudne do wykrycia, szczególnie gdy zapytanie zwraca dużą ilość danych. Do obsługi takich przypadków od dość dawna stosuje się tzw. złączenia zewnętrzne w kilku wersjach: lewostronne, prawostronne, pełne (ang. left outer join, right outer join, full outer join). Należy podkreślić, ze system Oracle wraz z pojawieniem się wersji 9i nie wprowadza jeśli chodzi o obsługę takich połączeń żadnych merytorycznych zmian 6. Istotnie jednak zmienia (upraszcza) odpowiednią do obsługi takich przypadków składnię SQL. Przykład 6 prawostronne połączenia zewnętrzne NVL(D.department_name, '???') Dept, SUM(E.salary) Sal Employees E, Departments D D.department_id(+) = E.department_id GROUP BY D.department_name; NVL(D.department_name, '???') Dept, SUM(E.salary) Sal Departments D RIGHT OUTER JOIN Employees E ON D.department_id = E.department_id GROUP BY D.department_name; Intencją zapytania było podsumowanie kosztów płacowych wydziałów. Brak prawostronnego złączenia zewnętrznego NIE uwzględni wypłat pracowników, którzy NIE są przypisani do jakiegokolwiek wydziału. 6 W dokumentacji wymienione są jednak pewne ograniczenia składni z (+), których nie ma w składni ANSI. Szczegóły patrz w [ORASQL].
12 270 Jarosław Gramacki, Artur Gramacki W przypadku tradycyjnej składni kolejność kolumn w klauzuli jest nieistotna. Wersja E.department_id = D.department_id(+) też będzie poprawna. Niestety wersja z warunkiem: Employees E RIGHT OUTER JOIN Departments D da już zupełnie inny wynik. Wynik będzie taki jak dla lewostronnego złączenia zewnętrznego czyli tak, jakby napisano: Employees E LEFT OUTER JOIN Departments D. Zamiana na ON E.department_id = D.department_id nie wprowadza podobnego niebezpieczeństwa. Podsumowania (klauzula GROUP BY) mogą w niezamierzony sposób zamaskować zarówno błędy w złączeniach relacyjnych jak i inne potknięcia programisty w klauzuli. W tym konkretnym przypadku błąd wynikający z braku (+) łatwo przeoczyć, gdyż liczba danych w tabelach jest stosunkowo duża i błędy nie są na pierwszy rzut oka widoczne. Podsumowywać więc należy tylko wtedy, gdy jesteśmy pewni, że podsumowujemy właściwe dane. Przykład 7 lewostronne połączenia zewnętrzne D.department_name Dept, NVL(SUM(E.salary), 0) Sal Employees E, Departments D D.department_id = E.department_id(+) GROUP BY D.department_name; D.department_name Dept, NVL(SUM(E.salary), 0) Sal Departments D LEFT OUTER JOIN Employees E ON D.department_id = E.department_id GROUP BY D.department_name; Intencją zapytania było wyświetlenie kosztów płacowych WSZYSTKICH wydziałów. Brak lewostronnego złączenia zewnętrznego NIE uwzględni na liście wydziałów, w których nikt nie pracuje. W przeciwieństwie do poprzedniego przykładu, problem jest tutaj innej natury. Dane, które otrzymamy, są co prawda poprawne (suma zgadza się), jednak błędny jest ich charakter informacyjny ( puste wydziały nie będą widoczne). Uwagi dotyczące kolejności argumentów operatora są takie same, jak w poprzednim przykładzie. Przykład 7b lewostronne połączenia zewnętrzne S.discipline, S.season_ID, SE.employee_ID Sports S, Sport_enrollment SE S.discipline = SE.discipline(+) AND S.season_id = SE.season_id(+); S.discipline, S.season_ID, SE.employee_ID Sports S LEFT OUTER JOIN Sport_enrollment SE ON S.discipline = SE.discipline AND S.season_id = SE.season_id; W wyniku wykonania zapytania pojawi się lista sekcji sportowych zarówno obsadzonych przez chociaż jednego pracownika, jak i tych, do których nie zapisał się żaden pracownik.
13 Złączenia pułapki i nowe możliwości 271 Tabela Sport_enrollment powinna zawierać podwójny klucz obcy: ALTER TABLE Sport_enrollment ADD CONSTRAINT xxx_fk FOREIGN KEY (discipline, season_id) REFERENCES Sports (discipline, season_id); Jak zostało jednak wspomniane na początku artykułu, nie został on w rzeczywistości utworzony lub jest nieaktywny. Fakt ten zostanie wykorzystany w kolejnym przykładzie. Obecny przykład pokazuje jedynie, że nie ma ograniczenia na ilość zewnętrznie łączonych kolumn z użyciem ON. Przykład 8 pełne połączenia zewnętrzne D.department_name Dept, NVL(SUM(E.salary), 0) Employees E, Departments D D.department_id = E.department_id(+) GROUP BY D.department_name NVL(D.department_name, '???') Dept, NVL(SUM(E.salary), 0) Sal Departments D FULL OUTER JOIN Employees E ON D.department_id = E.department_id GROUP BY D.department_name; UNION NVL(D.department_name, '???') Dept, SUM(E.salary) Employees E, Departments D D.department_id(+) = E.department_id GROUP BY D.department_name; Powyższy przykład jest jakby połączeniem poprzednich zapytań ilustrujących lewo i prawostronne połączenia zewnętrzne. W przeciwieństwie do poprzednich przykładów, nowa składnia ANSI istotnie upraszcza zapis. W przypadku tradycyjnej składni mamy możliwość użycia UNION lub UNION ALL. Nowa składnia NIE daje możliwości takiego wyboru. W wersji z UNION ALL otrzymamy co prawda wiele duplikatów, jednak zapytanie zostanie wykonane dużo bardziej efektywnie niż wersja z UNION, gdyż nie wykonuje się kosztowne SORT UNIQUE. Duplikaty można następnie próbować usunąć lokalnie, np. w aplikacji raportującej. Uwaga! Zgodnie z teorią relacyjną zamiana UNION i UNION ALL jest możliwa tylko wtedy, gdy UNION-owane zbiory nie mają wspólnych wierszy. W naszym przypadku warunek ten NIE występuje, jednak zgodnie z poprzednią uwagą zgodziliśmy się na duplikaty. Warunek taki spełnia na przykład poniższe zapytanie. Tu bezwzględnie preferowane będzie użycie UNION ALL: department_name, department_id Departments department_id > 100 UNION ALL
14 272 Jarosław Gramacki, Artur Gramacki department_name, department_id Departments department_id <= 100 ORDER BY 1; Przykład 8b pełne połączenia zewnętrzne, wersje z USING oraz ON S.discipline, S.season_ID, SE.employee_ID Sports S, Sport_enrollment SE S.discipline = SE.discipline(+) AND S.season_id = SE.season_id(+) UNION -- z USING -- wynik "BŁĘDNY" discipline, season_id, employee_id Sports S FULL OUTER JOIN Sport_enrollment SE USING (discipline, season_id) S.discipline, S.season_ID, SE.employee_ID Sports S, Sport_enrollment SE S.discipline(+) = SE.discipline AND S.season_id(+) = SE.season_id; -- z ON -- wynik "POPRAWNY" Zawartość tabel Sports oraz Sport_enrollment jest następująca: S.discipline, S.season_ID, SE.employee_ID Sports S FULL OUTER JOIN Sport_enrollment SE ON S.discipline = SE.discipline AND S.season_id = SE.season_id; select * from sports; DISCIPLINE SEASON_ID football 1 football 4 hockey 1 hockey 3 tennis 1 tennis 2 tennis 5 volleyball 1 volleyball 2 volleyball 4 10 rows selected select * from sport_enrollment; DISCIPLINE SEASON_ID EMPLOYEE_ID hockey tennis tennis Jak widać pracownik o numerze 105 zapisał się z wyprzedzeniem do sekcji tenisa na sezon 10. W tym sezonie tenis nie jest jednak (jeszcze) oferowany. Było to możliwe, gdyż nie istnieje odpowiedni klucz obcy lub jest on nieaktywny (była o tym mowa wcześniej). Wiele ofert uprawiania sportu nie zostało jeszcze wybranych. Aby pokazać je na wydruku zastosowano zwykłe pełne złączenie zewnętrzne FULL OUTER JOIN.
15 Złączenia pułapki i nowe możliwości 273 W wersji zapytania z USING konsekwencją użycia klauzuli USING jest w pewnym sensie błędny wynik. Jest on oczywiście zgodny z wpisanymi do tabel danymi, jednak niepoprawny merytorycznie, gdyż na jego podstawie otrzymamy mylące informacje. Dla wiersza tennis nie ma odpowiedniego wiersza w tabeli Sports. Warto również zauważyć, że nie mamy tu do czynienia z wartościami NULL w kolumnach. W klauzuli USING podano jedynie podług których kolumn ma odbywać się połączenie. discipline, season_id, employee_id Sports S FULL OUTER JOIN Sport_enrollment SE USING (discipline, season_id); DISCIPLINE SEASON_ID EMPLOYEE_ID hockey tennis volleyball 4 football 1 tennis 1 football 4 volleyball 1 hockey 3 tennis 5 volleyball 2 tennis rows selected W wersji zapytania z ON otrzymujemy wynik poprawny. Tu z kolei nie jest on zgodny z wpisanymi w bazie danymi, jednak jest poprawny merytorycznie (nie można zapisać się do nie oferowanej w danym sezonie sekcji). S.discipline, S.season_ID, SE.employee_ID Sports S FULL OUTER JOIN Sport_enrollment SE ON S.discipline = SE.discipline AND S.season_id = SE.season_id; DISCIPLINE SEASON_ID EMPLOYEE_ID hockey tennis tennis 5 volleyball 4 volleyball 2 football 1 football 4 volleyball 1 hockey 3 tennis rows selected W tradycyjnej składni opisane wyżej podobne dylematy nie mają miejsca. Zawsze otrzymujemy wynik jak dla wersji z ON. Przykład 9 iloczyn kartezjański D.department_name, L.city, departments D, locations L; D.department_name, L.city departments D CROSS JOIN locations L;
16 274 Jarosław Gramacki, Artur Gramacki Iloczyn kartezjański najczęściej pojawia się jako niezamierzony wynik (brak jakiegoś koniecznego połączenia). Nowa składnia wymaga jawnego wskazania, że intencją programisty był iloczyn kartezjański. Ponieważ jednak tradycyjna składnia ciągle jest (i pewnie będzie) obsługiwana przez bazę Oracle, więc praktyczna użyteczność CROSS JOIN w sensie eliminacji błędów jest dyskusyjna. Przykład 10 Self Joins employee_id, last_name, job_id, manager_id Employees; -- Fragment zawartości tabeli Employees EMPLOYEE_ID LAST_NAME JOB_ID MANAGER_ID King AD_PRES 101 Kochhar AD_VP De Haan AD_VP Hunold IT_PROG Ernst IT_PROG Austin IT_PROG Pataballa IT_PROG Lorentz IT_PROG Raphaely PU_MAN department_id NULL dla tego pracownika 115 Khoo PU_CLERK Kaufling ST_MAN Partners SA_MAN Errazuriz SA_MAN Cambrault SA_MAN King SA_REP Kumar SA_REP rows selected -- Składnia tradycyjna -- Dobrze E1.employee_ID, E1.last_name '''s boss: ' E2.last_name Kto_pod_kim, E1.manager_ID Employees E1, Employees E2 E2.employee_ID = E1.manager_ID AND E1.last_name LIKE 'K%' EMPLOYEE_ID KTO_POD_KIM MANAGER_ID Kaufling's boss: King Khoo's boss: Raphaely King's boss: Partners Kochhar's boss: King Kumar's boss: Cambrault rows selected Zle E1.employee_ID, E1.last_name '''s boss: ' E2.last_name Kto_pod_kim, E2.employee_ID Employees E1, Employees E2
17 Złączenia pułapki i nowe możliwości 275 E1.employee_ID = E2.manager_ID AND E1.last_name LIKE 'K%' EMPLOYEE_ID KTO_POD_KIM EMPLOYEE_ID Kaufling's boss: Mallin Kaufling's boss: Rogers Kaufling's boss: Gee Kaufling's boss: Philtanker Kaufling's boss: Chung Kaufling's boss: Dilly Kaufling's boss: Gates rows selected Użyto dwóch aliasów tej samej tabeli jest to obowiązkowe. Bardzo częsty błąd polega na późniejszym niewłaściwym użyciu tych aliasów. Porównaj wyniki obu zapytań. Możliwych błędów, będących efektem zamiany aliasów, jest więcej. Przykładowo kolejny, inny (jednak ciągle błędny) wynik otrzymamy, gdy ostatnia linia pierwszej wersji zapytania wyglądać będzie tak: E2.employee_ID = E1.manager_ID AND E2.last_name LIKE 'K%' Użycie nowej składni jest w części dyskusyjne. Wersja z USING, nie działa niestety poprawnie. Jedyną możliwością zwracającą poprawne wyniki jest użycie ON. Jak już jednak pokazano na wcześniejszych przykładach, użycie ON jedynie rozdziela warunki połączenia od innych warunków (np. zawężających) wyniki zapytania i w żadnym razie nie eliminuje wcześniej opisywanych błędów. -- Zle employee_id, E1.last_name '''s boss: ' E2.last_name Kto_pod_kim, manager_id Employees E1 INNER JOIN Employees E2 USING (employee_id, manager_id) E1.last_name LIKE 'K%'; -- Dobrze E1.employee_ID, E1.last_name '''s boss: ' E2.last_name Kto_pod_kim, E1.manager_ID Employees E1 INNER JOIN Employees E2 ON (E2.employee_ID = E1.manager_ID) E1.last_name LIKE 'K%'; Połączenia rekurencyjne w ramach jednej tabeli, jakkolwiek eleganckie, są bardzo podatne na błędy w zapytaniach. Przykład 11 zapytania hierarchiczne E.employee_ID, E.manager_ID, RPAD( RPAD(' ', 2*(LEVEL)-1, '.') E.first_name ' ' E.last_name, 30), D.department_name Employees E, Departments D E.department_ID = D.department_ID
18 276 Jarosław Gramacki, Artur Gramacki START WITH E.employee_ID = 114 CONNECT BY E.manager_ID = PRIOR E.employee_ID; 0 rows selected W wyniku wykonania zapytania nie zostanie zwrócony żaden wiersz. Powód - patrz komentarz przy danych zawartych w tabelce towarzyszącej przykładowi 10. Pierwszorzędne znaczenie ma tu kolejność wykonywanych przez Oracle czynności. Kolejność jest następująca: 1. Połączenie jest materializowane co oznacza, że w pierwszej kolejności brane są pod uwagę warunki połączenia. 2. Do zwróconych w punkcie 1. wierszy stosowana jest klauzula CONNECT BY. 3. Do zwróconych w punkcie 2. wierszy stosowana jest klauzula z innymi niż warunki połączenia elementami. Zawsze należy więc sprawdzać, czy warunek połączenia nie wyfiltrował nam koniecznych w zapytaniu hierarchicznym danych (tzw. korzenia, od którego pobierane są dane w hierarchii zlokalizowane poniżej). W naszym przypadku zniknął pracownik o numerze 114 i w konsekwencji wszyscy jego podwładni. Problem eliminuje zamiana wiersza E.department_ID = D.department_ID na E.department_ID = D.department_ID(+) -- Poprawny wynik zapytania MPLOYEE_ID MANAGER_ID NAME DEPARTMENT_NAME MAN- AGER_ID Hermann Baer Public Relations Shelley Higgins Accounting William Gietz Accounting Susan Mavris Human Resources Michael Hartstein Marketing Pat Fay Marketing rows selected Przykład 11b zapytania hierarchiczne -- E.employee_ID, E.manager_ID, RPAD( RPAD(' ', 2*(LEVEL)-1, '.') E.first_name ' ' E.last_name, 30) Name, D.department_name, D.manager_ID Employees E, Departments D E.department_ID = D.department_ID(+) AND D.manager_ID > 200 START WITH E.employee_ID = 100 CONNECT BY E.manager_ID = PRIOR E.employee_ID; EMPLOYEE_ID MANAGER_ID NAME DEPARTMENT_NAME MANAGER_ID
19 Złączenia pułapki i nowe możliwości rows selected Hermann Baer Public Relations Shelley Higgins Accounting William Gietz Accounting Susan Mavris Human Resources Michael Hartstein Marketing Pat Fay Marketing E.employee_ID, E.manager_ID, RPAD( RPAD(' ', 2*(LEVEL)-1, '.') E.first_name ' ' E.last_name, 30) Name, D.department_name, D.manager_ID Employees E LEFT OUTER JOIN Departments D ON E.department_ID = D.department_ID D.manager_ID > 200 START WITH E.employee_ID = 100 CONNECT BY E.manager_ID = PRIOR E.employee_ID; EMPLOYEE_ID MANAGER_ID NAME DEPARTMENT_NAME MANAGER_ID Susan Mavris Human Resources Hermann Baer Public Relations Shelley Higgins Accounting William Gietz Accounting Michael Hartstein Marketing Pat Fay Marketing rows selected Sortowanie zapytań hierarchicznych, ze względu na konieczność zachowania podległości, nie jest bezpośrednio możliwe 7. Niestety analogiczne jak wydawałoby się zapytanie w notacji ANSI, zwraca wynik inaczej posortowany. Na szczęście hierarchia jest zachowana poprawnie. 5. Wnioski W artykule pokazano, że z pozoru proste zagadnienia jakim są połączenia relacyjne, po uwzględnieniu wielu zagadnień szczegółowych, stają się podatne na błędy. Jeśli dodatkowo uwzględni się możliwość korzystania z nowej składni ANSI, ewentualnych problemów przybędzie. SQL nie zawsze jest w 100% odpowiednikiem składni dotychczasowej. Warto o tym zawsze pamiętać. Dużo miejsca poświęcono zagadnieniu istnienia w tabelach kolumn NULL. Pokazano, że jest to często bardzo niebezpieczne. Łatwo wyobrazić sobie sytuację, gdy z dobrodziejstwa nie wpisania wartości do kolumny skorzystamy długo po napisaniu np. aplikacji raportującej. Jeśli na etapie jej powstawania nie uwzględnimy tego faktu, to któregoś dnia raport po prostu wyprodukuje błędne / mylące wyniki. Innymi słowy dopiero po jakimś czasie, na skutek modyfikacji danych, z których korzysta zapytanie, pojawi się błąd. Bibliografia 7 Oracle 9i wprowadza jednak zmodyfikowaną klauzulę ORDER SIBLING BY, która sortuje wyniki z zachowaniem hierarchii.
20 278 Jarosław Gramacki, Artur Gramacki [HRSchema] Oracle Database, Sample Schemas, 10g Release 1 (10.1), Part No. B [Genni00] Gennick J.: An Incremental Approach to Developing SQL Queries. Oracle Magazine, July/August 2000, Volume XIV, Issue 4 [Czupr03] Czuprynski J.: Getting ANSI About Joins, dostępne na otn.oracle.com [ORASQL] Oracle Database SQL Reference 10g Release 1 (10.1) Part Number B
Złączenia wewnętrzne w bazach danych
Rozdział 23 Złączenia wewnętrzne w bazach danych Streszczenie. W rozdziale pokazano problemy związane ze stosowaniem złączeń (ang. joins) tabel w modelu relacyjnym. Pozornie proste złączenia (kanon pracy
Aliasy Select p.first_name, p.salary, j.job_title from employees p, jobs j where p.job_id=j.job_id;
Dane z kilku tabel Aliasy Select p.first_name, p.salary, j.job_title from employees p, jobs j where p.job_id=j.job_id; Łączenie kilku selectów w jeden posortowany wynik 1. UNION suma bez powtórzeń. Powoduje,
Grupowanie i funkcje agregacji. Grupowanie z użyciem rollup
Grupowanie i funkcje agregacji Grupowanie z użyciem rollup Funkcje agregujące: COUNT([DISTINCT] wyrażenie *), MIN(wyrażenie), MAX(wyrażenie), SUM([DISTINCT] wyrażenie), AVG([DISTINCT] wyrażenie). Klauzula
Grupowanie i funkcje agregacji
Grupowanie i funkcje agregacji Funkcje agregujące: COUNT([DISTINCT] wyrażenie *), MIN(wyrażenie), MAX(wyrażenie), SUM([DISTINCT] wyrażenie), AVG([DISTINCT] wyrażenie). Klauzula GROUP BY Grupowanie polega
Język SQL. Rozdział 5. Połączenia i operatory zbiorowe
Język SQL. Rozdział 5. Połączenia i operatory zbiorowe Iloczyn kartezjański, połączenie równościowe, połączenie nierównościowe, połączenie zwrotne, połączenie zewnętrzne, składnia jawna połączeń, składnia
Język SQL Złączenia. Laboratorium. Akademia Morska w Gdyni
Akademia Morska w Gdyni Gdynia 2004 1. Złączenie definicja Złączenie (JOIN) to zbiór rekordów stanowiących wynik zapytania służącego pobraniu danych z połączonych tabel (związki jeden-do-jeden, jeden-do-wiele
3. Podzapytania, łączenie tabel i zapytań
3. Podzapytania, łączenie tabel i zapytań I. PODZAPYTANIE (SUBSELECT) oddzielna, ujęta w nawiasy instrukcja SELECT, zagnieżdżona w innej instrukcji SQL, zazwyczaj w instrukcji SELECT w instrukcji SELECT,
Wykład 6. SQL praca z tabelami 3
Wykład 6 SQL praca z tabelami 3 Łączenie wyników zapytań Język SQL zawiera mechanizmy pozwalające na łączenie wyników kilku pytań. Pozwalają na to instrukcje UNION, INTERSECT, EXCEPT o postaci: zapytanie1
Autor: Joanna Karwowska
Autor: Joanna Karwowska Jeśli pobieramy dane z więcej niż jednej tabeli, w rzeczywistości wykonujemy tak zwane złączenie. W SQL istnieją instrukcje pozwalające na formalne wykonanie złączenia tabel - istnieje
Integralność danych Wersje języka SQL Klauzula SELECT i JOIN
Integralność danych Wersje języka SQL Klauzula SELECT i JOIN Robert A. Kłopotek r.klopotek@uksw.edu.pl Wydział Matematyczno-Przyrodniczy. Szkoła Nauk Ścisłych, UKSW Integralność danych Aspekty integralności
Bazy Danych II. Ćwiczenia
Bazy Danych II. Ćwiczenia Bartosz Zieliński 16 kwietnia 2011 Spis treści 1 Powtórzenie SQL 3 1.1 Tworzenie i usuwanie tabel........................ 3 1.2 Wstawianie danych do tabel........................
Marek Rakowski Zdanie SELECT wybieranie danych z wielu tabel Strona 1 z 6
Marek Rakowski Zdanie SELECT wybieranie danych z wielu tabel Strona 1 z 6 Wybieranie danych z wielu tabel polega na użyciu więcej niż jednej tabeli w klauzuli FROM i, najczęściej, kolumn z więcej niż jednej
Wstęp 5 Rozdział 1. Podstawy relacyjnych baz danych 9
Wstęp 5 Rozdział 1. Podstawy relacyjnych baz danych 9 Tabele 9 Klucze 10 Relacje 11 Podstawowe zasady projektowania tabel 16 Rozdział 2. Praca z tabelami 25 Typy danych 25 Tworzenie tabel 29 Atrybuty kolumn
Systemy GIS Tworzenie zapytań w bazach danych
Systemy GIS Tworzenie zapytań w bazach danych Wykład nr 6 Analizy danych w systemach GIS Jak pytać bazę danych, żeby otrzymać sensowną odpowiedź......czyli podstawy języka SQL INSERT, SELECT, DROP, UPDATE
Przestrzenne bazy danych Podstawy języka SQL
Przestrzenne bazy danych Podstawy języka SQL Stanisława Porzycka-Strzelczyk porzycka@agh.edu.pl home.agh.edu.pl/~porzycka Konsultacje: wtorek godzina 16-17, p. 350 A (budynek A0) 1 SQL Język SQL (ang.structured
Paweł Rajba pawel@ii.uni.wroc.pl http://www.itcourses.eu/
Paweł Rajba pawel@ii.uni.wroc.pl http://www.itcourses.eu/ Wprowadzenie Historia i standardy Podstawy relacyjności Typy danych DDL tabele, widoki, sekwencje zmiana struktury DML DQL Podstawy, złączenia,
Złączenie CROSS JOIN jest to tzw. złączenie krzyżowe, którego ogólna postać wygląda następująco:
Połączenia krzyżowe Złączenie typu CROSS JOIN Złączenie CROSS JOIN jest to tzw. złączenie krzyżowe, którego ogólna postać wygląda następująco: SELECT kolumna1, kolumna2,..., kolumnan FROM tabela1 CROSS
Wprowadzenie do projektowania i wykorzystania baz danych Relacje
Wprowadzenie do projektowania i wykorzystania baz danych Relacje Katarzyna Klessa Dygresja nt. operatorów SELECT 2^2 SELECT 2^30 SELECT 50^50 2 Dygresja nt. operatorów SELECT 2^30 --Bitwise exclusive OR
Wykład 8. SQL praca z tabelami 5
Wykład 8 SQL praca z tabelami 5 Podzapytania to mechanizm pozwalający wykorzystywać wyniki jednego zapytania w innym zapytaniu. Nazywane często zapytaniami zagnieżdżonymi. Są stosowane z zapytaniami typu
Struktura drzewa w MySQL. Michał Tyszczenko
Struktura drzewa w MySQL Michał Tyszczenko W informatyce drzewa są strukturami danych reprezentującymi drzewa matematyczne. W naturalny sposób reprezentują hierarchię danych toteż głównie do tego celu
opisuje nazwy kolumn, wyrażenia arytmetyczne, funkcje nazwy tabel lub widoków warunek (wybieranie wierszy)
Zapytania SQL. Polecenie SELECT jest używane do pobierania danych z bazy danych (z tabel lub widoków). Struktura polecenia SELECT SELECT FROM WHERE opisuje nazwy kolumn, wyrażenia arytmetyczne, funkcje
Podzapytania. Rozdział 5. Podzapytania. Podzapytania wyznaczające wiele krotek (1) Podzapytania wyznaczające jedną krotkę
Podzapytania Rozdział 5 Podzapytania podzapytania proste i skorelowane, podzapytania w klauzuli SELECT i FROM, klauzula WITH, operatory ANY, ALL i EXISTS, zapytania hierarchiczne Podzapytanie jest poleceniem
Podstawy języka SQL. standardy SQL formułowanie zapytań operacje na strukturach danych manipulowanie danymi. Bazy danych s.5-1
Podstawy języka SQL standardy SQL formułowanie zapytań operacje na strukturach danych manipulowanie danymi Bazy danych s.5-1 Język SQL SQL (ang. Structured Query Language, strukturalny język zapytań) język
Język SQL. Rozdział 2. Proste zapytania
Język SQL. Rozdział 2. Proste zapytania Polecenie SELECT, klauzula WHERE, operatory SQL, klauzula ORDER BY. 1 Wprowadzenie do języka SQL Język dostępu do bazy danych. Język deklaratywny, zorientowany na
Laboratorium Bazy danych SQL 2
Klauzula order by występuje jako ostatnia klauzula w poleceniu select, powoduje posortowanie wierszy będących wynikiem zapytania według wartości atrybutu w niej wskazanego. Domyślnie sortowanie jest według
Konstruowanie Baz Danych SQL UNION, INTERSECT, EXCEPT
Studia podyplomowe Inżynieria oprogramowania współfinansowane przez Unię Europejska w ramach Europejskiego Funduszu Społecznego Projekt Studia podyplomowe z zakresu wytwarzania oprogramowania oraz zarządzania
Bazy danych. Andrzej Grzybowski. Instytut Fizyki, Uniwersytet Śląski
Bazy danych Andrzej Grzybowski Instytut Fizyki, Uniwersytet Śląski Wykład 5 Strukturalny język zapytań (SQL - Structured Query Language) Algebraiczny rodowód podstawowe działania w przykładach Bazy danych.
Podstawy języka SQL Co to jest SQL? Możliwości SQL SQL*Plus
Podstawy języka SQL Co to jest SQL? Structured Query Language uchodzi za standard języka zapytań kierowanych do systemu zarządzania bazą danych. SQL jest językiem deklaratywnym tj. takim, w którym istotne
Technologie baz danych
Plan wykładu Technologie baz danych Wykład 6: Algebra relacji. SQL - cd Algebra relacji operacje teoriomnogościowe rzutowanie selekcja przemianowanie Małgorzata Krętowska Wydział Informatyki Politechnika
Podzapytania. Rozdział 5. Podzapytania. Podzapytania wyznaczające wiele krotek (1) Podzapytania wyznaczające jedną krotkę
Podzapytania Rozdział 5 Podzapytania podzapytania proste i skorelowane, podzapytania w klauzuli SELECT i FROM, klauzula WITH, operatory ANY, ALL i EXISTS, zapytania hierarchiczne Podzapytanie jest poleceniem
Optymalizacja poleceń SQL Metody dostępu do danych
Optymalizacja poleceń SQL Metody dostępu do danych 1 Metody dostępu do danych Określają, w jaki sposób dane polecenia SQL są odczytywane z miejsca ich fizycznej lokalizacji. Dostęp do tabeli: pełne przeglądnięcie,
Oracle11g: Wprowadzenie do SQL
Oracle11g: Wprowadzenie do SQL OPIS: Kurs ten oferuje uczestnikom wprowadzenie do technologii bazy Oracle11g, koncepcji bazy relacyjnej i efektywnego języka programowania o nazwie SQL. Kurs dostarczy twórcom
77. Modelowanie bazy danych rodzaje połączeń relacyjnych, pojęcie klucza obcego.
77. Modelowanie bazy danych rodzaje połączeń relacyjnych, pojęcie klucza obcego. Przy modelowaniu bazy danych możemy wyróżnić następujące typy połączeń relacyjnych: jeden do wielu, jeden do jednego, wiele
1 Wstęp do modelu relacyjnego
Plan wykładu Model relacyjny Obiekty relacyjne Integralność danych relacyjnych Algebra relacyjna 1 Wstęp do modelu relacyjnego Od tego się zaczęło... E. F. Codd, A Relational Model of Data for Large Shared
Laboratorium nr 8. Temat: Podstawy języka zapytań SQL (część 2)
Laboratorium nr 8 Temat: Podstawy języka zapytań SQL (część 2) PLAN LABORATORIUM: 1. Sortowanie. 2. Warunek WHERE 3. Eliminacja powtórzeń - DISTINCT. 4. WyraŜenia: BETWEEN...AND, IN, LIKE, IS NULL. 5.
Indeksowanie w bazach danych
w bazach Katedra Informatyki Stosowanej AGH 5grudnia2013 Outline 1 2 3 4 Czym jest indeks? Indeks to struktura, która ma przyspieszyć wyszukiwanie. Indeks definiowany jest dla atrybutów, które nazywamy
Relacyjne bazy danych. Podstawy SQL
Relacyjne bazy danych Podstawy SQL Język SQL SQL (Structured Query Language) język umożliwiający dostęp i przetwarzanie danych w bazie danych na poziomie obiektów modelu relacyjnego tj. tabel i perspektyw.
1 DML - zapytania, część II Grupowanie Operatory zbiorowe DML - modyfikacja 7. 3 DCL - sterowanie danymi 9.
Plan wykładu Spis treści 1 DML - zapytania, część II 1 1.1 Grupowanie................................... 1 1.2 Operatory zbiorowe............................... 5 2 DML - modyfikacja 7 3 DCL - sterowanie
PRZESTRZENNE BAZY DANYCH WYKŁAD 2
PRZESTRZENNE BAZY DANYCH WYKŁAD 2 Baza danych to zbiór plików, które fizycznie przechowują dane oraz system, który nimi zarządza (DBMS, ang. Database Management System). Zadaniem DBMS jest prawidłowe przechowywanie
Instytut Mechaniki i Inżynierii Obliczeniowej Wydział Mechaniczny technologiczny Politechnika Śląska
Instytut Mechaniki i Inżynierii Obliczeniowej www.imio.polsl.pl fb.com/imiopolsl @imiopolsl Wydział Mechaniczny technologiczny Politechnika Śląska Laboratorium 3 (Tworzenie bazy danych z użyciem UML, proste
Microsoft SQL Server Podstawy T-SQL
Itzik Ben-Gan Microsoft SQL Server Podstawy T-SQL 2012 przełożył Leszek Biolik APN Promise, Warszawa 2012 Spis treści Przedmowa.... xiii Wprowadzenie... xv Podziękowania... xix 1 Podstawy zapytań i programowania
Podstawy języka SQL cz. 2
Podstawy języka SQL cz. 2 1. Operatory zbiorowe a. UNION suma zbiorów z eliminacją powtórzeń, b. EXCEPT różnica zbiorów z eliminacją powtórzeń, c. INTERSECT część wspólna zbiorów z eliminacją powtórzeń.
Zbiór pytań nr 2. 1 Tabela DEPARTMENTS ma następującą strukturę:
Zbiór pytań nr 2 1 Tabela DEPARTMENTS ma następującą strukturę: Nazwa kolumny Typ danych Uwagi dept_id NUMBER(4) NOT NULL, PRIMARY KEY dept_name VARCHAR2(30) mgr_id NUMBER(6) location_id NUMBER(4) Które
Wprowadzenie do języka SQL
Wprowadzenie do języka SQL język dostępu do bazy danych grupy poleceń języka: DQL (ang( ang.. Data Query Language) DML (ang( ang.. Data Manipulation Language) DDL (ang( ang.. Data Definition Language)
Laboratorium nr 10. Temat: Połączenia relacji
Laboratorium nr 10 Temat: Połączenia relacji Dotychczas omawiane zapytania zawsze dotyczyły jednej relacji. MoŜliwe jest jednak pisanie zapytań, które odczytują i łączą dane z wielu relacji. Celem tego
Zarzadzanie transakcjami. Transakcje
Transakcje Transakcja: ciąg zawierający jedno lub wiele poleceń SQL, zgrupowanych razem jako jedna logiczna jednostka działań, której nie można podzielić. Logiczna jednostka działań to zbiór logicznych
Rozpatrzymy bardzo uproszczoną bazę danych o schemacie
Wykład 6 Algebraiczne podstawy implementacji strukturalnego języka zapytań (SQL) w systemach baz danych Oracle zapytania w języku algebry relacyjnych baz danych i ich odpowiedniki w SQL Rozpatrzymy bardzo
Technologie baz danych
Plan wykładu Technologie baz danych Wykład 2: Relacyjny model danych - zależności funkcyjne. SQL - podstawy Definicja zależności funkcyjnych Reguły dotyczące zależności funkcyjnych Domknięcie zbioru atrybutów
Model relacyjny. Wykład II
Model relacyjny został zaproponowany do strukturyzacji danych przez brytyjskiego matematyka Edgarda Franka Codda w 1970 r. Baza danych według definicji Codda to zbiór zmieniających się w czasie relacji
Instytut Mechaniki i Inżynierii Obliczeniowej Wydział Mechaniczny technologiczny Politechnika Śląska
Instytut Mechaniki i Inżynierii Obliczeniowej www.imio.polsl.pl fb.com/imiopolsl @imiopolsl Wydział Mechaniczny technologiczny Politechnika Śląska Laboratorium 3 (Tworzenie bazy danych z użyciem UML, proste
PRZEWODNIK PO PRZEDMIOCIE
Nazwa przedmiotu: Bazy danych Database Kierunek: Rodzaj przedmiotu: obieralny Rodzaj zajęć: wykład, laboratorium Matematyka Poziom kwalifikacji: I stopnia Liczba godzin/tydzień: 2W, 2L Semestr: III Liczba
SQL SERVER 2012 i nie tylko:
SQL SERVER 2012 i nie tylko: Wstęp do planów zapytań Cezary Ołtuszyk coltuszyk.wordpress.com Kilka słów o mnie Starszy Administrator Baz Danych w firmie BEST S.A. (Bazy danych > 1TB) Konsultant z zakresu
Bazy danych 10. SQL Widoki
Bazy danych 10. SQL Widoki P. F. Góra http://th-www.if.uj.edu.pl/zfs/gora/ semestr letni 2005/06 Widoki, AKA Perspektywy W SQL tabela, która utworzono za pomoca zapytania CREATE TABLE, nazywa się tabela
Instytut Mechaniki i Inżynierii Obliczeniowej fb.com/groups/bazydanychmt/
Instytut Mechaniki i Inżynierii Obliczeniowej www.imio.polsl.pl fb.com/imiopolsl @imiopolsl fb.com/groups/bazydanychmt/ Wydział Mechaniczny technologiczny Politechnika Śląska Laboratorium 3 (Tworzenie
Podyplomowe Studia Systemy informatyczne w logistyce
MATERIAŁY SZKOLENIOWE Podyplomowe Studia Systemy informatyczne w logistyce Hurtownie danych w informatycznych systemach logistycznych (MS SQL Server 2012) PROWADZĄCY: Marcin Pieleszek Projekt współfinansowany
Tworzenie tabeli przez select CREATE TABLE PRAC2 AS SELECT P.NAZWISKO, Z.NAZWA FROM PRAC P NATURAL JOIN ZESP Z
Tworzenie tabeli Np. create table nazwa_tab( \\stworzenie tabeli Id numer(4) constraint PRAC_PK primary key, \\ustawiamy klucz podst. Nazwisko varchar2(30), \\typ tekstowy 30 znaków Kwota number(10,2)
Podstawy języka T-SQL : Microsoft SQL Server 2016 i Azure SQL Database / Itzik Ben-Gan. Warszawa, Spis treści
Podstawy języka T-SQL : Microsoft SQL Server 2016 i Azure SQL Database / Itzik Ben-Gan. Warszawa, 2016 Spis treści Wprowadzenie Podziękowania xiii xvii 1 Podstawy zapytań i programowania T-SQL 1 Podstawy
BAZY DANYCH LABORATORIUM. Studia niestacjonarne I stopnia
BAZY DANYCH LABORATORIUM Studia niestacjonarne I stopnia Gdańsk, 2011 1. Cel zajęć Celem zajęć laboratoryjnych jest wyrobienie praktycznej umiejętności tworzenia modelu logicznego danych a nastepnie implementacji
Grupowanie i funkcje agregujące
Grupowanie i funkcje agregujące Zadanie 1. Stwórz odpowiednią tabelę Test_agr i wprowadź odpowiednie rekordy tak, aby wynik zapytania SELECT AVG(kol) avg_all, AVG(DISTINCT kol) avg_dist, COUNT(*) count_gw,
PODZAPYTANIE (SUBSELECT)
2. Podzapytania PODZAPYTANIE (SUBSELECT) oddzielna, ujęta w nawiasy instrukcja SELECT, zagnieżdżona w innej instrukcji SQL, zazwyczaj w instrukcji SELECT W instrukcji SELECT, podzapytanie może być umieszczone
Model relacyjny. Wykład II
Model relacyjny został zaproponowany do strukturyzacji danych przez brytyjskiego matematyka Edgarda Franka Codda w 1970 r. Baza danych według definicji Codda to zbiór zmieniających się w czasie relacji
Wykład XII. optymalizacja w relacyjnych bazach danych
Optymalizacja wyznaczenie spośród dopuszczalnych rozwiązań danego problemu, rozwiązania najlepszego ze względu na przyjęte kryterium jakości ( np. koszt, zysk, niezawodność ) optymalizacja w relacyjnych
Wykład 2. Relacyjny model danych
Wykład 2 Relacyjny model danych Wymagania stawiane modelowi danych Unikanie nadmiarowości danych (redundancji) jedna informacja powinna być wpisana do bazy danych tylko jeden raz Problem powtarzających
SQL (ang. Structured Query Language)
SQL (ang. Structured Query Language) SELECT pobranie danych z bazy, INSERT umieszczenie danych w bazie, UPDATE zmiana danych, DELETE usunięcie danych z bazy. Rozkaz INSERT Rozkaz insert dodaje nowe wiersze
Instytut Mechaniki i Inżynierii Obliczeniowej fb.com/groups/bazydanychmt/
Instytut Mechaniki i Inżynierii Obliczeniowej www.imio.polsl.pl fb.com/imiopolsl @imiopolsl fb.com/groups/bazydanychmt/ Wydział Mechaniczny technologiczny Politechnika Śląska Laboratorium 4 (Asocjacje,
D D L S Q L. Co to jest DDL SQL i jakie s jego ą podstawowe polecenia?
D D L S Q L Co to jest DDL SQL i jakie s jego ą podstawowe polecenia? D D L S Q L - p o d s t a w y DDL SQL (Data Definition Language) Jest to zbiór instrukcji i definicji danych, którym posługujemy się
Przykłady najlepiej wykonywać od razu na bazie i eksperymentować z nimi.
Marek Robak Wprowadzenie do języka SQL na przykładzie baz SQLite Przykłady najlepiej wykonywać od razu na bazie i eksperymentować z nimi. Tworzenie tabeli Pierwsza tabela W relacyjnych bazach danych jedna
Marek Rakowski Podstawy zdania SELECT Strona 1 z 12
Marek Rakowski Podstawy zdania SELECT Strona 1 z 12 Podstawy języka SQL Co to jest SQL? Structured Query Language uchodzi za standard języka zapytań kierowanych do systemu zarządzania bazą danych. SQL
Podzapytania. Rozdział 5. Podzapytania. Podzapytania wyznaczające wiele krotek (1) Podzapytania wyznaczające jedną krotkę
Podzapytania Rozdział 5 Podzapytania podzapytania proste i skorelowane, podzapytania w klauzuli SELECT i FROM, klauzula WITH, operatory ANY, ALL i EXISTS, zapytania hierarchiczne Podzapytanie jest poleceniem
Pawel@Kasprowski.pl Bazy danych. Bazy danych. Podstawy języka SQL. Dr inż. Paweł Kasprowski. pawel@kasprowski.pl
Bazy danych Podstawy języka SQL Dr inż. Paweł Kasprowski pawel@kasprowski.pl Plan wykładu Relacyjne bazy danych Język SQL Zapytania SQL (polecenie select) Bezpieczeństwo danych Integralność danych Współbieżność
Złaczenia tablic: FROM, WHERE, JOIN
JOIN Łączenie tablic 1 Bazy Danych Wykład p.t. Złaczenia tablic: FROM, WHERE, JOIN Antoni Ligęza ligeza@agh.edu.pl http://galaxy.uci.agh.edu.pl/~ligeza Wykorzystano materiały: http: //www.postgresql.org/docs/8.3/interactive/index.html
Wykład 5. SQL praca z tabelami 2
Wykład 5 SQL praca z tabelami 2 Wypełnianie tabel danymi Tabele można wypełniać poprzez standardową instrukcję INSERT INTO: INSERT [INTO] nazwa_tabeli [(kolumna1, kolumna2,, kolumnan)] VALUES (wartosc1,
Instytut Mechaniki i Inżynierii Obliczeniowej Wydział Mechaniczny Technologiczny Politechnika Śląska
Instytut Mechaniki i Inżynierii Obliczeniowej www.imio.polsl.pl fb.com/imiopolsl @imiopolsl Wydział Mechaniczny Technologiczny Politechnika Śląska Laboratorium 1 Wprowadzenie, podstawowe informacje o obsłudze
Język SQL. instrukcja laboratoryjna. Politechnika Śląska Instytut Informatyki. laboratorium Bazy Danych
Politechnika Śląska Instytut Informatyki instrukcja laboratoryjna laboratorium Bazy Danych przygotowali: mgr inż. Paweł Kasprowski (Kasprowski@zti.iinf.polsl.gliwice.pl) mgr inż. Bożena Małysiak (bozena@ivp.iinf.polsl.gliwice.pl)
Język SQL. Rozdział 9. Język definiowania danych DDL, część 2.
Język SQL. Rozdział 9. Język definiowania danych DDL, część 2. Ograniczenia integralnościowe, modyfikowanie struktury relacji, zarządzanie ograniczeniami. 1 Ograniczenia integralnościowe Służą do weryfikacji
koledzy, Jan, Nowak, ul. Niecała 8/23, , Wrocław, , ,
Celem ćwiczeń jest zaprojektowanie oraz utworzenie na serwerze bazy danych przechowującej informacje na temat danych kontaktowych. Celem jest również zapoznanie z podstawowymi zapytaniami języka SQL służącymi
Cel przedmiotu. Wymagania wstępne w zakresie wiedzy, umiejętności i innych kompetencji 1 Język angielski 2 Inżynieria oprogramowania
Przedmiot: Bazy danych Rok: III Semestr: V Rodzaj zajęć i liczba godzin: Studia stacjonarne Studia niestacjonarne Wykład 30 21 Ćwiczenia Laboratorium 30 21 Projekt Liczba punktów ECTS: 4 C1 C2 C3 Cel przedmiotu
SELECT * FROM tabela WHERE warunek wybiera dane spełniające podany warunek
SELECT SELECT kolumna1, kolumna2,, kolumnan FROM tabela wybrane kolumny SELECT * FROM tabela wszystkie kolumny select * from Orders select CustomerID, CompanyName, Country from Customers WHERE SELECT *
SIECI KOMPUTEROWE I BAZY DANYCH
KATEDRA MECHANIKI I ROBOTYKI STOSOWANEJ WYDZIAŁ BUDOWY MASZYN I LOTNICTWA, POLITECHNIKA RZESZOWSKA SIECI KOMPUTEROWE I BAZY DANYCH Laboratorium DB2: TEMAT: Relacyjne bazy danych Cz. I, II Cel laboratorium
select zam_id, cena_euro,(rank() over (partition by zam_id order by cena_euro)) from pozycjezamowien order by zam_id
See also: OLAP.mth Suma narastająco... 1 Min max w poszczególnych grupach... 1 Numeracja elementów w grupach... 1 KLAUZULE GROUP BY, GROUP BY CUBE, GROUP BY ROLLUP... 1 MATERIAŁ ROBOCZY... 5 First VALUE
Modelowanie hierarchicznych struktur w relacyjnych bazach danych
Modelowanie hierarchicznych struktur w relacyjnych bazach danych Wiktor Warmus (wiktorwarmus@gmail.com) Kamil Witecki (kamil@witecki.net.pl) 5 maja 2010 Motywacje Teoria relacyjnych baz danych Do czego
Wykład 3 2014-04-25 12:45 BD-1 W_3
Wykład 3 SQL - język operacji na bazach danych Schemat przykładowej bazy danych Uczelnia Skrypt SQL - utworzenie bazy Uczelnia Polecenia selekcji i projekcji Interakcyjny dostęp do bazy danych 2014-04-25
Bazy danych. Plan wykładu. Zależności funkcyjne. Wykład 2: Relacyjny model danych - zależności funkcyjne. Podstawy SQL.
Plan wykładu Bazy danych Wykład 2: Relacyjny model danych - zależności funkcyjne. Podstawy SQL. Deficja zależności funkcyjnych Klucze relacji Reguły dotyczące zależności funkcyjnych Domknięcie zbioru atrybutów
QUERY język zapytań do tworzenia raportów w AS/400
QUERY język zapytań do tworzenia raportów w AS/400 Dariusz Bober Katedra Informatyki Politechniki Lubelskiej Streszczenie: W artykule przedstawiony został język QUERY, standardowe narzędzie pracy administratora
Ogranicz listę klasyfikacji budżetowych do powiązanych z danym kontem księgowym
Zależności i kontrola danych budżetowych w systemie Sz@rk FK 1. Wstęp Począwszy od wersji Sz@rk FK 2011 (11.03.30) wprowadzono do programu finansowoksięgowego nowe możliwości dotyczące kontrolowania poprawności
Zasady transformacji modelu DOZ do projektu tabel bazy danych
Zasady transformacji modelu DOZ do projektu tabel bazy danych A. Obiekty proste B. Obiekty z podtypami C. Związki rozłączne GHJ 1 A. Projektowanie - obiekty proste TRASA # * numer POZYCJA o planowana godzina
SQL w 24 godziny / Ryan Stephens, Arie D. Jones, Ron Plew. Warszawa, cop Spis treści
SQL w 24 godziny / Ryan Stephens, Arie D. Jones, Ron Plew. Warszawa, cop. 2016 Spis treści O autorach 11 Podziękowania 12 Część I Wprowadzenie do języka SQL 13 Godzina 1. Witamy w świecie języka SQL 15
Cwiczenie 4. Połączenia, struktury dodatkowe
Cwiczenie 4. Połączenia, struktury dodatkowe Optymalizacja poleceń SQL 1 W niniejszym ćwiczeniu przyjrzymy się, w jaki sposób realizowane są operacje połączeń w poleceniach SQL. Poznamy również dodatkowe
Algebra relacji. nazywamy każdy podzbiór iloczynu karteziańskiego D 1 D 2 D n.
Algebra relacji Definicja 1 (Relacja matematyczna). Relacją R między elementami zbioru D 1 D 2 D n, gdzie przypomnijmy D 1 D 2 D n = {(d 1, d 2,..., d n ) : d i D i, i = 1, 2,..., n}, nazywamy każdy podzbiór
Zarządzanie obiektami bazy danych Oracle11g
Zarządzanie obiektami bazy danych Oracle11g Wstęp Obiekty to struktury przechowujące, porządkujące lub operujące na danych takie jak: Tabele Więzy integralności Indeksy Widoki Sekwencje Procedury Linki
Język SQL, zajęcia nr 1
Język SQL, zajęcia nr 1 SQL - Structured Query Language Strukturalny język zapytań Login: student Hasło: stmeil14 Baza danych: st https://194.29.155.15/phpmyadmin/index.php Andrzej Grzebielec Najpopularniejsze
Relacyjne bazy danych. Podstawy SQL
Relacyjne bazy danych Podstawy SQL Język SQL SQL (Structured Query Language) język umoŝliwiający dostęp i przetwarzanie danych w bazie danych na poziomie obiektów modelu relacyjnego tj. tabel i perspektyw.
Podstawowym zadaniem, które realizuje
Funkcje wyszukiwania i adresu INDEKS Mariusz Jankowski autor strony internetowej poświęconej Excelowi i programowaniu w VBA; Bogdan Gilarski właściciel firmy szkoleniowej Perfect And Practical; Pytania:
Bazy danych. Dr inż. Paweł Kasprowski
Plan wykładu Bazy danych Podstawy relacyjnego modelu danych Dr inż. Paweł Kasprowski pawel@kasprowski.pl Relacyjne bazy danych Język SQL Zapytania SQL (polecenie select) Bezpieczeństwo danych Integralność
2010-10-21 PLAN WYKŁADU BAZY DANYCH MODEL DANYCH. Relacyjny model danych Struktury danych Operacje Integralność danych Algebra relacyjna HISTORIA
PLAN WYKŁADU Relacyjny model danych Struktury danych Operacje Integralność danych Algebra relacyjna BAZY DANYCH Wykład 2 dr inż. Agnieszka Bołtuć MODEL DANYCH Model danych jest zbiorem ogólnych zasad posługiwania
NORTHWIND. Anonco.pl. ćwiczenia praktyczne. KiK s Tutorials. NORTHWIND dwiczenia praktyczne. ANONCO.PL/SQL SQLSERVERDLAOPORNYCH.WORDPRESS.
Anonco.pl NORTHWIND dwiczenia praktyczne. NORTHWIND ćwiczenia praktyczne KiK s Tutorials Spis treści Część 1. Wprowadzenie 3 Wprowadzenie do SQL Server 3 Rozpoczynamy pracę z SQL Server 4 Część 2. Typy
Teoretyczne podstawy informatyki
Teoretyczne podstawy informatyki Wykład 8b: Algebra relacyjna http://hibiscus.if.uj.edu.pl/~erichter/dydaktyka2009/tpi-2009 Prof. dr hab. Elżbieta Richter-Wąs 1 Algebra relacyjna Algebra relacyjna (ang.
Szkolenie autoryzowane. MS Tworzenie zapytań do Microsoft SQL Server Strona szkolenia Terminy szkolenia Rejestracja na szkolenie Promocje
Szkolenie autoryzowane MS 10774 Tworzenie zapytań do Microsoft SQL Server 2012 Strona szkolenia Terminy szkolenia Rejestracja na szkolenie Promocje Opis szkolenia Uwaga! Szkolenie wycofane z oferty. Zapraszamy
Laboratorium nr 5. Temat: Funkcje agregujące, klauzule GROUP BY, HAVING
Laboratorium nr 5 Temat: Funkcje agregujące, klauzule GROUP BY, HAVING Celem ćwiczenia jest zaprezentowanie zagadnień dotyczących stosowania w zapytaniach języka SQL predefiniowanych funkcji agregujących.