37
4200 | 11600
4500 | 16100
4800 | 25700
4800 | 25700
5000 | 30700
5200 | 41100
5200 | 41100
6000 | 47100
(10 rows)
Осында алғашқыдан (ең төменгі) ағымдағыдан сомада жалақы
жиналады; ол қайталанатын ағымдағы мәндерді қосқандағы нәтиже (бірдей
жалақылы қатарға назар).
Терезелік функцияларды сұраныста тек SELECT тізбегі мен ORDER BY
сөйлемінде қолдануға рұқсат. GROUP BY, HAVING және WHERE
сөйлемдерін қосқанға, қалған барлық сөйлемдерде тыйым салынған. Бұл
логикалық олар агрегаттық функциялардан кейін орындалады, демек
агрегаттық функцияны терезеліктен шақыруға, бірақ керісінше емес,
болатынымен түсіндіріледі. Терезе жақтауларын басқа тәсілдермен де
анықтауға болады.
Егер қатарларды терезелік функцияларды есептегеннен кейін
фильтрациялау немесе топтау керек болса, онда салынған сұранысты
қолдануға болады. Мысалы:
SELECT depname, empno, salary, enroll_date
FROM
(SELECT depname, empno, salary, enroll_date,
rank() OVER (PARTITION BY depname ORDER BY salary DESC, empno) AS
pos
FROM empsalary
) AS ss
WHERE pos < 3;
Көрсетілген сұраныс тек ішкі сұраныстағы rank (реттік нөмір) үштен
кіші қатарларды көрсетеді. Сұраныста бірдей анықталған терезелер үшін
бірнеше терезелік функциялар есептелініп жатыр, әрине, әрқайсысы үшін жеке
OVER сөйлемін жазуға болады, бірақ сонымен қатар ол көшіріліп отырады,
демек осы амал сөзсіз қателіктерге итермелейді. Сондықтан терезенің
анықтамасын WINDOW сөйлемінде айырып қойған дұрыс, одан кейін OVER
сөйлемінде оған сілтемелеу керек. Мысалы:
SELECT sum(salary) OVER w, avg(salary) OVER w
FROM empsalary
WINDOW w AS (PARTITION BY depname ORDER BY salary DESC);
4.5 Мұрагерлік
38
Мұрагерлік
бұл объектілі
бағытталғын деректер қорынан алынған
түсінік. Ол деректер қорын жобалауда көптеген қызықты мүмкіншіліктерді
ашады. Мысалыға екі кесте құрылады: : cities (қалалар) және capitals (штат
астаналары). Әрине, штат астаналары қала болып табылады, сондықтан
барлық қалаларды көру керек болса, онда оларды анық түрде нәтижеге қосу
керек. Егер тапқырлық танытылса келесі шешімді ұсынуға болады:
CREATE TABLE capitals (
name text,
population real,
altitude int, -- (высота в футах)
state char(2)
);
CREATE TABLE non_capitals (
name text,
population real,
altitude int -- (высота в футах)
);
CREATE VIEW cities AS
SELECT name, population, altitude FROM capitals
UNION
SELECT name, population, altitude FROM non_capitals;
Ол мәліметтерді алғанша қанағаттандыруы мүмкін, алайда бірнеше
қатарларды өзгерту керек болса, онда ол әдемі көрінбейді.
Сондықтан жақсырақ шешім бар:
CREATE TABLE cities (
name text,
population real,
altitude int -- (фут өлшеміндегі биіктік)
);
CREATE TABLE capitals (
state char(2)
) INHERITS (cities);
Көрсетілген жағдайда capitals кесте қатары cities ата-ана кестесінен
барлық бағандарды (name, population және altitude) мұрагер етеді. name бағаны
text типті; ол айнымалы ұзындықты мәтіндік қатарға арналған PostgreSQL
жеке типі. Ал астаналар кестесіне штат көрсетілетін қосымша state бағаны
қосылған. PostgreSQL
де кесте басынан бастап немесе бірнеше басқа
кестелерден мұрагерлік ете алады.
Мысалы, келесі сұраныс теңіз деңгейнінен жоғары 500 фут биіктікте
орналасқан астаналарды қосып барлық қалаларды шығарады:
SELECT name, altitude
FROM cities
WHERE altitude > 500;
Оның орындалу нәтижесі:
39
name | altitude
-----------+----------
Las Vegas | 2174
Mariposa | 1953
Madison | 845
(3 rows)
Ал келесі сұраныс 500 футтан жоғары орналасқан штат астанасы болып
табылмайтын қалаларды табады:
SELECT name, altitude
FROM ONLY cities
WHERE altitude > 500;
name | altitude
-----------+----------
Las Vegas | 2174
Mariposa | 1953
(2 rows)
Бұл жерде cities кестесінің атының алдындағы ONLY сөзі сұранысты,
cities кестесінен мұрагер еткен кестелерді қоспай, тек cities кестесінің
қатарлары үшін орындалатынана көрсетіп отыр. Айтылған көптеген
операторлар
SELECT, UPDATE және DELETE
ONLY нұсқауларын
қолдайды.
Мұрагерлік жиі пайдалы болғанымен, ол шектелген бірегейлер мен ішкі
кілттермен кіріктірілмеген, сол себептен оның қолдануын шектейді.
40
5 SQL синтаксисі
5.1 Лексикалық құрылым
SQL
бағдарлама командалар жүйелігінен тұрады. Команда, өз алдында,
нүкте үтірмен аяқталатын («;») компоненттер жүйелігін білдіреді. Кіріс
ағынның соңы сондай
ақ команда соңы ретінде саналады. Дәл қандай
компоненттер арнайы команда үшін мүмкін болатын оның синтаксисіне
байланысты. Команда компоненті ретінде кілттік сөз, идентификатор,
бағымдағы идентификатор, қатар (немесе константа) немесе арнайы таңба
болуы мүмкін. Әдетте компоненттер бос орын (табуляция, бос орын, қатарды
ауыстыру) таңбаларымен бөлінеді, бірақ белгісіздік (мысалы, арнайы таңба
басқа типті компонент жанында болған жағдайда) болмаса, оның қажеті жоқ.
Мысалы, келесі мәтін дұрыс SQL
бағдарлама болып табылады
(синтаксис жағынан):
SELECT * FROM MY_TABLE;
UPDATE MY_TABLE SET A = 5;
INSERT INTO MY_TABLE VALUES (3, 'hi there');
Бұл бір
бір қатарда тұратын (алайда оларды бір қатарға қосуға болады
немесе, керісінше, команданы бірнеше қатарда) үш командадан тұратын
жүйелік. Бұдан басқа, SQL
бағдарлама түсіндірмелер болуы мүмкін. Олар
командалар компоненттері емес, ал негізінде бос орын таңбаларына тепе
тең.
SQL синтаксисі қандай компоненттер командаларды сәйкестендіретінін, ал
қандай
олардың операндтары мен параметрдерін қатты қатал анықтамайды.
Алғашқы бірнеше компоненттерде әдетте команда аты тұрады, сол себепті
келесі мысалда «SELECT», «UPDATE» және «INSERT» командалары
айтылады. Бірақ та, мысалыға, UPDATE командасы әрдайым белгілі бір
орында SET компоненті тұруын талап етеді, ал INSERT келтірілген түрде
VALUES компонентінің болуын талап етеді.
5.1.1 Идентификаторлар мен кілттік сөздер
Жоғарыда көрсетілген командаларда SELECT, UPDATE және VALUES
компоненттері болды;олар кілттік сөздер мысалы болып табылады, яғни SQL
тілінде бекітілген мағынасы бар сөздер.
MY_TABLE және А компоненттері идентификатор мысалы болып
табылады. Олар қайда қолданылатына байланысты кесте, баған және деректер
қорының басқа объектілерінің аттарына идентификация жасайды. Сондықтан
оларды
кейде
жәй
«аттар»
деп
атайды.
Кілттік
сөздер
мен
идентификаторлардың лексикалық құрылымдары бірдей, яғни тілді білмей
кейбір компоненттерді кілттік сөз немесе идектификатор ретінде анықтау
мүмкін емес.
Достарыңызбен бөлісу: |