SQL Server

Bir neçə cədvəldən verilənlərin seçilməsi

Bir neçə cədvəldən verilənlərin seçilməsi

İndiyədək bizim bütün suallarımız yalnız bir cədvələ aid idi. Lakin SQL bir sualda bir neçə cədvələ müraciət etmək imkanı verir. Elə bu xassə SQL dilini məşhur edir.

Cədvəldəki sütunun tam adı faktiki olaraq cədvəlin adı sonra nöqtə və sütunun adından ibarət olur. (Əslində desək əvvəldə istifadəçi adı da istifadə oluur, lakin buna gələcəkdə qayıdacağıq). Adlara nümunə:

	Salespeople.snum
	Salespeople.city
	Orders.odate

İndiyədək biz suallarda cədvəllərin adlarını buraxırdıq, çünki yalnız bir cədvəldən sorğu edirdik. Əgər biz müxtəlif cədvəllərin sütunlarını birləşdirmək istəyiriksə, onda serverin onları ayırması üçün Selepeople.city və Customers.city yazmalıyıq.

Tutaq ki ticarət agentləri və sifarişçilərin şəhərlər üzrə kombinasiyasını görmək istəyirsiniz. Bu aşağıdakı kimi edilir.

SELECT Customers.cname, Salespeople.sname, Salespeople.city
FROM Salespeople, Customers
WHERE Salespeople.city = Customers.city

Sualın nəticəsi:

cname                sname   city
-------------------- ------- ----------
ТОО Рога и копыта    Иванов  Москва
ОАО "Валют-транзит"  Егоров  Караганда

Yəni ki city sütunu nticarət agentləri və sifarişçilər cədvəlində var, cədvəlin adları prefiks kimi istifadə olunmalıdırlar.

Bu sual necə işləyir? SQL Server hər iki cədvəlin sütunlarının kombinasiyasını yoxlayır və onların WHERE şərtinə olan şərtlərini yoxlayır.Əgər bu kombinasiya şərtləri ödayirsə onda o nəticə verir. Cədvəllərin birləşməsi üçün bərabərliklərdən başqa digər müqayisə şərtlərini də istifadə etmək olar. Məs:

SELECT Salespeople.sname, Customers.cname
FROM Salespeople, Customers
WHERE Salespeople.sname < Customers.cname AND
	Customers.rating < 200

Nəticə:

-------- ------------------
Егоров   ТОО Рога и копыта
Иванов   ТОО Рога и копыта
Петров   ТОО Рога и копыта
Сидоров  ТОО Рога и копыта
Егоров   ОАО "ООО"
Иванов   ОАО "ООО"

Prinsipcə bu heç də xeyirli sorğu deyil. O satıcının adı və sifarişçinin adı arasındakı kombinasiyanı elə edir ki birinci sonuncudan alfavit sırada əvvəl gəlsin, sifarişçinin isə reytinqi 200-dən az olsun.

Tutaq ki bizə agent ilə bir şəhərdə olan bütün sifarişçiləri tapmaq lazımdır. Bunun üçün üç cədvəli bağlamaq lazımdır.

SELECT Orders.onum, Customers.cname, Orders.cnum, Orders.snum
FROM Salespeople, Customers, Orders
WHERE Customers.city <> Salespeople.city AND
	Orders.cnum = Customers.cnum AND
	Orders.snum = Salespeople.snum

Nəticə:

onum  cname                              cnum  snum
----- ---------------------------------- ----- -----
3001  ОАО "Валют-транзит"                2008  1007
3002  ОАО "ООО"                          2007  1004
3005  Фирма ХХХ                          2003  1002
3006  AО Бендер и К                      2002  1007
3007  Концерн "Дети лейтенанта Шмидта"   2004  1002
3008  Clemens                            2006  1001
3009  AО Бендер и К                      2002  1003
3010  Концерн "Дети лейтенанта Шмидта"   2004  1002
3011  Clemens                            2006  1001

İndi diz bir neçə cədvələ eyni vaxtda sorğu göndərə bilərsiniz. Siz cədvəl ilə bağlı olan ixtiyari qaydaları təyin edə bilərsiniz. əslində elə buna görə də SQL yaradılıb. İrəlidə biz digər sorğunun nəticəsinə əsasən işləyən sorğular kombinasiyasına baxacağıq.