SQL 2016 - Módulo I
SQL 2016 - Módulo I
COD.: 1805_0
SQL 2016 - Módulo I
Créditos
Todos os direitos autorais reservados. Este manual não pode ser copiado, fotocopiado, reproduzido,
traduzido ou convertido em qualquer forma eletrônica, ou legível por qualquer meio, em parte ou
no todo, sem a aprovação prévia, por escrito, da Monte Everest Participações e Empreendimentos
Ltda., estando o contrafator sujeito a responder por crime de Violação de Direito Autoral, conforme
o art.184 do Código Penal Brasileiro, além de responder por Perdas e Danos. Todos os logotipos
e marcas utilizados neste material pertencem às suas respectivas empresas.
"As marcas registradas e os nomes comerciais citados nesta obra, mesmo que não sejam assim identificados, pertencem
aos seus respectivos proprietários nos termos das leis, convenções e diretrizes nacionais e internacionais."
Coordenação Geral
Marcia M. Rosa
Coordenação Editorial
Henrique Thomaz Bruscagin
Autoria
Daniel Paulo Tamarosi Salvador
Diagramação
Bruno de Oliveira Santos
Edição nº 1 | 1805_0
Agosto/ 2016
Este material constitui uma nova obra e é uma derivação da seguinte obra original, produzida por TechnoEdition
Editora Ltda., em Ago/2014: SQL 2014 – Módulo I
4
Sumário
5
SQL 2016 - Módulo I
6
Sumário
7
SQL 2016 - Módulo I
Anotações........................................................................................................................................ 263
8
1 Introdução ao
SQL Server 2016
A construção do banco de dados passa por quatro etapas até a criação dos objetos
dentro do banco de dados, a saber: modelos descritivo, conceitual, lógico e físico.
1.2.1. Modelo descritivo
O modelo descritivo de dados é um documento que indica a necessidade de construção
de um banco de dados. Nesse modelo, o cenário é colocado de forma escrita,
informando a necessidade de armazenamento de dados. Não existe uma forma padrão
para escrever esse modelo, pois cada cenário é traduzido em um modelo diferente. A
seguir, mostraremos um exemplo de modelo descritivo.
10
Introdução ao SQL Server 2016 1
•• Cada componente pode ser utilizado em vários produtos e um produto pode
utilizar diversos componentes. Sobre cada um dos componentes, devemos
registrar: código, nome, quantidade em estoque, preço unitário e unidade de
estoque. Para as máquinas, precisamos registrar o tempo médio de vida, a data
da compra e a data de fim da garantia;
Notemos que esse modelo apenas apresenta o cenário de forma ampla. A próxima
etapa é a construção do modelo conceitual.
11
SQL 2016 - Módulo I
1.2.2. Modelo conceitual
Nesse modelo, extraímos informações do modelo descritivo, usando a seguinte
técnica:
•• RM = Data + descrição;
12
Introdução ao SQL Server 2016 1
1.2.3. Modelo lógico
Esse modelo apresenta, em um formato de diagrama, as entidades e os atributos
encontrados nos modelos anteriores. Nesse modelo, também conhecido como
diagrama lógico de dados, ainda não é possível determinar qual banco de dados será
utilizado.
Toda entidade deve ter um identificador único, que representa um valor que não se
repete para cada ocorrência da mesma entidade. Por exemplo, a entidade Fornecedor
não tem nenhum atributo de valor único, dessa forma, criamos um atributo fictício
chamado ID_FORNECEDOR. Essa regra é importante, pois esse identificador único
permite o relacionamento entre as entidades.
Devemos definir quais atributos são obrigatórios e quais são opcionais, além de
determinar os atributos que deverão ter valores específicos (por exemplo, sexo: M
para masculino e F para feminino).
1.2.4. Modelo físico
O modelo físico de dados pode ser obtido por meio do diagrama lógico de dados e
está associado ao software de gerenciamento de banco de dados, neste caso, o SQL
Server 2016.
13
SQL 2016 - Módulo I
Vejamos as definições:
•• Chave primária: Campo único que define a exclusividade da linha. Toda chave
primária possui as seguintes características:
•• Valores únicos;
•• 1 para 1;
•• 1 para N;
•• N para N.
14
Introdução ao SQL Server 2016 1
1.2.5. Dicionário de dados
O dicionário de dados complementa o diagrama físico descrevendo as características
da tabela.
1 – Cancelado
2 – Em espera
3 – Encerrado
4 – Finalizado
Caso não seja documentada esta informação, será muito difícil a construção das
consultas.
Tipo de NOT
Sequência Campo Descrição Identity Bytes PK FK Regras Default
Dados NULL
Código do
1 COD_FUN int Sim 4 Sim
empregado
Nome do
2 NOME varchar 35
empregado
Nº de
3 NUM_DEPEND tinyint Sim 1
dependentes
DATA_ Data de
4 datetime 8
NASCIMENTO nascimento
Código do
5 COD_DEPTO int 4 Sim
departamento
Código do
6 COD_CARGO int 4 Sim
cargo
DATA_ Data de
7 datetime 8 GETDATE()
ADMISSAO admissão
Não
permite
8 SALARIO Salário decimal 9
valores
negativos
PREMIO_ Valores:
9 Prêmio mensal decimal Sim 9
MENSAL SeN
Campo para
verificar se o
10 SINDICALIZADO varchar 1
empregado é
sindicalizado
10 OBS Observações varchar Sim
10 FOTO Foto varbinary Sim
COD_ Código do
10 int Sim 4
SUPERVISOR supervisor
15
SQL 2016 - Módulo I
1.3. Normalização de dados
O processo de organizar dados e eliminar informações redundantes de um banco de
dados é denominado normalização.
1.3.1. Regras de normalização
A normalização inclui três regras principais: first normal form (1NF), second normal
form (2NF) e third normal form (3NF).
Consideramos que um banco de dados está no first normal form quando a primeira
regra (1NF) é cumprida. Se as três regras forem cumpridas, o banco de dados estará
no third normal form.
16
Introdução ao SQL Server 2016 1
Verifique a tabela TB_ALUNO, que atende as necessidades da área acadêmica de uma
instituição de ensino:
Vejamos, a seguir, quais as regras que devem ser cumpridas para atingir cada nível
de normalização:
Para que um banco de dados esteja nesse nível de normalização, cada coluna deve
conter um único valor e cada linha deve abranger as mesmas colunas. A fim de
atendermos a esses aspectos, os conjuntos que se repetem nas tabelas individuais
devem ser eliminados. Além disso, devemos criar uma tabela separada para cada
conjunto de dados relacionados e identificar cada um deles com uma chave primária.
17
SQL 2016 - Módulo I
•• Uma pessoa tem apenas um nome, um RG, um CPF, mas pode ter estudado
em N escolas diferentes e pode ter feito N cursos extracurriculares;
•• Um aluno da Impacta tem apenas um nome, um RG, um CPF, mas pode ter
N telefones.
Percebemos aqui que a tabela TB_ALUNO, que criamos anteriormente, precisa ser
reestruturada para que respeite a primeira forma normal.
•• Tabela;
•• View;
•• Procedure;
•• Integrações entre banco e sistema;
•• Alteração da aplicação.
Sempre que uma linha de uma tabela tiver N informações relacionadas a ela,
precisaremos criar outra tabela para armazenar essas N informações.
18
Introdução ao SQL Server 2016 1
•• Second Normal Form (2NF)
Em outras palavras, a segunda forma normal pede que evitemos campos descritivos
(alfanuméricos) que se repitam várias vezes na mesma tabela. Além de ocupar mais
espaço, a mesma informação pode ser escrita de formas diferentes. Veja o caso da
tabela ALUNOS, em que existe um campo chamado PROFISSAO (descritivo) onde é
possível grafarmos a mesma profissão de várias formas diferentes:
ANALISTA DE SISTEMAS
ANALISTA SISTEMAS
AN. SISTEMAS
AN. DE SISTEMAS
ANALISTA DE SIST.
Isso torna impossível que se gere um relatório filtrando os ALUNOS por PROFISSAO.
A solução, neste caso, é criar uma tabela de profissões em que cada profissão tenha
um código. Para isso, na tabela ALUNOS, substituiremos o campo PROFISSAO por
COD_PROFISSAO.
No terceiro nível de normalização, após ter concluído todas as tarefas do 1NF e 2NF,
devemos eliminar os campos que não dependem de chaves primárias.
19
SQL 2016 - Módulo I
•• Na tabela TB_ALUNO, não devemos ter o campo IDADE, pois ele não
depende do número do aluno (chave primária), mas sim do campo DATA_
NASCIMENTO.
•• O servidor de banco de dados processa a solicitação, que pode ser uma consulta,
alteração, exclusão, inclusão etc.
20
Introdução ao SQL Server 2016 1
A imagem a seguir ilustra a arquitetura cliente / servidor:
A
Banco de
dados
SISTEMA GERENCIADOR DE
BANCO DE DADOS (S.G.B.D.)
B
APLICAÇÃO CLIENTE
a
Cria um comando SQL
(texto), envia-o ao S.G.B.D.
e recebe o retorno da
instrução
•• A - Servidor
•• B - Cliente
21
SQL 2016 - Módulo I
Resultado da consulta da
tabela de departamentos
22
Introdução ao SQL Server 2016 1
1.6. SQL Server
O SQL Server é uma plataforma de banco de dados utilizada para armazenar dados e
processá-los, tanto em um formato relacional quanto em documentos XML. Também
é utilizada em aplicações de comércio eletrônico e atua como uma plataforma
inteligente de negócios para integração e análise de dados, bem como de soluções.
Para essas tarefas, o SQL Server faz uso da linguagem T-SQL para gerenciar bancos
de dados relacionais, que contém, além da SQL, comandos de linguagem procedural.
1.6.1. Componentes
O SQL Server oferece diversos componentes opcionais e ferramentas relacionadas
que auxiliam e facilitam a manipulação de seus sistemas. Por padrão, nenhum dos
componentes será instalado.
1.6.2.1. Tabelas
Os dados são armazenados em objetos de duas dimensões denominados tabelas
(tables), formadas por linhas e colunas. As tabelas contêm todos os dados de um
banco de dados e são a principal forma para coleção de dados.
23
SQL 2016 - Módulo I
1.6.2.2. Índices
Quando realizamos uma consulta de dados, o SQL Server 2016 faz uso dos índices
(index) para buscar, de forma fácil e rápida, informações específicas em uma tabela
ou VIEW indexada.
1.6.2.3. CONSTRAINT
São objetos cuja finalidade é estabelecer regras de integridade e consistência nas
colunas das tabelas de um banco de dados. São cinco os tipos de CONSTRAINT
oferecidos pelo SQL Server: PRIMARY KEY, FOREIGN KEY, UNIQUE, CHECK e
DEFAULT.
1.6.2.4. VIEW (Visualização)
Definimos uma VIEW (visualização) como uma tabela virtual composta por linhas
e colunas de dados, os quais são provenientes de tabelas referenciadas em uma
consulta que define essa tabela.
Esse objeto oferece uma visualização lógica dos dados de uma tabela, de modo que
diversas aplicações possam compartilhá-la.
Essas linhas e colunas são geradas de forma dinâmica no momento em que é feita
uma referência a uma VIEW.
1.6.2.6. FUNCTION (Função)
Nesse objeto, encontramos um bloco de comandos T-SQL responsável por uma
determinada tarefa, isto é, a função (FUNCTION) executa um procedimento e retorna
um valor. Sua lógica pode ser compartilhada por diversas aplicações.
1.6.2.7. TRIGGER (Gatilho)
Esse objeto também possui um bloco de comandos T-SQL. O TRIGGER é criado sobre
uma tabela e ativado automaticamente no momento da execução dos comandos
UPDATE, INSERT ou DELETE.
24
Introdução ao SQL Server 2016 1
1.7. Ferramentas de gerenciamento
A seguir, descreveremos as funcionalidades oferecidas pelas ferramentas de
gerenciamento disponíveis no SQL Server e que trabalham associadas aos componentes
descritos anteriormente:
É um aplicativo usado para gerenciar bancos de dados e que permite criar, alterar e
excluir objetos no banco de dados:
25
SQL 2016 - Módulo I
1.8.1. Inicializando o SSMS
Para abrir o SQL Server Management Studio, siga os passos adiante:
26
Introdução ao SQL Server 2016 1
3. Na tela Connect to Server, escolha a opção SQL Server Authentication para o
campo Authentication e, no campo Server Name, especifique o nome do servidor
com o qual será feita a conexão:
4. Clique no botão Connect. A interface do SQL Server Management Studio será aberta,
conforme mostra a imagem a seguir:
27
SQL 2016 - Módulo I
1.8.2. Interface
A interface do SSMS é composta pelo Object Explorer e pelo Code Editor, explicados
a seguir:
•• Object Explorer
É uma janela que contém todos os elementos existentes dentro do seu servidor MS-
SQL Server no formato de árvore:
28
Introdução ao SQL Server 2016 1
Expandindo o item PEDIDOS e depois o item Tables, veremos os nomes das tabelas
existentes no banco de dados:
29
SQL 2016 - Módulo I
Expandindo uma das tabelas, veremos características da sua estrutura, bem como as
suas colunas:
30
Introdução ao SQL Server 2016 1
•• Code Editor
O Code Editor (Editor de Código) do SQL Server Management Studio permite escrever
comandos T-SQL, MDX, DMX, XML/A e XML. Clicando no botão New Query (Nova
Consulta), será aberta uma janela vazia para edição dos comandos. Cada vez que
clicarmos em New Query, uma nova aba vazia será criada:
Cada uma dessas abas representa uma conexão com o banco de dados e recebe um
número de sessão. Cada conexão tem um número de sessão único, mesmo que
tenha sido aberta pelo mesmo usuário com o mesmo login e senha. Quando outra
aplicação criada em outra linguagem, como Delphi, VB ou C#, abrir uma conexão, ela
também receberá um número único de sessão.
31
SQL 2016 - Módulo I
1.8.3. Executando um comando
Para executar um comando a partir do SQL Server Management Studio, adote o
seguinte procedimento:
32
Introdução ao SQL Server 2016 1
3. Na barra de ferramentas do Code Editor, clique sobre o botão Execute ou pressione
a tecla F5 (ou CTRL + E) para que o comando seja executado. O resultado do comando
será exibido na parte inferior da interface, conforme a imagem a seguir:
•• Quando salvamos o arquivo contido no editor, ele recebe a extensão .sql, por
padrão. É um arquivo de texto também conhecido como SCRIPT SQL.
33
SQL 2016 - Módulo I
1.8.4. Comentários
Todo script deve possuir comentários que ajudarão a entender e documentar as
instruções. A cor do comentário é o verde e o SQL ignora o conteúdo do texto.
Para comentar uma linha utilize dois traços (--). Por exemplo:
-- Comentário
-- Primeira aula de SQL Server
/*
Bloco de texto comentado que não é executado pelo SQL
*/
1.8.5. Opções
Várias opções de customização do SSMS podem ser ajustadas conforme a preferência
do usuário. Para isso, no menu Tools, clique em Options, abrindo a seguinte janela:
34
Introdução ao SQL Server 2016 1
•• Numeração automática da linha
Na janela Options, clique em Text Editor. Na guia All Languages, selecione Line
numbers:
Na mesma guia, selecione Word wrap e Show visual glyphs for word wrap:
35
SQL 2016 - Módulo I
1.8.6. Salvando scripts
Para salvar os scripts utilizados, siga os passos adiante:
3. Clique em Save.
36
Introdução ao SQL Server 2016 1
1.8.7. Soluções e Projetos
Uma solução é um conjunto de projetos, enquanto que um projeto é a coleção dos
scripts. A organização é a grande vantagem deste tipo de recurso.
No SSMS, clique no menu File / New / Project e, em seguida, selecione SQL Server
Management Studio Solution:
37
SQL 2016 - Módulo I
•• Criando projetos
No SSMS, clique no menu File / New / Project e, em seguida, selecione SQL Server
Management Studio Projects:
38
Introdução ao SQL Server 2016 1
Pontos principais
Atente para os tópicos a seguir. Eles devem ser estudados com muita atenção,
pois representam os pontos mais importantes do capítulo.
•• Uma tabela precisa ter uma coluna que identifica de forma única cada uma de
suas linhas. Essa coluna é chamada de chave primária;
39
Introdução
1 ao SQL Server
2016
Teste seus conhecimentos
SQL 2016 - Módulo I
3. Com relação à linguagem SQL, qual das afirmações adiante está correta?
☐☐ a) A linguagem SQL foi desenvolvida pela IBM e não pode ser utilizada
em outros bancos de dados.
☐☐ b) O SQL Server 2016 não utiliza a linguagem SQL.
☐☐ c) O SQL Server 2016 utiliza a linguagem T-SQL que é uma implementação
da linguagem SQL.
☐☐ d) Nunca devemos utilizar a linguagem SQL, pois está ultrapassada.
☐☐ e) Nenhuma das alternativas anteriores está correta.
4. Com relação ao SQL Server 2016, qual das seguintes afirmações está
correta?
☐☐ a) VIEW
☐☐ b) Tabelas
☐☐ c) CONSTRAINT
☐☐ d) PROCEDURE
☐☐ e) TRIGGER
42
1 Introdução ao
SQL Server 2016
Mãos à obra!
SQL 2016 - Módulo I
Laboratório 1
A – Construindo artefatos de modelagem de dados
44
Introdução ao SQL Server 2016 1
Tipo de NOT
Sequência Campo Descrição Identity Bytes PK FK Regras Default
Dados NULL
1
2
3
4
5
6
7
8
9
10
11
12
13
45
SQL 2016 - Módulo I
Laboratório 2
A – Criando soluções, projetos e scripts
•• Localização: C:\SQL\Soluções.
•• Localização: C:\SQL\Soluções;
SELECT GETDATE()
46
2 Criando um
banco de dados
ÃÃ CREATE DATABASE;
ÃÃ CREATE TABLE;
ÃÃ Tipos de dados;
ÃÃ Campo de autonumeração (IDENTITY);
ÃÃ Constraints.
SQL 2016 - Módulo I
2.1. Introdução
Neste capítulo, veremos os recursos iniciais para criação de banco de dados: os
comandos CREATE DATABASE e CREATE TABLE, os tipos de dados e as constraints.
•• <>: Termos entre os sinais menor e maior são nomes ou valores definidos por
nós;
2.2. CREATE DATABASE
DATABASE é um conjunto de arquivos que armazena todos os objetos do banco de
dados.
Para que um banco de dados seja criado no SQL Server, é necessário utilizar a instrução
CREATE DATABASE, cuja sintaxe básica é a seguinte:
Assim que são criados, os bancos de dados possuem apenas os objetos de sistema,
como tabelas, PROCEDURES, VIEWS, necessários para o gerenciamento das tabelas.
48
Criando um banco de dados 2
Também é possível criar um banco de dados graficamente. Através do SSMS, sobre a
conexão, clique com o botão direito em New Database.
É importante que seja definida a localização dos arquivos que compõem o banco para
o seu melhor gerenciamento.
Para facilitar o acesso a um banco de dados, devemos colocá-lo em uso, mas isso não
é obrigatório. Para colocar um banco de dados em uso, utilize o seguinte código:
49
SQL 2016 - Módulo I
Veja um exemplo:
USE SALA_DE_AULA
2.3. CREATE TABLE
Os principais objetos de um banco de dados são suas tabelas, responsáveis pelo
armazenamento dos dados.
A instrução CREATE TABLE deve ser utilizada para criar tabelas dentro de um banco
de dados já existente. A sintaxe para uso dessa instrução é a seguinte:
Em que:
50
Criando um banco de dados 2
•• <data_type>: Tipo de dado que será gravado na coluna (texto, número, data
etc.);
•• [NOT NULL]: Define um campo que precisa ser preenchido, isto é, não pode
ficar vazio (NULL);
•• [DEFAULT <exprDef>]: Valor que será gravado no campo, caso ele fique vazio
(NULL).
•• Uma tabela não pode conter mais de uma chave primária, mas pode ter uma
chave primária composta por vários campos.
51
SQL 2016 - Módulo I
1. Expanda Databases;
52
Criando um banco de dados 2
2.4. Tipos de dados
Cada elemento, como uma coluna, variável ou expressão, possui um tipo de dado. O
tipo de dado especifica o tipo de valor que o objeto pode armazenar, como números
inteiros, texto, data e hora etc. O SQL Server organiza os tipos de dados dividindo-os
em categorias.
2.4.1. Numéricos exatos
A tabela a seguir descreve alguns dos tipos de dados que fazem parte dessa categoria:
•• Inteiros
Nome Descrição
Valor de número inteiro compreendido entre
bigint
-2^63 (-9,223,372,036,854,775,808) e
8 bytes
2^63-1 (9,223,372,036,854,775,807).
int Valor de número inteiro compreendido entre
4 bytes -2^31 (-2,147,483,648) e 2^31 - 1 (2,147,483,647).
smallint Valor de número inteiro compreendido entre
2 bytes -2^15 (-32,768) e 2^15 - 1 (32,767).
tinyint
Valor de número inteiro de 0 a 255.
1 byte
•• Bit
Nome Descrição
bit
Valor de número inteiro com o valor 1 ou o valor 0.
1 byte
•• Numéricos exatos
Nome Descrição
Valor numérico de precisão e escala fixas de
decimal(<T>,<D>)
-10^38 +1 até 10^38 –1.
Valor numérico de precisão e escala fixas de
numeric(<T>,<D>)
-10^38 +1 até 10^38 –1.
53
SQL 2016 - Módulo I
•• Valores monetários
Nome Descrição
Compreende valores monetários ou de moeda
money
corrente entre -922.337.203.685.477,5808 e
8 bytes
922.337.203.685.477,5807.
smallmoney Compreende valores monetários ou de moeda corrente
4 bytes entre -214,748.3648 e +214,748.3647.
2.4.2. Numéricos aproximados
A tabela a seguir descreve alguns dos tipos de dados que fazem parte dessa categoria:
Nome Descrição
Valor numérico de precisão flutuante entre
float[(n)] -1.79E + 308 e -2.23E - 308, 0 e de 2.23E + 308 até
1.79E + 308.
real
Valor numérico de precisão flutuante entre -3.40E + 38
o mesmo que
e -1.18E - 38, 0 e de 1.18E - 38 até 3.40E + 38.
float(24)
Em que:
54
Criando um banco de dados 2
2.4.3. Data e hora
A tabela a seguir descreve alguns dos tipos de dados que fazem parte dessa categoria:
Nome Descrição
Data e hora compreendidas entre 1º de janeiro de 1753
datetime
e 31 de dezembro de 9999, com a exatidão de 3.33
8 bytes
milissegundos.
smalldatetime Data e hora compreendidas entre 1º de janeiro de 1900 e
4 bytes 6 de junho de 2079, com a exatidão de 1 minuto.
Data e hora compreendidas entre 01/01/0001 e
31/12/9999 com precisão de até 100 nanossegundos,
datetime2[(p)]
dependendo do valor de p, que representa a quantidade
8 bytes
de algarismos na fração de segundo. Omitindo p, o valor
default será 7.
date Data compreendida entre 01/01/0001 e 31/12/9999,
3 bytes com precisão de 1 dia.
Hora no intervalo de 00:00:00.0000000 a
time[(p)]
23.59.59.9999999. O parâmetro p indica a quantidade
5 bytes
de dígitos na fração de segundo.
Data e hora compreendidas entre 01/01/0001 e
31/12/9999 com precisão de até 100 nanossegundos e
Datetimeoffset[(p)] com indicação do fuso horário, cujo intervalo pode variar
de -14:00 a +14:00. O parâmetro p indica a quantidade
de dígitos na fração de segundo.
A tabela a seguir descreve alguns dos tipos de dados que fazem parte dessa categoria:
Nome Descrição
Comprimento fixo de no máximo 8.000 caracteres no
char(<n>)
padrão ANSI. Cada caractere é armazenado em 1 byte.
Comprimento variável de no máximo 8.000 caracteres no
varchar(<n>)
padrão ANSI. Cada caractere é armazenado em 1 byte.
Comprimento variável de no máximo 2^31 - 1
text ou
(2,147,483,647) caracteres no padrão ANSI. Cada
varchar(max)
caractere é armazenado em 1 byte.
55
SQL 2016 - Módulo I
Em que:
A tabela a seguir descreve alguns dos tipos de dados que fazem parte dessa categoria:
Nome Descrição
nchar(<n>) Comprimento fixo de no máximo 4.000 caracteres Unicode.
Comprimento variável de no máximo 4.000 caracteres
nvarchar(<n>)
Unicode.
ntext ou Comprimento variável de no máximo 2^30 - 1 (1,073,741,823)
nvarchar(max) caracteres Unicode.
Em que:
Tanto no padrão ANSI quanto no UNICODE, existe uma tabela (ASCII) que codifica
todos os caracteres. Essa tabela é usada para converter o caractere no seu código,
quando gravamos, e para converter o código no caractere, quando lemos.
56
Criando um banco de dados 2
2.4.6. Strings binárias
No caso das strings binárias, não existe uma tabela para converter os caracteres, você
interpreta os bits de cada byte de acordo com uma regra sua.
A tabela a seguir descreve alguns dos tipos de dados que fazem parte dessa categoria:
Nome Descrição
Dado binário com comprimento fixo de, no máximo,
binary(<n>)
8.000 bytes.
Dado binário com comprimento variável de, no máximo,
varbinary(<n>)
8.000 bytes.
image ou Dado binário com comprimento variável de, no máximo,
varbinary(max) 2^31 - 1 (2,147,483,647) bytes.
Nome Descrição
Serve para definir um dado tabular, composto de linhas e
table
colunas, assim como uma tabela.
cursor Serve para percorrer as linhas de um dado tabular.
Um tipo de dado que armazena valores de vários tipos
sql_variant suportados pelo SQL Server, exceto os seguintes: text,
ntext, timestamp e sql_variant.
Timestamp ou
Número hexadecimal sequencial gerado automaticamente.
RowVersion
Globally Unique Identifier (GUID), também conhecido como
Identificador Único Global ou Identificador Único Universal.
uniqueidentifier
É um número hexadecimal de 16 bytes semelhante a
64261228-50A9-467C-85C5-D73C51A914F1.
57
SQL 2016 - Módulo I
Nome Descrição
XML Armazena dados no formato XML.
Hierarchyid Posição de uma hierarquia.
Geography Representa dados de coordenadas terrestres.
Geometry Representação de coordenadas euclidianas.
É importante saber que uma tabela pode ter apenas uma coluna do tipo identidade
e que não é possível inserir ou alterar seu valor, que é gerado automaticamente pelo
SQL-Server. Veja um exemplo:
2.6. Constraints
As constraints são objetos utilizados para impor restrições e aplicar validações aos
campos de uma tabela ou à forma como duas tabelas se relacionam. Podem ser
definidas no momento da criação da tabela ou posteriormente, utilizando o comando
ALTER TABLE.
58
Criando um banco de dados 2
2.6.1. Nulabilidade
Além dos valores padrão, também é possível atribuir valores nulos a uma coluna, o
que significa que ela não terá valor algum. O NULL (nulo) não corresponde a nenhum
dado, não é vazio ou zero, é nulo. Ao criarmos uma coluna em uma tabela, podemos
acrescentar o atributo NULL (que já é padrão), para que aceite valores nulos, ou então
NOT NULL, quando não queremos que determinada coluna aceite valores nulos.
Exemplo:
2.6.2. Tipos de constraints
São diversos os tipos de constraints que podem ser criados: PRIMARY KEY, UNIQUE,
CHECK, DEFAULT e FOREIGN KEY. Adiante, cada uma das constraints será descrita.
•• Exemplos
As colunas que formam a chave primária não podem aceitar valores nulos e devem
ter o atributo NOT NULL.
•• Comando
59
SQL 2016 - Módulo I
A convenção para dar nome a uma constraint do tipo chave primária é PK_NomeTabela,
ou seja, PK (abreviação de PRIMARY KEY) seguido do nome da tabela para a qual
estamos criando a chave primária.
2.6.2.2. UNIQUE
Além do(s) campo(s) que forma(m) a PRIMARY KEY, pode ocorrer de termos outras
colunas que não possam aceitar dados em duplicidade. Nesse caso, usaremos a
constraint UNIQUE.
As colunas nas quais são definidas constraints UNIQUE permitem a inclusão de valores
nulos, desde que seja apenas um valor nulo por coluna.
•• Exemplos
•• Comando
60
Criando um banco de dados 2
2.6.2.3. CHECK
Nesse tipo de constraint, criamos uma condição (semelhante às usadas com a cláusula
WHERE) para definir a integridade de um ou mais campos de uma tabela.
•• Exemplo
•• Comando
2.6.2.4. DEFAULT
Normalmente, quando inserimos dados em uma tabela, as colunas para as quais não
fornecemos valor terão, como conteúdo, NULL. Ao definirmos uma constraint do tipo
DEFAULT para uma determinada coluna, este valor será atribuído a ela quando o
INSERT não fornecer valor.
•• Exemplo
•• Comando
61
SQL 2016 - Módulo I
Tabela MESTRE
TB_DEPARTAMENTO
Tabela DETALHE
TB_EMPREGADO
Podemos ter essa mesma estrutura sem termos criado uma chave estrangeira, embora
a chave estrangeira garanta a integridade referencial dos dados, ou seja, com a chave
estrangeira, será impossível existir um registro de TB_EMPREGADO com um COD_
DEPTO inexistente em TB_DEPARTAMENTO. Quando procurarmos o COD_DEPTO
do empregado em TB_DEPARTAMENTO, sempre encontraremos correspondência.
Se a tabela MESTRE não possuir uma chave primária, não será possível criar uma
chave estrangeira apontando para ela.
62
Criando um banco de dados 2
Para criarmos uma chave estrangeira, temos que considerar as seguintes informações
envolvidas:
•• A tabela DETALHE;
•• A tabela MESTRE;
2.6.3. Criando constraints
A seguir, veremos como criar constraints com o uso de CREATE TABLE e ALTER
TABLE, bem como criá-las graficamente a partir da interface do SQL Server Management
Studio.
63
SQL 2016 - Módulo I
-- Tabela de TB_PRODUTO
CREATE TABLE TB_PRODUTO
( ID_PRODUTO INT IDENTITY NOT NULL,
DESCRICAO VARCHAR(50),
COD_TIPO INT,
PRECO_CUSTO NUMERIC(10,2),
PRECO_VENDA NUMERIC(10,2),
QTD_REAL NUMERIC(10,2),
QTD_MINIMA NUMERIC(10,2),
DATA_CADASTRO DATETIME DEFAULT GETDATE(),
SN_ATIVO CHAR(1) DEFAULT 'S',
CONSTRAINT PK_TB_PRODUTO PRIMARY KEY( ID_PRODUTO ),
CONSTRAINT UQ_TB_PRODUTO_DESCRICAO UNIQUE( DESCRICAO ),
CONSTRAINT CK_TB_PRODUTO_PRECOS
CHECK( PRECO_VENDA >= PRECO_CUSTO ),
CONSTRAINT CK_TB_PRODUTO_DATA_CAD
CHECK( DATA_CADASTRO <= GETDATE() ),
CONSTRAINT CK_TB_PRODUTO_SN_ATIVO
CHECK( SN_ATIVO IN ('N','S') ),
-- Convenção de nome: FK_TabelaDetalhe_TabelaMestre
CONSTRAINT FK_TB_PRODUTO_TIPO_PRODUTO
FOREIGN KEY (COD_TIPO)
REFERENCES TB_TIPO_PRODUTO (COD_TIPO) );
64
Criando um banco de dados 2
5. Veja um modelo para a criação de chave estrangeira:
-- CONSTRAINT FK_TabelaDetalhe_TabelaMestre
-- FOREIGN KEY (campoTabelaDetalhe)
-- REFERENCES TabelaMestre( campoPK_TabelaMestre )
INSERT TB_PRODUTO
(DESCRICAO, COD_TIPO, PRECO_CUSTO, PRECO_VENDA,
QTD_REAL, QTD_MINIMA)
VALUES ('TESTANDO INCLUSAO', 1, 10, 12, 10, 5 );
--
SELECT * FROM TB_PRODUTO;
65
SQL 2016 - Módulo I
USE TESTE_CONSTRAINT;
66
Criando um banco de dados 2
2.6.3.3. Criando constraints graficamente
O exemplo a seguir demonstra a criação de constraints graficamente. Primeiramente,
crie as tabelas TIPO_PRODUTO e PRODUTOS no banco de dados TESTE_CONSTRAINT:
USE TESTE_CONSTRAINT;
67
SQL 2016 - Módulo I
68
Criando um banco de dados 2
4. Uma janela com os nomes das tabelas existentes no banco de dados será exibida.
Selecione as duas tabelas, clique em Add (Adicionar) e, depois, em Close (Fechar).
Note que as tabelas aparecerão na área de desenho do diagrama;
69
SQL 2016 - Módulo I
70
Criando um banco de dados 2
8. Clique no botão Add (Adicionar);
9. Altere as propriedades Type (Tipo) para Unique Key (Chave Exclusiva) e Columns
(Colunas) para TIPO;
71
SQL 2016 - Módulo I
72
Criando um banco de dados 2
11. Para criar as constraints CHECK, clique com o botão direito do mouse sobre
a tabela TB_PRODUTO e selecione a opção Check Constraints... (Restrições de
Verificação...);
73
SQL 2016 - Módulo I
12. Na caixa de diálogo que é aberta, clique no botão Add e depois altere as seguintes
propriedades:
13. Para definir os valores default (padrão) de cada campo, clique com o botão direito
do mouse na tabela TB_PRODUTO, selecione Table View (Exibição da Tabela...) e
depois Modify Custom View (Modificar Personalização);
74
Criando um banco de dados 2
14. Na janela aberta, selecione as colunas Condensed Type e Nullable e remova-as
clicando no botão <. Em seguida, adicione a coluna Default Value clicando no botão
>. Feche a janela clicando em OK;
15. Para exibir os valores padrão, clique com o botão direito do mouse sobre a tabela
TB_PRODUTO, selecione Table View e clique na opção Custom. Por fim, informe o
valor padrão ao lado do nome do campo DATA_CADASTRO e SN_ATIVO;
75
SQL 2016 - Módulo I
16. Para definir a chave estrangeira, selecione o campo COD_TIPO da tabela TB_
PRODUTO e arraste-o até o campo COD_TIPO da tabela TIPO_PRODUTO.
76
Criando um banco de dados 2
Pontos principais
Atente para os tópicos a seguir. Eles devem ser estudados com muita atenção,
pois representam os pontos mais importantes do capítulo.
•• Cada elemento, como uma coluna, uma variável ou uma expressão, possui um
tipo de dado. O tipo de dado especifica o tipo de valor que o objeto pode
armazenar, como números inteiros, texto, data e hora etc.;
•• Para assegurar a integridade dos dados de uma tabela, o SQL Server oferece
cinco tipos diferentes de constraints: PRIMARY KEY, FOREIGN KEY, UNIQUE,
CHECK e DEFAULT;
•• Cada uma das constraints possui regras de utilização. Uma coluna que é definida
como chave primária, por exemplo, não pode aceitar valores nulos. Em cada
tabela, pode haver somente uma constraint de chave primária;
77
2 Criando um
banco de dados
Teste seus conhecimentos
SQL 2016 - Módulo I
80
Criando um banco de dados 2
3. Qual das alternativas possui uma afirmação correta a respeito do
seguinte código?
81
SQL 2016 - Módulo I
☐☐ a) CHAR(2)
☐☐ b) INT
☐☐ c) SMALLINT
☐☐ d) TINYINT
☐☐ e) NUMERIC(4,2)
☐☐ a) CHAR(8)
☐☐ b) INT
☐☐ c) NUMERIC(8)
☐☐ d) NUMERIC(2,10)
☐☐ e) NUMERIC(10,2)
☐☐ a) CHAR(8)
☐☐ b) INT
☐☐ c) VARCHAR(8)
☐☐ d) NUMERIC(8)
☐☐ e) NUMERIC(9)
82
2 Criando um
banco de dados
Mãos à obra!
SQL 2016 - Módulo I
Laboratório 1
A – Criando constraints com ALTER TABLE
•• Com TB_CLIENTE;
•• Com TB_VENDEDOR.
•• Com TB_TIPOPRODUTO;
•• Com TB_UNIDADE.
•• Com TB_PEDIDO;
•• Com TB_PRODUTO;
•• Com TB_COR.
84
Criando um banco de dados 2
•• O campo DESCONTO não pode ser menor que zero e maior que 10.
85
3 Inserção de
dados
ÃÃ Constantes;
ÃÃ Inserindo dados;
ÃÃ Utilizando TOP em uma instrução INSERT;
ÃÃ OUTPUT.
SQL 2016 - Módulo I
3.1. Constantes
As constantes, ou literais, são informações fixas que, como o nome sugere, não se
alteram no decorrer do tempo. Por exemplo, o seu nome escrito no papel é uma
constante e a sua data de nascimento é outra constante. Existem regras para escrever
constantes no SQL:
São sequências compostas por quaisquer caracteres existentes no teclado. Este tipo
de constante deve ser escrito entre apóstrofos:
Se o conteúdo do texto possuir o caractere apóstrofo, ele deve ser colocado duas
vezes, como mostrado em CAIXA D'AGUA.
Semelhante ao caso anterior, estas constantes devem ser precedidas pela letra
maiúscula N (identificador):
•• Constantes binárias
Veja um exemplo:
•• Constantes datetime
Utilizam valores de data incluídos em formatos específicos. Devem ser incluídos entre
aspas simples:
88
Inserção de dados 3
•• Constantes bit
Não incluídas entre aspas, as constantes bit são representadas por 0 ou 1. Uma
constante desse tipo será convertida em 1, caso um número maior do que 1 seja
utilizado.
0, 1
•• Constantes integer
São representadas por uma cadeia de números sem pontos decimais e não incluídos
entre aspas. As constantes integer não aceitam números decimais, somente números
inteiros:
1528
817215
5
•• Constantes decimal
São representadas por cadeias numéricas com ponto decimal e não incluídas entre
aspas:
162.45
5.78
•• Constantes uniqueidentifier
É uma cadeia de caracteres que representa um GUID. Pode ser especificada como uma
cadeia de binários ou em um formato de caracteres:
0xff19966f868b11d0b42d00c04fc964ff
'6F9619FF-8B86-D011-B42D-00C04FC964FF'
89
SQL 2016 - Módulo I
•• Constantes money
São precedidas pelo caractere cifrão ($). Este tipo de dado sempre reserva quatro
posições para a parte decimal. Os algarismos além da quarta casa decimal serão
desprezados.
$1543.56
$12892.6534
$56.275639
3.2. Inserindo dados
Para acrescentar novas linhas de dados em uma tabela, utilize o comando INSERT,
que possui a seguinte sintaxe:
Em que:
90
Inserção de dados 3
Para inserir uma única linha em uma tabela, o código é o seguinte:
Podemos inserir várias linhas em uma tabela com o uso de vários comandos INSERT
ou um único:
91
SQL 2016 - Módulo I
3.2.1. INSERT posicional
O comando INSERT é classificado como posicional quando não especifica a lista de
colunas que receberão os dados de VALUES. Nesse caso, a lista de valores precisa
conter todos os campos, exceto o IDENTITY, na ordem física em que foram criadas
no comando CREATE TABLE. Veja o exemplo a seguir:
-- Consultando os dados
SELECT * FROM TB_ALUNO;
92
Inserção de dados 3
3.2.2. INSERT declarativo
O INSERT é classificado como declarativo quando especifica as colunas que receberão
os dados da lista de valores. Veja o próximo exemplo:
-- Consultando os dados
SELECT * FROM TB_ALUNO;
-- Criar a tabela
CREATE TABLE CLIENTES_MG
( CODIGO INT PRIMARY KEY,
NOME VARCHAR(50),
ENDERECO VARCHAR(60),
BAIRRO VARCHAR(30),
CIDADE VARCHAR(30),
FONE VARCHAR(18) )
-- Consultar CLIENTES_MG
SELECT * FROM CLIENTES_MG
93
SQL 2016 - Módulo I
3.4. OUTPUT
Para verificar se o procedimento executado pelo comando INSERT, DELETE ou
UPDATE foi executado corretamente, podemos utilizar a cláusula OUTPUT existente
nesses comandos. Essa cláusula mostra os dados que o comando afetou.
deleted inserted
COMANDO
(antes) (depois)
DELETE SIM NÃO
INSERT NÃO SIM
UPDATE SIM SIM
A cláusula OUTPUT é responsável por retornar resultados com base em linhas que
tenham sido afetadas por uma instrução INSERT, UPDATE, DELETE ou MERGE. Os
resultados retornados podem ser usados por um aplicativo como mensagens, bem
como podem ser inseridos em uma tabela ou variável de tabela.
A cláusula OUTPUT garante que qualquer uma dessas instruções, mesmo que possua
erros, retorne linhas ao cliente. Contudo, é importante ressaltar que o resultado não
deve ser usado caso ocorra um erro ao executar a instrução.
94
Inserção de dados 3
3.4.1. OUTPUT em uma instrução INSERT
Em uma instrução INSERT, a cláusula OUTPUT retorna informações das linhas afetadas
pela instrução, ou seja, linhas inseridas. Isso pode ser útil para retornar o valor de
identidade ou as colunas computadas na instrução. Os resultados retornados também
podem ser usados como mensagens de um aplicativo.
A cláusula OUTPUT não pode ser utilizada em uma instrução INSERT caso o alvo
da instrução seja uma tabela remota, expressão de tabela comum ou visualização.
Também não pode possuir ou ser referenciada por uma constraint FOREIGN KEY.
95
SQL 2016 - Módulo I
96
Inserção de dados 3
Pontos principais
Atente para os tópicos a seguir. Eles devem ser estudados com muita atenção,
pois representam os pontos mais importantes do capítulo.
97
3 Inserção de
Dados
Teste seus conhecimentos
SQL 2016 - Módulo I
INSERT TB_ALUNO
( NOME, DATA_NASCIMENTO, IDADE, E_MAIL,
FONE_RES, FONE_COM, FAX, CELULAR,
PROFISSAO, EMPRESA)
VALUES
('André da Silva', '1980.1.2', 33, 'andre@silva.com',
'23456789','23459876','', '998765432',
'ANALISTA DE SISTEMAS', 'SOMA INFORMÁTICA'),
('Marcelo Soares', '1983.4.21', 30, 'marcelo@soares.com',
'23456789','23459876','', '998765432',
'INSTRUTOR', 'IMPACTA TECNOLOGIA'),
('MARIA LUIZA', '1997.10.29', 15, 'luiza@luiza.com',
'23456789','23459876','', '998765432',
'ESTUDANTE', 'COLÉGIO MONTE VIDEL');
☐☐ a) 1
☐☐ b) 2
☐☐ c) 3
☐☐ d) Não é possível inserir registros utilizando esse comando.
☐☐ e) Existe um erro de sintaxe, pois é necessário informar a palavra INTO após
o comando INSERT.
100
Inserção de Dados 3
☐☐ a) Posicional e Declarativo.
☐☐ b) Declarativo.
☐☐ c) Posicional.
☐☐ d) Interrogativo.
☐☐ e) Nenhuma das alternativas anteriores está correta.
101
SQL 2016 - Módulo I
6. Qual dos comandos adiante insere uma linha com dados na tabela
chamada ALUNOS, admitindo-se que a configuração de formato de data
seja 'yyyy.mm.dd'?
102
3 Inserção de
dados
Mãos à obra!
SQL 2016 - Módulo I
Laboratório 1
A – Criando um banco de dados para administrar as vendas de uma empresa
2. Nesse banco de dados, crie uma tabela chamada TB_PRODUTO com os seguintes
campos:
Inteiro, autonumeração
Código do produto
e chave primária
Nome do produto Alfanumérico
Código da unid. de medida Inteiro
Código da categoria Inteiro
Quantidade em estoque Numérico
Quantidade mínima Numérico
Preço de custo Numérico
Preço de venda Numérico
Características técnicas Texto longo
Fotografia Binário longo
Inteiro, autonumeração
Código da unidade
e chave primária
Nome da unidade Alfanumérico
104
Inserção de dados 3
Inteiro, autonumeração e
Código da categoria
chave primária
Nome da categoria Alfanumérico
105
4 Consultando
dados
ÃÃ SELECT;
ÃÃ Ordenação de dados;
ÃÃ Filtragem de consultas;
ÃÃ Operadores relacionais;
ÃÃ Operadores lógicos;
ÃÃ Consulta de intervalos com BETWEEN;
ÃÃ Consulta com base em caracteres;
ÃÃ Consulta de valores pertencentes ou não a
uma lista de elementos;
ÃÃ Lidando com valores nulos;
ÃÃ Substituição de valores nulos;
ÃÃ Manipulação de campos do tipo datetime;
ÃÃ Alteração da configuração de idioma a
partir do SSMS.
SQL 2016 - Módulo I
4.1. Introdução
Na linguagem SQL, o principal comando utilizado para a realização de consultas é o
SELECT. Por meio dele, torna-se possível consultar dados pertencentes a uma ou mais
tabelas de um banco de dados.
Para que possamos fazer exemplos que demonstrem as técnicas mais apuradas de
consulta, precisamos ter um banco de dados com um volume razoável de informações
já cadastradas.
1. No Object Explorer, clique com o botão direito do mouse sobre o item Databases
e selecione a opção Attach:
108
Consultando dados 4
109
SQL 2016 - Módulo I
Observe que o banco de dados aparecerá no Object Explorer. Neste banco, foram
criados dois diagramas que mostram as tabelas existentes nele. Você conseguirá
visualizar o diagrama executando um duplo-clique sobre o nome:
110
Consultando dados 4
•• DIAGRAMA DE PEDIDOS
111
SQL 2016 - Módulo I
•• DIAGRAMA DE EMPREGADOS
4.2. SELECT
O comando SELECT pertence ao grupo de comandos denominado DML (Data
Manipulation Language, ou Linguagem de Manipulação de Dados), que é composto de
comandos para consulta (SELECT), inclusão (INSERT), alteração (UPDATE) e exclusão
de dados de tabela (DELETE).
Em que:
•• [DISTINCT]: Palavra que especifica que apenas uma única instância de cada
linha faça parte do conjunto de resultados. DISTINCT é utilizada com o objetivo
de evitar a existência de linhas duplicadas no resultado da seleção;
•• [TOP (N) [PERCENT] [WITH TIES]]: Especifica que apenas um primeiro conjunto
de linhas ou uma porcentagem de linhas seja retornado. N pode ser um número
ou porcentagem de linhas;
112
Consultando dados 4
•• <lista_de_colunas>: Colunas que serão selecionadas para o conjunto de
resultados. Os nomes das colunas devem ser separados por vírgulas. Caso tais
nomes não sejam especificados, todas as colunas serão consideradas na seleção;
•• [GROUP BY <listaExprGrupo>:
113
SQL 2016 - Módulo I
Em que:
Para especificar o banco de dados de origem das tabelas, a partir do qual as informações
serão consultadas, utilize a instrução USE seguida pelo nome do banco de dados, da
seguinte maneira:
USE <nome_banco_de_dados>
USE PEDIDOS;
SELECT * FROM TB_EMPREGADO;
114
Consultando dados 4
4.2.2. Consultando colunas específicas
Para consultar colunas específicas de uma tabela, deve-se especificar o(s) nome(s)
da(s) coluna(s), como mostrado adiante:
A C
Veja o seguinte exemplo, em que é feita a consulta nas colunas CODFUN, NOME e
SALARIO da tabela TB_EMPREGADO:
115
SQL 2016 - Módulo I
Confira o resultado:
Veja o resultado:
116
Consultando dados 4
•• Definindo um título para a coluna calculada
Confira o resultado:
Se o alias contiver caracteres como espaço, ou outros caracteres especiais, o SQL gera
erro, a não ser que este nome seja delimitado por colchetes, apóstrofo ou aspas:
-- Campo calculado
SELECT CODFUN AS Codigo,
NOME AS Nome,
SALARIO AS Salario,
SALARIO * 1.10 [Salário com 10% de Aumento]
FROM TB_EMPREGADO
117
SQL 2016 - Módulo I
4.3. Ordenando dados
Utilizamos a cláusula ORDER BY em conjunto com o comando SELECT para retornar
os dados em uma determinada ordem.
Vejamos um exemplo:
Vejamos um exemplo:
118
Consultando dados 4
4.3.3. Ordenando por nome, alias ou posição
É possível utilizar a cláusula ORDER BY para ordenar dados retornados. Para isso,
utilizamos como identificação da coluna a ser ordenada o seu próprio nome físico
(caso exista), o seu alias ou a posição em que aparece na lista do SELECT.
-- Idem ao anterior
SELECT CODFUN AS Código,
NOME AS Nome,
SALARIO AS Salário,
SALARIO * 1.10 [Salário com 10% de aumento]
FROM TB_EMPREGADO
ORDER BY 3;
-- Idem ao anterior
SELECT CODFUN AS Código,
NOME AS Nome,
SALARIO AS Salário,
SALARIO * 1.10 [Salário com 10% de aumento]
FROM TB_EMPREGADO
ORDER BY 4;
119
SQL 2016 - Módulo I
Nesse caso, pode ser útil ordenar outra coluna dentro do grupo formado pela primeira:
120
Consultando dados 4
Note que, dentro de cada departamento, os dados estão ordenados pela coluna NOME:
--
SELECT COD_DEPTO, NOME, DATA_ADMISSAO, SALARIO
FROM TB_EMPREGADO
ORDER BY COD_DEPTO, SALARIO;
--
SELECT COD_DEPTO, NOME, DATA_ADMISSAO, SALARIO
FROM TB_EMPREGADO
ORDER BY COD_DEPTO, DATA_ADMISSAO;
-- Continua valendo o uso do "alias" ou da posição da
-- coluna
SELECT COD_DEPTO, NOME, DATA_ADMISSAO, SALARIO
FROM TB_EMPREGADO
ORDER BY 1, 3;
Não sabemos quem são esses cinco funcionários listados. Provavelmente, são os
primeiros a serem inseridos na tabela TB_EMPREGADO, mas nem isso podemos
afirmar com certeza.
121
SQL 2016 - Módulo I
Observe a sequência:
122
Consultando dados 4
Esse exemplo lista os empregados em ordem descendente de salário. Note que no
sétimo registro o salário é de 4500.00 e este valor se repete nos cinco registros
seguintes. Se aplicarmos a cláusula TOP 7, qual dos seis funcionários com salário de
4500.00 será mostrado, já que o valor é o mesmo?
Por qual razão o SQL selecionou o funcionário de CODFUN 7 como último da lista,
se existem outros cinco funcionários com o mesmo salário? Porque ele tem a menor
chave primária.
Na maioria das consultas, quando um fato como esse ocorre (empate na última linha),
o critério para desempate, se houver, dificilmente será pela menor chave primária.
Então, seria interessante que a consulta mostrasse todas as linhas em que o salário
fosse o mesmo da última:
123
SQL 2016 - Módulo I
4.3.6. Filtrando consultas
O exemplo a seguir demonstra o que vimos até aqui sobre a instrução SELECT:
124
Consultando dados 4
4.4. Operadores relacionais
A tabela a seguir exibe os operadores relacionais:
Operador Descrição
= Compara, se igual.
<> ou != Compara, se diferentes.
> Compara, se maior que.
< Compara, se menor que.
>= Compara, se maior que ou igual.
<= Compara, se menor que ou igual.
125
SQL 2016 - Módulo I
Embora pareça estranho, os sinais relacionais também podem ser usados para campos
alfanuméricos. Vejamos os seguintes exemplos:
126
Consultando dados 4
4.5. Operadores lógicos
A filtragem de dados em uma consulta também pode ocorrer com a utilização
dos operadores lógicos AND, OR ou NOT, cada qual permitindo uma combinação
específica de expressões, conforme apresentado adiante:
É importante saber onde utilizar o AND e o OR. Vamos supor que foi pedido para listar
todos os funcionários do COD_DEPTO igual a 2 e também igual a 5. Se fossemos
escrever o comando exatamente como foi pedido, digitaríamos o seguinte:
127
SQL 2016 - Módulo I
No entanto, essa consulta não vai produzir nenhuma linha de resultado. Isso porque um
mesmo empregado não está cadastrado nos departamentos 2 e 5 simultaneamente.
Um empregado está cadastrado ou (OR) no departamento 2 ou (OR) no departamento
5.
Precisamos entender que a pessoa que solicita a consulta está visualizando o resultado
pronto e acaba utilizando "e" (AND) no lugar de "ou" (OR). Sendo assim, é importante
saber que, na execução do SELECT, ele avalia os dados linha por linha. Então, o
correto é o seguinte:
128
Consultando dados 4
•• Funcionários com SALARIO entre 3000 e 5000
O operador BETWEEN também pode ser usado para dados do tipo data ou alfanuméricos:
Além de BETWEEN, podemos utilizar NOT BETWEEN, que permite consultar os valores
que não se encontram em uma determinada faixa de valores. O exemplo a seguir
pesquisa valores não compreendidos no intervalo especificado:
Em vez de <, > e OR, podemos utilizar NOT BETWEEN mais o operador AND para
pesquisar os mesmo valores da consulta anterior:
129
SQL 2016 - Módulo I
Na verdade, esse recurso de consulta pode buscar palavras que estejam contidas no
texto, seja no início, no meio ou no final dele. Acompanhe outros exemplos:
130
Consultando dados 4
Outro caractere curinga que pode ser utilizado em consultas com LIKE é o subscrito
(_), que equivale a um único caractere qualquer. Veja alguns exemplos:
•• Nomes iniciados por qualquer caractere, mas que o segundo caractere seja
a letra A
Além disso, podemos utilizar o operador NOT LIKE, que atua de forma oposta ao
operador LIKE. Com NOT LIKE, obtemos como resultado de uma consulta os valores
que não possuem os caracteres ou sílabas determinadas.
131
SQL 2016 - Módulo I
O operador NOT IN, por sua vez, ao contrário de IN, permite obter como resultado o
valor de uma coluna que não pertence a uma determinada lista de elementos.
-- Ver o resultado
SELECT * FROM TB_EMPREGADO;
132
Consultando dados 4
Confira o resultado:
•• Valores nulos não aparecem quando o campo faz parte da cláusula WHERE, a
não ser que a cláusula deixe explícito que deseja visualizar também os nulos;
Observe a consulta a seguir e note que o valor nulo que inserimos anteriormente não
aparece nem entre os menores salários e nem entre os maiores:
Como dito anteriormente, caso faça parte de cálculo, o resultado é sempre NULL:
133
SQL 2016 - Módulo I
Para lidar com valores nulos, evitando problemas no resultado final da consulta, pode-
se empregar funções como IS NULL, IS NOT NULL, NULLIF e COALESCE, as quais
serão apresentadas nos tópicos subsequentes.
4.10.1. ISNULL
Esta função permite definir um valor alternativo que será retornado, caso o valor de
argumento seja nulo. Vejamos os exemplos adiante:
•• Exemplo 1
SELECT
CODFUN, NOME, SALARIO, PREMIO_MENSAL,
ISNULL(SALARIO,0) + ISNULL(PREMIO_MENSAL,0) AS RENDA_TOTAL
FROM TB_EMPREGADO
WHERE SALARIO IS NULL;
134
Consultando dados 4
•• Exemplo 2
SELECT
CODFUN, NOME,
ISNULL(DATA_NASCIMENTO,'1900.1.1') AS DATA_NASC
FROM TB_EMPREGADO;
4.10.2. COALESCE
Esta função é responsável por retornar o primeiro argumento não nulo em uma lista
de argumentos testados.
O código a seguir tenta exibir o campo EST_COB dos clientes da tabela TB_CLIENTE.
Caso esse campo seja NULL, o código tenta exibir o campo ESTADO. Caso este último
também seja NULL, será retornado NC:
SELECT
CODCLI, NOME, COALESCE(EST_COB,ESTADO,'NC') AS EST_COBRANCA
FROM TB_CLIENTE
ORDER BY 3;
•• SET DATEFORMAT
135
SQL 2016 - Módulo I
A ordem das porções de data é definida por ordem, que pode ser um dos valores da
tabela adiante:
Valor Ordem
Mês, dia e ano (Formato padrão
mdy
americano).
dmy Dia, mês e ano.
ymd Ano, mês e dia.
ydm Ano, dia e mês.
myd Mês, ano e dia.
dym Dia, ano e mês.
•• GETDATE()
Para sabermos qual será a data daqui a 45 dias, utilizamos o seguinte código:
136
Consultando dados 4
•• DAY()
Esta função retorna um valor inteiro que representa o dia da data especificada como
argumento data na sintaxe adiante:
DAY(data)
O argumento data pode ser uma expressão, literal de string, variável definida pelo
usuário ou expressão de coluna.
•• MONTH()
Esta função retorna um valor inteiro que representa o mês da data especificada como
argumento data da sintaxe adiante:
MONTH(data)
O argumento data pode ser uma expressão, literal de string, variável definida pelo
usuário ou expressão de coluna.
Vejamos os exemplos:
•• YEAR()
Esta função retorna um valor inteiro que representa o ano da data especificada como
argumento data na sintaxe adiante:
YEAR(data)
O argumento data pode ser uma expressão, literal de string, variável definida pelo
usuário ou expressão de coluna.
137
SQL 2016 - Módulo I
•• DATEPART()
Esta função retorna um valor inteiro que representa uma porção (especificada no
argumento parte) de data ou hora definida no argumento data da sintaxe adiante:
O argumento data pode ser uma expressão, literal de string, variável definida pelo
usuário ou expressão de coluna, enquanto parte pode ser um dos valores descritos
na tabela a seguir:
138
Consultando dados 4
O exemplo a seguir utiliza DATEPART para retornar os empregados admitidos em
dezembro de 1996. Para isso, são especificadas as partes de ano (YEAR) e mês
(MONTH):
•• DATENAME()
Esta função retorna como resultado uma string de caracteres que representa uma
porção da data ou hora definida no argumento data da sintaxe adiante:
DATENAME(parte, data)
O argumento data pode ser uma expressão, literal de string, variável definida pelo
usuário ou expressão de coluna, enquanto parte, que representa a referida porção,
pode ser um dos valores descritos na tabela anterior.
•• DATEADD()
139
SQL 2016 - Módulo I
•• DATEDIFF()
Esta função obtém como resultado um número de data ou hora referente aos limites de
uma porção de data ou hora, cruzados entre duas datas especificadas nos argumentos
data_inicio e data_final da seguinte sintaxe:
O exemplo a seguir retorna a quantidade de dias vividos até hoje por uma pessoa
nascida em 12 de novembro de 1959:
O exemplo a seguir retorna a quantidade de meses vividos até hoje pela pessoa citada
no exemplo anterior:
O exemplo a seguir retorna a quantidade de anos vividos até hoje por essa mesma
pessoa:
140
Consultando dados 4
•• DATEFROMPARTS()
Esta função retorna uma data (DATE) a partir dos parâmetros ano, mês e dia
especificados nos argumentos da seguinte sintaxe:
•• TIMEFROMPARTS()
Esta função retorna um horário (TIME) a partir dos parâmetros hora, minuto, segundo,
milissegundo e precisão dos milissegundos especificados nos argumentos da seguinte
sintaxe:
•• DATETIMEFROMPARTS()
Esta função retorna um valor de data e hora (DATETIME) a partir dos parâmetros ano,
mês, dia, hora, minuto, segundo e milissegundo da seguinte sintaxe:
141
SQL 2016 - Módulo I
Caso algum valor esteja incorreto, a função retornará um erro. Agora, se o parâmetro
for nulo, a função retornará valor nulo. No exemplo a seguir, vamos retornar o valor
15 de setembro de 2013 às 14:00:15.0000:
•• DATETIME2FROMPARTS()
Retorna um valor do tipo datetime2 a partir dos parâmetros ano, mês, dia, hora,
minuto, segundo, fração de segundo e a precisão da fração de segundo da seguinte
sintaxe:
•• SMALLDATETIMEFROMPARTS()
Esta função retorna um valor do tipo smalldatetime a partir dos parâmetros ano,
mês, dia, hora e minuto da seguinte sintaxe:
142
Consultando dados 4
O resultado é mostrado a seguir:
•• DATETIMEOFFSETFROMPARTS()
•• EOMonth()
Esta função retorna o último dia do mês a partir dos parâmetros data_início e
adicionar_mês (Opcional) da seguinte sintaxe:
143
SQL 2016 - Módulo I
144
Consultando dados 4
2. Na janela seguinte, selecione a opção Advanced, procure o item Default Language
e altere-o para o idioma que desejar:
145
SQL 2016 - Módulo I
2. Clique com o botão direito no login a ser alterado e selecione Properties no menu
de contexto, conforme ilustrado a seguir:
146
Consultando dados 4
Será exibida a seguinte janela:
147
SQL 2016 - Módulo I
Pontos principais
Atente para os tópicos a seguir. Eles devem ser estudados com muita atenção,
pois representam os pontos mais importantes do capítulo.
•• O tipo de dado datetime é utilizado para definir valores de data e hora. Esse
tipo é baseado no padrão norte-americano, ou seja, os valores devem atender
ao modelo mm/dd/aa (mês, dia e ano, respectivamente). Dispomos de diversas
funções para retornar dados desse tipo, tais como GETDATE(), DAY(), MONTH()
e YEAR().
148
4 Consultando
dados
Teste seus conhecimentos
SQL 2016 - Módulo I
☐☐ a) ORDER BY 4
☐☐ b) ORDER BY [Salário com 10% de aumento]
☐☐ c) ORDER BY 4 DESC
☐☐ d) ORDER BY 2, 4 DESC.
☐☐ e) ORDER BY SALARIO DECRESCENT
☐☐ a) Cláusula OUTPUT
☐☐ b) SELECT com FROM
☐☐ c) SELECT com ORDER BY
☐☐ d) SELECT com TOP
☐☐ e) Nenhuma das alternativas anteriores está correta.
150
Consultando dados 4
4. A cláusula WHERE permite filtrar o resultado do comando SELECT. Qual
comando a seguir seria uma instrução válida para apresentar um cliente
de código 10 (Campo CODCLI do tipo INT)?
151
SQL 2016 - Módulo I
☐☐ a) A função ISNULL retorna um valor não nulo quando a expressão for nula.
☐☐ b) A função COALESCE retorna um valor não nulo de uma lista de valores
testados.
☐☐ c) Um valor nulo não é considerado zero.
☐☐ d) Um valor nulo não é considerado um texto em branco.
☐☐ e) Não devemos tratar um valor nulo, pois em cálculos são considerados como
zero.
8. Com relação ao uso de um filtro por ano em uma consulta, qual opção
está errada?
☐☐ a) Função YEAR.
☐☐ b) Função DATEPARTE.
☐☐ c) Expressão {campo} >= {1º dia do ano} and {campo} <= {último dia do ano}.
☐☐ d) Função DATEPART.
☐☐ e) Cláusula WHERE.
152
4 Consultando
dados
Mãos à obra!
SQL 2016 - Módulo I
Laboratório 1
A – Utilizando o banco de dados PEDIDOS e listando suas tabelas com base em
diferentes critérios
Note que existe uma divisão na instrução. Deve-se garantir que não ocorra divisão
por zero, pois isso provoca erro ao executar o comando.
154
Consultando dados 4
Laboratório 2
A – Utilizando o banco de dados PEDIDOS e listando suas tabelas com base em
novos critérios
Neste caso, o exercício não cita as colunas que devem ser exibidas. Sendo assim,
basta utilizar o símbolo asterisco (*) ou, então, colocar as colunas que julgar
importantes.
8. Liste produtos com quantidade real acima de 5000 e código do tipo igual a 6;
9. Liste produtos com quantidade real acima de 5000 ou código do tipo igual a 6;
10. Liste pedidos com valor total inferior a R$100,00 ou acima de R$100.000,00;
11. Liste produtos com QTD_REAL menor que 500 ou maior que 1000.
155
SQL 2016 - Módulo I
Laboratório 3
A – Utilizando o banco de dados PEDIDOS
3. Liste clientes dos estados de Minas Gerais e Rio de Janeiro (MG, RJ);
4. Liste clientes dos estados de São Paulo, Minas Gerais e Rio de Janeiro (SP, MG, RJ);
12. Liste todos os clientes que tenham a letra A como segundo caractere do nome;
13. Liste todos os produtos que tenham 0 (ZERO) como segundo caractere do campo
COD_PRODUTO;
14. Liste todos os produtos que tenham a letra A como terceiro caractere do campo
COD_PRODUTO.
156
Consultando dados 4
Laboratório 4
A – Utilizando novamente o banco de dados PEDIDOS e listando suas tabelas com
base em outros critérios
157
5 Associando
tabelas
ÃÃ INNER JOIN;
ÃÃ OUTER JOIN;
ÃÃ CROSS JOIN.
SQL 2016 - Módulo I
5.1. Introdução
A associação de tabelas, ou simplesmente JOIN entre tabelas, tem como principal
objetivo trazer, em uma única consulta (um único SELECT), dados contidos em mais
de uma tabela.
Normalmente, essa associação é feita por meio da chave estrangeira de uma tabela
com a chave primária da outra. Mas isso não é um pré-requisito para o JOIN, de forma
que qualquer informação comum entre duas tabelas servirá para associá-las.
Diferentes tipos de associação podem ser escritos com a ajuda das cláusulas JOIN
e WHERE. Por exemplo, podemos obter apenas os dados relacionados entre duas
tabelas associadas. Também podemos combinar duas tabelas de forma que seus
dados relacionados e não relacionados sejam obtidos.
Basicamente, existem três tipos de JOIN que serão vistos neste capítulo: INNER JOIN,
OUTER JOIN e CROSS JOIN.
5.2. INNER JOIN
A cláusula INNER JOIN compara os valores de colunas provenientes de tabelas
associadas, utilizando, para isso, operadores de comparação. Por meio desta
cláusula, os registros de duas tabelas são utilizados para que sejam gerados os dados
relacionados de ambas.
SELECT <lista_de_campos>
FROM <nome_primeira_tabela> [INNER] JOIN <nome_segunda_tabela> [ON
(condicao)]
Em que:
TB_EMPREGADO TB_DEPARTAMENTO
160
Associando tabelas 5
Observando as duas tabelas, é possível concluir que o funcionário de CODFUN = 5
trabalha no departamento de COMPRAS, cujo código é 4.
A especificação desse tipo de associação pode ocorrer por meio das cláusulas WHERE
ou FROM. Veja os exemplos a seguir:
•• Exemplo 1
Este exemplo está correto, porque não há duplicidade nos campos CODFUN, NOME
e DEPTO.
•• Exemplo 2
161
SQL 2016 - Módulo I
Este exemplo está errado, porque o campo COD_DEPTO existe nas duas tabelas. É
obrigatório indicar de qual tabela vamos pegar os campos.
Sempre use o nome da tabela antes do nome do campo, mesmo que ele exista em
apenas uma das tabelas.
-- OU
SELECT E.CODFUN, E.NOME, D.DEPTO
FROM TB_EMPREGADO E JOIN TB_DEPARTAMENTO D
ON E.COD_DEPTO = D.COD_DEPTO;
Na figura a seguir, você pode notar um ícone de chave na posição horizontal localizado
na linha que liga as tabelas TB_EMPREGADO e TB_DEPARTAMENTO. Essa chave está
ao lado da tabela TB_DEPARTAMENTO, o que indica que é a chave primária dessa
tabela (COD_DEPTO), e se relaciona com a tabela TB_EMPREGADO, que também
possui um campo COD_DEPTO, que é a chave estrangeira.
162
Associando tabelas 5
Há, também, um JOIN entre as tabelas TB_EMPREGADO e TB_CARGO. Podemos
perceber a existência de uma chave horizontalmente posicionada na linha que liga
essas tabelas, e ela está ao lado de TB_CARGO. Então, é a chave primária de TB_CARGO
(COD_CARGO) que se relaciona com a tabela TB_EMPREGADO. Em TB_EMPREGADO,
também temos um campo COD_CARGO.
Normalmente, os campos que relacionam duas tabelas possuem o mesmo nome nas
duas tabelas. Porém, isso não é uma condição necessária para que o JOIN funcione.
SELECT
E.CODFUN, E.NOME, E.CODIGO_DEPTO, E.COD_CARGO, D.DEPTO
FROM TB_EMPREGADS E
JOIN TB_DEPARTAMENTO D ON E.COD_DEPTO = D.COD_DEPTO;
O primeiro erro acusado na execução do código foi na cláusula FROM, o que prova
que ela é processada antes.
163
SQL 2016 - Módulo I
-- Consultar 3 tabelas
SELECT
E.CODFUN, E.NOME, E.COD_DEPTO, E.COD_CARGO, D.DEPTO, C.CARGO
FROM TB_EMPREGADO E
JOIN TB_DEPARTAMENTO D ON E.COD_DEPTO = D.COD_DEPTO
JOIN TB_CARGO C ON E.COD_CARGO = C.COD_CARGO;
-- OU
SELECT
E.CODFUN, E.NOME, E.COD_DEPTO, E.COD_CARGO, D.DEPTO, C.CARGO
FROM TB_DEPARTAMENTO D
JOIN TB_EMPREGADO E ON E.COD_DEPTO = D.COD_DEPTO
JOIN TB_CARGO C ON E.COD_CARGO = C.COD_CARGO;
-- OU
SELECT
E.CODFUN, E.NOME, E.COD_DEPTO, E.COD_CARGO, D.DEPTO, C.CARGO
FROM TB_CARGO C
JOIN TB_EMPREGADO E ON E.COD_CARGO = C.COD_CARGO
JOIN TB_DEPARTAMENTO D ON E.COD_DEPTO = D.COD_DEPTO;
Na consulta a seguir, temos dois erros. O primeiro é que não há JOIN entre TB_
DEPARTAMENTO e TB_CARGO, como é mostrado no diagrama de tabelas do SSMS.
O segundo é que não podemos fazer referência a uma tabela (E.COD_CARGO), antes
de abri-la:
SELECT
E.CODFUN, E.NOME, E.COD_DEPTO, E.COD_CARGO, D.DEPTO, C.CARGO
FROM TB_CARGO C
JOIN TB_DEPARTAMENTO D ON E.COD_DEPTO = D.COD_DEPTO --<< (1)
JOIN TB_EMPREGADO E ON E.COD_CARGO = C.COD_CARGO;
164
Associando tabelas 5
A seguir, temos mais um exemplo da utilização de JOIN, desta vez com seis tabelas:
/*
Join com 6 tabelas. Vai exibir:
TB_ITENSPEDIDO.NUM_PEDIDO
TB_ITENSPEDIDO.NUM_ITEM
TB_ITENSPEDIDO.COD_PRODUTO
TB_PRODUTO.DESCRICAO
TB_ITENSPEDIDO.QUANTIDADE
TB_ITENSPEDIDO.PR_UNITARIO
TB_TIPOPRODUTO.TIPO
TB_UNIDADE.UNIDADE
TB_COR.COR
TB_PEDIDO.DATA_EMISSAO
É possível, também, associar valores em duas colunas não idênticas. Nessa operação,
utilizamos os mesmos operadores e predicados utilizados em qualquer INNER JOIN.
A associação de colunas só é funcional quando associamos uma tabela a ela mesma,
o que é conhecido como autoassociação ou self-join.
165
SQL 2016 - Módulo I
5.3. OUTER JOIN
A cláusula INNER JOIN, vista anteriormente, tem como característica retornar apenas
as linhas em que o campo de relacionamento exista em ambas as tabelas. Se o
conteúdo do campo chave de relacionamento existe em uma tabela, mas não na
outra, essa linha não será retornada pelo SELECT. Vejamos um exemplo de INNER
JOIN:
-- INNER JOIN
SELECT * FROM TB_EMPREGADO; -- retorna 61 linhas
--
SELECT -- retorna 58 linhas
E.CODFUN, E.NOME, E.COD_DEPTO, E.COD_CARGO, C.CARGO
FROM TB_EMPREGADO E
INNER JOIN TB_CARGO C ON E.COD_CARGO = C.COD_CARGO;
-- OU (a palavra INNER é opcional)
SELECT -- retorna 58 linhas
E.CODFUN, E.NOME, E.COD_DEPTO, E.COD_CARGO, C.CARGO
FROM TB_EMPREGADO E
JOIN TB_CARGO C ON E.COD_CARGO = C.COD_CARGO;
/*
Existem 61 linhas na tabela TB_EMPREGADO, mas quando fazemos
INNER JOIN com TB_CARGO, retorna apenas com 58 linhas.
A explicação para isso é que existem 3 linhas em TB_EMPREGADO
com COD_CARGO inválido, inexistente em TB_DEPARTAMENTO.
*/
Uma cláusula OUTER JOIN retorna todas as linhas de uma das tabelas presentes em
uma cláusula FROM. Dependendo da tabela (ou tabelas) cujos dados são retornados,
podemos definir alguns tipos de OUTER JOIN, como veremos a seguir.
•• LEFT JOIN
A cláusula LEFT JOIN ou LEFT OUTER JOIN permite obter não apenas os dados
relacionados de duas tabelas, mas também os dados não relacionados encontrados
na tabela à esquerda da cláusula JOIN. Ou seja, a tabela à esquerda sempre terá
todos os seus dados retornados em uma cláusula LEFT JOIN. Caso não existam dados
relacionados entre as tabelas à esquerda e à direita de JOIN, os valores resultantes de
todas as colunas de lista de seleção da tabela à direita serão nulos.
166
Associando tabelas 5
Veja exemplos da utilização de LEFT JOIN:
/*
OUTER JOIN: Exibe também as linhas que não tenham correspondência.
No exemplo a seguir, mostramos TODAS as linhas da tabela
que está à esquerda da palavra JOIN (TB_EMPREGADO)
*/
--
SELECT -- retorna 61 linhas
E.CODFUN, E.NOME, E.COD_DEPTO, E.COD_CARGO, C.CARGO
FROM TB_EMPREGADO E
LEFT OUTER JOIN TB_CARGO C ON E.COD_CARGO = C.COD_CARGO;
-- OU (a palavra OUTER é opcional)
SELECT -- retorna 61 linhas
E.CODFUN, E.NOME, E.COD_DEPTO, E.COD_CARGO, C.CARGO
FROM TB_EMPREGADO E
LEFT JOIN TB_CARGO C ON E.COD_CARGO = C.COD_CARGO;
-- Observe o resultado e veja que existem 3 empregados
-- com CARGO = NULL porque o campo COD_CARGO não foi preenchido
•• RIGHT JOIN
Ao contrário da LEFT OUTER JOIN, a cláusula RIGHT JOIN ou RIGHT OUTER JOIN
retorna todos os dados encontrados na tabela à direita de JOIN. Caso não existam
dados associados entre as tabelas à esquerda e à direita de JOIN, serão retornados
valores nulos.
167
SQL 2016 - Módulo I
Veja o seguinte uso de RIGHT JOIN. Da mesma forma que existem empregados
que não possuem um COD_DEPTO válido, podemos verificar se existe algum
departamento sem nenhum empregado cadastrado. Nesse caso, deveremos exibir
todos os registros da tabela que está à direita (RIGHT) da palavra JOIN, ou seja, da
tabela TB_DEPARTAMENTO:
SELECT
E.CODFUN, E.NOME, E.COD_DEPTO, E.COD_CARGO, D.DEPTO
FROM TB_EMPREGADO E RIGHT JOIN TB_DEPARTAMENTO D ON E.COD_DEPTO =
D.COD_DEPTO;
-- O resultado terá 2 departamentos que
-- não retornaram dados de empregados.
•• FULL JOIN
168
Associando tabelas 5
5.4. CROSS JOIN
Todos os dados da tabela à esquerda de JOIN são cruzados com os dados da tabela
à direita de JOIN, ao utilizarmos CROSS JOIN. As possíveis combinações de linhas
em todas as tabelas são conhecidas como produto cartesiano. O tamanho do produto
cartesiano será definido pelo número de linhas na primeira tabela multiplicado pelo
número de linhas na segunda tabela. É possível cruzar informações de duas ou mais
tabelas.
Quando CROSS JOIN não possui uma cláusula WHERE, gera um produto cartesiano
das tabelas envolvidas. Se adicionarmos uma cláusula WHERE, CROSS JOIN se
comportará como uma INNER JOIN.
-- CROSS JOIN
SELECT -- retorna 854 linhas
E.CODFUN, E.NOME, E.COD_DEPTO, E.COD_CARGO, D.DEPTO
FROM TB_EMPREGADO E CROSS JOIN TB_DEPARTAMENTO D;
A CROSS JOIN deve ser utilizada apenas quando for realmente necessário
um produto cartesiano, já que o resultado gerado pode ser muito grande.
169
SQL 2016 - Módulo I
Pontos principais
Atente para os tópicos a seguir. Eles devem ser estudados com muita atenção,
pois representam os pontos mais importantes do capítulo.
•• JOIN é uma cláusula que permite a associação entre várias tabelas, com base na
relação existente entre elas. Por meio dessa cláusula, os dados de uma tabela
são utilizados para selecionar dados pertencentes à outra tabela;
•• Há diversos tipos de JOIN: INNER JOIN, OUTER JOIN (LEFT JOIN, RIGHT JOIN
e FULL JOIN) e CROSS JOIN.
170
5 Associando
tabelas
Teste seus conhecimentos
SQL 2016 - Módulo I
☐☐ a) INNER JOIN
☐☐ b) OUTER JOIN
☐☐ c) CROSS JOIN
☐☐ d) FULL JOIN
☐☐ e) ALTER JOIN
SELECT
I.NUM_PEDIDO, I.NUM_ITEM, I.COD_PRODUTO, PR.DESCRICAO,
I.QUANTIDADE, I.PR_UNITARIO, T.TIPO, U.UNIDADE, CR.COR,
PE.DATA_EMISSAO
FROM TB_ITENSPEDIDO I
JOIN TB_PRODUTO PR ON I.ID_PRODUTO = PR.ID_PRODUTO
JOIN TB_COR CR ON I.CODCOR = CR.CODCOR
JOIN TB_TIPOPRODUTO T ON PR.COD_TIPO = T.COD_TIPO
JOIN TB_UNIDADE U ON PR.COD_UNIDADE = U.COD_UNIDADE
JOIN TB_PEDIDO PE ON I.NUM_PEDIDO = PE.NUM_PEDIDO
WHERE PE.DATA_EMISSAO BETWEEN '2014.1.1' AND '2014.1.31';
172
Associando tabelas 5
4. Para trazer todas as informações da tabela TABELA_A, independentemente
da relação, qual comando está correto?
☐☐ a) Relação entre duas tabelas mostrando todos os dados das duas tabelas.
☐☐ b) Um produto cartesiano, que é a combinação de todos os registros de uma
tabela com todos da outra.
☐☐ c) É um recurso disponível somente da versão SQL 2008 em diante.
☐☐ d) Devemos utilizar sempre e filtrarmos a consulta com WHERE.
☐☐ e) Não existe este tipo de JOIN.
173
5 Associando
tabelas
Mãos à obra!
SQL 2016 - Módulo I
Laboratório 1
A – Utilizando o comando JOIN para associar tabelas
176
Associando tabelas 5
7. Liste os campos COD_PRODUTO e DESCRICAO da tabela TB_PRODUTO, seguidos
da descrição do tipo de produto (TB_TIPOPRODUTO.TIPO) e do nome da unidade de
medida (TB_UNIDADE.UNIDADE);
Este exercício não especifica quais campos devem ser exibidos. Escolha você os
campos que devem ser mostrados.
15. Liste todos os itens de pedido com desconto superior a 7%. Mostre NUM_PEDIDO,
DESCRICAO do produto, NOME do cliente, NOME do vendedor e QUANTIDADE
vendida;
16. Liste os itens de pedido com o nome do produto, a descrição do tipo, a descrição
da unidade e o nome da cor, mas apenas os itens vendidos em janeiro de 2014 na
cor LARANJA;
17. Liste NOME e FONE1 dos fornecedores que venderam o produto CANETA STAR I;
18. Liste a DESCRICAO dos produtos comprados do fornecedor cujo NOME começa
com LINCE;
19. Liste NOME e FONE1 dos fornecedores, bem como DESCRICAO dos produtos
com QTD_REAL abaixo de QTD_MINIMA;
20. Liste todos os produtos comprados do fornecedor cujo nome inicia-se com FESTO.
177
6 Consultas com
subqueries
6.1. Introdução
Uma consulta aninhada em uma instrução SELECT, INSERT, DELETE ou UPDATE é
chamada de subquery (subconsulta). Isso ocorre quando usamos um SELECT dentro de
um SELECT, INSERT, UPDATE ou DELETE. Também é comum chamar uma subquery
de query interna. Já a instrução em que está inserida a subquery pode ser chamada
de query externa.
•• Uma subquery, que pode ser incluída dentro de outra subquery, deve estar
entre parênteses, o que a diferenciará da consulta principal;
•• Alguns tipos de dados não podem ser utilizados na lista de seleção de uma
subquery. São eles: nvarchar(max), varchar(max) e varbinary(max);
•• SOME (padrão ISO que equivale a ANY) e ANY realizam uma comparação
entre um valor escalar e um conjunto de valores de uma coluna. Então,
retornarão TRUE nos casos em que a comparação for verdadeira para
qualquer um dos pares.
180
Consultas com subqueries 6
•• Quando utilizamos um operador de comparação (=, < >, >, > =, <, ! >, ! < ou <
=) para introduzir uma subquery, sua lista de seleção poderá incluir apenas um
nome de coluna ou expressão, a não ser que utilizemos IN na lista ou EXISTS
no SELECT;
•• Uma view não pode ser atualizada caso ela tenha sido criada com uma subquery;
•• Uma instrução que possui uma subquery não apresenta muitas diferenças de
performance em relação a uma versão semanticamente semelhante que não
possui a subquery. No entanto, uma JOIN apresenta melhor desempenho nas
situações em que é necessário realizar testes de existência;
•• As colunas de uma tabela não poderão ser incluídas na saída, ou seja, na lista
de seleção da query externa, caso essa tabela apareça apenas em uma subquery
e não na query externa.
181
SQL 2016 - Módulo I
•• Exemplo 1
182
Consultas com subqueries 6
•• Exemplo 2
•• Exemplo 3
•• Exemplo 1
183
SQL 2016 - Módulo I
•• Exemplo 2
-- O mesmo que
SELECT TOP 1 WITH TIES * FROM TB_EMPREGADO
ORDER BY DATA_ADMISSAO DESC;
6.5. Subqueries correlacionadas
Quando uma subquery possui referência a uma ou mais colunas da query externa, ela
é chamada de subquery correlacionada. É uma subquery repetitiva, pois é executada
uma vez para cada linha da query externa. Assim, os valores das subqueries
correlacionadas dependem da query externa, o que significa que, para construir uma
subquery desse tipo, será necessário criar tanto a query interna como a externa.
Veja o exemplo a seguir, que grava, no campo SALARIO de cada funcionário, o valor
de salário inicial contido na tabela de cargos:
•• Quando EXISTS introduz uma subquery, sua lista de seleção será, normalmente,
um asterisco.
Por meio do código a seguir, é possível saber se temos clientes que não realizaram
compra no mês de janeiro de 2014:
184
Consultas com subqueries 6
6.6. Diferenças entre subqueries e
associações
Ao comparar subqueries e associações (JOINS), é possível constatar que as associações
são mais indicadas para verificação de existência, pois apresentam desempenho
melhor nesses casos. Também podemos verificar que, ao contrário das subqueries,
as associações não atuam em listas com um operador de comparação modificado por
ANY ou ALL, ou em listas que tenham sido introduzidas com IN ou EXISTS.
Em alguns casos, pode ser que lidemos com questões muito complexas para serem
respondidas com associações, então, será mais indicado usar subqueries. Isso porque
a visualização do aninhamento e da organização da query é mais simples em uma
subquery, enquanto que, em uma consulta com diversas associações, a visualização
pode ser complicada. Além disso, nem sempre as associações podem reproduzir os
efeitos de uma subquery.
O código a seguir utiliza JOIN para calcular o total vendido por cada vendedor no
período de janeiro de 2014 e a porcentagem de vendas em relação ao total de vendas
realizadas no mesmo mês:
Já o código a seguir utiliza subqueries para calcular, para cada departamento, o total
de salários dos funcionários sindicalizados e o total de salários dos não sindicalizados:
SELECT COD_DEPTO,
(SELECT SUM(E.SALARIO) FROM TB_EMPREGADO E
WHERE E.SINDICALIZADO = 'S' AND
E.COD_DEPTO = TB_EMPREGADO.COD_DEPTO) AS TOT_SALARIO_SIND,
(SELECT SUM(E.SALARIO) FROM TB_EMPREGADO E
WHERE E.SINDICALIZADO = 'N' AND
E.COD_DEPTO = TB_EMPREGADO.COD_DEPTO) AS TOT_SALARIO_NAO_
SIND
FROM TB_EMPREGADO
GROUP BY COD_DEPTO;
185
SQL 2016 - Módulo I
Assim, quando temos bastante RAM, as subqueries são preferíveis, pois ocorrem na
memória. Já as tabelas temporárias, como necessitam dos recursos disponibilizados
pelo disco rígido para serem executadas, são indicadas nas situações em que o(s)
servidor(es) do banco de dados apresenta(m) bastante espaço no disco rígido.
Há, ainda, uma importante diferença entre tabela temporária e subquery: normalmente,
esta última é mais fácil de manter. No entanto, se a subquery for muito complexa, a
melhor medida a ser tomada pode ser fragmentá-la em diversas tabelas temporárias,
criando, assim, blocos de dados de tamanho menor.
Veja o exemplo a seguir, que utiliza subqueries para retornar os pedidos da vendedora
LEIA para clientes de SP que não compraram em janeiro de 2014, mas compraram em
dezembro de 2013:
186
Consultas com subqueries 6
Já no próximo código, em vez de subqueries, utilizamos tabelas temporárias para
obter o mesmo resultado do código anterior:
-- SELECT de TB_PEDIDO
SELECT * FROM TB_PEDIDO
WHERE CODVEN IN (SELECT CODVEN FROM #VEND_LEIA)
AND
CODCLI IN (SELECT CODCLI FROM #CLI_FINAL);
187
SQL 2016 - Módulo I
Pontos principais
Atente para os tópicos a seguir. Eles devem ser estudados com muita atenção,
pois representam os pontos mais importantes do capítulo.
•• Uma subquery retornará uma lista de zero ou mais valores caso tenha sido
introduzida com a utilização de IN ou NOT IN. O resultado, então, será utilizado
pela query externa;
188
6 Consultas com
subqueries
Teste seus conhecimentos
SQL 2016 - Módulo I
190
Consultas com subqueries 6
4. Qual afirmação está errada, com relação a subqueries correlacionadas?
191
6 Consultas com
subqueries
Mãos à obra!
SQL 2016 - Módulo I
Laboratório 1
A – Trabalhando com JOIN e subquery
194
Consultas com subqueries 6
2. Apresente todas as salas de aula para as quais não há nenhum curso marcado;
4. Apresente os alunos (CAD_PESSOAS) que não têm e nem tiveram cursos agendados;
7. Apresente as pessoas que sejam de estados cujo ICMS seja menor que 7;
195
7 Atualizando e
excluindo dados
ÃÃ UPDATE;
ÃÃ DELETE;
ÃÃ OUTPUT para DELETE e UPDATE;
ÃÃ Transações.
SQL 2016 - Módulo I
7.1. Introdução
Os comandos da categoria Data Manipulation Language, ou DML, são utilizados não
apenas para consultar (SELECT) e inserir (INSERT) dados, mas também para realizar
alterações e exclusões de dados presentes em registros. Os comandos responsáveis
por alterações e exclusões são, respectivamente, UPDATE e DELETE.
É importante lembrar que os apóstrofos (') devem ser utilizados entre as strings de
caracteres, com exceção dos dados numéricos. Os valores de cada coluna, por sua
vez, devem ser separados por vírgulas.
7.2. UPDATE
Os dados pertencentes a múltiplas linhas de uma tabela podem ser alterados por
meio do comando UPDATE.
UPDATE tabela
SET nome_coluna = expressao [, nome_coluna = expressao,...]
[WHERE condicao]
Em que:
•• tabela: Define a tabela em que dados de uma linha ou grupo de linhas serão
alterados;
198
Atualizando e excluindo dados 7
Nas expressões especificadas com o comando UPDATE, costumamos utilizar
operadores aritméticos, os quais realizam operações matemáticas, e o operador de
atribuição =. A tabela a seguir descreve esses operadores:
Operador Descrição
+ Adição
- Subtração
* Multiplicação
/ Divisão
Retorna o resto inteiro
%
de uma divisão
= Atribuição
Operadores Descrição
+= Soma e atribui
-= Subtrai e atribui
*= Multiplica e atribui
/= Divide e atribui
Obtém o resto da
%=
divisão e atribui
-- Operadores
DECLARE @A INT = 10;
SET @A += 5; -- O mesmo que SET @A = @A + 5;
PRINT @A;
SET @A -= 2; -- O mesmo que SET @A = @A - 2;
PRINT @A;
SET @A *= 4; -- O mesmo que SET @A = @A * 4;
PRINT @A;
SET @A /= 2; -- O mesmo que SET @A = @A / 2;
PRINT @A;
GO
199
SQL 2016 - Módulo I
200
Atualizando e excluindo dados 7
No exemplo a seguir, serão corrigidos dados de um grupo de produtos:
-- Consultar
SELECT * FROM EMP_TEMP;
-- Multiplicar por 10 o valor do SALARIO de 15 registros da tabela
UPDATE TOP(15) EMP_TEMP SET SALARIO = 10*SALARIO;
-- Consultar
SELECT * FROM EMP_TEMP;
7.3. DELETE
O comando DELETE deve ser utilizado quando desejamos excluir os dados de uma
tabela. Sua sintaxe é a seguinte:
Em que:
201
SQL 2016 - Módulo I
•• Não realiza o log da exclusão de cada uma das linhas, o que acaba por consumir
pouco espaço no log de transações;
•• Os valores originais da tabela, quando ela foi criada, são restabelecidos, caso
haja uma coluna de identidade.
A linha a seguir verifica se os empregados que ganham mais do que 5000 realmente
foram excluídos:
202
Atualizando e excluindo dados 7
4. Já com o código adiante, elimine todos os registros da tabela EMPREGADOS_TMP:
203
SQL 2016 - Módulo I
Observe que podemos conferir se a alteração foi feita corretamente porque é possível
verificar se a condição está correta (COD_DEPTO = 3), e verificar o campo SALARIO
antes e depois da alteração.
204
Atualizando e excluindo dados 7
7.5. Transações
Quando uma conexão ocorre no MS-SQL, ela recebe um número de sessão. Mesmo
que a conexão ocorra a partir da mesma máquina e mesmo login, cada conexão é
identificada por um número único de sessão.
Observe a figura a seguir, em que temos três conexões identificadas pelas sessões
52, 54 e 55:
•• Um processo de transação é aberto por uma sessão e deve também ser fechado
pela mesma sessão;
205
SQL 2016 - Módulo I
7.5.1. Transações explícitas
As transações explícitas são aquelas em que seu início e seu término são determinados
de forma explícita. Para definir este tipo de transação, os scripts Transact-SQL utilizam
os seguintes comandos:
•• Se uma conexão for fechada com uma transação aberta, um ROLLBACK será
executado;
206
Atualizando e excluindo dados 7
Pontos principais
Atente para os tópicos a seguir. Eles devem ser estudados com muita atenção,
pois representam os pontos mais importantes do capítulo.
207
7
Atualizando
e excluindo
dados
Teste seus conhecimentos
SQL 2016 - Módulo I
☐☐ a) DELETE
☐☐ b) SELECT
☐☐ c) TRUNCATE
☐☐ d) UPDATE
☐☐ e) INSERT
UPDATE TB_EMPREGADO
SET SALARIO *= 1.2;
☐☐ a) DELETE
☐☐ b) DELETE ou TRUNCATE
☐☐ c) UPDATE
☐☐ d) SELECT
☐☐ e) INSERT
210
Atualizando
7 e excluindo
dados
Mãos à obra!
SQL 2016 - Módulo I
Laboratório 1
A – Atualizando e excluindo dados
3. Faça com que os preços de venda dos produtos do tipo 2 fiquem 30% acima do
preço de custo;
10. Altere o campo ICMS para 7 para clientes que não sejam dos estados RJ, RO, AC,
RR, MG, PR, SC, RS, MS, MT e SP;
212
Atualizando e excluindo dados 7
11. Altere para 7 o campo DESCONTO da tabela TB_ITENSPEDIDO, mas somente dos
itens do produto com ID_PRODUTO = 8, com data de entrega em janeiro de 2014 e
com QUANTIDADE acima de 1000;
12. Zere o campo DESCONTO de todos os itens de pedido com quantidade abaixo de
1000, com data de entrega posterior a 1-Junho-2014 e que tenham desconto acima
de zero;
13. Usando SELECT INTO, gere uma cópia da tabela VENDEDORES com o nome de
VENDEDORES_TMP;
213
Atualizando e
8 excluindo dados
em associações e
subqueries
Veja os dois códigos a seguir. Ambos utilizam UPDATE com subquery. No primeiro
código, o comando é para aumentar em 10% os salários dos empregados do
departamento CPD. No segundo, o preço de venda é atualizado para que fique 20%
acima do preço de custo de todos os produtos do tipo REGUA:
UPDATE TB_EMPREGADO
SET SALARIO = SALARIO * 1.10
WHERE COD_DEPTO = (SELECT COD_DEPTO FROM TB_DEPARTAMENTO
WHERE DEPTO = 'CPD');
216
Atualizando e excluindo dados em associações e subqueries
8
UPDATE TB_EMPREGADO
SET SALARIO *= 1.10
FROM TB_EMPREGADO E JOIN TB_DEPARTAMENTO D ON E.COD_DEPTO = D.COD_
DEPTO
WHERE D.DEPTO = 'CPD';
Já o próximo código atualiza o preço de venda para 20% acima do preço de custo de
todos os produtos do tipo REGUA:
217
SQL 2016 - Módulo I
Pontos principais
Atente para os tópicos a seguir. Eles devem ser estudados com muita atenção,
pois representam os pontos mais importantes do capítulo.
•• Subqueries podem ser utilizadas com o intuito de remover dados de uma tabela.
Basta definirmos a cláusula WHERE da instrução DELETE como uma subquery
para excluir linhas de uma tabela base conforme os dados armazenados em
uma outra tabela;
218
Atualizando e
8 excluindo dados
em associações
e subqueries
Teste seus conhecimentos
SQL 2016 - Módulo I
UPDATE TB_EMPREGADO
SET SALARIO = SALARIO * 1.10
WHERE COD_DEPTO = (SELECT COD_DEPTO FROM TB_DEPARTAMENTO
WHERE DEPTO = 'CPD');
UPDATE TB_EMPREGADO
SET SALARIO *= 1.10
FROM TB_EMPREGADO E JOIN TB_DEPARTAMENTO D ON E.COD_DEPTO = D.COD_
DEPTO
WHERE D.DEPTO = 'CPD';
220
Atualizando e excluindo dados em associações e subqueries
8
4. Analise o comando adiante e verifique qual afirmação é a correta:
221
Atualizando e
8
excluindo dados
em associações
e subqueries
Mãos à obra!
SQL 2016 - Módulo I
Laboratório 1
A – Atualizando tabelas com associações e subqueries
2. Altere a tabela TB_CARGO, mudando o salário inicial do cargo OFFICE BOY para
600,00;
5. Reajuste os preços de venda de todos os produtos de modo que fiquem 30% acima
do preço de custo (PRECO_VENDA = PRECO_CUSTO * 1.3);
7. Reajuste os preços de venda dos produtos com descrição do tipo igual à REGUA,
de modo que fiquem 40% acima do preço de custo. Para isso, considere as seguintes
informações:
8. Altere a tabela TB_ITENSPEDIDO de modo que todos os itens com produto indicado
como VERMELHO passem a ser LARANJA. Considere somente os pedidos com data de
entrega em outubro de 2014;
9. Altere o campo ICMS da tabela TB_CLIENTE para 12. Considere apenas clientes dos
estados: RJ, RO, AC, RR, MG, PR, SC, RS, MS e MT;
224
Atualizando e excluindo dados em associações e subqueries
8
10. Altere o campo ICMS para 18, apenas para clientes de SP;
11. Altere o campo ICMS da tabela TB_CLIENTE para 7. Considere apenas clientes
que não sejam dos estados: RJ, RO, AC, RR, MG, PR, SC, RS, MS, MT e SP;
•• SIGLA: Char(2);
13. Copie os dados coletados do seguinte comando SELECT para a tabela ESTADOS
utilizando um comando INSERT:
225
9 Agrupando
dados
ÃÃ Funções de agregação;
ÃÃ GROUP BY.
SQL 2016 - Módulo I
9.1. Introdução
Neste capítulo, você aprenderá como a cláusula GROUP BY pode ser utilizada para
agrupar vários dados, tornando mais prática sua sumarização. Também verá como
utilizar funções de agregação para sumarizar dados e como a cláusula GROUP BY
pode ser usada com a cláusula HAVING e com os operadores ALL, WITH ROLLUP e
CUBE.
9.2. Funções de agregação
As funções de agregação fornecidas pelo SQL Server permitem sumarizar dados. Por
meio delas, podemos somar valores, calcular médias e contar a quantidade de linhas
sumarizadas. Os cálculos realizados pelas funções de agregação são feitos com base
em um conjunto ou grupo de valores, mas retornam um único valor.
Veja um exemplo:
USE PEDIDOS;
-- neste caso, o grupo corresponde a toda a tabela TB_EMPREGADO
SELECT AVG(SALARIO) AS SALARIO_MEDIO
FROM TB_EMPREGADO;
-- neste caso, o grupo corresponde aos empregados com
-- COD_DEPTO = 2
SELECT AVG(SALARIO) AS SALARIO_MEDIO FROM TB_EMPREGADO
WHERE COD_DEPTO = 2;
228
Agrupando dados 9
•• COUNT ( { [ ALL | DISTINCT ] expressão | * } )
Esta função é utilizada para retornar a quantidade de registros existentes não nulos
em um grupo. Ao especificar o parâmetro ALL, a função não retornará valores nulos.
Os parâmetros de COUNT têm a mesma função dos parâmetros de AVG.
Veja um exemplo:
Esta função retorna o menor valor não nulo de expressão existente em um grupo. Os
parâmetros de MIN têm a mesma função dos parâmetros de AVG.
Veja um exemplo:
Esta função retorna o maior valor não nulo de expressão existente em um grupo. Os
parâmetros de MAX têm a mesma função dos parâmetros de AVG.
Veja um exemplo:
229
SQL 2016 - Módulo I
Veja um exemplo:
9.3. GROUP BY
Utilizando a cláusula GROUP BY, é possível agrupar diversos registros com base em
uma ou mais colunas da tabela.
Esta cláusula é responsável por determinar em quais grupos devem ser colocadas as
linhas de saída. Caso a cláusula SELECT contenha funções de agregação, a cláusula
GROUP BY realiza um cálculo a fim de chegar ao valor sumário para cada um dos
grupos.
Quando especificar a cláusula GROUP BY, deve ocorrer uma das seguintes situações:
a expressão GROUP BY deve ser correspondente à expressão da lista de seleção; ou
cada uma das colunas presentes em uma expressão não agregada na lista de seleção
deve ser adicionada à lista de GROUP BY.
Ao utilizar uma cláusula GROUP BY, todas as colunas na lista SELECT que não são
parte de uma expressão agregada serão usadas para agrupar os resultados obtidos.
Para não agrupar os resultados em uma coluna, não se deve colocá-los na lista SELECT.
Valores NULL são agrupados todos em uma mesma coluna, já que são considerados
iguais.
Quando utilizamos a cláusula GROUP BY, mas não empregamos a cláusula ORDER
BY, o resultado obtido são os grupos em ordem aleatória, visto que é essencial o uso
de ORDER BY para determinar a ordem de apresentação dos dados.
230
Agrupando dados 9
Em que:
Veja que o campo COD_DEPTO se repete e, portanto, forma grupos. Em uma situação
dessas, podemos gerar totalizações para cada um dos grupos utilizando a cláusula
GROUP BY.
231
SQL 2016 - Módulo I
•• Exemplo 1
•• Exemplo 2
-- GROUP BY + JOIN
SELECT E.COD_DEPTO, D.DEPTO, SUM( E.SALARIO ) AS TOT_SAL
FROM TB_EMPREGADO E
JOIN TB_DEPARTAMENTO D ON E.COD_DEPTO = D.COD_DEPTO
GROUP BY E.COD_DEPTO, D.DEPTO
ORDER BY TOT_SAL;
•• Exemplo 3
•• Exemplo 4
232
Agrupando dados 9
9.3.1. Utilizando ALL
ALL inclui todos os grupos e conjuntos de resultados. A seguir, veja um exemplo da
utilização de ALL:
9.3.2. Utilizando HAVING
A cláusula HAVING determina uma condição de busca para um grupo ou um
conjunto de registros, definindo critérios para limitar os resultados obtidos a partir
do agrupamento de registros. Ela é utilizada para estreitar um conjunto de resultados
por meio de critérios e valores agregados e para filtrar linhas após o agrupamento ter
sido feito e antes dos resultados serem retornados ao cliente.
É importante lembrar que essa cláusula só pode ser utilizada em parceria com GROUP
BY. Se uma consulta é feita sem GROUP BY, a cláusula HAVING pode ser usada como
cláusula WHERE.
233
SQL 2016 - Módulo I
Utilizada em parceria com a cláusula GROUP BY, a cláusula WITH ROLLUP acrescenta
uma linha na qual são exibidos os subtotais e totais dos registros já distribuídos em
colunas agrupadas.
234
Agrupando dados 9
O SELECT a seguir mostra as vendas de cada categoria de produto (TIPOPRODUTO)
que os vendedores (tabela TB_VENDEDOR) realizaram para cada cliente (tabela TB_
CLIENTE) no primeiro semestre de 2013:
SELECT
V.NOME AS VENDEDOR, C.NOME AS CLIENTE,
T.TIPO AS TIPO_PRODUTO, SUM( I.QUANTIDADE ) AS QTD_TOT
FROM
TB_PEDIDO Pe
JOIN TB_CLIENTE C ON Pe.CODCLI = C.CODCLI
JOIN TB_VENDEDOR V ON Pe.CODVEN = V.CODVEN
JOIN TB_ITENSPEDIDO I ON Pe.NUM_PEDIDO = I.NUM_PEDIDO
JOIN TB_PRODUTO Pr ON I.ID_PRODUTO = Pr.ID_PRODUTO
JOIN TB_TIPOPRODUTO T ON Pr.COD_TIPO = T.COD_TIPO
WHERE Pe.DATA_EMISSAO BETWEEN '2013.1.1' AND '2013.6.30'
GROUP BY V.NOME , C.NOME, T.TIPO;
Note que um dos vendedores é CELSON MARTINS e que alguns de seus clientes
são 3R (ARISTEU.ADALTON) e ALLAN HEBERT RELOGIOS E PRESENTES. Também
é possível perceber, por exemplo, que o cliente 3R (ARISTEU.ADALTON) comprou
111 unidades de produtos do tipo ACES.CHAVEIRO do vendedor CELSON MARTINS,
enquanto ALLAN HEBERT RELOGIOS E PRESENTES comprou 153 produtos do tipo
CANETA do mesmo vendedor.
235
SQL 2016 - Módulo I
Agora, acrescente a cláusula WITH ROLLUP após a linha de GROUP BY. O código
anterior ficará assim:
SELECT
V.NOME AS VENDEDOR, C.NOME AS CLIENTE,
T.TIPO AS TIPO_PRODUTO, SUM( I.QUANTIDADE ) AS QTD_TOT
FROM TB_PEDIDO Pe
JOIN TB_CLIENTE C ON Pe.CODCLI = C.CODCLI
JOIN TB_VENDEDOR V ON Pe.CODVEN = V.CODVEN
JOIN TB_ITENSPEDIDO I ON Pe.NUM_PEDIDO = I.NUM_PEDIDO
JOIN TB_PRODUTO Pr ON I.ID_PRODUTO = Pr.ID_PRODUTO
JOIN TB_TIPOPRODUTO T ON Pr.COD_TIPO = T.COD_TIPO
WHERE Pe.DATA_EMISSAO BETWEEN '2013.1.1' AND '2013.6.30'
GROUP BY V.NOME , C.NOME, T.TIPO
WITH ROLLUP;
Observe na figura anterior que, após a última linha do vendedor CELSON MARTINS,
existe um NULL na coluna TIPO_PRODUTO, o que significa que o valor apresentado
na coluna QTD_TOT corresponde ao total vendido por esse vendedor para o cliente 3R
(ARISTEU.ADALTON), ou seja, a coluna TIPO_PRODUTO (NULL) não foi considerada
para a totalização. Isso se repetirá até o último cliente que comprou de CELSON
MARTINS.
236
Agrupando dados 9
Antes de iniciar as totalizações do vendedor seguinte, existe uma linha na qual apenas
o nome do vendedor não é NULL, o que significa que o total apresentado na coluna
QTD_TOT representa o total vendido pelo vendedor CELSON MARTINS, ou seja,
55912 produtos, independentemente do cliente e do tipo de produto:
Na última linha do resultado, temos NULL nas três primeiras colunas. O total
corresponde ao total vendido (1022534) no período mencionado, independentemente
do vendedor, do cliente ou do tipo de produto:
Visto que a cláusula WITH CUBE é responsável por retornar todas as combinações
possíveis de grupos e de subgrupos, a quantidade de linhas não está relacionada
à ordem em que são determinadas as colunas de agrupamento, sendo, portanto,
mantida a quantidade de linhas já apresentada.
A cláusula WITH CUBE, em conjunto com GROUP BY, gera totais e subtotais,
apresentando vários agrupamentos de acordo com as colunas definidas com GROUP
BY.
237
SQL 2016 - Módulo I
Para explicar o que faz WITH CUBE, considere o exemplo utilizado para WITH ROLLUP.
No lugar desta última cláusula, utilize WITH CUBE. O código ficará assim:
SELECT
V.NOME AS VENDEDOR, C.NOME AS CLIENTE,
T.TIPO AS TIPO_PRODUTO, SUM( I.QUANTIDADE ) AS QTD_TOT
FROM TB_PEDIDO Pe
JOIN TB_CLIENTE C ON Pe.CODCLI = C.CODCLI
JOIN TB_VENDEDOR V ON Pe.CODVEN = V.CODVEN
JOIN TB_ITENSPEDIDO I ON Pe.NUM_PEDIDO = I.NUM_PEDIDO
JOIN TB_PRODUTO Pr ON I.ID_PRODUTO = Pr.ID_PRODUTO
JOIN TB_TIPOPRODUTO T ON Pr.COD_TIPO = T.COD_TIPO
WHERE Pe.DATA_EMISSAO BETWEEN '2013.1.1' AND '2013.6.30'
GROUP BY V.NOME , C.NOME, T.TIPO
WITH CUBE;
O resultado é o seguinte:
Esse tipo de resultado não existia com a opção WITH ROLLUP. Neste caso, a coluna
VENDEDOR é NULL e o total corresponde ao total de produtos do tipo ABRIDOR
comprado pelo cliente ABILIO (20 produtos). Já ALAMBRINDES GRAFICA EDITORA
LTDA comprou 2200 produtos do tipo ABRIDOR. WITH CUBE inclui todas as outras
subtotalizações possíveis no resultado.
238
Agrupando dados 9
Pontos principais
Atente para os tópicos a seguir. Eles devem ser estudados com muita atenção,
pois representam os pontos mais importantes do capítulo.
•• Utilizando a cláusula GROUP BY, é possível agrupar diversos registros com base
em uma ou mais colunas da tabela.
239
9 Agrupando
dados
Teste seus conhecimentos
SQL 2016 - Módulo I
☐☐ a) AVG
☐☐ b) COUNT
☐☐ c) MAX
☐☐ d) MIN
☐☐ e) STR
☐☐ a) ORDER BY
☐☐ b) HAVING
☐☐ c) GROUP BY
☐☐ d) O comando está correto.
☐☐ e) WHERE
☐☐ a) WHERE SALARIO>15000
☐☐ b) WHERE SALARIO>15000 GROUP BY SALARIO>15000
☐☐ c) GROUP BY SALARIO>15000
☐☐ d) GROUP BY DEPARTAMENTO HAVING SUM(SALARIO)>15000
☐☐ e) WHERE SUM(SALARIO)>15000
5. Com GROUP BY também podemos exibir totais. Para isso, qual comando
é o correto?
242
9 Agrupando
dados
Mãos à obra!
SQL 2016 - Módulo I
Laboratório 1
A – Realizando consultas e ordenando dados
11. Liste o total comprado por cada cliente em janeiro de 2014. Deve-se mostrar o
nome do cliente;
12. Liste o valor e a quantidade total vendida de cada produto em janeiro de 2014;
13. Liste os totais vendidos por cada vendedor em janeiro de 2014. Deve-se exibir
o nome do vendedor e mostrar apenas os vendedores que venderam mais de
R$80.000,00;
14. Liste o total comprado por cada cliente em janeiro de 2014. Deve-se mostrar o
nome do cliente e somente os clientes que compraram mais de R$6.000,00;
15. Liste o total vendido de cada produto em janeiro de 2014. Deve-se mostrar apenas
os produtos que venderam mais de R$16.000,00;
16. Liste o total comprado por cada cliente em janeiro de 2014. Deve-se mostrar o
nome do cliente e somente os 10 primeiros do ranking;
17. Liste o total vendido de cada produto em janeiro de 2014. Deve-se mostrar os 10
produtos que mais venderam;
244
10 Comandos
adicionais
•• LEN (expressão_string)
Veja um exemplo:
Veja um exemplo:
•• REVERSE (expressão_string)
Veja um exemplo:
246
Comandos adicionais 10
•• STR ( número [, tamanho [, decimal] ] )
Veja um exemplo:
Esta função retorna uma parte dos caracteres do parâmetro expressão a partir dos
valores de início e tamanho.
Veja um exemplo:
Veja um exemplo:
247
SQL 2016 - Módulo I
Esta função pesquisa uma string dentro de outra, retornando a posição encontrada.
Caso não encontre o valor pesquisado, o retorno será zero.
Veja um exemplo:
248
Comandos adicionais 10
•• Caracteres para formatação de data:
Veja um exemplo:
249
SQL 2016 - Módulo I
10.2. Função CASE
Os valores pertencentes a uma coluna podem ser testados por meio da cláusula CASE
em conjunto com o comando SELECT. Dessa maneira, é possível aplicar diversas
condições de validação em uma consulta.
10.3. UNION
A cláusula UNION combina resultados de duas ou mais queries em um conjunto de
resultados simples, incluindo todas as linhas de todas as queries combinadas. Ela
é utilizada quando é preciso recuperar todos os dados de duas tabelas, sem fazer
associação entre elas.
Para utilizar UNION, é necessário que o número e a ordem das colunas nas queries
sejam iguais, bem como os tipos de dados sejam compatíveis. Se os tipos de dados
forem diferentes em precisão, escala ou extensão, as regras para determinar o
resultado serão as mesmas das expressões de combinação.
250
Comandos adicionais 10
10.3.1. Utilizando UNION ALL
A UNION ALL é a cláusula responsável por unir informações obtidas a partir de
diversos comandos SELECT. Para obter esses dados, não há necessidade de que as
tabelas que os possuem estejam relacionadas.
•• O nome (alias) das colunas, quando realmente necessário, deve ser incluído no
primeiro SELECT;
•• Para que tenhamos dados ordenados, o último SELECT deve ter uma cláusula
ORDER BY adicionada em seu final;
•• Devemos utilizar a cláusula UNION sem ALL para a exibição única de dados
repetidos em mais de uma tabela.
251
SQL 2016 - Módulo I
10.4. EXCEPT e INTERSECT
Os resultados de duas instruções SELECT podem ser comparados por meio dos
operadores EXCEPT e INTERSECT, resultando, assim, em novos valores.
<instrução_select_1>
INTERSECT
<instrução_select_2>
<instrução_select_1>
EXCEPT
<instrução_select_2>
Também podemos utilizar EXCEPT e INTERSECT para comparar mais de duas queries.
Quando for assim, a conversão dos tipos de dados é feita pela comparação de duas
consultas ao mesmo tempo, de acordo com a ordem de avaliação que apresentamos.
USE PEDIDOS;
252
Comandos adicionais 10
•• Exemplo 1
•• Exemplo 2
•• Exemplo 3
O exemplo a seguir lista os cargos que não possuem um funcionário sequer cadastrado:
253
SQL 2016 - Módulo I
•• Exemplo 4
•• Exemplo 5
254
Comandos adicionais 10
Pontos principais
Atente para os tópicos a seguir. Eles devem ser estudados com muita atenção,
pois representam os pontos mais importantes do capítulo.
255
10 Comandos
adicionais
Teste seus conhecimentos
SQL 2016 - Módulo I
☐☐ a) LEN
☐☐ b) STR
☐☐ c) COUNT
☐☐ d) CHARINDEX
☐☐ e) REPLICATE
☐☐ a) ORDER BY
☐☐ b) END
☐☐ c) GROUP BY
☐☐ d) O comando está correto.
☐☐ e) WHERE
258
Comandos adicionais 10
☐☐ a) WHERE
☐☐ b) INTERSECT
☐☐ c) SELECT
☐☐ d) SELECT com subqueries.
☐☐ e) UNION
259
10 Comandos
adicionais
Mãos à obra!
SQL 2016 - Módulo I
Laboratório 1
A – Realizando consultas e ordenando dados
2. Apresente uma listagem com o nome, salário, data de admissão e o mês da data
de admissão do empregado;
262