25
Hayward | 37 | 54 | | 1994-11-29
(3 rows)
Таңдамада қатарларға сілтемеден басқа айнымалыларды жазуға болады.
Мысалы:
SELECT city, (temp_hi+temp_lo)/2 AS temp_avg, date
FROM weather;
Нәтижесі:
city | temp_avg | date
---------------+----------+------------
San Francisco | 48 | 1994-11-27
San Francisco | 50 | 1994-11-29
Hayward | 45 | 1994-11-29
(3 rows)
AS сөйлемінің шығыс қатарының атын өзгертуге болатынына назар
аудару керек. (AS сөзін жазу мақсат емес.)
Қайтаратын қатар санын шектейтін WHERE сөйлемін қосу арқылы
сұранысты «шартпен» толықтыруға болады. WHERE сөйлемінде қатар
фильтрі ретінде жұмыс атқаратын логикалық өрнек (шындыққа тексеріс)
көрсетіледі: нәтижесіде өрнегі шындық болған қатарлар ғана қалады. Бұл
өрнекте әдеттегі логикалық операторлар (AND, OR және NOT) болуы мүмкін.
Мысалы, келесі сұраныс Сан-Фрасциско қаласында жауын күндері қандай ауа-
райы болғанын көрсетеді:
SELECT * FROM weather
WHERE city = 'San Francisco' AND prcp > 0.0;
Нәтижесі:
city | temp_lo | temp_hi | prcp | date
---------------+---------+---------+------+------------
San Francisco | 46 | 50 | 0.25 | 1994-11-27
(1 row)
SELECT * жиі дайындалусыз, тосын жазады, алайда өндірістік кодта
жаман стиль ретінде қабылданады, өйткені осындай сұраныстар нәтижесі
жаңа қатар қосқанда ауысатын болады.
Сұранысты белгілі ретпен алуға болады:
SELECT * FROM weather
ORDER BY city;
Нәтижесінде көрсетіледі:
city | temp_lo | temp_hi | prcp | date
---------------+---------+---------+------+------------
Hayward | 37 | 54 | | 1994-11-29
San Francisco | 43 | 57 | 0 | 1994-11-29
San Francisco | 46 | 50 | 0.25 | 1994-11-27
Бұл мысалда сорттау реті толық анықталмаған, сондықтан пайдаланушы
Сан-Франциско қатарын кез келген ретпен алуы мүмкін. Бірақ жоғарыдағы
нәтижені нақты алу үшін келесі команданы теру керек:
26
SELECT * FROM weather
ORDER BY city, temp_lo;
Қажет болса көшірме қатарларды сұраныстан алып тастауға болады:
SELECT DISTINCT city
FROM weather;
Алынған нәтиже:
city
---------------
Hayward
San Francisco
(2 rows)
Осы жерде де қатарлар реті өзгертіле алады. Өзгеріссіз нәтижелер алу
үшін DISTINCT және ORDER BY сөйлемдерін қосу керек:
SELECT DISTINCT city
FROM weather
ORDER BY city;
3.6
Кестелерді қосу
Осыған дейін барлық тапсырыстар тек бір кестеге қатынасты. Алайда
сұраныстар бір уақытта бірнеше кестелерге қатынай алады немесе сол кестеге
әртүрлі қатарлар жиынтығын өңдейтіндей етіп қатынауға болады. Бір кестенің
әртүрлі қатар жиынына немесе бірнеше кестелерге бір уақытта қатынайтын
сұраныс қосылым (JOIN) деп аталады. Мысалы, пайдаланушы барлық
қалалардың ауа-рай жағдайы мен координаталарын шығарғысы келді. Ол үшін
weather кестесінің әр қатарындағы city бағанын cities кестесінің барлық
қатарындағы салыстыру name бағанымен салыстыру керек және осы
мағыналар сәйкескен қатарларды таңдау керек.
Айта кететін жайт, бұл нақты модель емес. Әдетте қосылымдар
тиімдірек орындалады (мүмкін жұп қатарлардың бәрі салыстырылмайды),
бірақ бұның бәрі пайдаланушыдан жасарын түрде өтеді. Оны келесі сұраныс
арқылы жүзеге асырса болады:
SELECT *
FROM weather, cities
WHERE city = name;
Алынған нәтиже:
city |temp_lo|temp_hi| prcp| date | name | location
--------------+-------+-------+-----+-----------+--------------+----------
San Francisco| 46| 50| 0.25| 1994-11-27| San Francisco| (-194,53)
San Francisco| 43| 57| 0| 1994-11-29| San Francisco| (-194,53)
(2 rows)
Мәліметтерді алудың екі ерекшелігіне назау аудару керек. PostgreSQL
ескі нұсқаларын қосқанда кейбір ДҚБЖ-де DISTINCT қосымшасын іске асыру
27
қатарларды автоматты түрде реттейді, сондықтан ORDER BY қосу маңызды
емес. Бірақ SQL стандарты оны талап етпейді және PostgreSQL ағымдағы
нұсқасы DISTINCT кейін қатарлардың анық ретіне кепілдік бермейді.
Нәтижесінде Хейуорд (Hayward) қаласымен қатар жоқ. Оның себебі
cities кестесінде бұл қалаға мәліметтер қатары жоқ, ал қосылым кезінде
weather кестесінің сәйкесін таппаған барлық қатарлары түсіріледі.
Қала атауы екі бағанда болып қалды. Бұл дұрыс және түсіндірілуі:
weather және cities кестелерінің қатарлары қосылғанын көрсетеді. Алайда
практикада жағымсыз, сондықтан * қолданғаннан, ең жақсысы керек
қатарларды айқын тізіп жазған дұрыс:
SELECT city, temp_lo, temp_hi, prcp, date, location
FROM weather, cities
WHERE city = name;
Негізі жағымды стиль ретінде қосылым сұранысында бағандардың
толық атын жазған саналады, өйткені кейінірек кестеге қайталанатын қатарлар
қосылуы мүмкін жағдайда сұраныс сынбас үшін жазады.
3.7
Агрегаттық функциялар
Көптеген реляционды деректер қоры серверлері сияқты PostgreSQL
агрегаттық фунцияларды қолдайды. Агрегаттық функциялар көптеген
қатарларды өңдей отырып, тек бір мағынаны есептейді. Мысалы, есептейтін
агрегаттық функциялар бар: count (мөлшері), sum (суммасы), avg
(арифметикалық орта), max (максимум) және min (минимум) қатар жиынығы
үшін. Мысалыға, барлық көріністер ішінде ең жоғарғы температураны табуға
болады:
SELECT max(temp_lo) FROM weather;
max
-----
46
(1 row)
Егер кай қалада (немесе қалаларда) осы температура бақыланғанын білу
керек болса, оны шығаруға болады:
SELECT city FROM weather
WHERE temp_lo = max(temp_lo); НЕВЕРНО
Алайда бұл амал іске аспайды, өйткені max агрегаттық функциясын
WHERE сөйлемінде қолдануға болмайды. (Бұл шектеу WHERE сөйлемі қай
қатар үшін агрегаттық фунцияны есептеу керектігін анықтайды, сол себептен
ол, демек, агрегаттық фунцияға дейін есептелуі керек.) Бірақ, әдеттегідей,
сұранысты қайта іске қосуға керек және керекті нәтиже алу үшін сұраныс
ішіндегі сұранысты қолдану керек:
SELECT city FROM weather
WHERE temp_lo = (SELECT max(temp_lo) FROM weather);
city