Cyfroteka.pl

klikaj i czytaj online

Cyfro
Czytomierz
00398 009631 11232694 na godz. na dobę w sumie
Podstawy języka T-SQL Microsoft SQL Server 2016 i Azure SQL Database - ebook/pdf
Podstawy języka T-SQL Microsoft SQL Server 2016 i Azure SQL Database - ebook/pdf
Autor: Liczba stron:
Wydawca: Promise Język publikacji: polski
ISBN: 978-83-7541-349-6 Data wydania:
Lektor:
Kategoria: ebooki >> komputery i informatyka >> programowanie
Porównaj ceny (książka, ebook, audiobook).

Skuteczne zapytania i modyfikowanie danych przy użyciu Transact-SQL
Opanuj podstawy języka T-SQL i pisz niezawodny kod dla Microsoft SQL Server i Azure SQL Database. Itzik Ben-Gan wyjaśnia kluczowe koncepcje języka T-SQL i pomaga w wykorzystaniu tej wiedzy w praktycznych zastosowaniach. Książka przedstawia zasady działania T-SQL i logikę działającą w tle. Następnie prowadzi czytelnika poprzez kluczowe zagadnienia, takie jak zapytania jednotabelowe, złączenia, podzapytania, wyrażenia tablicowe i operatory zbiorów. Dalej książka przedstawia bardziej zaawansowane zagadnienia, takie jak funkcje okna, tworzenie tabel przestawnych i grupowanie zbiorów. Wyjaśnione zostaną również techniki modyfikowania danych, pracy z tabelami tymczasowymi i obsługa transakcji, a także przegląd obiektów programowalnych.
Itzik Ben-Gan, MVP w dziedzinie Microsoft Data Platform, przedstawia:
•    Podstawowe koncepcje SQL i jego matematyczne korzenie
•    Tworzenie tabel i wymuszanie integralności danych
•    Wykonywanie efektywnych zapytań przy użyciu wyrażenia SELECT
•    Odpytywanie wielu tabel przy użyciu złączeń, podzapytań, wyrażeń tablicowych i operatorów zbiorów
•    Stosowanie zaawansowanych technik, takich jak funkcje okna, tabele przestawne i grupowanie zbiorów
•    Wstawianie, aktualizowanie, usuwanie i scalanie danych
•    Korzystanie z transakcji w wielodostępnym środowisku
•    Wprowadzenie do obiektów programowalnych – od zmiennych i plików wsadowych po funkcje definiowane przez użytkownika, procedury składowane, wyzwalacze i dynamiczny kod SQL

Znajdź podobne książki Ostatnio czytane w tej kategorii

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)

Gdzie kupić całą publikację:

Podstawy języka T-SQL Microsoft SQL Server 2016 i Azure SQL Database
Autor:

Opinie na temat publikacji:


Inne popularne pozycje z tej kategorii:


Czytaj również:


Prowadzisz stronę lub blog? Wstaw link do fragmentu tej książki i współpracuj z Cyfroteką: