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.