Румяна Цанкова Владимир Л. Станчев Работа с бази от данни в примери на access 2003 2007


Глава 18. Синтаксис на оператори от езика SQL



страница18/20
Дата13.11.2018
Размер3.1 Mb.
#104752
ТипГлава
1   ...   12   13   14   15   16   17   18   19   20

Глава 18. Синтаксис на оператори от езика SQL


Езикът SQL (Structured Query Language), произнасящо се и “sequel”, е непроцедурен, ориентиран основно за работа с релационен модел на базата от данни. За разлика от “записно-ориентираните” езици той е “множествено-ориентиран” и работи направо с множество от записи. Той е намерил широко разпространение и на практика е единственият стандарт в тази област. Стандартизиран е като SQL-92, но има многобройни версии и конкретни диалекти. В ход е приемането на нов стандарт с елементи на обектния подход - SQL-93. Както изяснява Фабиан Паскал SQL е проектиран като подезик за работа с данни, за да бъде използуван във връзка със съществуващите програмни езици (С, Кобол, Фортран) с цел създаване на приложения за работа с бази от данни. Почти всички системи за управление на бази от данни (СУБД) го използуват като един от работните си езици. Той служи и като интерфейс към непрограмируемите потребителски инструменти за работа с базата от данни. В СУБД MS Access те са:

Query be Examрle (QBE) - команден визуален език, с който се попълват проектантските правила за извеждане на заявки по зададен табличен образец;

Query by Prompt (QBP) - команден визуален език, с който се дефинират таблиците на базата от данни и връзките им;

Query by Form (QBF) - команден визуален език за специфициране на екранни форми.

В тези инструменти могат да се попълват директно и SQL оператори, като за целта трябва да се познава синтаксисът им. SQL има два компонента:

Data Definition Language (DDL) - език за дефиниране на данните от таблиците на базата от данни и връзките между тях;

Data Manipilation Language (DML) - език за обработка на данните: за извеждания, както за добавяне, изменение и отстраняване на данни.

Най-напред ще бъдат разгледани операторите на езика за манипулиране с данните - DML. Ще се покаже как с тях се осъществяват релационните операции: проекция, селекция, съединение, обединение; потребителските операции за изменения: корекции, добавяне, отстраняване; операциите за агрегиране. След това ще се покаже как става създаването на нови таблици с езика за дефиниране на данни - DDL. Последното се прави за пълнота на изложението, тъй като, то става много по-лесно с графичния потребителски интерфейс (GUI) на Access.


18.1. Оператори за манипулиране на данните


Основният широко използуван за извеждания оператор е SELECT със своите клаузи. Той се използува основно за селектиране на записи от заявена таблица. Освен това се прлага и за проектиране и съединяване на таблици. Неговата пълна форма е:

SELECT <списък от имена на колони>

FROM <списък от имена на таблици, от които са колоните>

WHERE <логически израз за избор на редове>

ORDER BY <списък от свойства, по които се сортира>

GROUP BY <списък от свойства, по които се агрегира>

НAVING <логически израз за избор от групите>;

Клаузата FROM e задължителнa. Останалите клаузи не са задължителни и могат да се използуват в различен ред. Клаузата HAVING може да се използува само след клаузата GROUP BY.

Операторът SELECT може да сдържа и следните предикати:

ALL – по подразбиране обработва всички записи;

DISTINKTROW - изключва повтарящи се записи;

DISTINCT <списък от имена на колони> - изключва записи с повтарящи се стойности на свойства от списъка;

TOPn – обработва първите n на брой записи;

BOTTOMn – обработва последните n на брой записи.

Заявката с оператор за селекция се задава от основния изглед на текущата база от данни чрез последователността от опции:QueriesÞNewÞDesignViewÞOKÞCloseÞViewÞSQL View.

Разглежданите по-нататък примери ще работят с базата от данни за доставки и пласмент на битова техника в малко предприятие.


Използуване на оператор SELECT за релационната операция проекция-Рrojеction

Нека искаме да направим заявка за извеждане от таблица Prodazbi на номерата на клиентите, които са правили поръчки. Чрез оператор SELECT с клауза FROM - фиг. 18.1 ще получим номерата на клиентите, правили поръчки.



Фиг. 18.1. Заявка за номерата на клиентите, правили поръчки.


Резултатът от заявката съдържа само полето за номер на клиент, независимо колко пъти се повтаря, и е показан на фиг. 18.2.
Фиг. 18.2. Номера на клиентите, правили поръчки.

Както се вижда тук има повторения на един и същ номер на клиент, което не се допуска в релационната операция проекция. За изчистване на повторенията в заявката трябва да се използува предикатът DISTINCT на оператора SELEСT, както е показано на фиг. 18.3.
Фиг. 18.3. Заявка за проектиране на номерата на клиентите, правили поръчки.

Списъкът на клиентите, правили поръчки (т.е. резултатът от релационната операция проекция) е даден на фиг. 18.4. За разлика от DISTINCT предикатът DISTINCTROW изчиства повторенията на цели еднакви редове, а не само повторенията на еднакви стойности в зададените полета.



Фиг. 18.4. Списък на клиентите, правили поръчки.

Както се вижда вече няма повторения. Този списък обаче не е достатъчно пълен. Необходимо е да се добавят и имената на клиентите, което можем да направим и с една заявка чрез графичния потребителски интерфейс – фиг 18.5.


Фиг. 18.5. Заявка за внасяне имената на клиентите в списъка.



Резултатът от заявката, направена с графичния потребителски интерфейс, е показан на фиг.18.6.
Фиг. 18.6. Списък с имената на клиентите, правили поръчки.
Използуване на оператор SELECT за задаване на условия

Условията в SQL се формират като логически изрази със следните, подредени по приоритет оператори: =, >, <, <> (неравно), >=, <=, IN (в), LIKE (като), BETWEEN…AND… (между…и…), IS NULL (е нула), AND (и), OR (или), NOT (не).




Със заявката, показана на фиг. 18.7. се селектират записите от таблица Prodazbi, които се отнасят за количества по-големи от 3.
Фиг. 18.7. Заявка с условие

Знакът * указва да се вземат всички полета от посочената в клаузата FROM таблица. Резултатът е виден от фиг. 18.8.



Фиг. 18.8. Резултат от заявка с условие



Със заявката от фиг. 18.9. се селектират записите от таблица Klienti, които се отнасят за символна информация – клиенти с адреси в гр.Варна и гр. Бургас. Както се вижда символната информация се загражда с литерали. Резултатът от заявката е даден на фиг. 18.10.

Фиг. 18.9.Заявка с условие, вкючващо символна информация.




Фиг. 18.10.Резултат от заявка с условие, вкючващо символна информация.


Използуване на оператор SELECT с вградени функции

Вградените функции в SQL са: сума (SUM), преброяване (COUNT), средно аритметично (AVG), минимум (MIN), максимум (MAX), стандартно отклонение (StDev), вариация (Var). Има и математически функции, функции за стрингове, както и функции за дата и преобразуване на данните.



Със заявката за агрегиране от фиг. 18.11. се намира общата сума на заявените количества от таблица Prodazbi.

Фиг. 18.11.Заявка за агрегиране.

Резултатът от заявката се внася в колона с име Suma – фиг. 18.12.


Фиг. 18.12. Резултат от заявка за агрегиране.
Използуване на оператор SELECT за агрегиране по групи

С помощта на клаузата GROUP BY записите се групират в логически групи. За тези групи могат да се изпълняват различни вградени функции и да се получават агрегирани стойности. На фиг.18.13. е показанa заявка-Query 14 за агрегиране-сумиране на количествата поръчани стоки, групирани по ProduktNo и внесени в поле с име SKolichestvo. С добавяне на клаузата HAVING се избират групите, отговарящи на определено условие, в случая сумарно количество > 3. С добавянето на клаузата ORDER BY се осигурява съответната сортировка на резултата, в случая по ProduktNo.

Фиг. 26.13. Заявка за агрегиране по групи.



Резултатът от това агрегиране е показан на фиг. 18.14.
Фиг. 26.14. Резултат от заявка за агрегиране по групи.


Използуване на оператор SELECT за подзаявки (релационно деление-Division)

Релационното деление е операция, при която по зададено условие се отделят записи от една таблица и се търси съответствието им в друга таблица, получена като предишна заявка. В някои литературни източници тази релационна операция се нарича множествено селектиране или работа с подзаявки. В нашия случай търсим имената на изделията, за които имаме сумарни поръчки по-големи от 5 броя. SQL заявката е показана на фиг.18.15.


Фиг. 18.15. Подзаявка (заявка за релационно делене).



Тук резултатът, показан на фиг. 18.16., се получава направо само с една заявка, включваща подзаявка.
Фиг. 18.16. Резултат от подзаявка (заявка за релационно делене).

Ако работим на две стъпки, ще се постигне същият резултат чрез изпълнение на две последователни заявки. Най-напред би трябвало да се направи търсене в таблицата Prodazbi по зададеното условие, а след това селектиране на намерените записи от таблица Nomenklatura. По същество последната от тези две заявки представлява една разновидност на релационната операция съединение - съединение по равенство, наричано още естествено съединение - natural join, която може да се изпълни с оператора SELECT.


Използуване на оператор JOIN за релационната операция за съединение
Релационното съединение има три основни разновидности: естествено (вътрешно) съединение и две външни (ляво и дясно) съединения. При естественото съединение се съединяват само записите с еднакви стойности в управляващото (общото) поле. То е подмножество на “тета” съединението, за което в SQL-92 се допускат операторите <=, <, >, >=. Лявото и дясното външни съединения работят съответно с ляво/дясно разположена по отношение на операцията съединение водеща таблица. Това означава, че съединението се прави за всички записи от водещата таблица, независимо дали има информация за тях в другата таблица. В случай, че няма информация, съответните полета остават празни.

Използува се операторът SELECT с клауза за естествено съединение INNER JOIN, за лявостояща водеща таблица – LEFT JOIN, a за дясностояща водеща таблица - RIGHT JOIN. Синтаксисът на оператора е:

SELECT <списък от имена на колони>

FROM <име на таблица 1>

INNER JOIN / LEFT JOIN / RIGHT JOIN <име на таблица 2> ON <условие за =>;
Нека желаем да направим списък на заявките за продажби заедно с адресите на съответните клиенти. Общото свойство е KlientNo и трябва да се направи заявка за съединение при равенство на стойностите на това общо свойство т.е. естествено съединение-фиг. 18.17.

Фиг. 18.17. Заявка за естествено съединение.


Структурата на новата таблица се указва с оператора за селекция. В резултат се получава таблица с направените поръчки и адресите на заявилите ги клиенти-фиг. 18.18.

Фиг. 18.18. Резултат от заявка за естествено съединение.



Ако желаем да видим какво е състоянието на всички клиенти във връзка с направени или не поръчки трябва да направим ляво външно съединение -LEFT JOIN. Предварително добавяме нов клиент в Klienti с номер 13, фиг. 18.19.

Фиг. 18.19. Допълнена таблица Klienti.



Както се вижда тук сме добавили един нов клиент с номер 13 и име Андрей Колев в таблица Klienti. Нека от новодобавения клиент да не са постъпили поръчки в таблица Prodazbi. Заявката за ляво външно съединение е показана на фиг. 18.18.
Фиг. 18.20. Заявка за ляво външно съединение.

На фиг. 18.21. виждаме, че са изброени всички клиенти, но за някои от тях полетата за поръчан продукт са празни. По аналогичен начин работи и операторът за дясно външно съединение RIGHT JOIN.



Фиг. 18.21. Резултати от заявка за ляво външно съединение.
За работа с всички колони на съединяваните таблици стандартът SQL-92 поддържа и по-простата синтактична форма за естествено съединение:

<име на таблица 1> NATURAL JOIN<име на таблица 2>.

Допуска се и синтаксисът от по-старите версии на SQL :

SELECT<списък от полета>

FROM<име на таблица 1>,<име на таблица 2>

WHERE< условие>.

В списъка от полета имената им може да се задават по един от двата начина:



<име на таблица.име на поле> или

<съкратено име на таблица. име на поле>.

Освен това може да се задават съкратени имена на таблици с клаузата FROM по един от двата възможни начина:

FROM <име на таблица> AS <съкратено име на таблица> или FROM<име на таблица> <съкратено име на таблица>.
Възможно е да се извърши естествено съединение с някакво условие. Пример за заявка за естествено съединение с условие е показан на фиг. 18.22.

Фиг. 18.22.Заявка за естествено съединение с условие.
Резултатът от заявката се състои в два записа, показани на фиг. 18.23.

Фиг.18.23. Резултат от заявка за естествено съединение с условие.

Използуване на оператор UNION за теоретико-множествената операция обединение

Операцията обединение изисква обединяваните таблици да имат еднакви проектни макети, тъй като тя събира всички записи от двете таблици в една обща таблица. Допуска се да се изберат само някои колони от началните таблици за новата такава. В този случай се изхвърлят повтарящите се записи т.е. извършва се автоматично и операцията проекция. Синтаксисът на оператора е:

(SELECT <списък от имена на колони>

FROM <име на таблица 1>)

UNION/ALL/CORESPONDING/BY <списък от имена на колони>

(SELEСT <списък от имена на колони>

FROM <име на таблица 2>);

Избираемите колони имат следното значение:

ALL – резултатът включва и повтарящите се редове;

CORESPONDING – резултатът включва само общата колона;

BY – резултатът включва списък от колони.




Нека имаме една фирма с филиали. Всеки от филиалите поддържа своя таблица с клиенти. Искаме да съберем таблица Klienti, която се поддържа в първия филиал и аналогичната таблица Table2, която се поддържа във втория филиал - фиг.18.24. За целта номенклатурата на клиентите трябва да бъде обща за цялата фирма и типовете на данните в двете таблици да са еднакви. Ако в основната таблица за номенклатурните номера е зададен тип Autonumber, в присъединяваните таблици трябва да има тип Number.

Фиг. 18.24. Таблица на клиентите от втория филиал.

Заявката за обединение на двете таблици се задава от основния изглед на текущата база от данни чрез последователността от опции: QueriesÞNewÞDesignViewÞOKÞCloseÞQueryÞSQLSpecificÞUnion. Tя е дадена на фиг.18.25. Двете таблици са с еднаква структура и са съвместими по обединение. Тук е показано, че ключовите думи в SQL могат да се изписват и с малки букви (вж. Select).




Фиг. 26.25. Заявка за обединение на две таблици.

След изпълнение на заявката се получава резултатът, показан на фиг.18.26. При евентуално желание за повторно изпълнение на заявката системата автоматично я отхвърля и последният резултат е без повтарящи се имена.

Фиг.18.26. Резултат от заявка за обединение.

За работа с всички колони на обединяваните таблици стандартът SQL-92 поддържа и по-простата синтактична форма:

TABLE <име на таблица1> UNION TABLE <име на таблица2>;

Както при съединението и тук може да се прави обединение по условие. Съществуват също ляво и дясно обединение, при които се съединаяват както редовете, така и колоните от двете таблици т. е. не е задължително спазването на условието съвместимост по обединение.




Сподели с приятели:
1   ...   12   13   14   15   16   17   18   19   20




©obuch.info 2024
отнасят до администрацията

    Начална страница