Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

CRUD операции на SQL Server

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

Терминът CRUD се появява за първи път в книгата на Джеймс Мартин „Управление на средата на базата данни“. Оттогава този термин става популярен. В тази статия ще разгледаме операцията CRUD по отношение на SQL Server, тъй като синтаксисът на операцията може да се различава от други релационни и NoSQL бази данни.

Подготовки

Основната идея на релационните бази данни е съхраняването на данни в таблици. Данните от таблицата могат да се четат, вмъкват, изтриват. По този начин CRUD операциите манипулират данните в таблицата.

C C REATE Вмъкване на ред/редове в таблица
R R ЕАД Прочетете (изберете) ред/редове от таблица
U U PDATE Редактиране на ред/редове в таблицата
D D ELETE Изтриване на ред/редове от таблицата

За да илюстрираме операциите на CRUD, имаме нужда от таблица с данни. Нека създадем такъв. Той ще съдържа само три колони. Първата колона ще съхранява имената на държавите, втората ще съхранява континента на тези държави, а последната колона ще съхранява населението на тези страни. Можем да създадем тази таблица с помощта на оператора T-SQL и да я озаглавим като TblCountry .

CREATE TABLE [dbo].[TblCountry]
(
	[CountryName]		VARCHAR(50), 
    [ContinentNames]	VARCHAR(50) NULL, 
    [CountryPopulation]		BIGINT NULL 
)

Сега нека прегледаме CRUD операциите, извършени в TblCountry таблица.

C – СЪЗДАВАНЕ

За да добавим нови редове към таблица, използваме INSERT INTO команда. В тази команда трябва да посочим името на целевата таблица и ще изброим имената на колоните в скоби. Структурата на израза трябва да завършва със VALUES:

INSERT INTO TblCountry  
(CountryName,ContinentNames,CountryPopulation) 
VALUES   ('Germany','Europe',8279000 )

За да добавим няколко реда към таблицата, можем да използваме следния тип оператор INSERT:

INSERT INTO TblCountry  
(CountryName,ContinentNames,CountryPopulation) 
VALUES   
('Germany','Europe',8279000 ), 
('Japan','Asia',126800000 ),
('Moroco','Africa',35740000)

Имайте предвид, че INTO ключовата дума не е задължителна и не е необходимо да я използвате в изразите за вмъкване.

INSERT  TblCountry  
(CountryName,ContinentNames,CountryPopulation) 
VALUES   
('Germany','Europe',8279000 ), 
('Japan','Asia',126800000 ),
('Moroco','Africa',35740000)

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

INSERT INTO TblCountry
SELECT 'Germany','Europe',8279000 
UNION ALL
SELECT 'Japan','Asia',126800000 
UNION ALL
SELECT 'Moroco','Africa',35740000

Сега ще копираме данни директно от таблицата източник в таблицата местоназначение. Този метод е известен като INSERT INTO ... SELECT изявление.

INSERT INTO ... SELECT изисква съвпадение на типовете данни на таблиците източник и местоназначение. В следния оператор INSERT INTO ... SELECT ще вмъкнем данните от SourceCountryTbl таблица в TblCountry таблица.

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

DROP TABLE IF EXISTS [SourceCountryTbl]
CREATE TABLE [dbo].[SourceCountryTbl]
(
	[SourceCountryName]		VARCHAR(50), 
    [SourceContinentNames]	VARCHAR(50) NULL, 
    [SourceCountryPopulation]		BIGINT NULL 
	
)


INSERT INTO [SourceCountryTbl] 
VALUES 
('Ukraine','Europe',44009214  ) ,
('UK','Europe',66573504) ,
('France','Europe',65233271)

Сега ще изпълним оператора INSERT INTO ... SELECT.

INSERT INTO TblCountry
SELECT * FROM SourceCountryTbl

Горният оператор за вмъкване добави всички SourceCountryTbl данни за TblCountry маса. Можем също да добавим КЪДЕ клауза за филтриране на оператора за избор.

INSERT INTO TblCountry
SELECT * FROM SourceCountryTbl WHERE TargetCountryName='UK'

SQL Server ни позволява да използваме таблични променливи (обекти, които помагат да се съхраняват временни таблични данни в локалния обхват) с операторите INSERT INTO ... SELECT. В следващата демонстрация ще използваме променливата на таблицата като изходна таблица:

  DECLARE @SourceVarTable AS TABLE
  ([TargetCountryName]		VARCHAR(50), 
    [TargetContinentNames]	VARCHAR(50) NULL, 
    [TargetCountryPopulation]		BIGINT NULL 
   )


    INSERT INTO @SourceVarTable 
     VALUES 
     ('Ukraine','Europe',44009214  ) ,
     ('UK','Europe',66573504) ,
     ('France','Europe',65233271)


INSERT INTO TblCountry
SELECT * FROM @SourceVarTable

Съвет :Microsoft обяви функция в SQL Server 2016, която е паралелно вмъкване . Тази функция ни позволява да изпълняваме операции INSERT в паралелни нишки.

Ако добавите TABLOCK намек в края на оператора за вмъкване, SQL Server може да избере паралел с плана за изпълнение на обработката според максималната степен на паралелизъм на вашия сървър или прага на разходите за параметрите на паралелизъм.

Паралелната обработка на вмъкване също ще намали времето за изпълнение на оператора за вмъкване. Въпреки това, TABLOCK hint ще придобие заключването на вмъкнатата таблица по време на операцията вмъкване. За повече информация относно паралелното вмъкване можете да се обърнете към Real World Parallel INSERT...SELECT.

Друг удобен израз е SELECT INTO. Този метод ни позволява да копираме данни от една таблица в новосъздадена таблица. В следното изявление NewCountryTable не е съществувал преди изпълнението на заявката. Заявката създава таблицата и вмъква всички данни от TblCountry таблица.

SELECT * INTO NewCountryTable 
FROM TblCountry

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

В някои случаи трябва да върнем и използваме вмъкнати стойности от оператора INSERT. От SQL Server 2005 операторът INSERT ни позволява да извличаме въпросните стойности от оператора INSERT.

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

В следващата извадка ще декларираме таблица с една колона и ще вмъкнем изхода на SeqID стойност на колоната към тази таблица с помощта на колоната OUTPUT:

DROP TABLE IF EXISTS TblCountry
CREATE TABLE [dbo].[TblCountry]
(
	[CountryName]		VARCHAR(50), 
    [ContinentNames]	VARCHAR(50) NULL, 
    [CountryPopulation]		BIGINT NULL ,
	SeqID uniqueidentifier  default(newid())
)	



DECLARE @OutputID AS TABLE(LogID uniqueidentifier) 
 
INSERT  TblCountry  
(CountryName,ContinentNames,CountryPopulation) 
OUTPUT INSERTED.SeqId INTO @OutputID
VALUES   
('Germany','Europe',8279000 )

SELECT * FROM @OutPutId

R – Четене

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

Инструкцията SELECT играе единствена основна роля в четене операция. Тя се основава на три компонента:

  • Колона – дефинираме колоните, от които искаме да извлечем данни
  • Таблица – ние посочете таблицата, от която искаме да получим данни
  • Филтър – ние може да филтрира данните, които искаме да прочетем. Тази част не е задължителна.

Най-простата форма на оператора за избор е както следва:

SELECT column1, column2,...,columnN
FROM table_name

Сега ще преминем през примерите. Първо се нуждаем от примерна таблица за четене. Нека го създадем:

DROP TABLE  IF EXISTS TblCountry
 GO
CREATE TABLE [dbo].[TblCountry]
(
	[CountryName]		VARCHAR(50), 
    [ContinentNames]	VARCHAR(50) NULL, 
    [CountryPopulation]		BIGINT NULL 
)

GO
INSERT INTO TblCountry  
(CountryName,ContinentNames,CountryPopulation) 
VALUES   
('Germany','Europe',8279000 ), 
('Japan','Asia',126800000 ),
('Moroco','Africa',35740000)

Четене на всички колони в таблицата

Операторът звездичка (*) се използва в операторите SELECT, защото връща всички колони в таблицата:

SELECT * FROM TblCountry

Съвет :Операторът звездичка (*) може да повлияе негативно на производителността, защото причинява повече мрежов трафик и консумира повече ресурси. По този начин, ако не е необходимо да получавате всички върнати данни от всички колони, избягвайте да използвате звездичката (*) в оператора SELECT.

Четене на определени колони от таблицата

Можем да четем и определени колони от таблицата. Нека прегледаме примера, който ще върне само Име на държава и Население на страната колони:

SELECT CountryName,CountryPopulation FROM TblCountry

Използване на псевдоним в изразите SELECT

В операторите SELECT можем да дадем временни имена на таблицата или колоните. Тези временни имена са псевдоними. Нека пренапишем предишните две заявки с псевдоними на таблица и колона.

В следната заявка TblC псевдонимът ще посочи името на таблицата:

SELECT TblC.* FROM TblCountry TblC

В следващия пример ще предоставим псевдоними за имената на колоните. Ще променим Име на държава до CName , и Население на страната – доCPop .

SELECT TblC.CountryName AS [CName], CountryPopulation AS [CPop] FROM TblCountry TblC

Целите на псевдонима са:

  • Направете заявката по-четлива, ако имената на таблицата или колоните са сложни.
  • Уверете се, че използвате заявка за таблицата повече от един път.
  • Опростете писането на заявка, ако името на таблицата или колоната е дълго.

Филтриране на изрази SELECT

Инструкциите SELECT ни позволяват да филтрираме наборите от резултати чрез клаузата WHERE. Например искаме да филтрираме израза SELECT според Име на държава колона и връща само данните за Германия в набора от резултати. Следната заявка ще извърши операцията за четене с филтър:

SELECT TblC.* FROM TblCountry TblC
WHERE TblC.CountryName='Germany'

Сортиране на резултатите от SELECT изрази

Клаузата ORDER BY ни помага да сортираме резултантния набор на оператора SELECT по посочената колона или колони. Можем да извършим възходящо или низходящо сортиране с помощта на клаузата ORDER BY.

Ще сортираме TblCountry таблица според населението на държавите във възходящ ред:

SELECT TblC.* FROM TblCountry TblC
ORDER BY TblC.CountryPopulation ASC

Съвет :Можете да използвате индекса на колоните в клаузата ORDER BY, а индексите на колоните започват с 1.

Можем да напишем и предишната заявка. Числото три (3) показва Население на страната колона:

SELECT TblC.* FROM TblCountry TblC
ORDER BY 3 ASC

U – Актуализация

Инструкцията UPDATE променя съществуващите данни в таблицата. Този израз трябва да включва клаузата SET, за да можем да дефинираме целевата колона за промяна на данните.

Следната заявка ще промени всички редове на Популация на страната стойност на колоната до 1.

UPDATE TblCountry SET CountryPopulation=1
GO
SELECT TblC.* FROM TblCountry TblC

В операторите UPDATE можем да използваме клаузата WHERE, за да модифицираме конкретен ред или редове в таблицата.

Нека променим Япония ред Население на страната до 245000:

UPDATE TblCountry SET CountryPopulation=245000
WHERE CountryName = 'Japan'
GO
SELECT TblC.* FROM TblCountry TblC

Инструкцията UPDATE е обединение на операторите за изтриване и вмъкване. Така че можем да върнем вмъкнатите и изтритите стойности чрез клаузата OUTPUT.

Нека направим пример:

UPDATE TblCountry SET CountryPopulation=22
OUTPUT inserted.CountryPopulation AS [Insertedvalue],
deleted.CountryPopulation AS [Deletedvalue]
WHERE CountryName = 'Germany'

Както можете да видите, променихме Население на страната стойност от 1 до 22. След това можем да открием въведените и изтритите стойности. Освен това можем да вмъкнем тези стойности в таблична променлива (специален тип променлива, която може да се използва като таблица).

Ще вмъкнем вмъкнатите и изтритите стойности в променливата на таблицата:

DECLARE @LogTable TABLE(InsertValLog INT , DelValLog INT) 


UPDATE TblCountry SET CountryPopulation=45
OUTPUT inserted.CountryPopulation ,
deleted.CountryPopulation INTO @LogTable
WHERE CountryName = 'Germany'


SELECT * FROM @LogTable

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

В следващия пример заявката за актуализиране ще промени 3 реда, а системната променлива @@ROWCOUNT ще върне 3.

UPDATE TblCountry SET CountryPopulation=1
SELECT @@ROWCOUNT AS [AffectedRowNumber]

D – Изтриване

Инструкцията Delete премахва съществуващите редове/редове от таблицата.

Първо, нека видим как да използваме клаузата WHERE в операторите DELETE. През повечето време искаме да филтрираме изтритите редове.

Примерът по-долу илюстрира как да премахнете конкретен ред:

SELECT TblC.* FROM TblCountry TblC
DELETE FROM TblCountry WHERE CountryName='Japan'
SELECT TblC.* FROM TblCountry TblC

Въпреки че с оператора DELETE можем да премахнем всички записи от таблицата. Инструкцията DELETE обаче е много основна и ние не използваме условието WHERE.

SELECT TblC.* FROM TblCountry TblC
DELETE FROM TblCountry
SELECT TblC.* FROM TblCountry TblC

Все пак, при някои обстоятелства на дизайна на базата данни, операторът DELETE не изтрива реда/редовете, ако нарушава външни ключове или други ограничения.

Например в AdventureWorks база данни, не можем да изтрием редове от Категория на продукта таблица, защото ProductCategoryID е посочен като външен ключ в тази таблица.

Нека се опитаме да изтрием ред от Категория на продукта таблица – без съмнение ще се сблъскаме със следната грешка:

DELETE FROM [Production].[ProductCategory]
WHERE ProductCategoryID=1

Заключение

По този начин ние проучихме CRUD операциите в SQL. Инструкциите INSERT, SELECT, UPDATE и DELETE са основните функции на SQL базата данни и трябва да ги овладеете, ако искате да научите програмиране на база данни на SQL. Теорията CRUD може да бъде добра отправна точка и много практика ще ви помогне да станете експерт.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как програмно определяте кои SQL таблици имат колона за идентичност

  2. T-SQL условна поръчка по

  3. Как да конвертирате низ в шестнадесетичен и обратно?

  4. Използвайте OBJECTPROPERTY(), за да определите дали даден обект е изглед в SQL Server

  5. SQL Server:каскаден еквивалент на пускане на таблица?