Na programação de banco de dados, existem quatro operações fundamentais:criar , leia , atualizar e excluir – CRUD operações. Eles são o primeiro passo na programação de banco de dados.
O termo CRUD apareceu pela primeira vez no livro de James Martin ‘Managing the Database Environment’. Neste artigo, vamos explorar a operação CRUD em termos de SQL Server porque a sintaxe da operação pode ser diferente de outros bancos de dados relacionais e NoSQL.
Preparações
A ideia principal dos bancos de dados relacionais é armazenar dados em tabelas. Os dados da tabela podem ser lidos, inseridos, excluídos. Dessa forma, as operações CRUD manipulam os dados da tabela.
C | C REATE | Inserir linha/linhas em uma tabela |
R | R EAD | Ler (selecionar) linha/linhas de uma tabela |
U | U PDATE | Editar linha/linhas na tabela |
D | D ELE | Excluir linha/linhas da tabela |
Para ilustrar as operações CRUD, precisamos de uma tabela de dados. Vamos criar um. Ele conterá apenas três colunas. A primeira coluna armazenará os nomes dos países, a segunda armazenará o continente desses países e a última coluna armazenará a população desses países. Podemos criar esta tabela com a ajuda da instrução T-SQL e intitular como TblCountry .
CREATE TABLE [dbo].[TblCountry]
(
[CountryName] VARCHAR(50),
[ContinentNames] VARCHAR(50) NULL,
[CountryPopulation] BIGINT NULL
)
Agora, vamos revisar as operações CRUD realizadas no TblCountry tabela.
C – CRIAR
Para adicionar novas linhas a uma tabela, usamos o INSERT INTO comando. Neste comando, precisamos especificar o nome da tabela de destino e listaremos os nomes das colunas entre colchetes. A estrutura da instrução deve terminar com VALUES:
INSERT INTO TblCountry
(CountryName,ContinentNames,CountryPopulation)
VALUES ('Germany','Europe',8279000 )
Para adicionar várias linhas à tabela, podemos usar o seguinte tipo de instrução INSERT:
INSERT INTO TblCountry
(CountryName,ContinentNames,CountryPopulation)
VALUES
('Germany','Europe',8279000 ),
('Japan','Asia',126800000 ),
('Moroco','Africa',35740000)
Observe que o INTO palavra-chave é opcional e você não precisa usá-la nas instruções de inserção.
INSERT TblCountry
(CountryName,ContinentNames,CountryPopulation)
VALUES
('Germany','Europe',8279000 ),
('Japan','Asia',126800000 ),
('Moroco','Africa',35740000)
Além disso, você pode usar o seguinte formato para inserir várias linhas na tabela:
INSERT INTO TblCountry
SELECT 'Germany','Europe',8279000
UNION ALL
SELECT 'Japan','Asia',126800000
UNION ALL
SELECT 'Moroco','Africa',35740000
Agora, copiaremos os dados diretamente da tabela de origem para a tabela de destino. Este método é conhecido como INSERT INTO … SELECT demonstração.
INSERT INTO … SELECT requer a correspondência dos tipos de dados das tabelas de origem e destino. Na instrução INSERT INTO … SELECT a seguir, inseriremos os dados do SourceCountryTbl tabela no TblCountry tabela.
Inicialmente, inserimos alguns dados sintéticos no SourceCountryTbl mesa para esta demonstração.
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)
Agora vamos executar a instrução INSERT INTO … SELECT.
INSERT INTO TblCountry
SELECT * FROM SourceCountryTbl
A instrução de inserção acima adicionou todos os SourceCountryTbl dados para o TblCountry tabela. Também podemos adicionar o WHERE cláusula para filtrar a instrução select.
INSERT INTO TblCountry
SELECT * FROM SourceCountryTbl WHERE TargetCountryName='UK'
O SQL Server nos permite usar variáveis de tabela (objetos que ajudam a armazenar dados temporários de tabela no escopo local) com as instruções INSERT INTO … SELECT. Na demonstração a seguir, usaremos a variável table como uma tabela de origem:
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
Dica :A Microsoft anunciou um recurso no SQL Server 2016 que é inserção paralela . Esse recurso nos permite realizar operações INSERT em threads paralelas.
Se você adicionar o TABLOCK dica no final de sua instrução de inserção, o SQL Server pode escolher um plano de execução paralela com o processamento de acordo com o grau máximo de paralelismo do seu servidor ou o limite de custo para parâmetros de paralelismo.
O processamento de inserção paralela também reduzirá o tempo de execução da instrução de inserção. No entanto, o TABLOCO dica irá adquirir o bloqueio da tabela inserida durante a operação de inserção. Para mais informações sobre a inserção paralela, você pode consultar o Real World Parallel INSERT…SELECT.
Outra instrução útil é SELECT INTO. Esse método nos permite copiar dados de uma tabela para uma tabela recém-criada. Na declaração a seguir, NewCountryTable não existia antes da execução da consulta. A consulta cria a tabela e insere todos os dados do TblCountry tabela.
SELECT * INTO NewCountryTable
FROM TblCountry
Ao mesmo tempo, podemos criar uma nova tabela para colunas específicas da tabela de origem.
Em alguns casos, precisamos retornar e usar valores inseridos da instrução INSERT. Desde o SQL Server 2005, a instrução INSERT nos permite recuperar valores em questão da instrução INSERT.
Agora, vamos descartar e criar nossa tabela de teste e adicionar uma nova coluna de identidade. Além disso, adicionaremos uma restrição padrão a esta coluna. Assim, se não inserirmos nenhum valor explícito nesta coluna, ela criará automaticamente um novo valor.
No exemplo a seguir, declararemos uma tabela com uma coluna e inseriremos a saída do SeqID valor da coluna para esta tabela com a ajuda da coluna 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 – Ler
A Ler A operação recupera dados de uma tabela e retorna um conjunto de resultados com os registros da tabela. Caso queiramos recuperar dados de mais de uma tabela, podemos utilizar o operador JOIN e criar uma relação lógica entre as tabelas.
A instrução SELECT desempenha um único papel principal no ler Operação. É baseado em três componentes:
- Coluna – definimos as colunas das quais queremos recuperar dados
- Tabela – nós especifique a tabela da qual queremos obter dados
- Filtro – nós pode filtrar os dados que queremos ler. Esta parte é opcional.
A forma mais simples da instrução select é a seguinte:
SELECT column1, column2,...,columnN
FROM table_name
Agora, vamos passar pelos exemplos. Inicialmente, precisamos de uma tabela de amostra para ler. Vamos criá-lo:
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)
Ler todas as colunas da tabela
O operador asterisco (*) é usado nas instruções SELECT porque retorna todas as colunas da tabela:
SELECT * FROM TblCountry
Dica :O operador asterisco (*) pode influenciar negativamente o desempenho porque causa mais tráfego de rede e consome mais recursos. Assim, se você não precisar obter todos os dados de todas as colunas retornadas, evite usar o asterisco (*) na instrução SELECT.
Lendo colunas específicas da tabela
Podemos ler colunas específicas da tabela também. Vamos analisar o exemplo que retornará apenas o CountryName e PaísPopulação colunas:
SELECT CountryName,CountryPopulation FROM TblCountry
Usando alias nas instruções SELECT
Nas instruções SELECT, podemos dar nomes temporários à tabela ou colunas. Esses nomes temporários são aliases. Vamos reescrever as duas consultas anteriores com aliases de tabela e coluna.
Na consulta a seguir, o TblC alias especificará o nome da tabela:
SELECT TblC.* FROM TblCountry TblC
No exemplo a seguir, forneceremos aliases para os nomes das colunas. Alteraremos Nome do País para CName e PaísPopulação – para CPop .
SELECT TblC.CountryName AS [CName], CountryPopulation AS [CPop] FROM TblCountry TblC
Os objetivos do alias são:
- Torne a consulta mais legível se os nomes das tabelas ou colunas forem complexos.
- Certifique-se de usar uma consulta para a tabela mais de uma vez.
- Simplifique a escrita da consulta se o nome da tabela ou coluna for longo.
Filtrando instruções SELECT
As instruções SELECT nos permitem filtrar os conjuntos de resultados por meio da cláusula WHERE. Por exemplo, queremos filtrar a instrução SELECT de acordo com o CountryName coluna e retornar apenas os dados da Alemanha no conjunto de resultados. A consulta a seguir realizará a operação de leitura com um filtro:
SELECT TblC.* FROM TblCountry TblC
WHERE TblC.CountryName='Germany'
Classificando resultados de instruções SELECT
A cláusula ORDER BY nos ajuda a classificar o conjunto de resultados da instrução SELECT pela coluna ou colunas especificadas. Podemos realizar ordenação ascendente ou descendente com a ajuda da cláusula ORDER BY.
Classificaremos o TblCountry tabela de acordo com a população dos países em ordem crescente:
SELECT TblC.* FROM TblCountry TblC
ORDER BY TblC.CountryPopulation ASC
Dica :você pode usar o índice da coluna na cláusula ORDER BY e os números do índice das colunas começam por 1.
Também podemos escrever a consulta anterior. O número três (3) indica a CounrtyPopulation coluna:
SELECT TblC.* FROM TblCountry TblC
ORDER BY 3 ASC
U – Atualização
A instrução UPDATE modifica os dados existentes na tabela. Essa instrução deve incluir a cláusula SET para que possamos definir a coluna de destino para modificar os dados.
A consulta a seguir alterará todas as linhas da CounrtyPopulation valor da coluna para 1.
UPDATE TblCountry SET CountryPopulation=1
GO
SELECT TblC.* FROM TblCountry TblC
Nas instruções UPDATE, podemos usar a cláusula WHERE para modificar uma linha ou linhas específicas na tabela.
Vamos mudar o Japão linha de CounrtyPopulation para 245000:
UPDATE TblCountry SET CountryPopulation=245000
WHERE CountryName = 'Japan'
GO
SELECT TblC.* FROM TblCountry TblC
A instrução UPDATE é uma união das instruções delete e insert. Assim, podemos retornar os valores inseridos e excluídos através da cláusula OUTPUT.
Vamos fazer um exemplo:
UPDATE TblCountry SET CountryPopulation=22
OUTPUT inserted.CountryPopulation AS [Insertedvalue],
deleted.CountryPopulation AS [Deletedvalue]
WHERE CountryName = 'Germany'
Como você pode ver, modificamos a CountryPopulation valor de 1 a 22. Então podemos descobrir os valores inseridos e excluídos. Além disso, podemos inserir esses valores em uma variável de tabela (um tipo de variável especial que pode ser usado como tabela).
Vamos inserir os valores inseridos e excluídos na variável da tabela:
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 é uma variável de sistema que retorna o número de linhas afetadas na última instrução. Assim, podemos usar essa variável para expor algumas linhas modificadas na instrução de atualização.
No exemplo a seguir, a consulta de atualização mudará 3 linhas e a variável de sistema @@ROWCOUNT retornará 3.
UPDATE TblCountry SET CountryPopulation=1
SELECT @@ROWCOUNT AS [AffectedRowNumber]
D – Excluir
A instrução Delete remove a(s) linha(s) existente(s) da tabela.
Primeiramente, vamos ver como usar a cláusula WHERE nas instruções DELETE. Na maioria das vezes, queremos filtrar as linhas excluídas.
O exemplo abaixo ilustra como remover uma linha específica:
SELECT TblC.* FROM TblCountry TblC
DELETE FROM TblCountry WHERE CountryName='Japan'
SELECT TblC.* FROM TblCountry TblC
Embora com a instrução DELETE, podemos remover todos os registros da tabela. No entanto, a instrução DELETE é muito básica e não usamos a condição WHERE.
SELECT TblC.* FROM TblCountry TblC
DELETE FROM TblCountry
SELECT TblC.* FROM TblCountry TblC
Ainda assim, em algumas circunstâncias dos designs de banco de dados, a instrução DELETE não exclui a(s) linha(s) se violar chaves estrangeiras ou outras restrições.
Por exemplo, no AdventureWorks banco de dados, não podemos excluir linhas da ProductCategory tabela porque ProductCategoryID é especificado como uma chave estrangeira nessa tabela.
Vamos tentar excluir uma linha da ProductCategory table – sem dúvida, nos depararemos com o seguinte erro:
DELETE FROM [Production].[ProductCategory]
WHERE ProductCategoryID=1
Conclusão
Assim, exploramos as operações CRUD em SQL. As instruções INSERT, SELECT, UPDATE e DELETE são as funções básicas do banco de dados SQL, e você precisa dominá-las se quiser aprender a programação de banco de dados SQL. A teoria CRUD pode ser um bom ponto de partida, e muita prática o ajudará a se tornar um especialista.