Złączenia i relacje w SQL Server

1. Rodzaje złączeń w SQL Server

Teraz najważniejsza część szkolenia z relacyjnych baz danych, a więc złączenia SQL. Wszystkie możliwe typy złączeń występujące w SQL Server omówimy w tym i kolejnych dwóch rozdziałach szkolenia. Co możemy ze sobą łączyć w SQL Server? Łączymy:

  • tabele z tabelami
  • widoki z widokami
  • tabele z widokami

Same złączenia w językach SQL możemy podzielić na dwie podstawowe grupy:

  • Złączenia poziome
  • Złączenia pionowe

2. Poziome złączenia SQL

Złączeń poziomych będziemy używać najczęściej. Służą one do łączenia tabel i widoków za pomocą wspólnych kluczy. Załóżmy, że mamy dwie tabele danych. W obu tabelach mamy wspólny identyfikator np numer klienta. Dzięki temu powiązaniu możemy połączyć dane z obydwu tabel.

Kurs SQL Server - złączenia poziome SQL
Kurs SQL Server – złączenia poziome SQL

W Microsoft SQL Server mamy wiele rodzajów złączeń poziomych. Najprostsze złączenie możemy wykonać bez użycia identyfikatora. Jest to tzw. złączenie kartezjańskie nazywane też złączeniem krzyżowym CROSS, w którym wszystkie rekordy z jednej tabeli zostają połączone ze wszystkimi rekordami z drugiej tabeli. Zróbmy krótki przykład. Baza AdventureWorks posiada dwie niewielkie tabele w schemacie Production. Są to Production.ProductCategory (4 rekordy) i ProductSubCategory (37 rekordów). Złączenie kartezjańskie na tych tabelach wykonujemy w następujący sposób oddzielając przecinkiem obie tabele:

USE AdventureWorks2014
GO

SELECT *
  FROM AdventureWorks2014.Production.ProductCategory A,
  AdventureWorks2014.Production.ProductSubcategory B
  go

Jak widzimy użyteczność złączenia kartezjańskiego jest bardzo ograniczona. Wynik zawiera wszystkie powiązane ze sobą rekordy, a więc 148. Zmieńmy nasz skrypt i dodajmy do niego proste złączenie pomiędzy tabelami oparte o identyfikator w klauzuli WHERE, którym jest ProductCategoryID. Jak widzisz, ten identyfikator występuje w obydwu tabelach:

USE AdventureWorks2014
GO

SELECT *
  FROM AdventureWorks2014.Production.ProductCategory A,
  AdventureWorks2014.Production.ProductSubcategory B
  WHERE A.ProductCategoryID = B.ProductCategoryID
  go
Kurs SQL Server - złączenia i relacje SQL
Kurs SQL Server – złączenia i relacje SQL

Zrobiłeś właśnie pierwsze sensowne złączenie dwóch tabel. Wynik zawiera 37 rekordów. Zawiera wszystkie rekordy i kolumny z obydwu table. Kategorie produktów zostały dopisane do tabeli z podkategoriami. Wchodząc w szczegóły, złączenia w klauzuli WHERE to złączenia poziome wewnętrzne. W kolejnych rozdziałach kursu SQL będziemy tworzyć takie złączenia przy użyciu klauzuli JOIN. Złączenia poziome typu JOIN szczegółowo omawiam w kolejnym rozdziale szkolenia SQL.

3. Czym są relacje w bazach danych i jakie relacje wyróżniamy?

W poprzednim przykładzie połączyliśmy dwie tabele danych za pomocą wspólnego identyfikatora. To właśnie ten identyfikator określa relacje pomiędzy tabelami. Wyróżniamy trzy typy relacji w językach SQL:

  • jeden do jednego
  • jeden do wielu
  • wiele do wielu

W poprzednim punkcie skorzystaliśmy z relacji jeden do jednego. Oznacza to tyle, że identyfikatory w obydwu tabelach są unikatowe, nie powtarzają się. Wynika z tego, że każdemu rekordowi z tabeli 1 możemy przypisać tylko jeden rekord z tabeli 2. Analogicznie w przypadku złączeń jeden do wielu rekordy w tabeli 2 nie są unikatowe. W przypadku złączeń wiele do wielu, rekordy w obydwu tabelach nie są unikatowe. W SQL możemy łączyć tabele według każdej możliwej relacji. Jeśli jednak tworzymy profesjonalne aplikacje oparte o bazę danych SQL Server, relacje pomiędzy tabelami tworzone są za pomocą kluczy głównych Primary Key i Kluczy obcych Foreign Key. Klucze te omówimy szczegółowo w końcowej części szkolenia SQL.

4. Pionowe złączenia SQL

Złączenia pionowe służą do operacji łączenia, bądź wykluczania całych rekordów z naszych tabel i widoków. Złączeń pionowych możemy używać, w przypadkach, gdy tabele mają taką samą liczbę kolumn oraz kolumny tabel posiadają takie same typy danych. W każdym innym wypadku zapytania SQL otrzymamy komunikat o wystąpieniu błędu. Poniżej przykład łączący dwie tabele danych z użyciem łączenia UNION. Wynik zawiera rekordy obu tabel.

Kurs SQL Server - złączenia pionowe SQL
Kurs SQL Server – złączenia pionowe SQL

Zróbmy krótki przykład łączący dwa podobne zestawy danych z bazy AdventureWorks za pomocą łączenia UNION. Otrzymany wynik będzie zawierał w tym wypadku wszystkie rekordy z obydwu zapytań:

use AdventureWorks2014
go

select BusinessEntityID, LastName from person.Person
where BusinessEntityID < 100

union 

select BusinessEntityID, LastName  from person.Person
where BusinessEntityID >= 20000
go

Złączenia pionowe UNION, UNION ALL, EXCEPT oraz INTERSECT szczegółowo omawiam w kolejnych rozdziałach kursu SQL.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *