1. Професионална гимназия по механотехника и електротехника "М. В. Ломоносов" - гр. Добрич
www.pglomonosov.org
Красимир Дойчев Клаузи, преобразуване, въвеждане и структура на функциите 1 от 7
Тема 17. Клаузи, преобразуване, въвеждане и структура на функциите
инж. Красимир Дойчев kdoychev@gmail.com
В предишните уроци се запознахте със създаването и администрирането на основните
обекти на БД в SQL Server чрез основния инструмент Enterprise Manager, който предоставя
графичен потребителски интерфейс.
Целта на настоящия раздел е да разширите знанията си за работа с SQL Server, като
се научите да създавате конструкции на езика Transact SQL и ги изпълнявате в SQL Query
Analyzer. В настоящия урок ще се запознаете с основите на Transact SQL и клаузите на една
от най-често употребяваните конструкции – конструкцията Select.
Задачи
1. Запознаване с основите на Transact SQL
2. Запознаване с интерфейса и работата с SQL Query Analyzer
3. Работа с конструкцията Select
1. Въведение в Transact-SQL
Зад всички операции с БД, които изпълнявахме досега с Enterprise Manager, се
генерираха конструкции на Transact-SQL. Това е основният език на MS SQL Server чрез
който се дефинират, управляват и манипулират данни.
Transact-SQL ви позволява да администрирате инстанции на SQL Server; да създавате
и управлявате обекти; да вмъквате, извличате, модифицирате и изтривате всички данни в
таблиците на SQL Server. Transact-SQL е разширение на стандарта SQL, публикуван от
Националния институт по стандартите на САЩ (ANSI) и Международната организация за
стандартизация (ISO).
Основни компоненти на Transact-SQL са:
DDL (data definition language) - език за дефиниране на данни
DCL (data control language) - език за управление на данни
DML (data manipulation language) - език за манипулиране на данни.
Езикът за дефиниране на данни (Data definition language) се използва за дефиниране
и управление на всички атрибути и свойства на базата данни, включително структури на
редове, дефиниции на колони, ключови колони, местоположение на файлове и използване на
паметта. Една DDL конструкция поддържа дефинирането или декларирането на обекти на
базите данни, например бази данни, таблици и изгледи. За всеки клас обекти съществуват
обикновено конструкции CREATE, ALTER и DROP (например CREATE TABLE, ALTER
TABLE и DROP TABLE).
Повечето DDL конструкции имат следната форма:
CREATE име_на_обект - създава обект с посоченото име
ALTER име_на_обект – променя обект с посоченото име
DROP име_на_обект - премахва обект с посоченото име
Езикът за управление на данни (Data control language) се използва u управление на
разрешенията върху обекти на базата данни. Разрешенията се управляват чрез конструкции
GRANT и REVOKE от SQL-92 и Transact-SQL конструкцията DENY.
2. Професионална гимназия по механотехника и електротехника "М. В. Ломоносов" - гр. Добрич
www.pglomonosov.org
Красимир Дойчев Клаузи, преобразуване, въвеждане и структура на функциите 2 от 7
Конструкция GRANT разрешава на един потребител на текущата база данни да
работи с данните в тази база или да изпълнява конкретни конструкции на Transact-SQL.
Конструкция REVOKE премахва предоставено или отказано преди разрешение на
потребител в текущата база данни.
Конструкция DENY отказва разрешение на един акаунт за сигурност в текущата база
данни и се предотвратява възможността този акаунт за сигурност да наследи разрешението
чрез членството му в група или роля.
Езикът за манипулиране на данни (Data manipulation language) се използва за
избиране, вмъкване, актуализиране и изтриване на данни от обектите, дефинирани чрез
DDL.
Конструкция SELECT извлича редове от базата данни и активира избирането на един
или повече или колони от една или повече таблици.
Конструкция INSERT добавя нов ред в една таблица или изглед.
Конструкция UPDATE променя данните в една таблица.
Конструкция DELETE премахва редове от една таблица.
2. Работа с SQL Query Analyzer
SQL Server 2000 предлага набор от инструменти, които ви дават възможност да
използвате Transact-SQL за взаимодействие с бази данни на SQL. Този набор инструменти
включва SQL Query Analyzer и помощните програми isqlw, isql и osql, изпълнявани от
командния промпт.
SQL Query Analyzer е инструмент с графичен потребителски интерфейс (graphical user
interface, GUI), който предоставя възможност да се проектират, тестват и изпълняват
конструкции на Transact-SQL, съхранени процедури, пакети и скриптове.
SQL Query Analyzer може да се стартира по следните начини:
от меню Start - група Microsoft SQL Server - Query Analyzer
от Enterprise Manager - меню Tools
команда isqlw от командния промпт
След стартиране се появява диалогов прозорец, в който трябва да се посочи с кой
екземпляр на SQL Server искаме да се свържем. Обикновено се избира local.
В прозореца за редактиране се записва конструкцията и след това се изпълнява с
команда Query -> Execute или клавиш F5. Ако искаме да се стартират само определени
редове от кода, преди стартиране маркираме само тях.
3. Клаузи на конструкцията Select
3.1. Общи сведения за SELECT
Конструкцията SELECT в Transact-SQL ви дава възможност да извличате
съществуващи данни от една база данни на SQL Server. Повечето конструкции SELECT
описват четири основни свойства на набора от резултати:
Колоните, които трябва да се включват в набора от резултати
Таблиците, от които се извличат данните за набора от резултати
Условията, на които трябва да отговарят редовете в таблицата
източник, за да се включат в набора от резултати.
Последователността на подреждане на редовете в набора от резултати.
3. Професионална гимназия по механотехника и електротехника "М. В. Ломоносов" - гр. Добрич
www.pglomonosov.org
Красимир Дойчев Клаузи, преобразуване, въвеждане и структура на функциите 3 от 7
Например следващата конструкция SELECT извлича идентификационния номер ID,
името и единичната цена на всички продукти таблица Products, чиято единична цена е по-
голяма от $40:
SELECT ProductID, ProductName, UnitPrice
FROM Products
WHERE UnitPrice>40
ORDER BY UnitPrice ASC
Клаузата SELECT в предишния пример определя стойностите на кои колони трябва
да бъдат извлечени, а клаузата FROM определя таблицата, която съдържа тези колони.
Клаузата WHERE ограничава набора от резултати до тези продукти, чиято стойност в
UnilPrice (единична цена) е по-голяма от $40. Клауза ORDER BY определя, че наборът от
резултати трябва да бъде сортиран във възходящ ред по стойностите в колона UnitPrice.
Пълният синтаксис на конструкция SELECT е сложен, но основните клаузи могат да
бъдат обобщени по следния начин:
SELECT списък колони
[INTO нова таблица]
FROM списък таблици
[WHERE условие за филтриране на запсите
[GROUP BY списък по кои полета да се групира
[HAVING условие
[ORDER BY полета по които да се подрежда по азбучен ред [ASC DESC] ]
Средните скоби означават, че оградената клауза не е задължителна. При записване на
конструкцията те не се поставят.
3.2. Основни клаузи на SELECT
3.2.1. Клауза SELECT
Клаузата SELECT се състои от ключовата дума SELECT и списъка за избор.
Списъкът за избор е поредица от изрази, разделени със запетаи. Всеки израз дефинира една
колона от набора от резултати. Колоните в набора от резултати са подредени в същата
последователност като последователността на изразите в списъка за избор.
Използване на ключови думи в списъка за избор
Списъкът за избор може да съдържа и ключови думи, които контролират
окончателния формат на набора от резултати.
Ключова дума DISTINCT
Ключовата дума DISTINCT елиминира дублираните редове от набора от резултати.
Например таблица Orders в база данни Northwind съдържа дублирани стойности в колона
ShipCity. За да получите списък със стойностите на ShipCity, в който няма дубликати,
въведете следния код:
SELECT DISTINCT ShipCity, ShipRegion FROM Orders ORDER BY ShipCity
Ключова дума TOP n
Ключовата дума ТОР n определя, че трябва да бъдат върнати първите п реда от
набора от резултати. Ако е зададена ORDER BY, редовете се избират след като се подреди
наборът от резултати. С n е обозначено мястото, където се указва броят на редовете, които
4. Професионална гимназия по механотехника и електротехника "М. В. Ломоносов" - гр. Добрич
www.pglomonosov.org
Красимир Дойчев Клаузи, преобразуване, въвеждане и структура на функциите 4 от 7
трябва да бъдат върнати (освен ако не е зададена ключовата дума PERCENT). PERCENT
определя, че n е процентът редове в набора от резултати, които трябва да бъдат върнати.
Например следващата конструкция SELECT връща първите 10 града по азбучен ред от
таблица Orders:
SELECT DISTINCT TOP 10 ShipCity, ShipRegion
FROM Orders
ORDER BY ShipCity
Ключова дума AS
За повече удобство при четене на конструкцията SELECT може да зададете alias
(псевдоним) на дадена таблица. Псевдонимът на таблицата се присвоява или чрез използване
на ключовата дума AS, или без нея:
таблица AS псевдоним
таблица псевдоним
3.2.2. Клауза INTO
Клаузата INTO ви дава възможност да укажете, че наборът от резултати ще бъде
използван за създаване на нова таблица със същото име, което е посочено в клаузата.
Конструкцията SELECT...INTO може да се използва за комбиниране на данните от няколко
таблици или от няколко изгледа в една таблица. Можете да я използвате и за създаване на
нова таблица, която съдържа данни, избрани от свързан сървър. Следващият пример
използва конструкция SELECT за извличане на стойности от колони FirstName и LastName
на таблица Employees:
SELECT FirstName, LastName INTO EmployeeNames FROM Employers
Наборът от резултати, генериран от конструкцията, създава таблица EmployeeNames.
Новата таблица ще съдържа колони FirstName и LastName, и тези колони ще съдържат
стойностите от таблица Employees. Наборът от резултати не се появява в панел Results, освен
ако специално не направите заявка за четене на новата таблица.
3.2.3. Клауза FROM
Клаузата FROM е задължителна за всяка конструкция SELECT, н която се извличат
данни от таблици или изгледи. Можете да използвате клауза FROM, за да изброите
таблиците и изгледите, съдържащи колоните, посочени в списъка за избор и в клаузата
WHERE. Можете да дадете псевдоними на имената на таблиците и изгледите чрез клауза AS.
Освен това можете да използвате клауза FROM за съединяване на таблици, като укажете
условия за съединение в клауза ON.
Клауза FROM представлява списък от имена на таблици, имена на изгледи и клаузи
JOIN, разделени със запетаи. Следната конструкция SELECT използва клауза FROM, за да
зададе таблица Shippers
SELECT * FROM Shippers
Можете да използвате клауза FROM за задаване на съединения между две таблици
или два изгледа.
3.2.4. Клаузи WHERE, GROUP BY и HAVING
Клаузите WHERE и HAVING в конструкция SELECT контролират редовете от
таблиците-източници, които се използват за изграждане на набора от резултати. Тези клаузи
5. Професионална гимназия по механотехника и електротехника "М. В. Ломоносов" - гр. Добрич
www.pglomonosov.org
Красимир Дойчев Клаузи, преобразуване, въвеждане и структура на функциите 5 от 7
представляват филтри. Те задават поредица от условия за търсене и само тези редове, които
отговарят на условията за търсене, се използват за изграждане на набори от резултати. За
редовете, които отговарят на условията за търсене се казва, че са "приети за участие" в
набора от резултати. Например клаузата WHERE в следващата конструкция SELECT връща
само тези редове, в които регионът е щат Вашингтон:
SELECT CustomerlD, CompanyName
FROM Northwind.dbo.Customers WHERE Region = ‘WA’
Клауза HAVING обикновено се използва в съчетание с клауза GROUP BY, въпреки че
тя може да бъде зададена и без GROUP. Клауза HAVING задава повече филтри, които се
прилагат след като клауза WHERE извърши своето филтриране. Следващата конструкция
SELECT включва клауза WHERE, клауза GROUP BY и клаузи HAVING:
SELECT OrdD1.OrderID AS OrderID,
SUM(OrdD1.Quantity) AS “Units Sold”,
SUM(OrdD1.UnitPrice * OrdD1 .Quantity) AS Revenue
FROM [Order Details] AS OrdDl
WHERE OrdDl.OrderID IN (SELECT DISTINCT OrdD2.OrderlD
FROM [Order Details] AS OrdD2
WHERE OrdD2.UnitPrice > $100)
GROUP BY OrdD1.OrderID
HAVING SUM(OrdDl.Quantity) > 100
Изразът FROM [Order Details] AS OrdDl показва, че ще се извличат данни от
таблицата Order Details, като на таблицата Order Details е зададен псевдоним OrdDl чрез
ключовата дума AS.
Изразът SELECT OrdD1.OrderID AS OrderID, означава че първата колона на
върнатата таблица ще показва идентификационните номера на поръчките от таблицата-
източник Order Details, която както посочихме по-горе се показва под псевдонима OrdDl.
Изразът SUM(OrdD1.Quantity) AS “Units Sold” означава че втората колона на
върнатата таблица ще се показва под името Units Sold и ще съдържа сумата от количествата
в таблицата OrdD1.
Изразът SUM(OrdD1.UnitPrice * OrdD1 .Quantity) AS Revenue изчислява сумата от
приходите на всяка стока, като и задава псевдоним Revenue (приходи). Това ще бъде третата
колона на върнатата таблица. Приходът от всяка стока е произведение от единична цена на
стоката UnitPrice по количеството Quantity.
В тази конструкция SELECT клаузата WHERE връща само тези поръчки, в които
единичната цена на продаваната стока е по-голяма от $100, а клауза HAVING го ограничава
още повече - свежда го само до тези поръчки, в които продаденото количество е повече от
100 изделия. Клауза GROUP BY ограничава редовете, като извлича само различните
стойности в OrderlD.
Клауза GROUP BY
Клаузата GROUP BY се използва за показване на агрегатни стойности за всеки ред в
набора от резултати. Когато се използват без клауза GROUP BY, агрегатните функции
представят само една агрегатна стойност за една конструкция SELECT.
6. Професионална гимназия по механотехника и електротехника "М. В. Ломоносов" - гр. Добрич
www.pglomonosov.org
Красимир Дойчев Клаузи, преобразуване, въвеждане и структура на функциите 6 от 7
След ключовите думи GROUP BY има списък от колони, известни като колони за
групиране. Клауза GROUP BY ограничава редовете в набора от резултати. Има само по един
ред за всяка различна стойност в колоната или колоните за групиране. Всеки ред в набора от
резултати съдържа сумарни данни, свързани с конкретна стойност от неговите колони за
групиране.
SQL Server поставя ограничения за елементите, които могат да бъдат зададени в
списъка за избор, когато една конструкция SELECT съдържа клауза GROUP BY. Списъкът
за избор може да съдържа колоните за групиране и изрази, които връщат само по една
стойност за всяка стойност в колоните за групиране, като агрегатни функции (векторни
агрегати), в които фигурира име на колоната като един от техните параметри.
Обикновено клауза HAVING се използва с клауза GROUP BY, въпреки че HAVING
може да бъде зададена отделно. Можете да извършите групиране и по израз, при условие че
в него не са включени агрегатни функции.
В клауза GROUP BY трябва да посочите име на колона от таблица или изглед, а не
име на колона от набора от резултати, присвоена с клауза AS. Можете да изброите повече от
една колона в клауза GROUP BY с цел да вложите групи, тоест можете да извършите
групиране на таблица чрез всякаква комбинация от колони.
Последователност за прилагане на клаузите WHERE, GROUP BY и HAVING
За да се създават ефективни заявки, трябва да се разбира правилната
последователност, в която се прилагат клаузите WHERE, GROUP BY и HAVING.
Клауза WHERE се използва да филтрира редовете, които се получават като
резултат от операциите, зададени в клауза FROM.
Клауза GROUP BY се използва за групиране на изхода от клауза WHERE.
Клауза HAVING се използва да филтрира редовете от групирания резултат.
Всяко от условията за търсене, които биха могли да бъдат приложени или преди, или
след операцията по групиране, е по-добре да бъде зададено в клауза WHERE. По този начин
се намалява броят на редовете, които трябва да бъдат групирани. Единствените условия за
търсене, които би трябвало да се задават в клауза HAVING, са тези условия за търсене, които
трябва да се приложат след като се извърши операцията по групиране.
3.2.5. Клауза ORDER BY
Клаузата ORDER BY сортира резултата от заявката по една или повече от колоните
(до 8060 байта). Една сортировка може да бъде във възходящ ред (ascending, ASC) или в
низходящ ред (descending DESC). Ако не е зададено нито едно от двете, се приема ASC. Ако
в клауза ORDER BY е посочена повече от една колона, се извършва вложено сортиране.
Следващата конструкция сортира редовете в таблица Titles, най-напред по издател (в
низходящ ред), после по тип (във възходящ ред в рамките на всеки издател) и накрая по цена
(също във възходящ ред, защото не е зададено DESC):
USE Pubs
SELECT Pub_id, Type, Title_id, Price
FROM Titles
ORDER BY Pub_id DESC, Type, Price
7. Професионална гимназия по механотехника и електротехника "М. В. Ломоносов" - гр. Добрич
www.pglomonosov.org
Красимир Дойчев Клаузи, преобразуване, въвеждане и структура на функциите 7 от 7
ЛИТЕРАТУРА
1. Microsoft. MSCE Microsoft SQL Server 2000 Проектиране и реализация на бази данни
Training kit. С., Софтпрес, 2001.
2. SQL Server Books Online