28
---------------
San Francisco
(1 row)
Енді бәрі орнында
сұраныс ішіндегі сұраныс жеке орындалады және
агрегаттық функция нәтижесі сыртқы сұраныста болып жатқан амалдардан
тәуелсіз есептеледі.
Агрегаттық фунциялар GROUP BY сөйлемімен комбинациясымен өте
пайдалы.
Мысалы,
қалалардың
арасындағы
тәуліктік
максимум
температураны алуға болады:
SELECT city, max(temp_lo)
FROM weather
GROUP BY city;
Язык SQL
12
city | max
---------------+-----
Hayward | 37
San Francisco | 46
(2 rows)
Бұл жерде әр қала үшін бір-бір қатар алынды. Әрбір агрегаттық нәтиже
әр қалаға тиесілі кесте қатарлары арқылы есептеледі. Біріктірілген қатарларды
HAVING сөйлемі арқылы жиынтықтай аламыз:
SELECT city, max(temp_lo)
FROM weather
GROUP BY city
HAVING max(temp_lo) < 40;
city | max
---------+-----
Hayward | 37
(1 row)
Дәл сол нәтижелер алынды, бірақ та temp_lo барлық мағыналары 40 кем
қалалар үшін.
Соңында, егер тек «S» басталатын қалалар қызығушылық тудырса, оны
іске асыруға болады:
SELECT city, max(temp_lo)
FROM weather
WHERE city LIKE 'S%' 1
GROUP BY city
HAVING max(temp_lo) < 40;
LIKE операторы шаблон бойынша салыстыруды орындайды.
Агрегаттық функциялар мен WHERE және HAVING SQL-сөйлемдері
қалай қандай арақатынаста болатынын түсінудің маңызы зор. WHERE және
HAVING негізгі артықшылығы: WHERE алдымен қатарларды таңдайды,
содан кейін оларды жиынтықтап және олардың агрегаттық фунцияларын
29
есептейді, осылайша агрегатты есептеу үшін қатарларды таңдайды. Ал
HAVING агрегаттық фунцияларды есептеп жинағаннан кейін ғана қатарлар
жиынтығын таңдайды. Нәтижесінде WHERE сөйлемінде агрегаттық функция
болмауы керек; агрегаттық функцияларды есептеу үшін қатарларды анықтауға
агрегаттық функцияларды қолданудың мағынасы жоқ. HAVING сөйлемінде,
керісінше, әрдайым агрегаттық фунциялар бар. (Қатаң сөйлегенде, HAVING
сөйлемін агрегат қолданбай жазса болады, бірақ оның пайдалылығы біршама.
Дәл осы шарт WHERE кезеңінде тиімдірек жұмыс істеуі мүмкін.)
Жоғарыдағы мысалда қолданған фильтр HAVING қосымша шектеуіне
қарағанда тиімдірек, өйткені онымен WHERE шартын қанағаттандырмайтын
барлық қатар үшін агрегаттарды есептеу және жиынтықтау керек емес.
3.8
Мәліметтерді өзгерту
Қолданыстағы қатарлардағы мәліметтерді UPDATE командасын
қолданып өзгертуге болады. Мысалыға, пайдаланушы 28 қарашадан кейін
барлық температура көрсеткіштері екі градусқа көтерілгенін байқады. Келесі
жолмен мәліметтерді түзеуге болады:
UPDATE weather
SET temp_hi = temp_hi - 2, temp_lo = temp_lo - 2
WHERE date > '1994-11-28';
Мәліметтердің жаңа күйі:
SELECT * FROM weather;
city | temp_lo | temp_hi | prcp | date
Язык SQL
13
---------------+---------+---------+------+------------
San Francisco | 46 | 50 | 0.25 | 1994-11-27
San Francisco | 41 | 55 | 0 | 1994-11-29
Hayward | 35 | 52 | | 1994-11-29
(3 rows)
3.9
Мәліметтерді жою
Қатарларды кестеден DELETE командасы көмегімен жоюға болады.
Мысалы, Хейуор қаласының бұдан былай ауа-райы қызығушылық
тудырмайды. Оыс жағдайда керек емес қатарды кестеден жоюға болады:
DELETE FROM weather WHERE city = 'Hayward';
Хейуор қаласына қатысты барлық жазбалар жойылған:
SELECT * FROM weather;
city | temp_lo | temp_hi | prcp | date
---------------+---------+---------+------+------------
San Francisco | 46 | 50 | 0.25 | 1994-11-27
San Francisco | 41 | 55 | 0 | 1994-11-29
30
(2 rows)
DELETE FROM кесте_аты;
түрдегі операторлардан сақтану керек. Шарт көрсетілмесе DELETE кестедегі
барлық қатарларды жояды, оны толық тазалайды. Сонымен қатар жүйе
операцияны растауды сұрамайды.
31
4 Кеңейтілген мүмкіншіліктер
4.1 Көріністер
Пайдаланушыға
қалалардың
координаталары
мен
ауа
райы
жазбаларының тізімі керек делік, алайда ол әр кезде сұранысты жаза бергісі
келмейді. Осы сұраныс бойынша көрініс жасауға болады, дәлірек айтқанда,
сұранысқа ат беру. Содан кейін оған қарапайым кестеге сияқты байланысу:
CREATE VIEW myview AS
SELECT city, temp_lo, temp_hi, prcp, date, location
FROM weather, cities
WHERE city = name;
SELECT * FROM myview;
Көрінсітердің белсенді қолдануы
SQL деректер қорын жақсы
жобалаудың негізгі аспектісі. Көріністер кестелердің ішкі құрылымын
жасыруға мүмкіндік беред; құрылымдар қосымшалар даму және сенімді
интерфейстермен өзгеруі мүмкін.
Көріністер кестелер қолданған барлық жерде дерлік қолдануға болады.
Көріністер жиі басқа жеке көріністер қорында жасалынады.
4.2 Ішкі кілттер
Мысалдағы weather және cities кестелері қайта қарастырылады. Келесі
тапсырманы қарастыру керек: cities кестесіндегі қатарлармен сәйкеспейтін
weather кестесіне ешкім қатар қоса алмайтындай етіп жасау керек. Бұл
мәліметтердің сілтемелік тұтастығын қамту деп аталады. Қарапайым ДҚБЖ
мына жолмен іске асыруы керек еді (мүмкін болған жағдайда ғана) :
бастапқыда cities кестесінде сәйкес жазбалар бар
жоғын тексеру керек, содан
кейін жаңа жазбаны weather кестесіне қосады немесе қабылдайды. Бұл өте
проблемалық тәсіл және ыңғайлы емес, сол себептен PostgreSQL осының бәрін
пайдаланушы орнына жасай алады.
Кестенің жаңа хабарлануы келесі түрде болады:
CREATE TABLE cities (
city varchar(80) primary key,
location point
);
CREATE TABLE weather (
city varchar(80) references cities(city),
temp_lo int,
temp_hi int,
prcp real,
date date
);