You are on page 1of 26

Користење на SQL за

манипулирање со податоци
Употреба на XML тип на податок
во SQL Server 2008.
Конверзија на релациона табела
во XML документ.

Лабораториска вежба 7
Содржина
Користење на SQL за манипулирање со податоци
• Конструкција INSERT
• Конструкција SELECT…INTO
• Промена
• Бришење
• Задача
Употреба на XML во SQL
• XML (Extensible Markup Language)
• Употреба на XML тип на податок во SQL Server
▫ Задача 1, 2, 3
• Конверзија на релациона табела во XML документ
▫ Задача 4
• SQL располага со три основни конструкции за
манипулирање на податоците (Data Manipulation
Language – DML) – INSERT, UPDATE и DELETE.
Конструкциите се дел од DML, дозволуваат
воведување, промена (ажрирање), и бришење на
редови во табелите, кој се чуват во базата на
податоци.
Користење на INSERT за додавање на податоци

• Со конструкцијата INSERT се додава еден или повеќе редови


во една табела.

I. Општ вид на INSERT за додавање на еден ред:

INSERT [INTO] {table_name | view_name} [(column_list)]


VALUES (value_list)

Пример:
SET IDENTITY_INSERT SaleDetails ON
INSERT INTO SaleDetails
(SaleID, ProductID, Quantity, Price)
VALUES (9, 1, 18, 5)
• Кога се додават редови со податоци во табелата со колона
IDENTITY преку конструкција INSERT, колоната IDENTITY
треба да биде пропуштенa во списокот од колони.
Пример при додавање на ред во табелата за продажби Sales треба
да се пропуште колоната SaleID (Освен ако е вклучена опцијата
IDENTITY_INSERT преку SET IDENTITY_INSERT Sales ON).

INSERT INTO Sales (CustomerID, EmployeeID,


SaleDate,TotalForSale)
VALUES (1, 1, 2009-05-04, 3)

• За додавање на соодветен ред во табелата SaleDetails, може да


се користи функцијата @@IDENTITY.
Пример:
INSERT INTO SaleDetails
       (SaleID, ProductID, Quantity, Price)
VALUES (@@IDENTITY, 1, 18, 5)
II. Општ вид на INSERT за додавање на множество редови :

INSERT [INTO] {table_name | view_name} [(column_list)]


SELECT column_list
FROM other_table_name

• Во табелата се додава резултат, кој се враќа од упитот SELECT, ако колоните на
табелите имат една и иста структура со избраните колони. Пример:
CREATE TABLE Totals
( SaleID int NOT NULL PRIMARY KEY,
  TotalForSale money NOT NULL DEFAULT 0 )

 INSERT INTO Totals


SELECT SaleID, SUM(Price*Quantity)
FROM SaleDetails
GROUP BY SaleID

• Операцијата е атомарна, т.е. пропаѓањето на еден ред, пример по нарушувањето на


ограничувањето, предизвикува отфрлување на сите редови, избрани со
конструкцијата SELECT. Постои исклучок од правилото, кога се најде клуч кој се
повторува во некој уникален индекс, создаден со опцијата IGNORE_DUP_KEY.
Користење на конструкцијата SELECT…INTO за додавање на
податоци
• Конструкцијата SELECT…INTO дава можност за создавање нова таблица и
пополнување на таблицата со набор од резултати кој се добиват од
конструкцијата SELECT. Општ вид на SELECT…INTO:
SELECT column_list
INTO new_table_name
FROM other_table_name

Пример:
1) Друг начин за создавање на табела Totals од предходниот пример е:
SELECT SaleID,
CAST(SUM(Price*Quantity) AS money)
AS TotalForSale
INTO Totals
FROM SaleDetails
GROUP BY SaleID
• Создадена на овој начин табелата нема дефиниран примарен клуч и
вредност по подразбирање.
2) Создавање на табела со идентификаторите на клиентите и
пресметување на моменталниот баланс.
SELECT s.CustomerID,
       CAST(SUM(sd.Price*sd.Quantity) AS money)
          AS CurrentBalance
INTO Totals2
FROM Sales s
INNER JOIN SaleDetails sd ON s.SaleID = sd.SaleID
GROUP BY CustomerID

• Конструкцијата SELECT…INTO работи во специјален режим


без запишуање во дневникот на транзакции (log фајлот), по
што се извршува побрзо. За да се користи SELECT…INTO за
пополнување на постоечка табела, за базата на податоци треба
да и биде вклучена опцијата select into/builkcopy (преку EXEC
sp_dboption database_name, 'select into/bulkcopy', TRUE).
Користење на UPDATE за промена на податоците
• Контрукцијата UPDATE може да ги променува вредностите на податоците
во оделени редови, во група од редови или во сите редови во една табела.

• Општ вид на UPDATE за промена на податоци:


UPDATE {table_name | view_name}
   SET column_name1 = {expression1|NULL|DEFAULT|(SELECT)}
     [,column_name2={expression2|NULL|DEFAULT|(SELECT)}…]
[WHERE {search_condition}]
• Оваа конструкција може да ги ажурира сите редови кој одговараат на даден
услов. Ако се пропуште операторот WHERE, сите редови од табелата се
променуваат. Во SET може да се задават множество од колони, разделени
со запирка исто така може да ги користиме нивните вредности на колоните,
за да ги пресметаме (добиеме) новите вредности. Изразот може да е
константа, друга колона, аритметички израз, системна функција, локална
променлива, CASE израз или вредност вратен од под-упит. Многуредов
UPDATE е атомарна операција – ако един ред наруши ограничување, сите
промени, направени со оваа конструкција се враќаат назад.
Пример:
1) Промена на вредностите на колоните quantity и price во таблицата
SaleDetails за дадена продажба на даден продукт.
UPDATE SaleDetails
   SET quantity = 12,
       price = 2
WHERE SaleID = 1 AND ProductID = 1

2) Зголемување со 50% на продажната цена на продуктите за продажба со


даден идентификатор.
UPDATE SaleDetails
   SET price = 1.5*price
WHERE SaleID = 1

3) Промена на вредностите на продажната цена на даден продукт за дадена


продажба на 50% зголемување на максималната цената.
UPDATE SaleDetails
SET price = 1.5*(SELECT MAX(price) FROM SaleDetails)
WHERE SaleID = 1 AND ProductID = 1
• Дополнително во Transact-SQL е може да користиме:
UPDATE {table_name | view_name}
   SET column_name1 = {expression1|NULL|DEFAULT|(SELECT)}
      [,column_name2={expression2|NULL|DEFAULT|(SELECT)}…]
[FROM {table_source}]
• Преку table_source се определува табелата (табелите), која се користи како
критериум за операцијата UPDATE.
Пример:4) Зголемување на продажната цена на продукт даден со идентификатор по
што се собира со дуплираната доставна цена на соодветниот продукт.
UPDATE SaleDetails
   SET price = sd.price + 2*p.price
FROM SaleDetails sd
INNER JOIN Products p ON sd.ProductID = p.ProductID
WHERE SaleID = 87
Оваа конструкција е еднаква со следната:
UPDATE SaleDetails
   SET price = sd.price +
             ( SELECT 2*p.price
               FROM Products p
               WHERE sd.ProductID = p.ProductID )
FROM SaleDetails sd
WHERE SaleID = 87
5) Промена на попусот од цената на продукт со
идентификатор 3 за продажба со идентификатор 10 во
зависност од продадена количина: за продадена количина
над 20 попуст – 10%; помеѓу 10 и 20 – 5%; под 10 – 0%.

UPDATE SaleDetails
   SET Discount = CASE
                      WHEN Quantity > 20 THEN 0.10
                      WHEN Quantity >= 10 THEN 0.05
                      ELSE 0
                  END
WHERE SaleID = 10 AND ProductID = 3
Користење на DELETE за бришење на податоци

• Конструкцијата DELETE брише еден или повеќе редови од една


табела. Општ вид DELETE за бришење на податоци:
DELETE FROM {table_name | view_name}
[WHERE {search_condition}]
• Со оваа команда се бришат редовите, кој исполнуваат некој
услов. Ако се пропуште операторот WHERE, сите редови од
таблицата се бришат, но не и самата табела (за бришење на
табела DROP TABLE table_name).
Пример:
1) Бришење на сите редови од табелата SaleDetails за продукти,
чија продажба е прекината.
DELETE FROM SaleDetails
WHERE ProductID IN ( SELECT ProductID FROM Products
                     WHERE Discontinued = 1 )
2) Бришење на сите извршени продажби на клиент со
идентификатор 5, кој се случиле на 01.01.2010г.
DELETE FROM Sales
WHERE CustomerID = 5
 AND DATEDIFF(day, SaleDate, '2010/01/01') = 0
 
• Во Transact-SQL има дополнителна конструкција:
DELETE FROM {table_name | view_name}
[FROM {table_source}]
• Со table_source се определува табелата(табелите), која се користи
како критериум при операцијата DELETE. Пример:
3) Следната команда е еквивалентна со таа од пример 1 за бришење
на редови:
DELETE FROM SaleDetails
FROM Products p
INNER JOIN SaleDetails sd ON p.ProductID = sd.ProductID
WHERE Discontinued = 1
Задача 1. каков ќе е резултатот од следните прашалници:
1.1 CREATE TABLE TotalDaySale
( DateTotal datetime NOT NULL
             CONSTRAINT PK_TotalDaySale PRIMARY KEY,
  DayTotal money NOT NULL
             CONSTRAINT DF_TotalDaySale DEFAULT 0 )
 
INSERT INTO TotalDaySale
SELECT CONVERT(char(10), SaleDate, 112),
        SUM(totalForSale)
FROM Sales
GROUP BY CONVERT(char(10), SaleDate, 112)
1.2. UPDATE SaleDetails
    SET price = 1.25*price
WHERE ProductID IN ( SELECT ProductID
                     FROM Products p
                     INNER JOIN Categories c
                        ON p.CategoryID = c.CategoryID
                     WHERE c.CategoryName = 'name' )
или
UPDATE SaleDetails
   SET price = 1.25*sd.price
FROM SaleDetails sd
INNER JOIN Products p ON sd.ProductID = p.ProductID
INNER JOIN Categories c ON p.CategoryID = c.CategoryID
WHERE c.CategoryName = 'name'
1.3.
UPDATE SaleDetails
   SET price = 1.20*(SELECT MAX(price)
                     FROM Products p
             INNER JOIN Categories c
                   ON p.CategoryID = c.CategoryID
                 WHERE c.CategoryName = 'name')
WHERE SaleID = 12 AND ProductID = 5
 
1.4.
UPDATE SaleDetails
   SET price = 1.75*p.price
FROM SaleDetails sd
INNER JOIN Products p ON sd.ProductID = p.ProductID
или
UPDATE SaleDetails
   SET price =( SELECT 1.75*price
                FROM Products p
                WHERE sd.ProductID = p.ProductID )
FROM SaleDetails sd
XML (Extensible Markup Language)

• е стандард, (мета-јазик) кој дефинира правила за создавање


на специјални “маркерни” јазици.
• е таг базирана нотација за “маркирање” на документи,
слично на HTML
• Сам по себе си тој е безкорисен, затоа што посочува само
како да биде структуриран еден документ (преку маркирање
со етикети), но притоа посочува какво значење имат
оделните маркери (етикети).
• Обичните јазици имаат семантика, т.е. предават
информација, додека XML ја укажува само граматиката
(по-точно синтаксата) на јазиците, кој се базирани на него.
Употреба на XML тип на податок во SQL Server

XML преставува тип на податок за мапирање,


поддршка и складирање XML документ во SQL
база на податоци.

Задача 1: Да се креира табела xmtest, која ќе


содржи две колони, во првата ќе се чува ID на xml
записот, а во втората самиот xml документ.

CREATE TABLE xmltest


( xi int not null primary key,
Xdoc xml not null )
Задача 2: Да се вметне запис во табелата xmltest.

INSERT INTO xmltest


Values(1,
‘<drzavi>
<drzava>
<ime>Makedonija</ime>
<grad>Ohrid</grad>
<grad>Skopje</grad>
</drzava>
<drzava>
<ime>Italija</ime>
<grad>Rome</grad>
<grad>Torino</grad>
</drzava>
</drzavi>’)
Задача 3: Да се прикаже содржината на табелата
xmltest.
SELECT *
FROM xmltest

Резултатот по кликнување на линкот е следниот


Задача 4: Да се разгледаат некои од можностите за конверзија на
релациона табела во XML документ.
• FOR XML клаузулата го конвертира резултатот од упитот во XML
структура и нуди 4 мода на форматирање:
▫ FOR XML RAW
▫ FOR XML AUTO
▫ FOR XML PATH
▫ FOR XML EXPLICIT
• Во продолжение се користени првите два со цел да се прикаже како
се генерира XML со прашалник.
1. KРЕИРАЊЕ НА XML ФРАГМЕНТИ ОД РЕЛАЦИОНИ БАЗА НА
ПОДАТОЦИ СО ПОМОШ НА FOR XML ЕКСТЕНЗИЈА НА
SELECT ИЗРАЗ

• FOR XML RAW модот го трансформира секој ред од резултантното


множество од прашалникот во XML елемент означен како row. При
тоа секоја клона од резултантното множество е претставена како
атрибут на row елементот.
Kреирање на табела Lekovi, која ќе содржи три колони, во
првата ќе се чува lekID примарен клуч, во втората ќе се
запишува име на лекот и во третата составот на лекот.

CREATE TABLE Lekovi


(lekID int NOT NULL IDENTITY PRIMARY KEY,
Ime VARCHAR(50) NOT NULL UNIQUE,
Sostav TEXT NOT NULL)

Конструкција SELECT за извлекување на колоните Ime, Sostav


SELECT Ime,Sostav
FROM Lekovi
• Додавање на конструкцијата FOR XML RAW во SELECT и
резултатот од исполнување на конструкцијата.
SELECT Ime,Sostav
FROM Lekovi
FOR XML RAW

Резултатот по кликнување на линкот е следниот


• FOR XML RAW Модот генерира многу “raw” XML. Секој
ред од резултантното множество го трансформира во XML
row елемент и креира атрибути за секоја од вредностите на
колоните, користејки ги алијас имињата специфицирани во
упитот за имиња на атрибутите.

SELECT Ime as ImeNaLek,Sostav


FROM Lekovi
FOR XML RAW

• FOR XML RAW Модот не генерира XML документ, со


оглед на тоа што нема единствен root елемент.
• За да се промени форматот од атрибут базиран во елемент
базиран , што би значело дека нов елемент ќе биде
креиран за секоја колона, потребно е да се додаде
ELEMENTS клучниот збор после FOR XML клаузулата.
SELECT Ime, Sostav
FROM Lekovi
FOR XML RAW,
ELEMENTS
• ПРЕИМЕНУВАЊЕ НА ROW ЕЛЕМЕНТОТ
За секој ред од резултантното множество, FOR XML RAW
генерира row елемент, за кој може да се специфицира друго
име за овој елемент со додавање на опционен аргумент на
FOR XML RAW . Потребно е да се додаде алиас после FOR
XML RAW клаузулата:
SELECT Ime, Sostav
FROM Lekovi
FOR XML RAW ('Lekarstvo'),
ELEMENTS

You might also like