AND операторы екі қисын мәнді салыстырып, TRUE (ақиқат) мәнін қайтарады, егер екі мәнде ақиқат болса (яғни, TRUE), басқа жағдайда - FALSE (жалған).
OR операторы TRUE қайтарады, егер аргументтердің бірі ғана TRUE мәніне тең болса.
NOT операторы TRUE қайтарады, егер оның аргументі FALSE тең болса не керісінше.
Қисын операторларды қолдану SELECT командасының мүмкіндіктерін жоғарлатады. Мысалы, рейтингі 200 тең Қарағандының тапсырушыларын қарастыру керек. Команда келесі түрде болады:
SELECT *
FROM Customers
WHERE city = 'Караганда' AND
rating > 200
Біздің дерекқорында бұл шартты қанағаттандыратын тек бір ғана тапсырушы бар:
CNUM CNAME CITY RATING SNUM
----- --------------------------------- ---------- ------- -----
2008 ОАО "Валют-транзит" Караганда 300 1007
Егер OR қолданылса, онда Қарағандыда орналасқан және рейтингтері 200-ден жоғары барлық тапсырушыларды аламыз:
SELECT *
FROM Customers
WHERE city = 'Караганда' OR
rating > 200
Результат запроса:
CNUM CNAME CITY RATING SNUM
----- --------------------------------- ---------- ------- -----
2004 Концерн "Дети лейтенанта Шмидта" Бобруйск 300 1002
2008 ОАО "Валют-транзит" Караганда 300 1007
NOT мәндерді инвертрлеу үшін қолданылады. Сұраныс:
SELECT *
FROM Customers
WHERE city = "Караганда" OR
NOT rating > 200
Нәтиже:
CNUM CNAME CITY RATING SNUM
----- -------------------- --------- ------- ------
2001 ТОО Рога и копыта Москва 100 1001
2002 AО Бендер и К Одесса 200 1003
2003 Фирма ХХХ Рязань 200 1002
2006 Clemens Лондон 100 1001
2007 ОАО "ООО" ТОМСК 100 1004
2008 ОАО "Валют-транзит" Караганда 300 1007
Өрнектерді топтау үшін Transact-SQL – дөңгелек жақшаларын ( ) пайдаланады. Мысалы:
SELECT *
FROM Customers
WHERE NOT (city = 'Караганда' OR
rating > 200)
Бұл сұраныс Қарағандыда орналаспаған және рейтингі 200 кем тапсырушыларды таңдайды. Нәтижесі:
CNUM CNAME CITY RATING SNUM
----- ------------------ ------- ------- -----
2001 ТОО Рога и копыта Москва 100 1001
2002 AО Бендер и К Одесса 200 1003
2003 Фирма ХХХ Рязань 200 1002
2006 Clemens Лондон 100 1001
2007 ОАО "ООО" ТОМСК 100 1004
Арнайым операторлар: IN, BETWEEN, LIKE, IS NULL.
IN операторы өріс мәні кіретін мәндер тізімін анықтайды. Мысалы, сізге Мәскеудегі не Хабаровскедегі орналасқан барлық сатушыларды табу керек болсын. Ол үшін келесі сұраныс қолданылады:
SELECT *
FROM Salespeople
WHERE city = 'Москва' OR
city = 'Хабаровск'
Бұданда қарапайым тәсілі бар:
SELECT *
FROM Salespeople
WHERE city IN ( 'Москва', 'Хабаровск' )
Бұл сұраныстың нәтижесі:
SNUM SNAME CITY COMM
----- ------- ---------- -----
1001 Иванов Москва 12.0
1002 Петров Хабаровск 13.0
IN операторы үшін мәндер жинағы дөңгелек жақшаларына алынады. Ал мәндер үтір арқылы бөлінеді.
BETWEEN операторы IN операторына ұқсас. Мүмкін болатын мәндер тізімінен айырмашылығы BETWEEN мәндер диапазонын анықтайды. Сұраныста BETWEEN белгілейсіз, содан кейін бастапқы мәнін, AND кілттік сөзін, содан кейін ғана соңғы мәнін. Бірінші мән екінші мәннен кіші болу керек. Келесі сұраныс 10 мен 12 арасындағы комиссиясымен агенттерді шығарады:
SELECT *
FROM Salespeople
WHERE comm BETWEEN 10 AND 12
SNUM SNAME CITY COMM
----- -------- ---------- -----
1001 Иванов Москва 12.0
1003 Егоров Караганда 10.0
1004 Сидоров Сочи 11.0
LIKE операторы ішкі жолдары бар символдық өрістерге ғана қолданылады. Яғни, символ өрісін іздейді оның шартын қанағаттандыру үшін. Шарт ретінде арнайы символдарды қолданады:
Астын сызу _ символы – кез келген бірлік символды алмастырады. Мысалы,'к_т' сәйкес болады келесі сөздерге 'кот' и 'кит', бірақ 'крот' сөзіне емес.
% процент белгісі – символдардың кез келген сан тізбегін алмастырады. Мысалы, '%м%р' сөзі 'компьютер' және 'омар' сөздеріне сәйкес келеді.
Тапсырушылардың аттары 'О' әріпімен басталатындарды таңдайық:
SELECT *
FROM Customers
WHERE cname LIKE 'О%'
CNUM CNAME CITY RATING SNUM
----- -------------------- ---------- ------- -----
2008 ОАО "Валют-транзит" Караганда 300 1007
2007 ОАО "ООО" ТОМСК 100 1004
NULL мәнін болмауын көрсететіндігінен нәтиже NULL-дің кез келген салыстырмасы болады. Әдетте, кез келген бағанда NULL мәні бар жолдарды қарастырылады. Ол үшін IS NULL арнайы оператор қолданылады. Біздің ДҚ city бағанда NULL мәні бар тапсырушыларды таңдайық:
SELECT *
FROM Customers
WHERE city IS NULL
SQL Server бірнеше агрегаттық функцияларды көрсетеді:
COUNT – сұраныс шартын қанағаттандыратын жолдарды есептеу үшін қолданылады
SUM – бағанның барлық мәндердің арифметикалық қосындысын есептейді
AVG - барлық мәндердің орта арифметикалық қосындысын есептейді
MAX – барлық таңдалған мәндердің ішінде ең үлкенді табады
MIN - барлық таңдалған мәндердің ішінде ең кішіні табады
SUM және AVG функциялары сандық өрістерге ғана қолданылады. COUNT, MAX, MIN бірге сандық не символдық өрістер қолданыалады. Символдық өрістерді қолданғанда MAX, MIN алфавит ретінде мәндерді салыстырады. Агрегаттық функциялар жұмыс кезінде NULL мәні қарастырылмайды.
Orders кестесінде барлық тапсырыстардың қосындысын табу үшін келесі сұраныс қолданылады:
SELECT SUM( amt )
FROM Orders
Нәтиже:
---------------------
26658.4000
COUNT функциясы басқалардан ерекшеленеді. Ол кестедегі бағанда не жолда мәндер санын есептейді. Мысалы, Orders кестесінде жазылған сауда агенттердің нөмір санын есептеу керек болсын:
SELECT COUNT( DISTINCT snum )
FROM Orders
Нәтиже:
-----------
5
DISTINCT - Orders кестесіндегі snum бағанында ерекше мәндердің саны есептелетінін белгілейді. Оны жазбасақ, нәтиже мүлдем басқа болады:
-----------
10
Кестеде жолдардың жалпы санын есептеу үшін COUNT функциясын жұлдызшамен бірге қолдану керек:
SELECT COUNT(*)
FROM Customers
Нәтиже:
-----------
7
GROUP BY сөйлемі агрегат функциясы қолданатын мәндер жиынын беруге мүмкіндік береді. Бұл бізге SELECT сөйлемінде өріс пен агрегат функцияларын біріктіру мүмкіндігін береді. Мысалы, сізге әр сауда агентімен алынған тапсырыстың ең үлкен қосындысын табу керек болсын:
SELECT snum, MAX( amt )
FROM Orders
GROUP BY snum
Бұл сұраныстың нәтижесі:
snum
----- ----------
1001 9891.8800
1002 5160.4500
1003 1713.2300
1004 1900.1000
1007 1098.1600
GROUP BY жазба топтарына тәуелсіз агрегат функцияларын қолданады. Топты қалыптастыру шарты - өрістердің бірдей мәні (біздің жағдайда snum). Бұл сұранысты өңдегенде MAX функциясы snum әр мәні үшін есептейді.
GROUP BY бірнеше өрістермен қолдануға болады. Алдындағы сұранысты күрделі түрге келтірейік:
SELECT snum, odate, MAX( amt )
FROM Orders
GROUP BY snum, odate
Яғни, біз агент кодтарын және әр күн үшін олардың тапсырыстарының максималды қосындысын таңдаймыз:
snum odate
----- ------------------------ ----------
1001 1999-10-03 00:00:00.000 767.1900
1001 1999-10-05 00:00:00.000 4723.0000
1001 1999-10-06 00:00:00.000 9891.8800
1002 1999-10-03 00:00:00.000 5160.4500
1002 1999-10-04 00:00:00.000 75.7500
1002 1999-10-06 00:00:00.000 1309.9500
1003 1999-10-04 00:00:00.000 1713.2300
1004 1999-10-03 00:00:00.000 1900.1000
1007 1999-10-03 00:00:00.000 1098.1600
Есепті күрделі түрге келтірейік. Енді әр агент тапсырыстарының максималды қосындысы 3000 үлкен деген мәлімет қажет. Ол үшін HAVING сөйлемі керек. Бұл сөйлем WHERE сөйлемі сияқты, топтарды өшіру критерийлерді анықтайды:
SELECT snum, odate, MAX( amt )
FROM ORDERS
GROUP BY snum, odate
HAVING MAX( amt ) > 3000
snum odate
----- ------------------------ ----------
1002 1999-10-03 00:00:00.000 5160.4500
1001 1999-10-05 00:00:00.000 4723.0000
1001 1999-10-06 00:00:00.000 9891.8800
Әлі күнге дейін барлық сұраныстар бір кестеге ғана қатына алған. Бірақ, SQL бір сұраныста бірнеше кестелерге қатына алады.
Кестедегі баған атауы кесте атынан тұрады. Аттардың мысалдары:
Salespeople.snum
Salespeople.city
Orders.odate
Мысалы, бізге қалалар бойынша сауда агенттер мен тапсырушылардың комбинациясын көру керек болсын:
SELECT Customers.cname, Salespeople.sname, Salespeople.city
FROM Salespeople, Customers
WHERE Salespeople.city = Customers.city
Сұраныс нәтижесі:
cname sname city
-------------------- ------- ----------
ТОО Рога и копыта Иванов Москва
ОАО "Валют-транзит" Егоров Караганда
Яғни, city өрісі «Торговые агенты» және «Заказчики» кестелерінде болу керек. Сондықтан, кесте аттары префикстер ретінде қолданылуы керек.
SQL Server екі кестенің жолдар комбинациясын WHERE сөйлемінде берілген шартына тексереді. Егер бұл комбинация оны қанағаттандырса, онда ол шығады.
Кестелерді біріктіру үшін теңдіктен басқа шарттарды да қолдануға болады. Мысалы, бізге агентпен бір қалада тұрмайтын тапсырушылардың барлық тапсырыстары қажет болсын. Ол үшін үш кесте байланысуы керек:
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
Нәтиже:
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
Сұраныстар басқа сұраныстарды басқара алады. Бұл басқа сұраныстың шарт ішінде сұранысты орнатуды білдіреді.
Негізінен, ішкі сұраныс мәнде генерлейді, оның шартына байланысты. Мысалы, біз сауда агенттің атын білеміз – Абенов, бірақ оның кодын білмейміз (snum), бізге керек «Заказы» (Orders) кестесінен оның барлық тапсырыстары.
SELECT *
FROM Orders
WHERE snum = (
SELECT snum
FROM Salespeople
WHERE sname = 'Абенов'
)
Сыртқы сұранысты орындау үшін (негізгі сұраныс), алдымен WHERE сөйлеміндегі ішкі сұраныс орындалады. Ішкі сұраныс орындалғанда Salespeople кестесі қарастырылады. Бұл кестеде sname өрісі «Мауленов» мәнін алып, содан кейін snum өрісі алынады. Бірақ жол болады snum = 1004. Ары қарай, алынған мән негізгі сұраныстың шартына орналасып, шарт түрі келесі түрде болады:
WHERE snum = 1004
Негізгі сұраныс келесі нәтижелермен орындалады:
ONUM ODATE AMT CNUM SNUM
----- ------------------------ ---------- ------ -----
3002 1999-10-03 00:00:00.000 1900.1000 2007 1004
Салыстыру амалдары (үлкен, кіші, тең, тең емес және т.б.) негізінде құрастырылған шарттарды қолданғанда бізге білу керек, ішкі сұраныс тек бір мәнді қайтаратынын.
Егер сізге бірнеше жолдарды қайтару керек болса, онда IN операторын қолдану керек. Мысалы, бізге табу керек Алматыдағы барлық агенттердің тапсырыстары:
SELECT *
FROM Orders
WHERE snum IN (
SELECT snum
FROM Salespeople
WHERE city = 'Алматы'
)
нәтижесі:
ONUM ODATE AMT CNUM SNUM
----- ------------------------ ---------- ----- -----
3003 1999-10-03 00:00:00.000 767.1900 2001 1001
3008 1999-10-05 00:00:00.000 4723.0000 2006 1001
3011 1999-10-06 00:00:00.000 9891.8800 2006 1001
Берілген жағдайда ішкі сұраныстың пайдалануы – біріктіруді қолдануға байланысты:
SELECT Orders.*
FROM Orders, Salespeople
WHERE Orders.snum = Salespeople.snum AND
Salespeople.city = 'Алматы'
Мына сұраныс алдындағы сұранысқа эквиваленті болғанымен, SQL Server екі кестеден құрылған жолдар жинағын қарастыру керек.
Алдындағы барлық ішкі сұраныстарды біріктіреді бір ғана жағдай, олардың бәрі де бір бағанды таңдайды. SELECT * типтес командалар ішкі сұраныстарда мүмкін емес.
Ішкі сұраныстарды HAVING сөйлемдерінде қолдануға болады. Бұл ішкі сұраныстар өздерінің сөйлемдерін қолдана алады: GROUP BY не HAVING. Келесі сұраныс бұған мысал болады:
SELECT rating, COUNT( DISTINCT cnum )
FROM Customers
GROUP BY rating
HAVING rating > (
SELECT AVG( rating )
FROM Customers
WHERE city = 'Алматы'
)
бұл команда Алматыдағы рейтингі орта мәннен жоғары тапсырушыларды есептейді.
Нәтижесі:
rating
------- --
200 2
300 2