Włączamy numerację linii w SQL Server 2008 R2

Po uruchomieniu zapytania, jeśli nie jest ono dobrze skonstruowane, często otrzymujemy błędy, które zawierają podpowiedź co zrobiliśmy źle. Przy błędzie jest także informacja w której linijce wystąpił i wszystko jest w porządku jeśli nasze zapytanie ma 10 lub 20 linijek. Ale co w przypadku kiedy nasze zapytanie ma 100 lub więcej ? Na szczęście możemy włączyć sobie numerowanie linii w oknie pisania zapytań. Można to zrobić w bardzo łatwy sposób.

1. Widok okna gdzie piszemy zapytania przed włączeniem numeracji linii

Okno zapytań przed włączeniem numeracji linii.
Okno zapytań przed włączeniem numeracji linii.

2. Klikamy w menu TOOLS i później w OPTIONS

Klikamy w menu TOOLS a później w OPTIONS
Klikamy w menu TOOLS a później w OPTIONS

3. rozwijamy drzewko z lewej strony TEXT EDITOR -> ALL LANGUAGES i zaznaczamy checkbox przy opcji LINE NUMBERS i klikamy w przycisk OK dla potwierdzenia zmian.

Rozwijamy drzewko TEXT EDITOR -> ALL LANGUAGES
Rozwijamy drzewko TEXT EDITOR -> ALL LANGUAGES

4. Widok okna zapytań po włączeniu numeracji linii.

Widok okna zapytań po włączeniu numeracji linii.
Widok okna zapytań po włączeniu numeracji linii.

SELECT .podstawy .zadanie 2 .wyświetl listę wszystkich działów

Zadanie 02

Wyświetlić listę wszystkich działów

 

Wynik

Kurs SQL. Baza BANK. Zadanie 02
Kurs SQL. Baza BANK. Zadanie 02

 

Rozwiązanie (zapytanie SQL)

Kurs SQL. Baza BANK. Zadanie 02. Rozwiązanie
Kurs SQL. Baza BANK. Zadanie 02. Rozwiązanie

 

Omówienie

Na początku rozpoczynamy od słówka SELECT po którym określamy jakie dane chcemy pozyskać z bazy. Mamy wyświetlić nazwy wszystkich działów, które znajdują się w polu DISPLAYNAME w tabeli DEPARTMENTS. Więc po słówku SELECT wpisujemy nazwę DISPLAYNAME, linia 2.

Linia 3 to słówko FROM po którym wskazujemy źródło danych. Skoro chcemy wyświetlić nazwy działów to musimy wskazać na tabelę DEPARTMENTS, to też robimy w linijce 4.

gotowe 🙂

 

SELECT .podstawy .zadanie 01 .Wyświetl wszystkich pracowników banku

Zadanie 1.

Wyświetl wszystkich pracowników banku w formacie: Imię, Nazwisko

 

Efekt zapytania.

Kurs SQL. Baza BANK. Zadanie 01
Kurs SQL. Baza BANK. Zadanie 01

 

Rozwiązanie (zapytanie SQL)

Kurs SQL. Baza BANK. Zadanie 01. Zapytanie SQL.
Kurs SQL. Baza BANK. Zadanie 01. Zapytanie SQL.

Kilka słów dodatkowego wyjaśnienia.

Ogólny schemat każdego nieskomplikowanego zapytania składa się z trzech części, nazwijmy je sekcjami:

Musimy określić co chcemy wyświetlić, czli sekcja SELECT

następnie określamy skąd chcemy czerpać dane czyli sekcja FROM

i określić ewentualne parametry zapytania, czyli manipulowanie wynikami co chcemy wyświetlić a czego nie. Do tego posłuży nam słówko WHERE. Co do sekcji WHERE nie musi ona występować w prostych zapytaniach.

Kurs SQL – opis przykładowej bazy – BANK

Chciałbym Wam zaproponować podstawowy kurs SQL-a na przykładzie prostej bazy danych BANK którą sam stworzyłem na potrzeby tego kursu. Aby sprawnie przejść do ćwiczeń przedstawiam poniżej opis bazy oraz jej schemat.

 

Baza BANK v.1

Dlaczego wersja 1 ? Bo mam nadzieję, że baza jak i kurs będą rozwijane aż do poziomu zaawansowanego. Na razie baza jest bardzo prosta w swojej strukturze ale nic bardziej skomplikowanego nie jest nam potrzebne do zapoznania się z podstawami języka SQL. Poniżej struktura bazy BANK v.1

 

Kurs SQL. SQL Tutorial - schemat
Kurs SQL. SQL Tutorial – schemat

Opis tabel:

DEPARTMENTS – przechowuje dane dotyczące działów w Banku

Kurs SQL. SQL Tutorial. Tabela. Departments
Kurs SQL. SQL Tutorial. Tabela. Departments

EMPLOYEES – przechowuje dane pracowników Banku (dane w bazie są fikcyjne 🙂  )

Kurs SQL. SQL Tutorial. Tabela. Employees.
Kurs SQL. SQL Tutorial. Tabela. Employees.

POSITIONS – zawiera informacje na temat stanowisk pracy w Banku

Kurs SQL. SQL Tutorial. Tabela. Positions.
Kurs SQL. SQL Tutorial. Tabela. Positions.

myślę, że w 100% to wystarczy do przećwiczenia podstaw SQL-a.

Zapraszam do ćwiczeń praktycznych.

SQL Server 2008 R2 Express – tworzenie kopii okresowej bez server agenta

Tworzenie kopii zapasowej bazy danych w środowisku SQL Server 2008 R2 w wersji Express może być lekko problemowe z uwagi na brak server agenta, ale można obejść ten problem.

Poniżej przedstawię opis rozwiązania tego problemu.

W pierwszej kolejności musimy napisać skrypt tworzący backup naszej bazy np. AdventureWorks2008R2

use master;

backup database AdventureWorks2008 to disk = ‚d:\mybackup.bak’

Zapisz ten skrypt pod nazwą np d:\mybackup.sql
Potem spróbuj uruchomić ten skrypt z poziomu command prompt (uruchamiasz cmd, a w nim):

 sqlcmd -s d:\mybackup.sql

Komenda powinna zinterpretować Twój skrypt i wykonać kopię bazy danych. Jak działa to idziemy dalej.
Teraz wykorzystując Harmonogram zadań pod windows każesz wykonywać okresowo:

 sqlcmd -s d:\mybackup.sql

Komenda w w/w postaci używa autentykacji Windows. Definiując zadanie w harmonogramie zadań
musisz określić, na czyim koncie ma się uruchamiać to zadanie. Jeżeli wybierzesz swoje konto to bądź przygotowany na to, że rozwiązanie przestanie działać kiedy zmienisz swoje hasło. Idealnie więc byłoby mieć inne konto użytkownika należące w sql do roli backup operators i uruchamiać tę komendę na tym koncie.

SQL Server 2008 R2 – Error were encountered during the save process

Przy zmianie struktury bazy danych np. przy dodaniu nowej kolumny możemy natrafić na taki komunikat

Error were encountered during the save proces. Some database objects were not saved. (patrz obrazek poniżej)

Error were encountered during the save process

wyjaśnię to na przykładzie.

Powiedzmy, że tworzymy bazę danych dla banku i mamy tabelę EMPLOYES która będzie przechowywała dane pracowników banku. Przy tworzeniu ww. tabeli zapomnieliśmy o kolumnie DEPARTMENT_ID która będzie przechowywała wartość wskazującą na rekord w tabeli DEPARTMENTS czyli będzie wskazywała w którym dziale pracuje pracownik.

Czyli chcemy dodać kolumnę DEPARTMENT_ID do tabeli EMPLOYEES. Klikamy prawym przyciskiem myszy w strukturze bazy na tabelę EMPLOYEES i wybieramy opcję DESING

Error were encountered during the save process 0

później dodajemy nowy wiersz o nazwie DEPARTMENT_ID wybieramy mu typ np. BIGINT i odznaczamy checkbox w kolumnie o nazwie ALLOW NULLS bo nie chcemy aby jakiś pracownik nie był przyporządkowany do jakiegoś działu. W praktyce też nie występuje raczej taka sytuacja kiedy pracownik nie jest przydzielony do żadnego działu.

Error were encountered during the save process 1

i ku naszemu wielkiemu zdziwieniu pojawia nam się błąd jak na początku

Error were encountered during the save process

Po wnikliwym wczytaniu się w komunikat Cannot insert the value NULL intu column ‚DEPARTMENT_ID’ itd… i tutaj mamy sedno sprawy. Przy tworzeniu nowej kolumny serwer automatycznie wypełni nowo powstałą kolumnę wartościami NULL no bo czym innym ma to wypełnić skoro nie wie jakie wartości mają tam się znaleźć. I mamy rozwiązanie. Aby wstawić taką kolumnę musimy zaznaczyć checkbox w kolumnie ALLOW NULLS

Error were encountered during the save process 3a

zapisać zmiany

następnie należy wypełnić kolumnę DEPARTMENT_ID w tabeli EMPLOYEES danymi czyli wpisać ID działów przy każdym pracowniku

Error were encountered during the save process 4a

po zapisaniu danych wracamy do projektowania tabeli EMPLOYEES i odznaczamy checkbox w kolumnie ALLOW NULLS przy DEPARTMENT_ID

Error were encountered during the save process 1

i zapisujemy dane z powrotem. Odznaczenie tego chceckboxa zabezpieczy nas na przyszłość przed sytuacją braku przypisania działu do pracownika.

SQL Server 2008 R2 – Saving changes is not permitted – Brak możliwości wprowadzenia zmian do tabeli

Po instalacji SQL Server 2008 R2 przy tworzeniu nowej bazy danych możemy natrafić na taki komunikat

SAVING CHANGES IS NOT PERMITTED…

saving changes is not permitted

Występuje on np. w sytuacji kiedy chcesz dokonać zmian w strukturze bazy np. zmienić typ danych w tabeli lub dopisać kolejną kolumnę do tabeli. W takim przypadku brak jest możliwości zapisania zmian w strukturze bazy lub tabeli które wprowadziłeś.  Jest to zabezpieczenie które ma Cię uchronić przed zmianami w strukturze bazy, które mogą wpłynąć na charakter danych w bazie lub całkowitą ich utratę. Jeśli wiesz co robisz i dalej chcesz zmieniać strukturę bazy np. dokonać jakichś zmian w strukturze tabeli można to strzeżenie wyłączyć w następujący sposób.

(dot. SQL Server Management Studio) W tym celu należy wejść do menu TOOLS następnie kliknąć w opcję OPTIONS, rozwijamy gałąź DESIGNERS a następnie klikany w TABLE AND DATABASE DESIGNERS i odznaczamy opcję PREVENT SAVING CHANGES THAT REQUIRE TABLE RE-CREATION, jak na obrazku poniżej

saving changes is not permitted 2a

po takiej konfiguracji komunikat przestanie się pojawiać. Należy jednak pamiętać, szczególnie jeśli nie jesteśmy jedynymi użytkownikami serwera, że pozbawiamy się pewnego rodzaju ochrony przed błędami, które mogą być nieodwracalne. Moja sugestia jest więc taka, że po wprowadzeniu potrzebnych zmian odwrócić sytuację i włączyć tą opcję z powrotem 🙂

RIGHT JOIN

Teraz zajmiemy się poleceniem RIGHT JOIN korzystając z bazy TEST

Schemat bazy TEST

schemat bazy test

 

Dane w bazie TEST

baza TEST dane w tabelach

Zapytanie

RIGHT JOIN zapytanie

 

Wynik uruchomienia zapytania

RIGHT JOIN wynik

 

Interpretacja graficzna

RIGHT JOIN grafika

Opis

Widzimy, że polecenie RIGHT JOIN bez żadnego warunku WHERE, łączy dwie tabele A i B i „znajduje” powiązania wartości z tabeli A z wartościami z tabeli B według kolumn złączenia. Jeśli w wyniku złączenia będzie wartość w tabeli B odpowiadająca wartości z tabeli A to będzie ona wyświetlona (część wspólna) i są to rekordy od 1-5 w tabeli wyników. Natomiast jeśli nie będzie odpowiedniej wartości w tabeli A to zamiast wartości w wynikach pojawi się wartość NULL co prezentuje rekord o ID=6 w tabeli wyników.

Jest jeszcze możliwość, że chcemy wyświetlić tylko wartości z tabeli B (zbioru B), które nie mają odpowiednika w tabeli A (zbiorze A), co obrazuje poniższa grafika

RIGHT JOIN grafika1

aby uzyskać taki wynik także posłużymy się poleceniem RIGHT JOIN ale musimy dodać warunek i nasze zapytanie przybierze postać

RIGHT JOIN zapytanie 1

i poniżej tabela wyników naszego zapytania

RIGHT JOIN wynik 1

widzimy, że wyświetlony został tylko rekord gdzie dla rekordu z tabeli B brak jest odpowiednich rekordów z tabeli A i w tych miejscach jest wartość NULL, czyli pusta.

 

 

LEFT JOIN

Teraz zajmiemy się poleceniem LEFT JOIN korzystając z bazy TEST

Schemat bazy TEST

schemat bazy test

 

Dane w bazie TEST

baza TEST dane w tabelach

Zapytanie

LEFT JOIN zapytanie

 

Wynik uruchomienia zapytania

LEFT JOIN wynik

 

Interpretacja graficzna

LEFT JOIN grafika

Opis

Widzimy, że polecenie LEFT JOIN bez żadnego warunku WHERE, łączy dwie tabele A i B i „znajduje” powiązania wartości z tabeli A z wartościami z tabeli B według kolumn złączenia. Jeśli w wyniku złączenia będzie wartość w tabeli B odpowiadająca wartości z tabeli A to będzie ona wyświetlona (część wspólna) i są to rekordy od 1-5 w tabeli wyników. Natomiast jeśli nie będzie odpowiedniej wartości w tabeli B to zamiast wartości w wynikach pojawi się wartość NULL co prezentuje rekord o ID=6 w tabeli wyników.

Jest jeszcze możliwość, że chcemy wyświetlić tylko wartości z tabeli A (zbioru A), które nie mają odpowiednika w tabeli B (zbiorze B), co obrazuje poniższa grafika

LEFT JOIN grafika1

aby uzyskać taki wynik także posłużymy się poleceniem LEFT JOIN ale musimy dodać warunek i nasze zapytanie przybierze postać

LEFT JOIN zapytanie1

i poniżej tabela wyników naszego zapytania

LEFT JOIN wynik1

widzimy, że wyświetlony został tylko rekord gdzie dla rekordu z tabeli A brak jest odpowiednich rekordów z tabeli B i w tych miejscach jest wartość NULL, czyli pusta.

 

 

INNER JOIN, JOIN

Do wyjaśnienia działania polecenia INNER JOIN (JOIN) skorzystam z testowej bazy, której schemat przedstawiam poniżej.

 

Schemat bazy TEST

schemat bazy test

 

Dane w bazie TEST

baza TEST dane w tabelach

Zapytania INNER JOIN , JOIN

INNER JOIN, JOIN

Wyniki zapytań INNER JOIN, JOIN

INNER JOIN, JOIN wyniki

Interpretacja wyników

Polecenia INNER JOIN i JOIN zwracają dokładnie te same wyniki.

„Wyciągają” wspólną część, czyli wartości w kolumnach które są złączone, z obu tabel (zbiorów).

Aby lepiej zobrazować wyniki tych zapytań posłużę się obrazkiem.

INNER JOIN, JOIN grafika

kolorem czerwonym jest zaznaczona część wspólna zbiorów A i B, dokładnie tą część uzyskujemy po zastosowaniu poleceń INNER JOIN i JOIN