Apostila - Módulo 0 - A Linguagem SQL
Apostila - Módulo 0 - A Linguagem SQL
2
5.2. Agrupamentos de dados ............................................................................................... 84
3
1
Capítulo 1. Introdução à Linguagem SQL
Quando falamos de Linguagem SQL (abreviatura para Structured
Query Language, traduzido para o português como Linguagem Estruturada
de Consulta), estamos intrinsicamente falando da Teoria de Banco de Dados
Relacional, mais especificamente de modelos de dados e bancos de dados
relacionais.
5
projetistas de bancos de dados: dados vistos como um conjunto de tabelas,
dispostos em linhas e colunas.
6
Coluna: correspondente ao conceito de atributo do modelo
conceitual, acrescido do domínio do dado que será armazenado na
coluna. Comumente chamado de campo.
Chave Candidata: que não repetem valor em uma tabela e que são
candidatas à chave primária. Exemplos:
NÚMERO DO RG
NÚMERO DO CPF
7
elementos de uma entidade B e vice-versa, indicam também as
restrições de nulidade das chaves estrangeiras.
8
Restrições de integridade: regra que garante a consistência dos
dados em um relacionamento entre duas tabelas. São de três tipos:
9
Para definir corretamente as restrições de integridade, pode-se usar
o algoritmo a seguir como regra geral:
Se puder:
FK_SERVICO_ITSOLSER_01
FK_CLIENTE_SOLISERV_01
FORNECEDOR
COD_FORNECEDOR: NUMBER(3)
NOM_FORNECEDOR: VARCHAR2(50)
ITEM_SOLICITACAO_SERVICO DSC_ENDERECO: VARCHAR2(100)
COD_ITEM_SOLICITACAO: NUMBER(5) NUM_TELEFONE: NUMBER(12)
NUM_SOLICITACAO_SERVICO: NUMBER(5) (FK)
COD_SERVICO: NUMBER(3) (FK)
FK_FORMAPAG_SERVICO_01
QTD_SERVICO: NUMBER(2)
VLR_TOTAL_ITEM: NUMBER(10,2) FORMA_PAGAMENTO
COD_FORMA_PAGAMENTO: NUMBER(2)
DSC_FORMA_PAGAMENTO: VARCHAR2(20)
FK_SOLISERV_ITSOLSER_01
FK_FORMAPAG_SOLISERV_01
SOLICITACAO_SERVICO
NUM_SOLICITACAO_SERVICO: NUMBER(5)
COD_CLIENTE: NUMBER(5) (FK)
COD_ATENDENTE: NUMBER(3) (FK) ATENDENTE
DAT_SOLICITACAO: DATE FK_ATEND_SOLISERV_01 COD_ATENDENTE: NUMBER(3)
VLR_TOTAL_SOLICITACAO: NUMBER(10,2) NOM_ATENDENTE: VARCHAR2(50)
IND_UNIFICACAO_FORMA_PAGAMENTO: CHAR(1)
COD_FORMA_PAGAMENTO: NUMBER(2) (FK)
10
de uma empreitada pessoal, na tentativa de impedir que sua visão e seu
trabalho acerca de bancos de dados relacionais fossem deturpadas ou
diluídas, dados os constantes esforços de fornecedores de bancos de dados
em ajustar ou redesenvolver os produtos existentes na época (SGBDs
hierárquicos, de rede etc.) com um viés relacional.
11
necessidade de saber a forma como os dados estavam armazenados
internamente, ou seja, do usual endereçamento orientado à computador.
12
– Manipulação de dados (interativo e por programa).
– Restrições de integridade.
– Autorização.
Com essa regra, Codd alerta para o tratamento das atualizações das
visões de dados (views).
13
Regra 9: Independência Lógica dos Dados.
14
Essa regra expressa a preocupação de Codd com os fornecedores de
SGBDs que estavam recodificando seus produtos como relacionais, mas que
haviam nascido com suporte a uma interface abaixo da interface de restrição
relacional, o que torna muito fácil burlar várias regras colocadas por ele,
principalmente as de restrição de integridade. Com essa subversão de baixo
nível, o banco de dados poderia passar para um status não íntegro, como
registros filhos órfãos, mesmo havendo as restrições de integridade
definidas nas tabelas do banco de dados.
15
Centro de Pesquisas de Almaden (Almaden Research Center, na época San
Jose Research), em San José, Califórnia, o subprojeto System R.
16
Entretanto, como SEQUEL era uma marca registrada pela empresa
de aeronaves Hawker Siddeley, a linguagem SEQUEL, através da eliminação
das vogais, foi renomeada para SQL (Structured Query Language -
Linguagem de Consulta Estruturada). Devido a isso, até hoje ouvimos
comumente a sigla, em inglês, ser pronunciada como "síquel" (SEQUEL), ao
invés de "és-kiú-él" (SQL), letra a letra. No entanto, em português, a
pronúncia mais comum é letra a letra: S (“esse”) - Q (“quê”) - L (“éle").
17
De certa forma, essa peculiaridade reduziu o ciclo de aprendizado
dos desenvolvedores e administradores de bancos de dados, fazendo com
que a Linguagem SQL caísse no “gosto” rapidamente da comunidade.
18
relacional, os operadores usados por Codd em sua teoria estão relacionados
na figura abaixo, e, a seguir, alguns exemplos de utilização deles.
condição.
19
Projeção (π): retornar um ou mais atributos desejados. Exemplo:
20
Produto Cartesiano (X): retornar todas as combinações possíveis de
21
Embora a SQL tenha sido originalmente criada pela IBM, após a sua
publicação rapidamente surgiram várias linguagens desenvolvidas pelos
fornecedores de SGBDs relacionais, cada uma com suas adaptações à
Linguagem SQL original. Por exemplo, podemos citar o dialeto PL/SQL da
Oracle. Essa expansão levou à necessidade de ser criado e adaptado um
padrão para a Linguagem SQL. Essa tarefa foi realizada, pioneiramente, pela
American National Standards Institute, em 1986, com a publicação do
padrão ANSI X3.135-1986. Este foi o começo do que as pessoas chamam
erroneamente de padrão ANSI para SQL. Na verdade, não existem padrões
ANSI, apenas padrões desenvolvidos por comitês aprovados pela ANSI,
muitos deles operando de acordo com os Requisitos Essenciais da ANSI.
22
internacional ISO / IEC 9075 para SQL é desenvolvida pelo ISO/IEC Joint
Technical Committee (JTC) 1 for Information Technology e desde a edição
de 2003 foi subdividida em nove partes, cada uma cobrindo um aspecto do
padrão geral, sob o título Tecnologia da Informação – Linguagens de
Banco de Dados – SQL.
23
Dentro do padrão ISO SQL, encontramos quatro classes (conjuntos)
de comandos da Linguagem SQL, cada uma delas com um propósito bem
definido na etapa de construção do modelo de dados físico do banco de
dados:
Fonte: http://www.learnhowtocode.info.
24
1.4. Uma “Sopa de Letras”
Siglas sempre fizeram e farão parte do cotidiano de um profissional
de TI, principalmente daqueles que se propõem a trabalhar com banco de
dados. Algumas delas já foram apresentadas nos capítulos anteriores, mas
se faz necessário apresentar algumas novas e reforçar na diferenciação de
algumas delas.
25
processava alguns dados e os transmitia ao próximo operador por meio da
função pipe do UNIX.
26
Bigtable/MapReduce e do DynamoDB da Amazon. Desde então, o termo
NOSQL tem sido atribuído aos sistemas gerenciadores de bancos de dados
não relacionais (e não somente mais não SQL), que fornecem um
mecanismo de armazenamento de dados que não é baseado no formato
tabular (linhas x colunas).
27
linguagem de consulta padrão NOSQL, a UnQL (Unstructured Query
Language). Com pronúncia “Uncle”, o objetivo era que essa linguagem se
popularizasse da mesma forma que a linguagem SQL, do movimento
relacional, havia se popularizado. Foi criado até um site para o projeto
(http://unql.sqlite.org/index.html/wiki?name=UnQL), mas até o momento ela
não se popularizou e não virou um padrão ISO como a SQL.
28
2
Capítulo 2. Introdução ao SQL Server
2.1. Introdução ao SQL Server
Para aplicarmos na prática os conceitos e instruções da Linguagem
SQL que serão expostos nessa disciplina, utilizaremos um banco de dados
SQL Server. O Microsoft SQL Server é um sistema gerenciador de banco de
dados relacional, desenvolvido pela Microsoft, cuja primeira versão (1.0) foi
lançada em 1989. A versão atual é a 2019 (https://www.microsoft.com/pt-
br/sql-server/sql-server-2019) e será usada neste curso, no sistema
operacional Windows.
30
Microsoft Integration Services (SSIS): engine para extração,
transformação e carga de dados (ETL).
– https://go.microsoft.com/fwlink/?linkid=866662.
31
padrão ISO, como variáveis, loop, controle de fluxo e decisões, funções etc.,
além de possuir algumas instruções que não estão no padrão ISO e
instruções com sintaxe ligeiramente diferente do padrão.
32
Figura 20 – Tela de Conexão do Management Studio 18.5.
33
Para executar a query, basta selecionar o bloco de instruções que
deseja executar (caso contrário, executará todos os comandos existentes na
janela) e clicar no botão Execute (ou usar a tecla de atalho F5).
34
Por fim, faz-se importante mencionar os recursos que o SSMS
fornece para trabalhar com um projeto de banco de dados, no tocante à
organização dos scripts SQL. O SSMS fornece o recurso Solução (Solution),
dentro do qual pode ser criado um ou mais Projetos de Scripts SQL Server.
35
Figuras 27 e 28 – Adicionando um Projeto à Solução.
36
Figura 30 – Exemplo de projetos e seus itens.
37
2.6. Banco de dados de exemplo AdventureWorks
Para demonstrar os comandos da Linguagem SQL, usaremos como
banco de dados de exemplo o tradicional Adventure Works, disponibilizado
pela Microsoft em https://github.com/Microsoft/sql-server-
samples/releases/tag/adventureworks e já populado com dados fictícios.
Usaremos neste curso o banco de dados AdventureWorks2019, cujo link
direto para download do backup desse banco é:
https://github.com/Microsoft/sql-server-
samples/releases/download/adventureworks/AdventureWorks2019
.bak.
https://improveandrepeat.com/2019/02/use-the-adventureworks-
sample-database-for-your-examples.
38
3
Capítulo 3. Linguagem de Definição de Dados (DDL)
A Linguagem de Definição de Dados, mais comumente mencionada
como DDL (abreviação de Data Definition Language), é uma classe da
Linguagem SQL com comandos que permitem criar, alterar e excluir objetos
de banco de dados.
Fonte: https://sites.google.com/site/giygiyhvhj/home/o-fatecano.
40
Figura 32 – Designer Gráfico de Tabelas no SSMS.
41
3.1. Criação de estruturas de dados
A criação de estruturas ou objetos, no banco de dados, é feita através
da instrução SQL CREATE. Através desse comando, consegue-se criar o
banco de dados, as tabelas, os índices, visões, chaves estrangeiras,
constraints, sinônimos, sequences etc.
42
comando de criação de um banco de dados, como mostrado no exemplo
abaixo entre o comando no SQL Server versus no Oracle:
);
43
);
Com esse tipo de comando, é possível, por exemplo, desde que não
viole as regras de unicidade, adicionar uma chave primária a uma tabela já
criada, como demonstrado na sintaxe abaixo:
COD_ALUNO
44
);
COD_CURSO_FK
45
) REFERENCES CURSO
COD_CURSO
ON UPDATE NO ACTION
ON DELETE NO ACTION;
Remover Sinônimo
46
Uma observação importante é quanto à remoção de alguns recursos
que não são considerados objetos independentes, como colunas de uma
tabela. Nesse caso, deve-se usar o comando ALTER, uma vez que o objeto a
ser alterado é a tabela onde a coluna se encontra, em conjunto com o
comando DROP, como demonstrado abaixo.
47
4
Capítulo 4. Linguagem de Manipulação de Dados (DML)
Sem sombra de dúvidas, os comandos da linguagem SQL para
manipulação de dados, pertencentes à classe DML (Data Manipulation
Language), são os comandos mais usados em sistemas de bancos de dados
relacionais.
FROM: origem dos dados, ou seja, o nome do(s) objeto(s) onde estão
os dados que serão selecionados.
49
Para exemplificar as duas opções existentes para formar a lista com
a relação de colunas a serem exibidas, pode-se executar no banco de dados
de exemplo AdventureWorks2017 usado nesse curso, os seguintes
comandos:
FROM Production.Product;
SELECT *
FROM Production.Product;
Um recurso muito interessante e útil, que pode ser usado tanto para
nomes de colunas quanto de tabelas, é o alias. Com ele, é possível criar um
nome alternativo (apelido) existente apenas em tempo de execução para
cada coluna / tabela em um comando SQL.
FROM Production.Product;
50
Figura 36 – Alias de Coluna.
Para alias de tabelas, o uso é bem mais amplo, permitindo que o alias
seja usado em outras cláusulas da instrução SELECT, como nas cláusulas
WHERE, GROUP BY, ORDER BY etc., que serão vistas mais à frente. Além
disso, a utilização de alias é muito útil nas situações em que existem colunas
com o mesmo nome em tabelas diferentes participando do mesmo comando
SQL, sendo necessário distinguir cada coluna (veremos isso mais à frente
quando falarmos de junção de tabelas).
Uma vez definido o alias para uma tabela, ele pode ser referenciado
na relação de colunas da cláusula SELECT, como exemplificado abaixo.
51
Alias de Tabela nas Colunas
FROM Production.Product P;
EXPRESSÃO CASE
52
o valor da coluna for igual a 1; 'Road Bikes' se for igual a 2; ‘Touring Bikes’
se for igual a 3; e 'Unknown Category' caso não seja nenhum dos três
valores.
CASE ProductSubcategoryID
END AS SubCategoryName
FROM Production.Product;
53
definir um alias para ela), não existe fisicamente na tabela e deve ser escalar
(retornar apenas um valor por linha).
FROM Sales.SalesOrderDetail;
54
FROM Sales.SalesOrderDetail;
FROM Sales.SalesOrderDetail
FROM Person.Person;
55
Obs.: ao usar operadores, verifique primeiramente a ordem de
avalição deles no SGBD em questão. No SQL Server, por exemplo, os
operadores aritméticos e de concatenação são avaliados na seguinte ordem
(sequência):
2º * (multiplicação) 5º - (subtração)
3º % (módulo)
FROM Sales.SalesOrderDetail;
56
(descendente, de Z a A, 9 a 0), para personalizar a ordem de exibição dos
dados.
FROM Person.Person
Similar a
FROM Person.Person
57
SELECT FirstName, MiddleName, LastName
FROM Person.Person
FROM Person.Person
FROM Production.Product
58
4.4. Filtrando dados
Além da operação de projeção da Álgebra Relacional vista até agora
(especificação das colunas a serem retornadas), a Linguagem SQL também
possui cláusulas para realizar a operação de seleção (restrição). Com essas
cláusulas, é possível restringir as tuplas (linhas/dados) retornadas pela
operação de projeção (cláusula SELECT).
FROM Production.Product
ORDER BY Name;
= Igual a
59
< Menor que
<> Diferente de
FROM Production.Product
OR Color = 'Silver'
ORDER BY Name;
Operador Significado
60
AND TRUE se ambas as expressões booleanas forem verdadeiras
2º NOT
3º AND
Dessa forma, para que o operador OR, por exemplo, seja avaliado
antes do operador AND, deve-se usar parênteses, como no exemplo abaixo.
Sem os parênteses, a avaliação da expressão lógica AND seria feita primeiro,
para depois se avaliar a expressão com o operador OR:
61
Produtos com Nome que Iniciam com 'Chain' e que Sejam da Cor
Preta ou Prata
SELECT Name,Color
FROM Production.Product
ORDER BY Name;
Produtos com Nome que Iniciam com 'Chain' e que Sejam da Cor
Preta, ou Todos Produtos da Cor Prata
ORDER BY Color;
62
4.4.1. Filtrando Dados com TOP / DISTINCT
FROM Production.Product
ORDER BY Nome_Produto;
FROM Production.Product
ORDER BY Cores_de_Produtos;
63
Importante observar que a cláusula DISTINCT atua em todas as
colunas da cláusula SELECT. Caso exista mais de uma coluna no SELECT,
basta apenas uma cláusula DISTINCT, uma vez que o que será eliminado
será a ocorrência duplicada da combinação das colunas, ou seja, as tuplas
duplicadas. No exemplo abaixo, incluindo a coluna nome do produto, o efeito
da cláusula DISTINCT será retornar as ocorrências não repetidas da
combinação das colunas Color e Name.
FROM Production.Product
64
https://docs.microsoft.com/pt-br/sql/t-sql/data-types/data-types-transact-
sql?view=sql-server-2017.
65
Figura 42 – Função SUBSTRING.
66
LEN (string): retorna a quantidade de caracteres encontrados na
string, excluindo espaços à direita.
67
REPLACE (string, string_a_encontrar, string_substituta): substitui,
na string alvo da busca, todas as ocorrências de uma string a ser
encontrada, pelo valor de uma string substituta informada.
68
Figura 51 – Função LTRIM.
69
CONCAT (string, string_1, string_N): concatena uma ou mais
strings.
Função Ação
70
UPPER Converte a string em caracteres maiúsculos.
71
Funções de data e hora:
Obs.: o SQL Server (e a grande maioria dos SGBDs) não oferece meios
para que sejam inseridas datas e horas como valores literais. Dessa forma, é
necessário usar sequências de caracteres (strings literais) delimitadas com
aspas simples, seguindo-se o formato* de data e hora especificado nas
configurações regionais do sistema operacional. Com isso, o SQL Server
consegue converter, fidedignamente, as strings literais em data e hora.
A / Y ano
M mês
D dia
h hora
m minuto
s segundos
nnn milisegundos
nnnnnmicrosegundos
nnnnnnnnanosegundos
72
As funções mais básicas na Linguagem SQL para se trabalhar com data e hora
são as funções que retornam parte da informação de um dado do tipo data e/ou hora.
A seguir, são listadas as principais funções básicas de data e hora disponíveis no SQL
Server, com um exemplo envolvendo todas elas ao final.
73
Sua sintaxe é DATENAME (datepart, date), onde datepart são as
opções abaixo, e date é um campo ou uma cadeia de caracteres no formato
do tipo data-hora.
hour, hh Hora 12
minute, n Minutos 15
74
DATEADD). A seguir, são mostradas as sintaxes e exemplos para cada uma
delas.
75
Resultado ‘2019-01-02 00:30:00.000’
76
Obs.: para operadores de comparação ou outras expressões, o tipo
de dados resultante depende das regras de precedência do tipo de dados de
cada SGBD. As do SQL Server podem ser encontradas em:
https://docs.microsoft.com/pt-br/sql/t-sql/data-types/data-type-
precedence-transact-sql?view=sql-server-2017.
77
Figura 62 – Mapa de conversões de tipos de dados.
78
5
Capítulo 5. Agrupamento de Dados e Funções de Agregação
Em muitas situações, pode haver a necessidade de agrupar dados
em conjuntos ou executar um cálculo (contagem, soma, média etc.) em um
conjunto de linhas, ao invés de fazê-lo linha a linha. Para isso, a Linguagem
SQL disponibiliza cláusulas para agrupamento de dados, como a GROUP BY
e as funções de agregação.
Se não existir uma cláusula GROUP BY (que será vista mais adiante),
não pode existir colunas na cláusula SELECT que não estejam em
uma função agregada.
80
As funções de agregação da Linguagem SQL estão presentes na
grande maioria dos SGBDs. No SQL Server, algumas das mais usadas são:
FROM Sales.SalesOrderDetail;
81
Figura 64 – Funções SUM e AVG.
82
Figura 66 – DISTINCT com funções de agregação.
83
ser substituídos. Dessa forma, podemos fazer a média do exemplo acima de
forma correta, tratando os nulos antes, como mostrado no exemplo abaixo.
84
ORDER BY < lista de colunas / expressões – opcional >
85
abaixo, a cláusula GROUP BY é processada antes do SELECT. Isso significa
que, se uma coluna ou expressão não estiver presente no GROUP BY ou não
estiver em uma função de agregação, ela não fará parte do conjunto de
dados (colunas) passado para a cláusula SELECT, no qual ela agirá
selecionando as colunas especificadas e que estejam disponíveis, ou seja,
que foram passadas pelas cláusulas anteriores.
5 SELECT
1 FROM
2 WHERE
3 GROUP BY
4 HAVING
6 ORDER BY
OrderDate AS Ano_da_Venda,
COUNT(SalesOrderID) AS Total_de_Vendas
FROM Sales.SalesOrderHeader
86
Figura 71 – Erro ao tentar usar alias no GROUP BY.
87
Figura 72 – Ordem de execução do WHERE com GROUP BY.
88
GROUP BY < lista de colunas / expressões >
89
6
Capítulo 6. Junção de Tabelas (JOIN)
6.1. Introdução à Junção de Tabelas
A junção de tabelas está intrinsicamente inserida na teoria de banco
de dados relacional, onde uma tabela pode estar relacionada a uma ou mais
tabelas. Dessa forma, a Linguagem SQL vem prover, em termos de cláusulas
e instruções, os recursos necessários para fazer esse relacionamento entre
duas ou mais tabelas, ou seja, o famoso JOIN (junção).
91
Figura 76 – Queries sem Join.
92
Figura 78 – Modelo Relacional.
93
produtos e suas respectivas categorias e subcategorias. Perceba que para
fazer o join entre mais de duas tabelas com o operador de comparação “=”,
faz-se necessário usar em conjunto o operador lógico “AND”.
94
Conjuntos, consistindo no produto entre dois conjuntos. Dessa forma, se
temos um conjunto com cinco itens e outro conjunto com seis itens, o
produto cartesiano entre eles conterá 30 itens (5 x 6).
95
para as linhas serem retornadas, os valores das colunas das tabelas
relacionadas devem ser iguais. Na Teoria de Conjuntos, isso representa a
operação de interseção entre dois conjuntos. Na revisão ANSI SQL-92,
foram introduzidas, na Linguagem SQL, as cláusulas específicas para cada
tipo de join, de forma a deixar as operações na cláusula WHERE apenas para
os filtros desejados, e também de forma a evitar produtos cartesianos (mais
fáceis de acontecer usando-se somente o operador “=”).
96
Obs.: assim como na sintaxe ANSI SQL-89, usando-se o operador de
comparação “=”, a ordem em que as tabelas são escritas em uma query com
INNER JOIN, bem como a ordem que as comparações são feitas, não
impactam no resultado da consulta. Da mesma forma que na sintaxe do
padrão ANSI SQL-89 é perfeitamente factível realizar join entre mais de
duas tabelas, usando-se a sintaxe da Linguagem SQL a partir do padrão
ANSI SQL-92, como mostrado a seguir, onde o exemplo da Figura 80 foi
adaptado para usar a cláusula INNER JOIN.
Outro tipo de join que pode ser feito tanto usando a sintaxe ANSI
SQL-89 quanto a sintaxe ANSI SQL-92, é o SELF INNER JOIN. Esse tipo de
join nada mais é que o join de uma tabela com ela mesma, que ocorre muito
frequentemente em tabelas que representam hierarquias ou quando deseja-
se fazer correlações entre as linhas da mesma tabela. Um ponto importante
é que esse tipo de join só é possível com a utilização de alias para a tabela,
uma vez que o nome das tabelas relacionadas será o mesmo. No exemplo
abaixo, com a sintaxe SQL-92, deseja-se listar os empregados e seus
respectivos gerentes.
97
Para além disso, a Linguagem SQL também disponibiliza uma
cláusula para que seja possível fazer um produto cartesiano utilizando a
nova sintaxe. Essa cláusula é a CROSS JOIN e não exige a comparação
(cláusula ON) entre as colunas das tabelas relacionadas. No código abaixo,
o exemplo mostrado na Figura 80 foi reescrito usando a sintaxe ANSI SQL-
92 para fazer o produto cartesiano.
98
Figura 84 – LEFT OUTER JOIN (ANSI SQL-92).
SELECT *
FROM TABELA1 T1
ON T1.id = T2.id_fk;
FROM Production.Product P
ON P.ProductID = S.ProductID
99
são colocadas impacta diretamente no resultado retornado pela query. No
exemplo acima, invertendo-se a ordem no join, o resultado seria outro: todas
as vendas e seus respectivos produtos; ou seja, não retornaria produtos que
não tiveram vendas.
Com base nessa ordem, podemos concluir que o RIGHT JOIN tem o
efeito contrário do LEFT JOIN, como mostrado na operação de conjunto
abaixo.
100
Figura 86 – RIGTH OUTER JOIN (ANSI SQL-92).
101
Figura 88 – FULL OUTER JOIN (ANSI SQL-92).
102
7
Capítulo 7. Subconsultas
Uma subconsulta é uma instrução SELECT aninhada em outra
consulta, ou seja, em outra instrução SELECT. A consulta aninhada, que é a
subconsulta, é chamada de consulta interna (inner query). A consulta que
contém a subconsulta é chamada de consulta externa (outer query).
104
A subconsulta deve ser colocada entre parênteses.
FROM Sales.SalesOrderHeader;
FROM Sales.SalesOrderDetail
FROM Sales.SalesOrderHeader
105
Importante destacar que, precedendo a subconsulta escalar, devem
ser usados operadores de comparação que exigem a comparação com um
valor único. Esses operadores são: =, !=, <, <=, > e >=. Caso a consulta mais
interna retorne mais de um valor, será exibido o erro como mostrado na
figura abaixo, informando que não é permitido esse tipo de comparação.
SUM(TotalDue) AS Valor_Total_Diário_de_Vendas
FROM Sales.SalesOrderHeader
WHERE YEAR(OrderDate)='2013'
GROUP BY OrderDate
SELECT AVG(TotalDue)
106
FROM Sales.SalesOrderHeader
WHERE YEAR(OrderDate)='2012'
ORDER BY 1 ASC;
107
FROM Sales.Customer
WHERE TerritoryID IN (
SELECT TerritoryID
FROM Sales.SalesTerritory
);
FROM Sales.Customer C
JOIN Sales.SalesTerritory T
ON C.TerritoryID = T.TerritoryID
Um operador que pode ser usado junto ao operador IN, mas que por
questões de performance deve ser evitado, é o operador NOT. Com ele, pode-
se inverter o resultado esperado da comparação feita com o operador IN,
que, na prática, pode-se traduzir para “não está contido”. Assim sendo, com
NOT IN, a verificação feita é a de que a coluna ou expressão informada na
cláusula WHERE possua valores que não correspondam a nenhum dos
valores retornados pela subconsulta multivalorada, o que exige a leitura da
tabela inteira. Para exemplificar, suponha que agora se deseja retornar a
identificação e o número da conta de todos os clientes, exceto os da
Austrália e da França. A query ficaria algo como:
108
FROM Sales.Customer
SELECT TerritoryID
FROM Sales.SalesTerritory
);
SUM(TotalDue) AS Valor_Total_Diário_de_Vendas
FROM Sales.SalesOrderHeader
WHERE YEAR(OrderDate)='2013'
GROUP BY OrderDate
CAST(MONTH(OrderDate) AS VARCHAR(2))
IN (
CAST(MONTH(OrderDate) AS VARCHAR(2))
FROM Sales.SalesOrderHeader
WHERE YEAR(OrderDate)='2012'
109
GROUP BY OrderDate
ORDER BY SUM(TotalDue)
ORDER BY 1 ASC;
FROM Sales.SalesOrderHeader AS Q1
WHERE Q1.OrderDate = (
110
SELECT MAX(Q2.OrderDate)
FROM Sales.SalesOrderHeader AS Q2
FROM Sales.SalesPerson P
WHERE EXISTS (
SELECT *
FROM Sales.SalesOrderHeader V
ORDER BY 1 ASC;
111
Conceitualmente falando, o operador EXISTS é equivalente a
recuperar os resultados contando as linhas retornadas e comparando se
essa contagem é maior que zero.
FROM Sales.SalesPerson P
WHERE (
SELECT COUNT(*)
FROM Sales.SalesOrderHeader V
)>0
ORDER BY 1 ASC;
FROM Sales.SalesPerson P
SELECT *
FROM Sales.SalesOrderHeader V
112
AND YEAR(OrderDate) = '2011'
ORDER BY 1 ASC;
FROM Sales.SalesPerson P
WHERE (
SELECT COUNT(*)
FROM Sales.SalesOrderHeader V
)=0
ORDER BY 1 ASC;
113
Cada conjunto de entrada é o resultado de uma consulta
(subconsulta), que pode incluir qualquer instrução SELECT, mas não
pode possuir uma cláusula ORDER BY. Caso seja necessário
ordenar o resultado, o ORDER BY deve ser colocado na consulta geral
(query completa com todos as subconsultas e os respectivos
operadores de conjuntos).
UNION ALL
SELECT2
114
UNION ALL
SELECT[n]
[ORDER BY]
FROM Tab_Medicos
UNION ALL
FROM Tab_Pacientes;
UNION
SELECT2
UNION
SELECT[n]
115
[ORDER BY]
FROM Tab_Medicos
UNION
FROM Tab_Pacientes;
A sintaxe é: SELECT1
INTERSECT
SELECT2
116
INTERSECT
SELECT[n]
[ORDER BY]
FROM Tab_Medicos
INTERSECT
FROM Tab_Pacientes;
A sintaxe é: SELECT1
EXCEPT
117
SELECT2
EXCEPT
SELECT[n]
[ORDER BY]
FROM Tab_Medicos
EXCEPT
FROM Tab_Pacientes;
FROM Tab_Pacientes
EXCEPT
FROM Tab_Medicos;
118
8
Capítulo 8. Inserção, Atualização e Exclusão de Dados
Ainda dentro da classe DML da Linguagem SQL, encontram-se os
comandos para realizar a inserção, a atualização e a exclusão de dados, que
serão vistos com mais detalhes nos capítulos a seguir.
Supondo que exista uma tabela de nome TAB1, com as colunas COL1
e COL2, ambas do tipo de dados numérico, o comando para inserir uma linha
nessa tabela ficaria algo como:
120
Omitindo a lista de colunas, ficaria como mostrado abaixo, indicando
que o valor 100 seria inserido na primeira coluna da tabela TAB1 e o valor
500 na segunda coluna.
Nos casos em que a coluna foi criada com um valor default e deseja-
se inserir esse valor, deve-se especificar DEFAULT na lista de valores a
serem inseridos, como mostrado no exemplo abaixo:
121
Usando apenas um comando INSERT, é possível inserir mais de uma
linha de uma só vez, basta separar as várias cláusulas VALUES com vírgula.
No nosso exemplo anterior, se desejássemos inserir 3 linhas, o comando
ficaria como:
EXEC PROC1;
122
Essa nova tabela é criada com a estrutura física definida pela lista de
colunas na cláusula SELECT. Cada coluna na nova tabela terá o mesmo
nome, tipo de dados e anulabilidade da coluna correspondente (ou
expressão) da lista de colunas na cláusula SELECT. Entretanto, índices e
constraints não são criados na nova tabela. A sintaxe para essa opção é
mostrada abaixo.
123
Dessa forma, a sintaxe da instrução UPDATE, em linhas gerais, é:
UPDATE <Nome_Tabela>
<ColunaN> {…n}
WHERE <Condição>;
UPDATE TAB2
UPDATE TAB2
124
para 500 e da coluna COL1 para 600, de todas as linhas onde o valor da
coluna COL1 fosse igual a 10, o comando SQL ficaria algo como:
UPDATE TAB2
WHERE <Condição>;
125
Para as situações em que se deseja excluir todos os dados de uma
tabela, por questões de performance, é preferível usar o comando
TRUNCATE da classe DDL da Linguagem SQL. Esse comando remove todas
as linhas de uma tabela sem registrar as exclusões de linhas
individualmente, consumindo menos recursos do servidor de banco de
dados e executando mais rápido que o DELETE sem a cláusula WHERE. Sua
sintaxe é TRUNCATE TABLE <Nome_da_Tabela>.
--Usando subconsulta
WHERE BusinessEntityID IN (
SELECT BusinessEntityID
FROM Sales.SalesPerson
--Usando join
126
ON spqh.BusinessEntityID = sp.BusinessEntityID
O comando MERGE atua nos dados de uma tabela destino, com base
em uma ou mais condições de decisão mostradas abaixo, acerca de qual
operação (INSERT/UPDATE/DELETE) será executada:
MERGE
[ INTO ] <Tabela_Destino>
[WHEN MATCHED
127
THEN <Operação Quando Há Correspondência>]
128
9
Capítulo 9. Linguagem de Controle de Transação (TCL)
9.1. Conceitos Básicos de Transação
As características que mais contribuíram para o respaldo, robustez e
integridade dos sistemas gerenciadores de bancos de dados relacionais
foram as suas propriedades ACID. Essas propriedades referem-se, em
grande parte, às transações que são executadas no SGBD, que nada mais
são do que uma sequência de instruções SQL.
130
garantindo que a transação não sofra interferência de nenhuma
outra transação concorrente.
131
IMPLICITAMENTE: também chamadas de transações com
autocommit. As instruções enviadas separadamente para execução
são automaticamente inseridas em uma transação pelo SGBD.
Essas transações são confirmadas (“commitadas”)
automaticamente quando a instrução é bem-sucedida, ou revertidas
automaticamente quando a instrução encontra um erro em tempo
de execução. É como se o SGBD abrisse a transação explicitamente
e acompanhasse o status dela para saber se a confirma no banco de
dados ou se a desfaz, tudo isso de forma transparente para o usuário.
BEGIN TRANSACTION;
132
COMMIT;
BEGIN TRANSACTION;
ROLLBACK;
BEGIN TRANSACTION;
BEGIN TRANSACTION;
COMMIT;
COMMIT;
133
Para além disso, um recurso disponível na maioria dos SGBDs é o de
nomear transações e usar esses nomes para “commitá-las” a qualquer
momento:
134
10
Capítulo 10. Linguagem de Controle de Acesso a Dados (DCL)
10.1. Segurança em Bancos de Dados
Uma preocupação constante, principalmente na era da informação
que nos encontramos, é em relação à proteção dos dados armazenados. Na
camada de banco de dados, essa proteção deve ser feita externamente ao
SGBD (proteção do servidor, firewall, segmentação de rede, mecanismos
para evitar invasões e ataques de negação de serviço etc.), bem como
internamente.
136
ROLE (Papel): conjunto de privilégios que pode ser concedido a
usuários ou a outras roles. São criadas com o comando CREATE
ROLE da classe DDL da Linguagem SQL.
DEFAULT_DATABASE = [BDIGTI];
137
Figura 99 – Principals e Securables.
138
GRANT SELECT, INSERT, DELETE, UPDATE ON [Production].[Product] TO
UsrAdventureSystem;
139
11
Capítulo 11. Programação com a Linguagem T-SQL
11.1. Visões (Views) e CTEs
Uma view, em linhas gerais, é uma query armazenada, criada como
um objeto no banco de dados. Ao contrário das tabelas, uma view não
armazena dados e são vistas como tabelas virtuais dinâmicas para exibir
dados específicos de uma ou mais tabelas/views. Em outras palavras, a view
é definida por uma query no momento da sua criação, que especifica
exatamente os dados que essa view irá retornar.
141
dados através da view, mas não concedendo permissões
diretamente às tabelas base da view.
FROM Sales.Customer
WHERE TerritoryID IN (
SELECT TerritoryID
FROM Sales.SalesTerritory
);
SELECT *
FROM VW_Clientes_Australia
142
WHERE CustomerID BETWEEN 1 AND 100;
SELECT *
FROM VW_Clientes_Australia_All_Info
143
As seguintes cláusulas não podem ser usadas na CTE:
SINTAXE DE CRIAÇÃO:
WITH <CTE_name>
AS ( <CTE_definition> )
EXEMPLO:
ON Clientes.Id_Cliente = Pedidos.Id_Pedido
),
ON Bairro.Id_Bairro = CTE1.Id_Bairro
GROUP BY Nm_Bairro
FROM CTE2;
CTE Recursiva:
;WITH Estrut_Hierarquia AS
( -- Nível 1 (Âncora)
144
FROM Funcionario
UNION ALL
-- Níveis 2-N
FROM Funcionarios A
145
gama mais ampla de instruções SQL, como UPDATE, INSERT e DELETE, além
de instruções SELECT. Além dessas instruções, podem ser usadas
instruções de lógica de processamento, controle de fluxos, testes
condicionais, variáveis e instruções para tratamento de erros na execução
da procedure. As procedures podem possuir parâmetros de entrada e saída,
além de um valor de retorno.
BEGIN
FROM Sales.Customer
WHERE TerritoryID IN (
SELECT TerritoryID
FROM Sales.SalesTerritory
146
END;
147
execução de instruções SQL. Para as procedures, toda primeira vez
que elas são executadas, o mecanismo de banco de dados compila o
código e cria um plano de execução da mesma maneira que o faria
para uma instrução SQL isolada, mas depois armazena e reutiliza
esse plano da procedure nas execuções seguintes. Como as
execuções seguintes usam esse plano de execução pré-compilado
ao invés de gerar um novo plano, o tempo necessário para executar
a procedure é reduzido, quando comparado com o mesmo código
executado sem ser via procedure.
@NAme nvarchar(50),
@GroupName nvarchar(50)
AS
BEGIN
148
--Inserindo os valores dos parâmetros de entrada na tabela
END;
11.3. Functions
Assim como uma procedure, uma function é armazenada como um
objeto persistente (compilado) no banco de dados, mas possuindo algumas
diferenças fundamentais entre elas, como as mostradas abaixo:
149
SINTAXE DE CRIAÇÃO:
RETURNS TABLE AS
RETURN (<SELECT_expression>);
RETURNS TABLE AS
FROM Production.Products
ORDER BY ListPriceDESC);
11.4. Triggers
Já as TRIGGERS (gatilhos) são objetos programáticos também
armazenados de forma compilada no banco de dados, que são disparados
automaticamente, mediante uma ação no banco de dados, instância ou
objeto.
150
são uma forma especial de gatilho que dispara quando uma nova sessão é
estabelecida.
AFTER INSERT AS
EXEC msdb.dbo.sp_send_dbmail
@profile_name = 'Coordenador',
@recipients = '[email protected]',
GO
151
O Linked Server (no Oracle, chamado de dblink) permite que uma
instância SQL Server leia dados de fontes de dados remotas e executem
comandos nos servidores de banco de dados remotos. Normalmente, os
linked server são configurados para permitir que o usuário execute uma
instrução T-SQL que inclua tabelas em outra instância do SQL Server ou em
outro produto de banco de dados, como Oracle. Além de acessar outros
bancos de dados, o linked server pode ser configurado para acessar dados
que estejam no Microsoft Access, no Excel e até mesmo na nuvem, como o
Azure CosmosDB.
152
Referências
BERNARDI, Diogo Alencar. Técnicas de mapeamento objeto relacional.
DevMedia, 2008. Disponível em: https://www.devmedia.com.br/tecnicas-de-
mapeamento-objeto-relacional-revista-sql-magazine-40/6980. Acesso em:
14 jan. 2022.
CHEN, Peter. Peter Chen Home Page at Louisiana State University (LSU).
Disponível em: https://www.csc.lsu.edu/~chen. Acesso em: 28 out. 2021.
CODD, Edgar F. A Relational Model of Data for Large Shared Data Banks. In:
Communications of the ACM, v. 13, n. 6, jun. 1970, p. 377-387. Disponível
153
em:
https://github.com/dmvaldman/library/blob/master/computer%20science/
Codd%20-
%20A%20Relational%20Model%20of%20Data%20for%20Large%20Shar
ed%20Data%20Banks.pdf. Acesso em: 14 jan. 2022.
HILLS, Ted. NOSQL and SQL Data Modeling: Bringing Together Data,
Semantics, and Software. Technics Publications, 2016.
KELECHAVA, Brad. The SQL Standard – ISO/IEC 9075:2016 (ANSI X3. 135).
ANSI – American National Standards Institute, 5 out. 2018. Disponível em:
https://blog.ansi.org/2018/10/sql-standard-iso-iec-9075-2016-ansi-x3-
135/. Acesso em: 14 jan. 2022.
154
KORTH, Henry F. Sistema de bancos de dados. 3ª ed. São Paulo: McGraw-Hill,
1999.
155
ROEBUCK, Kevin. Object-Relational Mapping (Orm): High-Impact Strategies.
Paperback, 2011.
156