Съдържание

# Проектиране на заявка

Изгледът за проектиране на заявки ви позволява да създавате и редактирате заявка към база от данни.

За достъп до тази команда...

В прозорец с база от данни щракнете върху иконата Заявки, след това изберете Редактиране - Редактиране.

В повечето бази от данни филтрирането или сортирането на данните за показване на екрана се извършва чрез заявки. Виртуалните таблици предлагат същата функционалност, както заявките, но от страната на сървъра. Ако базата от данни е в сървър, който поддържа виртуални таблици, чрез тях можете да филтрирате записите още в сървъра – така ще ускорите показването им.

Когато изберете командата Създаване на виртуална таблица от раздела Таблици на документ – база от данни, ще видите прозореца Проектиране на виртуална таблица, който прилича на описания тук прозорец Проектиране на заявка.

Оформлението на прозореца за проектиране на заявка се запазва заедно със създадената заявка, но не и със създадена виртуална таблица.

## Изгледът за проектиране

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

Долният панел на изгледа за проектиране служи за дефиниране на заявката. За да дефинирате заявка, задайте имената на полетата в базата от данни, които да бъдат включени, и критериите за показване на полетата. За да пренаредите колоните в долния панел на изгледа за проектиране, плъзнете заглавие на колона на ново място или изберете колоната и натиснете Command Ctrl+клавиш със стрелка.

В горната част на прозореца за проектиране на заявки са показани иконите на лентите Проектиране на заявка и Проектиране.

Ако искате да изпробвате заявка, щракнете двукратно върху името й в документа – база от данни. Резултатът от заявката ще се покаже в таблица, подобна на изгледа с източници на данни. Забележка: показаната таблица е временна.

### Клавиши в изглед „Проектиране на заявка“

Клавиш | Функция
--- | ---
F4 | Мостра
F5 | Изпълняване на заявка
F7 | Добавяне на таблица или заявка

## Преглед

Когато започнете да проектирате нова заявка, ще видите диалог, в който трябва да изберете коя съществуваща таблица или заявка да се използва за основа.

За да добавяте полета към заявката, щракайте двукратно върху тях. Можете да задавате връзки чрез плъзгане и пускане.

Когато проектирате заявка, не можете да променяте избраните таблици.

### Премахване на таблици

За да премахнете таблица от изгледа „Проектиране“, щракнете върху горния ръб на прозореца с таблицата. Ще видите контекстното меню. Можете да използвате командата Изтриване, за да премахнете таблицата от изгледа. Друга възможност е да натиснете клавиша Delete.

### Преместване и преоразмеряване на таблица

Можете да преоразмерите и подредите таблиците по желание. За да преместите таблица, плъзнете горния ѝ ръб до желаната позиция. За да намалите или увеличите размерите, с които се показва таблицата, поставете курсора на мишката върху ъгъл или ръб и плъзнете до желания размер.

## Връзки между таблиците

Ако между полета от две различни таблици има връзка, можете да я използвате в заявката.

Например, ако имате таблица с артикули, идентифицирани чрез номер на артикул, и таблица за клиенти, в която записвате поръчаните от всеки клиент стоки чрез съответните номера на артикули, тогава между двете полета „номер на артикул“ има връзка. Ако искате да създадете заявка, която намира всички артикули, поръчани от даден клиент, трябва да извлечете данни от двете таблици. За това трябва да укажете на LibreOffice каква е връзката между тях.

За тази цел щракнете върху име на поле в таблица (например полето „Номер-на-артикул“ в таблицата с клиенти), задръжте бутона на мишката и плъзнете полето върху съответното му поле от другата таблица („Номер-на-артикул“ в таблицата с артикули). Когато отпуснете бутона на мишката, между двата прозореца с таблиците ще се появи линия, свързваща двете полета. В резултатната заявка на SQL ще бъде вмъкнато условие, че съдържанието на двете полета трябва да е еднакво.

Създаването на заявка, базирана на няколко свързани таблици, е възможно само ако използвате LibreOffice като интерфейс за релационна база от данни.

Достъпът до таблици на различни бази от данни в една и съща заявка не е възможен. Заявките с по няколко таблици са ограничени в рамките една база от данни.

### Указване типа на връзката

Ако щракнете двукратно върху линията, съединяваща две свързани полета, или изберете командата Вмъкване - Нова връзка, ще можете да зададете типа на връзката в диалоговия прозорец Връзки.

Можете също да натискате Tab, докато изберете желаната линия, после да натиснете Shift+F10, за да видите контекстното меню, и да изберете командата Редактиране. Някои бази от данни подържат само подмножество от възможните видове съединения.

### Изтриване на връзки

За да изтриете връзка между две таблици, щракнете върху съединителната линия и натиснете клавиша Delete.

Вместо това можете да изтриете съответните елементи от списъка Участващи полета в диалоговия прозорец Връзки или да натискате Tab, докато изберете желаната линия, после да натиснете Shift+F10, за да видите контекстното меню, и да изберете командата Изтриване.

## Дефиниране на заявката

Задайте условия, за да дефинирате заявката. Всяка колона от таблицата за проектиране може да съдържа едно поле с данни за заявката. Условията в един ред са свързани с логическо „И“.

### Задаване на имена на полета

Първо изберете имената на полетата от таблиците, които искате да добавите в заявката. Можете да направите това с плъзгане и пускане или с двукратно щракване върху име на поле в прозореца на таблицата. Ако използвате плъзгане и пускане, плъзнете име на поле от прозореца на таблицата и го пуснете в долната част на на прозореца за проектиране на заявка. Така можете да определите в коя колона да бъде добавено. Ако щракнете двукратно върху име на поле, то ще бъде добавено в първата свободна колона.

### Изтриване на имена на полета

За да премахнете име на поле от заявката, щракнете върху заглавието на колоната с полето и изберете командата Изтриване от контекстното меню на колоната.

### Записване на заявката

За да запишете заявката, използвайте иконата Записване от лентата „Стандартни“. Ще видите диалогов прозорец, който ви подканва да въведете име за заявката. Ако базата от данни поддържа схеми, можете да въведете и име на схема.

#### Схема

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

#### Име на заявка или име на виртуална таблица

Въведете името на заявката или виртуалната таблица.

### Филтриране на данни

За да филтрирате данните за заявката, задайте желаните критерии в долната част на прозореца за проектиране на заявка. Разполагате със следните възможности:

#### Поле

Въведете името на полето с данни, което се използва в заявката. Всички настройки в редовете с параметри на филтрирането се отнасят за това поле. Ако активирате клетка тук с щракване в нея, ще видите бутон със стрелка, който ви позволява да изберете поле. Възможността „Име на таблица.*“ означава избиране на всички полета – тогава зададените критерии ще се отнасят за всички полета в таблицата.

#### Псевдоним

Задава псевдоним. Той ще бъде показван в заявката вместо името на полето. Така можете да задавате собствени етикети за колоните. Например, ако името на полето е „PtNo“, а вие искате в заявката вместо това да се изписва „PartNum“, въведете „PartNum“ като псевдоним.

В оператор на SQL псевдонимите се дефинират както следва:

SELECT колона AS псевдоним FROM таблица.

Например:

    SELECT "PtNo" AS "PartNum" FROM "Parts"

#### Таблица

Тук се показва таблицата, съответстваща на избраното поле. Ако активирате клетката с щракване, ще се покаже стрелка, която ви позволява да изберете друга таблица за текущата заявка.

#### Сортиране

Като щракнете върху тази клетка, можете да изберете настройка за сортиране: възходящо, низходящо или изключено. Текстовите полета се сортират по азбучен ред, а числовите – като числа. За повечето бази от данни администраторите могат да задават настройките за сортиране в самата база.

#### Видим

Ако отметнете свойството Видим за поле с данни, полето ще се вижда в резултата от заявката. Ако искате да използвате поле само за да формулирате условие или да извършите изчисление, не е необходимо да го задавате като видимо.

#### Критерий

Задава първи критерий, по който да се филтрира съдържанието на полето с данни.

#### или

Тук можете да въведете по един критерий за филтриране на всеки ред. Критериите в рамките на една колона се тълкуват като съчетани чрез логическо „ИЛИ“.

Освен това чрез контекстното меню на заглавията на редовете в тази област можете да вмъкнете филтър, базиран на функция:

### Функции

Достъпните тук функции зависят от това какви функции предоставя ядрото на базата от данни.

Ако работите с вградената база от данни HSQL, списъкът в реда Функция ви предлага следните възможности:

Възможност | SQL | Ефект
--- | --- | ---
Без функция |  | Няма да бъде изпълнена функция.
Средно | AVG | Изчислява средното аритметично на стойностите в полето.
Брой | COUNT | Намира броя на записите в таблицата. Празните полета може да се броят (а) или да се изключват (б). а) COUNT(*): ако подадете звездичка като аргумент, ще бъдат преброени всички записи в таблицата. б) COUNT(колона): ако подадете име на поле като аргумент, ще бъдат преброени само записите, в които указаното поле съдържа стойност. Записите, в които полето има стойност Null (т.е. не съдържа текстова или числова стойност), няма да се броят.
Максимум | MAX | Намира най-високата стойност на това поле измежду записите.
Минимум | MIN | Намира най-ниската стойност на това поле измежду записите.
Сума | SUM | Изчислява сумата на стойностите на съответното поле от всички записи.
Групиране | GROUP BY | Групира данните в заявката по стойностите на избраното поле. Функциите се изпълняват според зададените групи. В SQL тази възможност съответства на клаузата GROUP BY. Ако е добавен критерий, той ще бъде включен в клауза HAVING.

Можете да въвеждате обръщения към функции и направо в оператора на SQL. Синтакисът е следният:

SELECT FUNCTION(колона) FROM таблица.

Например, обръщението към функция за сумиране в SQL е:

    SELECT SUM("Price") FROM "Article".

С изключение на Групиране, останалите споменати по-горе функции се наричат „агрегатни функции“. Те служат за обобщаване на данни. Възможно е да са достъпни и други функции, които не са изброени в списъчното поле. Те зависят от конкретното използвано ядро за бази от данни и от това каква функционалност предоставя драйверът на Base, който осигурява връзката с това ядро.

За да използвате други функции, които не са изброени в списъка, трябва да ги въведете ръчно в клетката Поле.

На обръщенията към функции също могат да се присвояват псевдоними. Ако не искате в заглавието на колоната да се изписва текстът от заявката, въведете желаното алтернативно име в клетката Псевдоним.

Съответната функция в оператор на SQL е:

SELECT ФУНКЦИЯ() AS псевдоним FROM таблица

Пример:

    SELECT COUNT(*) AS count FROM "Item"

Ако използвате такава функция, можете да вмъквате допълнителни колони в заявката единствено като аргументи на функцията „Групиране“.

Примери

В следващия пример се изпълнява заявка с две таблици: таблица с артикули „Item“, съдържаща поле „Item_No“ за номер на артикул, и таблица с доставчици „Suppliers“ с поле „Supplier_Name“ за име на доставчик. Освен това и двете таблици имат общо поле „Supplier_No“ за номер на доставчик.

За да създадете заявка за доставчиците, доставящи по повече от три артикула, е необходимо да изпълните следните стъпки.

1. Вмъкнете таблиците „Item“ и „Suppliers“ в проекта на заявката.

2. Свържете полетата „Supplier_No“ от двете таблици, ако между тях е е показана връзка.

3. Щракнете двукратно върху полето „Item_No“ от таблицата „Item“. Покажете реда Функция чрез контекстното меню и изберете функцията „Брой“.

4. Въведете „>3“ като критерий и изключете полето „Видим“.

5. Щракнете двукратно върху полето „Supplier_Name“ в таблицата „Suppliers“ и изберете функцията „Групиране“.

6. Стартирайте заявката.

Ако в таблицата „Item“ има полета „Price“ (за единична цена на артикула) и „Supplier_No“ (за доставчика на артикула), можете да получите средната цена на артикул, доставян от даден доставчик, със следната заявка:

1. Вмъкнете таблицата „Item“ в проекта на заявката.

2. Щракнете двукратно върху полетата „Price“ и „Supplier_No“.

3. Включете реда Функция и изберете функцията „Средно“ за полето „Price“.

4. Можете също да въведете „Average“ в реда за псевдоним (без кавичките).

5. Изберете „Групиране“ за полето „Supplier_No“.

6. Стартирайте заявката.

Имате на разположение следните команди от контекстното меню и икони:

### Функции

Показва или скрива ред за избор на функции.

### Име на таблица

Показва или скрива реда за име на таблица.

### Псевдоним

Показва или скрива реда за псевдоним.

### Различни стойности

Заявката ще извлече само различните стойности. Това се отнася за групи от записи, съдържащи повтарящи се данни в избраните полета. Ако командата Различни стойности е активна, те ще са представени в резултата само с по един запис (DISTINCT). Иначе ще виждате всички записи, съответстващи на критериите от заявката (ALL).

Например, ако името „Иванов“ се среща няколко пъти в база от данни с адреси, можете да изберете командата Различни стойности, за да укажете, че в резултата от заявката „Иванов“ трябва да бъде показано само веднъж.

За заявка, включваща няколко полета, комбинацията от стойности във всички полета трябва да е уникална, за да се включи записът в резултата. Например, да кажем, че в адресния бележник има един път „Иванов от Пловдив“ и два пъти „Иванов от София“. Ако заявката включва полета за фамилия и град, с командата Различни стойности заявката ще върне един път „Иванов от Пловдив“ и един път „Иванов от София“.

В SQL тази команда съответства на предиката DISTINCT.

### Ограничение

Позволява ви да ограничите максималния брой записи, връщани от заявката.

Ако добавите конструкцията Ограничение, ще получите най-много указания брой записи. Иначе ще видите всички записи, съответстващи на критериите в заявката.

### Формулиране на условия за филтриране

Когато формулирате условия за филтриране, имате на разположение разнообразни операции и команди. Освен операциите за сравнение има и специфични за SQL команди за проверка на съдържанието на полетата с данни. Ако използвате тези команди в синтаксиса на LibreOffice, LibreOffice автоматично ще ги преобразува в съответния синтаксис на SQL чрез вътрешен синтактичен анализатор. Можете да въведете командата на SQL и директно, заобикаляйки вътрешния синтактичен анализ. Следващите таблици съдържат общ преглед на операциите и командите:

Операция | Значение | Условието е удовлетворено, ако…
--- | --- | ---
= | равно на | … съдържанието на полето е еднакво със зададения израз. Операцията = не се показва в полетата на заявката. Ако въведете стойност без операция, автоматично се приема =.
<> | различно | … съдържанието на полето не съответства на зададения израз.
> | по-голямо от | … съдържанието на полето е по-голямо от зададения израз.
< | по-малко от | … съдържанието на полето е по-малко от зададения израз.
>= | по-голямо или равно на | … съдържанието на полето е по-голямо или равно на зададения израз.
<= | по-малко или равно на | … съдържанието на полето е по-малко или равно на зададения израз.

Команда на LibreOffice | Команда на SQL | Значение | Условието е удовлетворено, ако…
--- | --- | --- | ---
IS EMPTY | IS NULL | е null | ... полето не съдържа данни. За полета от тип „да/не“ с три състояния, тази команда автоматично проверява за неопределеното състояние (нито „да“, нито „не“).
IS NOT EMPTY | IS NOT NULL | не е празно | ... полето не е празно, т.е. съдържа данни.
LIKE заместител (*) за произволен брой знаци заместител (?) за точно един знак | LIKE заместител (%) за произволен брой знаци заместител (_) за точно един знак | съдържа | … полето съдържа зададения израз. Заместващият знак * показва дали изразът x се среща в началото на съдържанието на полето (x*), в края му (*x) или във вътрешността (*x*). В заявките на SQL можете да въвеждате знака % от SQL, а в интерфейса на LibreOffice – познатия ви от файловата система заместител *. Заместващият знак (*) или (%) замества произволен брой знаци. Въпросителният знак (?) в интерфейса на LibreOffice или долната черта (_) в заявките на SQL служи за представяне на точно един знак.
NOT LIKE | NOT LIKE | не съдържа | ... полето не съдържа данни, съответстващи на зададения израз.
BETWEEN x AND y | BETWEEN x AND y | е в интервала [x, y] | ... полето съдържа стойност между x и y.
NOT BETWEEN x AND y | NOT BETWEEN x AND y | не е в интервала [x, y] | ... полето съдържа стойност, която не е между x и y.
IN (a; b; c...) Забележете, че стойностите в списъците са разделени с точка и запетая! | IN (a, b, c...) | е измежду a, b, c… | ... стойността на полето е измежду зададените изрази a, b, c,... Възможно е да се зададат произволен брой изрази, като резултатът от заявката се определя с операция булево „ИЛИ“. Изразите a, b, c... могат да са числа или текстове.
NOT IN (a; b; c...) | NOT IN (a, b, c...) | не е измежду a, b, c… | ... стойността на полето не е измежду зададените изрази a, b, c,...
= TRUE | = TRUE | има стойност „истина“ | ... полето съдържа логическата стойност „истина“.
= FALSE | = FALSE | има стойност „лъжа“ | ... полето съдържа логическата стойност „лъжа“.

### Примери

='Г-ца' | намира полета със съдържание „Г-ца“.
<'2001-01-10' | намира дати преди 10 януари 2001 г.
LIKE 'д?ма' | намира полета със съдържание като „дама“ или „дума“.
LIKE 'S*' | намира полета със съдържание като „Sun“.
BETWEEN 10 AND 20 | намира полета, съдържащи стойност между 10 и 20 (полетата може да са текстови или числови).
IN (1; 3; 5; 7) | намира полета, съдържащи стойност 1, 3, 5 или 7. Ако полето съдържа например номер на артикул, можете да създадете заявка, която намира артикула с определен номер.
NOT IN ('Иванов') | връща полета, чиято стойност не е „Иванов“.

Превключваща последователност за LIKE: {escape 'превключващ-знак'}

Пример:

    SELECT * FROM Item WHERE ItemName LIKE 'The *%' {escape '*'}

Примерът ще намери всички записи, в които името на артикул започва с „The *“. Това означава, че можете да търсите знаци, които иначе биха били изтълкувани като заместители, например *, ?, _, % или точка.

Превключваща последователност за OUTER JOIN: {oj outer-join}

Пример:

    SELECT Article.* FROM {oj item LEFT OUTER JOIN orders ON item.no=orders.ANR}

### Заявки към текстови полета

За да сравните съдържанието на текстово поле, трябва да оградите израза с единични кавички. Различаването на малки и главни букви зависи от използваната база от данни. По дефиниция LIKE е чувствителна към регистъра (но в някои бази от данни това не се спазва строго).

### Заявки към полета с дати

Полетата с дати се представят като #Дата#, за да се вижда ясно, че са дати. Константите (литералите) от тип дата, час и дата/час, използвани в условия, могат да бъдат или във вид SQL Escape Syntax, или в подразбирания синтаксис на SQL2.

Елемент от тип дата | SQL Escape syntax #1 - може да е извън употреба | SQL Escape syntax #2 | Синтаксис на SQL2
--- | --- | --- | ---
Дата | {D'YYYY-MM-DD'} | {d 'YYYY-MM-DD'} | 'YYYY-MM-DD'
Час | {D'HH:MM:SS'} | {t 'HH:MI:SS[.SS]'} | 'HH:MI:SS[.SS]'
Дата и час | {D'YYYY-MM-DD HH:MM:SS'} | {ts 'YYYY-MM-DD HH:MI:SS[.SS]'} | 'YYYY-MM-DD HH:MI:SS[.SS]'

Пример:

    SELECT {d '1999-12-31'} FROM world.years

Пример:

    SELECT * FROM mytable WHERE years='1999-12-31'

Всички изрази (или литерали) от тип дата трябва да бъдат оградени с кавички. (За подробности вижте ръководството за конкретната база от данни и драйвер за връзка с нея.)

### Заявки към полета от типа „да/не“

За да сравните съдържанието на логическо поле, използвайте следния синтаксис за таблици на dBASE:

Състояние | Критерий за сравнение | Пример
--- | --- | ---
Да | за таблици на dBASE: не е равно на никоя стойност | =1 намира всички записи, в които полето има състояние „Да“ или „Включено“ (избрано в черно),
Не | . | =0 намира всички записи, в които полето има състояние „Не“ или „Изключено“ (няма селекция).
Null | IS NULL | IS NULL намира всички записи, за които полето няма състояние „Да“ или „Не“ (избрано в сиво).

Синтаксисът зависи от използваната СУБД. Освен това имайте предвид, че полетата от тип „Да/Не“ може да са дефинирани по друг начин (само с 2 състояния, вместо с 3).

### Параметрични заявки

Параметричните заявки позволяват на потребителя да въвежда стойности по време на изпълнение. Тези стойности се използват в критериите за избиране на записи. Всяка от тях е свързана с име на параметър, което се използва за запитване към потребителя, когато се стартира заявката.

В изгледите „Проектиране“ и „SQL“ на заявката пред имената на параметри има двоеточие. Те могат да се използват навсякъде, където може да участва стойност. Ако една и съща стойност трябва да участва на няколко места, използва се едно и също име на параметър.

В най-простия случай, когато потребителят въведе стойност, проверявана за равенство, името на параметъра с предхождащото го двоеточие просто се въвежда в реда „Критерии“. В режим „SQL“ това трябва да бъде въведено като WHERE "Поле" = :Име_на_параметър

Имената на параметри не могат да съдържат знаците <интервал>`!"$%^*()+={}[]@'~#<>?/,. Освен това не могат да съвпадат с имена на полета или запазени думи на SQL. Могат да съвпадат с псевдоними.

Полезна конструкция за избиране на записи на базата на част от съдържанието на текстово поле е да се добави скрита колона с критерий "LIKE '%' || :Част_от_поле || '%'". Така ще бъдат избрани записите с пълно съвпадение. Ако не трябва да се различават малки и главни букви, едно решение е за поле да се използва LOWER (Име_на_поле), а за критерий – LIKE LOWER ( '%' || :Част_от_поле || '%' ). Обърнете внимание, че интервалите в критерия са от значение – ако ги пропуснете, анализаторът на SQL ще интерпретира целия критерий като низ за съвпадение. В режим „SQL“ трябва да се въведе LOWER ( "Име_на_поле" ) LIKE LOWER ( '%' || :Част_от_поле || '%' ).

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

### Въвеждане на параметър

Диалогът Въвеждане на параметри подканва потребителя да въведе стойностите на параметрите. Въведете стойност за всеки от параметрите на заявката и потвърдете с щракване върху OK или натискане на Enter.

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

За извличане на записи според по-сложни критерии, като части от стойност могат да се използват заместващите знаци на SQL "%" (произволен низ) или "_" (произволен единичен знак).

## Режим SQL

SQL означава „Structured Query Language“ (език за структурирани заявки). Този език представлява набор от инструкции за управление на релационни бази от данни.

За повечето заявки в LibreOffice не са ви необходими познания по SQL, тъй като не се налага да въвеждате програмен код на SQL. Ако създадете заявка в прозореца за проектиране, LibreOffice автоматично преобразува указанията ви в съответния синтаксис на SQL. Ако преминете към изглед SQL с помощта на бутона Изглед Проектиране - вкл./изкл., можете да видите командите на SQL за създадената до момента заявка.

Можете да формулирате заявката си и директно като код на SQL. Забележете обаче, че конкретния синтаксис зависи от използваната СУБД.

Ако въвеждате ръчно код на SQL, можете да създавате специфични за SQL заявки, които не се поддържат от графичния интерфейс в прозореца Проектиране на заявка. Тези заявки трябва да се изпълняват в режим Native SQL.

За да формулирате заявка, която не се обработва от LibreOffice, а се изпраща директно към системата за управление на базата от данни, щракнете върху иконата Директно изпълнение на команда на SQL в изгледа SQL.