SlideShare a Scribd company logo
1 of 28
Тема 13
33. SQL. Стандарти и реализации на SQL. Transact-SQL - DCL, DDL, DML
оператори; управление на потока от оператори; пакети, скриптове,
съхранени
процедури и тригери. Език SQL. Версии и реализации на SQL.
SQL е стандартен език, използван за манипулиране и извличане на данни от
релационни бази от данни върху различни хардуерни платформи.
През 1974 г. Donald Chamberlin от изледователскта лаборотирия на IBM в
Сан Хосе предлага спецификация на релационен език, наречен SEQUEL (Structured
English Query Languages).
1976 – 1977 е разработена нова версия SEQUEL/2 и тя приема
окончателното име SQL.
През 1979 фирмата Relation Software Inc (сега ORACLE Corp.) пуска
релационна система, основана на SQL, която в резултат на развитието си става
една от доминиращите индустриални системи ORACLE.
Разработени са версиите SQL86 и SQL89, не те са били не пълни по
отношение на фнкционалните си възможности, поради което разработчиците на
индустриални системи продължават да внасят разширения в стандарта.
През 1987 г. Започва работа върху върху развитие на SQL и през 1992г се
приема стандарта SQL92
SQL като стандартен език за релационни БД позволява на потребителя
(програмист, администратор, краен потребител с добра компютърна подготовка)
да извършва следните неща:
Създаване и изпълнение на заявки за извличане на данни от таблици на
база от данни по различни критерии;
Обновяване на съдържанието на базата от данни;
Създаване и модифициране структурата на базата от данни – създаване на
нови таблици, промяна структурата на таблиците, изтриване на таблици;
Поддържане на спомагателни данни (създаване, актуализация и изтриване
на индекси);
Поддържане на сигурността на базата от данни (защита на базата от данни
и определяне на различни права за достъп за различните потребители.
Стандартът SQL -92 по радикален начин разширява функционалните
възможности на своя предшественик, като включва такива разширения, които
вече са реализирани в редица индустриални SQL системи, но липсват в SQL-89.
Той предлага следните нови и разширени възможности:
Манипулиране с таблиците – в допълнение към оператора за създаване на
таблици са добавени и оператори за модифициране и премахване на
таблици.
Дефиниране на домейни, които могат да се използват като тип на данни за
колоните в таблиците.
Нови типове данни като DATE, TIME, BIT, NATIONAL, CHARACTER.
Нова променлива за състоянието SQLSTATE, предоставяща много повече
диагностична информация.
Нови функции като TRIM за премахване на празни позиции от началото и в
края на символен низ.
Скролируеми курсори. Чрез тях SQL се осигурява възможността за
показване и движение от ред към ред в резултатния набор, получни при
извличане на данни с оператора SELECT.
Информационна схема(INFORMATION_SCHEME), която осигурява формални
методи за обработка на метаданни.
Транзакции – направени са малки промени в синтаксиса на използваните
оператори.
Безопасност – добавени са възможности за отмяна на правата за достъп,
както и разрешение за предаването на привилегии от един потребител към
друг.
Временни таблици – могат да се използват за съхраняване на междинни
резултати; явното поддържане на временни таблици позволява да се
съкратят разходите по поддържане на постоянни таблици.
SQL е стандарт на език за мрежови заявки чрез различни хардуерни и софтуерни
платформи. SQL – сървърите се изпълняват върху файл – сървърите на локални
мрежи, миникомпютри и големи машини.
В SQL92 могат да бъдат отделени 3 нива на езика:
1. Базов SQL – това ниво е построено по такъв начин, че твърде много
прилича на SQL89 с някои неголеми различия като нови интерфейси за
езиците за програмиране ADA, C, MUMPS, роменлива за състоянието
SQLSTATE и др.
2. Междинен SQL. Построен е така, че да обхваща половината от различията
между SQL89 и SQL29 и включва динамични SQL оператори, оператори за
манипулиране със схема, поддържане на домейни и др.
3. Пълен SQL.Това е пълният стадарт на SQL92. В него се включва отложената
проверка на ограниченията за цялостност на данните, оператори за
обновяване и изтриване, в които в условията за търсене се използват
колони от таблици-операнди, позициониране на курсор, временни таблици
и други разширени възможности.
1. Transact - SQL – DCL, DDL, DML оператори; управление на потока от
оператори
Transact – SQL е разширение на стандартите на SQL, дефинирани от ANSI и
ISO (Transact SQL за SQL Server 2000 и 2005 е разширение на Entry Level SQL-
92), който включва възможности за дефиниране, манипулиране и
администриране на релационни бази от данни, управлявани от MICROSOFT
SQL Server.
Инструментите на MICROSOFT SQL Server за използване Transact SQL зависят
от версията:
MICROSOFT SQL Server 2000 – графичен потребителски интерфейс SQL
Query Analyzer и помощни програми, изпълнявани от командния
промпт – isqlw, isql, osql;
MICROSOFT SQL Server 2005, 2008 – SQL Server Management Studio е
интегриран, развоен инструмент за писане на Transact – SQL, MDX, XML,
SQL Server Mobile Edition заявки и SQLCMD команди.
В Transact SQL функционално се включват:
 Data Definition Language (DDL) засъздаване и модифициране на обектите на
базата от данни.
 Data Manipulation Language (DML) за извличане и модифициране на данни.
 Data Control Language (DCL) за установяване на права за достъп до базата от
данни
 Доълнителни елементи
Езикът за дефиниране на данните DLL включва 3 основни конструкции
за:
Дефиниране (създаване) на обекти (база от данни, таблици, индекси,
изгледи, съхранени процедури, тригери) и техните свойства CREATE
име_на_обект;
Модифициране дефиницията на обектите – ALTER име_на_обект;
Премахване дефиницията на обект – DROP име_на_обект;
Езикът за контрол на данните DCL включва:
Даване на права (разрешения, позволения) на потребителите за
достъп до базата от данни GRANT;
Премахване на предоставени или отказани права REVOKE;
Отказване на права DENY.
Езикът за манипулиране с данните DML включва:
Извличане на данни от таблици – SELECT;
Вмъкване на нови редове с данни в таблици- INSERT;
Обновяване на съществуващи данни - UPDATE;
Премахване на редове от таблицата – DELETE.
Операторите, които се използват за създаване на изрази, са:
Аритметични: +,-, *, /, % (деление по модул)
За сравнение: =, >, >=,<, <=, <>;
Конкатенация (слепване) на символни низове: +;
Логически: NOT, AND, OR;
Групиране на изрази: ().
Изразите, които са комбинирани от константи, променливи и колони,
свързани с оператори, връщат като резултат единична стойност,чиито тип зависи
от елементите, които ги съставят.
Примери:
Quantity*Price – връща число;
‘Varna’ + ‘University’- връща текст;
A>5 AND A<15 – връща логическа стойност;
Типове данни ограничават типа на стойностите, които могат да се съхраняват в
базата от данни. Типовете данни са атрибутите, които специфицират типа на
информацята, която може да бъде съхранявана в колона, параметър или
променлива. Основните типове данни са:
Числа – цели числа (int, tinyint, smallint, bigint) , десетични
числа(numeric,decimal,money, smallmoney) , числа с плаваща точка (float,
real);
Дати – два типа дати и време: date с точност 0,333 милисекунди
smalldatetime с точност интервал 1 минута;
Символни низове – символни низове с фиксирана дължина: char и nchar и
с променлива дължина: varchar и nvarchar; char и varchar са символни
низове в no-Unicode, а nchar и nvarchar – Unicode;
Двоични – третират се като двоични стойности; включват
binary,varbinary, bit и rowversion (индикира специална 8-битова двоична
стойност, която е уникална в базата от данни);
Уникални идентификатори – специалният тип данни uniqueidentifer
представя глобален идентификатор, който е 16-байтова шестнадесетична
стойност, която би трябвало винаги да е уникална;
Образи (image) – двоични данни с променлива дължина (от 0 до 231 – 1
байта);
Текст (text и ntext) – символни низове с променлива дължина (от 0 до 231 –
1 байта), съответно от no-Unicode и Unicode данни;
В бъдеще text, ntext и image ще бъдат заменени от т.н. Large-Value типове
от данни varchar (max), nvarchar(max) и varbinary (max) ( вече са
въведени в SQL Server 2005);
Таблици (Tables) – този тип данни се представя в таблични структури;
възможно е да се съхрани таблица в колона;
Курсори (cursors). Изолзва се за променливи OUTPUT параметри на
съхранени процедури, които съдържат обръщения към курсори. Не могат
да се дефинират като тип данни за колони в таблици;
Потребителски- дефинирани типове данни.
Коментарите могат да се зададат в ред на оператора или като блок от
коментари. Коментарите в реда се отделят с двойка тирета (- -), докато
блокът с коментари (може да се състои от няколко реда) се отделя с
начални символи /* и завършва със символите */.
Променливите са елементите на езика, на които се присвояват стойности.
Могат да се използват локални и глобални променливи. Локалните променливи
имат времетраене само в пакета, докато глобалните променливи са валидни през
цялото време, докато трае сесията.
Локалните се дефинират от потребителя с оператора DECLARE, а начална
стойност им се присвоява с оператор SET или SELECT, след което могат да се
изпползват в оператор, пакет или процедура, в която са декларирани. Името на
локалната променлива се задава със знака @ в началото, а на глобалната – с @@.
Системните функции в Transact SQL могат да се използват на всякъде,
където е разрешен израз с оператора SELECT. В общия случай се разделят на три
типа:
Scalar (скаларни) – те оерират с единична стойност и връщат
единична стойност. Могат да бъдат групирани в няколко категории:
математически, статистически, за работа с низове, дата и време,
метаданни, сигурност, курсори, конфигуриране, системни.
Aggregate – (агрегатни) – оперират със съвкупност от стойности, но
връщат единична стойност.
Rowset – могат да се използват като обръщение към таблици в
операторите на езика.
Елементите на езика за управление на логиката на потока от оператори ,
използвани в скриптовете са:
BEGIN…END – блокове. Тези елементи затварят серии от оператори, така че
те се третират като едно цяло.
IF …ELSE – блокове. Тези елементи указват на SQL Server, ако условието е
вярно да изпълни първата алтернатива, а в противен случай – втората.
WHILE – конструкции. Използва се за организиране на цикли. Следващите
след WHILE оператори се изпълняват многократно, докато
специфицираното условие е истина. За да се контролира излизането от
цикъла, могат да се използват BREAK и CONTUNUE.
CASE – изрази. Използват се когато е необходимо да се сецифицират
действия при няколко различни случаи.
2. начин за изпълнение на Transact – SQL операторите
Конструкциите на Transact SQL могат да бъдат изпълнявани по един от
следните начини:
- Единични констукции;
- Динамични констукции – с помощта на директивата EXECUTE.
- Пакети – Пакетът (batch) – група от една или повече конструкции, които
се изпращат на веднъж от едно приложение към SQL Server за изълнение;
завършва с директивата GO.
- Скриптове – поредица от конструкции на Transact SQL, записани във
файл с разширение .sql.
Транзакции, съхранени процедури и тригери.
Транзакции – осигурен е контрол върху транзакциите, който дава
възможност да се управява начина, по който SQL Server ги управлява.
SQL програмистите са отговорни за стартирането и завършването на
транзакциите в точки, които налагат логическа съгласуваност на данните.
Програмистът трябва да дефинира последователността от модификации, които
оставят данните в съгласувано състояние в съответствие с бизнес правилата в
организацията. Програмистът включва тези оператори за модификация в една
транзакция така, че SQL Server Database Engine да може да наложи физически
интегритет на транзакцията.
Приложенията контролират транзакциите главно чрез задаване начало и
край на транзакцията. Това може да бъде направено, като се използват Transact
SQL оператори или API функциите за бази от данни. Системата трябва също така
коректно да управлява грешките, които прекратяват транзакцията, преди тя да
завърши.
Ако транзакцията е успешна, тя се завършва с оператора COMMIT, който
гарантира, че модификациите, направени от транзакцията са направени
постоянна част от базата от данни. COMMIT също така освобождава ресурите,
използвани от транзакцията.
Ако се появи грешка в транзакцията, или ако потребителят е решил да
канцелира транзакцията, тогава транзакцията трябва да се върне назад с
оператора ROLLBACK. Този оператор отменя всички модификации, направени от
транзакцията и връща данните в това състояние, в което те са били при
стартирането на транзакцията. ROLLBACK също така освобождава ресурсите заети
от транзакцията.
SQL Server различава няколко вида транзакции в зависимост от начина им
на стартиране:
- Явни, изрични транзакции. Всяка транзакция явно се стартира от Transact
SQL BEGIN TRANSACTION оператора или от API функция и явно завършва с
COMMIT или ROLLBACK оператор.
- Неявни, автоматично завършващи транзакции – това е режимът за
подразбиране за Database Engine. Всеки отделен Transact SQL оператор се
предава в базата от данни, когато завърши успешно. Не е необходимо да се
задават каквито и да е оператори за контролиране на транзакцията.
- Подразбиращи се транзакции – Нова заявка неявно се стартира, когато
предишната транзакция е завършила, но всяка транзакция по подразбиране
завършва с COMMIT или ROLLBACK оператор. Режим на изпълнение на
подразбиращи се транзакции се задава с API функция или с Transact SQL
оператора SET IMPLICIT_TRANSACTIONS ON.
-
34. Заявки за извличане и актуализация на данните в Transact-SQL.
Извличане на данни от релационна база от данни.Оператор SELECT
•Предназначение: извличане на данни по зададени колони и редове от една
или няколко
таблици от релационна база от данни
•Резултат: релационен набор от данни
Примери на Select: Извличане данните за клиентите от таблица
Customers
USE Northwind
SELECT * FROM Customers
Примери на Select: Извличане на кода и името на клиентите от град
Варна
SELECT CustomerId,CompanyName
FROM Customers
WHERE City like ‘%Варна%’
Извличане кода на стоката, стойността на поръчаното количество и
номера на поръчката
USE Northwind
SELECT ProductId ,UnitPrice*Quantity AS Total ,OrderId
FROM [Order Details]
ORDER BY OrderID
Частичен синтаксис на SELECT
•SELECT [ ALL | DISTINCT ]
[ TOP expression [PERCENT]]
<select_list>
[ FROM table_source
[AS table_alias] ]
[ WHERE search_condition ]
[ ORDER BY order_expression
[ ASC | DESC ][,…] ]
Клауза FROM
•Задава имена на таблиците, от които се извличат данни
[database.][schema.]table
•Чрез ключовата дума AS се задава синонимно име на таблица
table_name AS table_alias
Пример: Customers AS C
•При задаване на синонимно име на таблица ключовата дума AS може
да се изпусне
table_name table_alias
•Пример: Customers C
Специфициране на колоните, които да се върнат в резултата
•Колоните, които ще бъдат включени в резултатния набор се задават
чрез
списък за избор (select_list), съдържащ:
Колони от таблици
Константи
•Изрази
Елементи на списъка за избор
•* - всички полета от първичната таблица, ако е единствена
•table_name.* - всички полета от таблицата с посоченото име
.Customers.*
•table_alias.* - всички полета от таблицата с посоченото синонимно име
.C.*
Примери:
Примерът връща всички колони и редове от таблицата Employee от
схемата HumanResources на базата от данни AdventureWorks:
USE AdventureWorks
SELECT *
FROM
HumanResources.Employee
GO
елементи на списъка за избор
•column_name - име на колона .ProductID .[Company Name]
•table_name. column_name table_alias. column_name – уточнено име на
колона
.[Order Details].UnitPrice .Products.Cod P.Cod
Елементи на списъка за избор
•expression – израз, чиято стойност се извежда като нова колона в
резултатния набор .UnitPrice*Quantity
•‘string_literal’ – символен низ, който се извежда като нова колона в
резултатния набор
.‘Направени поръчки’
Елементи на списъка за избор
column_name AS column_alias expression AS column_alias
•Ключовата дума AS задава синонимно име на колона в резултата
.ProductId AS Cod .UnitPrice*Quantity AS Total
•column_alias=expression .Total=UnitPrice*Quantity
•column_alias=‘string_literal’ .Description=‘Направени поръчки’
Списък за избор (select list): {*
| {table_name|table_alias}.*
| column_name| expression
[AS column_alias]
| column_alias=expression
| ‘string_literal’
}
[,…]
Пример
Операторът връща колоните, съдържащи код, име, фамилия и дата на
наемане на служителите от таблицата Employee от схемата Person:
USE AdventureWorks
GO
SELECT BusinessEntityId, Title
, FirstName, LastName
FROM Person.Person
GO
Пример
USE Northwind
SELECT OrderID, ProductID
, Quantity*UnitPrice AS total
FROM [Order Details]
GO
Синтаксис (основни клаузи)
SELECT {*
| {table_name|table_alias}.*
| column_name| expression
[AS column_alias]
| column_alias=expression
| ‘string_literal’
}
[,…]
FROM table_name [AS table_alias][,…..]
[WHERE <search_condition>]
Клауза WHERE <search_condition>
•Използването на тази клауза връща в резултата определени редове от
първичните таблици: тези, които отговарят на специфицираните
условия
(search_condition)
•Релационна операция Restriction Задаване на условие за търсене
<search_condition>
•Условието за търсене може да съдържа неограничен списък от
предикати, включващи:
.Оператори за сравнение <, <=, >, >=, <>
.Логически оператори за комбинация на условия: AND и OR и
отрицание NOT
.Ключови думи като LIKE, IN, EXISTS,...
Пример
USE AdventureWorks
SELECT
SalesOrderID,SalesOrderDetailID,ProductID , OrderQty
FROM Sales.SalesOrderDetail
WHERE OrderQty>5
•Данни за поръчките в количество по-голямо от 5.
Пример
USE AdventureWorks
SELECT
SalesOrderID,SalesOrderDetailID , ProductID, OrderQty
FROM Sales.SalesOrderDetail
WHERE
OrderQty>=5 AND OrderQty <=15
Задаване на интервал от стойности
•BETWEEN n1 AND n2
USE AdventureWorks
GO
SELECT SalesOrderID,SalesOrderDetailID ,ProductID, OrderQty
FROM Sales.SalesOrderDetail
WHERE
OrderQty BETWEEN 5 AND 15
Задаване на списък от стойности:
IN (n1,n2,…)
SELECT * FROM Publishers
WHERE City IN ('Paris', 'Berlin')
•Извежда данни за издателствата отParis или Berlin
•Друг вариант:
SELECT * FROM Publishers
WHERE City = 'Paris' OR City= 'Berlin'
Особености при задаване на
условия за сравнение
•Пълно съвпадение – оператор “=“
•Непълно съвпадение - like
•Данни, които са тип char, nchar, varchar, nvarchar, text, datetime и
smalldatetime
трябва да се поставят в единични кавички
•Пример:
City = 'Paris' City like ' %Paris%'
orderdate = '08/14/1996'
Сравнение на низове с непълно съвпадение
•Оператори LIKE и NOT LIKE Изисква задаване на шаблон, с който се прави
сравнение за непълно, частично сравнение
•Пример:
SELECT * FROM dbo.Customers
WHERE City LIKE 'L%'
Символи, използвани в шаблони за сравнение с ключовата дума LIKE
(NOT LIKE)
•% - какъв да е низ от символи (нула
или няколко символа)
•_ - какъв да е единичен символ
•[] – кой да е символ, зададен в
скобите;
.Пример:LIKE '[KC]% ' – кой да е символен низ, започващ с K или C.
.LIKE '[A-F]ing '
•[^] – кой да е символ, който не е зададен в скобите; LIKE ' M[^C] '
Задаване на условие за липса или наличие на стойност •Липса на
стойност в колона –
IS NULL
USE Northwind
SELECT * FROM dbo.Customers
WHERE Region IS NULL
•Наличие на стойност - IS NOT NULL
USE Northwind
SELECT * FROM dbo.Customers
WHERE Region IS NOT NULL
Сортиране на резултата (подреждане на редовете в резултатния
набор)
•ORDER BY order_by_expression [ASC|DESC]...
.order_by_expression - име на колона или пореден номер на колоната от
списъка за избор
.Ред на сортиране – ASC или DESC
.По подразбиране сортирането е във възходящ ред (ASC)
.ORDER BY не се използва за колони с данни тип text и image
Примери
SELECT CustomerID, CompanyName, City
FROM dbo.Customers
ORDER BY City
SELECT CustomerID, CompanyName , Country, City
FROM dbo.Customers
ORDER BY City ASC, 2 ASC
Частичен синтаксис на SELECT
SELECT [ ALL|DISTINCT ] <select list>
FROM {<table_source>} [,n]
[ WHERE <search_condition> ]
[ORDER BY { <order_by_expression>
[ ASC|DESC ]} [,...n]]
Ключови думи, контролиращи резултатния набор:
•DISTINCT – елиминира дублираните редове в резултата
•ALL – включват се дублираните редове в резултата; опция по
подразбиране
•TOP n – в резултата се връщат първите n реда от резултатния набор;
ако e зададено подреждане на резултата, то се извеждат първите n
реда от сортирания резултатен набор
Примери
•Извеждане имената на градовете, от които са клиентите
SELECT DISTINCT City
FROM Customers
•Извеждане на 5-те най-скъпи продукта
USE Northwind
SELECT TOP 5
ProductID, ProductName, UnitPrice
FROM dbo.Products
ORDER BY 3 DESC
Създаване на нова таблица с резултата от SELECT
SELECT списък за избор (полета,
константи, изрази)
INTO име на новата таблица
FROM име на таблица [,…]
[WHERE критерий (условие) за
търсене]
[ORDER BY израз за подреждане
[ASC|DESC]...]
Особености при създаване на нова таблица от резултатния набор
•Ако съществува таблица със същото име, то операторът се
прекратява и се извежда съобщение
•В SQL Server създаваната таблица може да бъде постоянна или
временна
•Може да се използва при разделяне на сложни заявки в поредица от
по-прости
Пример:Създаване на нова таблица с данни за клиентите от USA USE
Northwind
/* Проверка за съществуването на таблицата */
IF EXISTS(SELECT name
FROM sysobjects
WHERE name = 'Customers_USA'
AND TYPE = 'U')
DROP TABLE dbo.Customers_USA
GO
Пример:Създаване на нова таблица с данни за клиентите от USA /*
създаване на новата таблица */
SELECT *
INTO dbo.Customers_USA
FROM dbo.Customers
WHERE Country LIKE 'USA'
Обединяване на резултатите от оператори SELECT
SELECT <select_list>….
UNION
SELECT <select_list>….
Изисквания: Резултатите от двата оператора SELECT трябва да бъдат
сравними релационни набори.
Пример:
USE Northwind
GO
SELECT ShipperID, CompanyName
FROM Shippers
UNION
SELECT SupplierID, CompanyName
FROM Suppliers
WHERE Country LIKE 'Germany'
Пример: Обединяване на резултатите от оператори SELECT в нова
таблица
USE Northwind
GO
IF EXISTS(SELECT name
FROM sysobjects
WHERE name = 'Customers_new' AND TYPE = 'U')
DROP TABLE dbo.Customers_new
GO
SELECT ShipperID, CompanyName
INTO Customers_new
FROM Shippers
UNION
SELECT SupplierID, CompanyName
FROM Suppliers
WHERE Country LIKE 'Germany'
Пресичане на резултатни набори от SELECT
•Oператор INTERSECT – изисква сравними резултатни набори от двата
оператора SELECT
•SELECT <select_list>…. INTERSECT SELECT <select_list>….
Пример:
USE Northwind
GO
SELECT ShipperID, CompanyName
FROM Customers_new
INTERSECT
SELECT SupplierID, CompanyName
FROM Suppliers
WHERE Country LIKE 'Germany'
Разлика на резултатни набори от SELECT
•Оператор EXCEPT – изисква сравними резултатни набори от двата
оператора SELECT
•SELECT <select_list>…. EXCEPT SELECT <select_list>….
Пример:
USE Northwind
GO
SELECT ShipperID, CompanyName
FROM Customers_new
UNION
SELECT SupplierID, CompanyName
FROM Suppliers
WHERE Country LIKE 'Germany'
ФУНКЦИИ
•Обобщаващи функции
•Аритметични функции
•Функции за дата и време
•Функции за работа със символи
•Конвертиращи функции
•Функции за работа с метаданни
•Други функции
Примери
•SELECT DB_NAME() AS ‘DataBase’ връща името на текущата база от
данни
Примери
SELECT 'ANSI:',
CONVERT(varchar(30),GETDATE(),102)
AS Style
SELECT 'European:',
CONVERT(varchar(30),GETDATE(),113)
AS Style1
Примери
SELECT 'ANSI:',
CONVERT(varchar(30),GETDATE(),102)
AS Style
UNION
SELECT 'European:',
CONVERT(varchar(30),GETDATE(),113)
AS Style1
Примери
•Резултат, връщан след обединяването (UNION) на резултата от двата
оператора
SELECT
Обобщаващи функции
•COUNT(*|expression|column_name) SELECT COUNT(*) AS
COUNT_Customer
FROM Customers
WHERE City LIKE 'London'
•SUM(column_name|expression)
SELECT SUM([Total])
FROM order_total
•AVG(column_name|expression)
SELECT AVG([Total])
FROM order_total
Обобщаващи функции
•MAX(column_name|expression)
•MIN(column_name|expression)
•Стандартно отклонение
STDEV(column_name)
Standard SQL
Заявки с групиране и обобщаване на данни в SQL
Клауза GROUP BY
•group_by_expression [,…]
•Клаузата GROUP BY в оператор SELECT се използва за организиране на
редовете в групи и обобщаване на данни за тези групи.
•Пример: определяне сумарното поръчано количество от всяка стока
Пример на групиране
USE Northwind
SELECT ProductID
, SUM(Quantity) AS Total_quantity
FROM [Order Details]
GROUP BY ProductID
•Кодовете на поръчаните стоки и за всяка поръчана стока сумарното
поръчано количество
Пример на групиране
SELECT TOP 5 City, COUNT(*) AS
COUNT_Customers
FROM Customers
GROUP BY City
ORDER BY 2 DESC
Особености на клаузата
GROUP BY
•Колоните, зададени в GROUP BY се обработват така, че се извличат
групи от редове, които имат една и съща стойност за тези колони
•За всяка създадена група в резултата се връща само един ред; не се
връща детайлна информация
•За всяка група чрез агрегатна функция може да се изчисли обобщена
информация
Особености на клаузата
GROUP BY
•В списъка за избор се задават всички колони, по които се прави
групиране (колоните, специфицирани в клаузата GROUP BY) и нови
колони, получавани чрез агрегатни функции.
•Не се препоръчва да се прави групиране по колони, които съдържат
неопределени стойности (Null) - те се обработват като отделна група!!!
Ограничаване на редовете,
включвани в групите
•Чрез клауза WHERE се задава условие, на което да отговарят редовете
, които ще се включат в групата
•SELECT ProductId
, SUM(Quantity) AS Total_quantity
FROM [Order Details]
WHERE
OrderId BETWEEN 10250 AND 10300
GROUP BY ProductId
Стъпки при изпълнение на SELECT
с клаузи WHERE и GROUP BY
1.От таблиците се селектират редовете, които отговарят на зададеното
чрез WHERE условие
2.Върху селектираните редове се прави групиране
3.Изчисляват се зададените обобщени стойности
4.В резултата се разполага по един ред за всяка група - стойностите на
полетата за групиране и изчислените обобщени стойности за групата
Задаване на условие за групите, които да се изведат в резултата
Клауза
HAVING <search_condition>
•В резултата се извеждат само групите, отговарящи на зададените в
HAVING условия
•В HAVING могат да се задават до 128 условия, свързани с логическите
оператори AND, OR или NOT
Пример на използване на
клауза HAVING
SELECT ProductId
, SUM(Quantity) AS Total_quantity
FROM [Order Details]
GROUP BY ProductId
HAVING
ProductID BETWEEN 1 AND 30
Пример на използване на
клауза HAVING
SELECT ProductId
, SUM(Quantity) AS Total_quantity
FROM [Order Details]
GROUP BY ProductId
HAVING SUM(Quantity)> 100
Особености при задаване на HAVING
•Условията, на които трябва да отговарят групите, показвани в
резултата могат да се задават върху .полетата за групиране
.или върху изчисляваните обобщени стойности
•Клаузата HAVING може да се използва само с клауза GROUP BY
Стъпки при изпълнение на SELECT с клауза HAVING
1.Прави се групиране по зададените колони
2.Изчисляват се обобщените стойности
3.Върху създадените групи се прилагат зададените в HAVING условия
Пример на използване на клаузи
WHERE и HAVING едновременно
SELECT ProductID
, SUM(Quantity) AS Total_quantity
FROM [Order Details]
WHERE OrderID >= 10300
GROUP BY ProductID
HAVING SUM(Quantity) > 1000
Групиране и обобщаване на данни от свързани таблици
•При свързване на таблици е възможно да се зададе групиране по
колони от едната таблица и обобщаване на данни върху колони от
свързаната таблица.
Пример:
•Справка, съдържаща код и име на продукта, брой поръчки,сумарно
поръчано количество, средна цена и обща стойност на всички поръчки
за всеки поръчан продукт
SELECT P.ProductID, P.ProductName
, COUNT(OD.ProductID) AS Count_Orders
, SUM(Quantity) SUM_Quantity
, AVG(OD.UnitPrice) Average_Price
, SUM(OD.UnitPrice*Quantity) AS Total
FROM Products P INNER JOIN
[Order Details] OD
ON P.ProductID = OD.ProductID
GROUP BY P.ProductID, P.ProductName
ORDER BY .ProductID
Пример:
•Да се изведат данни (код и име на клиента, брой поръчки и обща
стойност на поръчките) за 5-те клиента, които са донесли най-големи
приходи за фирмата.
SELECT TOP 5 C.CustomerID,
C.CompanyName
, COUNT(O.OrderID) AS Count_Orders
, SUM(OD.UnitPrice*Quantity) AS Total
FROM Customers C INNER JOIN Orders O
ON C.CustomerID = O.CustomerID
INNER JOIN [Order Details]OD
ON O.OrderID = OD.OrderID
GROUP BY C.CustomerID, C.CompanyName
ORDER BY 4 DESC
Пример:
•Да се изведат данни (код и име на клиента, брой поръчки и обща
стойност на поръчките, дял в общите приходи) за 5-те клиента, които
са донесли най-големи приходи за фирмата и какъв е тяхния дял в
общите приходи.
SELECT TOP 5 C.CustomerID, C.CompanyName
, COUNT(O.OrderID) AS Count_Orders
, SUM(OD.UnitPrice*Quantity) AS Total
, SUM(OD.UnitPrice*Quantity)/
(SELECT SUM(UnitPrice*Quantity)
FROM [Order Details])*100 AS Total_Percent
FROM Customers C INNER JOIN Orders O
ON C.CustomerID = O.CustomerID
INNER JOIN [Order Details]OD
ON O.OrderID = OD.OrderID
GROUP BY C.CustomerID, C.CompanyName
ORDER BY 4 DESC
Използване на клаузa COMPUTE
•SELECT productid, orderid, quantity
FROM [order details]
ORDER BY productid, orderid
COMPUTE sum(quantity)
•Генерира се допълнителен сумарен ред от данни
•Резултатът е таблица от не-релационен формат. Тази клауза липсва в
ANSI стандарта.
Използване на клаузa COMPUTE …BY...
•SELECT productid, orderid, quantity
FROM [order details]
ORDER BY productid, orderid
COMPUTE sum(quantity) BY productid
COMPUTE sum(quantity)
•Генерира допълнителен обобщен ред от данни за колоната зададена
след COMPUTE …BY.. при смяна на групата
Използване на клауза GROUP BY с оператор ROLLUP
•Операторът ROLLUP генерира резултат, който съдържа:
.обобщен ред (totals) за целия резултатен набор;
.обобщени редове (subtotals) за всяка група;
.детайлни редове.
•В обобщените редове колоните, по които се прави групиране
съдържат или стойността
на групата или NULL
•ROLLUP генерира резултатния набор, показвайки обобщенията в
йерархията на
колоните, зададени за групиране
•Резултатният набор е в релационен формат
Пример на GROUP BY с оператор
ROLLUP
SELECT ProductId, OrderId,
SUM(Quantity) AS Total
FROM [Order Details]
GROUP BY ProductId, OrderId
WITH ROLLUP
ORDER BY ProductId, OrderId
Пример на GROUP BY с оператор
ROLLUP
•Резултатът ще съдържа
.Обобщен ред за всички стоки във всички поръчки
.За всяка стока
•Обобщен ред за сумарно поръчаното количество във всички поръчки
•детайлни редове - поръчаното количество от стоката във всяка
поръчка за нея,
•Обобщени редове се извеждат при смяна на групата.
•Обобщените редове съдържат групата и стойности NULL в колоните
за групиране
Пример на използване на клауза
GROUP BY с оператор CUBE
SELECT ProductId, OrderId
, SUM(Quantity) AS Total
FROM [Order Details]
GROUP BY ProductId, OrderId
WITH CUBE
ORDER BY ProductId, OrderId
•CUBE генерира резултатен набор, показвайки обобщения за всички
възможни
комбинации на стойностите в селектираните колони - 2n-1
•NULL в резултатния набор индикира, че редовете са обобщения и са
създадени от
CUBE
SELECT ProductId, OrderId , SUM(Quantity) AS Total
FROM [Order Details]
GROUP BY ProductId, OrderId
WITH CUBE
ORDER BY ProductId, OrderId
МОДИФИЦИРАНЕ НА
ДАННИТЕ
Insert-добавяне на редове в таблици
Delete-изтриване на редове в таблици
Update-обновяване на данните
Добавяне на редове втаблици
•Синтаксис на оператора
•Примери
•Особености при използването на Insert
•Добавяне на стойности по подразбиране
•Добавяне на редове, получени като резултат от SELECTСинтаксис на
оператора Insert
INSERT [INTO]
{table_name|view_name}
[(column_list)]
{VALUES({DEFAULT
|NULL |expression}[,….])
|DEFAULT VALUES
Пример на Insert
INSERT INTO[Order Details]
(OrderId, ProductId, UnitPrice, Quantity, Discount)
VALUES(10500,5,25.5,125,0.05)
INSERT dbo.Customers(CustomerID, CompanyName)
VALUES(65432,'Triada')
,(76543,'Microaccount')
Някои правила при използванена Insert
•В списъка се задават имената на колоните, които ще приемат стойности.
•Ако всички колони ще приемат стойности, то задаването на списъка е по
желание.
•В клаузата VALUES се задават стойности за всяка колона от приемащия
списък ; между двата списъка трябва да има съответствие в
последователността и типа на елементите от данни.
•При добавянето на новите данни, ако се наруши интегритетът на данните,
операторът се
отменя!!!
Ключова думаDefault
Добавя стойността по подразбиране за специфицираните колони
•Ако колоната, за която се използва DEFAULT няма зададена стойност по
подразбиране и разрешава
неопределена стойност, то се добавя стойност NULL
•Ако колоната, за която се използва DEFAULT няма зададена стойност по
подразбиранеили не разрешава Nullстойности, то INSERT операторът се
отменя
Пример на използване на DEFAULT
•В таблицата Order Details се добавя нов ред за поръчка номер 10500,
продукт с код 25 на цена 25.5 в
количество 1 (зададено по подразбиране) и търговска отстъпка 5%
INSERT[Order Details]
VALUES(10500, 25, 25.5, DEFAULT, 0.05)
Добавяне на редове, получени като
резултат от SELECT
.INSERT table_name[(column_list)]
(SELECT column_list
FROM table_list
[WHERE search_conditions]
[GROUP BY…[ORDER BY..])
пример:
.Служителите са и клиенти
.Кодът на клиента-служител се образува от първите два символа на първото
име (fname)и първите два символа от последното име на служителя (lname)
.Имената на служителя са име на фирмата
.Градът, адресът и домашният телефон стават данни за фирмата
.Останалите колони за служителя остават празни (с неопределена стойност)
Оператор INSERTза примера
INSERT Customers (CustomerID, CompanyName, City, Address, Phone)
(SELECT substring(FirstName, 1, 2) + substring(LastName, 1, 2)
, FirstName+ ' ' + LastName, City, Address, HomephoneFROM Employees)
/* list new Customers */
SELECT * FROM Customers
WHERE ContactTitleIs Null
Изтриване на редове от таблици
.Оператор DELETE
.Действие
.Особености
.Ограничаване броя на изтриваните редове
.Изтриване на редове от таблица въз основа на други таблици
•Оператор TRUNCATE TABLE DELETE
•DELETE[FROM] {table_name|view_name}
•Използва се за премахване на един или повече редовеот таблица.Всеки изтрит
ред се съхранява в
системния дневник (дневник на транзакциите-log file)
.Чрез клауза WHEREсе ограничава броят на изтриваните редове
Оператор DELETEс клауза WHERE
•Синтаксис:
DELETE[FROM]
{table_name|view_name}
WHEREsearch_conditions
•Пример: Изтриване на поръчката с номер 10500 за продукт с код 5
DELETE FROM [order details]
WHERE productid=5 AND
orderid=10500
Пример на оператор DELETE
•Изтриване на всички поръчки, които са направени преди повече от 3месеца
DELETE FROM Orders
WHERE
DATEDIFF(Month, OrderDate, GetDate())>3
--DATEDIFF (datepart,startdate,enddate) –изчислява разликата между двете дати в
години,
четиримесечия, месеци, дни, седмици,...
Datepart: year, quarter, month, day, week,…
Изтриване на редове от таблица въз основа на условие върху други таблици
•Редове от дадена таблица могат да се изтриват въз основа на условие, поставено
върху колони от друга (свързана) таблица
•В този случай в DELETE се използва втора клауза FROM, в която се задава
съединяване с другата таблица, за която с WHERE се задава условието
Използване на
допълнителна клаузаFROM
.DELETE [FROM] table_name[FROM <table_source> [,…n]]
[WHERE search_conditions]
.Първата клауза FROMиндикира таблицата, в която се правят промени
.Втората клауза FROMспецифицира ограничаващ критерий за оператораDELETE
ПримернаизползваненаDELETEсдопълнителнаклаузаFROM
•Изтриване на всички редове от таблицата Order Details, които са за поръчки,
направени на определена дата (12/10/2002)
USE Northwind
GO
DELETE FROM [Order details]
FROM Orders
WHERE OrderDate= '12/10/2002'
Вариант с JOIN
DELETE FROM[Order details]
FROMOrders OINNER JOIN[Order details]OD
ONO.OrderID= OD.OrderID
WHEREOrderDate=12/10/2002
Използване на подзаявка в WHERE клаузата на DELETE
Пример:
DELETE FROM[Order details]
WHERE OrderIDIN
(SELECT OrderIDFROM OrdersWHERE OrderDate= '12/1/2011')
Оператор TRUNCATE TABLE
•Синтаксис:TRUNCATE TABLE[[database.]owner]table_name
•Изтриват се всички редове от таблицата, но се запазва структурата и и
асоциираните с нея обекти
•Изтритите редове не се записват в дневника на транзакциите
•Изпълнявасе по бързо от DELETE
•Ако има колона IDENTIFYначалната и стойност се възстановява
Обновяване на данниОператор UPDATE
Синтаксис:
UPDATE{table_name|view_name}
SET {column_name=expression
|DEFAULT |NULL}
|@variable=expression}[,….]
WHERE {search_conditions}
Пример:UPDATE Products
SET UnitPrice= (UnitPrice*1.1)
Особености на обновяването сUPDATE
•Ключовата думаSETспецифицира новите данни
•Входните данни трябва да са от същия тип като колоните, които се обновяват
•SQL Server не обновява редовете, които нарушават ограниченията за интегритет
•Клауза WHERE специфицира редовете, в които се прави промяна
•С един оператор се обновява само една таблица
Препоръки за ускоряване на обновяването
•Използвайте само положителни условия за търсене, т.е. не използвайте NOT
IN,NOT
BETWEEN, NOT NULLи т.н.
•Избягвайте използването на LIKE
•Използвайте точно съвпадение или интервали
•Клаузата ORDER BY забавя обръщението към данните Обновяване, основано на
други
таблици
•В UPDATE се използва .втора клауза FROMс JOIN на обновяваната таблица с
таблицата, за
която се задава условието или .подзаявкa в клаузата WHERE; тя се изпълнява по
веднъж за всеки ред от таблицата, която се обновява, като за всеки ред се връща
единична стойност
•Даден ред се обновява само веднъж Обновяване, основано на други
таблициUPDATE{table_name|
view_name}
SET {column_name={expression
|DEFAULT |NULL}
| @variable= expression}[,…n]
[FROM <table_source>….]
[WHERE search_conditions]
Пример
•Обновяване на таблицата Products чрез увеличаване с 2% цената на всички
продуктиот категория Seafood
USE Northwind
UPDATE Products
SET UnitPrice=UnitPrice*1.02
FROM Products PR INNER JOIN Categories G
ON PR.CategoryID=G.CategoryID
WHERE G.CategoryName= 'Seafood'
Пример на UPDATE с използване на подзаявка
•Обновяване на таблицата Products чрез намаляване с 2% цената на всички
продуктиот категория
Seafood
USE Northwind
UPDATE Products
SET UnitPrice=UnitPrice*0.98
WHERE CategoryID=
(SELECT CategoryIDFROM CategoriesWHERE CategoryName='Seafood')
Пример на UPDATE с използване на корелационна подзаявка
•Обновяване на колона total в таблицатаOrders със сумарната стойност на
поръчаните стоки за
всяка поръчка
UPDATE Orders
SET Total = (SELECT
SUM(UnitPrice*Quantity)
FROM [Order Details] OD
WHEREOrders.OrderID=OD.OrderID)Добавяне на редове втаблици
•Синтаксис на оператора
•Примери
•Особености при използването на Insert
•Добавяне на стойности по подразбиране
•Добавяне на редове, получени като резултат от SELECTСинтаксис на оператора
Insert
INSERT [INTO]{table_name|view_name} [(column_list)]{VALUES({DEFAULT |NULL
|expression}[,….])|DEFAULT VALUES
Пример на Insert
INSERT INTO[Order Details](OrderId, ProductId, UnitPrice, Quantity,
Discount)VALUES(10500,5,25.5,125,0.05)
INSERT dbo.Customers(CustomerID, CompanyName)
VALUES(65432,'Triada'),(76543,'Microaccount')Някои правила при използванена
Insert
•В списъка се задават имената на колоните, които ще приемат стойности.•Ако
всички колони ще приемат стойности, то задаването на списъка е по желание.
В клаузата VALUES се задават стойности за всяка колона от приемащия списък ;
между двата списъка трябва да има съответствие в последователността и типа на
елементите от данни.•При добавянето на новите данни, ако се наруши
интегритетът на данните, операторът се отменя!!!
Ключова думаDefault
•Добавя стойността по подразбиране за специфицираните колони
•Ако колоната, за която се използва DEFAULT няма зададена стойност по
подразбиране и разрешава неопределена стойност, то се добавя стойност NULL
•Ако колоната, за която се използва DEFAULT няма зададена стойност по
подразбиранеили не разрешава Nullстойности, то INSERT операторът се
отменя.Пример на използване на DEFAULT
•В таблицата Order Details се добавя нов ред за поръчка номер 10500, продукт с
код 25 на цена 25.5 в количество 1 (зададено по подразбиране) и търговска
отстъпка 5%•INSERT[Order Details] VALUES(10500, 25, 25.5, DEFAULT,
0.05)Добавяне на редове, получени като резултат от SELECTINSERT
table_name[(column_list)](SELECT column_list FROM table_list [WHERE
search_conditions][GROUP BY…[ORDER BY..])
Пример:Служителите са и клиенти Кодът на клиента-служител се образува от
първите два символа на първото име (fname)и първите два символа от
последното име на служителя (lname)Имената на служителя са име на фирмата
Градът, адресът и домашният телефон стават данни за фирмата
Останалите колони за служителя остават празни (с неопределена стойност)
Оператор INSERTза примера
INSERT Customers (CustomerID, CompanyName, City, Address, Phone)(SELECT
substring(FirstName, 1, 2) + substring(LastName, 1, 2), FirstName+ ' ' + LastName, City,
Address, HomephoneFROM Employees)
/* list new Customers */
SELECT * FROM Customers WHERE ContactTitleIs Null
Изтриване на редове от таблици
Оператор DELETE
Действие
Особености
Ограничаване броя на изтриваните редове
Изтриване на редове от таблица въз основа на други таблици
•Оператор TRUNCATE TABLE
Оператор DELETE
•DELETE[FROM] {table_name|view_name}
•Използва се за премахване на един или повече редовеот таблица
Всеки изтрит ред се съхранява в системния дневник (дневник на транзакциите-
log file)
Чрез клауза WHEREсе ограничава броят на изтриваните редове
Оператор DELETEс клауза WHERE
•Синтаксис:DELETE[FROM] {table_name|view_name}WHEREsearch_conditions
•Пример: Изтриване на поръчката с номер 10500 за продукт с код 5
DELETE FROM [order details]WHERE productid=5 AND orderid=10500
Пример на оператор DELETE
•Изтриване на всички поръчки, които са направени преди повече от 3месеца
DELETE FROM Orders
WHERE
DATEDIFF(Month, OrderDate, GetDate())>3
--DATEDIFF (datepart,startdate,enddate) –изчислява разликата между двете дати в
години, четиримесечия, месеци, дни, седмици,...
Datepart: year, quarter, month, day, week,…
Изтриване на редове от таблица въз основа на условие върху други таблици
•Редове от дадена таблица могат да се изтриват въз основа на условие, поставено
върху колони от друга (свързана) таблица
•В този случай в DELETE се използва втора клауза FROM, в която се задава
съединяване с другата таблица, за която с WHERE се задава условието
Използване на допълнителна клаузаFROM
DELETE [FROM] table_name[FROM <table_source> [,…n]][WHERE search_conditions]
Първата клауза FROMиндикира таблицата, в която се правят промениВтората
клауза FROMспецифицира ограничаващ критерий за оператораDELETE
ПримернаизползваненаDELETEсдопълнителнаклаузаFROM
•Изтриване на всички редове от таблицата Order Details, които са за поръчки,
направени на определена дата (12/10/2002)
USE Northwind
GO
DELETE FROM [Order details]
FROM Orders
WHERE OrderDate= '12/10/2002'
Вариант с JOIN
DELETE FROM[Order details]
FROMOrders OINNER JOIN[Order details]OD
ONO.OrderID= OD.OrderID
WHEREOrderDate=12/10/2002
Използване на подзаявка в WHERE клаузата на DELETE
Пример:
DELETE FROM[Order details]
WHERE OrderIDIN
(SELECT OrderID
FROM Orders
WHERE OrderDate= '12/1/2011')
Оператор TRUNCATE TABLE
•Синтаксис:TRUNCATE TABLE[[database.]owner]table_name
•Изтриват се всички редове от таблицата, но се запазва структурата и и
асоциираните с нея обекти
•Изтритите редове не се записват в дневника на транзакциите
•Изпълнявасе по бързо от DELETE
•Ако има колона IDENTIFYначалната и стойност се възстановява
Обновяване на данниОператор UPDATE
Синтаксис:
UPDATE{table_name|view_name}
SET {column_name=expression
|DEFAULT |NULL}
|@variable=expression}[,….]
WHERE {search_conditions}
Пример:UPDATE Products
SET UnitPrice= (UnitPrice*1.1)
Особености на обновяването сUPDATE
•Ключовата думаSETспецифицира новите данни
•Входните данни трябва да са от същия тип като колоните, които се обновяват
•SQL Server не обновява редовете, които нарушават ограниченията за интегритет
•Клауза WHERE специфицира редовете, в които се прави промяна
•С един оператор се обновява само една таблица
Препоръки за ускоряване на обновяването
•Използвайте само положителни условия за търсене, т.е. не използвайте NOT
IN,NOT BETWEEN, NOT NULLи т.н.
•Избягвайте използването на LIKE
•Използвайте точно съвпадение или интервали
•Клаузата ORDER BY забавя обръщението към данните
Обновяване, основано на други таблици
•В UPDATE се използва
втора клауза FROMс JOIN на обновяваната таблица с таблицата, за която се
задава условието
или
подзаявкa в клаузата WHERE; тя се изпълнява по веднъж за всеки ред от
таблицата, която се обновява, като за всеки ред се връща единична стойност
•Даден ред се обновява само веднъж Обновяване, основано на други таблици
UPDATE{table_name|view_name}
SET {column_name={expression
|DEFAULT |NULL}
| @variable= expression}[,…n]
[FROM <table_source>….]
[WHERE search_conditions]Пример
•Обновяване на таблицата Products чрез увеличаване с 2% цената на всички
продуктиот категория Seafood
USE Northwind
UPDATE Products
SET UnitPrice=UnitPrice*1.02
FROM Products PR INNER JOIN Categories G
ON PR.CategoryID=G.CategoryID
WHERE G.CategoryName= 'Seafood'
Пример на UPDATE с използване на подзаявка
•Обновяване на таблицата Products чрез намаляване с 2% цената на всички
продуктиот категория Seafood
USE Northwind
UPDATE Products
SET UnitPrice=UnitPrice*0.98
WHERE CategoryID=
(SELECT CategoryIDFROM Categories
WHERE CategoryName='Seafood')
Пример на UPDATE с използване на корелационна подзаявка
•Обновяване на колона total в таблицатаOrders със сумарната стойност на
поръчаните стоки за всяка поръчка
UPDATE Orders
SET Total = (SELECT SUM(UnitPrice*Quantity)
FROM [Order Details] OD
WHEREOrders.OrderID=OD.OrderID)

More Related Content

Similar to Tema13

Курс по програмиране на C# 2013 - 1. Въведение в компютърното програмиране и C#
Курс по програмиране на C# 2013 - 1. Въведение в компютърното програмиране и C#Курс по програмиране на C# 2013 - 1. Въведение в компютърното програмиране и C#
Курс по програмиране на C# 2013 - 1. Въведение в компютърното програмиране и C#DAVID Academy
 
Nakov - RDBMS Systems - Intro
Nakov - RDBMS Systems - IntroNakov - RDBMS Systems - Intro
Nakov - RDBMS Systems - IntroSvetlin Nakov
 
Курс по информационни технологии (2013) - 3. ADO.NET, LINQ to SQL
Курс по информационни технологии (2013) - 3. ADO.NET, LINQ to SQLКурс по информационни технологии (2013) - 3. ADO.NET, LINQ to SQL
Курс по информационни технологии (2013) - 3. ADO.NET, LINQ to SQLDAVID Academy
 
WindowsAzure&amp;NoSQL@SQLSaturday#152
WindowsAzure&amp;NoSQL@SQLSaturday#152WindowsAzure&amp;NoSQL@SQLSaturday#152
WindowsAzure&amp;NoSQL@SQLSaturday#152Miroslav Lessev
 
5. vb promenlivi
5. vb promenlivi5. vb promenlivi
5. vb promenlividnaidenowa
 
FABRIQ - Short - Svetlin Nakov
FABRIQ - Short - Svetlin NakovFABRIQ - Short - Svetlin Nakov
FABRIQ - Short - Svetlin NakovSvetlin Nakov
 
1. въведение в ms access
1. въведение в ms access1. въведение в ms access
1. въведение в ms accessdnaidenowa
 
15.характеристика на cisc инструкции
15.характеристика на cisc инструкции15.характеристика на cisc инструкции
15.характеристика на cisc инструкцииdnaidenowa
 
2022 TurnovoConf MySQL за начинаещи.pptx
2022 TurnovoConf MySQL за начинаещи.pptx2022 TurnovoConf MySQL за начинаещи.pptx
2022 TurnovoConf MySQL за начинаещи.pptxGeorgi Kodinov
 
High Quality Code Introduction
High Quality Code IntroductionHigh Quality Code Introduction
High Quality Code IntroductionSvetlin Nakov
 
Nakov High Quality Code
Nakov High Quality CodeNakov High Quality Code
Nakov High Quality CodeSvetlin Nakov
 
Konspekt prilojen mrejovi-software-12kl
Konspekt prilojen mrejovi-software-12klKonspekt prilojen mrejovi-software-12kl
Konspekt prilojen mrejovi-software-12klIvan Peev
 
Nakov - .NET Framework Overview + Security
Nakov - .NET Framework Overview +  SecurityNakov - .NET Framework Overview +  Security
Nakov - .NET Framework Overview + SecuritySvetlin Nakov
 
Училищен курс по програмиране на C# (2013/2014), занятие №1
Училищен курс по програмиране на C# (2013/2014), занятие №1Училищен курс по програмиране на C# (2013/2014), занятие №1
Училищен курс по програмиране на C# (2013/2014), занятие №1DAVID Academy
 
Svetlin Nakov - .NET Framework Overview
Svetlin Nakov - .NET Framework OverviewSvetlin Nakov - .NET Framework Overview
Svetlin Nakov - .NET Framework OverviewSvetlin Nakov
 
Sdn nfv мрежова виртуализация
Sdn nfv мрежова виртуализацияSdn nfv мрежова виртуализация
Sdn nfv мрежова виртуализацияmartin.ivanov
 
FABRIQ - Presentation Nakov 0.8
FABRIQ - Presentation Nakov 0.8FABRIQ - Presentation Nakov 0.8
FABRIQ - Presentation Nakov 0.8Svetlin Nakov
 
Курс по програмиране за напреднали (2012) - 1. Обектно-ориентирано програмира...
Курс по програмиране за напреднали (2012) - 1. Обектно-ориентирано програмира...Курс по програмиране за напреднали (2012) - 1. Обектно-ориентирано програмира...
Курс по програмиране за напреднали (2012) - 1. Обектно-ориентирано програмира...DAVID Academy
 

Similar to Tema13 (20)

Курс по програмиране на C# 2013 - 1. Въведение в компютърното програмиране и C#
Курс по програмиране на C# 2013 - 1. Въведение в компютърното програмиране и C#Курс по програмиране на C# 2013 - 1. Въведение в компютърното програмиране и C#
Курс по програмиране на C# 2013 - 1. Въведение в компютърното програмиране и C#
 
Nakov - RDBMS Systems - Intro
Nakov - RDBMS Systems - IntroNakov - RDBMS Systems - Intro
Nakov - RDBMS Systems - Intro
 
Курс по информационни технологии (2013) - 3. ADO.NET, LINQ to SQL
Курс по информационни технологии (2013) - 3. ADO.NET, LINQ to SQLКурс по информационни технологии (2013) - 3. ADO.NET, LINQ to SQL
Курс по информационни технологии (2013) - 3. ADO.NET, LINQ to SQL
 
WindowsAzure&amp;NoSQL@SQLSaturday#152
WindowsAzure&amp;NoSQL@SQLSaturday#152WindowsAzure&amp;NoSQL@SQLSaturday#152
WindowsAzure&amp;NoSQL@SQLSaturday#152
 
5. vb promenlivi
5. vb promenlivi5. vb promenlivi
5. vb promenlivi
 
FABRIQ - Short - Svetlin Nakov
FABRIQ - Short - Svetlin NakovFABRIQ - Short - Svetlin Nakov
FABRIQ - Short - Svetlin Nakov
 
1. въведение в ms access
1. въведение в ms access1. въведение в ms access
1. въведение в ms access
 
15.характеристика на cisc инструкции
15.характеристика на cisc инструкции15.характеристика на cisc инструкции
15.характеристика на cisc инструкции
 
2022 TurnovoConf MySQL за начинаещи.pptx
2022 TurnovoConf MySQL за начинаещи.pptx2022 TurnovoConf MySQL за начинаещи.pptx
2022 TurnovoConf MySQL за начинаещи.pptx
 
Introduction to-RDBMS-systems
Introduction to-RDBMS-systemsIntroduction to-RDBMS-systems
Introduction to-RDBMS-systems
 
2 bd project
2 bd project2 bd project
2 bd project
 
High Quality Code Introduction
High Quality Code IntroductionHigh Quality Code Introduction
High Quality Code Introduction
 
Nakov High Quality Code
Nakov High Quality CodeNakov High Quality Code
Nakov High Quality Code
 
Konspekt prilojen mrejovi-software-12kl
Konspekt prilojen mrejovi-software-12klKonspekt prilojen mrejovi-software-12kl
Konspekt prilojen mrejovi-software-12kl
 
Nakov - .NET Framework Overview + Security
Nakov - .NET Framework Overview +  SecurityNakov - .NET Framework Overview +  Security
Nakov - .NET Framework Overview + Security
 
Училищен курс по програмиране на C# (2013/2014), занятие №1
Училищен курс по програмиране на C# (2013/2014), занятие №1Училищен курс по програмиране на C# (2013/2014), занятие №1
Училищен курс по програмиране на C# (2013/2014), занятие №1
 
Svetlin Nakov - .NET Framework Overview
Svetlin Nakov - .NET Framework OverviewSvetlin Nakov - .NET Framework Overview
Svetlin Nakov - .NET Framework Overview
 
Sdn nfv мрежова виртуализация
Sdn nfv мрежова виртуализацияSdn nfv мрежова виртуализация
Sdn nfv мрежова виртуализация
 
FABRIQ - Presentation Nakov 0.8
FABRIQ - Presentation Nakov 0.8FABRIQ - Presentation Nakov 0.8
FABRIQ - Presentation Nakov 0.8
 
Курс по програмиране за напреднали (2012) - 1. Обектно-ориентирано програмира...
Курс по програмиране за напреднали (2012) - 1. Обектно-ориентирано програмира...Курс по програмиране за напреднали (2012) - 1. Обектно-ориентирано програмира...
Курс по програмиране за напреднали (2012) - 1. Обектно-ориентирано програмира...
 

Tema13

  • 1. Тема 13 33. SQL. Стандарти и реализации на SQL. Transact-SQL - DCL, DDL, DML оператори; управление на потока от оператори; пакети, скриптове, съхранени процедури и тригери. Език SQL. Версии и реализации на SQL. SQL е стандартен език, използван за манипулиране и извличане на данни от релационни бази от данни върху различни хардуерни платформи. През 1974 г. Donald Chamberlin от изледователскта лаборотирия на IBM в Сан Хосе предлага спецификация на релационен език, наречен SEQUEL (Structured English Query Languages). 1976 – 1977 е разработена нова версия SEQUEL/2 и тя приема окончателното име SQL. През 1979 фирмата Relation Software Inc (сега ORACLE Corp.) пуска релационна система, основана на SQL, която в резултат на развитието си става една от доминиращите индустриални системи ORACLE. Разработени са версиите SQL86 и SQL89, не те са били не пълни по отношение на фнкционалните си възможности, поради което разработчиците на индустриални системи продължават да внасят разширения в стандарта. През 1987 г. Започва работа върху върху развитие на SQL и през 1992г се приема стандарта SQL92 SQL като стандартен език за релационни БД позволява на потребителя (програмист, администратор, краен потребител с добра компютърна подготовка) да извършва следните неща: Създаване и изпълнение на заявки за извличане на данни от таблици на база от данни по различни критерии; Обновяване на съдържанието на базата от данни; Създаване и модифициране структурата на базата от данни – създаване на нови таблици, промяна структурата на таблиците, изтриване на таблици; Поддържане на спомагателни данни (създаване, актуализация и изтриване на индекси); Поддържане на сигурността на базата от данни (защита на базата от данни и определяне на различни права за достъп за различните потребители. Стандартът SQL -92 по радикален начин разширява функционалните възможности на своя предшественик, като включва такива разширения, които вече са реализирани в редица индустриални SQL системи, но липсват в SQL-89. Той предлага следните нови и разширени възможности: Манипулиране с таблиците – в допълнение към оператора за създаване на таблици са добавени и оператори за модифициране и премахване на таблици. Дефиниране на домейни, които могат да се използват като тип на данни за колоните в таблиците. Нови типове данни като DATE, TIME, BIT, NATIONAL, CHARACTER. Нова променлива за състоянието SQLSTATE, предоставяща много повече диагностична информация. Нови функции като TRIM за премахване на празни позиции от началото и в края на символен низ.
  • 2. Скролируеми курсори. Чрез тях SQL се осигурява възможността за показване и движение от ред към ред в резултатния набор, получни при извличане на данни с оператора SELECT. Информационна схема(INFORMATION_SCHEME), която осигурява формални методи за обработка на метаданни. Транзакции – направени са малки промени в синтаксиса на използваните оператори. Безопасност – добавени са възможности за отмяна на правата за достъп, както и разрешение за предаването на привилегии от един потребител към друг. Временни таблици – могат да се използват за съхраняване на междинни резултати; явното поддържане на временни таблици позволява да се съкратят разходите по поддържане на постоянни таблици. SQL е стандарт на език за мрежови заявки чрез различни хардуерни и софтуерни платформи. SQL – сървърите се изпълняват върху файл – сървърите на локални мрежи, миникомпютри и големи машини. В SQL92 могат да бъдат отделени 3 нива на езика: 1. Базов SQL – това ниво е построено по такъв начин, че твърде много прилича на SQL89 с някои неголеми различия като нови интерфейси за езиците за програмиране ADA, C, MUMPS, роменлива за състоянието SQLSTATE и др. 2. Междинен SQL. Построен е така, че да обхваща половината от различията между SQL89 и SQL29 и включва динамични SQL оператори, оператори за манипулиране със схема, поддържане на домейни и др. 3. Пълен SQL.Това е пълният стадарт на SQL92. В него се включва отложената проверка на ограниченията за цялостност на данните, оператори за обновяване и изтриване, в които в условията за търсене се използват колони от таблици-операнди, позициониране на курсор, временни таблици и други разширени възможности. 1. Transact - SQL – DCL, DDL, DML оператори; управление на потока от оператори Transact – SQL е разширение на стандартите на SQL, дефинирани от ANSI и ISO (Transact SQL за SQL Server 2000 и 2005 е разширение на Entry Level SQL- 92), който включва възможности за дефиниране, манипулиране и администриране на релационни бази от данни, управлявани от MICROSOFT SQL Server. Инструментите на MICROSOFT SQL Server за използване Transact SQL зависят от версията: MICROSOFT SQL Server 2000 – графичен потребителски интерфейс SQL Query Analyzer и помощни програми, изпълнявани от командния промпт – isqlw, isql, osql; MICROSOFT SQL Server 2005, 2008 – SQL Server Management Studio е интегриран, развоен инструмент за писане на Transact – SQL, MDX, XML, SQL Server Mobile Edition заявки и SQLCMD команди. В Transact SQL функционално се включват:  Data Definition Language (DDL) засъздаване и модифициране на обектите на базата от данни.  Data Manipulation Language (DML) за извличане и модифициране на данни.
  • 3.  Data Control Language (DCL) за установяване на права за достъп до базата от данни  Доълнителни елементи Езикът за дефиниране на данните DLL включва 3 основни конструкции за: Дефиниране (създаване) на обекти (база от данни, таблици, индекси, изгледи, съхранени процедури, тригери) и техните свойства CREATE име_на_обект; Модифициране дефиницията на обектите – ALTER име_на_обект; Премахване дефиницията на обект – DROP име_на_обект; Езикът за контрол на данните DCL включва: Даване на права (разрешения, позволения) на потребителите за достъп до базата от данни GRANT; Премахване на предоставени или отказани права REVOKE; Отказване на права DENY. Езикът за манипулиране с данните DML включва: Извличане на данни от таблици – SELECT; Вмъкване на нови редове с данни в таблици- INSERT; Обновяване на съществуващи данни - UPDATE; Премахване на редове от таблицата – DELETE. Операторите, които се използват за създаване на изрази, са: Аритметични: +,-, *, /, % (деление по модул) За сравнение: =, >, >=,<, <=, <>; Конкатенация (слепване) на символни низове: +; Логически: NOT, AND, OR; Групиране на изрази: (). Изразите, които са комбинирани от константи, променливи и колони, свързани с оператори, връщат като резултат единична стойност,чиито тип зависи от елементите, които ги съставят. Примери: Quantity*Price – връща число; ‘Varna’ + ‘University’- връща текст; A>5 AND A<15 – връща логическа стойност; Типове данни ограничават типа на стойностите, които могат да се съхраняват в базата от данни. Типовете данни са атрибутите, които специфицират типа на информацята, която може да бъде съхранявана в колона, параметър или променлива. Основните типове данни са: Числа – цели числа (int, tinyint, smallint, bigint) , десетични числа(numeric,decimal,money, smallmoney) , числа с плаваща точка (float, real); Дати – два типа дати и време: date с точност 0,333 милисекунди smalldatetime с точност интервал 1 минута; Символни низове – символни низове с фиксирана дължина: char и nchar и с променлива дължина: varchar и nvarchar; char и varchar са символни низове в no-Unicode, а nchar и nvarchar – Unicode; Двоични – третират се като двоични стойности; включват binary,varbinary, bit и rowversion (индикира специална 8-битова двоична стойност, която е уникална в базата от данни);
  • 4. Уникални идентификатори – специалният тип данни uniqueidentifer представя глобален идентификатор, който е 16-байтова шестнадесетична стойност, която би трябвало винаги да е уникална; Образи (image) – двоични данни с променлива дължина (от 0 до 231 – 1 байта); Текст (text и ntext) – символни низове с променлива дължина (от 0 до 231 – 1 байта), съответно от no-Unicode и Unicode данни; В бъдеще text, ntext и image ще бъдат заменени от т.н. Large-Value типове от данни varchar (max), nvarchar(max) и varbinary (max) ( вече са въведени в SQL Server 2005); Таблици (Tables) – този тип данни се представя в таблични структури; възможно е да се съхрани таблица в колона; Курсори (cursors). Изолзва се за променливи OUTPUT параметри на съхранени процедури, които съдържат обръщения към курсори. Не могат да се дефинират като тип данни за колони в таблици; Потребителски- дефинирани типове данни. Коментарите могат да се зададат в ред на оператора или като блок от коментари. Коментарите в реда се отделят с двойка тирета (- -), докато блокът с коментари (може да се състои от няколко реда) се отделя с начални символи /* и завършва със символите */. Променливите са елементите на езика, на които се присвояват стойности. Могат да се използват локални и глобални променливи. Локалните променливи имат времетраене само в пакета, докато глобалните променливи са валидни през цялото време, докато трае сесията. Локалните се дефинират от потребителя с оператора DECLARE, а начална стойност им се присвоява с оператор SET или SELECT, след което могат да се изпползват в оператор, пакет или процедура, в която са декларирани. Името на локалната променлива се задава със знака @ в началото, а на глобалната – с @@. Системните функции в Transact SQL могат да се използват на всякъде, където е разрешен израз с оператора SELECT. В общия случай се разделят на три типа: Scalar (скаларни) – те оерират с единична стойност и връщат единична стойност. Могат да бъдат групирани в няколко категории: математически, статистически, за работа с низове, дата и време, метаданни, сигурност, курсори, конфигуриране, системни. Aggregate – (агрегатни) – оперират със съвкупност от стойности, но връщат единична стойност. Rowset – могат да се използват като обръщение към таблици в операторите на езика. Елементите на езика за управление на логиката на потока от оператори , използвани в скриптовете са: BEGIN…END – блокове. Тези елементи затварят серии от оператори, така че те се третират като едно цяло. IF …ELSE – блокове. Тези елементи указват на SQL Server, ако условието е вярно да изпълни първата алтернатива, а в противен случай – втората. WHILE – конструкции. Използва се за организиране на цикли. Следващите след WHILE оператори се изпълняват многократно, докато
  • 5. специфицираното условие е истина. За да се контролира излизането от цикъла, могат да се използват BREAK и CONTUNUE. CASE – изрази. Използват се когато е необходимо да се сецифицират действия при няколко различни случаи. 2. начин за изпълнение на Transact – SQL операторите Конструкциите на Transact SQL могат да бъдат изпълнявани по един от следните начини: - Единични констукции; - Динамични констукции – с помощта на директивата EXECUTE. - Пакети – Пакетът (batch) – група от една или повече конструкции, които се изпращат на веднъж от едно приложение към SQL Server за изълнение; завършва с директивата GO. - Скриптове – поредица от конструкции на Transact SQL, записани във файл с разширение .sql. Транзакции, съхранени процедури и тригери. Транзакции – осигурен е контрол върху транзакциите, който дава възможност да се управява начина, по който SQL Server ги управлява. SQL програмистите са отговорни за стартирането и завършването на транзакциите в точки, които налагат логическа съгласуваност на данните. Програмистът трябва да дефинира последователността от модификации, които оставят данните в съгласувано състояние в съответствие с бизнес правилата в организацията. Програмистът включва тези оператори за модификация в една транзакция така, че SQL Server Database Engine да може да наложи физически интегритет на транзакцията. Приложенията контролират транзакциите главно чрез задаване начало и край на транзакцията. Това може да бъде направено, като се използват Transact SQL оператори или API функциите за бази от данни. Системата трябва също така коректно да управлява грешките, които прекратяват транзакцията, преди тя да завърши. Ако транзакцията е успешна, тя се завършва с оператора COMMIT, който гарантира, че модификациите, направени от транзакцията са направени постоянна част от базата от данни. COMMIT също така освобождава ресурите, използвани от транзакцията. Ако се появи грешка в транзакцията, или ако потребителят е решил да канцелира транзакцията, тогава транзакцията трябва да се върне назад с оператора ROLLBACK. Този оператор отменя всички модификации, направени от транзакцията и връща данните в това състояние, в което те са били при стартирането на транзакцията. ROLLBACK също така освобождава ресурсите заети от транзакцията. SQL Server различава няколко вида транзакции в зависимост от начина им на стартиране: - Явни, изрични транзакции. Всяка транзакция явно се стартира от Transact SQL BEGIN TRANSACTION оператора или от API функция и явно завършва с COMMIT или ROLLBACK оператор. - Неявни, автоматично завършващи транзакции – това е режимът за подразбиране за Database Engine. Всеки отделен Transact SQL оператор се предава в базата от данни, когато завърши успешно. Не е необходимо да се задават каквито и да е оператори за контролиране на транзакцията.
  • 6. - Подразбиращи се транзакции – Нова заявка неявно се стартира, когато предишната транзакция е завършила, но всяка транзакция по подразбиране завършва с COMMIT или ROLLBACK оператор. Режим на изпълнение на подразбиращи се транзакции се задава с API функция или с Transact SQL оператора SET IMPLICIT_TRANSACTIONS ON. - 34. Заявки за извличане и актуализация на данните в Transact-SQL. Извличане на данни от релационна база от данни.Оператор SELECT •Предназначение: извличане на данни по зададени колони и редове от една или няколко таблици от релационна база от данни •Резултат: релационен набор от данни Примери на Select: Извличане данните за клиентите от таблица Customers USE Northwind SELECT * FROM Customers Примери на Select: Извличане на кода и името на клиентите от град Варна SELECT CustomerId,CompanyName FROM Customers WHERE City like ‘%Варна%’ Извличане кода на стоката, стойността на поръчаното количество и номера на поръчката USE Northwind SELECT ProductId ,UnitPrice*Quantity AS Total ,OrderId FROM [Order Details] ORDER BY OrderID Частичен синтаксис на SELECT •SELECT [ ALL | DISTINCT ] [ TOP expression [PERCENT]] <select_list> [ FROM table_source [AS table_alias] ] [ WHERE search_condition ] [ ORDER BY order_expression [ ASC | DESC ][,…] ] Клауза FROM •Задава имена на таблиците, от които се извличат данни [database.][schema.]table •Чрез ключовата дума AS се задава синонимно име на таблица table_name AS table_alias Пример: Customers AS C
  • 7. •При задаване на синонимно име на таблица ключовата дума AS може да се изпусне table_name table_alias •Пример: Customers C Специфициране на колоните, които да се върнат в резултата •Колоните, които ще бъдат включени в резултатния набор се задават чрез списък за избор (select_list), съдържащ: Колони от таблици Константи •Изрази Елементи на списъка за избор •* - всички полета от първичната таблица, ако е единствена •table_name.* - всички полета от таблицата с посоченото име .Customers.* •table_alias.* - всички полета от таблицата с посоченото синонимно име .C.* Примери: Примерът връща всички колони и редове от таблицата Employee от схемата HumanResources на базата от данни AdventureWorks: USE AdventureWorks SELECT * FROM HumanResources.Employee GO елементи на списъка за избор •column_name - име на колона .ProductID .[Company Name] •table_name. column_name table_alias. column_name – уточнено име на колона .[Order Details].UnitPrice .Products.Cod P.Cod Елементи на списъка за избор •expression – израз, чиято стойност се извежда като нова колона в резултатния набор .UnitPrice*Quantity •‘string_literal’ – символен низ, който се извежда като нова колона в резултатния набор .‘Направени поръчки’ Елементи на списъка за избор column_name AS column_alias expression AS column_alias •Ключовата дума AS задава синонимно име на колона в резултата .ProductId AS Cod .UnitPrice*Quantity AS Total •column_alias=expression .Total=UnitPrice*Quantity •column_alias=‘string_literal’ .Description=‘Направени поръчки’ Списък за избор (select list): {* | {table_name|table_alias}.*
  • 8. | column_name| expression [AS column_alias] | column_alias=expression | ‘string_literal’ } [,…] Пример Операторът връща колоните, съдържащи код, име, фамилия и дата на наемане на служителите от таблицата Employee от схемата Person: USE AdventureWorks GO SELECT BusinessEntityId, Title , FirstName, LastName FROM Person.Person GO Пример USE Northwind SELECT OrderID, ProductID , Quantity*UnitPrice AS total FROM [Order Details] GO Синтаксис (основни клаузи) SELECT {* | {table_name|table_alias}.* | column_name| expression [AS column_alias] | column_alias=expression | ‘string_literal’ } [,…] FROM table_name [AS table_alias][,…..] [WHERE <search_condition>] Клауза WHERE <search_condition> •Използването на тази клауза връща в резултата определени редове от първичните таблици: тези, които отговарят на специфицираните условия (search_condition) •Релационна операция Restriction Задаване на условие за търсене <search_condition> •Условието за търсене може да съдържа неограничен списък от предикати, включващи:
  • 9. .Оператори за сравнение <, <=, >, >=, <> .Логически оператори за комбинация на условия: AND и OR и отрицание NOT .Ключови думи като LIKE, IN, EXISTS,... Пример USE AdventureWorks SELECT SalesOrderID,SalesOrderDetailID,ProductID , OrderQty FROM Sales.SalesOrderDetail WHERE OrderQty>5 •Данни за поръчките в количество по-голямо от 5. Пример USE AdventureWorks SELECT SalesOrderID,SalesOrderDetailID , ProductID, OrderQty FROM Sales.SalesOrderDetail WHERE OrderQty>=5 AND OrderQty <=15 Задаване на интервал от стойности •BETWEEN n1 AND n2 USE AdventureWorks GO SELECT SalesOrderID,SalesOrderDetailID ,ProductID, OrderQty FROM Sales.SalesOrderDetail WHERE OrderQty BETWEEN 5 AND 15 Задаване на списък от стойности: IN (n1,n2,…) SELECT * FROM Publishers WHERE City IN ('Paris', 'Berlin') •Извежда данни за издателствата отParis или Berlin •Друг вариант: SELECT * FROM Publishers WHERE City = 'Paris' OR City= 'Berlin' Особености при задаване на условия за сравнение •Пълно съвпадение – оператор “=“ •Непълно съвпадение - like •Данни, които са тип char, nchar, varchar, nvarchar, text, datetime и smalldatetime трябва да се поставят в единични кавички
  • 10. •Пример: City = 'Paris' City like ' %Paris%' orderdate = '08/14/1996' Сравнение на низове с непълно съвпадение •Оператори LIKE и NOT LIKE Изисква задаване на шаблон, с който се прави сравнение за непълно, частично сравнение •Пример: SELECT * FROM dbo.Customers WHERE City LIKE 'L%' Символи, използвани в шаблони за сравнение с ключовата дума LIKE (NOT LIKE) •% - какъв да е низ от символи (нула или няколко символа) •_ - какъв да е единичен символ •[] – кой да е символ, зададен в скобите; .Пример:LIKE '[KC]% ' – кой да е символен низ, започващ с K или C. .LIKE '[A-F]ing ' •[^] – кой да е символ, който не е зададен в скобите; LIKE ' M[^C] ' Задаване на условие за липса или наличие на стойност •Липса на стойност в колона – IS NULL USE Northwind SELECT * FROM dbo.Customers WHERE Region IS NULL •Наличие на стойност - IS NOT NULL USE Northwind SELECT * FROM dbo.Customers WHERE Region IS NOT NULL Сортиране на резултата (подреждане на редовете в резултатния набор) •ORDER BY order_by_expression [ASC|DESC]... .order_by_expression - име на колона или пореден номер на колоната от списъка за избор .Ред на сортиране – ASC или DESC .По подразбиране сортирането е във възходящ ред (ASC) .ORDER BY не се използва за колони с данни тип text и image Примери SELECT CustomerID, CompanyName, City FROM dbo.Customers ORDER BY City SELECT CustomerID, CompanyName , Country, City FROM dbo.Customers ORDER BY City ASC, 2 ASC
  • 11. Частичен синтаксис на SELECT SELECT [ ALL|DISTINCT ] <select list> FROM {<table_source>} [,n] [ WHERE <search_condition> ] [ORDER BY { <order_by_expression> [ ASC|DESC ]} [,...n]] Ключови думи, контролиращи резултатния набор: •DISTINCT – елиминира дублираните редове в резултата •ALL – включват се дублираните редове в резултата; опция по подразбиране •TOP n – в резултата се връщат първите n реда от резултатния набор; ако e зададено подреждане на резултата, то се извеждат първите n реда от сортирания резултатен набор Примери •Извеждане имената на градовете, от които са клиентите SELECT DISTINCT City FROM Customers •Извеждане на 5-те най-скъпи продукта USE Northwind SELECT TOP 5 ProductID, ProductName, UnitPrice FROM dbo.Products ORDER BY 3 DESC Създаване на нова таблица с резултата от SELECT SELECT списък за избор (полета, константи, изрази) INTO име на новата таблица FROM име на таблица [,…] [WHERE критерий (условие) за търсене] [ORDER BY израз за подреждане [ASC|DESC]...] Особености при създаване на нова таблица от резултатния набор •Ако съществува таблица със същото име, то операторът се прекратява и се извежда съобщение •В SQL Server създаваната таблица може да бъде постоянна или временна •Може да се използва при разделяне на сложни заявки в поредица от по-прости Пример:Създаване на нова таблица с данни за клиентите от USA USE Northwind
  • 12. /* Проверка за съществуването на таблицата */ IF EXISTS(SELECT name FROM sysobjects WHERE name = 'Customers_USA' AND TYPE = 'U') DROP TABLE dbo.Customers_USA GO Пример:Създаване на нова таблица с данни за клиентите от USA /* създаване на новата таблица */ SELECT * INTO dbo.Customers_USA FROM dbo.Customers WHERE Country LIKE 'USA' Обединяване на резултатите от оператори SELECT SELECT <select_list>…. UNION SELECT <select_list>…. Изисквания: Резултатите от двата оператора SELECT трябва да бъдат сравними релационни набори. Пример: USE Northwind GO SELECT ShipperID, CompanyName FROM Shippers UNION SELECT SupplierID, CompanyName FROM Suppliers WHERE Country LIKE 'Germany' Пример: Обединяване на резултатите от оператори SELECT в нова таблица USE Northwind GO IF EXISTS(SELECT name FROM sysobjects WHERE name = 'Customers_new' AND TYPE = 'U') DROP TABLE dbo.Customers_new GO SELECT ShipperID, CompanyName
  • 13. INTO Customers_new FROM Shippers UNION SELECT SupplierID, CompanyName FROM Suppliers WHERE Country LIKE 'Germany' Пресичане на резултатни набори от SELECT •Oператор INTERSECT – изисква сравними резултатни набори от двата оператора SELECT •SELECT <select_list>…. INTERSECT SELECT <select_list>…. Пример: USE Northwind GO SELECT ShipperID, CompanyName FROM Customers_new INTERSECT SELECT SupplierID, CompanyName FROM Suppliers WHERE Country LIKE 'Germany' Разлика на резултатни набори от SELECT •Оператор EXCEPT – изисква сравними резултатни набори от двата оператора SELECT •SELECT <select_list>…. EXCEPT SELECT <select_list>…. Пример: USE Northwind GO SELECT ShipperID, CompanyName FROM Customers_new UNION SELECT SupplierID, CompanyName FROM Suppliers WHERE Country LIKE 'Germany' ФУНКЦИИ •Обобщаващи функции •Аритметични функции •Функции за дата и време •Функции за работа със символи •Конвертиращи функции
  • 14. •Функции за работа с метаданни •Други функции Примери •SELECT DB_NAME() AS ‘DataBase’ връща името на текущата база от данни Примери SELECT 'ANSI:', CONVERT(varchar(30),GETDATE(),102) AS Style SELECT 'European:', CONVERT(varchar(30),GETDATE(),113) AS Style1 Примери SELECT 'ANSI:', CONVERT(varchar(30),GETDATE(),102) AS Style UNION SELECT 'European:', CONVERT(varchar(30),GETDATE(),113) AS Style1 Примери •Резултат, връщан след обединяването (UNION) на резултата от двата оператора SELECT Обобщаващи функции •COUNT(*|expression|column_name) SELECT COUNT(*) AS COUNT_Customer FROM Customers WHERE City LIKE 'London' •SUM(column_name|expression) SELECT SUM([Total]) FROM order_total •AVG(column_name|expression) SELECT AVG([Total]) FROM order_total
  • 15. Обобщаващи функции •MAX(column_name|expression) •MIN(column_name|expression) •Стандартно отклонение STDEV(column_name) Standard SQL Заявки с групиране и обобщаване на данни в SQL Клауза GROUP BY •group_by_expression [,…] •Клаузата GROUP BY в оператор SELECT се използва за организиране на редовете в групи и обобщаване на данни за тези групи. •Пример: определяне сумарното поръчано количество от всяка стока Пример на групиране USE Northwind SELECT ProductID , SUM(Quantity) AS Total_quantity FROM [Order Details] GROUP BY ProductID •Кодовете на поръчаните стоки и за всяка поръчана стока сумарното поръчано количество Пример на групиране SELECT TOP 5 City, COUNT(*) AS COUNT_Customers FROM Customers GROUP BY City ORDER BY 2 DESC Особености на клаузата GROUP BY •Колоните, зададени в GROUP BY се обработват така, че се извличат групи от редове, които имат една и съща стойност за тези колони •За всяка създадена група в резултата се връща само един ред; не се връща детайлна информация •За всяка група чрез агрегатна функция може да се изчисли обобщена информация Особености на клаузата GROUP BY •В списъка за избор се задават всички колони, по които се прави групиране (колоните, специфицирани в клаузата GROUP BY) и нови колони, получавани чрез агрегатни функции. •Не се препоръчва да се прави групиране по колони, които съдържат неопределени стойности (Null) - те се обработват като отделна група!!!
  • 16. Ограничаване на редовете, включвани в групите •Чрез клауза WHERE се задава условие, на което да отговарят редовете , които ще се включат в групата •SELECT ProductId , SUM(Quantity) AS Total_quantity FROM [Order Details] WHERE OrderId BETWEEN 10250 AND 10300 GROUP BY ProductId Стъпки при изпълнение на SELECT с клаузи WHERE и GROUP BY 1.От таблиците се селектират редовете, които отговарят на зададеното чрез WHERE условие 2.Върху селектираните редове се прави групиране 3.Изчисляват се зададените обобщени стойности 4.В резултата се разполага по един ред за всяка група - стойностите на полетата за групиране и изчислените обобщени стойности за групата Задаване на условие за групите, които да се изведат в резултата Клауза HAVING <search_condition> •В резултата се извеждат само групите, отговарящи на зададените в HAVING условия •В HAVING могат да се задават до 128 условия, свързани с логическите оператори AND, OR или NOT Пример на използване на клауза HAVING SELECT ProductId , SUM(Quantity) AS Total_quantity FROM [Order Details] GROUP BY ProductId HAVING ProductID BETWEEN 1 AND 30 Пример на използване на клауза HAVING SELECT ProductId , SUM(Quantity) AS Total_quantity FROM [Order Details] GROUP BY ProductId HAVING SUM(Quantity)> 100 Особености при задаване на HAVING
  • 17. •Условията, на които трябва да отговарят групите, показвани в резултата могат да се задават върху .полетата за групиране .или върху изчисляваните обобщени стойности •Клаузата HAVING може да се използва само с клауза GROUP BY Стъпки при изпълнение на SELECT с клауза HAVING 1.Прави се групиране по зададените колони 2.Изчисляват се обобщените стойности 3.Върху създадените групи се прилагат зададените в HAVING условия Пример на използване на клаузи WHERE и HAVING едновременно SELECT ProductID , SUM(Quantity) AS Total_quantity FROM [Order Details] WHERE OrderID >= 10300 GROUP BY ProductID HAVING SUM(Quantity) > 1000 Групиране и обобщаване на данни от свързани таблици •При свързване на таблици е възможно да се зададе групиране по колони от едната таблица и обобщаване на данни върху колони от свързаната таблица. Пример: •Справка, съдържаща код и име на продукта, брой поръчки,сумарно поръчано количество, средна цена и обща стойност на всички поръчки за всеки поръчан продукт SELECT P.ProductID, P.ProductName , COUNT(OD.ProductID) AS Count_Orders , SUM(Quantity) SUM_Quantity , AVG(OD.UnitPrice) Average_Price , SUM(OD.UnitPrice*Quantity) AS Total FROM Products P INNER JOIN [Order Details] OD ON P.ProductID = OD.ProductID GROUP BY P.ProductID, P.ProductName ORDER BY .ProductID Пример: •Да се изведат данни (код и име на клиента, брой поръчки и обща стойност на поръчките) за 5-те клиента, които са донесли най-големи приходи за фирмата. SELECT TOP 5 C.CustomerID,
  • 18. C.CompanyName , COUNT(O.OrderID) AS Count_Orders , SUM(OD.UnitPrice*Quantity) AS Total FROM Customers C INNER JOIN Orders O ON C.CustomerID = O.CustomerID INNER JOIN [Order Details]OD ON O.OrderID = OD.OrderID GROUP BY C.CustomerID, C.CompanyName ORDER BY 4 DESC Пример: •Да се изведат данни (код и име на клиента, брой поръчки и обща стойност на поръчките, дял в общите приходи) за 5-те клиента, които са донесли най-големи приходи за фирмата и какъв е тяхния дял в общите приходи. SELECT TOP 5 C.CustomerID, C.CompanyName , COUNT(O.OrderID) AS Count_Orders , SUM(OD.UnitPrice*Quantity) AS Total , SUM(OD.UnitPrice*Quantity)/ (SELECT SUM(UnitPrice*Quantity) FROM [Order Details])*100 AS Total_Percent FROM Customers C INNER JOIN Orders O ON C.CustomerID = O.CustomerID INNER JOIN [Order Details]OD ON O.OrderID = OD.OrderID GROUP BY C.CustomerID, C.CompanyName ORDER BY 4 DESC Използване на клаузa COMPUTE •SELECT productid, orderid, quantity FROM [order details] ORDER BY productid, orderid COMPUTE sum(quantity) •Генерира се допълнителен сумарен ред от данни •Резултатът е таблица от не-релационен формат. Тази клауза липсва в ANSI стандарта. Използване на клаузa COMPUTE …BY... •SELECT productid, orderid, quantity FROM [order details] ORDER BY productid, orderid COMPUTE sum(quantity) BY productid COMPUTE sum(quantity) •Генерира допълнителен обобщен ред от данни за колоната зададена след COMPUTE …BY.. при смяна на групата
  • 19. Използване на клауза GROUP BY с оператор ROLLUP •Операторът ROLLUP генерира резултат, който съдържа: .обобщен ред (totals) за целия резултатен набор; .обобщени редове (subtotals) за всяка група; .детайлни редове. •В обобщените редове колоните, по които се прави групиране съдържат или стойността на групата или NULL •ROLLUP генерира резултатния набор, показвайки обобщенията в йерархията на колоните, зададени за групиране •Резултатният набор е в релационен формат Пример на GROUP BY с оператор ROLLUP SELECT ProductId, OrderId, SUM(Quantity) AS Total FROM [Order Details] GROUP BY ProductId, OrderId WITH ROLLUP ORDER BY ProductId, OrderId Пример на GROUP BY с оператор ROLLUP •Резултатът ще съдържа .Обобщен ред за всички стоки във всички поръчки .За всяка стока •Обобщен ред за сумарно поръчаното количество във всички поръчки •детайлни редове - поръчаното количество от стоката във всяка поръчка за нея, •Обобщени редове се извеждат при смяна на групата. •Обобщените редове съдържат групата и стойности NULL в колоните за групиране Пример на използване на клауза GROUP BY с оператор CUBE SELECT ProductId, OrderId , SUM(Quantity) AS Total FROM [Order Details] GROUP BY ProductId, OrderId WITH CUBE ORDER BY ProductId, OrderId •CUBE генерира резултатен набор, показвайки обобщения за всички възможни комбинации на стойностите в селектираните колони - 2n-1 •NULL в резултатния набор индикира, че редовете са обобщения и са създадени от CUBE SELECT ProductId, OrderId , SUM(Quantity) AS Total
  • 20. FROM [Order Details] GROUP BY ProductId, OrderId WITH CUBE ORDER BY ProductId, OrderId МОДИФИЦИРАНЕ НА ДАННИТЕ Insert-добавяне на редове в таблици Delete-изтриване на редове в таблици Update-обновяване на данните Добавяне на редове втаблици •Синтаксис на оператора •Примери •Особености при използването на Insert •Добавяне на стойности по подразбиране •Добавяне на редове, получени като резултат от SELECTСинтаксис на оператора Insert INSERT [INTO] {table_name|view_name} [(column_list)] {VALUES({DEFAULT |NULL |expression}[,….]) |DEFAULT VALUES Пример на Insert INSERT INTO[Order Details] (OrderId, ProductId, UnitPrice, Quantity, Discount) VALUES(10500,5,25.5,125,0.05) INSERT dbo.Customers(CustomerID, CompanyName) VALUES(65432,'Triada') ,(76543,'Microaccount') Някои правила при използванена Insert •В списъка се задават имената на колоните, които ще приемат стойности. •Ако всички колони ще приемат стойности, то задаването на списъка е по желание. •В клаузата VALUES се задават стойности за всяка колона от приемащия списък ; между двата списъка трябва да има съответствие в последователността и типа на елементите от данни. •При добавянето на новите данни, ако се наруши интегритетът на данните, операторът се
  • 21. отменя!!! Ключова думаDefault Добавя стойността по подразбиране за специфицираните колони •Ако колоната, за която се използва DEFAULT няма зададена стойност по подразбиране и разрешава неопределена стойност, то се добавя стойност NULL •Ако колоната, за която се използва DEFAULT няма зададена стойност по подразбиранеили не разрешава Nullстойности, то INSERT операторът се отменя Пример на използване на DEFAULT •В таблицата Order Details се добавя нов ред за поръчка номер 10500, продукт с код 25 на цена 25.5 в количество 1 (зададено по подразбиране) и търговска отстъпка 5% INSERT[Order Details] VALUES(10500, 25, 25.5, DEFAULT, 0.05) Добавяне на редове, получени като резултат от SELECT .INSERT table_name[(column_list)] (SELECT column_list FROM table_list [WHERE search_conditions] [GROUP BY…[ORDER BY..]) пример: .Служителите са и клиенти .Кодът на клиента-служител се образува от първите два символа на първото име (fname)и първите два символа от последното име на служителя (lname) .Имената на служителя са име на фирмата .Градът, адресът и домашният телефон стават данни за фирмата .Останалите колони за служителя остават празни (с неопределена стойност) Оператор INSERTза примера INSERT Customers (CustomerID, CompanyName, City, Address, Phone) (SELECT substring(FirstName, 1, 2) + substring(LastName, 1, 2) , FirstName+ ' ' + LastName, City, Address, HomephoneFROM Employees) /* list new Customers */ SELECT * FROM Customers WHERE ContactTitleIs Null Изтриване на редове от таблици .Оператор DELETE .Действие .Особености
  • 22. .Ограничаване броя на изтриваните редове .Изтриване на редове от таблица въз основа на други таблици •Оператор TRUNCATE TABLE DELETE •DELETE[FROM] {table_name|view_name} •Използва се за премахване на един или повече редовеот таблица.Всеки изтрит ред се съхранява в системния дневник (дневник на транзакциите-log file) .Чрез клауза WHEREсе ограничава броят на изтриваните редове Оператор DELETEс клауза WHERE •Синтаксис: DELETE[FROM] {table_name|view_name} WHEREsearch_conditions •Пример: Изтриване на поръчката с номер 10500 за продукт с код 5 DELETE FROM [order details] WHERE productid=5 AND orderid=10500 Пример на оператор DELETE •Изтриване на всички поръчки, които са направени преди повече от 3месеца DELETE FROM Orders WHERE DATEDIFF(Month, OrderDate, GetDate())>3 --DATEDIFF (datepart,startdate,enddate) –изчислява разликата между двете дати в години, четиримесечия, месеци, дни, седмици,... Datepart: year, quarter, month, day, week,… Изтриване на редове от таблица въз основа на условие върху други таблици •Редове от дадена таблица могат да се изтриват въз основа на условие, поставено върху колони от друга (свързана) таблица •В този случай в DELETE се използва втора клауза FROM, в която се задава съединяване с другата таблица, за която с WHERE се задава условието Използване на допълнителна клаузаFROM .DELETE [FROM] table_name[FROM <table_source> [,…n]] [WHERE search_conditions] .Първата клауза FROMиндикира таблицата, в която се правят промени
  • 23. .Втората клауза FROMспецифицира ограничаващ критерий за оператораDELETE ПримернаизползваненаDELETEсдопълнителнаклаузаFROM •Изтриване на всички редове от таблицата Order Details, които са за поръчки, направени на определена дата (12/10/2002) USE Northwind GO DELETE FROM [Order details] FROM Orders WHERE OrderDate= '12/10/2002' Вариант с JOIN DELETE FROM[Order details] FROMOrders OINNER JOIN[Order details]OD ONO.OrderID= OD.OrderID WHEREOrderDate=12/10/2002 Използване на подзаявка в WHERE клаузата на DELETE Пример: DELETE FROM[Order details] WHERE OrderIDIN (SELECT OrderIDFROM OrdersWHERE OrderDate= '12/1/2011') Оператор TRUNCATE TABLE •Синтаксис:TRUNCATE TABLE[[database.]owner]table_name •Изтриват се всички редове от таблицата, но се запазва структурата и и асоциираните с нея обекти •Изтритите редове не се записват в дневника на транзакциите •Изпълнявасе по бързо от DELETE •Ако има колона IDENTIFYначалната и стойност се възстановява Обновяване на данниОператор UPDATE Синтаксис: UPDATE{table_name|view_name} SET {column_name=expression |DEFAULT |NULL} |@variable=expression}[,….] WHERE {search_conditions} Пример:UPDATE Products SET UnitPrice= (UnitPrice*1.1) Особености на обновяването сUPDATE •Ключовата думаSETспецифицира новите данни •Входните данни трябва да са от същия тип като колоните, които се обновяват •SQL Server не обновява редовете, които нарушават ограниченията за интегритет •Клауза WHERE специфицира редовете, в които се прави промяна •С един оператор се обновява само една таблица
  • 24. Препоръки за ускоряване на обновяването •Използвайте само положителни условия за търсене, т.е. не използвайте NOT IN,NOT BETWEEN, NOT NULLи т.н. •Избягвайте използването на LIKE •Използвайте точно съвпадение или интервали •Клаузата ORDER BY забавя обръщението към данните Обновяване, основано на други таблици •В UPDATE се използва .втора клауза FROMс JOIN на обновяваната таблица с таблицата, за която се задава условието или .подзаявкa в клаузата WHERE; тя се изпълнява по веднъж за всеки ред от таблицата, която се обновява, като за всеки ред се връща единична стойност •Даден ред се обновява само веднъж Обновяване, основано на други таблициUPDATE{table_name| view_name} SET {column_name={expression |DEFAULT |NULL} | @variable= expression}[,…n] [FROM <table_source>….] [WHERE search_conditions] Пример •Обновяване на таблицата Products чрез увеличаване с 2% цената на всички продуктиот категория Seafood USE Northwind UPDATE Products SET UnitPrice=UnitPrice*1.02 FROM Products PR INNER JOIN Categories G ON PR.CategoryID=G.CategoryID WHERE G.CategoryName= 'Seafood' Пример на UPDATE с използване на подзаявка •Обновяване на таблицата Products чрез намаляване с 2% цената на всички продуктиот категория Seafood USE Northwind UPDATE Products SET UnitPrice=UnitPrice*0.98 WHERE CategoryID=
  • 25. (SELECT CategoryIDFROM CategoriesWHERE CategoryName='Seafood') Пример на UPDATE с използване на корелационна подзаявка •Обновяване на колона total в таблицатаOrders със сумарната стойност на поръчаните стоки за всяка поръчка UPDATE Orders SET Total = (SELECT SUM(UnitPrice*Quantity) FROM [Order Details] OD WHEREOrders.OrderID=OD.OrderID)Добавяне на редове втаблици •Синтаксис на оператора •Примери •Особености при използването на Insert •Добавяне на стойности по подразбиране •Добавяне на редове, получени като резултат от SELECTСинтаксис на оператора Insert INSERT [INTO]{table_name|view_name} [(column_list)]{VALUES({DEFAULT |NULL |expression}[,….])|DEFAULT VALUES Пример на Insert INSERT INTO[Order Details](OrderId, ProductId, UnitPrice, Quantity, Discount)VALUES(10500,5,25.5,125,0.05) INSERT dbo.Customers(CustomerID, CompanyName) VALUES(65432,'Triada'),(76543,'Microaccount')Някои правила при използванена Insert •В списъка се задават имената на колоните, които ще приемат стойности.•Ако всички колони ще приемат стойности, то задаването на списъка е по желание. В клаузата VALUES се задават стойности за всяка колона от приемащия списък ; между двата списъка трябва да има съответствие в последователността и типа на елементите от данни.•При добавянето на новите данни, ако се наруши интегритетът на данните, операторът се отменя!!! Ключова думаDefault •Добавя стойността по подразбиране за специфицираните колони •Ако колоната, за която се използва DEFAULT няма зададена стойност по подразбиране и разрешава неопределена стойност, то се добавя стойност NULL •Ако колоната, за която се използва DEFAULT няма зададена стойност по подразбиранеили не разрешава Nullстойности, то INSERT операторът се отменя.Пример на използване на DEFAULT •В таблицата Order Details се добавя нов ред за поръчка номер 10500, продукт с код 25 на цена 25.5 в количество 1 (зададено по подразбиране) и търговска отстъпка 5%•INSERT[Order Details] VALUES(10500, 25, 25.5, DEFAULT, 0.05)Добавяне на редове, получени като резултат от SELECTINSERT table_name[(column_list)](SELECT column_list FROM table_list [WHERE search_conditions][GROUP BY…[ORDER BY..])
  • 26. Пример:Служителите са и клиенти Кодът на клиента-служител се образува от първите два символа на първото име (fname)и първите два символа от последното име на служителя (lname)Имената на служителя са име на фирмата Градът, адресът и домашният телефон стават данни за фирмата Останалите колони за служителя остават празни (с неопределена стойност) Оператор INSERTза примера INSERT Customers (CustomerID, CompanyName, City, Address, Phone)(SELECT substring(FirstName, 1, 2) + substring(LastName, 1, 2), FirstName+ ' ' + LastName, City, Address, HomephoneFROM Employees) /* list new Customers */ SELECT * FROM Customers WHERE ContactTitleIs Null Изтриване на редове от таблици Оператор DELETE Действие Особености Ограничаване броя на изтриваните редове Изтриване на редове от таблица въз основа на други таблици •Оператор TRUNCATE TABLE Оператор DELETE •DELETE[FROM] {table_name|view_name} •Използва се за премахване на един или повече редовеот таблица Всеки изтрит ред се съхранява в системния дневник (дневник на транзакциите- log file) Чрез клауза WHEREсе ограничава броят на изтриваните редове Оператор DELETEс клауза WHERE •Синтаксис:DELETE[FROM] {table_name|view_name}WHEREsearch_conditions •Пример: Изтриване на поръчката с номер 10500 за продукт с код 5 DELETE FROM [order details]WHERE productid=5 AND orderid=10500 Пример на оператор DELETE •Изтриване на всички поръчки, които са направени преди повече от 3месеца DELETE FROM Orders WHERE DATEDIFF(Month, OrderDate, GetDate())>3 --DATEDIFF (datepart,startdate,enddate) –изчислява разликата между двете дати в години, четиримесечия, месеци, дни, седмици,... Datepart: year, quarter, month, day, week,… Изтриване на редове от таблица въз основа на условие върху други таблици •Редове от дадена таблица могат да се изтриват въз основа на условие, поставено върху колони от друга (свързана) таблица •В този случай в DELETE се използва втора клауза FROM, в която се задава съединяване с другата таблица, за която с WHERE се задава условието Използване на допълнителна клаузаFROM DELETE [FROM] table_name[FROM <table_source> [,…n]][WHERE search_conditions] Първата клауза FROMиндикира таблицата, в която се правят промениВтората клауза FROMспецифицира ограничаващ критерий за оператораDELETE ПримернаизползваненаDELETEсдопълнителнаклаузаFROM
  • 27. •Изтриване на всички редове от таблицата Order Details, които са за поръчки, направени на определена дата (12/10/2002) USE Northwind GO DELETE FROM [Order details] FROM Orders WHERE OrderDate= '12/10/2002' Вариант с JOIN DELETE FROM[Order details] FROMOrders OINNER JOIN[Order details]OD ONO.OrderID= OD.OrderID WHEREOrderDate=12/10/2002 Използване на подзаявка в WHERE клаузата на DELETE Пример: DELETE FROM[Order details] WHERE OrderIDIN (SELECT OrderID FROM Orders WHERE OrderDate= '12/1/2011') Оператор TRUNCATE TABLE •Синтаксис:TRUNCATE TABLE[[database.]owner]table_name •Изтриват се всички редове от таблицата, но се запазва структурата и и асоциираните с нея обекти •Изтритите редове не се записват в дневника на транзакциите •Изпълнявасе по бързо от DELETE •Ако има колона IDENTIFYначалната и стойност се възстановява Обновяване на данниОператор UPDATE Синтаксис: UPDATE{table_name|view_name} SET {column_name=expression |DEFAULT |NULL} |@variable=expression}[,….] WHERE {search_conditions} Пример:UPDATE Products SET UnitPrice= (UnitPrice*1.1) Особености на обновяването сUPDATE •Ключовата думаSETспецифицира новите данни •Входните данни трябва да са от същия тип като колоните, които се обновяват •SQL Server не обновява редовете, които нарушават ограниченията за интегритет •Клауза WHERE специфицира редовете, в които се прави промяна •С един оператор се обновява само една таблица Препоръки за ускоряване на обновяването •Използвайте само положителни условия за търсене, т.е. не използвайте NOT IN,NOT BETWEEN, NOT NULLи т.н. •Избягвайте използването на LIKE •Използвайте точно съвпадение или интервали •Клаузата ORDER BY забавя обръщението към данните Обновяване, основано на други таблици
  • 28. •В UPDATE се използва втора клауза FROMс JOIN на обновяваната таблица с таблицата, за която се задава условието или подзаявкa в клаузата WHERE; тя се изпълнява по веднъж за всеки ред от таблицата, която се обновява, като за всеки ред се връща единична стойност •Даден ред се обновява само веднъж Обновяване, основано на други таблици UPDATE{table_name|view_name} SET {column_name={expression |DEFAULT |NULL} | @variable= expression}[,…n] [FROM <table_source>….] [WHERE search_conditions]Пример •Обновяване на таблицата Products чрез увеличаване с 2% цената на всички продуктиот категория Seafood USE Northwind UPDATE Products SET UnitPrice=UnitPrice*1.02 FROM Products PR INNER JOIN Categories G ON PR.CategoryID=G.CategoryID WHERE G.CategoryName= 'Seafood' Пример на UPDATE с използване на подзаявка •Обновяване на таблицата Products чрез намаляване с 2% цената на всички продуктиот категория Seafood USE Northwind UPDATE Products SET UnitPrice=UnitPrice*0.98 WHERE CategoryID= (SELECT CategoryIDFROM Categories WHERE CategoryName='Seafood') Пример на UPDATE с използване на корелационна подзаявка •Обновяване на колона total в таблицатаOrders със сумарната стойност на поръчаните стоки за всяка поръчка UPDATE Orders SET Total = (SELECT SUM(UnitPrice*Quantity) FROM [Order Details] OD WHEREOrders.OrderID=OD.OrderID)