Język T-SQL

Transkrypt

Język T-SQL
86
Bazy danych
Język T-SQL
Bazy danych
87
Przegląd zagadnień
Charakterystyka jezyka SQL
Polecenia DDL
Polecenia DCL
Polecenia DML
Podsumowanie
Laboratorium
W tym wykładzie poznasz podstawy uniwersalnego języka słuŜącego
do manipulacji danymi w bazach relacyjnych - język SQL (ang. Structured
Query Language).
88
Bazy danych
Charakterystyka języka SQL
Język SQL narodził się w latach siedemdziesiątych w laboratoriach
IBM w San Jose. Pierwszy standard ANSI tego języka ujrzał światło dzienne
w roku 1987, a obecny noszący nazwę SQL2 (lub SQL92) w roku 1992.
Obecnie trwają prace nad kolejną wersją tego języka, ale nie zostały one jeszcze
zakończone.
Język SQL - strukturalny język zapytań - został opracowany z myślą
o relacyjnych bazach danych. Jest on tak skonstruowany, Ŝe pozwala
definiowanie, usuwanie i manipulację danymi w relacyjnych bazach danych bez
konieczności wchodzenia w szczegóły implementacyjne i konstrukcyjne
konkretnego środowiska baz danych. Prawie wszystkie bazy danych i SZBD
wspierają język SQL, choć w jego róŜnych odmianach. Istnieją bowiem róŜne
dialekty tego języka opracowane na potrzeby konkretnych SZBD. Jeśli jednak
będziemy posługiwać się jego wersją ANSI, to powinien on być zrozumiały dla
większości SZBD.
Język SQL składa się z trzech składowych:
•
•
•
języka definiowania danych - języka DDL (ang. Data Definition
Language),
języka sterowania danymi - języka DCL (ang. Data Control
Language),
języka operowania na danych - języka DML (ang. Data Manipulation
Language).
Rysunek 4.1 pokazuje składniki języka SQL wraz z najwaŜniejszymi
poleceniami z kaŜdej części, które będziesz poznawać.
Rys. 4.1 Składowe języka SQL
Bazy danych
89
Polecenia DDL
Instrukcje języka DDL słuŜą do manipulowania bazą danych i jej obiektami.
Pozwalają na:
•
•
•
- tworzenie nowych obiektów,
- modyfikowanie obiektów juŜ istniejących,
- usuwanie obiektów.
Rys. 4.2 Główne polecenia języka DDL
Tworzenie tabel
Rysunek 4.3 przedstawia przykład składni polecenia CREATE TABLE oraz
przykład uŜycia tego polecenia.
Rys. 4.3 Przykład składni i polecenia CREATE TABLE
Przy definiowaniu tabeli naleŜy podać jej nazwę, nazwy jej atrybutów oraz typ
danych, które atrybuty te mogą przyjmować. Dodatkowo określa się, czy dany
atrybut moŜe przyjąć wartość NULL, czy nie.
Typy danych, które mogą przyjmować atrybuty według standardu ANSI,
podano w tabeli 4.4. KaŜdy atrybut musi mieć przypisany typ.
90
Bazy danych
NaleŜy jednak pamiętać, Ŝe występują róŜne w typach w zaleŜności od systemu
zarządzania bazą danych, z którym mamy do czynienia.
Tabela 4.4 Typy danych ANSI
Typ danych ANSI
Opis
Tekstowy
CHAR(n)
tekst o długości n
VARCHAR(n)
tekst o długości co najwyŜej n
BIT(n)
ciąg bitów o długości n
BIT VARYING(n)
ciąg bitów o długości co najwyŜej n
Całkowity
INT, SHORTINT
wartości całkowite
Numeryczne
FLOAT,REAL
liczby zmiennopozycyjne
DECIMAL(n,d)
wartośc na n pozycjach dziesiętnych z
d miejscami po przecinku
Binarny
Modyfikacja tabel
Do modyfikacji obiektów słuŜy polecenie ALTER. W celu modyfikacji
istniejącej tabeli naleŜy zastosować polecenie ALTER TABLE, którego
uproszczona składnia pokazana jest na rysunku.
Rys. 4.5 Składnia częściowa polecenia ALTER TABLE
Najczęściej polecenie ALTER TABLE stosuje się do zmiany schematu relacji.
Przykład zastosowania tego polecenia do dodania lub usunięcia kolumny
z tabeli pokazano poniŜej.
Rys. 4.6 Przykład zastosowania polecenia ALTER TABLE
Bazy danych
91
Usuwanie tabeli
Do usuwania tabeli słuŜy polecenie DROP TABLE. Usuwa ono schemat tabeli
(relacji).
Rys. 4.7 Przykład uŜycia polecenia DROP TABLE
92
Bazy danych
Polecenia DCL
Instrukcje języka DCL słuŜą do zarządzania uprawnieniami dostępu do
obiektów bazy. NajwaŜniejsze polecenia języka DCL zebrano w tabeli 4.8.
Tabela 4.8 Polecenia języka DCL
Instrukcja
Znaczenie
Opis
GRANT
Nadanie
Nadaje uprawnienia
DENY
Odmowa
Odmawia uprawnień
REVOKE
Cofnięcie
Usuwa nadane lub
cofnięte uprawnienia
Czym róŜni się odmowa uprawnień od cofnięcia uprawnień? Chodzi o to, Ŝe
mamy dwa rodzaje uprawnień (podobnie jak w systemie Windows
XP/2000/2003) - uprawnienia pozytywne (coś moŜna zrobić) i negatywne (coś
jest zabronione). Do nadawania uprawnień pozytywnych słuŜy polecenie
GRANT, zaś uprawnienia negatywne nadajemy poleceniem DENY. Polecenie
REVOKE pozwala cofnąć uprawnienia nadane poleceniami GRANT i DENY.
NaleŜy zapamiętać, Ŝe uprawnienia negatywne (nadane poleceniem DENY)
nadpisują uprawnienia pozytywne (nadane przez polecenie GRANT).
Bazy danych
Polecenia DML
Pobieranie zestawu wyników
Operatory porównania
Operatory logiczne
Wyszukiwanie z listy wartosci
Wyszukiwanie wartosci nieznanych
Modyfikowanie danych
Instrukcje języka DML słuŜą do:
•
•
•
pobieranie danych,
formatowania zestawu wyników,
modyfikowania danych.
NajwaŜniejsze instrukcje języka DML zebrano w tabeli 4.9.
Tabela 4.9 Polecenia języka DML
Instrukcja
Znaczenie
Opis
SELECT
Pobierz
Pobiera zestaw danych
INSERT
Wstaw
Wstawia dane do tabeli
UPDATE
Modyfikuj
Modyfikuje
tabeli
DELETE
Usuń
Usuwa rekordy z tabeli
dane
w
93
94
Bazy danych
Pobieranie zestawu wyników
Do pobierania zestawu wyników słuŜy polecenie SELECT.
Rys. 4.10 Składnia częściowa polecenia SELECT
Jeśli chcemy pobrać wszystkie kolumny z tabeli, to w jako listę wyboru
podajemy gwiazdkę. Przykład takiego zastosowania pokazuje rysunek 4.11.
Rys. 4.11 Polecenie SELECT - pobranie wszystkich kolumn z tabeli
Jeśli natomiast interesują nas tylko niektóre, z kolumn danej tabeli, to naleŜy po
słowie SLECT wymienić nazwy tych kolumn w takiej kolejności, w jakiej
chcemy aby zostały wyświetlone.
Rys. 4.12 Polecenie SELECT - pobranie wybranych kolumn z tabeli
Bazy danych
95
MoŜemy równieŜ ograniczyć liczbę zwracanych wierszy, czyli dokonać
filtrowania rekordów. SłuŜy do tego warunek WEHRE, który moŜemy
umieścić w instrukcji SELECT.
Rys. 4.13 Polecenie SELECT - uŜycie warunku WHERE
Warunki wyszukiwania, które moŜemy stosować po słowie WEHRE są
róŜnorodne i dają duŜą swobodę filtrowania rekordów. Warunki te mogą:
•
•
•
•
•
•
- korzystać z operatorów porównania,
- korzystać z porównywania ciągów,
- korzystać z operatorów logicznych,
- pobierać zakresu wartości,
- korzystać z listy wartości jako kryterium wyszukiwania,
- pobierać wartości nieznanych.
Operatory porównania
Operator „=”
Operator porównania (=) powoduje, Ŝe zwracane są tylko te rekordy, których
wartość w zadanej kolumnie jest równa podanej.
Rys. 4.14 Polecenie SELECT - uŜycie operatora porównania
96
Bazy danych
Operator LIKE
Operator LIKE porównuje ciągi znaków, które powinny być do siebie
podobne. Wraz z operatorem LIKE moŜna stosować znaki maskujące:
% - zastępuje dowolny ciąg znaków (odpowiednik w MS Access - *),
_ - zastępuje jeden dowolny znak (odpowiednik w MS Access - ?).
Rys. 4.15 Polecenie SELECT - uŜycie operatora LIKE
Rys. 4.16 Przykłady wykorzystania operatora LIKE
Operatorem negującym wynik operatora LIKE jest operator NOT LIKE. Jego
zastosowanie powoduje zwrócenie rekordów, które nie spełniają podanego
warunku podobieństwa.
Bazy danych
97
Rys. 4.17 Przykład wykorzystania operatora NOT LIKE
Operatory logiczne
Wraz ze słowem WHERE moŜna teŜ stosować operatory logiczne AND i OR,
co znacznie poszerza moŜliwości budowania warunków filtrowania.
Rys. 4.18 Przykład wykorzystania operatorów logicznych
98
Bazy danych
Wyszukiwanie z listy wartości
Do wyszukiwania wartości z podanej listy słuŜy słowo IN.
Rys. 4.19 Przykład wyszukiwania z listy wartości
Wyszukiwanie wartości nieznanych
Wyszukiwanie rekordów o nieznanych lub nie podanych wartościach ma wiele
praktycznych zastosowań. Przykład takiego wyszukiwania z zastosowaniem
słowa IS NULL podano na rysunku 4.20.
Rys. 4.20 Przykład wyszukiwania wartości nieznanych
Bazy danych
99
Formatowanie wyników
Kiedy zestaw wyników zostanie juŜ przefiltrowany i zostaną wybrane
odpowiednie kolumny, warto jest go odpowiednio sformatować, aby był on
lepiej czytelny. Formatowanie wyników moŜe polegać na:
•
•
•
•
- sortowaniu danych,
- eliminowaniu duplikatów,
- zmianie nazw kolumn,
- zastosowaniu literałów,
Sortowanie wyników
Do sortowania wyników naleŜy zastosować składnię ORDER BY. Sortować
moŜemy rosnąco (słowo kluczowe - ASC) lub malejąco (słowo kluczowe DESC).
Rys. 4.21 Przykład sortowania wyników
Eliminowane duplikatów
Do eliminowania duplikatów w wynikach słuŜy słowo DISTINCT.
Rys. 4.22 Przykład eliminowania duplikatów
100
Bazy danych
Zmiana nazw kolumn
Nazwę kolumny w zestawie wyników moŜemy osiągnąć bardzo prosto stosując
słowo AS w sposób, jak pokazano poniŜej.
Rys. 4.23 Przykład zmiany nazw kolumn
Literały
Literały słuŜą do dodawania do zestawu wyników pewnych ciągów znaków, jak
pokazuje to poniŜszy przykład. Poprawia to czytelność wyniku.
Rys. 4.24 Przykład uŜycia literału
Bazy danych
101
Modyfikowanie danych
Modyfikowanie danych moŜe polegać na:
•
•
•
wstawianiu wierszy,
usuwaniu wierszy,
aktualizowaniu wierszy.
Wstawianie wierszy
Do wstawiania wierszy uŜywamy polecenia INSERT.
Rys. 4.25 Przykład wstawienia wiersza
Usuwanie wierszy
Do usunięcia wierszy w tabeli moŜna zastosować dwa polecenia: DELETE lub
TRUNCATE TABLE. Nie powodują one usunięcia schematu relacji, ale
jedynie jej instancji.
Instrukcja DELETE
1. UŜywana do usunięcia jednego lub więcej wierszy z tabeli.
2. Zawsze naleŜy umieszczać klauzulę WHERE.
3. KaŜdy usunięty wiersz jest rejestrowany w dzienniku transakcji.
Instrukcja TRUNCATE TABLE
1. UŜywana do usunięcia wszystkich wierszy z tabeli.
2. Serwer SQL zachowuje strukturę tabeli i skojarzone obiekty.
3. Jedynie zwolnienie stron danych jest rejestrowane w dzienniku
transakcji.
Aktualizowanie wierszy
1. Klauzula WHERE określa wiersze, które mają być zmienione.
2. Słowo kluczowe SET określa nowe dane.
3. Wartości wejściowe muszą być tego samego typu danych, co kolumny.
Rys. 4.26 Przykład aktualizacji wiersza
102
Bazy danych
Podsumowanie
Charakterystyka jezyka SQL
Polecenia DDL
Polecenia DCL
Polecenia DML
Do manipulowania na obiektach i danych w relacyjnej bazie danych
najwygodniej jest stosować strukturalny język zapytań SQL. Składa się on
z trzech podstawowych części słuŜących do manipulacji obiektami bazy danych
(np. tabelami), zarządzania uprawnieniami (nie wszystkie bazy tę część
wspierają) oraz do manipulowania danymi i sposobem ich prezentacji. SQL jest
prostym, uniwersalnym językiem. Jest niezbędnym elementem pracy kaŜdego
programisty baz danych.
Bazy danych
Laboratorium
W tym ćwiczeniu przyjrzymy się praktycznemu zastosowaniu języka T-SQL
103
104
Bazy danych
Polecenia języka DDL
Poznawanie języka SQL rozpoczniesz od zapoznania się z poleceniami
z działu DDL (ang. Data Definition Language): CREATE, ALTER i DROP.
Krok 1 - Utwórz tabelę za pomocą polecenia CREATE TABLE
►
►
►
►
►
►
►
Zaloguj się do maszyny wirtualnej ZBD jako uŜytkownik
Administrator z hasłem P@ssw0rd.
Kliknij Start. Z grupy programów Microsoft SQL Server 2005
uruchom SQL Server Management Studio.
W oknie logowania kliknij Connect.
Kliknij w menu głównym programu Management Studio na File.
Kliknij Open - File.
Odszukaj plik C:\Labs\Lab4\ddl_1.sql i kliknij Open.
Zaznacz i uruchom (klawisz F5) fragmenty kodu oznaczone w
komentarzach jako (1) oraz (2).
-- (1) ustawmy Biblioteke jako baze robocza
USE Biblioteka
GO
-- (2) utworzmy w bazie danych tabele Tabela1
CREATE TABLE Tabela1 (
ID_tabeli int IDENTITY(1,1) PRIMARY KEY,
kolumna1 varchar(10),
kolumna2 varchar(20),
kolumna3 varchar(30)
)
GO
PowyŜszy kod ustawia bazę danych Biblioteka jako bazę roboczą oraz tworzy
w tej bazie danych tabelę Tabela1 o czterech kolumnach (ID_tabeli,
kolumna1, kolumna2, kolumna3).
Polecenie CREATE słuŜy do tworzenia wszystkich obiektów baz
danych: tabel (CREATE TABLE), widoków (CREATE VIEW),
procedur składowanych (CREATE PROCEDURE), indeksów (CREATE
INDEX), wyzwalaczy (CREATE TRIGGER).
Tylko tymczasowe twory, takie jak zmienne czy kursory, deklarujesz
(nie tworzysz) za pomocą polecenia DECLARE.
Krok 2 - Modyfikuj strukturę tabeli za pomocą polecenia ALTER TABLE
►
Mając otwarty skrypt demo_4_1_1 w oknie Query zaznacz i uruchom
(F5) fragment kodu oznaczony w komentarzu jako (3).
-- (3) zmienmy definicje kolumny kolumna1
ALTER TABLE Tabela1
ALTER COLUMN kolumna1 varchar(10) NOT NULL
GO
Bazy danych
105
PowyŜszy kod modyfikuje istniejącą kolumnę (kolumna1) tabeli Tabela1 tak,
by nie moŜna było w niej zapisywać wartości pustych. ZauwaŜ, Ŝe przy zmianie
czegokolwiek w istniejącej kolumnie musisz koniecznie podać typ danych
kolumny (niezaleŜnie od tego, czy się zmienia, czy nie).
►
Zaznacz i uruchom (F5) fragment kodu oznaczony w komentarzu jako
(4).
-- (4) dodajmy kolumne kolumna4
ALTER TABLE Tabela1
ADD kolumna4 int
GO
PowyŜszy kod dodaje do istniejącej tabeli Tabela1 kolumnę kolumna4 typu
danych int. MoŜna dodać jednorazowo więcej niŜ jedną kolumnę oddzielając
definicje nowych kolumn przecinkami.
►
Zaznacz i uruchom (F5) fragment kodu oznaczony w komentarzu jako
(5).
-- (5) dodajmy ograniczenie na kolumnie kolumna4
ALTER TABLE Tabela1
ADD CONSTRAINT CK_kolumna4 CHECK (kolumna4
> 5)
GO
PowyŜszy kod powoduje dodanie w istniejącej tabeli Tabela1 ograniczenia
nazwanego CK_kolumna4 na istniejącą kolumnę kolumna4. Ograniczenie to
wymusza wstawianie w kolumnie kolumna4 liczb całkowitych (kolumna jest
typu całkowitego) większych od 5.
►
Zaznacz i uruchom (F5) fragment kodu oznaczony w komentarzu jako
(6).
-- (6) usunmy ograniczenie na kolumnie kolumna4
ALTER TABLE Tabela1
DROP CONSTRAINT CK_kolumna4
GO
PowyŜszy kod spowoduje usunięcie uprzednio utworzonego ograniczenia
CK_kolumna4 z tabeli Tabela1.
►
Zaznacz i uruchom (F5) fragment kodu oznaczony w komentarzu jako
(7).
-- (7) usunmy kolumne kolumna4
ALTER TABLE Tabela1
DROP COLUMN kolumna4
GO
106
Bazy danych
PowyŜszy kod spowoduje usunięcie kolumny kolumna4 z tabeli Tabela1.
Krok 3 - Usuń tabelę za pomocą polecenia DROP TABLE
►
Mając otwarty skrypt ddl_1 w oknie Query zaznacz i uruchom (F5)
fragment kodu oznaczony w komentarzu jako (8).
-- (8) usunmy tabele Tabela1
DROP TABLE Tabela1
GO
PowyŜszy kod spowoduje usunięcie tabeli Tabela1. Pamiętaj, Ŝe usunięcie
tabeli oznacza usunięcie nie tylko danych z tabeli, ale równieŜ struktury samej
tabeli.
Bazy danych
107
Polecenia języka DCL
Aby móc wykonywać operacje na danych, uŜytkownik musi mieć
nadane odpowiednie uprawnienia. Do zarządzania uprawnieniami
uŜytkowników słuŜą polecenia języla DDL (ang. Data Control Language):
GRANT, REVOKE oraz DENY.
Krok 1 - Dodaj nowych uŜytkowników bazy danych i sprawdź ich
domyślne uprawnienia
►
►
►
►
►
►
►
Zaloguj się do maszyny wirtualnej ZBD jako uŜytkownik
Administrator z hasłem P@ssw0rd.
Kliknij Start. Z grupy programów Microsoft SQL Server 2005
uruchom SQL Server Management Studio.
W oknie logowania kliknij Connect.
Kliknij w menu głównym programu Management Studio na File.
Kliknij Open - File.
Odszukaj plik C:\Labs\Lab4\dcl_1.sql i kliknij Open.
Zaznacz i uruchom (klawisz F5) fragmenty kodu oznaczone w
komentarzach jako (1) oraz (2).
►
-- (1) ustawmy Biblioteke jako baze robocza
USE Biblioteka
GO
-- (2) dodajmy dwoch nowych uzytkownikow serwera
i bazy danych,
-- Czytelnik1 i Czytelnik2, umiescmy ich w grupie
Czytelnicy
EXEC sp_addlogin Czytelnik1
EXEC sp_addlogin Czytelnik2
EXEC sp_grantdbaccess Czytelnik1
EXEC sp_grantdbaccess Czytelnik2
EXEC sp_addrole Czytelnicy
EXEC sp_addrolemember Czytelnicy, Czytelnik1
EXEC sp_addrolemember Czytelnicy, Czytelnik2
GO
PowyŜszy kod dodaje dwóch uŜytkowników serwera - Czytelnik1 oraz
Czytelnik2 (loginy serwera SQL, nie zaś logowanie w systemie Windows).
Dodatkowo nadajemy uŜytkownikom dostęp do bazy (czyli inaczej mówiąc
mapujemy loginy do bazy pod tymi samymi nazwami). Wreszcie tworzymy
grupę w bazie danych i dodajemy do niej uprzednio utworzonych
uŜytkowników.
Nie przejmuj się, Ŝe nie bardzo rozumiesz na razie mechanizmy
bezpieczeństwa (loginy, grupy itd.). Dokładniej zapoznamy Cię z tymi
zagadnieniami w rozdziale 9 ćwiczeń). Na razie musisz tylko
wiedzieć, jakie operacje wykonaliśmy.
108
Bazy danych
►
►
►
►
►
Kliknij przycisk New Query.
Zaloguj się uŜywając uwierzytelniania SQL Server jako Czytelnik1
(hasło pozostaw puste).
W menu głównym programu wybierz File - Open.
W oknie Open Query File wybierz plik dcl_2.sql.
Zaznacz i uruchom (klawisz F5) fragmenty kodu oznaczone w
komentarzach jako (1) oraz (2).
-- (1) ustawmy Biblioteke jako baze robocza
USE Biblioteka
GO
-- (2) sprawdzmy,
czy mamy uprawnienia
wykonania
-- polecenia SELECT na tabeli Wydawnictwa
SELECT * FROM Wydawnictwa
GO
do
PowyŜszy kod ustawi bazę danych Biblioteka jako bazę roboczą i spróbuje
wykonać polecenie SELECT na tabeli Wydawnictwa w kontekście
uŜytkownika Czytelnik1.
Wynikiem działania powinien być komunikat:
Server:
Msg
229,
Level
14,
State
5,
Line
1
SELECT permission denied on object 'Wydawnictwa', database
'Biblioteka',
owner
'dbo'.
Domyślne uprawnienia nowego uŜytkownika nie pozwalają na wykonanie
Ŝadnego polecenia w bazie danych.
►
Skoro nie mamy uprawnień do wykonywania poleceń, tym bardziej nie
moŜemy ich nadawać. Zaznacz i uruchom (F5) fragment kodu
oznaczony w komentarzu jako (3).
-(3)
sprobujmy
nadac
uprawnienia
uzytkownikowi
GRANT SELECT ON Wydawnictwa TO Czytelnik2
GO
innemu
Podjąłeś nieudaną próbę nadania innemu uŜytkownikowi (Czytelnik2)
uprawnień do wykonywania polecenia SELECT w tabeli Wydawnictwa.
Wynikiem próby jest komunikat:
Server:
Msg
4613,
Level
16,
State
Grantor does not have GRANT permission.
1,
Line
2
Krok 2 - Nadaj uprawnienia uŜywając polecenia GRANT
►
►
Przełącz się do okna dcl_1.sql).
Zaznacz i uruchom (F5) fragment kodu oznaczony w komentarzu jako
(3).
Bazy danych
109
-- (3) nadaj uprawnienia do wykonywania polecenia
SELECT
-- w tabeli Wydawnictwa uzytkownikowi Czytelnik1
GRANT SELECT ON Wydawnictwa TO Czytelnik1
GO
PowyŜszy kod powoduje nadanie uŜytkownikowi Czytelnik1 uprawnień do
wykonywania polecenia SELECT w tabeli Wydawnictwa.
►
►
Przełącz się do okna dcl_2.sql uruchomionego w kontekście
uŜytkownika Czytelnik1
Zaznacz i uruchom (F5) ponownie fragmenty kodu oznaczone w
komentarzach jako (1) i (2).
Tym razem powinno wynikiem działania kodu powinno być wyświetlenie
zawartości tabeli Wydawnictwa.
►
Zaznacz i uruchom (F5) ponownie fragment kodu oznaczony w
komentarzu jako (3).
I tym razem nie udaje się nadać praw innemu uŜytkownikowi. Czyli nadanie
uprawnień do wykonywania polecenia nie jest równoznaczne z umoŜliwieniem
nadawania uprawnień innym uŜytkownikom.
Nie musisz nadawać uprawnień do wykonywania kaŜdego polecenia
SQL osobno. Jeśli na przykład chcesz nadać uŜytkownikowi
Czytelnik1 uprawnienia do wykonywania wszystkich poleceń SQL w
tabeli Wydawnictwa, uŜyj składni:
GRANT ALL ON Wydawnictwa TO Czytelnik1
Krok 3 - Cofnij uprawnienia uŜywając polecenia REVOKE
►
►
Przełącz się do okna dcl_1.sql).
Zaznacz i uruchom (F5) fragment kodu oznaczony w komentarzu jako
(4).
-(4)
cofnij
uprawnienia
do
wykonywania
polecenia SELECT
-- w tabeli Wydawnictwa uzytkownikowi Czytelnik1
REVOKE SELECT ON Wydawnictwa FROM Czytelnik1
GO
PowyŜszy kod spowoduje cofnięcie uprzednio nadanych uŜytkownikowi
Czytelnik1 uprawnień do wykonywania polecenia SELECT w tabeli
Wydawnictwo.
►
►
Przełącz się do okna dcl_2.sql).
Zaznacz i uruchom (F5) ponownie fragment kodu oznaczony w
komentarzu jako (3).
110
Bazy danych
Po cofnięciu uprawnień do wykonania polecenia SELECT uruchomienie
tego fragmentu skryptu zwraca informację o błędzie.
Krok 4 - Odbierz uprawnienia uŜywając polecenia DENY
►
►
►
►
Przełącz się do okna dcl_1.sql).
Zaznacz i uruchom (F5) ponownie fragment kodu oznaczony w
komentarzu jako (3) (polecenie GRANT).
Przełącz się do okna dcl_2.sql).
Zaznacz i uruchom (F5) ponownie fragment kodu oznaczony w
komentarzu jako (2) (polecenie SELECT).
PoniewaŜ juŜ tą operację wykonywaliśmy, wiesz doskonale, Ŝe uruchomienie
kodu z poleceniem SELECT spowoduje wyświetlenie zawartości tabeli
Wydawnictwa (uŜytkownik ma nadane uprawnienia).
►
►
Przełącz się ponownie do okna dcl_1.sql).
Zaznacz i uruchom (F5) fragment kodu oznaczony w komentarzu jako
(5).
-- (5) zabron wykonywania polecenia SELECT
-- w tabeli Wydawnictwa grupie Czytelnicy
DENY SELECT ON Wydawnictwa TO Czytelnicy
GO
PowyŜszy kod spowoduje zabronienie wszystkim uŜytkownikom w grupie
Czytelnicy (czyli u nas konkretnie uŜytkownikom Czytelnik1 i Czytelnik2)
wykonywania polecenia SELECT w tabeli Wydawnictwa.
►
►
Przełącz się ponownie do okna dcl_2.sql).
Zaznacz i uruchom (F5) ponownie fragment kodu oznaczony w
komentarzu jako (2) (polecenie SELECT).
Tym razem okaŜe się, Ŝe nie moŜemy wykonać polecenia SELECT. Dzieje się
tak dlatego, Ŝe przed momentem zabroniliśmy grupie Czytelnicy, do której
naleŜy uŜytkownik, w którego kontekście pracujemy, wykonywania polecenia
SELECT.
Bazy danych
111
Zapamiętaj, Ŝe uprawnienia do wykonywania poleceń SQL mogą mieć
trzy ustawienia:
- brak nadanych i odebranych uprawnień (nie wykonaliśmy
Ŝadnego polecenia DDL, albo polecenie REVOKE),
- nadane uprawnienia (wykonaliśmy polecenie GRANT),
- odebrane uprawnienie (wykonaliśmy polecenie DENY).
Polecenie REVOKE słuŜy do wycofywania uprawnień pozytywnych
(nadanych poleceniem GRANT) i negatywnych ("odebranych"
poleceniem DENY).
Pamiętaj, Ŝe uprawnienia uŜytkownika sumują się z
uprawnieniami grupy. Przy czym uprawnienia negatywne biorą
górę nad pozytywnymi.
Stąd jeśli odbierzemy grupie uprawnienia do wykonywania polecenia,
to uŜytkownicy mimo indywidualnie nadanych uprawnień nie będą
mogli tego polecenia wykonywać.
112
Bazy danych
Najczęściej wykonywanymi w bazach danych poleceniami SQL są
polecenia języka DML: SELECT,INSERT,UPDATE oraz DELETE.
Krok 1 - Przygotuj tabelę testową do ćwiczeń z poleceniami DML
►
►
►
►
►
►
►
Zaloguj się do maszyny wirtualnej ZBD jako uŜytkownik
Administrator z hasłem P@ssw0rd.
Kliknij Start. Z grupy programów Microsoft SQL Server 2005
uruchom SQL Server Management Studio.
W oknie logowania kliknij Connect.
Kliknij w menu głównym programu Management Studio na File.
Kliknij Open - File.
Odszukaj plik C:\Labs\Lab4\dml_1.sql i kliknij Open
Zaznacz i uruchom (klawisz F5) fragment kodu
-- (1) przygotujmy tabele do testowania
-- polecen jezyka DML
USE Northwind
GO
SELECT EmployeeID, LastName, FirstName, BirthDate
INTO Employees_kopia
FROM Employees
GO
INSERT INTO
Employees_kopia(LastName,FirstName,BirthDate)
VALUES ('Smith','Michael','1960-05-29 12:30')
GO
W powyŜszym kodzie ustawiamy bazę danych Northwind (wybraliśmy ją,
poniewaŜ jest gotowa do uŜycia - jest w niej duŜo danych) jako bazę roboczą.
Następnie skopiowaliśmy cztery kolumny tabeli Employees do nowej tabeli
Employees_kopia (Ŝeby nie "popsuć" tabeli oryginalnej, będziesz pracować na
kopii). Ostatnią operacją jest dodanie jednego rekordu do utworzonej tabeli.
Krok 2 - Zapoznaj się z działaniem polecenia SELECT
►
Zaznacz i uruchom (F5) fragment kodu oznaczony w komentarzu jako
(2).
-- (2) wyswietlmy cala zawartosc tabeli
SELECT *
FROM Employees_kopia
GO
Wynikiem działania tego kodu jest wyświetlenie całej zawartości (gwiazdka
wybiera wszystkie kolumny) tabeli Employees_kopia:
Bazy danych
113
EmployeeID LastName
FirstName BirthDate
----------- -------------------- ---------- ----------------------10
Smith
Michael
1960-05-29 12:30:00.000
1
Davolio
Nancy
1948-12-08 00:00:00.000
2
Fuller
Andrew
1952-02-19 00:00:00.000
3
Leverling
Janet
1963-08-30 00:00:00.000
4
Peacock
Margaret 1937-09-19 00:00:00.000
5
Buchanan
Steven
1955-03-04 00:00:00.000
6
Suyama
Michael
1963-07-02 00:00:00.000
7
King
Robert
1960-05-29 00:00:00.000
8
Callahan
Laura
1958-01-09 00:00:00.000
9
Dodsworth
Anne
1966-01-27 00:00:00.000
►
Zaznacz i wykonaj (F5) fragment kodu oznaczony w komentarzu jako
(3).
-- (3) wybierzmy kolumny, ktore chcemy wyswietlic
SELECT LastName, FirstName
FROM Employees_kopia
GO
Wynikiem działania tego kodu jest wyświetlenie wszystkich kolumn LastName
oraz FirstName dla wszystkich rekordów (czyli ograniczenie liczby kolumn):
LastName FirstName
-------------------- -------Smith
Michael
Davolio
Nancy
Fuller
Andrew
Leverling Janet
Peacock
Margaret
Buchanan Steven
Suyama
Michael
King
Robert
Callahan
Laura
Dodsworth Anne
►
Zaznacz i uruchom (F5) fragment kodu oznaczony w komentarzu jako
(4).
-- (4) dodajmy literal i alias
SELECT 'Imie i nazwisko: ' + FirstName + ' ' +
LastName AS Osoba
FROM Employees_kopia
GO
Wynikiem działania tego kodu jest wyświetlenie jako pojedynczej kolumny
tekstu "Imie i nazwisko: " oraz imienia i nazwiska osoby oddzielonych spacją:
114
Bazy danych
Osoba
--------------------------------Imie i nazwisko: Michael Smith
Imie i nazwisko: Nancy Davolio
Imie i nazwisko: Andrew Fuller
Imie i nazwisko: Janet Leverling
Imie i nazwisko: Margaret Peacock
Imie i nazwisko: Steven Buchanan
Imie i nazwisko: Michael Suyama
Imie i nazwisko: Robert King
Imie i nazwisko: Laura Callahan
Imie i nazwisko: Anne Dodsworth
Stałe łańcuchy tekstowe wstawiane w wynik zapytania (jak w tym wypadku
"Imie i nazwisko: " oraz spacja) nazywamy literałami. Natomiast nazwę
wyświetlanej kolumny nadaną przy pomocy słowa kluczowego AS nazywamy
aliasem.
Alias nie jest nazwą własną. Jest to tylko tymczasowy (istniejący tylko
dla zapytania, w którym został zdefiniowany; nigdzie nie zapisywany
na stałe) nagłówek kolumny. MoŜe zawierać napis będący nazwą innej
kolumny lub obiektu bazy danych.
►
Zaznacz i uruchom (F5) fragment kodu oznaczony w komentarzu jako
(5).
-- (5) nie wyswietlajmy duplikatow
SELECT DISTINCT FirstName
FROM Employees_kopia
GO
Wynikiem działania tego kodu jest wyświetlenie listy imion osób z usunięciem
imion powtarzających się (w tabeli są dwie osoby o imieniu Michael - słowo
DISTINCT powoduje wyświetlenie powtarzającego się wyniku tylko raz):
FirstName
---------Andrew
Anne
Janet
Laura
Margaret
Michael
Nancy
Robert
Steven
Słowo DISTINCT oprócz usunięcia duplikatów z wyników, ignoruje
takŜe wartości puste w zbiorze rekordów (tzn. gdy w wybranym
zestawie zdarzy się wiersz o pustych wszystkich polach, nie zostanie
on wyświetlony).
Bazy danych
►
115
Zaznacz i uruchom (F5) fragment kodu oznaczony w komentarzu jako
(5).
-- (6) sortujmy rekordy rosnaco (ASC) i malejaco
(DESC)
SELECT LastName, FirstName, BirthDate
FROM Employees_kopia ORDER BY BirthDate
GO
Wynikiem działania tego kodu jest wyświetlenie listy osób (nazwisk, imion i
dat urodzenia) posortowanej wg daty urodzenia (od najstarszej osoby do
najmłodszej).
LastName FirstName BirthDate
-------------------- ---------- ----------------------Peacock
Margaret 1937-09-19 00:00:00.000
Davolio
Nancy
1948-12-08 00:00:00.000
Fuller
Andrew
1952-02-19 00:00:00.000
Buchanan Steven
1955-03-04 00:00:00.000
Callahan
Laura
1958-01-09 00:00:00.000
King
Robert
1960-05-29 00:00:00.000
Smith
Michael
1960-05-29 12:30:00.000
Suyama
Michael
1963-07-02 00:00:00.000
Leverling Janet
1963-08-30 00:00:00.000
Dodsworth Anne
1966-01-27 00:00:00.000
►
Teraz usuń znaki komentarza (dwa myślniki) poprzedzające słowo
DESC w powyŜszym fragmencie i ponownie zaznacz i uruchom
fragment oznaczony jako (6).
-- (6) sortujmy rekordy rosnaco (ASC) i malejaco
(DESC)
SELECT LastName, FirstName, BirthDate
FROM Employees_kopia ORDER BY BirthDate DESC
GO
Wynikiem działania tego kodu jest wyświetlenie listy osób (nazwisk, imion
i dat urodzenia) posortowanej wg daty urodzenia. Ale tym razem sortowanie
następuje od najmłodszej osoby do najstarszej.
LastName FirstName BirthDate
-------------------- ---------- ----------------------Dodsworth Anne
1966-01-27 00:00:00.000
Leverling Janet
1963-08-30 00:00:00.000
Suyama
Michael
1963-07-02 00:00:00.000
Smith
Michael
1960-05-29 12:30:00.000
King
Robert
1960-05-29 00:00:00.000
Callahan
Laura
1958-01-09 00:00:00.000
Buchanan Steven
1955-03-04 00:00:00.000
Fuller
Andrew
1952-02-19 00:00:00.000
Davolio
Nancy
1948-12-08 00:00:00.000
Peacock
Margaret 1937-09-19 00:00:00.000
116
Bazy danych
Sortowanie następuje wg kolejności alfabetycznej. Cyfry w alfabecie
znajdują się przed literami.
Kierunek sortowania określa słowo kluczowe ASC lub DESC
występujące po nazwie kolumny w klauzuli ORDER BY.
ASC oznacza sortowanie rosnąco (domyślny kierunek sortowania,
słowo ASC jest opcjonalne), zaś DESC oznacza sortowanie malejąco.
►
Zaznacz i uruchom (F5) fragment kodu oznaczony w komentarzu jako
(7).
-- (7) ograniczmy liczbe rekordow
SELECT LastName, FirstName
FROM Employees_kopia
WHERE LastName = 'Davolio'
GO
Wynikiem działania tego kodu jest wyświetlenie nazwisk i imion wszystkich
osób o nazwisku Davolio (tu - jedna osoba).
LastName FirstName
-------------------- ---------Davolio
Nancy
Zapamiętaj, Ŝe klauzula WHERE słuŜy do ograniczenia liczby
zwracanych przez zapytanie rekordów. Klauzula ta występuje w
większości zapytań budowanych dla baz danych i aplikacji
bazodanowych. Warunki w klauzuli nie muszą dotyczyć jednej
kolumny.
►
Zaznacz i uruchom (F5) fragment kodu oznaczony w komentarzu jako
(8).
-- (8) wyprobujmy operator wiekszosci
SELECT LastName, FirstName, BirthDate
FROM Employees_kopia
WHERE Birthdate >= '1960-01-01'
GO
Wynikiem działania tego kodu jest wyświetlenie wszystkich osób urodzonych 1
stycznia 1960 roku lub później.
LastName FirstName BirthDate
-------------------- ---------- ----------------------Smith
Michael
1960-05-29 12:30:00.000
Leverling Janet
1963-08-30 00:00:00.000
Suyama
Michael
1963-07-02 00:00:00.000
King
Robert
1960-05-29 00:00:00.000
Dodsworth Anne
1966-01-27 00:00:00.000
Bazy danych
117
Dwuargumentowe operatory porównania w T-SQL to: = ("równe"), >
("większe"),
<
("mniejsze"),
>=
("większe/równe"),
<=
("mniejsze/równe"), <> ("nie równe").
►
Zaznacz i uruchom (F5) fragment kodu oznaczony w komentarzu jako
(9).
-- (9) trick z data + operator AND
SELECT LastName, FirstName, BirthDate
FROM Employees_kopia
WHERE BirthDate = '1960-05-29'
GO
SELECT LastName, FirstName, BirthDate
FROM Employees_kopia
WHERE BirthDate >= '1960-05-29' AND BirthDate <
'1960-05-30'
GO
Wynikiem działania pierwszego zapytania SELECT w powyŜszym kodzie jest
wyświetlenie osoby urodzonej 29 maja 1960 roku ale dokładnie o godzinie
0:00.
LastName FirstName BirthDate
-------------------- ---------- ----------------------King
Robert
1960-05-29 00:00:00.000
Wynikiem działania drugiego zapytania SELECT w powyŜszym kodzie jest
wyświetlenie listy wszystkich osób urodzonych 29 maja 1960 roku o dowolnej
godzinie. Zwróć uwagę na operator AND, który słuŜy do łączenia wrunków
(spełnione muszą być wszystkie warunki łączone operatorami AND).
LastName FirstName BirthDate
-------------------- ---------- ----------------------Smith
Michael
1960-05-29 12:30:00.000
King
Robert
1960-05-29 00:00:00.000
Pamiętaj, Ŝe typ danych datetime zawiera oprócz daty takŜe godzinę.
Oznacza to, Ŝe aby wyszukać pola zawierające konkretną datę (nie
uwzględniając godziny), musisz uŜyć chwytu z drugiego zapytania
SELECT w powyŜszym kodzie.
Dotyczy to w szczególności sytuacji, gdy do wstawiania daty uŜywasz
jakiejkolwiek funkcji pobierającej aktualną datę i godzinę (np. funkcji
języka T-SQL GetDate).
118
Bazy danych
►
Zaznacz i uruchom (F5) fragment kodu oznaczony w komentarzu jako
(10).
-- (10) wyprobujmy operator OR
SELECT LastName, FirstName, BirthDate
FROM Employees_kopia
WHERE BirthDate < '1950-01-01' OR BirthDate >=
'1960-01-01'
GO
Wynikiem działania powyŜszego kodu jest wyświetlenie listy osób urodzonych
przed 1 stycznia 1950 roku lub po 1 stycznia 1960 roku (włącznie z tą datą).
Zwróć uwagę na operator OR, który powoduje, Ŝe spełnienie któregokolwiek
z warunków kwalifikuje rekord do wyświetlenia (inaczej niŜ w przypadku
operatora AND, gdzie wszystkie warunki musiały być jednocześnie spełnione).
LastName
FirstName BirthDate
-------------------- ---------- -----------------------------------------------------Smith
Michael 1960-05-29 12:30:00.000
Davolio
Nancy 1948-12-08 00:00:00.000
Leverling
Janet 1963-08-30 00:00:00.000
Peacock
Margaret 1937-09-19 00:00:00.000
Suyama
Michael 1963-07-02 00:00:00.000
King
Robert 1960-05-29 00:00:00.000
Dodsworth
Anne
1966-01-27 00:00:00.000
►
Zaznacz i uruchom (F5) fragment kodu oznaczony w komentarzu jako
(11).
-- (11) wyszukajmy w zbiorze wartosci
SELECT LastName, FirstName
FROM Employees_kopia
WHERE LastName IN ('Davolio','Smith')
GO
Wynikiem działania powyŜszego kodu jest wyświetlenie listy osób o
nazwiskach naleŜących do zbioru umieszczonego w nawiasie po słowie
kluczowym IN.
LastName
FirstName
-------------------- ---------Smith
Michael
Davolio
Nancy
Zapytania SELECT ze słowem kluczowym IN są wykonywane tak
samo jak zapytania SELECT z operatorem OR i rozdzielającym
warunki przyrównania (=). Na przykład odpowiednikiem powyŜszego
kodu jest zapytanie:
SELECT LastName, FirstName
FROM Employees_kopia
WHERE LastName = 'Davolio' OR LastName = 'Smith'
Zaletą uŜycia słowa IN jest bardziej zwięzła forma (szczególnie, gdy
lista ma więcej niŜ dwie pozycje).
Bazy danych
►
119
Zaznacz i uruchom (F5) fragment kodu oznaczony w komentarzu jako
(12).
-- (12) wyszukajmy w przedziale wartosci
SELECT LastName, FirstName, BirthDate
FROM Employees_kopia
WHERE BirthDate BETWEEN '1950-01-01' AND '196001-01'
GO
Wynikiem wykonania powyŜszego kodu jest wyświetlenie wszystkich osób
urodzonych pomiędzy (ang. between) 1 stycznia 1950 roku a 1 stycznia 1960
roku (obie daty wchodzą w zakres).
LastName
FirstName BirthDate
-------------------- ---------- -----------------------------------------------------Fuller
Andrew 1952-02-19 00:00:00.000
Buchanan
Steven 1955-03-04 00:00:00.000
Callahan
Laura
1958-01-09 00:00:00.000
►
Zaznacz i uruchom (F5) fragment kodu oznaczony w komentarzu jako
(13).
-- (13) uzyjmy operatora LIKE
SELECT LastName, FirstName, BirthDate
FROM Employees_kopia
WHERE LastName LIKE '[A-F]%'
GO
Wynikiem wykonania powyŜszego kodu jest wyświetlenie listy osób, których
nazwiska (kolumna LastName) rozpoczynają się od liter z przedziału od A do
F (natomiast znak procent oznacza dowolny łańcuch znaków dowolnej
długości).
LastName
FirstName BirthDate
-------------------- ---------- -----------------------Davolio
Nancy 1948-12-08 00:00:00.000
Fuller
Andrew 1952-02-19 00:00:00.000
Buchanan
Steven 1955-03-04 00:00:00.000
Callahan
Laura
1958-01-09 00:00:00.000
Dodsworth
Anne
1966-01-27 00:00:00.000
►
Zaznacz i uruchom (F5) fragment kodu oznaczony w komentarzu jako
(14).
-- (14) zastosujmy funkcje T-SQL
SELECT AVG(DateDiff(year,BirthDate,GetDate())) AS
[Sredni wiek pracownika]
FROM Employees_kopia
GO
120
Bazy danych
Wynikiem wykonania powyŜszego kodu jest wyświetlenie średniego wieku
osób z tabeli Employees_kopia. Wartość ta jest obliczana przy uŜyciu funkcji:
•
•
•
•
AVG - oblicza średnią arytmetyczną,
DateDiff - oblicza róŜnicę między datami (argument year mówi, Ŝe
róŜnica będzie obliczona w latach),
GetDate - zwraca aktualną datę i godzinę.
Sredni wiek pracownika
---------------------47
PowyŜszy wynik został uzyskany w następujący sposób:
1. pobrana została aktualna data i godzina (GetDate),
2. następnie obliczono róŜnicę (DateDiff) między uzyskaną aktualną datą
a datą urodzenia osoby (wartość pola BirthDate), róŜnicę tę wyraŜono
w latach (słowo year) - w ten sposób dla kaŜdej osoby uzyskano wiek
w latach,
3. wreszcie wyciągnięto średnią arytmetyczną (AVG) z uzyskanych
wcześniej wartości.
4.
T-SQL zawiera wiele przydatnych funkcji. Ich listę i opisy moŜesz
obejrzeć w Books Online wchodząc w indeks i wyszukując słowa
functions.
►
Zaznacz i uruchom (F5) fragment kodu oznaczony w komentarzu jako
(15).
-- (15) zliczmy rekordy w tabeli
SELECT Count(*) AS [Liczba osob]
FROM Employees_kopia
GO
Wynikiem wykonania powyŜszego kodu jest wyświetlenie liczby wszystkich
rekordów z tabeli Employees_kopia przy uŜyciu funkcji Count.
Liczba osob
----------10
Funkcja Count jest jedną z waŜniejszych funkcji T-SQL. Stosuje się ją
na przykład w sytuacjach, gdy liczba rekordów w tabeli nie powinna
przekraczać określonej granicy (konstruuje się wyzwalacze uŜywające
tej funkcji).
Bazy danych
►
121
Zaznacz i uruchom (F5) fragment kodu oznaczony w komentarzu jako
(16).
-- (16) ciekawostka - SQL jako kalkulator
SELECT 2*2
GO
W ramach ciekawostki spieszymy Cię poinformować, Ŝe SQL moŜe stać się
takŜe podręcznym kalkulatorem (i do tego bardzo precyzyjnym - zaleŜnie od
ustawień precyzji serwera). Wynikiem wykonania powyŜszego kodu będzie
wyświetlenie wyniku działania.
----------4
Krok 3 - Zapoznaj się z działaniem polecenia INSERT
►
Zaznacz i uruchom (F5) fragment kodu oznaczony w komentarzu jako
(17).
-- (17) dodajmy nowy rekord
INSERT INTO
Employees_kopia(LastName,FirstName,BirthDate)
VALUES ('Richardson','Mark','1961-03-12')
GO
Wynikiem wykonania powyŜszego kodu jest dodanie nowego rekordu do tabeli
Employees_kopia i zwrócenie informacji o ilości dodanych rekordów. W
odpowiednie pola wstawione są następujące wartości:
•
•
•
w kolumnie LastName wartość Richardson,
w kolumnie FirstName wartość Mark,
w kolumnie BirthDate wartość 1961-03-12.
Dobrym nawykiem jest podawanie w poleceniu INSERT po nazwie
tabeli nazw kolumn, w które wstawiamy wartości. Inaczej musimy
znać kolejność kolumn w definicji tabeli.
Polecenie INSERT nie umoŜliwia wstawiania wartości w kolumny
z autonumeracją (naleŜy te kolumny pomijać w składni polecenia).
►
Zaznacz i uruchom (F5) ponownie fragment kodu oznaczony
w komentarzu jako (2), by sprawdzić, czy rzeczywiście dodaliśmy
rekord.
122
Bazy danych
EmployeeID LastName
FirstName BirthDate
----------- -------------------- ---------- ----------------------10
Smith
Michael 1960-05-29 12:30:00.000
11
Richardson
Mark
1961-03-12 00:00:00.000
1
Davolio
Nancy
1948-12-08 00:00:00.000
2
Fuller
Andrew 1952-02-19 00:00:00.000
3
Leverling
Janet 1963-08-30 00:00:00.000
4
Peacock
Margaret 1937-09-19 00:00:00.000
5
Buchanan
Steven 1955-03-04 00:00:00.000
6
Suyama
Michael 1963-07-02 00:00:00.000
7
King
Robert 1960-05-29 00:00:00.000
8
Callahan
Laura
1958-01-09 00:00:00.000
9
Dodsworth
Anne
1966-01-27 00:00:00.000
Krok 4 - Zapoznaj się z działaniem polecenia UPDATE
►
Zaznacz i uruchom (F5) fragment kodu oznaczony w komentarzu jako
(18).
-- (18) zmienmy istniejacy rekord
UPDATE Employees_kopia
SET LastName = 'Richards'
WHERE LastName = 'Richardson'
GO
Wynikiem wykonania powyŜszego kodu jest zmiana nazwiska osoby o
nazwisku Richardson na Richards i zwrócenie informacji o liczbie zmienionych
rekordów.
►
Zaznacz i uruchom (F5) ponownie fragment kodu oznaczony w
komentarzu jako (2), by sprawdzić, czy rzeczywiście zmieniliśmy
nazwisko osoby.
EmployeeID LastName
FirstName BirthDate
----------- -------------------- ---------- -----------------------------------------------------10
Smith
Michael 1960-05-29 12:30:00.000
11
Richards
Mark
1961-03-12 00:00:00.000
1
Davolio
Nancy
1948-12-08 00:00:00.000
2
Fuller
Andrew 1952-02-19 00:00:00.000
3
Leverling
Janet 1963-08-30 00:00:00.000
4
Peacock
Margaret 1937-09-19 00:00:00.000
5
Buchanan
Steven 1955-03-04 00:00:00.000
6
Suyama
Michael 1963-07-02 00:00:00.000
7
King
Robert 1960-05-29 00:00:00.000
8
Callahan
Laura
1958-01-09 00:00:00.000
9
Dodsworth
Anne
1966-01-27 00:00:00.000
Dość często zdarza się, Ŝe chcemy zmienić wartości w całej kolumnie.
Wówczas nie uŜywamy klauzuli WHERE. Na przykład podniesienie
ceny wszystkich produktów o 20% w fikcyjnej tabeli Produkty wiąŜe
się z wykonaniem kodu:
UPDATE Produkty
SET cena = (cena * 1.2)
Bazy danych
123
Krok 5 - Zapoznaj się z metodami usuwania rekordów
►
Zaznacz i uruchom (F5) fragment kodu oznaczony w komentarzu jako
(19).
-- (19) usunmy rekord
DELETE FROM Employees_kopia
WHERE LastName = 'Richards'
GO
Wynikiem działania powyŜszego kodu jest usunięcie wszystkich rekordów,
które w kolumnie LastName mają wstawioną wartość Richards, oraz
zwrócenie informacji o liczbie usuniętych rekordów. W naszym przykładzie
usuniemy jeden rekord.
►
Zaznacz i uruchom (F5) ponownie fragment kodu oznaczony w
komentarzu jako (2), by sprawdzić, czy rzeczywiście usunęliśmy
rekord (poniŜej na szaro zaznaczyliśmy rekord, którego nie zobaczysz
zróconym zestawie rekordów, gdyŜ został usunięty).
EmployeeID LastName
FirstName BirthDate
----------- -------------------- ---------- ----------------------10
Smith
Michael 1960-05-29 12:30:00.000
11
Richardson
Mark
1961-03-12 00:00:00.000
1
Davolio
Nancy
1948-12-08 00:00:00.000
2
Fuller
Andrew 1952-02-19 00:00:00.000
3
Leverling
Janet 1963-08-30 00:00:00.000
4
Peacock
Margaret 1937-09-19 00:00:00.000
5
Buchanan
Steven 1955-03-04 00:00:00.000
6
Suyama
Michael 1963-07-02 00:00:00.000
7
King
Robert 1960-05-29 00:00:00.000
8
Callahan
Laura
1958-01-09 00:00:00.000
9
Dodsworth
Anne
1966-01-27 00:00:00.000
Jeśli chcesz usunąć wszystkie rekordy z tabeli, po prostu nie
uŜywaj klauzuli WHERE w poleceniu DELETE.
►
Zaznacz i uruchom (F5) fragment kodu oznaczony w komentarzu jako
(20).
-- (20) usunmy zawartosc tabeli
TRUNCATE TABLE Employees_kopia
GO
Wynikiem wykonania powyŜszego kodu jest usunięcie wszystkich rekordów w
tabeli Employees_kopia (moŜesz to sprawdzić zaznaczając i uruchamiając
fragment kodu oznaczony w komentarzu jako (2)).
RóŜnica pomiędzy poleceniami DELETE a TRUNCATE TABLE jest
taka, Ŝe działanie pierwszego z wymienionych poleceń zapisywane jest
w dzienniku transakcji (czyli ewentualnie moŜe być operacją
odwracalną), natomiast druga nie (jest nieodwracalna).