Tanlashga asosan ko‘pjadvalli so‘rovlar yaratish. Malumotlar tuzilishi.
Quyi so'rov - bu SELECT, INSERT, UPDATE yoki DELETE bayonotida yoki boshqa quyi so'rov ichida ishlatiladigan so'rovdir.
Ichki soʻrovlar asoslari
Quyi so'rov ichki so'rov yoki ichki tanlov deb ham ataladi, quyi so'rovni o'z ichiga olgan bayonot esa tashqi so'rov yoki tashqi tanlov deb ataladi.
Quyi so'rovlarni o'z ichiga olgan ko'plab Transact-SQL bayonotlari birlashma sifatida yozilishi mumkin. Boshqa so'rovlarni faqat pastki so'rovlar yordamida amalga oshirish mumkin. Transact-SQL-da, odatda, quyi so'rovni o'z ichiga olgan bayonot va pastki so'rovsiz semantik ekvivalent versiya o'rtasida ishlash farqi yo'q. SQL Server so'rovlarni qanday qayta ishlashi haqida ko'proq ma'lumot olish uchun SQL bayonotlarini qayta ishlashga qarang. Biroq, ayrim hollarda mavjudligi tekshirilganda, ulanishlar yaxshiroq ishlaydi. Aks holda, dublikatlarni yo'q qilish uchun tashqi so'rovning har bir natijasini olish uchun quyi so'rovni qayta ishlash kerak. Bunday hollarda ulanishlarning ishlash usuli eng yaxshi natijalarni beradi.
Quyidagi misolda bir xil natijalar to‘plami va bajarish rejasini qaytaruvchi SELECT quyi so‘rovi va SELECT qo‘shilishi qo‘llaniladi:
SELECT [Name]
FROM Maxsulot.Maxsulotlar
WHERE Narxlari =
(SELECT Narxlari
FROM Maxsulot.Maxsulotlar
WHERE [Name] = 'Choy');
/* SELECT statement built using a join that returns
the same result set. */
SELECT Prd1.[Name]
FROM Production.Product AS Prd1
JOIN Production.Product AS Prd2
ON (Prd1.ListPrice = Prd2.ListPrice)
WHERE Prd2.[Name] = 'Chainring Bolts';
Tashqi SELECT bayonotiga kiritilgan so'rov quyidagi komponentlarga ega:
tanlangan ro'yxatning odatiy komponentlarini o'z ichiga olgan oddiy SELECT so'rovi;
bir yoki bir nechta jadval yoki ko'rinish nomlarini o'z ichiga olgan oddiy FROM bandi.
Ixtiyoriy WHERE bandi.
Ixtiyoriy GROUP BY bandi.
Ixtiyoriy HAVING bandi.
Quyi so'rovning SELECT so'rovi har doim qavs ichiga olinadi. U COMPUTE yoki FOR BROWSE bandlarini o'z ichiga olmaydi va faqat TOP bandi bilan birga ORDER BY bandini o'z ichiga olishi mumkin.
Quyi soʻrov tashqi SELECT, INSERT, UPDATE yoki DELETE iborasining WHERE yoki HAVING bandiga yoki boshqa quyi soʻrovga kiritilishi mumkin. 32-darajagacha joylashtirish mumkin, garchi chegaralar mavjud xotira hajmiga va so'rovdagi boshqa ifodalarning murakkabligiga qarab o'zgaradi. Shaxsiy so'rovlar 32-darajagacha joylashtirishni qo'llab-quvvatlamasligi mumkin. Quyi so'rov bitta qiymatni qaytarsa, ifoda ishlatilishi mumkin bo'lgan har qanday joyda paydo bo'lishi mumkin.
Agar jadval tashqi so'rovda emas, faqat pastki so'rovda paydo bo'lsa, unda ushbu jadvalning ustunlarini chiqishga kiritish mumkin emas (tashqi so'rov ro'yxatini tanlang).
Quyi soʻrovlarni oʻz ichiga olgan bayonotlar odatda quyidagi formatlardan birini oladi:
WHERE ifodasi \ [NOT] IN (kichik so'rov)
WHERE ifoda taqqoslash_operatori \ [HAR QANDAY | ALL] (quyi so'rov)
QAYERDA \ [YO'Q] (pastki so'rov)
Ba'zi Transact-SQL iboralari quyi so'rovni alohida so'rov sifatida ko'rib chiqishi mumkin. Odatda, quyi so'rov natijalari tashqi so'rovga kiritiladi (garchi SQL Server pastki so'rovlar bilan Transact-SQL bayonotlarini boshqacha tarzda boshqarishi mumkin).
Pastki so'rovlarning uchta asosiy turi mavjud:
IN kalit so'zi bilan ko'rsatilgan yoki taqqoslash operatori tomonidan ANY yoki ALL kalit so'zlari bilan o'zgartirilgan ro'yxatlarda ishlang.
o'zgartirilmagan taqqoslash operatori tomonidan kiritilgan va bitta qiymatni qaytarishi kerak;
EXISTS kalit so'zi bilan boshlanadigan mavjudlik testlari.
Pastki so'rov qoidalari
Quyi soʻrovga quyidagi cheklovlar qoʻllaniladi:
Taqqoslash operatori bilan boshlanadigan quyi so'rovlarni tanlash ro'yxati faqat bitta ifoda yoki ustun nomini o'z ichiga olishi mumkin (mos ravishda SELECT * bayonotidagi yoki ro'yxatdagi EXISTS va IN iboralaridan tashqari).
Agar tashqi so'rovning WHERE bandi ustun nomini o'z ichiga olgan bo'lsa, pastki so'rovning tanlangan ro'yxatidagi ustunga qo'shilish uchun u mos bo'lishi kerak.
Matn, matn va rasm maʼlumotlar turlaridan quyi soʻrovlar roʻyxatida ishlatib boʻlmaydi.
O'zgartirilmagan taqqoslash operatori (keyin ANY yoki ALL kalit so'zi yo'q) bilan ifodalangan quyi so'rovlar GROUP BY va HAVING bandlarini o'z ichiga olmaydi.
DISTINCT kalit so‘zidan GROUP BY bandini o‘z ichiga olgan quyi so‘rovda ishlatib bo‘lmaydi.
COMPUTE va INTO bandlarini aniqlab bo‘lmaydi.
ORDER BY bandi faqat TOP bandi bilan birgalikda belgilanishi mumkin.
Quyi soʻrov bilan yaratilgan koʻrinishni yangilab boʻlmaydi.
EXISTS bandi bilan boshlanadigan quyi soʻrovning tanlangan roʻyxatida, qoidaga koʻra, alohida ustun nomi oʻrniga yulduzcha (*) mavjud. EXISTS bandi bilan boshlanadigan quyi soʻrov qoidalari standart tanlash roʻyxati bilan bir xil, chunki EXISTS bandi bilan boshlangan quyi soʻrov mavjudligini tekshiradi va maʼlumotlar oʻrniga TRUE yoki FALSE qaytaradi.
Ko'p darajali so’rovlar
Har bir quyi so'rov, o'z navbatida, bir yoki bir nechta quyi so'rovlarni o'z ichiga olishi mumkin. Istalgan miqdordagi ichki so'rovlar bayonotga joylashtirilishi mumkin.
Quyidagi so'rov savdo menejeri lavozimiga ega bo'lgan xodimlarni qidiradi.
SELECT LastName, FirstName
FROM Person.Person
WHERE BusinessEntityID IN
(SELECT BusinessEntityID
FROM HumanResources.Employee
WHERE BusinessEntityID IN
(SELECT BusinessEntityID
FROM Sales.SalesPerson)
);
select nomi from maxsulotlar Where narxlari in (select narxlari from maxsulotlar where nomi='choy');
select nomi from maxsulotlar Where narxlari=(select narxlari from maxsulotlar where nomi='choy');
Do'stlaringiz bilan baham: |