1. Професионална гимназия по механотехника и електротехника "М. В. Ломоносов" - гр. Добрич
www.pglomonosov.org
Красимир Дойчев SQL Server Команди за манипулиране на данни 1 от 5
Тема 21. Команди за манипулиране на данни – INSERT, UPDATE, DELETE
инж. Красимир Дойчев kdoychev@gmail.com
В предните уроци получихте основни знания за създаване на заявки към БД чрез
конструкцията Select. Чрез заявките може да се извличат интересуващи ни данни от
таблиците на БД.
Основен компонент на една база данни е възможността за модифи¬циране на
данните, съхранени в нея. SQL Server поддържа няколко метода за добавяне на нови редове с
данни към таблиците в една SQL Server база данни, за променяне на данните в
съществуващите редове и за изтриване на редове.
Целта на настоящия урок е да разширите знанията си за работа с Transact-SQL, като
се запознаете с командите за модифициране на данните – добавяне на нови данни, промяна
на съществуващи данни, изтриване на данни.
1. Методи за вмъкване на данни в база данни на SQL Server
SQL Server включва няколко метода за добавяне на данни в една база данни:
Конструкция INSERT
Конструкция SELECT...INTO – тази конструкция е разгледана в по-предния урок
Конструкция WRITETEXT
Няколко опции на приложния програмен интерфейс на базата данни, които можете
да използвате за добавяне на данни тип ntext, text или image към един ред
Компонент bulk copy за вмъкване на голям брой редове
2. Конструкция INSERT
2.1. Същност и синтаксис на INSERT
Конструкция INSERT добавя един или повече нови редове в една таблица. Ако
разгледаме нещата по-опростено, конструкцията INSERT има следния вид:
INSERT [INTO] таблица или изглед [(списък от колони)] стойности на данни
Конструкцията предизвиква вмъкване на стойностите на данните като един или
повече редове в посочената таблица или изглед. Списъкът от имена на колоните, разделени
със запетаи, се използва за посочване на колоните, за които се предоставят данните. Ако не
са зададени колони, всички колони в таблицата или изгледа получават данни. Ако е зададен
само частичен списък от колони, във всяка колона, която липсва в списъка, се вмъква
стойност null или подразбиращата се стойност (ако съществува дефиниция DEFAULT).
Всички колони, които не са зададени в списъка от колони, трябва или да допускат стойности
null, или да имат присвоена стойност по подразбиране.
Не е необходимо в конструкция INSERT да се задават стойности за следните видове
колони, тъй като SQL Server автоматично генерира тези стойности:
Колони със свойство IDENTITY
Колони с дефиниция DEFAULT, която използва функция NEWIDQ
Изчислявани колони
Забележка Ключовата дума INTO в конструкция INSERT е опционална и се използва
само за по-голяма разбираемост на кода.
2. Професионална гимназия по механотехника и електротехника "М. В. Ломоносов" - гр. Добрич
www.pglomonosov.org
Красимир Дойчев SQL Server Команди за манипулиране на данни 2 от 5
Предоставените стойности на данните трябва да съответстват на списъка от колони:
Броят на стойностите на данните трябва да бъде еднакъв с броя на колоните;
Типът данни, точността и мащабът за всяка стойност на данните трябва да са
същите като тези на съответната колона.
Когато дефинирате една конструкция INSERT, можете да използвате клауза VALUES,
за да зададете стойностите на данните за един ред, или можете да използвате подзаявка
SELECT, за да зададете стойностите на данните за един или повече редове.
Забележка Подзаявката SELECT се използва в една конструкция INSERT за добавяне
на подмножества от съществуващи данни към една таблица, докато клауза VALUES се
използва в една конструкция INSERT за добавяне на нови данни към една таблица.
2.2. Използване на конструкция INSERT...VALUES за добавяне на данни
Клауза VALUES ви дава възможност да задавате стойности за един ред от таблица.
Стойностите се задават като списък от скаларни изрази, разделени със запетаи, чиито тип
данни, точност и мащаб трябва да могат да се преобразуват неявно или да са същите като на
съответната колона в списъка от колони. Ако не е зададен списък от колони, стойностите
трябва да се задават в същата последователност като колоните в таблицата или изгледа.
Пример 1:
а) В база данни Pubs да се създаде таблица NewBooks (нови книги) с полета:
BookID – идентификационен номер, със свойство IDENTITY - с автоматично
номериране;
BookTitle – заглавие на книгата, текст с променлива дължина до 50 символа, не
допуска стойност Null;
BookType – тип на книгата, текст с фиксирана дължина 12 символа, не допуска
стойност Null, има подразбираща се стойност 'Undecided' - нерешен;
PubCity – град на издаване, текст с променлива дължина до 50 символа, допуска
стойност Null;
USE Pubs
CREATE TABLE NewBooks
(
BookID INT IDENTITY(1,1) NOT NULL,
BookTitle VARCHAR(50) NOT NULL,
BookType CHAR(12) NOT NULL
CONSTRAINT [booktype_df] DEFAULT ('Undecided'),
PubCity VARCHAR(50) NULL
б) След създаване на таблицата, да се добави ред с данни към тази таблица.
Следващата конструкция INSERT използва клауза VALUES за вмъкване на нов ред в
таблица NewBooks:
USE Pubs
INSERT INTO NewBooks (BookTitle, PubCity)
VALUES ('Life Without Fear’, 'Chicago')
3. Професионална гимназия по механотехника и електротехника "М. В. Ломоносов" - гр. Добрич
www.pglomonosov.org
Красимир Дойчев SQL Server Команди за манипулиране на данни 3 от 5
С тази конструкция се дефинират стойности за колона BookTitle и колона PubCity. He
е необходимо да се включва колона BookID в конструкцията INSERT, тъй като колона
BookID е дефинирана със свойство IDENTITY. Следователно стойностите за тази колона се
генерират автоматично. Освен това, понеже не е дефинирана стойност за колона BookTitle,
SQL Server автоматично вмъква подразбиращата се стойност (Undecided) в колоната, когато
изпълнявате конструкцията INSERT.
2.3. Използване на подзаявка SELECT за добавяне на данни
Можете да използвате подзаявка SELECT в конструкцията INSERT, за да добавите
стойности от една или повече други таблици или изгледи към дадена таблица. Подзаявката
ви дава възможност да добавите повече от един ред едновременно.
Пример 2:
Следващата конструкция INSERT използва подзаявка SELECT за вмъкване на редове
в таблица NewBooks:
USE Pubs
INSERT INTO NewBooks (BookTitle, BookType)
SELECT Title, Type
FROM Titles
WHERE Type = 'mod_cook'
Тази конструкция INSERT използва изхода от една подзаявка SELECT, за да
предостави данните, които трябва да бъдат вмъкнат в таблица NewBooks.
3. Методи за модифициране на данни в база данни на SQL Server
След като таблиците са създадени и в тях са добавени данни, промяната или
актуализирането на данни в таблиците става един от ежедневните процеси по поддържане на
базата данни. SQL Server предоставя няколко метода за промяна на данните в една
съществуваща таблица:
Конструкция UPDATE
Приложни програмни интерфейси на базата данни и курсори
Конструкция UPDATETEXT
Актуализациите се извършват върху изгледите по същия начин, както и върху
таблиците (с някои ограничения).
4. Конструкция UPDATE за модифициране на данни
4.1. Същност на UPDATE
Конструкция UPDATE може да променя стойностите на данните в отделни редове, в
групи редове или във всички редове в една таблица или изглед. Можете също така да
използвате тази конструкция и за актуализиране на редовете на един отдалечен сървър, като
използвате или името на свързан сървър или функциите OPENROWSET,
OPENDATASOURCE и OPENQUERY (при условие, че OLE DB доставчикът, използван за
достъп до отдалечения сървър, поддържа актуализации). Една конструкция UPDATE, в
която има обръщение към таблица или изглед, може да променя данните в само една базова
таблица във всеки момент.
4. Професионална гимназия по механотехника и електротехника "М. В. Ломоносов" - гр. Добрич
www.pglomonosov.org
Красимир Дойчев SQL Server Команди за манипулиране на данни 4 от 5
Забележка Една актуализация е успешна, само ако новата стойност е съвместима с
типа данни на колоната-адресат и ако спазва всички ограничения, които са в сила за тази
колона.
Конструкция UPDATE има следните основни клаузи:
SET
WHERE
FROM
4.2. Използване на клауза SET за модифициране на данни
SET задава колоните, които трябва да бъдат променени и новите стойности за тези
колони. Стойностите в зададените колони се актуализират със стойностите, посочени в
клауза SET във всички редове, които отговарят на условията за търсене в клауза WHERE.
Ако не е зададена клауза WHERE, всички редове се актуализират.
Пример 3: В следващата конструкция UPDATE има клауза SET, чрез която се
увеличават цените на книгите в таблица NewBooks с 10 процента:
USE Pubs
UPDATE NewBooks
SET Price = Price * 1.1
В тази конструкция не се използва клауза WHERE, така че ще бъдат актуализирани
всички редове в таблицата (освен ако колона Price съдържа стойност null).
4.3. Използване на клауза WHERE за модифициране на данни
Клауза WHERE изпълнява две функции:
Определя редовете, които трябва да бъдат актуализирани
Посочва редовете от таблиците-източник, които отговарят на изискванията за
предоставяне на стойности за актуализацията, ако е зададена също и клауза FROM
Ако не е зададена клауза WHERE, всички редове в таблицата се актуализират.
Пример 4: В следващата конструкция UPDATE клауза WHERE се използва, за да
ограничи актуализацията само до тези редове, които отговарят на условието, дефинирано в
клаузата:
USE Pubs
UPDATE NewBooks
SET BookType = 'popular'
WHERE BookType = 'popular_comp'
Тази конструкция променя името popular_comp и то става popular. Ако в
конструкцията липсваше клауза WHERE, всички стойности в ВоокТуре щяха да бъдат
променени на popular.
4.4. Използване на клауза FROM за модифициране на данни
Можете да използвате клауза FROM, за да изтеглите данни от една или повече
таблици или изгледи в таблицата, която искате да актуализирате.
Пример 5: В следващата конструкция UPDATE клаузата FROM включва вътрешно
съединение, което обединява заглавията от таблици NewBooks и Titles:
5. Професионална гимназия по механотехника и електротехника "М. В. Ломоносов" - гр. Добрич
www.pglomonosov.org
Красимир Дойчев SQL Server Команди за манипулиране на данни 5 от 5
USE Pubs
UPDATE NewBooks
SET Price = Titles.Price
FROM NewBooks JOIN Titles
ON NewBooks.BookTitle = Titles.Title
С тази конструкция стойностите за Price в таблица NewBooks се актуализират със
същите стойности, които се намират в колона Price от таблица Titles.
Конструкциите за модифициране на данни работят с изгледите по същия начин, както
с таблиците (с някои ограничения).
5. Изтриване на данни в база данни на SQL Server
SQL Server поддържа няколко метода, които можете да използвате за изтриване на
данни в една съществуваща таблица:
Конструкция DELETE
API и курсори
Конструкция TRUNCATE TABLE
5.1. Използване на конструкция DELETE за изтриване на данни
Конструкция DELETE премахва един или повече редове от една таблица или изглед.
Следният синтаксис представлява опростен, форма на конструкция DELETE:
DELETE таблица или изглед FROM таблица източник WHERE условие за търсене
На мястото на „таблица или изглед” се задава името на таблица или изглед, от който
трябва да се изтрият редове. Всички редове в една таблица или изглед, които отговарят на
условието за търсене в клауза WHERE, се изтриват. Ако не е зададена клауза WHERE, се
изтриват всички редове от таблицата или изгледа.
Клауза FROM задава допълнителни таблици или изгледи и условия за съединение,
които могат да се използват от предикатите в условието за търсене от клауза WHERE, за да
определят редовете за изтриване от една таблица или изглед. От таблиците, посочени в
клауза FROM, не се изтриват редове. Изтриването на редове става само от таблиците,
посочени в клауза DELETE.
Пример 6: От таблица NewBooks да се изтрият редовете с книги, за които хонорарът
на автора от продажбите на тези книги е 10 процента. Хонорарът се определя от стойностите
в колона Royalty на таблица Titles.
USE Pubs
DELETE NewBooks
FROM Titles
WHERE NewBooks.BookTitle = Titles.Title AND Titles.Royalty = 10
Забележка: Всяка таблица, на която са изтрити всичките редове, остава в базата данни.
Конструкция DELETE изтрива единствено редове от таблицата. Таблицата трябва да бъде
премахната от базата данни чрез конструкция DROP TABLE.
ЛИТЕРАТУРА
1. Microsoft. MSCE Microsoft SQL Server 2000 Проектиране и реализация на бази данни
Training kit. С., Софтпрес, 2001.
2. SQL Server Books Online