Ćwiczenie 2 funkcje wierszowe

Podobne dokumenty
Język SQL. Rozdział 3. Zaawansowana selekcja danych

Funkcje. Rozdział 3a Funkcje wierszowe. Funkcje znakowe (1) Funkcje wierszowe

Język SQL. Rozdział 3. Funkcje wierszowe

Funkcje. Rozdział 3. Funkcje. Funkcje znakowe (1) Funkcje wierszowe

2. Język SQL SQL jest językiem deklaratywnym (Charakterystyczną cechą języków

Ćwiczenie 3 funkcje agregujące

PL/SQL. Funkcje wbudowane

Laboratorium nr 5. Temat: Funkcje agregujące, klauzule GROUP BY, HAVING

Wymagania: Konstrukcja prostych zapytań w języku SQL, umiejętność wykorzystania funkcji wierszowych i agregujących.

Laboratorium nr 8. Temat: Podstawy języka zapytań SQL (część 2)

Przestrzenne bazy danych Podstawy języka SQL

Język SQL. Rozdział 2. Proste zapytania

Podstawy SQL. 1. Wyświetl całość informacji z relacji ZESPOLY. 2. Wyświetl całość informacji z relacji PRACOWNICY

Autor: Joanna Karwowska

Ćwiczenie rozpocznie się od wprowadzenia do laboratorium, po którym omówimy składnię ę polecenia INSERT pozwalającego ą na wstawianie krotek do

Język SQL. Rozdział 5. Połączenia i operatory zbiorowe

SQL do zaawansowanych analiz danych część 1.

Ćwiczenie 5 podzapytania

Wprowadzania liczb. Aby uniknąć wprowadzania ułamka jako daty, należy poprzedzać ułamki cyfrą 0 (zero); np.: wpisać 0 1/2

Biuletyn techniczny CDN OPT!MA Copyright 2006 COMARCH SA

Laboratorium nr 7. Temat: Podstawy języka zapytań SQL (część 1) 1. Wprowadzenie do laboratorium

Przydatne sztuczki - sql. Na przykładzie postgres a.

Podstawy języka SQL cz. 2

Ściągawka z funkcji i właściwości systemowych VBA. Opis działania i parametrów. Nazwa funkcji. Składnia zwracanej wartości

Ćwiczenie 14 autoryzacja

Wstęp 5 Rozdział 1. Podstawy relacyjnych baz danych 9

Bazy danych. Andrzej Łachwa, UJ, /14

Laboratorium nr 10. Temat: Połączenia relacji

Język SQL. Rozdział 9. Język definiowania danych DDL, cześć 1. Tworzenie relacji, typy danych, wartości domyślne atrybutów, słownik bazy danych.

Samodzielnie wykonaj następujące operacje: 13 / 2 = 30 / 5 = 73 / 15 = 15 / 23 = 13 % 2 = 30 % 5 = 73 % 15 = 15 % 23 =

WyŜsza Szkoła Zarządzania Ochroną Pracy MS EXCEL CZ.2

osiągnął długość podaną jako drugi parametr. Jeśli wynik jest dłuższy niż zadeklarowana długość, zostaje ucięty z prawej strony.

PROJEKT CZĘŚCIOWO FINANSOWANY PRZEZ UNIĘ EUROPEJSKĄ. Opis działania raportów w ClearQuest

Biuletyn techniczny. Funkcje dodatkowe dla Clarion Report Writer CDN OPT!MA Copyright 2006 COMARCH S.A.

Podzapytania. Rozdział 5. Podzapytania. Podzapytania wyznaczające wiele krotek (1) Podzapytania wyznaczające jedną krotkę

Relacyjne bazy danych. Podstawy SQL

Arytmetyka komputera. Na podstawie podręcznika Urządzenia techniki komputerowej Tomasza Marciniuka. Opracował: Kamil Kowalski klasa III TI

Administracja i programowanie pod Microsoft SQL Server 2000

Bazy danych 7/15. Andrzej Łachwa, UJ,

Laboratorium Bazy danych SQL 2

SQL - Structured Query Language -strukturalny język zapytań SQL SQL SQL SQL

Bazy danych 2. Wykład 4 Structured Query Language (SQL)

Oracle11g: Wprowadzenie do SQL

Autor: dr inż. Katarzyna Rudnik

Wprowadzenie do języka SQL

a) Polecenie: Wyświetl wszystkie rekordy z tabeli Pracownicy (wszystkie atrybuty)

1. Napisz program, który wyświetli Twoje dane jako napis Witaj, Imię Nazwisko. 2. Napisz program, który wyświetli wizytówkę postaci:

Kolekcje Zbiory obiektów, rodzaje: tablica o zmiennym rozmiarze (ang. varray) (1) (2) (3) (4) (5) Rozszerzenie obiektowe w SZBD Oracle

Bloki anonimowe w PL/SQL

Podzapytania. Rozdział 5. Podzapytania. Podzapytania wyznaczające wiele krotek (1) Podzapytania wyznaczające jedną krotkę

Oracle PL/SQL. Paweł Rajba.

Systemy GIS Tworzenie zapytań w bazach danych

Ćwiczenie zapytań języka bazy danych PostgreSQL

Język SQL. Rozdział 6. Podzapytania Podzapytania proste i skorelowane, podzapytania w klauzuli SELECT i FROM, operatory ANY, ALL i EXISTS.

Kod znak-moduł. Wartość liczby wynosi. Reprezentacja liczb w kodzie ZM w 8-bitowym formacie:

Ćwiczenie 13 PL/SQL. Język PL/SQL procedury, funkcje, pakiety, wyzwalacze

Przykłady zastosowań funkcji tekstowych w arkuszu kalkulacyjnym

JAVAScript w dokumentach HTML (1) JavaScript jest to interpretowany, zorientowany obiektowo, skryptowy język programowania.

Zagadnienia podstawowe

Łączenie liczb i tekstu.

opisuje nazwy kolumn, wyrażenia arytmetyczne, funkcje nazwy tabel lub widoków warunek (wybieranie wierszy)

4. Funkcje. Przykłady

Szkolenie Oracle SQL podstawy. Terminy lutego 2010 First Minute! 1100zł!

Ćwiczenie 11 PL/SQL. Wprowadzenie do języka PL/SQL

Język SQL. Rozdział 4. Funkcje grupowe Funkcje grupowe, podział relacji na grupy, klauzule GROUP BY i HAVING.

Celem ćwiczenia jest wprowadzeniem do programowaniu w języku PL/SQL. Język PL/SQL umoŝliwia tworzenie programów, przetwarzających dane w bazie danych.

SSK - Techniki Internetowe

DECLARE <nazwa_zmiennej> typ [(<rozmiar> )] [ NOT NULL ] [ { := DEFAULT } <wartość> ];

Klasyczna Analiza Danych

Przegląd podstawowych funkcji Excel.

Cw.12 JAVAScript w dokumentach HTML

Ćwiczenie 4 - połączenia

Przedmiot: Urządzenia techniki komputerowej Nauczyciel: Mirosław Ruciński

Ćwiczenie 1 podstawy

1 Podstawy c++ w pigułce.

Wstęp do informatyki- wykład 2

Wstęp do SQL. copyright: KGiIS WGGiOŚ AGH

Metoda znak-moduł (ZM)

Podzapytania. Rozdział 5. Podzapytania. Podzapytania wyznaczające wiele krotek (1) Podzapytania wyznaczające jedną krotkę

Bazy danych Access KWERENDY

Optymalizacja poleceń SQL Metody dostępu do danych

Zadania SELECT do schematu EDS (EMP, DEPT, SALGRADE)

Wykład 9. Cel wykładu. Literatura. WyŜsza Szkoła MenedŜerska w Legnicy. Informatyka w zarządzaniu Zarządzanie, zaoczne, sem. 3. MS Excel data i czas

XQuery. sobota, 17 grudnia 11

Systemy zapisu liczb.

SQL, LIKE, IN, CASE, EXISTS. Marcin Orchel

Bazy danych. Plan wykładu. Zależności funkcyjne. Wykład 2: Relacyjny model danych - zależności funkcyjne. Podstawy SQL.

Zapytania do bazy danych

Wykład 5 Charakterystyka języka SQL. Elementy obliczeń relacyjnych.

Zajęcia 2 podstawy języka SQL

Technologie baz danych

Opis: Instrukcja warunkowa Składnia: IF [NOT] warunek [AND [NOT] warunek] [OR [NOT] warunek].

Wykład 8 Implementacja języka SQL w systemach baz danych Oracle specyficzne konstrukcje i funkcje Oracle SQL, funkcje numeryczne, znakowe, daty i

LABORATORIUM PROCESORY SYGNAŁOWE W AUTOMATYCE PRZEMYSŁOWEJ. Zasady arytmetyki stałoprzecinkowej oraz operacji arytmetycznych w formatach Q

Urządzenia Techniki. Klasa I TI. System dwójkowy (binarny) -> BIN. Przykład zamiany liczby dziesiętnej na binarną (DEC -> BIN):

Microsoft SQL Server Podstawy T-SQL

Zmienne powłoki. Wywołanie wartości następuje poprzez umieszczenie przed nazwą zmiennej znaku dolara ($ZMIENNA), np. ZMIENNA=wartosc.

Bazy danych 6. SQL funkcje daty i czasu, zmienne tymczasowe, aliasy

Transkrypt:

Ćwiczenie 2 funkcje wierszowe Funkcje wierszowe, operatory zbiorowe Ćwiczenie 2 funkcje wierszowe Celem ćwiczenia jest zaprezentowanie zagadnień dotyczących stosowania w zapytaniach języka SQL predefiniowanych funkcji wierszowych oraz budowy poleceń z wykorzystaniem operatorów zbiorowych. Wymagania: Umiejętność konstrukcji prostych zapytań w języku SQL. 1

Plan ćwiczenia Funkcje wierszowe i agregujące. Funkcje znakowe. Funkcje liczbowe. Funkcje operujące na elementach czasowych. Funkcje konwersji. WyraŜenie CASE. Stosowanie operatorów zbiorowych. Ćwiczenie 2 funkcje wierszowe (2) Na początku ćwiczenia zostanie omówiona koncepcja stosowania funkcji w poleceniach SQL. Kolejne zagadnienie to podział funkcji na funkcje wierszowe i agregujące. W bieŝącym ćwiczeniu zajmiemy się jedynie funkcjami wierszowymi. Omówienie funkcji wierszowych zostanie przeprowadzone z zachowaniem podziału funkcji wierszowych na grupy w zaleŝności od typów danych, na których funkcje operują. Rozpoczniemy od funkcji znakowych, następnie przedstawione zostaną funkcje liczbowe, funkcje operujące na elementach czasowych oraz funkcje konwersji. Kolejnym zagadnieniem, poruszanym w ćwiczeniu, będzie zastosowanie wyraŝenia CASE w konstrukcji zapytań. Ćwiczenie zakończymy omówieniem stosowania operatorów zbiorowych. 2

Funkcje Przekształcają dane, pobrane przez zapytanie, lub wyliczają nowe dane. Podział ze względu na zakres działania: funkcje wierszowe, funkcje agregujące. Podział ze względu na pochodzenie: funkcje predefiniowane, funkcje uŝytkownika. Ćwiczenie 2 funkcje wierszowe (3) Bardzo często dane, odczytywane przez zapytania w języku SQL z bazy danych, wymagają dodatkowego przetworzenia przed prezentacją uŝytkownikowi. Niekiedy konieczne jest wyliczenie przez zapytanie nowych wartości, nieobecnych w bazie danych. Przykładami takich operacji są: zamiana wszystkich liter w nazwisku pracownika na wielkie, zaokrąglenie płacy podstawowej pracownika do złotych, odczytanie roku z daty zatrudnienia pracownika czy teŝ wyliczenie sumy płac pracowników zespołu. Funkcja moŝe mieć róŝnych zakres działania. Jeśli funkcja operuje na wartościach atrybutów, znajdujących się w tym samym rekordzie, wówczas jest to tzw. funkcja wierszowa. Z kolei jeśli funkcja operuje na wartościach atrybutów z róŝnych rekordów, wyliczając na tej podstawie nową wartość, wówczas jest to tzw. funkcja agregująca. Funkcjami agregującymi zajmiemy się w ćwiczeniu 3. System zarządzania bazą danych zwykle dostarcza uŝytkownikowi zbiór predefiniowanych funkcji, od razu gotowych do uŝycia. UŜytkownik moŝe do tego zbioru dodać swoje własne funkcje, wykorzystując w tym celu język PL/SQL (dokładnie omówienie języka PL/SQL i mechanizmów tworzenia funkcji uŝytkownika zostanie zamieszczone w ćwiczeniach: 11, 12 i 13.). W niniejszym ćwiczeniu ograniczymy się jedynie do przedstawienia funkcji predefiniowanych. 3

Funkcje wierszowe - rodzaje Funkcje znakowe. Funkcje liczbowe. Funkcje operujące na elementach czasowych. Funkcje konwersji. Inne konstrukcje. Ćwiczenie 2 funkcje wierszowe (4) Rozpoczniemy teraz omawianie najczęściej stosowanych funkcji wierszowych. Funkcje zostaną przedstawione z podziałem ze względu na typ danych, na jakich funkcje działają. Funkcje znakowe jako parametr pobierają ciąg (lub ciągi) znaków, a wyliczają nowe ciągi znaków (np. funkcja dokonująca zamiany liter w ciągu znaków na wielkie) bądź wartości liczbowe (np. funkcja wyliczająca długość ciągu znaków). Funkcje liczbowe jako parametry pobierają liczby i zwracają liczby po przekształceniach (np. funkcja zaokrąglająca daną liczbę do dwóch miejsc po przecinku). Kolejna grupa funkcji, funkcje operujące na elementach czasowych, bądź przekształcają datę podaną jako parametr do innej daty (np. funkcja zwracająca datę, jaka przypadnie od daty podanej jako parametr za trzy miesiące) bądź zwracają wartości liczbowe (np. funkcja wyliczająca liczbę miesięcy pomiędzy dwiema datami). Inne funkcje z tej grupy to np. funkcje operujące na przedziałach czasowych, nazywanych takŝe interwałami czasowymi, pozwalające na uzyskanie z przedziału czasowego określonego elementu. Z kolei funkcje konwersji pozwalają na przekształcenie danych jednego typu na dane innego typu (np. funkcja przekształcająca ciąg znaków na liczbę). Zostaną równieŝ przedstawione dodatkowe konstrukcje wykorzystywane w zapytaniach. 4

Funkcje wierszowe - uŝycie UŜycie: SELECT atrybut_1, funkcja_a(wyraŝenie_1, wyraŝenie_2) as as wynik FROM nazwa_relacji WHERE funkcja_b(wyraŝenie_3) operator wyraŝenie_4...... ORDER BY BYfunkcja_C; Ćwiczenie 2 funkcje wierszowe (5) Funkcja wierszowa moŝe zostać uŝyta we wszystkich klauzulach zapytania SQL. Omówimy to na zaprezentowanym przykładowym zapytaniu, w którym zastosowano trzy funkcje. Funkcja o nazwie funkcja_a, umieszczona w klauzuli SELECT, posiada dwa parametry o nazwach wyraŝenie_1 oraz wyraŝenie_2 i wylicza wartość, która zostanie zaprezentowana w wyniku zapytania jako dodatkowy atrybut o nazwie zdefiniowanej przez alias wynik. Jednoparametrowa (wyraŝenie_3) funkcja o nazwie funkcja_b została uŝyta w warunku selekcji w klauzuli WHERE do filtrowania rekordów, odczytywanych przez zapytanie. Wynik funkcji zostanie porównany z wyraŝeniem_4 przez uŝycia operatora. Wynik działania ostatniej, bezparametrowej funkcji o nazwie funkcja_c, zostaje uŝyty do posortowania rekordów w zbiorze wynikowym zapytania. ZauwaŜmy, Ŝe w wywołaniu funkcji bezparametrowej opuszczamy nawiasy. 5

Funkcje znakowe (1) lower(ciąg_znaków) zwraca ciąg_znaków ze wszystkimi literami zamienionymi na małe, upper(ciąg_znaków) zwraca ciąg_znaków ze wszystkimi literami zamienionymi na wielkie, initcap(ciąg_znaków) zwraca ciąg_znaków z pierwszymi literami słów zamienionymi na wielkie, pozostałe litery zamienione zostają na małe, trim([[ {leading trailing both}] znak from] ciąg_znaków) usuwa z początku (leading) lub końca (trailing) ciągu_znaków wszystkie wystąpienia podanego znaku Ćwiczenie 2 funkcje wierszowe (6) Przejdziemy teraz do omówienia predefiniowanych funkcji znakowych. Pierwsza grupa funkcji pozwala na zamianę wielkości liter w ciągu znaków. Funkcja lower(ciąg_znaków) zamienia w podanym jako parametr ciągu znaków wszystkie litery na małe, funkcja upper(ciąg_znaków) dokonuje zamiany w ciągu znaków wszystkich liter na wielkie, z kolei funkcja initcap(ciąg_znaków) przekształca ciąg znaków w ten sposób, Ŝe wszystkie litery zostają zamienione na małe, z wyjątkiem pierwszych liter wszystkich słów w ciągu, które zostają przekształcone na wielkie litery. Kolejna funkcja, trim(leading trailing both znak from ciąg_znaków), pozwala na usunięcie z początku lub końca ciągu znaków wszystkich wystąpień wskazanego znaku. Słowo leading wskazuje, Ŝe mają zostać usunięte wszystkie wystąpienia znaku na początku ciągu znaków, słowo trailing wszystkie wystąpienia z końca. Słowo both określa, Ŝe mają zostać usunięte wystąpienia znaku zarówno na początku, jak i na końcu ciągu znaków. Dopuszczalne jest wywołanie funkcji bez określenia miejsca usuwania znaków, wówczas domyślnie przyjmowane jest słowo both. Z kolei pominięcie w wywołaniu funkcji określenia znaku (parametr znak) powoduje usuniecie spacji. 6

Funkcje znakowe (1) przykłady SELECT nazwa, lower(nazwa), upper(nazwa), initcap(nazwa) FROM zespoly WHERE nazwa = 'BADANIA OPERACYJNE'; LOWER(NAZWA) badania operacyjne UPPER(NAZWA) BADANIA OPERACYJNE INITCAP(NAZWA) Badania Operacyjne SELECT trim(leading 'A' 'A' from from nazwa) as as A, A, trim(trailing 'A' 'A' from from nazwa) as as B, B, trim(both 'A' 'A' from from nazwa) as asc FROM zespoly WHERE nazwa = 'ADMINISTRACJA'; A DMINISTRACJA B ADMINISTRACJ C DMINISTRACJ Ćwiczenie 2 funkcje wierszowe (7) Zaprezentowane przykłady prezentują zastosowanie zdefiniowanych na poprzednim slajdzie funkcji. 7

Funkcje znakowe (2) substr(ciąg_znaków, m [, n]) zwraca część ciągu_znaków od pozycji m o długości n, replace(ciąg_znaków, ciąg_1 [, ciąg_2]) zamienia w ciągu_znaków wszystkie wystąpienia ciągu_1 na ciąg_2, translate(ciąg_znaków, ciąg_1, ciąg_2) zamienia w ciągu_znaków litery z ciągu_1 na odpowiadające im litery z ciągu_2, length(ciąg_znaków) zwraca długość ciągu_znaków. Ćwiczenie 2 funkcje wierszowe (8) Kolejna grupa funkcji znakowych pozwala na wycinanie i zastępowanie poszczególnych podciągów w ciągu znaków. Funkcja substr posiada trzy parametry: ciąg_znaków, m i opcjonalny parametr n. Funkcja zwraca podciąg ciągu_znaków, rozpoczynający się od pozycji m i mający długość n (w przypadku opuszczenia parametru n podciąg zawiera wszystkie pozycje wyjściowego ciągu_znaków począwszy od pozycji m do końca). Funkcja replace pozwala na podmianę w ciągu znaków, będącym pierwszym parametrem funkcji (ciąg_znaków), wszystkich wystąpień podciągu, przekazanego jako drugi parametr (ciąg_1) na podciąg przekazany jako trzeci parametr (ciąg_2). W przypadku pominięcia w wywołaniu funkcji trzeciego parametru, podciąg ciąg_1 jest usuwany z wyjściowego ciągu znaków. Kolejna funkcja o nazwie translate równieŝ słuŝy podmianie elementów wyjściowego ciągu znaków (parametr ciąg_znaków), jednak tym razem podmiana nie zachodzi dla podciągów, ale dla pojedynczych znaków w ciągu wyjściowym. Znaki, które mają zostać zamienione, zostają podane w ciągu przekazanym jako drugi parametr funkcji (ciąg_1), natomiast znaki, które mają je zastąpić, przekazuje trzeci parametr (ciąg_2). N-ty znak umieszczony w ciąg_1 zostaje zastąpiony w ciągu_znaków przez n-ty znak umieszczony w ciąg_2. Ostatnia omawiania funkcja znakowa, funkcja length, dla ciągu znaków przekazanego jako parametr wylicza jego długość. 8

Funkcje znakowe (2) przykłady SELECT nazwa, replace(nazwa, 'EKSPERCKIE', 'BADAWCZE') as as A, A, FROM zespoly WHERE substr(nazwa, 9) 9) = 'EKSPERCKIE'; NAZWA SYSTEMY EKSPERCKIE A SYSTEMY BADAWCZE SELECT nazwa, translate(nazwa, 'EY','AX') as as B, B, length(nazwa) as as C FROM zespoly WHERE substr(nazwa, 1, 1, 7) 7) = 'SYSTEMY'; NAZWA SYSTEMY EKSPERCKIE SYSTEMY ROZPROSZONE B SXSTAMX AKSPARCKIA SXSTAMX ROZPROSZONA C 18 19 Ćwiczenie 2 funkcje wierszowe (9) BieŜący slajd przedstawia przykłady zastosowań omawianych na poprzednim slajdzie funkcji znakowych. 9

Funkcje liczbowe abs(n) wartość bezwzględna liczby n, ceil(n) najmniejsza liczba całkowita >= n, floor(n) największa liczba całkowita <= n, mod(n, m) reszta z dzielenia n przez m, power(n, m) n podniesione do potęgi m, round(n [,m]) zaokrągla n do m miejsc po przecinku, trunc(n [,m]) obcina n do m miejsc po przecinku, sign(n) zwraca 1 dla n>0, 0 dla n = 0 oraz -1 dla n< 0, sqrt(n) pierwiastek kwadratowy n. Ćwiczenie 2 funkcje wierszowe (10) Przedstawiona teraz zostanie kolejna grupa funkcji, tym razem operujących na liczbach. Funkcja abs zwraca wartość bezwzględną liczby, przekazanej jako parametr. Funkcja ceil wylicza najmniejszą liczbę całkowitą większą bądź równą od liczby, będącej parametrem funkcji. Z kolei funkcja floor zwraca największą liczbę całkowitą mniejszą lub równą od liczby, przekazanej jako parametr funkcji. Za pomocą funkcji mod wyliczymy resztę z dzielenia liczby n (pierwszy parametr) przez liczbę m (drugi parametr). Funkcja power umoŝliwia podniesienie do m-tej potęgi (drugi parametr) liczby n (pierwszy parametr). Funkcja round słuŝy do zaokrąglania wg reguł matematycznych liczby przekazanej jako pierwszy parametr. Liczbę pozycji ułamkowych zaokrąglanej liczby określa drugi, opcjonalny parametr funkcji. Pominięcie tego parametru powoduje zaokrąglenie n do liczby całkowitej. Analogicznie działa funkcji trunc, z tym Ŝe nie zaokrągla liczby, ale obcina do Ŝądanej ilości pozycji ułamkowych. Kolejna funkcja, funkcja sign, zwraca wartość 1 jeśli liczba, przekazana jako parametr, jest liczbą ujemną. W przypadku liczby dodatniej funkcja zwraca wartość 1, natomiast dla liczby równej 0 zwraca wartość 0. Ostatnia z omawianych funkcji matematycznych, funkcja sqrt, pozwala wyliczyć pierwiastek kwadratowy liczby przekazanej jako parametr. 10

Funkcje liczbowe przykłady SELECT placa_pod, ceil(placa_pod), floor(placa_pod) FROM pracownicy WHERE nazwisko = 'Makowski'; PLACA_POD 2610,2 CEIL(PLACA_POD) 2611 FLOOR(PLACA_POD) 2610 SELECT placa_pod/30 as as A, A, round(placa_pod/30,3) as as B, B, trunc(placa_pod/30,3) as as C FROM pracownicy WHERE nazwisko = 'Dolny'; A 61,6666667 B 61,667 C 61,666 Ćwiczenie 2 funkcje wierszowe (11) Przykłady omówionych wcześniej funkcji liczbowych przedstawia niniejszy slajd. 11

Reprezentacja czasu (1) DATE data z dokładnością do dni (w SZBD Oracle do sekund), zakres: ANSI 01.01.0001 r.n.e. do 31.12.9999 r.n.e. SZBD Oracle 01.01.4712 r.p.n.e. do 31.12.9999 r.n.e., TIME czas z dokładnością do części ułamkowych sekundy (brak w SZBD Oracle), TIMESTAMP znacznik czasowy, połączenie DATE i TIME (zakres analogicznie jak DATE), przykład: 2006/07/04 13:07:25,185729 +02:00 Ćwiczenie 2 funkcje wierszowe (12) Reprezentacja czasu w systemie zarządzania bazą danych jest złoŝonym problemem. Wielu producentów dostarcza róŝne typy danych, słuŝących do przechowywania elementów czasowych. Podstawowym typem danych jest typ DATE. W standardzie SQL-99 typ ten umoŝliwia przechowywanie dat z zakresu 1 stycznia 1 r.n.e. do 31 grudnia 9999 r.n.e. Z kolei w SZBD Oracle typ DATE przechowuje nie tylko datę, ale równieŝ określenie momentu czasowego z dokładnością do pełnych sekund. Inny jest równieŝ zakres dopuszczalnych wartości typu DATE w SZBD Oracle zakres ten rozpoczyna się od 1 stycznia 4712 r.p.n.e. i trwa do 31 grudnia 9999 r.n.e. Standard SQL-99 definiuje typ TIME, słuŝący do przechowywania czasu z dokładnością do części ułamkowych sekundy. Brak implementacji tego typu w SZBD Oracle. Kolejny typ danych, TIMESTAMP, słuŝy do przechowywania tzw. znaczników czasowych. Znacznik czasowy przechowuje dokładne określenie momentu w czasie, a więc datę i czas z dokładnością do ułamkowych części sekundy, dodatkowo dla czasu składowane jest równieŝ przesunięcie strefy czasowej. 12

Reprezentacja czasu (2) INTERVAL przedział czasu, rodzaje: przedział dni do sekund, przykład: +000000011 00:10:00.000000000 11 dni i 10 min, dni hh mi ss ułamki sekundy przedział lata do miesięcy, przykład: +000000010-11 10 lat i 11 miesięcy lata miesiące Ćwiczenie 2 funkcje wierszowe (13) Kolejny typ danych, INTERVAL, pozwala na przechowywanie w bazie danych przedziałów czasowych (okresów). MoŜliwa jest definicja dwóch rodzajów przedziałów czasowych. Pierwszy z nich, przedział dni do sekund, pozwala na składowanie przedziału wyraŝonego w dniach, godzinach, minutach, sekundach i częściach ułamkowych sekund. NaleŜy zwrócić uwagę na predefiniowane separatory poszczególnych pozycji w przedziale tego rodzaju (patrz slajd). Drugi rodzaj przedziału czasowego, przedział lata do miesięcy, składuje okres wyraŝony w latach i miesiącach. Tutaj domyślnym separatorem pozycji jest znak - (myślnik). Przedział czasowy nie musi wykorzystywać wszystkich elementów np. przedział dni do sekund moŝe korzystać jedynie z godzin i minut, jeśli przechowywany okres nie jest długi (nie zawiera dni) i nie wymaga większej precyzji (sekund i części ułamkowych sekundy). 13

Odczyt czasu current_date odczyt bieŝącej daty, sysdate odczyt bieŝącej daty (tylko SZBD Oracle), current_time odczyt bieŝącego czasu (tylko ANSI), current_timestamp odczyt bieŝącego znacznika czasowego. SELECT current_date, current_timestamp...... CURRENT_DATE 2006.07.04 CURRENT_TIMESTAMP 2006/07/04 13:07:25,185729 +02:00 Ćwiczenie 2 funkcje wierszowe (14) BieŜący slajd przedstawia zestaw predefiniowanych funkcji, pozwalających na odczyt bieŝącego czasu z SZBD. Funkcja current_date zwraca bieŝącą datę systemową (wartość typu DATE). W SZBD Oracle ten sam efekt moŝna uzyskać stosując równieŝ funkcję sysdate (pamiętajmy, Ŝe DATE w SZBD Oracle zawiera równieŝ czas). Funkcja current_time odczytuje bieŝący czas systemowy. Ta funkcja nie jest zaimplementowana w SZBD Oracle. Funkcja current_timestamp pozwala na odczytanie wartości bieŝącego systemowego znacznika czasowego. 14

Literały czasowe (1) DATE reprezentuje datę w formacie rrrr-mm-dd, TIME reprezentuje czas w formacie gg:mi:ss[.nnnnnn], TIMESTAMP reprezentuje znacznik czasowy w formacie rrrr-mm-dd gg:mi:ss[.nnnnnn]. SELECT nazwisko FROM pracownicy WHERE zatrudniony = DATE '1993-09-01'; Ćwiczenie 2 funkcje wierszowe (15) Elementy czasowe w systemie bazy danych składowane są w róŝnych formatach w zaleŝności od rozwiązań zastosowanych przez producenta. Z kolei narzędzia do definiowania i wykonywania zapytań do bazy danych mogą stosować róŝne formaty prezentacji elementów czasowych (np. data w formacie dd.mm.rrrr albo w formacie rr-nazwa_miesiąca-dd). Powstaje problem jak skonstruować zapytanie, które będzie niezaleŝne od stosowanego przez narzędzie formatu prezentacji elementów czasowych. Rozwiązaniem jest zastosowanie w zapytaniu odpowiednich literałów czasowych. Literał DATE słuŝy do wskazania, Ŝe ciąg znaków, wymieniony bezpośrednio za słowem DATE, prezentuje datę w formacie rrrr-mm-dd. Z kolei literał TIME pozwala na zdefiniowanie momentu czasowego z dokładnością do ułamkowych części sekundy. Stosowany format to gg:mi:ss[.nnnnnn] (części ułamkowe sekund są opcjonalne). Do definicji znacznika czasowego słuŝy literał TIMESTAMP, tutaj format to rrrr-mm-dd gg:mi:ss[.nnnnnn]. Prezentowane na slajdzie zapytanie pozwala na wyszukanie w zbiorze pracowników osób, zatrudnionych 1 września 1993 r. Zapytanie to, dzięki zastosowaniu literału DATE, jest niewraŝliwe na stosowany przez narzędzie domyślny format daty. 15

Literały czasowe (2) INTERVAL reprezentuje przedział czasowy, postać: INTERVAL okres kw_pocz [TO kw_koniec] ", gdzie: kw_pocz i kw_koniec mogą przyjmować: YEAR [(precyzja)] MONTH [(precyzja)] DAY [(precyzja)] HOUR [(precyzja)] MINUTE [(precyzja)] SECOND [(precyzja [.prec_części_ułamkowej])] Ćwiczenie 2 funkcje wierszowe (16) Kolejny literał, INTERVAL, słuŝy do definicji przedziału czasowego. Za słowem INTERVAL naleŝy podać kwalifikator początkowy przedziału (największy element reprezentowany w przedziale), po słowie TO kwalifikator końcowy (najmniejszy element reprezentowany w przedziale), przy czym kwalifikator końcowy jest opcjonalny. Oba kwalifikatory mogą przyjmować wartości z następującego zbioru: YEAR, MONTH, DAY, HOUR, MINUTE, SECOND, dla kaŝdego kwalifikatora moŝna określić precyzję wartości, dodatkowo dla kwalifikatora SECOND istnieje moŝliwość określenia precyzji części ułamkowej sekundy. 16

Literały czasowe (3) INTERVAL (cd) dopuszczalne kombinacje: YEAR TO MONTH - przykłady: INTERVAL '99' YEAR(2) 99 lat, INTERVAL '10-6' YEAR(2) TO MONTH 10 lat i 6 miesięcy, DAY TO SECOND - przykłady: INTERVAL '45 23:16' DAY TO MINUTE 45 dni, 23 godziny i 16 minut, INTERVAL '23:16:15.25' HOUR TO SECOND(2) 23 godziny, 16 minut, 15.25 sekund. Ćwiczenie 2 funkcje wierszowe (17) Dopuszczalne kombinacje kwalifikatorów zaleŝą od rodzaju przedziału czasowego, który ma zostać utworzony. I tak dla przedziału lata do miesięcy moŝna uŝyć kwalifikatorów YEAR i MONTH, z kolei dla przedziału dni do sekund uŝywa się kwalifikatorów DAY, HOUR, MINUTE i SECOND. Przykładowe przedziały czasowe, zdefiniowane z uŝyciem literału INTERVAL, przedstawiono na bieŝącym slajdzie. 17

Arytmetyka czasowa data ± przedział czasowy = data data + liczba dni = data (w SZBD Oracle) data data = przedział czasowy (w SZBD Oracle liczba dni) czas ± przedział czasowy = czas czas czas = przedział czasowy znacznik czasowy znacznik czasowy = przedział czasowy znacznik czasowy ± przedział czasowy = znacznik czasowy przedział czasowy ± przedział czasowy = przedział czasowy przedział czasowy * liczba = przedział czasowy przedział czasowy / liczba = przedział czasowy Ćwiczenie 2 funkcje wierszowe (18) Kolejnym zagadnieniem są wyniki operacji arytmetycznych, realizowanych na elementach określających czas. Jeśli do daty dodamy przedział czasowy lub od daty odejmiemy przedział czasowy, otrzymamy w wyniku datę. W SZBD Oracle do daty moŝemy dodać liczbę, tutaj interpretowaną jako liczbę dni, w wyniku takiej operacji otrzymamy nową datę. RóŜnica dwóch dat daje w wyniku przedział czasowy, określający czas, jaki upłynął między datami (w SZBD Oracle wynikiem róŝnicy dat jest liczba dni pomiędzy datami). Jeśli do elementu reprezentującego czas dodamy przedział czasowy lub odejmiemy od niego przedział czasowy, otrzymamy w wyniku element reprezentujący czas. RóŜnica dwóch elementów reprezentujących czas da nam w wyniku przedział czasowy. RóŜnica dwóch znaczników czasowych daje w rezultacie przedział czasowy. Z kolei jeśli do znacznika czasowego dodamy przedział czasowy lub odejmiemy od niego przedział czasowy, otrzymamy znacznik czasowy. Suma lub róŝnica dwóch przedziałów czasowych da nam w wyniku nowy przedział czasowy. Jeśli przedział czasowy pomnoŝymy lub podzielimy przez liczbę, w wyniku otrzymamy równieŝ przedział czasowy. 18

Arytmetyka czasowa przykłady SELECT zatrudniony, zatrudniony + INTERVAL '10' '10' YEAR(2) as as 10_LAT_WIECEJ, DATE '2006-07-02' --zatrudniony as as DNI_OD_ZATR FROM pracownicy WHERE nazwisko = 'Marecki'; ZATRUDNIONY 1968.01.01 10_LAT_WIECEJ 1978.01.01 DNI_OD_ZATR 14062 SELECT INTERVAL '10' '10' YEAR + INTERVAL '11' '11' MONTH as as A, A, INTERVAL '10' '10' DAY DAY + INTERVAL '24:10:20' HOUR(2) TO TO SECOND as as B...... A B +000000010-11 +000000011 00:10:20.000000000 Ćwiczenie 2 funkcje wierszowe (19) W pierwszym przykładzie do daty zatrudnienia pracownika Mareckiego dodajemy przedział czasowy o długości 10 lat, w wyniku otrzymujemy nową datę, przypadającą 10 lat po zatrudnieniu pracownika. W tym samym przykładzie od daty 2 lipca 2006 r., zdefiniowanej za pomocą literału DATE, odjęto datę zatrudnienia pracownika, w wyniku otrzymano liczbę dni, jaka upłynęła od zatrudnienia pracownika o nazwisku Marecki, do dnia 2 lipca 2006 r. (zapytanie wykonano w SZBD Oracle). W drugim przykładzie dodajemy do siebie dwa przedziały czasowe: do 10 lat dodajemy 11 miesięcy, w wyniku otrzymujemy nowy przedział czasowy, 10 lat i 11 miesięcy. Drugie wyraŝenie do przedziału czasowego 10 dni dodano przedział 24 godziny, 10 minut o 20 sekund, w wyniku otrzymano przedział 11 dni, 10 minut i 20 sekund. 19

Funkcje operujące na el. czasowych (1) extract(element from data) zwraca element będący częścią daty, element to: YEAR, MONTH, DAY, HOUR, MINUTE, SECOND SELECT EXTRACT (YEAR FROM current_timestamp) as as ROK, EXTRACT(HOUR FROM current_timestamp) as as GODZINA...... ROK 2006 GODZINA 13 Ćwiczenie 2 funkcje wierszowe (20) Rozpoczniemy teraz przegląd funkcji operujących na elementach czasowych. Pierwsza z nich, funkcja extract, umoŝliwia wydobycie z elementu czasowego określonego składnika: roku, miesiąca, dnia, godziny, minuty lub sekundy. W wywołaniu funkcji jako pierwszy podaje się element czasowy, po słowie from określa się wydobywany składnik. Słowa określające wydobywany składnik to odpowiednio: year, month, day, hour, minute i second. Wynikiem funkcji jest liczba, będąca wartością wydobywanego składnika. W przykładzie pierwsze wyraŝenie wydobywa z bieŝącego znacznika czasowego wartość roku, natomiast drugie wyraŝenie odczytuje z bieŝącego znacznika czasowego wartość godziny. 20

Funkcje operujące na el. czasowych (2) add_months(data, n) zwraca datę powiększoną o n miesięcy, last_day(data) zwraca datę przypadającą w ostatnim dniu miesiąca, w którym przypada data, months_between(data_od, data_do) zwraca liczbę miesięcy między dwiema datami, next_day(data, nazwa_dnia) zwraca datę, przypadającą po dacie w dniu tygodnia określonym przez nazwę_dnia. Ćwiczenie 2 funkcje wierszowe (21) BieŜący slajd przedstawia przykłady innych funkcji, operujących na datach, a zaimplementowanych w SZBD Oracle. Funkcja add_months do daty, podanej jako pierwszy parametr, dodaje liczbę miesięcy, przekazaną jako drugi parametr. Wynikiem działania funkcji jest nowa data. Kolejna funkcja, last_day, wylicza datę, przypadającą w ostatnim dniu miesiąca, w którym znajduje się data przekazana do funkcji jako parametr. Funkcja months_between zwraca liczbę określającą, ile miesięcy upłynęło miedzy dwiema datami, przekazanymi jako parametry funkcji. Funkcja next_day wylicza datę, przypadającą po dacie, podanej jako pierwszy parametr, w dniu tygodnia, którego nazwę przekazano w postaci drugiego parametru. 21

Funkcje konwersji ANSI cast(wyraŝenie as typ) przekształca wyraŝenie do wyraŝenia o typie określonym przez typ. SELECT current_timestamp as as A, A, CAST(current_timestamp AS AS date) as as B, B, CAST('10' '00' '00' AS AS number) as as C, C,...... A 2006/07/04 13:53:20,681483 +02:00 B 2006/07/04 C 1000 Ćwiczenie 2 funkcje wierszowe (22) BieŜący slajd rozpoczyna omawianie zestawu funkcji, dokonujących konwersji pomiędzy wartościami róŝnych typów. Pierwsza funkcja o nazwie cast, wchodząca w skład standardu SQL-99, umoŝliwia konwersję wartości pomiędzy zdefiniowanymi przez standard typami danych. Pierwszym parametrem funkcji jest wyraŝenie wyliczające wartość, która ma być poddana konwersji, drugi parametr, podany po słowie AS, określa docelowy typ danych. W zaprezentowanym przykładzie zapytanie odczytuje wartość bieŝącego systemowego znacznika czasowego, następnie realizowana jest konwersja wartości tego znacznika do wartości typu data. Trzecie wyraŝenie pokazuje konwersję ciągu znaków, powstałego przez sklejenie operatorem konkatenacji dwóch innych ciągów znaków, do wartości liczbowej. Oczywiście wartość poddawana konwersji musi być poprawną wartością w docelowym typie danych (jak w przykładzie ciąg znaków '1000' określa poprawną liczbę, tak więc konwersja zakończy się sukcesem). 22

Funkcje konwersji SZBD Oracle (1) to_char(wyraŝenie [,format]) przekształca wyraŝenie, będące datą lub przedziałem czasowym, do ciągu znaków według formatu, to_date(ciąg_znaków [,format]) przekształca ciąg_znaków do daty według formatu. Format Opis Format Opis DAY nazwa dnia tygodnia SCC stulecie D numer dnia w tygodniu (1-7) YYYY pełny rok DD numer dnia w miesiącu (1-31) YY dwie ostatnie cyfry roku DDD numer dnia w roku (1-366) HH godzina w formacie 12-godz. MM numer miesiąca (1-12) HH24 godzina w formacie 24-godz. MON skrót nazwy miesiąca MI minuty MONTH pełna nazwa miesiąca SS sekundy Ćwiczenie 2 funkcje wierszowe (23) Omówione teraz zostaną funkcje konwersji, zaimplementowane w SZBD Oracle. Najpierw przedstawimy funkcje, umoŝliwiające konwersję pomiędzy ciągami znaków a datami lub przedziałami czasowymi. Pierwsza z nich, funkcja to_char, realizuje konwersję wyraŝenia, będącego datą lub przedziałem czasowym (pierwszy parametr), do ciągu tekstowego według formatu, przekazanego jako drugi parametr. W przypadku pominięcia w wywołaniu funkcji parametru określającego format, konwersja dokonywana jest zgodnie z domyślnym formatem dla danego systemu bazy danych. Druga funkcja, to_date, realizuje operację odwrotną konwertuje ciąg znaków, podany jako pierwszy parametr, do daty. Określenie formatu daty, jaki przedstawia ciąg znaków, jest realizowane przez drugi parametr, format. Jeśli w wywołaniu funkcji format zostanie pominięty, ciąg znaków powinien przechowywać datę w domyślnym formacie danego systemu bazy danych. Na slajdzie przedstawiono elementy, z których moŝna skonstruować format, wykorzystywany w obu funkcjach. NaleŜy dodać, Ŝe przy elementach, które w dacie określają nazwę dnia (DAY), trzyliterowy skrót nazwy miesiąca (MON) lub pełną nazwę miesiąca (MONTH), znaczenie ma wielkość liter, którymi te elementy zostaną zapisane. W przypadku zapisu wymienionych elementów wielkimi literami w dacie otrzymamy nazwę danego składnika podaną wielkimi literami (np. PONIEDZIAŁEK, MARZEC ), natomiast przy zapisie elementów małymi literami, nazwy składników równieŝ będą zapisane małymi literami (a więc poniedziałek, marzec ). 23

Funkcje konwersji SZBD Oracle (2) to_char(liczba [,format]) przekształca liczbę do ciągu znaków według formatu, to_number(ciąg_znaków [,format]) przekształca ciąg_znaków do liczby według formatu. Format., 9 0 Opis kropka (oddziela część całkowitą od ułamkowej) przecinek (oddziela elementy liczby, np. tysiące od milionów) określa pozycję w liczbie, zera z lewej strony są pomijane określa drukowanie zera z lewej lub prawej strony liczby Ćwiczenie 2 funkcje wierszowe (24) Funkcja to_char posiada odmianę, wykorzystywaną do konwersji liczby do ciągu znaków. W tym wypadku pierwszym parametrem jest konwertowana liczba, natomiast drugi element określa format konwersji. Format moŝna pominąć, wówczas do konwersji zostanie wykorzystywany domyślny format wykorzystywany przez dany system bazy danych. Operację odwrotną realizuje funkcja to_number, które umoŝliwia konwersję liczby, zapisanej w postaci ciągu znaków, do właściwej liczby. I tutaj drugim, opcjonalnym parametrem funkcji, jest format konwersji. Na powyŝszym slajdzie przedstawiono wykorzystywane przy konstruowaniu formatu elementy. Element 9 określa pozycję liczby, element 0 dodaje się na początku bądź końcu formatu celem określenia, czy liczba ma być uzupełniana o zera (np. 900,5 ma być drukowane jako 0900,50). Dwa pozostałe elementy to separator części całkowitej od ułamkowej (. ) oraz separatory poszczególnych części liczby (, ), np. milionów od tysięcy, tysięcy od setek, itd. 24

Funkcje konwersji SZBD Oracle (3) SELECT nazwisko, to_char(zatrudniony, 'day, 'day, dd ddmonth yyyy') as as data, to_char(placa_pod, '0999.99') as as placa FROM pracownicy WHERE zatrudniony = to_date('15.07.1994','dd.mm.yyyy'); NAZWISKO Przywarek DATA piątek, 15 lipiec 1994 PLACA 0900.00 Ćwiczenie 2 funkcje wierszowe (25) W przykładzie pokazano konwersję daty zatrudnienia pracownika do ciągu tekstowego w formacie nazwa dnia, numer dnia w miesiącu nazwa miesiąca czterocyfrowy numer roku. Drugie wyraŝenie przekształca wartość płacy podstawowej pracownika do ciągu znaków, format wymusza dodanie przed zera przed liczbą i drukowanie dwóch pozycji ułamkowych. WyraŜenie w warunku zapytania konstruuje datę z ciągu tekstowego, data w ciągu zapisana jest w formacie numer dnia w miesiącu.numer miesiąca w roku.czterocyfrowy numer roku. 25

WyraŜenie CASE (1) Składnia: CASE wyraŝenie WHEN wartość_1 THEN wyraŝenie_1 WHEN wartość_2 THEN wyraŝenie_2 [ELSE wyraŝenie_3] END END CASE WHEN warunek_1 THEN wyraŝenie_1 WHEN warunek_2 THEN wyraŝenie_2 [ELSE wyraŝenie_3] END END Ćwiczenie 2 funkcje wierszowe (26) WyraŜenie CASE umoŝliwia zbudowanie konstrukcji, której wynik będzie uzaleŝniony od wyniku wartościowania zdefiniowanego wyraŝenia. Konstrukcji CASE moŝna uŝywać w dwóch postaciach. W pierwszej postaci po słowie kluczowym CASE umieszcza się wyraŝenie (np. atrybut), natomiast spodziewane wartości tego wyraŝenia umieszcza się w kolejnych sekcjach po słowie kluczowym WHEN (na slajdzie wartości te oznaczono jako wartość_1 i wartość_2). W trakcie wykonania zapytania wyraŝenie zwraca pewną wartość, realizowane jest wówczas dopasowanie tej wartości do jednej z wartości w sekcjach WHEN (dopasowanie zachodzi tylko dla pierwszej pasującej wartości). Wynikiem całej konstrukcji CASE jest wynik wyraŝenia umieszczonego po słowie THEN sekcji, dla której zaszło dopasowanie (na slajdzie wyraŝenia te oznaczono przez wyraŝenie_1 i wyraŝenie_2). Opcjonalna klauzula ELSE pozwala na zdefiniowanie wyraŝenia, którego wartość zostanie zwrócona jeśli nie zajdzie Ŝadne dopasowanie. Dość powaŝnym ograniczeniem tej postaci konstrukcji CASE jest moŝliwość jedynie równościowego porównania wyraŝenia po słowie CASE z wartościami w sekcjach WHEN. Ograniczenia tego nie ma druga postać konstrukcji CASE, w której w kolejnych sekcjach po słowie WHEN umieszcza się warunek logiczny. Wartością konstrukcji CASE będzie wartość wyraŝenia umieszczonego po słowie THEN w tej sekcji, dla której warunek logiczny jest prawdziwy. Ta postać konstrukcji CASE jest bardziej elastyczna. 26

WyraŜenie CASE (2) Przykład: dla kaŝdego pracownika wyświetl wartość jego płacy podstawowej, ukryj wartość płacy jeśli etat pracownika to DYREKTOR. SELECT nazwisko, CASE WHEN etat etat = 'DYREKTOR' THEN '***' '***' ELSE cast(placa_pod as as character(10)) END ENDas as placa FROM pracownicy; Ćwiczenie 2 funkcje wierszowe (27) Zaprezentowany przykład pokazuje wykorzystanie CASE do ukrycia pensji pracowników na etacie DYREKTOR. SZBD za typ wartości zwracanej przez wyraŝenie CASE w przykładzie przyjmuje ciąg znaków jest to spowodowane umieszczeniem ciągu *** w pierwszej sekcji THEN. Wszystkie pozostałe wartości w pozostałych sekcjach THEN i sekcji ELSE w konsekwencji teŝ muszą być ciągami znaków. Stąd zastosowanie funkcji CAST do konwersji płacy podstawowej do ciągu znaków. 27

Zadania 1. Dla kaŝdego pracownika wygeneruj kod składający się z dwóch pierwszych liter nazwy jego etatu i jego numeru identyfikacyjnego. 2. W nazwiskach pracowników zamień wszystkie litery K, L, M (równieŝ małe) na literę X. 3. Wyświetl nazwiska i płace podstawowe pracowników powiększone o 15% i zaokrąglone do liczb całkowitych. 4. Policz, ile lat pracuje kaŝdy pracownik. 5. Wyświetl przedział czasowy pokazujący okres pracy pracownika. 6. Wyświetl nazwę dni tygodnia zatrudnienia pracowników zespołu 10. Ćwiczenie 2 funkcje wierszowe (28) BieŜący slajd zawiera zestaw zadań, pozwalających na utrwalenie wiadomości z zastosowania funkcji wierszowych w zapytaniach SQL. 28

Zadania 7. Wyświetl informacje o wszystkich zespołach wraz z nazwami dzielnic, w których zlokalizowane są zespoły. Przyjmij, Ŝe MielŜyńskiego i Strzelecka naleŝą do dzielnicy Stare Miasto, Piotrowo naleŝy do dzielnicy Nowe Miasto a Wieniawskiego naleŝy do dzielnicy Grunwald. Skorzystaj z wyraŝenia CASE. 8. Dla kaŝdego pracownika wyświetl jego nazwisko, płacę podstawową i informację o tym, czy jego pensja jest mniejsza, równa lub większa od 1850 złotych. Skorzystaj z wyraŝenia CASE. Ćwiczenie 2 funkcje wierszowe (29) 29

Rozwiązania 1 2 3 4 5 6 SELECT substr(etat, 1,2) 1,2) id_prac FROM pracownicy; SELECT translate(nazwisko,'kkllmm','xxxxxx') FROM pracownicy; SELECT nazwisko, round(placa_pod ** 1.15, 0) 0) FROM pracownicy; SELECT nazwisko, round(months_between(sysdate, zatrudniony)/12, 0) 0) FROM pracownicy; SELECT nazwisko, current_timestamp cast(zatrudniony as as timestamp) FROM pracownicy; SELECT to_char(zatrudniony, 'DAY') FROM pracownicy WHERE id_zesp = 10; 10; Ćwiczenie 2 funkcje wierszowe (30) BieŜący slajd przedstawia rozwiązania zadań (1), (2), (3), (4), (5) i (6), których treść zacytowano poniŝej. (1) Dla kaŝdego pracownika wygeneruj kod składający się z dwóch pierwszych liter nazwy jego etatu i jego numeru identyfikacyjnego. (2) W nazwiskach pracowników zamień wszystkie litery K, L, M (równieŝ małe) na literę X. (3) Wyświetl nazwiska i płace podstawowe pracowników powiększone o 15% i zaokrąglone do liczb całkowitych. (4) Policz, ile lat pracuje kaŝdy pracownik. (5) Wyświetl przedział czasowy pokazujący okres pracy pracownika. (6) Wyświetl nazwę dni tygodnia zatrudnienia pracowników zespołu 10. 30

Rozwiązania 7 8 SELECT nazwa, adres, CASE WHEN adres like like 'PIOTROWO%' THEN 'Nowe Miasto' WHEN adres like like 'MIELśYŃSKIEGO%' or or adres like like 'STRZELECKA%' THEN 'Stare Miasto' WHEN adres like like 'WIENIAWSKIEGO%' THEN 'Grunwald' END END as as dzielnica FROM zespoly; SELECT nazwisko, placa_pod, CASE WHEN placa_pod < 1850 THEN 'PoniŜej 1850 zł' zł' WHEN placa_pod = 1850 THEN 'Dokładnie 1850 zł' zł' WHEN placa_pod > 1850 THEN 'PowyŜej 1850 zł' zł' END ENDas as próg próg FROM pracownicy; Ćwiczenie 2 funkcje wierszowe (31) BieŜący slajd przedstawia rozwiązania zadań (7) i (8), których treść zacytowano poniŝej. (7) Wyświetl informacje o wszystkich zespołach wraz z nazwami dzielnic, w których zlokalizowane są zespoły. Przyjmij, Ŝe MielŜynskiego i Strzelecka naleŝą do dzielnicy Stare Miasto, Piotrowo naleŝy do dzielnicy Nowe Miasto a Wieniawskiego naleŝy do dzielnicy Grunwald. Skorzystaj z wyraŝenia CASE. (8) Dla kaŝdego pracownika wyświetl jego nazwisko, płacę podstawową i informację o tym, czy jego pensja jest mniejsza, równa lub większa od 1850 złotych. Skorzystaj z wyraŝenia CASE. 31

Operatory zbiorowe Składnia: zapytanie1 UNION UNION ALL ALL EXCEPT INTERSECT zapytanie2 UNION UNION ALL ALL EXCEPT INTERSECT zapytanie3...;...; Operatory: UNION suma zbiorów z eliminacją powtórzeń, UNION ALL suma zbiorów, EXCEPT (MINUS w SZBD Oracle) róŝnica zbiorów z eliminacją powtórzeń, INTERSECT część wspólna zbiorów z eliminacją powtórzeń. Ćwiczenie 2 funkcje wierszowe (32) Ostatnim zagadnieniem, jakie zostanie poruszone w bieŝącym rozdziale, są zapytania wykorzystujące operatory zbiorowe. Ogólny schemat takiego zapytania przedstawia bieŝący slajd. Zapytanie złoŝone jest z kilku zapytań składowych. KaŜde z zapytań wylicza zbiór rekordów. Następnie zbiory łączone są z wykorzystaniem operatorów zbiorowych. Dostępne operatory to: operator UNION, wyliczający sumę dwóch zbiorów i eliminujący powtórzenia ze zbioru wynikowego, operator UNION ALL wyliczający sumę dwóch zbiorów jednak bez eliminacji powtórzeń, operator EXCEPT wyliczający róŝnicę dwóch zbiorów i eliminujący powtórzenia ze zbioru wynikowego oraz operator INTERSECT, znajdujący część wspólną dwóch zbiorów i eliminujący powtórzenia. W SZBD Oracle operator EXCEPT jest zastąpiony przez identycznie działający operator MINUS. 32

Przykłady Podaj nazwy etatów pracowników zespołu 10, na których nie są zatrudnieni pracownicy zespołu 20. SELECT etat etat FROM pracownicy WHERE id_zesp = 10 10 EXCEPT SELECT etat etat FROM pracownicy WHERE id_zesp = 20; 20; Wyświetl nazwiska pracowników i nazwy zespołów. SELECT nazwisko as as "nazwiska i i nazwy" FROM pracownicy UNION ALL ALL SELECT nazwa FROM zespoly; Ćwiczenie 2 funkcje wierszowe (33) BieŜący slajd przedstawia przykład zapytań z operatorami zbiorowymi. W pierwszym przykładzie pierwsze zapytanie znajduje zbiór wartości etatów, na jakich są zatrudnieni pracownicy zespołu o numerze 10. Z kolei drugie zapytanie znajduje zbiór wartości etatów, na jakich są zatrudnieni pracownicy zespołu o numerze 20. Oba zbiory zostają połączone operatorem EXCEPT a więc wyliczającym róŝnicę zbiorów. W konsekwencji otrzymujemy zbiór wartości etatów, na jakich zatrudnieni są pracownicy zespołu o numerze 10, a na których nie pracująŝadni pracownicy zespołu o numerze 20. Dodatkowo zostają wyeliminowane powtórzenia wartości nazw etatów. Drugi przykład tworzy sumę dwóch zbiorów: pierwszego, zawierającego nazwiska pracowników, z drugim, zawierającym nazwy zespołów. Zbiór wynikowy zawiera zatem nazwiska pracowników pomieszane z nazwami zespołów. 33

Zasady stosowania operatorów Liczba wyraŝeń w klauzulach SELECT zapytań musi być taka sama. Typy odpowiadających wyraŝeń w klauzulach SELECT zapytań muszą być zgodne. Nazwy atrybutów w zbiorze wynikowym pochodzą z klauzuli SELECT pierwszego zapytania. Klauzula ORDER BY moŝe wystąpić jedynie na końcu polecenia. Zapytania wykonywane są w kolejności ich wystąpienia (od góry do dołu), domyślna kolejność moŝe zostać zmieniona przez zastosowanie nawiasów. Ćwiczenie 2 funkcje wierszowe (34) Zasady konstruowania zapytań z operatorami zbiorowymi podlegająścisłym rygorom. Po pierwsze, liczba wyraŝeń w klauzulach SELECT wszystkich zapytań, wchodzących w skład konstrukcji, musi być taka sama. A więc jeśli w klauzuli SELECT pierwszego zapytania są trzy wyraŝenia, w klauzulach SELECT wszystkich następnych zapytań teŝ muszą być zdefiniowane trzy wyraŝenia. Po wtóre, typy wartości odpowiadających sobie wyraŝeń w klauzulach SELECT poszczególnych zapytań muszą być zgodne (lub istnieje moŝliwość realizacji domyślnej konwersji). Jeśli np. typ pierwszego wyraŝenia pierwszego zapytania to liczba, pierwsze wyraŝenia w klauzulach SELECT pozostałych zapytań teŝ muszą być liczbami (lub muszą takich typów, dla których będzie moŝliwe przeprowadzenie konwersji do liczby). Nagłówki atrybutów wyniku zapytania z operatorami zbiorowymi są tworzone z nazw wyraŝeń lub aliasów, jakie zostały zdefiniowane w klauzuli SELECT pierwszego zapytania. Klauzula ORDER BY moŝe wystąpić jedynie na końcu całej konstrukcji. W przypadku konstrukcji zawierającej więcej niŝ dwa zapytania, wykonanie następuje od góry: wynik pierwszego zapytania zostaje połączony operatorem zbiorowym z wynikiem drugiego zapytania, wynik tej operacji zostaje połączony z wynikiem trzeciego zapytania, itd. Jeśli konieczna jest zmiana kolejności wykonywania zapytań, naleŝy uŝyć nawiasów, otaczając nimi te pary zapytań, które mają być zrealizowane jako pierwsze, np. w konstrukcji zapytanie_1 union (zapytanie_2 except zapytanie_3) najpierw połączone zostaną wyniki zapytań 2 i 3 a następnie wynik zapytania 1. 34

Zadania 9. Wyświetl nazwy etatów, na które przyjęto pracowników zarówno w 1992 jak i 1993 roku. 10. Dla kaŝdego pracownika wyświetl jego nazwisko, płacę podstawową i informację o tym, czy jego pensja jest mniejsza, równa lub większa od 1850 złotych. Wynik posortuj wg nazwisk pracowników. Skorzystaj z operatorów zbiorowych. Ćwiczenie 2 funkcje wierszowe (35) BieŜący slajd przedstawia zadania, których celem jest utrwalenie wiadomości ze stosowania operatorów zbiorowych w zapytaniach SQL. 35

Rozwiązania 9 10 SELECT etat etat FROM pracownicy WHERE extract(year from from zatrudniony) = '1992' INTERSECT SELECT etat etat FROM pracownicy WHERE extract(year from from zatrudniony) = '1993'; SELECT nazwisko, placa_pod, 'powyŝej 1850 zł' zł' as as próg próg FROM pracownicy WHERE placa_pod > 1850 UNION SELECT nazwisko, placa_pod, 'dokładnie 1850 zł' zł' FROM pracownicy WHERE placa_pod = 1850 UNION SELECT nazwisko, placa_pod, 'poniŝej 1850 zł' zł' FROM pracownicy WHERE placa_pod < 1850 ORDER BY BY nazwisko; Ćwiczenie 2 funkcje wierszowe (36) BieŜący slajd przedstawia rozwiązania zadań (9) i (10), których treść zacytowano poniŝej. (9) Wyświetl nazwy etatów, na które przyjęto pracowników zarówno w 1992 jak i 1993 roku. (10) Dla kaŝdego pracownika wyświetl jego nazwisko, płacę podstawową i informację o tym, czy jego pensja jest mniejsza, równa lub większa od 1850 złotych. Wynik posortuj wg nazwisk pracowników. Skorzystaj z operatorów zbiorowych. 36

Podsumowanie Funkcja wierszowa przekształca wartości atrybutów w obrębie rekordu relacji. Schemat uŝycia: SELECT atrybut1, funkcjaa(wyraŝenie1, wyraŝenie2) as as wynik FROM nazwa_relacji WHERE funkcjab(wyraŝenie3) operator wyraŝenie4...... ORDER BY BYfunkcjaC; Operatory zbiorowe umoŝliwiają konstrukcję zapytań, łączących w zbiór wynikowy kilka zbiorów rekordów. Ćwiczenie 2 funkcje wierszowe (37) W zakończonym ćwiczeniu została zaprezentowana koncepcja funkcji języka SQL. W ćwiczeniu omówiono stosowanie funkcji wierszowych, przetwarzających wartości atrybutów w obrębie rekordu relacji. Przedstawiono sposób konstrukcji zapytań z funkcjami wierszowymi, a następnie omówiono poszczególne rodzaje funkcji wierszowych. Następnie zaprezentowano konstrukcje umoŝliwiające budowanie zapytań z wykorzystaniem operatorów zbiorowych. KaŜde z omówionych zagadnień zostało utrwalone przez serię zadań. 37