Wykonywanie podstawowych zapytań. Schemat bazy danych

Podobne dokumenty
SQL Server SQL & Transact SQL. Database schema

Blaski i cienie wyzwalaczy w relacyjnych bazach danych. Mgr inż. Andrzej Ptasznik

Programowanie w SQL procedury i funkcje. UWAGA: Proszę nie zapominać o prefiksowaniu nazw obiektów ciągiem [OLIMP\{nr indeksu}] Funkcje użytkownika

Systemowe aspekty baz

050 SQL ELEMENTY ZAAWANSOWANE. Prof. dr hab. Marek Wisła

Relacyjne bazy danych. Podstawy SQL

Wyzwalacz - procedura wyzwalana, składowana fizycznie w bazie, uruchamiana automatycznie po nastąpieniu określonego w definicji zdarzenia

Systemowe aspekty baz danych

LAB 6 BEGIN TRANSACTION, COMMIT, ROLLBACK, SET TRANSACTION ISOLATION LEVEL,

Struktura bazy danych

Relacyjne bazy danych. Podstawy SQL

SQL Server i T-SQL w mgnieniu oka : opanuj język zapytań w 10 minut dziennie / Ben Forta. Gliwice, Spis treści

Tworzenie tabel. Bazy danych - laboratorium, Hanna Kleban 1

Wykład 5. SQL praca z tabelami 2

Administracja i programowanie pod Microsoft SQL Server 2000

Paweł Rajba

Przestrzenne bazy danych Podstawy języka SQL

Informatyka (5) SQL. dr inż. Katarzyna Palikowska Katedra Transportu Szynowego p. 4 Hydro

Microsoft SQL Server Podstawy T-SQL

Język SQL, zajęcia nr 1

Podstawy języka T-SQL : Microsoft SQL Server 2016 i Azure SQL Database / Itzik Ben-Gan. Warszawa, Spis treści

Wykład 8. SQL praca z tabelami 5

DECLARE VARIABLE zmienna1 typ danych; BEGIN

Podstawy języka SQL. SQL Structured Query Languagestrukturalny

SELECT * FROM tabela WHERE warunek wybiera dane spełniające podany warunek

T-SQL dla każdego / Alison Balter. Gliwice, cop Spis treści. O autorce 11. Dedykacja 12. Podziękowania 12. Wstęp 15

SQL (ang. Structured Query Language)

Informatyka sem. III studia inżynierskie Transport 2018/19 LAB 2. Lab Backup bazy danych. Tworzenie kopii (backup) bazy danych

Sprawdzenie poziomu izolacji transakcji (w aktualnym połączeniu):

SQL 4 Structured Query Lenguage

Wykład 6. SQL praca z tabelami 3

BAZY DANYCH Cz III. Transakcje, Triggery

LAB 3 (część 1 Projektu)

PODSTAWY BAZ DANYCH 13. PL/SQL

Aspekty aktywne baz danych

ACESS- zadania z wykorzystaniem poleceń SQL

Wprowadzenie do BD Operacje na bazie i tabelach Co poza zapytaniami? Algebra relacji. Bazy Danych i Systemy informacyjne Wykład 2.

Bazy danych SQL Server 2005

Systemy GIS Tworzenie zapytań w bazach danych

Bazy danych. dr inż. Arkadiusz Mirakowski

Instytut Mechaniki i Inżynierii Obliczeniowej Wydział Mechaniczny Technologiczny Politechnika Śląska

Procedury wyzwalane. (c) Instytut Informatyki Politechniki Poznańskiej 1

strukturalny język zapytań używany do tworzenia i modyfikowania baz danych oraz do umieszczania i pobierania danych z baz danych

Wykład 5 funkcje i procedury pamiętane widoki (perspektywy) wyzwalacze

Plan bazy: Kod zakładający bazę danych: DROP TABLE noclegi CASCADE; CREATE TABLE noclegi( id_noclegu SERIAL NOT NULL,

BAZA DANYCH SIECI HOTELI

Hurtownia Świętego Mikołaja projekt bazy danych

Microsoft SQL Server. Tradycyjna architektura klientserwer. Przeniesienie części logiki na serwer. Programowanie Transact SQL

Używany kiedy pełna treść instrukcji SQL jest nieznana przed uruchomieniem programu.

Bazy danych 10. SQL Widoki

Wprowadzenie do projektowania i wykorzystania baz danych Relacje

Zbiór zadań z SQLa z elementami T-SQLa. (Wersja robocza z dnia r.) (Zgłaszanie usterek Robert.Fidytek@inf.ug.edu.pl)

Zadania z SQLa (MS SQL Server)

3 Przygotowali: mgr inż. Barbara Łukawska, mgr inż. Maciej Lasota

Bazy danych. Bazy danych. Zapytania SELECT. Dr inż. Paweł Kasprowski.

Tworzenie zapytań do Microsoft SQL Server

Administracja i programowanie pod Microsoft SQL Server 2000

Przykłady najlepiej wykonywać od razu na bazie i eksperymentować z nimi.

040 STRUCTURED QUERY LANGUAGE. Prof. dr hab. Marek Wisła

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

Bazy danych. Bazy danych. Podstawy języka SQL. Dr inż. Paweł Kasprowski.

Transakcje inf. podstawowe

PROJEKTOWANIE BAZ DANYCH

na MS SQLServer 2005 i 2008

Wyzwalacze (triggery) Przykład

Obowiązuje od wersji

Instrukcja podwaja zarobki osób, których imiona zaczynają się P i dalsze litery alfabetu zakładamy, że takich osbób jest kilkanaście.

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

SQL :: Data Definition Language

Podstawy języka SQL. standardy SQL formułowanie zapytań operacje na strukturach danych manipulowanie danymi. Bazy danych s.5-1

Autor: Joanna Karwowska

Obsługa błędów w SQL i transakcje. Obsługa błędów w SQL

Język SQL, zajęcia nr 2

UPDATE Studenci SET Rok = Rok + 1 WHERE Rodzaj_studiow =' INŻ_ST'; UPDATE Studenci SET Rok = Rok 1 WHERE Nr_albumu IN ( '111345','100678');

Język SQL podstawy zapytań

1. Połączenie z bazą danych. W wybranym edytorze tworzymy plik sqltest.py i umieszczamy w nim poniższy kod. #!/usr/bin/python3 import sqlite3

Ref. 7 - Język SQL - polecenia DDL i DML

Grupowanie i funkcje agregujące

Elementy. języka SQL

Programowanie po stronie serwera w SZBD. Robert A. Kłopotek Wydział Matematyczno-Przyrodniczy. Szkoła Nauk Ścisłych, UKSW

SQL w praktyce. Miłej i owocnej nauki!!!

77. Modelowanie bazy danych rodzaje połączeń relacyjnych, pojęcie klucza obcego.

Bazy Danych - Instrukcja do Ćwiczenia laboratoryjnego nr 8

1 DML - zapytania, część II Grupowanie Operatory zbiorowe DML - modyfikacja 7. 3 DCL - sterowanie danymi 9.

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

Konstruowanie Baz Danych SQL UNION, INTERSECT, EXCEPT

P o d s t a w y j ę z y k a S Q L

Ćwiczenia laboratoryjne nr 11 Bazy danych i SQL.

I. Język manipulowania danymi - DML (Data Manipulation Language). Polecenia INSERT, UPDATE, DELETE

Język PL/SQL Procedury i funkcje składowane

Widok Connections po utworzeniu połączenia. Obszar roboczy

Bazy danych Język SQL część 2 Wykład dla studentów matem

Bazy Danych i Usługi Sieciowe

W SQL Serwerze 2008 wprowadzono parametry tablicowe (Table Valued Parameters - TVP).

E.14 Bazy Danych cz. 18 SQL Funkcje, procedury składowane i wyzwalacze

Bazy danych 7. SQL podstawy

Bazy danych Ćwiczenia projektowe

Bazy danych i usługi sieciowe

w PL/SQL bloki nazwane to: funkcje, procedury, pakiety, wyzwalacze

Transkrypt:

Wykonywanie podstawowych zapytań Schemat bazy danych 1

Schemat bazy danych Składnia SELECT SELECT [predykat] { * tabela.* [tabela.]pole1 [AS alias1] [, [tabela.]pole2 [AS alias2] [,...]]} FROM krotka [,...] [IN zewnętrzna baza] [WHERE... ] [GROUP BY... ] [HAVING... ] [ORDER BY... ] [WITH OWNERACCESS OPTION] Predykaty w SELECT SELECT [ALL DISTINCT DISTINCTROW [TOP n [PERCENT]]] FROM tabela 2

Przykłady SELECT Wybranie wszystkich pól z tabeli zarobki SELECT * FROM zarobki Aliasy pól i tabel oraz klauzula WHERE SELECT o.nazwisko AS nazwa FROM Osoby AS o WHERE o.idosoby>3; Przykłady SELECT Zapytanie wybierające z wyrażeniem SELECT brutto, 0.8*brutto AS dochod FROM zarobki SELECT brutto, idosoby*brutto AS cos FROM zarobki 3

Zapytania wybierające Przykłady podstawowe Wyświetlenie trzech wybranych pól z tabeli SELECT Nazwisko, Imie, Wiek FROM Osoby; Wyświetlenie wszystkich pól z tabeli SELECT * FROM Osoby; Zapytania wybierające Wyrażenia i Aliasy pól Wyświetlenie iloczynu dwóch pól SELECT wiek*wzrost AS Iloczyn FROM Osoby; Wyświetlenie łączne Imienia i Nazwiska SELECT Nazwisko + ' ' + Imie AS Osoba FROM Osoby; 4

Zapytania wybierające Wyrażenia i Aliasy w sortowaniu Sortowanie wg wyrażenia SELECT wiek*wzrost AS Iloczyn FROM Osoby ORDER BY wiek*wzrost; Sortowanie wg aliasu SELECT wiek*wzrost AS Iloczyn FROM Osoby ORDER BY Iloczyn; Zapytania wybierające Operatory Algebraiczne + dodawanie - odejmowanie * mnożenie / dzielenie % modulo Logiczne AND iloczyn bitowy (AND) OR suma bitowa (OR) NOT przeczenie bitowe (NOT) + Konaktacja łańcucha 5

Zapytania wybierające Sortowanie Sortowanie według pojedynczego pola - rosnąco SELECT Nazwisko, Imie FROM Osoby ORDER BY Wiek; Sortowanie według pojedynczego pola - rosnąco SELECT Nazwisko, Imie FROM Osoby ORDER BY Wiek ASC; Zapytania wybierające Sortowanie Sortowanie według pojedynczego pola - malejąco SELECT Nazwisko, Imie FROM Osoby ORDER BY Wiek DESC; Sortowanie według dwóch pól SELECT Nazwisko, Imie FROM Osoby ORDER BY Wiek ASC, Wzrost DESC; 6

Zapytania wybierające Filtrowanie Filtrowanie wg wyrażenia algebraicznego SELECT Nazwisko, Imie FROM Osoby WHERE Wiek >30; Filtrowanie wg wyrażenia logicznego SELECT Nazwisko, Imie FROM Osoby WHERE Wiek >30 AND Wiek <50; Zapytania wybierające Operatory algebraiczne = równe < mniejsze niż <= mniejsze niż lub równe > większe niż >= większe niż lub równe <> różne!= nie równe 7

Zapytania wybierające Operatory logiczne NOT negacja OR suma logiczna AND iloczyn logiczny AND TRUE FALSE NULL OR TRUE FALSE NULL TRUE TRUE FALSE NULL TRUE TRUE TRUE TRUE FALSE FALSE FALSE FALSE FALSE TRUE FALSE NULL NULL NULL FALSE NULL NULL TRUE NULL NULL Zapytania wybierające Operatory specjalne BETWEEN IN LIKE ANY SOME ALL EXISTS przedział dwustronnie domknięty lista podobny do wzorca prawda jeśli jedna pozycja na liście prawdziwa prawda jeśli kilka pozycji na liście prawdziwych prawda jeśli wszystkie pozycje na liście prawdziwe prawda jeśli zapytanie zwraca rekordy 8

Zapytania wybierające Filtrowanie - BETWEEN SELECT Nazwisko, Imie FROM Osoby WHERE Wiek BETWEEN 30 AND 50; Równoważne zapytanie SELECT Nazwisko, Imie FROM Osoby WHERE Wiek >=30 AND Wiek <=50; Zapytania wybierające Filtrowanie IN SELECT Nazwisko, Imie FROM Osoby WHERE Wiek IN (20, 30, 40); Równoważne zapytanie SELECT Nazwisko, Imie FROM Osoby WHERE Wiek = 20 OR Wiek = 30 OR Wiek = 40; 9

Zapytania wybierające Filtrowanie IN SELECT Nazwisko, Imie FROM Osoby WHERE Nazwisko IN ('Kowalski', 'Nowak'); Równoważne zapytanie SELECT Nazwisko, Imie FROM Osoby WHERE Nazwisko = 'Kowalski' OR Nazwisko= 'Nowak' Zapytania wybierające Filtrowanie LIKE SELECT Nazwisko, Imie FROM Osoby WHERE Nazwisko LIKE 'KOW'; Równoważne zapytanie SELECT Nazwisko, Imie FROM Osoby WHERE Nazwisko = 'KOW'; 10

Zapytania wybierające Operator LIKE - znaki specjalne % dowolny ciąg znaków (w tym ciąg pusty) _ dokładnie jeden znak Zapytania wybierające Operator LIKE - znaki specjalne przykłady Nazwiska rozpoczynające się od frazy KOW Nazwiska kończące się frazą KOW SELECT Nazwisko, Imie FROM Osoby WHERE Nazwisko LIKE 'KOW%'; SELECT Nazwisko, Imie FROM Osoby WHERE Nazwisko LIKE '%KOW'; Nazwiska posiadające w środku frazę KOW SELECT Nazwisko, Imie FROM Osoby WHERE Nazwisko LIKE '%KOW%'; 11

Zapytania wybierające Operator LIKE - znaki specjalne przykłady cd Nazwiska rozpoczynające się od litery K a kończące literą I SELECT Nazwisko, Imie FROM Osoby WHERE Nazwisko LIKE 'K%I'; Nazwiska w których na trzeciej pozycji występuje litera W SELECT Nazwisko, Imie FROM Osoby WHERE Nazwisko LIKE ' W%'; Nazwiska w których występuje znak % SELECT Nazwisko, Imie FROM Osoby WHERE Nazwisko LIKE '[%]%'; Zapytania wybierające Grupowanie Wyznaczenie funkcji agregującej dla grupy (dla każdej osoby) SELECT IdOsoby, SUM(Brutto) AS Razem FROM Zarobki GROUP BY IdOsoby; Wyznaczenie funkcji agregującej dla całej tabeli (wszystkie osoby) SELECT SUM(Brutto) AS Razem FROM Zarobki; 12

Zapytania wybierające Funkcje agregujące AVG wartość średnia SUM suma MAX maksimum MIN minimum STDEV odchylenie standardowe VAR wariacja STDEVP odchylenie populacji VARP wariacja populacji COUNT zlicz n n ( x) 2 x n( n 1) ( x) 2 x n( n 1) 2 2 Zapytania wybierające Złączenia w oparciu o klauzulę WHERE SELECT Nazwisko, Brutto FROM Osoby, Zarobki SELECT Nazwisko, Brutto FROM Osoby, Zarobki WHERE Osoby.IdOsoby=Zarobki.IdOsoby SELECT Nazwa, Nazwisko, Brutto FROM Osoby, Zarobki, Dzialy WHERE Osoby.IdOsoby = Zarobki.IdOsoby AND Dzialy.IdDzialu = Osoby.IdDzialu 13

Zapytania wybierające Złączenia w oparciu o operator JOIN SELECT Nazwisko, Brutto FROM Zarobki JOIN Osoby ON Osoby.IdOsoby=Zarobki.IdOsoby SELECT Nazwa, Nazwisko, Brutto FROM Zarobki JOIN Osoby ON Osoby.IdOsoby = Zarobki.IdOsoby JOIN Dzialy ON Dzialy.IdDzialu = Osoby.IdDzialu INNER Zapytania wybierające Złączenia w oparciu o operator JOIN cd SELECT Nazwisko, Brutto FROM Zarobki RIGHT JOIN Osoby ON Osoby.IdOsoby=Zarobki.IdOsoby SELECT Nazwisko, Brutto FROM Zarobki LEFT JOIN Osoby ON Osoby.IdOsoby=Zarobki.IdOsoby SELECT Nazwisko, Brutto FROM Zarobki FULL JOIN Osoby ON Osoby.IdOsoby=Zarobki.IdOsoby 14

Zapytania wybierające Złączenia i aliasing SELECT Nazwisko, Brutto FROM Zarobki JOIN Osoby ON Osoby.IdOsoby=Zarobki.IdOsoby SELECT Nazwisko, Brutto FROM Zarobki AS Z JOIN Osoby AS O ON O.IdOsoby=Z.IdOsoby SELECT Nazwisko, Brutto FROM Zarobki Z JOIN Osoby O ON O.IdOsoby=Z.IdOsoby Zapytania wybierające Złączenia SELECT Nazwisko, Brutto FROM Zarobki CROSS JOIN Osoby 15

Zapytania wybierające Złączenia optymalizacja i plan wykonania Zapytania wybierające Złączenia optymalizacja i plan wykonania 16

Zapytania wybierające Złączenia optymalizacja i plan wykonania Zapytania wybierające Podzapytania Podzapytanie jako lista dla operatora IN SELECT Nazwisko, Imie FROM Osoby WHERE Nazwisko IN (SELECT Nazwisko FROM ttt); 17

Zapytania wybierające Podzapytania Podzapytanie jako lista dla operatora IN SELECT Nazwisko, Imie FROM Osoby WHERE Nazwisko IN (SELECT Nazwisko FROM ttt) AND Imie IN (SELECT Imie FROM ttt); OSOBY ttt Kowalski Jan Kowalski Nowak Karol Jan Zapytania wybierające Dziwne Złączenia w oparciu o operator JOIN SELECT Osoby.Nazwisko FROM Osoby JOIN ttt ON Osoby.Nazwisko=ttt.Nazwisko OSOBY Idosoby Nazwisko Imie... ttt Nazwisko Imie... 18

Zapytania wybierające Dziwne Złączenia w oparciu o operator JOIN SELECT Osoby.Nazwisko FROM Osoby JOIN ttt ON Osoby.Nazwisko=ttt.Nazwisko AND Osoby.Imie=ttt.Imie... OSOBY Idosoby Nazwisko Imie... ttt Nazwisko Imie... Zapytania wybierające Grupowanie i wyznaczanie średniej dla grupy SELECT Nazwa, AVG(brutto) FROM Dzialy JOIN Osoby ON Dzialy.IdDzialu=Osoby.IdDzialu JOIN Zarobki ON Osoby.IdOsoby=Zarobki.IdOsoby GROUP BY Nazwa 19

Zapytania wybierające Funkcje agregujące Funkcja agregująca Opis AVG COUNT COUNT (*) MAX MIN SUM STDEV STDEVP VAR VARP Średnia wartości wyrażenia Ilość wartości not NULL Ilość wierszy Maksymalna wartość wyrażenia Minimalna wartość wyrażenia Suma wyrażenia Odchylenie standardowe Odchylenie standardowe populacji Wariancja Wariancja wartości dla populacji n n ( x) 2 x n( n 1) ( x) 2 x n( n 1) 2 2 Zapytania wybierające Grupowanie i wyznaczanie średniej dla grupy (podwójne grupowanie) SELECT opis, Nazwisko, AVG(brutto) FROM Dzialy JOIN Osoby ON Dzialy.IdDzialu=Osoby.IdDzialu JOIN Zarobki ON Osoby.IdOsoby=Zarobki.IdOsoby GROUP BY opis,nazwisko, Osoby.IdOsoby 20

Zapytania wybierające Grupowanie z klauzulą WHERE SELECT opis, Nazwisko, AVG(brutto) FROM Dzialy JOIN Osoby ON Dzialy.IdDzialu=Osoby.IdDzialu JOIN Zarobki ON Osoby.IdOsoby=Zarobki.IdOsoby WHERE Brutto >100 GROUP BY opis,nazwisko, Osoby.IdOsoby Zapytania wybierające Grupowanie z klauzulą HAVING SELECT opis, Nazwisko, AVG(brutto) FROM Dzialy JOIN Osoby ON Dzialy.IdDzialu=Osoby.IdDzialu JOIN Zarobki ON Osoby.IdOsoby=Zarobki.IdOsoby GROUP BY opis,nazwisko, Osoby.IdOsoby HAVING AVG(brutto)>300 Tutaj nie może występować alias nazwy pola 21

Zapytania wybierające Grupowanie z klauzulami WHERE i HAVING SELECT opis, Nazwisko, AVG(brutto) FROM Dzialy JOIN Osoby ON Dzialy.IdDzialu=Osoby.IdDzialu JOIN Zarobki ON Osoby.IdOsoby=Zarobki.IdOsoby WHERE Brutto >100 GROUP BY opis,nazwisko, Osoby.IdOsoby HAVING AVG(brutto)>300 ORDER BY AVG(Brutto) Tutaj może występować alias nazwy pola Zapytania wybierające Grupowanie w podzapytaniu SELECT Nazwisko FROM Osoby WHERE IdOsoby IN (SELECT IdOsoby FROM Zarobki GROUP BY IdOsoby HAVING SUM(brutto)>300) SELECT Nazwisko, Imie FROM Osoby WHERE Nazwisko IN (SELECT Nazwisko FROM Osoby GROUP BY Nazwisko HAVING COUNT(Nazwisko) >1) 22

Zapytania wybierające Grupowanie z klauzulami ROLLUP i CUBE SELECT opis, Nazwisko, SUM(brutto) FROM Dzialy JOIN Osoby ON Dzialy.IdDzialu=Osoby.IdDzialu JOIN Zarobki ON Osoby.IdOsoby=Zarobki.IdOsoby GROUP BY opis,nazwisko, Osoby.IdOsoby WITH ROLLUP --WITH CUBE ORDER BY AVG(Brutto) Grupowanie z klauzulami ROLLUP i CUBE Administracja Janik 555,00 Administracja Nowak 1332,00 Administracja NULL 1887,00 Dyrekcja Kowalski 2109,00 Dyrekcja NULL 2109,00 Techniczny Adamczyk 777,00 Techniczny Kow 222,00 Techniczny NULL 999,00 NULL NULL 4995,00 Administracja Janik 555,00 Administracja Nowak 1332,00 Administracja NULL 1887,00 Dyrekcja Kowalski 2109,00 Dyrekcja NULL 2109,00 Techniczny Adamczyk 777,00 Techniczny Kow 222,00 Techniczny NULL 999,00 NULL NULL 4995,00 NULL Adamczyk 777,00 NULL Janik 555,00 NULL Kow 222,00 NULL Kowalski 2109,00 NULL Nowak 1332,00 23

WITH CUBE; ROLLUP SELECT Nazwa, Nazwisko, SUM(Brutto) FROM Dzialy JOIN Osoby ON Dzialy.Iddzialu=Osoby.Iddzialu JOIN Zarobki On Osoby.Idosoby=Zarobki.Idosoby GROUP BY Nazwa, Nazwisko WITH ROLLUP SELECT Nazwa, Nazwisko, SUM(Brutto) FROM Dzialy JOIN Osoby ON Dzialy.Iddzialu=Osoby.Iddzialu JOIN Zarobki On Osoby.Idosoby=Zarobki.Idosoby GROUP BY Nazwa, Nazwisko WITH CUBE DateTime and Security Functions (Transact-SQL) SELECT YEAR(GETDATE()); SELECT DATEPART(hh, GETDATE()); SELECT CURRENT_USER, SESSION_USER, SYSTEM_USER,SCHEMA_NAME(), SUSER_ID(),SUSER_NAME(SUSER_ID()), USER_NAME(SUSER_ID()); 24

Funkcje OVER PARTITION SELECT Idosoby, Brutto, ROW_NUMBER() OVER (ORDER BY Idosoby)AS RowNumber FROM Zarobki SELECT Idosoby, Brutto, ROW_NUMBER() OVER ( PARTITION BY idosoby ORDER BY Brutto DESC)AS RowNumber FROM Zarobki Funkcje OVER PARTITION SELECT Idosoby, Brutto, Dense_Rank() OVER (PARTITION BY Idosoby ORDER BY Brutto)AS D_Rank FROM Zarobki SELECT Idosoby, Brutto, Rank() OVER (PARTITION BY idosoby ORDER BY brutto)as Rank FROM Zarobki SELECT Idosoby, Brutto, Ntile(2) OVER (PARTITION BY idosoby ORDER BY Brutto)AS N_Rank FROM ZAROBKI 25

Ranking Functions (Transact-SQL) Ustala ranking według wzrostu w obrębie działu. Dla równych wartości taki sam ranking ale następny zwiększany o N SELECT IdDzialu,Wzrost, RANK() OVER (PARTITION BY IdDzialu ORDER BY Wzrost DESC) AS RANK FROM Osoby IdDzialu Wzrost RANK ORDER BY Iddzialu 1 1.82 1 1 1.67 2 1 1.67 2 1 NULL 4 2 1.75 1 2 1.72 2 2 1.68 3 3 1.78 1 3 1.72 2 5 1.73 1 Ranking Functions (Transact-SQL) Ustala ranking według wzrostu w obrębie działu. Dla równych wartości taki sam ranking ale następny zwiększany o 1 SELECT IdDzialu,Wzrost, DENSE_RANK() OVER (PARTITION BY IdDzialu ORDER BY Wzrost DESC) AS RANK FROM Osoby ORDER BY Iddzialu IdDzialu Wzrost RANK 1 1.82 1 1 1.67 2 1 1.67 2 1 NULL 3 2 1.75 1 2 1.72 2 2 1.68 3 3 1.78 1 3 1.72 2 5 1.73 1 26

Ranking Functions (Transact-SQL) Ustala numer wiersza według wzrostu w obrębie działu. Dla równych wartości numer wiersza losowo SELECT IdDzialu,Wzrost, ROW_NUMBER() OVER (PARTITION BY IdDzialu order by Wzrost DESC) AS NUMER_WIERSZA FROM Osoby ORDER BY Iddzialu IdDzialu Wzrost NUMER_WIERSZA 1 1.82 1 1 1.67 2 1 1.67 3 1 NULL 4 2 1.75 1 2 1.72 2 2 1.68 3 3 1.78 1 3 1.72 2 5 1.73 1 Ranking Functions (Transact-SQL) Ustala numer wiersza według wzrostu w obrębie klastra (liczba klastrów dana parametrem) działu. Dla równych wartości numer wiersza losowo SELECT IdDzialu,Wzrost, NTILE(2) OVER (PARTITION BY IdDzialu ORDER BY Wzrost DESC) AS NUMER_WIERSZA FROM Osoby ORDER BY Iddzialu IdDzialu Wzrost NUMER_WIERSZA 1 1.82 1 1 1.67 1 1 1.67 2 1 NULL 2 2 1.75 1 2 1.72 1 2 1.68 2 3 1.78 1 3 1.72 2 5 1.73 1 27

Funkcje agregujące nad partycją (Transact-SQL) SELECT IdDzialu, Osoby.IdOsoby, Brutto, SUM(Brutto) OVER (PARTITION BY IdDzialu) AS suma, Brutto / SUM(Brutto) OVER(PARTITION BY IdDzialu) AS udzial FROM Osoby JOIN Zarobki ON Osoby.IdOsoby=Zarobki.IdOsoby Funkcje agregujące nad partycją (Transact-SQL) SELECT IdDzialu, Osoby.IdOsoby, Brutto, SUM(Brutto) OVER (PARTITION BY Osoby.IdOsoby) AS suma, Brutto / SUM(Brutto) OVER(PARTITION BY IdDzialu) AS udzial, SUM(Brutto) OVER (PARTITION BY Osoby.IdOsoby)/ SUM(Brutto) OVER(PARTITION BY IdDzialu) AS udzial_w_dziale FROM Osoby JOIN Zarobki ON Osoby.IdOsoby=Zarobki.IdOsoby 28

Informacje o... SELECT HOST_ID (),HOST_NAME (), APP_NAME() SELECT @@SERVERNAME, @@SERVICENAME, @@DBTS; EXEC sp_who Zapytania wybierające Zastosowanie SOME, ANY i ALL SELECT Brutto FROM Zarobki WHERE Brutto > ANY (SELECT AVG(Brutto)FROM Zarobki GROUP BY IdOsoby) ROWNOWAŻNE SELECT Brutto FROM Zarobki WHERE Brutto > SOME (SELECT AVG(Brutto)FROM Zarobki GROUP BY IdOsoby) SELECT AVG(Brutto) FROM Zarobki GROUP BY IdOsoby SELECT Brutto FROM Zarobki WHERE Brutto > ALL (SELECT AVG(Brutto)FROM Zarobki GROUP BY IdOsoby) 29

Zapytania wybierające Klauzula COMPUTE SELECT Nazwa, Nazwisko, Brutto FROM Dzialy LEFT JOIN Osoby ON Dzialy.IdDzialu=Osoby.IdDzialu LEFT JOIN Zarobki ON Osoby.IdOsoby=Zarobki.IdOsoby ORDER BY Nazwa COMPUTE SUM(Brutto) BY Nazwa Zapytania wybierające Zamiast klauzuli COMPUTE SELECT Nazwa, Nazwisko, SUM(Brutto)As RazemO, RazemD FROM Dzialy JOIN Osoby ON Dzialy.IdDzialu=Osoby.IdDzialu JOIN Zarobki ON Osoby.IdOsoby=Zarobki.IdOsoby JOIN (SELECT Osoby.IdDzialu, SUM(brutto) AS RazemD FROM Dzialy JOIN Osoby ON Dzialy.IdDzialu=Osoby.IdDzialu JOIN Zarobki ON Osoby.IdOsoby=Zarobki.IdOsoby GROUP BY Osoby.IdDzialu) as xxx ON Osoby.IdDzialu=xxx.IdDzialu GROUP BY Nazwa, Nazwisko, zarobki.idosoby, RazemD 30

Zapytania wybierające Klauzula COMPUTE cd SELECT Nazwa, Nazwisko, Brutto FROM Dzialy LEFT JOIN Osoby ON Dzialy.IdDzialu=Osoby.IdDzialu LEFT JOIN Zarobki ON Osoby.IdOsoby=Zarobki.IdOsoby ORDER BY Nazwa, Nazwisko COMPUTE SUM(Brutto) BY Nazwa, Nazwisko COMPUTE SUM(Brutto) BY Nazwa Na każdym poziomie grupowania można wyznaczać wiele różnych funkcji agregujących Zapytania wybierające Klauzula COMPUTE cd SELECT Nazwa, Nazwisko, Brutto FROM Dzialy LEFT JOIN Osoby ON Dzialy.IdDzialu=Osoby.IdDzialu LEFT JOIN Zarobki ON Osoby.IdOsoby=Zarobki.IdOsoby Na każdym poziomie grupowania można wyznaczać wiele różnych funkcji agregujących ORDER BY Nazwa, Nazwisko COMPUTE SUM(Brutto) BY Nazwa, Nazwisko COMPUTE SUM(Brutto), AVG(Brutto) BY Nazwa 31

Zapytania wybierające Klauzula Pivot SELECT kto, [1] AS D1, [2] AS D2, [3] AS D3, [4] AS D4, [5] AS D5 FROM (SELECT IdDzialu, Nazwisko+ ' '+ Imie as Kto, Brutto FROM Osoby JOIN Zarobki ON Osoby.IdOsoby=Zarobki.IdOsoby) ppp PIVOT ( SUM (Brutto) Kto D1 D2 D3 D4 D5 FOR IdDzialu IN 1 Adamczyk Janusz NULL NULL 777,00 NULL NULL 2 Janik Paweł NULL 555,00 NULL NULL NULL ( [1], [2], [3], [4], [5] ) 3 Kow Piotr NULL NULL 666,00 NULL NULL ) AS pvt 4 Kowalczyk Jarosław NULL NULL 777,00 NULL NULL 5 Kowalski Jan 2109,00 NULL NULL NULL NULL ORDER BY kto 6 Nowak Karol NULL 1332,00 NULL NULL NULL 7 Nowicki Jan NULL NULL NULL 2109,00 NULL 8 Zięba Andrzej 333,00 NULL NULL NULL NULL Zapytania wybierające Predykat TOP SELECT TOP 5 Nazwisko, Imie FROM Osoby ORDER BY Wzrost SELECT TOP 5 Nazwisko, Imie FROM Osoby ORDER BY Wzrost DESC SELECT TOP 5 PERCENT Nazwisko, Imie FROM Osoby ORDER BY Wzrost 32

Zapytania wybierające Predykat DISTINCT SELECT DISTINCT Nazwisko FROM Osoby SELECT DISTINCT Nazwisko, Imie FROM Osoby Zapytania wybierające Operator CASE SELECT Nazwisko, RokUrodz, Wiek= CASE WHEN RokUrodz >=1970 THEN 'Młody' WHEN RokUrodz >=1960 AND RokUrodz <1970 THEN 'Taki sobie' WHEN RokUrodz <1960 THEN 'Stary' ELSE 'A bo ja wiem' END FROM Osoby 33

Zapytania wybierające Operator CASE można pominąć część warunku jeśli odpowiednia kolejność SELECT Nazwisko, RokUrodz, Wiek= CASE WHEN RokUrodz >1970 THEN 'Młody' WHEN RokUrodz >=1960 THEN 'Taki sobie' WHEN RokUrodz <1960 THEN 'Stary' ELSE 'A bo ja wiem' END FROM Osoby Zapytania wybierające Operator CASE inny sposób aliasowania SELECT Nazwisko, RokUrodz, CASE WHEN RokUrodz >1970 THEN 'Młody' WHEN RokUrodz >=1960 THEN 'Taki sobie' WHEN RokUrodz <1960 THEN 'Stary' ELSE 'A bo ja wiem' END AS Wiek FROM Osoby 34

Zapytania wybierające UNIA Suma dwóch zapytań z eliminacją powtarzających się rekordów SELECT Nazwisko, Imie FROM Osoby UNION SELECT Nazwisko, Imie FROM ttt; Suma dwóch zapytań SELECT Nazwisko, Imie FROM Osoby UNION ALL SELECT Nazwisko, Imie FROM ttt; Zapytania wybierające UNIA Część wspólna dwóch zapytań SELECT Nazwisko, Imie FROM Osoby INTERSECT SELECT Nazwisko, Imie FROM ttt; Różnica dwóch zapytań SELECT Nazwisko, Imie FROM Osoby EXCEPT SELECT Nazwisko, Imie FROM ttt; 35

Wyprowadzenie danych do formatu XML SELECT Nazwisko, Imie FROM Osoby FOR XML AUTO SKUTEK XML_F52E2B61-18A1-11d1-B105-00805F49916B ------------------------------------------------------------------------------------------------- <osoby nazwisko="kowalski" imie="jan"/> <osoby nazwisko="nowak" imie="karol"/> <osoby nazwisko="kow" imie="piotr"/> <osoby nazwisko="janik" imie="paweł"/> <osoby nazwisko="kowalik" imie="paweł"/> <osoby nazwisko="lis" imie="janusz"/> <osoby nazwisko="kowalski"... Wyprowadzenie danych do formatu XML SELECT Nazwa, Nazwisko, Imie FROM Dzialy JOIN Osoby ON Osoby.IdDzialu=Dzialy. IdDzialu FOR XML AUTO SKUTEK XML_F52E2B61-18A1-11d1-B105-00805F49916B ---------------------------------------------------------------------------------------------------- <dzialy nazwa="dyrekcja"> <osoby nazwisko="kowalski" imie="jan"/> </dzialy><dzialy nazwa="administracja"> <osoby nazwisko="nowak" imie="karol"/> </dzialy><dzialy nazwa="techniczny"> <osoby nazwisko="kow" imie="piotr"/> </dzialy><dzialy nazwa="administracja"> <oso... 36

Wyprowadzenie danych do formatu XML SELECT Nazwa, Nazwisko, Imie FROM Dzialy LEFT JOIN Osoby ON Osoby.IdDzialu=Dzialy. IdDzialu FOR XML AUTO SKUTEK Nie ma pracowników Dyrekcji XML_F52E2B61-18A1-11d1-B105-00805F49916B ---------------------------------------------------------------------------------------------------- <dzialy nazwa="dyrekcja"> <osoby/> </dzialy><dzialy nazwa="administracja"><osoby nazwisko="nowak" imie="karol"/><osoby nazwisko="janik" imie="paweł"/><osoby nazwisko="lis" imie="janusz"/></dzialy><dzialy nazwa="techniczny"><osoby nazwisko="kow" imie="piotr"/ Wyprowadzenie danych do formatu XML SELECT Nazwisko, Imie FROM Osoby FOR XML AUTO, ELEMENTS SKUTEK XML_F52E2B61-18A1-11d1-B105-00805F49916B ---------------------------------------------------------------------------------------------------- <osoby> <nazwisko>kowalski</nazwisko> <imie>jan</imie> </osoby> <osoby> <nazwisko>nowak</nazwisko> <imie>karol</imie> </osoby> <osoby> <nazwisko>kow</nazwisko> <imie>piotr</imie> </osoby> <osoby> <nazwisko>janik</nazwisko> <imie>paweł</imie> </osoby> <osoby> <nazwisko>kowa... 37

Wyprowadzenie danych do formatu XML SELECT Nazwa, Nazwisko, Imie FROM Dzialy JOIN Osoby ON Osoby.IdDzialu=Dzialy. IdDzialu FOR XML AUTO, ELEMENTS SKUTEK XML_F52E2B61-18A1-11d1-B105-00805F49916B ---------------------------------------------------------------------------------------------------- <dzialy> <nazwa>dyrekcja</nazwa> <osoby> <nazwisko>kowalski</nazwisko> <imie>jan</imie> </osoby> </dzialy> <dzialy> <nazwa>administracja</nazwa> <osoby> <nazwisko>nowak</nazwisko> <imie>karol</imie> </osoby> </dzialy> <dzialy> <nazwa>techniczny</nazwa> <osoby> <nazwisko>ko... Wyprowadzenie danych do formatu XML SELECT Nazwa, Nazwisko, Imie FROM Dzialy LEFT JOIN Osoby ON Osoby.IdDzialu=Dzialy. IdDzialu FOR XML AUTO, ELEMENTS SKUTEK Nie ma pracowników Dyrekcji XML_F52E2B61-18A1-11d1-B105-00805F49916B ---------------------------------------------------------------------------------------------------- <dzialy><nazwa>dyrekcja</nazwa><osoby/></dzialy><dzialy><nazwa >Administracja</nazwa><osoby><nazwisko>Nowak</nazwisko><imie >Karol</imie></osoby><osoby><nazwisko>Janik</nazwisko><imie>P aweł</imie></osoby><osoby><nazwisko>lis</nazwisko><imie>janus z</imie></os 38

Zapytania modyfikujące Tworzenie tabeli i wstawianie danych z istniejącej tabeli Kopiowanie tabeli SELECT Nazwisko, wiek INTO Nowa1 FROM Osoby Zapytania modyfikujące Wstawianie danych INSERT INTO Nowa VALUES ('KOWAL', 'JAN', 33); INSERT INTO Nowa(Nazwisko, Imie) VALUES ('NOWAK','KAROL'); 39

Zapytania modyfikujące Wstawianie danych z istniejącej tabeli INSERT INTO Nowa SELECT Nazwisko, Imie, Wiek FROM Osoby WHERE Wiek >30 ORDER BY Nazwisko; INSERT INTO Nowa(Imie, Nazwisko) SELECT Imie, Nazwisko FROM Osoby WHERE Wiek <30 ORDER BY Nazwisko DESC; Zapytania modyfikujące Wstawianie do pola z ustawionym Identity SET IDENTITY_INSERT Dzialy ON; INSERT INTO dzialy (IdDzialu, Nazwa) VALUES (-13, 'Jakiś') SELECT * FROM Dzialy; SET IDENTITY_INSERT Dzialy OFF; Lista pól jest obowiązkowa 40

Zapytania modyfikujące Nawiasy są obowiązkowe INSERT TOP (5) INTO Nowa SELECT Nazwisko, Imie, RokUrodz FROM Osoby ORDER BY RokUrodz DESC SELECT * FROM Nowa DELETE FROM Nowa Nawiasy nie są obowiązkowe INSERT INTO Nowa SELECT TOP 5 Nazwisko, Imie, RokUrodz FROM Osoby Order by RokUrodz DESC SELECT * FROM Nowa DELETE FROM Nowa Nie działa sortowanie dla TOP() Działa sortowanie dla TOP() Zapytania modyfikujące UPDATE Nowa SET Wiek = 0 WHERE Wiek IS NULL; Modyfikacja danych UPDATE Nowa SET Nazwisko = UPPER(Nazwisko), Imie = UPPER(Imie); 41

Zapytania modyfikujące Usuwanie danych DELETE FROM Nowa WHERE Wiek IS NULL; DELETE FROM Nowa; TRUNCATE TABLE Nowa; Zapytania modyfikujące - OUTPUT DECLARE @test TABLE( Komu int NOT NULL, stara int, nowa int, kiedy datetime); Zmienna tabelaryczna UPDATE Zarobki SET Brutto=1.1 * Brutto OUTPUT INSERTED.IdOsoby, DELETED.Brutto, INSERTED.Brutto, getdate() INTO @test WHERE IdOsoby<3 SELECT * FROM @test 42

Zapytania modyfikujące - OUTPUT DECLARE @test TABLE( Komu int NOT NULL, nowa int, kiedy datetime); INSERT INTO Zarobki OUTPUT INSERTED.IdOsoby, INSERTED.Brutto, getdate() INTO @test VALUES(2, 111) SELECT * FROM @test DELETE FROM Zarobki OUTPUT DELETED.* WHERE brutto IS NULL Działa jak SELECT Zapytania tworzące tabelę CREATE TABLE Nowa ( Nazwisko varchar (15), Imie varchar (15), Wiek integer ); Proste Ograniczenia CREATE TABLE Nowa ( IdOsoby int IDENTITY (1, 1) NOT NULL PRIMARY KEY, Nazwisko varchar(20) NULL, Imie varchar(20) NULL ); 43

Zapytania tworzące tabelę Klucz główny złożony DROP TABLE nnn; CREATE TABLE nnn (Nazwisko varchar(15), Imie varchar(15), CONSTRAINT klucz PRIMARY KEY (Nazwisko,Imie)); INSERT INTO nnn VALUES('KOWAL','JAN'); INSERT INTO nnn VALUES('KOWAL','KAROL'); INSERT INTO nnn VALUES('KOWAL','JAN'); SELECT * FROM nnn; Zapytania tworzące tabelę CREATE TABLE T1 ( nr1 int IDENTITY, nr2 uniqueidentifier ); INSERT INTO T1 (nr2) VALUES (NEWID()); INSERT INTO T1 DEFAULT VALUES; SELECT * FROM T1; Zamiast minimalny rozmiar varchar nr2 varchar(36) SKUTEK 1 DAA7C652-101F-443B-9378-4F55AE7BA3CD 2 NULL 44

Zapytania tworzące tabelę UNIQUE DROP TABLE nnn; CREATE TABLE nnn (Nazwisko varchar(15), Imie varchar(15), CONSTRAINT spr UNIQUE (Nazwisko,Imie)); INSERT INTO nnn VALUES('KOWAL','JAN'); INSERT INTO nnn VALUES('KOWAL','KAROL'); INSERT INTO nnn VALUES('KOWAL','JAN'); SELECT * FROM nnn; Zapytania tworzące tabelę Ograniczenia DROP TABLE nnn; CREATE TABLE nnn (nr integer PRIMARY KEY, Nazwisko varchar(15) NOT NULL, Imie varchar(15) DEFAULT 'Brak', m_v integer CHECK (m_v>10)); INSERT INTO nnn(nr, Nazwisko, Imie, m_v) VALUES(1,'KOWAL','JAN',20); INSERT INTO nnn(nr, Nazwisko, m_v) VALUES(2,'KOWAL',30); INSERT INTO nnn(nr, Nazwisko, Imie, m_v) VALUES(3,'KOWAL','JAN',4); SELECT * FROM nnn; 45

Zapytania tworzące tabelę Ograniczenia cd DROP TABLE nnn; CREATE TABLE nnn (nr integer PRIMARY KEY, Nazwisko varchar(15) NOT NULL, Imie varchar(15) DEFAULT 'Brak', m_v integer CHECK (m_v>10), mm_v integer CHECK (mm_v<300)); INSERT INTO nnn(nr, Nazwisko, Imie, m_v, mm_v) VALUES(1,'KOWAL','JAN',20,50); INSERT INTO nnn(nr, Nazwisko, m_v,mm_v) VALUES(2,'KOWAL',30,100); INSERT INTO nnn(nr, Nazwisko, Imie, m_v,mm_v) VALUES(3,'KOWAL','JAN',4,100); Zapytania tworzące tabelę Ograniczenia cd DROP TABLE nnn; CREATE TABLE nnn (nr integer PRIMARY KEY, Nazwisko varchar(15) NOT NULL, Imie varchar(15) DEFAULT 'Brak', m_v integer CHECK (m_v>10), mm_v integer CHECK (mm_v<300), CONSTRAINT spr CHECK(m_v <mm_v)); INSERT INTO nnn(nr, Nazwisko, Imie, m_v, mm_v) VALUES(1,'KOWAL','JAN',20,50); INSERT INTO nnn(nr, Nazwisko, m_v,mm_v) VALUES(2,'KOWAL',30,100); INSERT INTO nnn(nr, Nazwisko, Imie, m_v,mm_v) VALUES(3,'KOWAL','JAN',4,100); 46

Ustanowienie wartości domyślnej DROP TABLE tts CREATE TABLE tts (nr1 int, ddd datetime DEFAULT getdate(), oo varchar(10), pp varchar(10), CONSTRAINT sss CHECK (Left(pp,1)=Left(oo,1)) INSERT INTO tts DEFAULT VALUES; 47

Tworzenie tabeli z zastosowaniem ograniczeń dla daty DROP TABLE Nowa CREATE TABLE Nowa (nr1 int IDENTITY(1,1) PRIMARY KEY, d1 datetime DEFAULT getdate(), d2 datetime, CONSTRAINT spr CHECK(d2>getdate()) ); INSERT INTO Nowa VALUES('2007-05-10','2007-05-11') INSERT INTO Nowa (d2) VALUES('2007-05-11') SELECT * FROM Nowa Zapytania tworzące tabelę Klucz obcy referencyjny CREATE TABLE Nagrody ( IdNagrody int NOT NULL PRIMARY KEY, IdOsoby int NOT NULL FOREIGN KEY REFERENCES Osoby(IdOsoby) ON DELETE NO ACTION, Nagroda varchar(15) ) 48

Zapytania tworzące tabelę Klucz obcy referencyjny cd CREATE TABLE Nagrody ( IdNagrody int NOT NULL PRIMARY KEY, IdOsoby int NOT NULL FOREIGN KEY REFERENCES Osoby(IdOsoby) ON DELETE CASCADE ON UPDATE CASCADE, Nagroda varchar(15) ) Zapytania tworzące tabelę Tabela Tymczasowa lokalna DROP TABLE #MyTempTable CREATE TABLE #MyTempTable (nr INT PRIMARY KEY) INSERT INTO #MyTempTable VALUES (1) SELECT * FROM #MyTempTable 49

Zapytania tworzące tabelę Tabela Tymczasowa globalna DROP TABLE ##MyTempTable CREATE TABLE ##MyTempTable (nr INT PRIMARY KEY) INSERT INTO ##MyTempTable VALUES (1) SELECT * FROM ##MyTempTable Zapytania modyfikujące tabelę ALTER TABLE wys_tab ADD nr integer; ALTER SELECT * FROM wys_tab; ALTER TABLE wys_tab ALTER COLUMN nr varchar(3); INSERT INTO wys_tab(nr) VALUES('aaa'); SELECT * FROM wys_tab; 50

Zapytania modyfikujące tabelę ALTER cd DROP TABLE nnn; CREATE table nnn (nr integer, Nazwisko varchar(15) NULL, CONSTRAINT kl PRIMARY KEY(nr)); INSERT INTO nnn(nr,nazwisko) VALUES(1,'KOWAL'); INSERT INTO nnn(nr) values(2); ALTER TABLE nnn DROP COLUMN nr; SELECT * FROM nnn; Zapytania modyfikujące tabelę ALTER TABLE wys_tab DROP COLUMN nr; ALTER cd 1 SELECT * FROM wys_tab; ALTER TABLE nnn DROP CONSTRAINT spr; INSERT INTO nnn(nr, Nazwisko, m_v, mm_v) VALUES(2,'KOWAL',30,20); SELECT * FROM nnn; 51

Zapytania modyfikujące tabelę ALTER cd 1 ALTER TABLE Nowa ADD CONSTRAINT kl PRIMARY KEY (nr); INSERT INTO Nowa(nr, Nazwisko) VALUES(2,'KOWAL'); SELECT * FROM nnn; Zapytanie usuwające tabelę Bez zastosowania i z zastosowaniem EXISTS DROP TABLE Nowa; IF EXISTS (SELECT Table_Name FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Rodzaj') DROP TABLE Rodzaj 52

Widok - perspektywa Tworzenie widoku CREATE VIEW Dane AS SELECT Nazwisko, Imie FROM Osoby CREATE VIEW Dane_check AS SELECT Nazwisko, Imie, Wzrost FROM Osoby WHERE wzrost > 1.80 WITH CHECK OPTION Nie zezwala na wprowadzenie danych niezgodnych z warunkiem w klauzuli WHERE Widok - perspektywa Zastosowanie EXISTS do usuwania widoku IF EXISTS (SELECT * FROM SYSOBJECTS WHERE Id = Object_Id(N'OsobyWiev') AND OBJECTPROPERTY(Id, N'IsView') = 1) DROP VIEW OsobyWiev CREATE VIEW OsobyWiev AS SELECT Nazwisko, Imie, Wzrost FROM Osoby 53

Widok - perspektywa Wstawianie danych do widoku INSERT INTO Dane VALUES ('Kowalski','Wiesław') INSERT INTO Sklad(Nazwisko, Imie) VALUES ('Kowalski','Wiesław') Procedura składowana Tworzenie procedury CREATE PROCEDURE ap_wyb @nazw varchar(40)='%', @im varchar(20)='%' AS SELECT Nazwisko, Imie FROM Osoby WHERE Nazwisko LIKE @nazw + '%' AND Imie LIKE @im + '%' 54

Procedura składowana CREATE PROCEDURE licz @mini real = 0, @ile int OUTPUT AS SELECT @ile=count(idosoby) FROM Osoby WHERE Wzrost > @mini DECLARE @ile int EXEC licz 1.8, @ile OUTPUT PRINT @ile Wykonanie zapytania danego zmienną DECLARE @k AS Varchar(20), @zap Varchar(200) SET @k='imie' SET @zap='select ' + @k + ' FROM Osoby' EXEC (@zap) 55

Procedura składowana Procedury zagnieżdżone DROP PROCEDURE innerproc DROP PROCEDURE outerproc CREATE PROCEDURE innerproc AS SELECT @@NESTLEVEL AS 'Inner Level' EXEC outerproc CREATE PROCEDURE outerproc AS SELECT @@NESTLEVEL AS 'Outer Level' EXEC innerproc EXECUTE outerproc Poziom zagnieżdżenia Wartość maksymalna 32 Dynamiczny SQL DROP TABLE zarobki_prac CREATE TABLE zarobki_prac ( zrodlo varchar(11) NOT NULL, kto int NOT NULL, Nazwisko varchar(40) NOT NULL, ile money NOT NULL ); CREATE PROCEDURE spr_dochody AS SELECT 'PROCEDURE', Osoby.IdOsoby, Nazwisko, Brutto FROM Osoby INNER JOIN Zarobki ON Osoby.IdOsoby = Zarobki.IdOsoby WHERE Brutto>500 ORDER BY IdOsoby; 56

Dynamiczny SQL --INSERT...SELECT INSERT zarobki_prac SELECT 'SELECT', Osoby.IdOsoby, Nazwisko, Brutto FROM Osoby INNER JOIN Zarobki ON Osoby.IdOsoby = Zarobki.IdOsoby WHERE Brutto<300 ORDER BY IdOsoby; --INSERT...EXECUTE procedure INSERT zarobki_prac EXECUTE spr_dochody; Dynamiczny SQL --INSERT...EXECUTE('string') INSERT zarobki_prac EXECUTE (' SELECT ''EXEC STRING'', Osoby.IdOsoby, Nazwisko, Brutto FROM Osoby INNER JOIN Zarobki ON Osoby.IdOsoby = Zarobki.IdOsoby WHERE Brutto BETWEEN 300 AND 500 ORDER BY IdOsoby '); SELECT * FROM zarobki_prac; SELECT 1 Kowalski 122,10 SELECT 2 Nowak 111,00 SELECT 3 Kow 222,00 PROCEDURE 1 Kowalski 732,60 PROCEDURE 1 Kowalski 1098,90 PROCEDURE 2 Nowak 976,80 PROCEDURE 4 Janik 555,00 PROCEDURE 8 Adamczyk 777,00 EXEC STRING 1 Kowalski 366,30 EXEC STRING 2 Nowak 488,40 57

Funkcje Funkcja zwracająca wartość CREATE FUNCTION wysocy (@mm decimal (3,2) = 0) RETURNS int AS BEGIN DECLARE @ile int SELECT @ile=count(wzrost) FROM Osoby WHERE Wzrost >= @mm RETURN @ile END WYWOŁANIE DECLARE @a int SET @a=dbo.wysocy(1.5) SELECT @a Funkcja zwracająca rekordy (tabelę) stara postać CREATE FUNCTION wysocy_table (@mm decimal (3,2) = 0) RETURNS @Wysocy TABLE (Nazwisko varchar(15), Wzrost decimal(3,2)) AS BEGIN INSERT INTO @Wysocy SELECT Nazwisko, Wzrost FROM Osoby WHERE Wzrost >= @mm ORDER BY Wzrost DESC RETURN END SELECT * FROM dbo.wysocy_table(1.5) 58

Funkcja zwracająca rekordy (tabelę) nowa postać CREATE FUNCTION wysocyt (@minimum real) RETURNS TABLE AS RETURN ( SELECT Nazwisko,imie, wzrost FROM osoby WHERE wzrost >=@minimum ) SELECT * FROM wysocyt (1.5) Nie jest potrzebne w wywołaniu funkcji zwracającej tabelę stosowanie nazw kwalifikowanych (dbo.wysocyt) wystarczy podać nazwę ale w skalarnych pozostało nawet jeśli określono synonim (do takiego synonimu też nazwa kwalifikowana) Złączenie z funkcją zwracającą rekordy (tabelę) DROP FUNCTION pracownicy CREATE FUNCTION pracownicy (@dzial int) RETURNS TABLE AS RETURN (SELECT Nazwisko, Imie FROM Osoby WHERE IdDzialu = @dzial) SELECT Nazwa, Nazwisko FROM Dzialy CROSS APPLY dbo.pracownicy(iddzialu); SELECT Nazwa, Nazwisko FROM Dzialy OUTER APPLY dbo.pracownicy(iddzialu); Prefiks dbo opcjonalnie 59

Transakcje Tworzenie BEGIN TRANSACTION DECLARE @nr int SELECT Nazwisko FROM Osoby SET @nr=@@rowcount PRINT @nr UPDATE Osoby SET Nazwisko = UPPER(Nazwisko) IF @@ROWCOUNT = @nr COMMIT TRAN IF @@TRANCOUNT > 0 BEGIN PRINT 'Transakcja musi być cofnięta ROLLBACK TRAN END Transakcje Hierarchiczne (zagnieżdżone) CREATE TABLE TestTran (Cola INT PRIMARY KEY, Colb CHAR(3)) BEGIN TRANSACTION OuterTran INSERT INTO TestTran VALUES (1, 'aaa') BEGIN TRANSACTION Inner1 INSERT INTO TestTran VALUES (2, 'bbb') BEGIN TRANSACTION Inner2 INSERT INTO TestTran VALUES (3, 'ccc') COMMIT TRANSACTION Inner2 COMMIT TRANSACTION Inner1 COMMIT TRANSACTION OuterTran 60

Transakcje SAVE punkt wycofania transakcji BEGIN TRANSACTION podwyzka SELECT Brutto FROM ZarobkiWHERE IdOsoby IN (2, 3) UPDATE zarobki SET Brutto = Brutto*1.1 WHERE IdOsoby = 2 SAVE TRANSACTION podwyzka UPDATE zarobki SET brutto = brutto*0.9 WHERE idosoby = 3 SELECT Brutto FROM ZarobkiWHERE IdOsoby= 3 ROLLBACK TRANSACTION podwyzka COMMIT TRANSACTION SELECT Brutto FROM ZarobkiWHERE IdOsoby IN (2, 3) Zastosowanie ustawienia błędu do wyświetlenia komunikatu DECLARE @DBID INT; SET @DBID = DB_ID(); DECLARE @DBNAME NVARCHAR(128); SET @DBNAME = DB_NAME(); RAISERROR (N Identyfikator bazy ID =%d, Nazwa bazy = %s.', 10, -- grupa błędów. 1, -- podgrupa. @DBID, -- Pierwszy argument. @DBNAME); -- Drugi argument. 61

Tworzenie błędów użytkownika --Tworzenie błędu użytkownika sp_addmessage 50001, 15, 'Komunikat'; RAISERROR (50001,10,2) --Nadpisanie definicji błędu i uzupełnienie jej o parametry sp_addmessage 50001, 15, 'Komunikat %d, %s', @replace='replace'; DECLARE @i int, @s varchar(15) SET @i=11 SET @s='napis' RAISERROR (50001,10,2, @i, @s) Zastosowanie ustawienia błędu do wyświetlenia komunikatu w bloku TRY CATCH BEGIN TRY -- RAISERROR z grup 11-19 przeniesie wykonanie do bloku CATCH -- Niższe grupy nie powodują przeniesienia RAISERROR ('Błąd w bloku TRY.', 16, 1 ); END TRY BEGIN CATCH DECLARE @ErrorMessage NVARCHAR(4000); DECLARE @ErrorSeverity INT; DECLARE @ErrorState INT; SELECT @ErrorMessage = ERROR_MESSAGE(), @ErrorSeverity = ERROR_SEVERITY(), @ErrorState = ERROR_STATE(); -- zastosowano RAISERROR w bloku CATCH aby zwrócić -- informacje o błędzie, który spowodował przeniesienie -- wykonywania skryptu do bloku CATCH. RAISERROR (@ErrorMessage, @ErrorSeverity, @ErrorState); END CATCH; 62

Zastosowanie ustawienia błędu do wyświetlenia komunikatu w bloku TRY CATCH BEGIN TRY -- Dzielenie przez zero. SELECT 1/0; END TRY BEGIN CATCH SELECT ERROR_NUMBER() AS NumerBłędu, ERROR_SEVERITY() AS SeverityBłęu, ERROR_STATE() AS StateBłędu, ERROR_PROCEDURE() AS ProceduraBłędu, ERROR_LINE() AS LiniaBłędu, ERROR_MESSAGE() AS KomunikatBłędu; END CATCH; Triggery procedury wyzwalane (wyzwalacze) Tworzenie triggerów CREATE TRIGGER selall ON Osoby FOR INSERT, UPDATE AS SELECT * FROM Osoby CREATE TRIGGER selall1 ON Osoby FOR DELETE AS SELECT Nazwisko FROM Osoby 63

Triggery procedury wyzwalane (wyzwalacze) CREATE TRIGGER up ON Osoby FOR INSERT, UPDATE AS UPDATE Osoby SET Nazwisko=UPPER(Nazwisko), Imie =UPPER(Imie) PRINT 'Wykonano' Wykonuje się dla wszystkich rekordów bez względu na liczbę modyfikowanych lub wstawianych rekordów UPDATE Osoby SET Nazwisko=LOWER(Nazwisko) WHERE IdOsoby >10 UPDATE Osoby Set RokUrodz=0 WHERE RokUrodz IS NULL INSERT INTO Osoby(Nazwisko) VALUES('Nowy') Triggery procedury wyzwalane (wyzwalacze) Z zastosowaniem systemowych tabel tymczasowych CREATE TRIGGER up ON Osoby FOR INSERT, UPDATE AS UPDATE Osoby SET Nazwisko=UPPER(Nazwisko), Imie =UPPER(Imie) WHERE IdOsoby IN (SELECT IdOsoby FROM INSERTED) PRINT 'Wykonano' Wykonuje się tylko dla modyfikowanych lub wstawianych rekordów UPDATE Osoby SET Nazwisko=LOWER(Nazwisko) WHERE IdOsoby >10 UPDATE Osoby Set RokUrodz=0 WHERE RokUrodz IS NULL INSERT INTO Osoby(Nazwisko) VALUES('Nowy') 64

Triggery procedury wyzwalane (wyzwalacze) Z zastosowaniem systemowych tabel tymczasowych CREATE TRIGGER up ON Osoby FOR INSERT, UPDATE AS IF UPDATE(Nazwisko) OR UPDATE(Imie) BEGIN UPDATE Osoby SET Nazwisko=UPPER(Nazwisko), Imie =UPPER(Imie) WHERE IdOsoby IN (SELECT IdOsoby FROM INSERTED) PRINT 'Wykonano PRINT COLUMNS_UPDATED ( ) END ELSE PRINT 'Ominięto PRINT COLUMNS_UPDATED ( ) Wykonuje się tylko wtedy gdy modyfikowana jest jedna z dwóch kolumn wykonuje się również dla INSERT gdy nie puste wartości 0x04 0x10 UPDATE Osoby SET Nazwisko=LOWER(Nazwisko) WHERE IdOsoby >10 UPDATE Osoby Set RokUrodz=0 WHERE RokUrodz IS NULL INSERT INTO Osoby(Nazwisko) VALUES('Nowy') Triggery procedury wyzwalane (wyzwalacze) Z zastosowaniem systemowych tabel tymczasowych DROP TRIGGER upd CREATE TRIGGER upd ON Osoby FOR INSERT, UPDATE AS DECLARE @max_v tinyint, @act_v tinyint SELECT @max_v = MAX(o.wiek) FROM Osoby o, INSERTED i WHERE o.idosoby <> i.idosoby SELECT @act_v = i.wiek FROM INSERTED i PRINT columns_updated() PRINT @max_v PRINT @act_v if @act_v > @max_v BEGIN RAISERROR(50001, 1, 2) WITH SETERROR END Nie zezwala na wprowadzenie osoby starszej niż najstarsza istniejąca w tabeli RAISERROR ('Wartość powinna być mniejsza równa %d a jest równa %d.',17,127, @max_v, @act_v) ROLLBACK TRANSACTION 65

Triggery procedury wyzwalane (wyzwalacze) Zamiast CREATE TRIGGER zamiast ON Osoby INSTEAD OF DELETE AS PRINT 'Zakaz kasowania' Nie zezwala na usuwanie wierszy z tabeli Triggery procedury wyzwalane (wyzwalacze) Zamiast CREATE TRIGGER zamiast ON Osoby INSTEAD OF DELETE AS DECLARE @ile int SELECT @ile=count(idzarobku) FROM Zarobki WHERE Idosoby IN (SELECT IdOsoby FROM DELETED) IF (@ile >0) Nie zezwala na usuwanie wierszy z tabeli PRINT 'Zakaz kasowania' dla osób, które mają jakiekolwiek zarobki ELSE DELETE FROM Osoby WHERE Idosoby IN (SELECT IdOsoby FROM DELETED) go 66

Triggery procedury wyzwalane (wyzwalacze) Triggery na bazie danych DROP TRIGGER Db_Table ON DATABASE CREATE TRIGGER Db_Table ON DATABASE FOR DROP_TABLE, ALTER_TABLE AS IF IS_MEMBER ('db_owner') = 0 BEGIN PRINT 'Musisz mieć uprawnienia DBA dla usuwania i modyfikowania tabel!' ROLLBACK TRANSACTION END Informacje o aktywnym użytkowniku SELECT CURRENT_USER, USER, SESSION_USER, SYSTEM_USER, USER_NAME(), HOST_ID(), HOST_NAME(), APP_NAME() 67

Tworzenie modyfikacja triggera CREATE TRIGGER schema_name.trigger_name ON ( table view ) ALTER [ TRIGGER WITH <dml_trigger_option> schema_name.trigger_name [,...n ] ] ON ( ( table FOR AFTER view ) INSTEAD OF ) [ WITH { [ <dml_trigger_option> DELETE ] [, ] [ INSERT [,...n ] [ ], ] [ UPDATE ] } ( FOR [ NOT AFTER FOR REPLICATION INSTEAD OF ]) { [ DELETE AS { sql_statement ] [, ] [ INSERT [ ; ] [...n, ] [] UPDATE EXTERNAL ] } NAME [ NOT <method FOR REPLICATION specifier> ] [ ; ] } AS { sql_statement [ ; ] [...n ] EXTERNAL NAME <method <dml_trigger_option> specifier> [ ; ] }::= [ ENCRYPTION ] <dml_trigger_option> [ <EXECUTE AS ::= Clause> ] [ ENCRYPTION ] [ <method_specifier> <EXECUTE AS Clause> ::=] assembly_name.class_name.method_name <method_specifier> ::= assembly_name.class_name.method_name Tworzenie modyfikacja triggera CREATE TRIGGER trigger_name ON { DATABASE ALL SERVER } [ WITH <ddl_trigger_option> [,...n ] ] { FOR AFTER } { event_type [,...n ] event_group } AS { sql_statement [ ; ] EXTERNAL NAME <method specifier> [ ; ] } ALTER TRIGGER trigger_name ON { DATABASE ALL SERVER } [ WITH <ddl_trigger_option> [,...n ] ] { FOR AFTER } { event_type [,...n ] event_group } AS { sql_statement [ ; ] EXTERNAL NAME <method specifier> [ ; ] } 68

Triggery procedury wyzwalane (wyzwalacze) Polecenia wyzwalające triggery na bazie danych CREATE_FUNCTION ALTER_FUNCTION DROP_FUNCTION CREATE_INDEX ALTER_INDEX DROP_INDEX CREATE_PROCEDURE ALTER_PROCEDURE DROP_PROCEDURE CREATE_ROLE ALTER_ROLE DROP_ROLE CREATE_SYNONYM DROP_SYNONYM CREATE_TABLE ALTER_TABLE DROP_TABLE CREATE_TRIGGER ALTER_TRIGGER DROP_TRIGGER CREATE_TYPE DROP_TYPE CREATE_USER ALTER_USER DROP_USER CREATE_VIEW ALTER_VIEW DROP_VIEW GRANT_DATABASE DENY_DATABASE REVOKE_DATABASE Polecenia wyzwalające triggery na bazie danych cd CREATE_APPLICATION_ROLE ALTER_APPLICATION_ROLE DROP_APPLICATION_ROLE CREATE_ASSEMBLY ALTER_ASSEMBLY DROP_ASSEMBLY ALTER_AUTHORIZATION_DATABASE CREATE_CERTIFICATE ALTER_CERTIFICATE DROP_CERTIFICATE CREATE_CONTRACT CREATE_EVENT_NOTIFICATION DROP_CONTRACT DROP_EVENT_NOTIFICATION CREATE_MESSAGE_TYPE ALTER_MESSAGE_TYPE DROP_MESSAGE_TYPE CREATE_PARTITION_FUNCTION ALTER_PARTITION_FUNCTION DROP_PARTITION_FUNCTION CREATE_PARTITION_SCHEME ALTER_PARTITION_SCHEME DROP_PARTITION_SCHEME CREATE_QUEUE ALTER_QUEUE DROP_QUEUE CREATE_REMOTE_SERVICE_BINDING ALTER_REMOTE_SERVICE_BINDING DROP_REMOTE_SERVICE_BINDING CREATE_ROUTE ALTER_ROUTE DROP_ROUTE CREATE_SCHEMA ALTER_SCHEMA DROP_SCHEMA CREATE_SERVICE ALTER_SERVICE DROP_SERVICE CREATE_STATISTICS DROP_STATISTICS UPDATE_STATISTICS CREATE_XML_SCHEMA_COLLECTION ALTER_XML_SCHEMA_COLLECTION DROP_XML_SCHEMA_COLLECTION 69

Struktura hierarchiczna zdarzeń DDL Struktura hierarchiczna zdarzeń DDL cd 70

Polecenia wyzwalające triggery na serwerze ALTER_AUTHORIZATION_SERVER CREATE_DATABASE ALTER_DATABASE DROP_DATABASE CREATE_ENDPOINT DROP_ENDPOINT CREATE_LOGIN ALTER_LOGIN DROP_LOGIN GRANT_SERVER DENY_SERVER REVOKE_SERVER Triggery na serwerze DROP TRIGGER dla_logowania ON ALL SERVER CREATE TRIGGER dla_logowania ON ALL SERVER FOR LON AS PRINT 'Nastąpiła zmiana uprawnień' SELECT EVENTDATA().value( '(/EVENT_INSTANCE/TSQLCommand/CommandText)[1]','nvarchar(max)') 71

Triggery na serwerze DROP TRIGGER dla_autoryzacji ON ALL SERVER CREATE TRIGGER dla_autoryzacji ON ALL SERVER FOR DDL_LOGIN_EVENTS AS PRINT 'Nastąpiła zmiana uprawnień' SELECT EVENTDATA().value( '(/EVENT_INSTANCE/TSQLCommand/CommandText)[1]','nvarchar(max)') struktura XML zwracana przez funkcję EVENT_INSTANCE <EVENT_INSTANCE> <EventType>type</EventType> <PostTime>date-time</PostTime> <SPID>spid</SPID> <ServerName>name</ServerName> <LoginName>name</LoginName> <UserName>name</UserName> <DatabaseName>name</DatabaseName> <SchemaName>name</SchemaName> <ObjectName>name</ObjectName> <ObjectType>type</ObjectType> <TSQLCommand>command</TSQLCommand> </EVENT_INSTANCE> 72

Tworzenie triggera dla potrzeb audytu CREATE TABLE ddl_log (PostTime datetime, DB_User nvarchar(100), Event nvarchar(100), TSQL nvarchar(2000)); CREATE TRIGGER log ON DATABASE FOR DDL_DATABASE_LEVEL_EVENTS AS DECLARE @data XML SET @data = EVENTDATA() INSERT ddl_log (PostTime, DB_User, Event, TSQL) VALUES (GETDATE(), CONVERT(nvarchar(100), CURRENT_USER), @data.value('(/event_instance/eventtype)[1]', 'nvarchar(100)'), @data.value('(/event_instance/tsqlcommand)[1]', 'nvarchar(2000)') ) ; Wyłączanie i włączanie triggera DISABLE TRIGGER { [ schema. ] trigger_name [,...n ] ALL } ON { object_name DATABASE ALL SERVER } [ ; ] ENABLE TRIGGER { [ schema_name. ] trigger_name [,...n ] ALL } ON { object_name DATABASE ALL SERVER } [ ; ] 73

Wyłączanie i włączanie triggera DISABLE TRIGGER safety ON DATABASE DISABLE TRIGGER ALL ON ALL SERVER; ENABLE TRIGGER safety ON DATABASE; ENABLE Trigger ALL ON ALL SERVER; Kursory Tworzenie DECLARE osoby_c CURSOR FOR SELECT Nazwisko FROM Osoby OPEN osoby_c FETCH NEXT FROM osoby_c CLOSE osoby_c DEALLOCATE osoby_c 74

Kursory Tworzenie cd DECLARE osoby_c CURSOR FOR SELECT Nazwisko FROM Osoby OPEN osoby_c FETCH NEXT FROM osoby_c WHILE @@FETCH_STATUS = 0 BEGIN FETCH NEXT FROM osoby_c END CLOSE osoby_c DEALLOCATE osoby_c Kursory Tworzenie cd DECLARE @nazw varchar(40), @im varchar(20) DECLARE osoby_c CURSOR FOR FROM Osoby SELECT Nazwisko, Imie OPEN osoby_c FETCH NEXT FROM osoby_c INTO @nazw, @im WHILE @@FETCH_STATUS = 0 BEGIN PRINT "Kto to? To " + @im + " " + @nazw FETCH NEXT FROM osoby_c INTO @nazw, @im END CLOSE osoby_c DEALLOCATE osoby_c 75

Procedura zwracająca kursor CREATE PROCEDURE cursor_proc @cur CURSOR VARYING OUTPUT AS SET @cur = CURSOR FOR SELECT nazwisko, imie FROM osoby OPEN @cur -- wywołanie DECLARE @cur CURSOR EXEC cursor_proc @cur OUTPUT WHILE (@@FETCH_STATUS = 0) BEGIN FETCH NEXT FROM @cur PRINT 'miejsce na kod' END CLOSE @cur DEALLOCATE @cur Tworzenie synonimu (dla tabeli,perspektywy,procedury,funkcji) DROP SYNONYM syn CREATE SYNONYM syn FOR wysocyt SELECT * FROM syn(1.7) 76

Blok TRY_CATCH bez wywołania procedury nie przynosi skutku BEGIN TRY -- Tabela nie istnieje błąd nie jest przechwytywany SELECT * FROM NonexistentTable; END TRY BEGIN CATCH SELECT ERROR_NUMBER() as ErrorNumber, ERROR_MESSAGE() as ErrorMessage; END CATCH Skutek Msg 208, Level 16, State 1, Line 4 Invalid object name 'NonexistentTable'. Procedura i jej wywołanie z TRY_CATCH DROP PROCEDURE usp_exampleproc; CREATE PROCEDURE usp_exampleproc AS SELECT * FROM NonexistentTable; BEGIN TRY EXECUTE usp_exampleproc END TRY BEGIN CATCH SELECT ERROR_NUMBER() as ErrorNumber, Skutek ERROR_MESSAGE() as ErrorNumber ErrorMessage ErrorMessage; ----------- ------------------------------------------ END CATCH; 208 Invalid object name 'NonexistentTable'. (1 row(s) affected) 77

Procedura i jej wywołanie z TRY_CATCH DROP PROCEDURE usp_exampleproc; CREATE PROCEDURE usp_exampleproc AS SELECT * FROM NonexistentTable; Wywołanie proc bez try_catch kończy się błędem EXEC usp_exampleproc; Skutek Msg 208, Level 16, State 1, Procedure usp_exampleproc, Line 3 Invalid object name 'NonexistentTable'. TRY_CATCH przykład dla dzielenia przez zero BEGIN TRY SELECT 1/0; END TRY BEGIN CATCH SELECT ERROR_NUMBER() AS ErrorNumber, ERROR_SEVERITY() AS ErrorSeverity, ERROR_STATE() AS ErrorState, ERROR_PROCEDURE() AS ErrorProcedure, ERROR_LINE() AS ErrorLine, ERROR_MESSAGE() AS ErrorMessage; END CATCH; Skutek ----------- (0 row(s) affected) ErrorNumber ErrorSeverity ErrorState ErrorProcedure ErrorLine ErrorMessage ----------- ------------- ----------- --------------- ----------- ------------------------ --------- 8134 16 1 NULL 3 Divide by zero error encountered. (1 row(s) affected) 78

próba usunięcia powiązanych rekordów klucz obcy, w obrębie transakcji z zaastosowaniem Try_catch BEGIN TRANSACTION; BEGIN TRY -- Osoba o idosoby =2 ma zarobki delete from osoby WHERE IDosoby=2; END TRY BEGIN CATCH SELECT ERROR_NUMBER() AS ErrorNumber, ERROR_SEVERITY() AS ErrorSeverity, ERROR_STATE() as ErrorState, ERROR_PROCEDURE() as ErrorProcedure, ERROR_LINE() as ErrorLine, ERROR_MESSAGE() as ErrorMessage; IF @@TRANCOUNT > 0 Skutek ROLLBACK TRANSACTION; END CATCH; IF @@TRANCOUNT > 0 COMMIT TRANSACTION; ErrorNumber ErrorSeverity ErrorState ErrorProcedure ErrorLine ErrorMessage ----------- ------------- ----------- ---------------- ----------- ------------------------- ----- 547 16 0 NULL 5 The DELETE statement conflicted with the REFERENCE constraint "FK_Zarobki_Osoby". The conflict occurred in databa "ap", table "dbo.zarobki", column 'IdOsoby'. (1 row(s) affected) Próba usunięcia niejstniejącej kolumny kod z tabeli Dzialy BEGIN TRY BEGIN TRANSACTION; BEGIN TRY -- Generowany jest bład z powodu nieistnienia usuwanej kolumny ALTER TABLE dzialy DROP COLUMN kod; -- Jeśli polecenie powiedzie się zatwierdź transakcje. COMMIT TRANSACTION; END TRY BEGIN CATCH SELECT ERROR_NUMBER() as ErrorNumber, ERROR_MESSAGE() as ErrorMessage; -- Test XACT_STATE for 1 or -1. -- XACT_STATE = 0 nie jest otwarta żadna transakcja -- COMMIT lub ROLLBACK będą generowały błąd. -- sprawdź czy transakcja jest niecommitowalna (is uncommittable). IF (XACT_STATE()) = -1 79

Próba usunięcia niejstniejącej kolumny kod z tabeli Dzialy cd BEGIN PRINT N'Transakcja jest w stanie uncommittabl. ' + 'Wycofywanie transakcji.' ROLLBACK TRANSACTION; END; -- sprawdź czy transakcja jest aktywna i w stanie valid (dostępna). IF (XACT_STATE()) = 1 BEGIN PRINT N' Transakcja jest w stanie committable. ' + 'Zatwierdzenie transakcji.' COMMIT TRANSACTION; END; END CATCH; Skutek ErrorNumber ErrorMessage ----------- ---------------------------------------------------------------------------------------- 4924 ALTER TABLE DROP COLUMN failed because column 'kod' does not exist in table 'dzialy'. (1 row(s) affected) Transakcja jest w stanie uncommittabl. Wycofywanie transakcji. Indeksy Tworzenie DROP INDEX osoby.ix_imie CREATE CLUSTERED INDEX Ix_name ON Osoby (nazwisko) DROP INDEX osoby.ix_name CREATE CLUSTERED INDEX Ix_imie ON Osoby (imie) DROP INDEX osoby.ix_imie CREATE CLUSTERED INDEX Ix_imienazwisko ON Osoby imie, nazwisko) 80

Wszystko z WORDA Wyszukiwanie pełnotekstowe SELECT opis FROM Osoby WHERE CONTAINS(Opis,'Glupi') SELECT opis FROM Osoby WHERE CONTAINS(Opis,'Du*') SELECT opis FROM Osoby WHERE CONTAINS(Opis,' "Du*" ') SELECT opis FROM Osoby WHERE CONTAINS(Opis,'Duzy Near Glupi') DO poprawy Ograniczenia, rules, default etc Wprowadzenie do tabeli dzialy nowej kolumny opartej o typ użytkownika ALTER TABLE dzialy ADD kod litera Tworzenie reguły Create rule IsNotZero as @value <> 0 CREATE RULE lit AS 81

Użytkownicy, role etc.. Tworzenie logina EXEC sp_addlogin 'Adam', 'ewa', 'sr8' Tworzenie użytkownika EXEC sp_adduser 'Adam', 'Ktos', 'public' Sprawdzanie użytkowników na serverze sp_helplogins sp_helprole sp_helpsrvrole sp_helpsrvrolemember 'sysadmin' Tworzenie użytkownika nowa postać USE ap; DROP USER ktos; DROP LOGIN ktos; CREATE LOGIN ktos WITH PASSWORD = 'kajak'; USE ap; CREATE USER ktos; GRANT SELECT ON Osoby to Ktos; 82

Tworzenie logina różne warianty CREATE LOGIN [LR\apelikan] FROM WINDOWS; Tworzenie LOGINA CREATE LOGIN login_name { WITH <option_list1> FROM <sources> } <sources> ::= WINDOWS [ WITH <windows_options> [,... ] ] CERTIFICATE certname ASYMMETRIC KEY asym_key_name <option_list1> ::= PASSWORD = 'password' [ HASHED ] [ MUST_CHANGE ] [, <option_list2> [,... ] ] <option_list2> ::= SID = sid DEFAULT_DATABASE = database DEFAULT_LANGUAGE = language CHECK_EXPIRATION = { ON OFF} CHECK_POLICY = { ON OFF} [ CREDENTIAL = credential_name ] <windows_options> ::= DEFAULT_DATABASE = database DEFAULT_LANGUAGE = language 83

Tworzenie LOGINA CREATE LOGIN test WITH PASSWORD = 'abcd' MUST_CHANGE; Msg 15195, Level 16, State 1, Line 1 The MUST_CHANGE option is not supported by this version of Microsoft Windows. CREATE LOGIN [LR\apelikan] FROM WINDOWS; USE ap; CREATE user [LR\apelikan] CREATE CREDENTIAL AlterEgo WITH IDENTITY = 'kto', SECRET = 'abcd'; CREATE LOGIN ktos WITH PASSWORD = 'xzy', CREDENTIAL = AlterEgo; USE MASTER; CREATE CERTIFICATE KtosCert ENCRYPTION BY PASSWORD = 'pgfd4bb925dgvbd2439587y' WITH SUBJECT = 'Opis certyfikatu', EXPIRY_DATE = '02/02/2009'; CREATE LOGIN KtosC FROM CERTIFICATE KtosCert; Tworzenie LOGINA ALTER LOGIN ktos DISABLE; ALTER LOGIN ktos ENABLE; ALTER LOGIN ktos WITH PASSWORD = 'qwerty'; ALTER LOGIN ktos WITH NAME = KtosL; CREATE CREDENTIAL AlterEgo1 WITH IDENTITY = 'inny', SECRET = 'abcd'; ALTER LOGIN ktosc WITH CREDENTIAL = AlterEgo1; DROP LOGIN ktosc; 84

Dynamiczne tworzenie LOGINA DROP TABLE osoby CREATE TABLE osoby (id int IDENTITY(1,1) PRIMARY KEY, kto varchar(50) ); DROP TRIGGER dd; CREATE TRIGGER dd ON osoby AFTER INSERT AS BEGIN DECLARE @zm varchar(222); DECLARE @kk varchar(222); SELECT @kk=kto FROM inserted; SET @zm ='use master; CREATE login '+ @kk +' with PASSWORD = '+''''+'kajak' +''''; PRINT @zm; EXEC (@zm); END; USE ap; INSERT INTO osoby VALUES ('nowy'); Tworzenie użytkownika CREATE USER user_name [ { { FOR FROM } { LOGIN login_name CERTIFICATE cert_name ASYMMETRIC KEY asym_key_name } WITHOUT LOGIN ] [ WITH DEFAULT_SCHEMA = schema_name ] 85

Tworzenie użytkownika CREATE USER ktos; GRANT CONNECT TO ktos; CREATE USER KtosU FOR LOGIN ktos WITH DEFAULT_SCHEMA = ap; CREATE USER UserC FOR CERTIFICATE KtosCert; ALTER USER ktosu WITH NAME = nowy; ALTER USER nowy WITH DEFAULT_SCHEMA = hurtownia; DROP USER nowy; Tworzenie roli CREATE ROLE rola GRANT SELECT ON Osoby TO rola REVOKE SELECT ON Osoby TO rola DROP ROLE rola1 CREATE ROLE rola1 AUTHORIZATION rola; ALTER ROLE rola WITH NAME = nowa_rola 86

DROP TABLE mylogintable go CREATE TABLE mylogintable (id int, klucz uniqueidentifier default newid(), user_id int default user_id(), date_in datetime default getdate(), myuser_name AS USER_NAME(), kto as user, os_user as system_user, c_user as current_user, s_user as session_user, gdzie as host_name(), gdzie_nr as host_id(), aplikacja as APP_NAME() ); go insert into mylogintable(id) values(1) select * from mylogintable; Informacje o połączonym użytkowniku 1 7173254F-7AED-46F5-9126-C5E9CB97D6F5 1 2007-05-19 18:21:40.810 dbo dbo PC214-31\Administrator dbo dbo PC214-31 320 Microsoft SQL Server Management Studio - Query Użytkownicy, role etc.. Przypisywanie praw użytkownikowi GRANT SELECT, insert ON osoby TO Ktos Sprawdzenie elementów bazy select* from sysobjects where status>=32 select * from information_schema.tables select * from information_schema.views select * from information_schema.columns sp_help systypes 87

Informacje o loginach i uprawnieniach SELECT * FROM SYS.SQL_LOGINS SELECT * FROM SYS.DATABASE_ROLE_MEMBERS SELECT * FROM SYS.DATABASE_PERMISSIONS SELECT * FROM SYS.USER_TOKEN SELECT * FROM SYS.DATABASE_PRINCIPALS Podszycie się pod użytkownika USE ap; --Create two temporary principals CREATE LOGIN login1 WITH PASSWORD = 'J345#$)thb'; CREATE LOGIN login2 WITH PASSWORD = 'Uor80$23b'; CREATE USER user1 FOR LOGIN login1; CREATE USER user2 FOR LOGIN login2; --Give IMPERSONATE permissions on user2 to user1 --so that user1 can successfully set the execution context to user2. GRANT IMPERSONATE ON USER:: user2 TO user1; --Display current execution context. SELECT SUSER_NAME(), USER_NAME(); -- Set the execution context to login1. EXECUTE AS LOGIN = 'login1'; --Verify the execution context is now login1. SELECT SUSER_NAME(), USER_NAME(); --Login1 sets the execution context to login2. EXECUTE AS USER = 'user2'; --Display current execution context. SELECT SUSER NAME() USER NAME() 88

DO poprawy Błędy, elementy bazy Wykaz elementów bazy SELECT o.id,o.type, c.text FROM sysobjects o INNER JOIN syscomments c ON o.id = c.id SELECT o.id, c.text FROM sysobjects o INNER JOIN syscomments c ON o.id = c.id WHERE o.type = 'TR' /*and o.name = 'trig2'*/ DO poprawy Zadanie magazynowe z wykorzystaniem kursorów drop procedure sprawdz go create procedure sprawdz @towar int,@sztu int as declare @co int,@ile int declare @nco varchar(3),@nile varchar(3) set nocount on DECLARE sprzed CURSOR FOR SELECT idtowaru,szt from magazyn OPEN sprzed FETCH next FROM sprzed into @co, @ile 89

Dynamiczny SQL Wykonanie polecenia w każdej z baz serwera. declare @zm varchar(55) declare cur cursor for select name from sys.databases declare @sql varchar(255) open cur fetch next from cur into @zm while @@fetch_status=0 Begin set @sql ='use ' + @zm + '; create table aa(a int);' execute(@sql); print @sql; fetch next from cur into @zm end close cur deallocate cur Tworzenie bazy danych CREATE DATABASE nowa; DROP DATABASE nowa; 90

Tworzenie bazy danych USE master; IF DB_ID (N'Nowa') IS NOT NULL DROP DATABASE Nowa; -- Pobierz ścieżkę do danych SQL Server DECLARE @sciezka nvarchar(256); SET @sciezka = (SELECT SUBSTRING(physical_name, 1, CHARINDEX(N'master.mdf', LOWER(physical_name)) - 1) FROM master.sys.master_files WHERE database_id = 1 AND file_id = 1); -- Utwórz bazę danych EXECUTE ('CREATE DATABASE nowa ON ( NAME = Nowa_dat, FILENAME = '''+ @sciezka + 'nowa.mdf'', SIZE = 10, MAXSIZE = 50, FILEGROWTH = 5 ) LOG ON ( NAME = Nowa_log, FILENAME = '''+ @sciezka + 'nowa.ldf'', SIZE = 5MB, MAXSIZE = 25MB, FILEGROWTH = 5MB )' ); Odłączenie bazy danych i utworzenie z istniejącego pliku USE master; sp_detach_db nowa; DECLARE @sciezka nvarchar(256); SET @sciezka = (SELECT SUBSTRING(physical_name, 1, CHARINDEX(N'master.mdf', LOWER(physical_name)) - 1) FROM master.sys.master_files WHERE database_id = 1 AND file_id = 1); EXEC ('CREATE DATABASE nowa ON (FILENAME = '''+ @sciezka + 'nowa.mdf'') FOR ATTACH'); 91

Zastosowanie sqlcmd do wykonania skryptu oraz xp_cmdshell do wykonania polecenia systemu EXEC xp_cmdshell 'sqlcmd -i C:\pol.sql -o C:\skut.txt' xp_cmdshell wymaga odblokowania Backup typu pełnego -- Tworzenie logicznego urządzenia dla backupu bazy Nowa. USE master EXEC sp_addumpdevice 'disk', 'Nowa', 'C:\temp\backup\nowa.bak' -- Full Back up bazy nowa. BACKUP DATABASE nowa TO nowa 92