Darmowy fragment publikacji:
Itzik Ben-Gan
Podstawy języka
T-SQL
Microsoft SQL Server 2016
i Azure SQL Database
Przekład: Leszek Biolik, Marek Włodarz
APN Promise, Warszawa 2016
##7#52#aSUZPUk1BVC1WaXJ0dWFsbw==
Podstawy języka T-SQL: Microsoft SQL Server 2016 i Azure SQL Database
Authorized Polish translation of the English language edition entitled
T-SQL Fundamentals, Third Edition, by Itzik Ben-Gan
ISBN: 978-1-5093-0200-0
Copyright © 2016 by Itzik Ben-Gan
All rights reserved. No part of this book may be reproduced or transmitted in any form
or by any means, electronic or mechanical, including photocopying, recording or by any
information storage retrieval system, without permission from Pearson Education, Inc.
Polish language edition published by APN PROMISE SA Copyright © 2016
Autoryzowany przekład z wydania w języku angielskim, zatytułowanego:
T-SQL Fundamentals, Third Edition, by Itzik Ben-Gan
ISBN: 978-1-5093-0200-0
Wszystkie prawa zastrzeżone. Żadna część niniejszej książki nie może być powielana
ani rozpowszechniana w jakiejkolwiek formie i w jakikolwiek sposób (elektroniczny,
mechaniczny), włącznie z fotokopiowaniem, nagrywaniem na taśmy lub przy użyciu
innych systemów bez pisemnej zgody wydawcy.
APN PROMISE SA, ul. Domaniewska 44a, 02-672 Warszawa
tel. +48 22 35 51 600, fax +48 22 35 51 699
e-mail: mspress@promise.pl
Książka ta przedstawia poglądy i opinie autora. Przykłady firm, produktów, osób
i wydarzeń opisane w niniejszej książce są fikcyjne i nie odnoszą się do żadnych
konkretnych firm, produktów, osób i wydarzeń, chyba że zostanie jednoznacznie
stwierdzone, że jest inaczej. Ewentualne podobieństwo do jakiejkolwiek rzeczywistej
firmy, organizacji, produktu, nazwy domeny, adresu poczty elektronicznej, logo, osoby,
miejsca lub zdarzenia jest przypadkowe i niezamierzone.
Microsoft oraz znaki towarowe wymienione na stronie http://www.microsoft.com/about/
legal/en/us/IntellectualProperty/Trademarks/EN-US.aspx są zastrzeżonymi znakami
towarowymi grupy Microsoft. Wszystkie inne znaki towarowe są własnością ich
odnośnych właścicieli.
APN PROMISE SA dołożyła wszelkich starań, aby zapewnić najwyższą jakość tej
publikacji. Jednakże nikomu nie udziela się rękojmi ani gwarancji.
APN PROMISE SA nie jest w żadnym wypadku odpowiedzialna za jakiekolwiek szkody
będące następstwem korzystania z informacji zawartych w niniejszej publikacji, nawet
jeśli APN PROMISE została powiadomiona o możliwości wystąpienia szkód.
ISBN: 978-83-7541-305-2
Przekład: Leszek Biolik, Marek Włodarz
Redakcja: Marek Włodarz
Korekta: Ewa Swędrowska
Skład i łamanie: MAWart Marek Włodarz
##7#52#aSUZPUk1BVC1WaXJ0dWFsbw==
Dla Dato
Żyć w sercach tych, których zostawiliśmy,
to nie umrzeć
– Thomas Campbell
##7#52#aSUZPUk1BVC1WaXJ0dWFsbw==
##7#52#aSUZPUk1BVC1WaXJ0dWFsbw==
Spis treści
Wprowadzenie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xiii
Podziękowania . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xvii
1 Podstawy zapytań i programowania T-SQL . . . . . . . . . . . . . . . . . . . . 1
Podstawy teoretyczne . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
SQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
Teoria zbiorów . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
Logika predykatów . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
Model relacyjny . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
Typy systemów bazodanowych . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
Architektura SQL Server . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
Odmiany ABC produktu SQL Server . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
Instancje produktu SQL Server . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
Bazy danych . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
Schematy i obiekty . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
Tworzenie tabel i definiowanie integralności danych . . . . . . . . . . . . . . . . . . 24
Tworzenie tabel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
Definiowanie integralności danych . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
Podsumowanie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
2 Zapytania do pojedynczej tabeli . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
Elementy instrukcji SELECT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
Klauzula FROM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
Klauzula WHERE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
Klauzula GROUP BY . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
Klauzula HAVING . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
Klauzula SELECT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
Klauzula ORDER BY . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
Filtry TOP i OFFSET-FETCH . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
Szybki przegląd funkcji okna . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
Predykaty i operatory . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
Wyrażenia CASE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
Znacznik NULL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
##7#52#aSUZPUk1BVC1WaXJ0dWFsbw==
v
vi
Spis treści
Operacje jednoczesne – „all-at-once” . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
Stosowanie danych znakowych . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
Typy danych . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
Opcje sortowania (collation) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
Operatory i funkcje . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
Predykat LIKE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
Posługiwanie się danymi typu daty i czasu . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
Typy danych dotyczące daty i czasu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
Literały . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
Rozdzielne stosowanie daty i czasu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92
Filtrowanie zakresów danych . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94
Funkcje daty i godziny . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95
Zapytania dotyczące metadanych . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106
Widoki katalogowe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106
Informacyjne widoki schematu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107
Systemowe procedury składowane i funkcje . . . . . . . . . . . . . . . . . . . . . . 108
Podsumowanie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109
Ćwiczenia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110
Rozwiązania . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115
3 Złączenia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121
Złączenia krzyżowe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122
Składnia ISO/ANSI SQL-92 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122
Składnia ISO/ANSI SQL-89 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123
Samo-złączenie krzyżowe (Self Cross Join) . . . . . . . . . . . . . . . . . . . . . . . 123
Tworzenie tabel liczb . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124
Złączenia wewnętrzne . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126
Składnia ISO/ANSI SQL-92 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126
Składnia ISO/ANSI SQL-89 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127
Bezpieczeństwo złączenia wewnętrznego . . . . . . . . . . . . . . . . . . . . . . . . 128
Dodatkowe rodzaje złączeń . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129
Złączenia złożone . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129
Złączenie nierównościowe (Non-Equi Join) . . . . . . . . . . . . . . . . . . . . . . . 130
Złączenia wielokrotne (multi-join) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132
Złączenia zewnętrzne . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133
Podstawy złączeń zewnętrznych . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133
Złączenia zewnętrzne – zagadnienia zaawansowane . . . . . . . . . . . . . . . 136
Podsumowanie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144
##7#52#aSUZPUk1BVC1WaXJ0dWFsbw==
Spis treści
vii
Ćwiczenia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144
Ćwiczenie 1-2 (zaawansowane ćwiczenie opcjonalne) . . . . . . . . . . . . . 145
Ćwiczenie 7 (zaawansowane ćwiczenie opcjonalne) . . . . . . . . . . . . . . . 147
Ćwiczenie 8 (zaawansowane ćwiczenie opcjonalne) . . . . . . . . . . . . . . . 148
Ćwiczenie 9 (zaawansowane ćwiczenie opcjonalne) . . . . . . . . . . . . . . . 148
Rozwiązania . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149
4 Podzapytania . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155
Podzapytania niezależne . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155
Przykłady skalarnych podzapytań niezależnych . . . . . . . . . . . . . . . . . . . 156
Podzapytania niezależne o wielu wartościach . . . . . . . . . . . . . . . . . . . . . 158
Podzapytania skorelowane . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162
Predykat EXISTS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165
Zaawansowane aspekty podzapytań . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167
Zwracanie poprzednich lub kolejnych wartości . . . . . . . . . . . . . . . . . . . 167
Agregacje bieżące . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168
Postępowanie w przypadku nieprawidłowo działających podzapytań 169
Podsumowanie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174
Ćwiczenia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175
Ćwiczenie 2 (zaawansowane ćwiczenie opcjonalne) . . . . . . . . . . . . . . . 175
Ćwiczenie 7 (zaawansowane ćwiczenie opcjonalne) . . . . . . . . . . . . . . . 177
Ćwiczenie 8 (zaawansowane ćwiczenie opcjonalne) . . . . . . . . . . . . . . . 178
Ćwiczenie 10 (zaawansowane ćwiczenie opcjonalne) . . . . . . . . . . . . . . 178
Rozwiązania . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179
5 Wyrażenia tablicowe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185
Tabele pochodne . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185
Przypisywanie aliasów kolumn . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 187
Stosowanie argumentów . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189
Zagnieżdżanie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190
Wielokrotne odwołania . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191
Wspólne wyrażenia tablicowe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192
Przypisywanie aliasów kolumn w wyrażeniach CTE . . . . . . . . . . . . . . . . 192
Stosowanie argumentów w wyrażeniach CTE . . . . . . . . . . . . . . . . . . . . . 193
Definiowanie wielu wyrażeń CTE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193
Wielokrotne odwołania w wyrażeniach CTE . . . . . . . . . . . . . . . . . . . . . . 194
Rekurencyjne wyrażenia CTE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195
Widoki . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 198
##7#52#aSUZPUk1BVC1WaXJ0dWFsbw==
viii
Spis treści
Widoki i klauzula ORDER BY . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199
Opcje widoku . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202
Wbudowane funkcje zwracające tabele . . . . . . . . . . . . . . . . . . . . . . . . . . . . 206
Operator APPLY . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 207
Podsumowanie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211
Ćwiczenia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211
Ćwiczenie 4 (zaawansowane ćwiczenie opcjonalne) . . . . . . . . . . . . . . . 213
Ćwiczenie 5-2 (zaawansowane ćwiczenie opcjonalne) . . . . . . . . . . . . . 215
Rozwiązania . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 216
6 Operatory zbiorowe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 221
Operator UNION . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222
Operator wielozbioru UNION ALL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222
Operator zbiorowy UNION z niejawną opcją Distinct . . . . . . . . . . . . . . 223
Operator INTERSECT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 224
Operator INTERSECT (z ukrytą opcją Distinct) . . . . . . . . . . . . . . . . . . . . 225
Operator wielozbioru INTERSECT ALL . . . . . . . . . . . . . . . . . . . . . . . . . . . 225
Operator EXCEPT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 228
Operator zbiorowy EXCEPT (z opcją Distinct) . . . . . . . . . . . . . . . . . . . . . 228
Operator wielozbioru EXCEPT ALL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 229
Pierwszeństwo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 230
Omijanie nieobsługiwanych faz logicznych . . . . . . . . . . . . . . . . . . . . . . . . . 232
Podsumowanie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 234
Ćwiczenia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 234
Ćwiczenie 6 (zaawansowane ćwiczenie opcjonalne) . . . . . . . . . . . . . . . 236
Rozwiązania . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 237
7 Zaawansowane zagadnienia tworzenia zapytań . . . . . . . . . . . . . . 241
Funkcje okna . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 241
Rankingowe funkcje okna . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 244
Offsetowe funkcje okna . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 248
Agregujące funkcje okna . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 251
Przestawianie danych . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 254
Przestawianie danych przy użyciu zapytania grupującego . . . . . . . . . . 256
Przestawianie danych przy użyciu operatora PIVOT . . . . . . . . . . . . . . . 257
Odwrotne przestawianie danych . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 260
Odwrotne przestawianie danych przy użyciu operatora APPLY . . . . . . 261
Odwrotne przestawianie danych za pomocą operatora UNPIVOT . . . 264
##7#52#aSUZPUk1BVC1WaXJ0dWFsbw==
Spis treści
ix
Zbiory grupujące . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 265
Klauzula pomocnicza GROUPING SETS . . . . . . . . . . . . . . . . . . . . . . . . . . 267
Klauzula pomocnicza CUBE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 267
Klauzula pomocnicza ROLLUP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 268
Funkcje GROUPING i GROUPING_ID . . . . . . . . . . . . . . . . . . . . . . . . . . . . 269
Podsumowanie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 272
Ćwiczenia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 272
Rozwiązania . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 277
8 Modyfikowanie danych . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 281
Wstawianie danych . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 281
Wyrażenie INSERT VALUES . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 281
Instrukcja INSERT SELECT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 283
Instrukcja INSERT EXEC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 284
Instrukcja SELECT INTO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 285
Instrukcja BULK INSERT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 286
Właściwość Identity i obiekt sekwencji . . . . . . . . . . . . . . . . . . . . . . . . . . . 286
Usuwanie danych . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 296
Instrukcja DELETE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 297
Instrukcja TRUNCATE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 297
DELETE oparte na złączeniu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 299
Aktualizowanie danych . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 300
Instrukcja UPDATE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 301
UPDATE oparte na złączeniu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 302
UPDATE z przypisaniem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 305
Scalanie danych . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 306
Modyfikowanie danych przy użyciu wyrażeń tablicowych . . . . . . . . . . . . 311
Modyfikacje przy użyciu opcji TOP i OFFSET-FETCH . . . . . . . . . . . . . . . . . 313
Klauzula OUTPUT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 316
INSERT z klauzulą OUTPUT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 316
DELETE z klauzulą OUTPUT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 318
UPDATE z klauzulą OUTPUT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 319
MERGE z klauzulą OUTPUT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 320
Zagnieżdżone wyrażenia DML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 321
Podsumowanie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 323
Ćwiczenia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 323
Rozwiązania . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 327
##7#52#aSUZPUk1BVC1WaXJ0dWFsbw==
x
Spis treści
9 Tabele temporalne . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 333
Tworzenie tabel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 334
Modyfikowanie danych . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 338
Odpytywanie danych . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 341
Podsumowanie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 348
Ćwiczenia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 348
Rozwiązania . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 351
10 Transakcje i współbieżność . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 357
Transakcje . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 357
Blokowanie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 361
Blokady . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 361
Rozwiązywanie problemów związanych z blokadami . . . . . . . . . . . . . . 364
Poziomy izolacji . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 372
Poziom izolacji READ UNCOMMITTED . . . . . . . . . . . . . . . . . . . . . . . . . . . 374
Poziom izolacji READ COMMITTED . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 375
Poziom izolacji REPEATABLE READ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 377
Poziom izolacji SERIALIZABLE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 378
Poziomy izolacji oparte na wersjonowaniu wierszy . . . . . . . . . . . . . . . . 380
Podsumowanie poziomów izolacji . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 387
Zakleszczenia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 388
Podsumowanie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 391
Ćwiczenia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 391
11 Obiekty programowalne . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 403
Zmienne . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 403
Wsady . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 406
Wsad jako jednostka analizy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 406
Wsady i zmienne . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 407
Instrukcje, których nie można łączyć w tym samym wsadzie . . . . . . . . 408
Wsad jako jednostka rozpoznawania . . . . . . . . . . . . . . . . . . . . . . . . . . . . 408
Opcja GO n . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 409
Elementy kontroli przepływu wykonania . . . . . . . . . . . . . . . . . . . . . . . . . . . 410
Element kontroli przepływu IF … ELSE . . . . . . . . . . . . . . . . . . . . . . . . . . 410
Element kontroli przepływu WHILE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 411
Kursory . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 413
Tabele tymczasowe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 417
Lokalne tabele tymczasowe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 417
##7#52#aSUZPUk1BVC1WaXJ0dWFsbw==
Spis treści
xi
Globalne tabele tymczasowe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 419
Zmienne tablicowe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 421
Typy tablicowe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 422
Dynamiczny kod SQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 423
Polecenie EXEC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 424
Procedura składowana sp_executesql . . . . . . . . . . . . . . . . . . . . . . . . . . . . 424
PIVOT w dynamicznym kodzie SQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 426
Procedury . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 427
Funkcje definiowane przez użytkownika . . . . . . . . . . . . . . . . . . . . . . . . . 428
Procedury składowane . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 429
Wyzwalacze . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 432
Obsługa błędów . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 436
Podsumowania . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 440
A Rozpoczynamy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 441
Rozpoczynamy pracę w Azure SQL Database . . . . . . . . . . . . . . . . . . . . . . . 442
Instalowanie produktu SQL Server w wersji dla siedziby . . . . . . . . . . . . . . 442
Ćwiczenie 1 . Uzyskanie produktu SQL Server . . . . . . . . . . . . . . . . . . . . . 442
Ćwiczenie 2 . Instalowanie silnika bazy danych . . . . . . . . . . . . . . . . . . . . 443
Pobieranie i instalowanie SQL Server Management Studio . . . . . . . . . . . . 448
Pobieranie kodu źródłowego i instalowanie przykładowej bazy danych 448
Posługiwanie się programem SQL Server Management Studio . . . . . . . . 451
Korzystanie z SQL Server Books Online . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 457
Informacje o autorze . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 460
Indeks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 461
##7#52#aSUZPUk1BVC1WaXJ0dWFsbw==
##7#52#aSUZPUk1BVC1WaXJ0dWFsbw==
Wprowadzenie
Książka ta pełni rolę przewodnika dla osób podejmujących pierwsze kroki w języ-
ku T-SQL (nazywanym także Transact-SQL), który jest opracowanym w firmie
Microsoft dialektem języka SQL zdefiniowanego przez standardy ISO i ANSI. Poznamy
teorię konstruowania zapytań i programowania w języku T-SQL oraz sposoby pro-
jektowania kodu T-SQL w celu uzyskiwania i modyfikowania danych, a także ogólny
przegląd obiektów programowalnych.
Pomimo że książka pomyślana jest dla Czytelników początkujących, nie jest jedy-
nie zbiorem procedur, według których mają postępować – wykracza poza elementy
składni T-SQL i wyjaśnia logikę działającą w tle języka i jego elementów.
Od czasu do czasu w książce pojawiają się zagadnienia, które mogą być uważane
za tematykę zaawansowaną – z tego też względu zapoznawanie się z tymi fragmentami
jest opcjonalne. Jeśli Czytelnik pewnie czuje się w omówionym do tej pory materiale,
może przejść do tematów bardziej zaawansowanych; w przeciwnym razie spokojnie
może opuścić te fragmenty i powrócić do nich, gdy już nabierze większego doświad-
czenia. Fragmenty uważane za bardziej zaawansowane są w tekście zaznaczone jako
opcjonalne.
Wiele aspektów SQL jest unikatowych dla tego języka i znacznie odbiega od innych
języków programowania. Książka ta ułatwi przyswojenie sobie właściwego sposobu
myślenia i pozwoli dobrze poznać elementy języka. Czytelnik będzie mógł nauczyć
się myśleć w kategoriach relacyjnych i postępować zgodnie z najlepszymi zaleceniami
praktycznymi programowania w języku SQL.
Książka nie jest związana z konkretną wersją oprogramowania SQL Server; obej-
muje jednak elementy języka, które zostały wprowadzone w ostatnich wersjach SQL
Server, w tym SQL Server 2016. Przy omawianiu ostatnio wprowadzonych elementów
języka wskazuję wersję produktu, w której dany element został dodany.
SQL Server, oprócz „klasycznego” rozwiązania instalowanego na lokalnym kompu-
terze (serwerze), jest także dostępny jako usługa chmurowa o nazwie Windows Azure
SQL Database (w skrócie SQL Database). Przykłady kodu przytaczane w książce były
testowane zarówno w lokalnych instalacjach SQL Server, jak i w Azure SQL Database.
Powiązana z książką witryna sieci Web (http://aka.ms/T-SQLFund3e/downloads) udo-
stępnia informacje dotyczące problemów zgodności pomiędzy tymi rozwiązaniami.
W celu usprawnienia procesu nauczania książka zawiera ćwiczenia, które pozwa-
lają poznane informacje utrwalić w praktyce. Od czasu do czasu pojawią się ćwicze-
nia opcjonalne, które są bardziej zaawansowane. Ćwiczenia te przeznaczone są dla
##7#52#aSUZPUk1BVC1WaXJ0dWFsbw==
xiii
xiv Wprowadzenie
Czytelników, którzy dobrze poznali omawiany materiał i chcą sami sprawdzić swoje
umiejętności, rozwiązując trudniejsze problemy. Ćwiczenia opcjonalne dla Czytelni-
ków zaawansowanych są odpowiednio oznaczone.
Dla kogo przeznaczona jest ta książka
Niniejsza książka skierowana jest dla programistów korzystających z języka T-SQL,
administratorów baz danych, osób zajmujących się rozwiązaniami BI, autorów rapor-
tów, analityków, architektów baz danych i zaawansowanych użytkowników, którzy
dopiero rozpoczynają pracę z SQL Server i muszą tworzyć kwerendy albo kod przy
użyciu języka Transact-SQL.
Założenia
Największe korzyści książka ta przyniesie osobom, które mają już doświadczenie
w pracy z systemami Windows i aplikacjami opartymi na tych systemach. Ponadto
osoby te powinny znać podstawowe pojęcia dotyczące systemów zarządzania relacyj-
nymi bazami danych. Przydatne będzie też podstawowe doświadczenie w tworzeniu
oprogramowania.
Kto nie powinien czytać tej książki
Nie każda książka nadaje się dla każdego czytelnika. W książce omówiono podsta-
wy języka i głównie skierowana jest ona do osób w praktyce korzystających z języ-
ka T-SQL, które nie mają w tym wielkiego doświadczenia. Nie będzie zapewne zbyt
interesująca dla doświadczonych praktyków, od lat posługujących się tym językiem.
Tym niemniej, wielu czytelników poprzedniego wydania tej książki uważa, że pomi-
mo doświadczeń zdobytych w kolejnych latach pracy książka ta nadal jest przydatna
i uzupełnia brakującą wiedzę.
Organizacja książki
Książka rozpoczyna się od przedstawienia teoretycznych podstaw konstruowania
zapytań i programowania w języku T-SQL (rozdział 1), co stanowi fundament dla
pozostałej części książki, a także dla procesów tworzenia tabel i definiowania integral-
ności danych. W rozdziałach 2 do 9 poruszane są różnorodne aspekty uzyskiwania
i modyfikowania danych. Rozdział 10 zawiera omówienie współbieżności i transakcji.
Na koniec rozdział 11 stanowi przegląd obiektów programowalnych. Poniżej przed-
stawiono listę rozdziałów wraz z krótkim ich opisem:
■■ Rozdział 1 „Podstawy zapytań i programowania T-SQL” – teoretyczne podsta-
wy SQL, teoria zbiorów i logika predykatów; analizy modelu relacyjnego; opisy
##7#52#aSUZPUk1BVC1WaXJ0dWFsbw==
Wymagania systemowe
xv
architektury SQL Server; wyjaśnienie sposobów tworzenia tabel i definiowania
integralności danych.
■■ Rozdział 2 „Zapytania do pojedynczej tabeli” – różnorodne aspekty konstruowania
zapytań dotyczących pojedynczej tabeli przy użyciu polecenia SELECT.
■■ Rozdział 3 „Złączenia” – opis zapytań dotyczących wielu tabel przy użyciu złą-
czeń (join), w tym złączenia krzyżowe (cross join – iloczyn kartezjański), złączenia
wewnętrzne i zewnętrzne.
■■ Rozdział 4 „Podzapytania” – omówienie zapytań zawartych wewnątrz innych
zapytań, czyli podzapytań.
■■ Rozdział 5 „Wyrażenia tablicowe” – omówienie tabel pochodnych, wyrażeń CTE
(Common Table Expression), widoków, wbudowanych funkcji zwracających tabe-
le i operatora APPLY.
■■ Rozdział 6 „Operatory zbiorowe” – omówienie operatorów UNION, INTERSECT
i EXCEPT.
■■ Rozdział 7 „Zaawansowane zagadnienia tworzenia zapytań” – omówienie funkcji
okien, operatorów PIVOT i UNPIVOT oraz praca z operatorami GROUPING SETS.
■■ Rozdział 8 „Modyfikowanie danych” – wstawianie, aktualizowanie, usuwanie i sca-
lanie danych.
■■ Rozdział 9 „Tabele temporalne” – omówienie wersjonowanych przez system tabel
temporalnych (czasowych).
■■ Rozdział 10 „Transakcje i współbieżność” – omówienie kwestii współdziałania
połączeń użytkowników, którzy jednocześnie korzystają z tych danych; rozdział
opisuje takie pojęcia, jak transakcje, blokady, poziomy izolacji czy zakleszczenia.
■■ Rozdział 11 „Obiekty programowalne” – omówienie możliwości programowania
przy użyciu T-SQL w SQL Server.
W książce zamieszczono także dodatek „Rozpoczynamy”, który ułatwia skonfiguro-
wanie środowiska, pobranie kodów źródłowych książki, zainstalowanie przykładowej
bazy danych TSQLV4, rozpoczęcie pisania kodu dla SQL Server oraz poznanie sposo-
bów uzyskania pomocy dzięki dokumentacji SQL Server Books Online.
Wymagania systemowe
Dodatek „Rozpoczynamy” zawiera informacje, których wersji produktu SQL
Server 2016 można użyć do pracy z przykładowym kodem zamieszczonym w tej
książce. Poszczególne wersje SQL Server mogą mieć różne wymagania systemowe
i programowe; te wymagania są dokładnie opisane w dokumentacji SQL Server Books
Online w sekcji „Hardware and Software Requirements for Installing SQL Server 2016”
pod adresem https://msdn.microsoft.com/en-us/library/ms143506.aspx. W Dodatku wyjaś-
niono również, jak korzystać z dokumentacji SQL Server Books Online.
##7#52#aSUZPUk1BVC1WaXJ0dWFsbw==
xvi Wprowadzenie
Jeśli korzystamy z usługi Azure SQL Database, sprzęt i oprogramowanie jest utrzy-
mywane przez firmę Microsoft, zatem wymagania te nie są istotne.
Do uruchamiania przykładów kodu, zarówno w przypadku lokalnej instancji SQL
Server 2016, jak i Azure SQL Database, konieczne jest zainstalowanie oprogramowania
SQL Server Management Studio (SSMS). Oprogramowanie to można pobrać z witryny
firmy Microsoft pod adresem https://msdn.microsoft.com/en-us/library/mt238290.aspx.
Instalowanie i korzystanie z kodu źródłowego
Większość rozdziałów książki zawiera ćwiczenia, które pozwalają interaktywnie
wypróbować nowo poznany materiał zawarty w książce. Wszystkie przykłady kodu
używane w książce, w tym ćwiczenia i rozwiązania dostępne są na poniższej stronie
w zakładce Dodatkowe Informacje:
http://www.ksiazki.promise.pl/aspx/produkt.aspx?pid=112055
Dodatek „Rozpoczynamy” zawiera szczegółowe informacje na temat instalowania
kodów źródłowych.
##7#52#aSUZPUk1BVC1WaXJ0dWFsbw==
Podziękowania
Wiele osób przyczyniło się do powstania tej książki, czy to bezpośrednio, czy
pośrednio i wszystkim im należą się serdeczne podziękowania i uznanie.
Dla Lilach, za zrozumienie i wsparcie wszystkich moich poczynań oraz za wyrozu-
miałość dla niekończących się godzin spędzonych nad SQL.
Dla mojej mamy Mila oraz rodzeństwa Mickey i Ina, za stałe wsparcie i akceptowa-
nie nieobecności, co teraz jest trudniejsze niż kiedykolwiek. Mamo, wszyscy wierzymy,
że będzie dobrze, dzięki Twojej sile i determinacji. Tato, dzięki, że jesteś tak pomocny.
Dla recenzenta technicznego książki, Boba Beauchemina: jesteś częścią społeczności
SQL Server od tak wielu lat, ale nadal jestem pod wrażeniem twojej wiedzy; byłem
szczęśliwy, gdy zgodziłeś się współpracować przy tej książce.
Dle Steve’a Kassa, Dejana Sarka, Gianluca Hotza, i Herberta Alberta: Dzięki za
wasze cenne rady podczas planowania i pisania tej książki. Musiałem podjąć kilka
trudnych decyzji, co uwzględnić, a czego nie dołączać do książki i wasze wskazówki
były bardzo pomocne.
Dla SolidQ, mojej firmy od przeszło dziesięciu lat: to wielka satysfakcja pracować
w tak wspaniale prowadzonej firmie. Pracownicy firmy to nie tylko koledzy – to part-
nerzy, przyjaciele i rodzina. Fernando G. Guerrero, Douglas McDowell, Herbert Albert,
Dejan Sarka, Gianluca Hotz, Jeanne Reeves, Glenn McCoin, Fritz Lechnitz, Eric Van
Soldt, Joelle Budd, Jan Taylor, Marilyn Templeton, Berry Walker, Alberto Martin, Lore-
na Jimenez, Ron Talmage, Andy Kelly, Rushabh Mehta, Eladio Rincón, Erik Veerman,
Jay Hackney, Richard Waymire, Carl Rabeler, Chris Randall, Johan Åhlén, Raoul Illyés,
Peter Larsson, Peter Myers, Paul Turley – dziękuję Wam i wielu innym osobom.
Dla zespołu redakcyjnego produktu SQL Server Pro, czyli Megan Keller, Lavon
Peters, Michele Crockett, Mike Otey i z pewnością jeszcze wiele innych osób; pisałem
dla tego magazynu od ponad dekady i jestem wdzięczny, że mogłem podzielić się moją
wiedzą z czytelnikami magazynu.
Dla osób z grupy MVP produktu SQL Server – Alejandro Mesa, Erland Sommar-
skog, Aaron Bertrand, Tibor Karaszi, Paul White i wielu innych oraz dla prowadzącego
program MVP, Simona Tien; jest to wspaniały program i jestem wdzięczny, że mogłem
w nim uczestniczyć. Niespotykany jest poziom umiejętności w tej grupie i zawsze
cieszyłem się na nasze spotkania, zarówno by podzielić się pomysłami, jak i po prostu
pogadać przy piwie. Jestem przekonany, że w dużej mierze dodanie przez Microsoft
funkcjonalności T-SQL do produktu SQL Server zostało zainspirowane przez członków
##7#52#aSUZPUk1BVC1WaXJ0dWFsbw==
xvii
xviii
Podziękowania
MVP i całą społeczność produktu SQL Server. To wspaniale przekonać się, że ta syner-
gia przekształca się w tak znaczące i ważne rezultaty.
Na koniec, podziękowania kieruję do moich studentów: nauczanie SQL jest moją
siłą napędową, moją pasją. Dziękuję, że mogę spełniać moje powołanie i dziękuję
za wszystkie interesujące pytania, które pozwalają pogłębiać wiedzę.
Itzik Ben-Gan
##7#52#aSUZPUk1BVC1WaXJ0dWFsbw==
ROZDZIał 1
Podstawy zapytań
i programowania T-SQL
Zaczynamy podróż do krainy innej niż wszystkie – miejsca, które rządzi się swoim
własnym zbiorem praw. Jeśli ta książka stanowi pierwszy krok na drodze do pozna-
nia języka T-SQL (Transact-SQL), powinniście się czuć tak jak Alicja przed rozpoczę-
ciem jej przygód w Krainie Czarów. Dla mnie podróż ta nie ma końca, a po drodze
stale odkrywam coś nowego. Zazdroszczę moim czytelnikom – niektóre z najbardziej
ekscytujących odkryć wciąż są przed Wami!
Z językiem T-SQL związany jestem od wielu lat: nauczanie, seminaria, pisa-
nie i konsultacje związane z tą tematyką. Dla mnie T-SQL to coś więcej niż tylko
język programowania – to sposób myślenia. Często wykładałem i pisałem o (bardzo)
zaawansowanych kwestiach, ale opis podstaw języka wciąż odkładałem na później.
Nie dlatego, że fundamenty T-SQL są proste czy łatwe – wręcz przeciwnie: pozorna
prostota języka jest bardzo myląca. Mógłbym skrótowo przedstawić elementy składni
języka – to wystarczy, by w kilka minut zacząć pisanie zapytań. W praktyce jednak
takie podejście utrudnia zrozumienie istoty języka i wydłuża proces jego poznawania.
Rola przewodnika osób podejmujących pierwsze kroki to duża odpowiedzialność.
Chciałem mieć pewność, że poświęciłem wystarczająco dużo czasu i wysiłku na analizę
i poznanie języka, zanim zabrałem się za opisywanie jego podstaw. Język T-SQL nie jest
prosty; właściwe opanowanie podstaw to znacznie więcej, niż zrozumienie elementów
składni i kodowania zapytań zwracających właściwe wyniki. W istocie trzeba wyrzu-
cić z pamięci wszystko, co się wie o innych językach programowania i zacząć myśleć
w kategoriach języka T-SQL.
Podstawy teoretyczne
SQL to akronim nazwy Structured Query Language (strukturalny język zapytań). Jest
to standaryzowany język, opracowany do tworzenia zapytań i zarządzania danymi
w systemach zarządzania relacyjnymi bazami danych (RDBMS). Akronim RDBMS
oznacza system zarządzania bazą danych oparty na modelu relacyjnym (model seman-
tyczny przedstawiania danych), który z kolei bazuje na dwóch działach matematyki:
teorii zbiorów i logice predykatów. Wiele innych języków programowania i różnych
1
##7#52#aSUZPUk1BVC1WaXJ0dWFsbw==
2
Rozdział 1: Podstawy zapytań i programowania T-SQL
aspektów przetwarzania komputerowego powstało i rozwijało się w dużej mierze
w oparciu o intuicję. Inaczej jest w przypadku SQL. W takim stopniu, w jakim SQL
bazuje na modelu relacyjnym, wznosi się na solidnym fundamencie – matematyce
stosowanej. Tak więc T-SQL opiera się na pewnych podstawach. Firma Microsoft
udostępnia język T-SQL jako dialekt (lub rozszerzenie) języka SQL, wykorzystywany
w oprocowanym przez nią produkcie zarządzania danymi – swoim systemie RDBMS,
czyli Microsoft SQL Server.
Podrozdział ten zawiera krótki opis teoretycznych podstaw języka SQL, teorii zbio-
rów i logiki predykatów, modelu relacyjnego i typów systemów bazodanowych. Ponie-
waż książka ta nie jest ani podręcznikiem matematycznym, ani książką o modelowaniu
danych i projektowaniu, przedstawione w niej informacje teoretyczne przedstawiam
w swobodnej formie, a tym samym nie są one pełne. Celem jest opisanie kontekstu
języka T-SQL i przedstawienie kluczowych punktów, które są niezbędne dla prawid-
łowego pojmowania działania języka T-SQL w dalszej części książki.
Niezależność języka
Model relacyjny jest niezależny od języka. Oznacza to, że można zaimplemen-
tować model relacyjny przy użyciu innego języka niż SQL, na przykład przy
użyciu C# i modelu obiektowego. Obecnie typowym rozwiązaniem są syste-
my RDBMS obsługujące także inne języki programowania, niż pewien dialekt
SQL, czego przykładem jest integracja CLR w SQL Server, pozwalająca obsłużyć
zadania historycznie realizowane w języku T-SQL przy użyciu innych języków
programowania.
Dodatkowo już od początku trzeba zdawać sobie sprawę, że SQL pod wie-
loma względami odbiega od modelu relacyjnego. Niektórzy nawet twierdzą,
że SQL powinien zostać zastąpiony nowym językiem (takim, który byłby bar-
dziej zgodny z modelem relacyjnym). Na razie jednak to SQL jest branżowym
standardem, językiem używanym przez wszystkie wiodące systemy RDBMS.
Informacje szczegółowe na temat niezgodności SQL z modelem relacyj-
ZobacZ także
nym, a także na temat metod używania SQL zgodnie z tym modelem, znaleźć można
w następującej książce: SQL and Relational Theory: How to Write Accurate SQL Code, Third
Edition, C. J. Date (O’Reilly Media, 2015).
##7#52#aSUZPUk1BVC1WaXJ0dWFsbw==
Podstawy teoretyczne
3
SQL
SQL to definiowany przez standardy ANSI i ISO, bazujący na modelu relacyjnym
język programowania, opracowany pod kątem tworzenia zapytań i zarządzania danymi
w systemach RDBMS.
Na początku lat siedemdziesiątych firma IBM opracowała język SEQUEL (Stru-
ctured English QUEry Language) na potrzeby swojego systemu RDBMS nazwanego
System R. Nazwa języka została później zmieniona na SQL ze względu na problemy
dotyczące zastrzeżonego znaku towarowego. Język SQL stał się najpierw standardem
ANSI (w roku 1986), a następnie standardem ISO (w roku 1987). Od roku 1986 insty-
tucje ANSI (American National Standards Institute) i ISO (International Organization
for Standardization) co kilka lat publikują kolejne wersje standardu SQL. Do tej pory
opublikowane zostały następujące standardy: SQL-86 (1986), SQL-89 (1989), SQL-92
(1992), SQL:1999 (1999), SQL:2003 (2003), SQL:2006 (2006), SQL:2008 (2008)
i SQL:2011 (2011). Standard SQL składa się z kilku rozdziałów. Część I (Framework –
platforma) oraz Część 2 (Foundation – podstawy) dotyczą języka SQL, podczas gdy
pozostałe części definiują rozszerzenia standardu, takie jak SQL for XML lub integracja
SQL i Java.
Co interesujące, składnia języka SQL przypomina naturalny język angielski i jest
również bardzo logiczna. Inaczej niż w przypadku wielu języków programowania, któ-
re stosują imperatywne wzorce programowania, SQL używa wzorców deklaratywnych.
Oznacza to, że SQL wymaga określenia, co chcemy uzyskać, a nie jak ma to być wyko-
nane, pozostawiając systemowi RDBMS wybór mechanizmów fizycznych niezbędnych
do przetworzenia żądania użytkownika.
Język SQL obejmuje kilka kategorii instrukcji, w tym DDL (Data Definition Langu-
age – język definicji danych), DML (Data Manipulation Language – język manipulacji
danymi) i DCL (Data Control Language – język sterowania danymi). Kategoria DDL
dotyczy definicji obiektów i obejmuje takie polecenia, jak CREATE, ALTER czy DROP.
Kategoria DML umożliwia tworzenie zapytań oraz modyfikowanie danych i obejmuje
takie instrukcje, jak SELECT, INSERT, UPDATE, DELETE, TRUNCATE i MERGE. Typo-
wym nieporozumieniem jest opinia, że DML zawiera tylko polecenia służące do mody-
fikowania danych; jak już wspomniałem, zawiera także instrukcję SELECT (wybierz).
Innym częstym nieporozumieniem jest traktowanie instrukcji TRUNCATE (obetnij)
jako polecenia DDL, kiedy w rzeczywistości jest poleceniem z kategorii DML. Kate-
goria DCL dotyczy uprawnień i obejmuje takie polecenia, jak GRANT czy REVOKE.
Niniejsza książka skupia się na poleceniach DML.
T-SQL opiera się na standardowym języku SQL, ale wprowadza także pewne włas-
ne, niestandardowe rozszerzenia. Przy opisie elementu języka zazwyczaj zaznaczam,
czy jest to element standardu, czy też nie.
##7#52#aSUZPUk1BVC1WaXJ0dWFsbw==
4
Rozdział 1: Podstawy zapytań i programowania T-SQL
Teoria zbiorów
Teoria zbiorów, znana też pod nazwą teorii mnogości, której twórcą był matema-
tyk Georg Cantor, to jeden z działów matematyki, na której bazuje model relacyjny.
Definicja zbioru sformułowana przez Cantora jest następująca:
Zbiorem jest spojenie w całość określonych rozróżnialnych podmiotów naszej
poglądowości czy myśli, które nazywamy elementami danego zbioru.
– Wikipedia (https://pl.wikipedia.org/wiki/Georg_Cantor)
Każde słowo tej definicji ma głębokie i kluczowe znaczenie. Definicje zbioru i człon-
kostwa w zbiorze są aksjomatami, które nie podlegają dowodzeniu (są to pojęcia pier-
wotne teorii mnogości). Każdy element jest częścią wszechświata i należy lub nie należy
do zbioru.
Rozpocznijmy od słowa całość w definicji Cantora. Zbiór powinien być traktowany
jako pojedyncza jednostka, a nie kolekcja elementów, które go tworzą. Powinniśmy się
skupić na zestawie obiektów, a nie na poszczególnych obiektach, tworzących zestaw.
Później, kiedy będziemy pisać zapytania T-SQL odwołujące się do tabeli w bazie
danych (jak na przykład tabela pracowników), powinniśmy myśleć o zbiorze pracow-
ników jako o całości, a nie o poszczególnych pracownikach. Może się to wydawać
oczywiste i bardzo proste, jednak wielu programistów ma trudności z przyswojeniem
sobie takiego sposobu myślenia.
Słowo rozróżnialny oznacza, że każdy element zbioru musi być niepowtarzalny.
Wybiegając w przód do pojęcia tabeli w bazie danych, możemy wymusić unikato-
wość wierszy w tabeli, definiując ograniczenia klucza. Bez klucza nie będziemy mogli
w sposób jednoznaczny identyfikować wierszy i dlatego tabela nie będzie mogła być
kwalifikowana jako zbiór, a będzie raczej wielozbiorem czy pojemnikiem.
Wyrażenie naszej myśli czy postrzegania sugeruje subiektywność definicji zbioru.
Weźmy pod uwagę salę lekcyjną: jedna osoba może dostrzegać zbiór osób, a inna
zbiór uczniów oraz zbiór nauczycieli. Z tego względu w definiowaniu zbiorów mamy
pokaźną dawkę swobody. Gdy projektujemy model dla naszej bazy danych, proces ten
powinien uważnie uwzględniać subiektywne potrzeby aplikacji, by określić właściwe
definicje występujących tam jednostek.
Jeśli chodzi o słowo obiekt, definicja zbioru nie jest ograniczona tylko do bytów
fizycznych, takich jak samochody czy pracownicy, ale odnosi się także do tworów
abstrakcyjnych, takich jak linie czy liczby pierwsze.
To, czego brakuje w definicji Cantora, jest zapewne równie ważne jak to, co zawie-
ra. Zwróćmy uwagę, że definicja ta nie wspomina o jakimkolwiek uporządkowaniu
elementów zbioru. Kolejność elementów zbioru nie jest istotna. Używany w matema-
tyce formalny zapis wymieniający elementy zbioru korzysta z nawiasów klamrowych:
{a, b, c}. Ponieważ kolejność nie ma znaczenia, ten sam zbiór można przedstawić jako
##7#52#aSUZPUk1BVC1WaXJ0dWFsbw==
Podstawy teoretyczne
5
{b, a, c} lub {b, c, a}. Wyprzedzając opis, w zestawie atrybutów (nazywanych w SQL
kolumnami) tworzących nagłówek relacji (w SQL nazywany tabelą) zakłada się, że ele-
ment jest identyfikowany przez nazwę, a nie przez numer porządkowy.
Podobnie rozważmy zbiór krotek (w SQL nazywanych wierszami), który stanowi
treść relacji; element jest identyfikowany przez jego wartości klucza, a nie na podsta-
wie położenia. Wielu programistów ma trudności z przyswojeniem sobie tego sposobu
myślenia, że z punktu widzenia zapytań dotyczących tabel nie istnieje żadna określo-
na czy preferowana kolejność wierszy. Inaczej mówiąc, zapytanie odwołujące się do
tabeli może zwrócić jej wiersze w dowolnej kolejności, chyba że jawnie zażądamy
określonego posortowania wynikowych danych, na przykład w celu ich określonego
zaprezentowania.
Logika predykatów
Logika predykatów, korzeniami sięgająca starożytnej Grecji, jest innym działem mate-
matyki, na którym opiera się model relacyjny. Dr Edgar F. Codd tworząc model rela-
cyjny dostrzegł możliwość połączenia logiki predykatów zarówno z zarządzaniem
danymi, jak i tworzeniem zapytań. Mówiąc niezbyt ściśle, predykat jest pewną właści-
wością lub wyrażeniem, które albo jest spełnione, albo nie – mówiąc inaczej, albo jest
prawdą, albo fałszem. Model relacyjny polega na predykatach w celu utrzymywania
logicznej integralności danych i definiowania struktury danych. Przykładem predykatu
użytego do wymuszenia integralności jest ograniczenie zdefiniowane w tabeli nazwanej
Employees (pracownicy), które zezwala na umieszczenie w tabeli jedynie takich danych
pracowników, których pensja jest większa od zera. Predykatem jest tu wyrażenie „pen-
sja większa niż 0” (wyrażenie T-SQL: pensja 0).
Predykaty używane są również podczas filtrowania danych w celu zdefiniowania
podzbiorów. Jeśli na przykład zachodzi potrzeba odpytania tabeli Employees i zwró-
cenia jedynie tych wierszy, które dotyczą pracowników działu sprzedaży, w naszym
filtrze możemy użyć predykatu „działem jest (równa się) dział sprzedaży” (wyrażenie
T-SQL: dział = ‘sprzedaż’).
W teorii mnogości predykatów można używać do definiowania zbiorów. Metoda
taka jest przydatna, ponieważ nie zawsze możemy zdefiniować zbiór poprzez wymie-
nienie wszystkich jego elementów (przykładem mogą być zbiory nieskończone), a czę-
sto wygodniej jest zdefiniować zbiór w oparciu o właściwość. Przykładem zbioru nie-
skończonego zdefiniowanego za pomocą predykatu może być zbiór wszystkich liczb
pierwszych, który można zdefiniować przy użyciu następującego wyrażenia: „x jest
dodatnią liczbą całkowitą większą niż 1, która podzielna jest tylko przez 1 i samą sie-
bie”. Dla dowolnej wyspecyfikowanej wartości predykat jest albo prawdą, albo fałszem.
Zbiorem wszystkich liczb pierwszych jest zbiór wszystkich elementów, dla których
predykat jest prawdziwy. Przykładem skończonego zbioru zdefiniowanego za pomocą
predykatu może być zbiór {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, definiowany jako zbiór wszystkich
##7#52#aSUZPUk1BVC1WaXJ0dWFsbw==
6
Rozdział 1: Podstawy zapytań i programowania T-SQL
elementów, dla których następujący predykat ma wartość prawda: „x jest liczbą całko-
witą równą lub większą niż 0 i równą lub mniejszą niż 9”.
Model relacyjny
Model relacyjny jest modelem semantycznym zarządzania i modyfikowania danych,
opartym na teorii zbiorów i logice predykatów. Jak już wspomniałem wcześniej, model
ten został stworzony przez Edgara F. Codda, a następnie rozbudowany i opracowany
przez Chrisa Date, Hugha Darwena i innych. Pierwsza wersja modelu relacyjnego
została zaproponowana przez Codda w roku 1969 w postaci raportu badawczego fir-
my IBM pod tytułem „Derivability, Redundancy, and Consistency of Relations Stored
in Large Data Banks”. Poprawiona wersja przedstawiona została przez Codda w roku
1970 w dokumencie zatytułowanym „A Relational Model of Data for Large Shared Data
Banks”, opublikowanym w czasopiśmie Communications of the ACM.
Celem modelu relacyjnego jest udostępnienie spójnej reprezentacji danych przy
minimalnej redundancji lub jej braku i bez utraty kompletności oraz zdefiniowanie
integralności danych (wymuszanie spójności danych) jako części modelu. System
RDBMS powinien implementować model relacyjny i dostarczać środków do realizowa-
nia zapytań oraz do przechowywania, zarządzania i wymuszania integralności danych.
Model relacyjny opiera się na silnych podstawach matematycznych, a nie na intuicji,
co oznacza, że mając pewną instancję modelu danych (na podstawie których zostanie
później wygenerowana fizyczna baza danych) możemy dokładnie określić, czy projekt
ten jest podatny na wady, nie polegając wyłącznie na intuicji.
Model relacyjny korzysta z takich pojęć, jak tezy, predykaty, relacje, krotki, atrybuty
i wiele innych. Dla osób nie zajmujących się matematyką pojęcia te mogą wydawać się
początkowo przytłaczające,
Pobierz darmowy fragment (pdf)