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).