Escolar Documentos
Profissional Documentos
Cultura Documentos
"^chnoEdition
r,.
3.3. Ordenando por n o m e ou posição 67
3.4. ORDER BY com TOP 70
3.5. ORDER BY c o m TOP WITH TIES 71
4. • Filtrando consultas 72
4.1. Consultando c o m operadores de comparação e comparadores de string 73
4.2. Consultando c o m operadores lógicos 75
4.3. Consultando u m intervalo de valores 77
4.4. Consultando c o m base em strings de caractere , 78
4.5. Consultando valores pertencentes ou não a uma lista de elementos 81
4.6. Lidando com valores nulos 82
4.7. Substituindo valores nulos 83
4.7.1. ISNULL 83
4.7.2. COALESCE 84
5. M a n i p u l a n d o campos do t i p o datetime 85
5.1. A l t e r a n d o a configuração de idioma a p a r t i r d o S S i y i S 91
TechnoEdition
2.1. Criando índices 132
2.2, Excluindo índices 133
Laboratórios 219
Introdução ao SQL Server 2008
19:12 <Mi>
• SQL Server 2 0 0 8 ;
• As linguagens SQL e Transact-SQL;
• O banco de dados relacional;
• Arquitetura cliente/servidor;
• Componentes;
• Ferramentas de gerenciamento;
• SQL Server Management Studio.
TechnoEdition
Introdução ao SQL Server 2008
TechnoEdition
Para essas tarefas, o SQL Server faz uso de uma linguagem específica para banco
de dados, chamada SQL (Structure Query Language) e, no caso do banco de dados
relacional, a Transact-SQL ou T-SQL, que contém, além da SQL, comandos de
linguagem procedural.
2
o modelo de dados relacional foi desenvolvido por Edgard F. Codd e serviu de base
para a maioria dos bancos de dados relacionais. A SQL é uma linguagem que se apoia
nesse modelo de dados relacional. Í ,
Esta linguagem foi desenvolvida pela IBM no início da década de 70 e posteriormente,
foi adotada como linguagem padrão pela ANSI (American National Standard Institute)
e pela ISO (International Organization for Standardization), em 1986 e 1987,
respectivamente.
A linguagem SQL é muito poderosa, mas só com ela não se pode construir uma
aplicação por completo, pois a SQL não possui comandos para a construção de
programas. Sendo assim, as empresas que produzem os gerenciadores de banco
de dados e que utilizam a linguagem padrão SQL precisaram desenvolver uma
outra linguagem que contivesse, além da SQL, comandos de uma linguagem de
programação. A Microsoft criou a linguagem Transact-SQL com esse objetivo. Ela
contém a linguagem SQL e os comandos de uma linguagem procedural. Usamos esta
linguagem para criar consultas de dados no SQL Server 2008.
Introdução ao SQL Server 2008
TechnoEditíon
Além da chave primária, uma tabela possui colunas utilizadas com a finalidade de
estabeleceriapáfa oi:ii^oi;i||t:a|:É^^ estrangeiras.
/
A arquitetura cliente/servidor resume a a ç ã o de um computador cliente se conectar a
um servidor que processa suas s o l i c i t a ç õ e s . Vejamos como funciona:
A principal diferença entre um banco de dados que faz uso dessa arquitetura para
um banco de dados locai consiste no processamento no servidor das r e q u i s i ç õ e s
de serviços feitas peto cliente. No banco de dados local, a s o l i c i t a ç ã o é processada
na e s t a ç ã o que fez o pedido, pois ele funciona apenas para armazenamento de
i n f o r m a ç õ e s . O banco de dados cliente/servidor apresenta a vantagem do tráfego
ser reduzido, uma vez.que s ã o retornados sonnentf os resultai^os pedidos a partir do
computador cliente.
5. Componentes
o SQL Server 2008 oferece diversos componentes opcionais e ferramentas
relacionadas a eles que auxiliam e facilitam na manipulação de seus sistemas. Por
padrão, nenhum dos componentes será instalado. Para instalá-los, devemos usar a
página Feature Selection, do SQL Server Installation Wizard, na qual escolhemos
quais deles serão incluídos no momento da instalação do SQL Server 2008. ;,
Para essas tarefas, este mecanismo conta com ferramentas como: Service
Broker, Replication, Notification Services e Full-Text Search que
descrevemos adiante:
• Service Broker
• Replication
Notification Services
Full-Text Search
Analysis Services
• Reporting Services
• Integration Services
mm
.j.-:£^Cte«:.-
p.-ccC-í Server SYSTEM tíT íiLf T . . . C- 0 0
R^poft ssrver SYStSrt MT AyT,.,
declare *pi n v 4 r c í i . a r ( e J i , ) s«í Pep9í"í server S¥ST£« fíT auT,,. 0 0
RPC:Cõmp'ffi declare nvsrcíiarC«43 set ^i-íí. Raport Server ttT A l í T , . . 0 0 0
Retiârí: ferver SYSTEM KT ALÍT
ET»meEnGere(13::
tjonnfiúxnsi l
.-7
5 Toial T Eriot
StcH>p«d 1 Juccess O W.afnri5)
StoppetJ
; Stópped
Stó>pt>ed
T«imgl.s!)
Já
TechnoEdition
Introdução ao SQL Server 2008
•• A • . - , 0 y y j y j LJ • ^
P 5£jJ^Jtfiti A
' rtâtVSâ 5*ifVK:e& PTOffettS' {
- 5mv«;e5 Projecí 1
Oats Sotjfíes
_ ^ ^ í í i f t g SíruetLí-es
J^, I n t e o r a t i o n S e r v i c e s P r o í w : !
CcfTTHSçÍKn
j Hans
i gers 1
Para abnr o SQL Server Management Studio, devemos seguir os passos adiante:
1. Clicar no botão Start (Iniciar).e selecionar aopção Programs (Programas);
2. Selecionar Microsoft SQL Server 2008 e, em seguida, SQL Server
Management Studio;
1
.I
; A.tcsijiCi
" rSQLServer2008
Introdução ao SQL Server 2008
TechnoEdition _
; Nas^Qíuery ^ ^ . _j ^ _
í^^aSCCíSQtSem» 10.0,1600 - S
'*• >iiá CJ3t3fe^5«?
JNS
7.2. Interface
• Object Explorer
Por padrão, esta ferramenta está visível no SQL Server fvlanagement Studio. Caso não
esteja visível, devemos clicar no menu V i e w e em Object Explorer. A figura a seguir
exibe a janela Object Explorer:
Object Explorer
Confiect •
GUIDE (SQL Server 10.0,1600 - GU!DE\AdmWstrator)
+ -_J Databases
+1 Security
V _ j Server Objects
2 Pepiicôtion
Para utilizar o Object Explorer é necessário estar conectado a um servidor. Para isso,
devemos proceder de acordo com os seguintes passos:
O Object Explorer usa uma estrutura semelhante a uma árvore para agrupar as
informações em pastas, através da qual podemos:
• Executar as tarefas mais comuns clicando com o botão direito diretamente sobre
as pastas ou sobre os objetos, ou ainda, clicando duas vezes sobre o objeto.
Quando uma pasta é expandida peia primeira vez, o Object Explorer consulta o
servidor com a finalidade de povoar a árvore. É possível executar outras funções
enquanto a árvore é povoada, ou mesmo interromper o processo, clicando em Stop.
Os conteúdos das pastas não são atualizados automaticamente. Para que a atualização
seja executada, devemos clicar com o botão direito sobre a pasta e em seguida, clicar
Refresh. É importante salientar que o número máximo de objetos exibidos é de
65.536 objetos. A partir desse número, os objetos não mais podem ser visualizados na
árvore. Entretanto, ao fecharmos os nós que não estão sendo utilizados ou aplicarmos
filtros para reduzir o número de objetos, poderemos passar a visualizar o todo. ,
• Code Editor
Uma aplicação de banco de dados complexa pode requerer múltiplas soluções, uma
vez que elas controlam a forma pela qual os projetos relacionados são agrupados. As
' soluções são geradas automaticamente pelo SQL Server Management Studio quando
criamos um novo projeto. Posteriormente, podemos adicionar outros projetos à
solução criada, conforme necessário.
Brasil
Compras
Empréstimos
Japão
Loja
master
Mercado
model
imsdb
i Pedidos
ReportSefver
• J tola :
, J master
_ J Mercado
J íirtodef
J msdb
J Pedidos
J ReportServer
J ReportServerTempDB
J tempdb
SQLQueryLsql-...(Strator (55))* [
CP.EÂ1Z í>k7ÁBã:St fORNECEIíÕREÍ
JLl'
CoimaindtsS c o m p l e t e d sucoessíuXiy.
• 1^oi
t possível o,cuftaT o tesacorna'
CO'
CTRL-
Save Ftíe As
3 ^
_^ Proiects Too[s '
J
My Projects
J
Mv Computer
SQLQuerylísqi
"3
Saveastj-pe; SQL FiSes (*,SQ1) Cancel
4. Clicar em Save.
• O banco de dados relacional possui uma estrutura composta por várias tabelas
inter-relacionadas. Uma tabela de banco de dados relacional possui atributos
(campos), que representam as colunas da tabela, e os registros (dados), que
representam as linhas;
• Criação de tabelas;
• Tipos de dados;
• Chave primária;
• Inserção de dados;
• Normalização de dados.
TechnoEdition
Criando um banco de dados
1 ntroduçao
o presente capítulo aborda inicialmente a criação de um banco de dados a partir de
alguns objetos do SQL Server. Em seguida, estudaremos o conceito de normalização
de dados, os tipos de dados do SQL Server, o conceito de chave pnmária e o campo
de autonumeração. Por fim, estudaremos a inserção de dados no banco criado e a
utilização de constantes.
2. CREÂTE DATABASE
Os objetos que fazem parte de um sistema são criados dentro de um objeto
denominado database, ou seja, uma estrutura lógica formada por dois tipos de
arquivo, um responsável pelo armazenamento de dados e outro que armazena
as transações feitas. . •")•,:••:.*•..
Para que um banco de dados seja criado no SQL Server 2008, é necessário
utilizar a instrução CREATE DATABASE, cuja sintaxe é a seguinte: „ ^
Assim que são criados, os bancos de dados encontram-se vazios, até que uma
tabela seja inserida. No entanto, antes de realizar essa inclusão, será necessário, na
existência de vários bancos de dados, informar ao SQL Server a respeito de qual banco
de dados utilizaremos. Para isso, utilizamos a sintaxe adiante:
llllll U S E <nome_banco_de_dados> :
Na parte superior esquerda do SQL Server Management Studio, há uma caixa drop-
down denominada Available Databases, que mostra o nome do banco de dados que
* está em uso no momento.
Para que uma tabela possa utilizar múltiplas partições, o mapeamento dos grupos
de linhas de dados deve ser feito em partições individuais, com base em uma
determinada coluna. Isso torna-se possível quando há o particionamento dos dados
de forma horizontal. Dessa forma, as partições podem fazer parte de vános grupos de
arquivos em um banco
de dados.
A instrução CREATE TABLE deve ser utilizada para criar tabelas dentro de
bancos de dados já existentes. A sintaxe simplificada para uso dessa instrução é a
seguinte:
CREATE TABLE''*<ffoáe3tábéla>'^
{ <nome_campol> <data_type> [IDENTITY [ ( < i n i c i o > , <incremento>) ]
[NOT NULL] [DEFAULT <exprDef>]
[, <nome_campo2> <data_type> [NOT NULL] [DEFAULT <exprDef>]
Em que:
Ao criarmos uma tabela, é importante destacar que ela não pode ter mais de 1 chave
pnmária, mas pode ter 1 chave primána composta por vános campos.
fCREATE T A B L E ALUNOS
NUM_ALUNO INT,
NOME CHAR(30) ,
t DATA_NASCIMENTO''•| DATETIME,
IDADE INT,
E_MAIL ^^'^M^ CHAR(50),
FONE_RES CHAR(14),
FONE_COM ;CHAR ( 1 4 ) ,
FAX rCHAR(14),
CELULAR ''•••••^^•/ir iiCHAR ( 1 4 ) ,
PROFISSÃO ..í:;::^^iiiií iCHAR ( 4 0 ) ,
EMPRESA CHAR(50)
/3-
4.
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. O SQL Server organiza os tipos de dados
dividindo-os em categorias.
4.1.1. N u m é nnc o s e x a t o s
A tabela a seguir descreve alguns dos tipos de dados que fazem parte dessa categoria:
• Integers
Nome Descrição
bigint Valor de número inteiro compreendido entre -2-^63 (-
(8 bytes) 9,223,372,036,854,775,808) e 2^63-1
(9,223,372,035,854,775,807)
int Valor de número inteiro compreendido entre -2^31 (-
(4 bytes) 2,147,483,648) e2'\31 - 1 (2,147,483,647)
smallint Valor de número inteiro compreendido entre -2^15 (-32,768)
(2 bytes) 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)
• Decimal e numeric
Nome Descrição
Decimal Valor numérico de precisão e escala fixas de -10^^38 +1 até
(<T>,<D>) 10^38-1.
Numeric Valor numérico de precisão e escala fixas de -10^^38 +1 até
(<T>,<D>) 10^^38-1.
Criando um banco de dados
TechnoEdition _
Money e smallmoney
Nome Descrição
money Compreende valores monetários ou de moeda corrente entre -
(8 bytes) 922,337,203,685,477.5808 e 922,337,203,585,477.5807.
smallmoney Compreende valores monetários ou de moeda corrente entre -
(4 bytes) 214,748.3548 e +214,748.3647.
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 -1.79E + 308 e -
2.23E - 308, 0 e de 2.23E + 308 até 1.79E + 308. 0 valor de n
determina a precisão do número. 0 valor padrão é 53. Para
float[(n)]
um valor n entre 1 e 24, a precisão é de 7 algarismos e 4 bytes
de memória são ocupados. Para um valor n entre 25 e 53, a
precisão é de 15 algarismos e 8 bytes são ocupados.
real Valor numérico de precisão flutuante entre -3.40E + 38 e -
(o mesmo que 1.18E - 38, 0 e d e 1.18E - 38 até 3.40E + 38.
float(24))
• ^uv-
4.13, a e hora
A tabela a seguir descreve alguns dos tipos de dados que fazem parte dessa categoria:
Nome Descrição
datetime Data e hora compreendidas entre 1° de Janeiro de 1753 e 31
(8 bytes) de Dezembro de 9999; com a exatídão de 3.33 milissegundos.
smalldatetime Data e hora compreendidas entre 1 ° de Janeiro de 1900 e 6 de
(4 bytes) Junho de 2079; com a exatidão de 1 minuto.
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 não-
char(<n>) Unicode. <n> representa a quantidade máxima de caracteres a
serem armazenados. Cada caractere ocupa 1 byte.
Comprimento variável de no máximo 8.000 caracteres não-
varchar(<n>) Unicode. <n> representa a quantidade máxima de caracteres a
serem armazenados. Cada caractere ocupa 1 byte.
Comprimento variável de no máximo 2^3^ - 1
(2,147,483,647) caracteres não-Unicode.
Lo "
0^5 MC", t\
A tabela a seguir descreve alguns dos tipos de dados que fazenn parte dessa categona:
Nome Descrição
nchar(<n>) C o m p r i m e n t o fixo de n o m á x i m o 4 . 0 0 0 caracteres U n i c o d e .
C o m p r i m e n t o variável de no m á x i m o 4 . 0 0 0 caracteres
r nvarchar(<n>)
Unicode.
C o m p r i m e n t o variável de n o m á x i m o 2^30 - 1
ntext
(1,073,741,823) caracteres U n i c o d e .
Nos tipos nchar e nvarchar, <n> representa a quantidade máxima de caracteres que
poderemos armazenar. Cada caractere ocupa 2 bytes, o que torna nchar e nvarchar
muito utilizados em países cujo idioma envolve uma grande quantidade de caracteres,
como Japão e China, por exemplo.
A tabela a seguir descreve alguns dos tipos de dados que fazem parte dessa categoria:
Nome Descrição
Dado binário c o m c o m p r i m e n t o fixo d e n o m á x i m o 8 . 0 0 0
binary(<n>) bytes. <n> representa a q u a n t i d a d e m á x i m a d e caracteres q u e
poderemos armazenar.
Dado binário c o m c o m p r i m e n t o variável, d e n o m á x i m o 8 . 0 0 0
varbinary(<n>) bytes. <n> representa a q u a n t i d a d e m á x i m a d e caracteres q u e
poderemos armazenar.
Dado binário c o m c o m p r i m e n t o variável d e n o m á x i m o Z^^BI -
image
1 ( 2 , 1 4 7 , 4 8 3 , 6 4 7 ) bytes.
5. e primaria
Para que um sistema de banco de dados sempre possa fornecer informações confiáveis
aos usuários, o administrador deve filtrar algumas ações realizadas sobre essas
informações a fim de evitar a ocorrência de possíveis erros relacionados às mesmas.
Além disso, esse sistema deve ser capaz de receber informações constantemente,
porém, sem que ocorram alterações a cada vez que uma nova informação for inserida.
O banco de dados deve possibilitar a inserção de uma grande quantidade de dados
sem que o mesmo precise ser alterado em sua estrutura.
,rieoodermos cm .^^^
É importante destacar que uma tabela pode ter somente uma coluna de identidade.
Além disso, o valor de uma coluna desse tipo é gerado automaticamente pelo SQL
Server; não podemos alterá-lo ou inseri-lo.
insennao aa
Para acrescentar novas linhas de dados em uma tabela, utilizamos o comando INSERT,
que possui a seguinte sintaxe:
Em que:
Vejamos a seguir como podemos utilizar o INSERT para acrescentar linhas em tabelas
de um banco de dados do SQL Server.
O resultado é o seguinte:
Podemos inserir vánas linhas em uma tabela com o uso de vários comandos
INSERTou um único. O exemplo a seguir utiliza um INSERT para acrescentar
linhas na tabela ALUNOS:
-- C o n s u l t a n d o os d a d o s da t a b e l a
SELECT * FROM lOÁJNOS íri^^MÊiImmãs^^
FONE_COM VARCHAR(14),
FAX VARCHAR(14),
CELULAR VARCHAR(14) ,
PROFISSÃO VARCHAR(40) ,
EMPRESA VARCHAR(50)
-- Consultancio os ciacios
SELECT * FROM ALUNOS
— Consultando os dados
SELECT * FROM ALUNOS
4
Criando um banco de dados
Constantes
As constantes, ou literais, são definidas como símbolos que representam valores de
dados específicos. O tipo de dado (datatype) desses valores determinarão o formato
das constantes.
Caso o conteúdo do texto possua o caractere apóstrofo, ele deve ser repetido,
como mostrado a seguir:
Exemplos:
• Constantes binárias
Exemplos:
• Constantes datetime
Exemplos:
• Constantes bit
Não incluídas entre aspas, as constantes bit são representadas por O ou 1. Uma
constante desse tipo será convertida em 1 caso um número maior do que 1 seja
utilizado.
Exemplos:
•o, 1 H|^
1Í^
,^^^^^^^^^^^
• Constantes float e real
Exemplos:
• 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;
obrigatoriamente devem ser números inteiros.
Exemplos:
152 8
817215 ,';;f||i||:.';;:::;;^
5
fc
.10
• Constantes decimal
São representadas por cadeias numéncas com ponto decimal e não incluídas
entre aspas.
Exemplos:
• Constantes uniqueidentifíer
É uma cadeia de caracteres que representa um GUID. Pode ser especificada
como uma cadeia de binários ou em um formato de caracteres.
Exemplos:
0xffl9966f868blld0b42d00c04fc964ff "IB'"'^^^^^^^^^^^^^
' 6F9619FF-8B86-DO11-B42D-00C04FC9&'i^F:f^gff;^ggÍ^^
• Constantes money
Não incluídas entre aspas, as constantes desse tipo compreendem cadeias
numéricas caracterizadas por um ponto decimal e um símbolo monetário (como
prefixo) opcionais. Uma constante money sempre reserva 4 posições para a
parte decimal; os algarismos além da quarta casa decimal serão desprezados.
Exemplos:
I154 3.56'
•$12892.6534
$56.275639 (armazenará apenas 56.2756)
*•
7.
o processo de organizar dados e eliminar informações redundantes de um banco de
dados é denominado normalização.
Esta envolve a tarefa de criar as tabelas, bem como definir relacionamentos. O
relacionamento entre as tabelas é criado de acordo com regras que visam a proteção
dos dados e a eliminação de dados repetidos. Essas regras são denominadas normal
forms, ou formas normais.
A normalização apresenta grandes vantagens:
• Elimina dados repetidos, o que torna o banco mais compacto;
• Garante o armazenamento dos dados de forma lógica;
• A velocidade dos processos de classificar e indexar é maior, já que as tabelas
possuem uma quantidade menor de colunas;
• Permite o agrupamento de índices conforme a quantidade de tabelas aumenta.
Além disso, reduz o número de índices por tabela. Dessa formia, permite melhor
^' performance de atualização do banco de dados. ^ -
Entretanto, o processo de normalização pode aumentar a quantidade de tabelas e,
consequentemente, a complexidade das associações exigidas entre elas para que os
dados desejados sejam obtidos. Isso pode acabar prejudicando a performance da
aplicação.
Outro aspecto negativo ao utilizarmos a normalização é que as tabelas, em vez de
dados reais, podem conter códigos. Nesse caso, será necessário recorrer à tabela de
pesquisa em busca dos valores necessários. A normalização, também, pode dificultar a
consulta ao modelo de dados.
A normalização inclui 3 regras: first normal form (primeira forma normal, ou 1NF),
second normal form (segunda forma normal, ou 2NF) e third normal form (terceira
forma normal, ou 3NF). ,
\icações.
Vejamos 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.
Também, devemos criar uma tabela separada para cada conjunto de dados
relacionados e identificar cada um deles com uma chave primária.
TechnoEdition
Criando um banco de dados
TechnaEdition _
• Uma pessoa tem apenas um nome, um RG e um CPF, mas pode ter estudado em
N escolas diferentes e ter feito N cursos extra-curriculares;
• Um treinamento da Impacta tem um único nome, tem uma única carga horária,
mas pode ter N instrutores que o ministrem;
Caso tenhamos uma linha de tabela com várias informações relacionadas a ela,
deveremos criar uma outra tabela para armazenar essas informações.
fROM •ALUNOS
•''•'•'SEÍElcf'"'"*
,L: SELECT;,,* FROM FONES
3 1 1191253976 CELIJU*
4 2 CElULi*
5 3 1152417262 COMEBCW.
6 3 1198271717 CELULMí
? S 1177162525 RESIOENDW.
Criando um banco de dados Capítulo
TechnoEdition _
Em outras palavras, a segunda forma normal nos pede que evitemos ter 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.
Vejamos o caso da tabela ALUNOS, a qual possui um campo chamado
PROFISSÃO (descritivo), onde podemos grafar a mesma profissão de várias
formas diferentes. Tomemos como exemplo a profissão de analista de sistemas.
Ela pode ser escrita de diversas maneiras;
• ANALISTA DE SISTEMAS;
• ANALISTA SISTEMAS;
• AN. SISTEMAS;
• AN. DE SISTEMAS;
• ANALISTA DE SIST
l I l C R E A T E TABLE EMPRESAS
Wr{ COD_EMPRESA I N T I D E N T I T Y PRIMARY KEY,
EMPRESA VARCHAR(5 0) )
i 3 ftKstàc I _ j MoíSSíjeí
COD.PRORSSiO jPflOffSSAO i
t i 1 : AfiAilSÍADtaSTEtttS
í 2 INSTRUTOR
3 ESTUDANTE
CDt»_EMH!ESA 1 EMPRESA }
) M i IMPAXTATECMDtOGiA
í SOMAíNfORMATlC*
3 3 WLÉSIO MONTE VBQEM
EMPRESAS •
eco
FONES '
•5 v_i
• 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;
L Introdução
Para trabalhar com dados armazenados em um servidor SQL, torna-se necessáno,
inicialmente, solicitá-los a partir de sua origem. Este processo de solicitação é
denominado consulta.
n
^ 2.
O comando SELECT, pertencente à categoria DML (Data Manipulation Language), é
utilizado para consultar todos os dados de uma fonte de dados ou apenas uma parte
específica deles.
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;
Em que:
-O USE <nome_banco_de_dados>
EXEC sp_attach_db
gdbname = 'PEDIDOS',
gfilenamel = ' c : \Dados\PEDIDOS_TABELAS .mdf ' ^tmmms:mÊmmmãá^^^
@filename2 = ' c : \Dados\PEDIDOS_INDICES . n d f '
@filename3 = ' c : \Dados \PEDIDOS_log. I d f '
Podemos verificar adiante as estruturas das tabelas deste banco de dados. Em C:\
DADOS encontramos os arquivos STRUCT_EMPREGADOS.BMP e STRUCT_PEDIDOS.
BMP que contêm estas imagens.
Para consultar todas as colunas de uma tabela, utiliza-se o caractere *, como mostrado
adiante;
USE <nome_banco_de_dados>
USE PEDIDOS;
SELECT * FROM EMPREGADOS
Para consultar colunas específicas de unna tabela, deve-se especificar o(s) nome(s) da(s)
coluna(s), como mostrado adiante:
USE PEDIDOS;
:SELECT CODFUN, NOME, ' SALÁRIO FROM EMPREGADOS"
USE PEDIDOS;
3.
Para consultarmos os dados existentes em tabelas de banco de dados,podemos utilizar
o comando SELECT. Porém, às vezes, é necessário que o resultado da consulta de
dados seja fornecido em uma ordem específica, de acordo com um determinado
critério. Para tal, contamos com opções e cláusulas. Uma delas é a cláusula ORDER
BY, que considera uma certa ordem para retornar dados de consulta.
Exemplo:
• USE PEDIDOS
SELECT * FROM EMPREGADOS ORDER BY NOME
SELECT * FROM EMPREGADOS ORDER BY NOME ASC
Í|||.: SELECT * FROM EMPREGADOS ORDER BY SALÁRIO
l l i i l SELECT * FROM EMPREGADOS ORDER BY DATA ADMISSÃO
Exemplo:
USE PEDIDOS
SELECT * FROM EMPREGADOS ORDER BY NOME DESC
SELECT * FROM EMPREGADOS ORDER BY SALÁRIO DESC
SELECT * FROM EMPREGADOS ORDER BY DATA ADMISSÃO DESC
Consultando dados Capítulo 3
TechnoEdition
USE PEDIDOS,
USE PEDIDOS
USE PEDIDOS
USE PEDIDOS
Se utilizarmos a cláusula ORDER BY com uma instrução SELECT que utiliza a cláusula
TOP, o resultado (linhas retornadas) é selecionado a partir do conjunto ordenado
de resultados.
Exemplos:
USE PEDIDOS
-- L i s t a os 5 empregados mais a n t i g o s
SELECT TOP 5 * FROM EMPREGADOS
ORDER BY DATA_ADMISSAO
Tl ES
Permitida apenas em instruções SELECT e quando uma cláusula ORDER BY
é especificada, a cláusula TOP WITH TIES determina que linhas adicionais
sejam retornadas a partir do conjunto de resultados base com o mesmo valor
apresentado nas colunas ORDER BY, sendo exibidas como as últimas das
linhas TOP (N) [PERCENT]
Vamos supor que estamos utilizando o SELECT para selecionar 5 funcionários a serem
dispensados e que o quinto funcionário dessa seleção ganha 5000. No entanto, além
dos cinco funcionários, desejamos saber se há mais funcionários com salário igual
a 5000:
SELECT TOP 5 WITH TIES * FROM EMPREGADOS
•ORDER BY SALÁRIO DESC
OTf..
4 trando consultas
Por meio da cláusula WHERE, podemos definir criténos com o objetivo de filtrar
o resultado de uma consulta. As condições definidas nessa cláusula podem ter
diferentes propósitos, tais como: comparação de dados na fonte de dados, verificação
de dados de determinadas colunas, teste de colunas nulas ou valores nulos, entre
outros.
USE <nome_banco_de_dados>
Em que:
• = (igual); . • -Í": „
• o ou != (desigual); • •
• > (maior que);
• < (menos que); ^;;;;;-
• > = (maior que ou igual);
• < = (menor que ou igual).
USE PEDIDOS
USE PEDIDOS
USE PEDIDOS
USE ¥EDlDQS.MMMÊxãÊ'^'^^^
SELECT * FROM Empregados
WHERE COD_DEPTO = 2 ••••^'•^'••'•'l•^;í^
ORDER BY COD_DEPTO
USE PEDIDOS
Com o objetivo de verificar se uma determinada string diz respeito a uma substring
de um valor, podemos utilizar alguns comparadores especiais disponíveis, conforme
apresentado adiante:
• O comparador = permite verificar se o valor da string é o mesmo da expressão;
• O comparador LIKE, com caracteres curingas, busca por um determinado
modelo em um dado valor de string: % substitui qualquer stnng de zero ou mais
caracteres; _ substitui qualquer caractere único;
• O comparador FREETEXT procura colunas para valores equiparados ao
significado e não apenas à palavra exata especificada no cntério de busca;
• Com a utilização do comparador CONTAINS, é possível procurar colunas que
possuem tipos de dados baseados em caractere, para, assim: equiparar a frase ou
palavra especificada, equiparar palavras contendo o mesmo prefixo, buscar por
palavras próximas de uma outra, plural ou singular de nomes, entre outros fins.
USE PEDIDOS""
É importante saber onde utilizar o AND e o OR. Vamos supor que nos foi pedido para
listar todos os funcionários do COD_DEPTO igual a 2 e também do COD_DEPTO
igual a 5:. Se fossemos escrever o comando exatamente como o que foi pedido,
digitaríamos o seguinte:
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 " o u "
(OR). Sendo assim, é importante ter ciência de que, na execução do SELECT, ele
avalia os dados linha por linha. E então, o correto seria o seguinte:
SELECT''*^'F EMPREGADOS
WHERE NOT (SALÁRIO >= 3 0 0 0 AND SALÁRIO <= 5 0 0 0 )
ORDER.. B Y SALÁRIO
Em vez de <, > e OR, podemos utilizar NOT BETWEEN - mais o operador AND -
para pesquisar os mesmo valores da consulta anterior:
Podemos utilizar esse operador para obter como resultado valores que se iniciam
por uma determinada palavra. Como desejamos especificar apenas a parte inicial do
texto a fim de obter o resultado, devemos utilizar o caractere % para representar que
quaisquer outros caracteres podem estar contidos no texto, desde que este se inicie
com a parte inicial do texto que foi especificada. Sendo assim, o % representa um
caractere coringa.
Na verdade, esse recurso de consulta pode buscar palavras que estejam contidas no
texto, seja no início, no meio ou no final dele.
SELECT "*'FROM'EMPREGADOS"
WHERE NOME LIKE '%MARIA%'
Um outro caractere connga que pode ser utilizado em consultas com LIKE é o
subscrito (_). Ele equivale a um único caractere qualquer.
O exemplo a seguir busca nomes iniciados por qualquer caractere e que o segundo
caractere seja a letra A:
S E L E C T * F R O M E m p r e g a d o s //N
^
!:';ÍJ^
I ^^^^^^^^^^^^^^
W H E R E NOME LIKE ' % Z _ '
'SELECT * F R O M E m p r e g a d o s „
WHERE NOME LIKE ' %LU •^ÍIiÍÍIÍ|.
Em vez de LIKE, podemos utilizar os operadores NOT LIKE, que atuam 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.
Os operadores N O T IN, por sua vez, ao contrário de IN, permitem obter como
• resultado o valor de uma coluna que não pertence a uma determinada lista de "
elementos. - -
' WHERE ESTADO I N ( ' AM' , ' PR' , ' R J ' , ' SP ' ) '^IIB
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.7.1. ISNULL
Esta função permite definir um valor alternativo que será retornado caso o valor de
argumento seja nulo.
• Exemplo 1
SELECT
CODFUN, NOME, ISNULL(COD_DEPTO,-1) AS DEPTO,
"W§fLSNULL(SALAR 1 0 , - 1 ) AS RENDA;;|i^:a^^^^^^^^^^^^
IFROM Empregados
• Exemplo 2
SELECT
CODFUN, N0ME,::|||||j|||||^
i ISNULL(DATA_NASGISENTO,'1900.1.1')"AS'DATA_NASC
IFROM Empregados .
4 72 COAL C
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 CLIENTES.
Caso esse campo seja NÚLL, o campo ESTADO tentará ser exibido. Caso este último
também seja NULL, será retornado NC.
SELECT
C O D C L I , NOME,, C O A L E S C E ( E S T _ C O B , E S T A D O , ' N C ) AS EST_COBRANCA
FROM C L I E N T E S :iÍÍÍl|fl|i|Í;]|ÍÍ
ORDER BY 3
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). Aceita valores entre 1° de janeiro de
1753 até 31 de dezembro de 9999.
Vejamos algumas funções utilizadas para retornar dados desse tipo.
• SET DATEFORMAT
É utilizada para determinar a ordem das porções (dia, mês e ano) de um valor
datetime.
SET DATEFORMAT (ordem)
A ordem das porções de data é definida por ordem, que pode ser um dos
valores da tabela adiante:
Valor Ordem
mdy Mês, dia e
ano
dmy Dia, mês e
ano
Ano, mês e
ymd dia
ydm Ano, dia e
mês
myd Mês, ano e
dia
dym Dia, ano e
mês
• GETDATEQ
Para, sabermos qual será a data daqui a 45 dias, utilizamos o seguinte código:
• DAYO
Esta função retorna um valor inteiro que representa o dia da data especificada
como argumento data na sintaxe adiante:
O argumento data pode ser uma expressão, literal de stnng, variável definida
pelo usuário ou expressão de coluna.
Exemplo:
• MONTHO
Esta função retorna um valor inteiro que representa o mês da data especificada
como argumento data da sintaxe adiante:
t; MONTH{data)
O argumento data pode ser uma expressão, literal de string, variável definida
pelo usuário ou expressão de coluna.
Exemplo:
YEARO
Esta função retorna um valor inteiro que representa o ano da data especificada
como argumento data na sintaxe adiante: — f -
YEAR(data)
O argumento data pode ser uma expressão, literal de string, variável definida
pelo usuário ou expressão de coluna.
DATE PARTO
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:
DATEPART ( p a r t e , data)
O argumento data pode ser uma expressão, literal de string, vanável definida
pelo usuáno ou expressão de coluna, enquanto parte pode ser um dos valores
descritos na próxima tabela:
VALOR PARTE RETORNADA ABREVIAÇÃO
year Ano yy. yyyy
quarter Trimestre (1/4 de ano) qq, q
month IVlês mm, m
dayofyear Dia do ano dy, y
day Dia dd, d
week Semana wk, w w
weekday Dia da semana dw
hour Hora hh
minute Minuto mi, n
second Segundo ss, s
millisecond Milissegundo ms
microsecond Microssegundo mes
nanosecond Nanossegundo ns
TZoffset Diferença de fuso-horário tz
• DATENAMEO
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.
— Funcionários a d m i t i d o s em uma s e x t a - f e i r a
SELECT
CODFUN, NOME, DATA_ADMISSAO,
DATENAME(WEEKDAY,DATA_ADMISSAO) AS DIA_SEMANA,
DATENAME (MONTH, DATA_ADiyiISSAO) AS MES
FROM EMPREGADOS
WHERE DATEPART(WEEKDAY, DATA ADMISSÃO) = 6
servidor SQt.
f M
DATEADDO
• DATEDIFFQ
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: ... . , ,
SET §CONT_DES - 1 ;
W H I L E l?COKT_DES - 6
BEGIH
-- I n s e r e a d e z e n a s o r t e a d a e m T B L H S G A S E N A
INSERT TEL_MEGASENA l'JUM_CARTAO, NUM_DE3ENA)
VPdJJES • 8 N U M CARTÃO, '§DEZENA }
True
1
183J
PecáuaítCiTt
_ j f+iWc*»»-! Services
Oi*rh
R efneíe Logr. T rr^oU
Re»»
TechnoEdition
Consultando dados
, J SSWCWIV j j A lá . ^ '
GO
n,^F. TE5TE__ER0CS
GO
AS BEGIN
DECLARE êQ I K T ;
SET @Q - m-í ' m;
mim r$Q:
Staíus
r
r •
r
Ssfvet;
P3_INSTRUT0R EngSsh d
Endssh
Estontdn
H
PAULISTA38Vtdminís(iatot
Fínrash
Frersch
Getrnan
Qf8«k
Hungâtian
Italiart
OK
TechnoEdition
AT
TechnoEdmon _
Consultando dados
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 GETDATEO, DAYQ, MONTHO
e YEARO
mà
19:12 <W1>
19:12
22:5S mm
^ Elí>
19í2i
?l:17
• Alteração e exclusão;
• UPDATE;
• DELETE;
• Transações.
TechnoEdition
Atualizando e excluindo dados
TechnoEdition
]. 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.
É 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.
TechnoEdition
Atualizando e excluindo dados
2.
Os dados pertencentes a múltiplas linhas de uma tabela podem ser alterados por meio
do comando UPDATE.
UPDATE t a b e l a
:SET nome_coluna = expressã o [, nome_coluna = expressão,...]
[FROM t a b e l a i JOIN t a b e l a 2 ON e x p r e s s a o J o i n [JOIN tabelaS
ON e x p r e s s a o J o i n , . . . ]
[WHERE condição]
Em que:
V
-ao\tu\ a o " ' " " ,.o\tu\ pos^
.... .,mcaP^^^^°^..^ao
caP^^ - t m v i n ^ ^ ' * ^ ^ comando
de
com
UPDATE EMPREGADOS
SET NUM_DEPEND += 2
n WHERE CODFUN = 5;
-- A l t e r a n d o os dados do c l i e n t e de código 5
UPDATE CLIENTES
SET ENDERECO - 'AV. PAULISTA, 1009 - 10 AND', ^'^M^^^^^^^^^^
BAIRRO = 'CERQUEIRA CESAR',
CIDADE = 'SÃO PAULO'
WHERE CODCLI = 5;
— A l i n h a a s e g u i r c o n f e r e o r e s u l t a d o da alteração
,SELECT * FROM CLIENTES WHERE CODCLI = 5
n
TechnoEdition
Atualizando e excluindo dados
— A l t e r a n d o os dados do grupo de p r o d u t o s
UPDATE PRODUTOS SET QTD_ESTIMADA = QTD_REAL,
CLAS_FISC = '96082000',,,,^.^
IPI = 8
WHERE COD_T IPO == 5;
— A l i n h a a s e g u i r c o n f e r e o r e s u l t a d d da' alteração
SELECT * FROM PRODUTOS
WHERE COD TIPO = 5
Atualizando e excluindo dados Capít
TechnoEdítion
O comando DELETE deve ser utilizado quando desejamos excluir os dados de uma
tabela. Sua sintaxe é a seguinte:
Em que;
• 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 cnada, são restabelecidos, caso haja
uma coluna de identidade. ^ *IMí
A linha a seguir venfica se os empregados que ganham mais do que 50000 realmente
foram excluídos:
-• 'íj"-' r*o
• BEGIN TRANSACTION
Este comando é responsável por determinar, para uma conexão, o início de uma
transação explícita.
Estes comandos são responsáveis por encerrar a transação com êxito nas
situações em que não ocorrem erros. Após esse encerramento, os recursos
utilizados pela transação são liberados e as alterações feitas sobre os dados
passam a ser permanentes no banco de dados.
Estes comandos são responsáveis por excluir uma transação nas situações em
que ocorrem erros. Após essa exclusão, os recursos utilizados pela transação
são liberados e as alterações feitas sobre os dados são desfeitas, visto que a
transação volta ao estado em que se encontrava quando foi iniciada.
4 J , Transações explícitas
As transações explícitas são aquelas em que temos seu início e seu término ^ •
determinados de forma explícita. Para definir este tipo de transação, os scripts
Transact-SQL utilizam os seguintes comandos;
• BEGIN TRANSACTION
Este comando é responsável por determinar, para uma conexão, o início de uma
transação explícita.
Estes comandos são responsáveis por encerrar a transação com êxito nas
situações em que não ocorrem erros. Após esse encerramento, os recursos
utilizados pela transação são liberados e as alterações feitas sobre os dados
passam a ser permanentes no banco de dados.
Estes comandos são responsáveis por excluir uma transação nas situações em
que ocorrem erros. Após essa exclusão, os recursos utilizados pela transação
são liberados e as alterações feitas sobre os dados são desfeitas, visto que a
transação volta ao estado em que se encontrava quando foi iniciada.
-- E x e c u t a r a a l t e r a ç ã o n o v a m e n t e •..'MÍ^Í
:-- A b r i r p r o c e s s o de t r a n s a ç ã o
BEGIN TRANSACTION;
— A l t e r a r os s a l á r i o s d a ••6õD_CÂRG0 = -
UPDATE Empregados SET S A L Á R I O = 550
WHERE C0D_CARG0 = 5 — A g o r a e s t á OK
— C o n f e r i r os r e s u l t a d o s
iSELECT CODFUN, NOME, C0D_CARG0, S A L Á R I O -
FROM EMPREGADOS
Atualizando e excluindo dados
TechnoEdition _
íORDER BY CÕD_CARGO;
-- Agora todos os funcionários do cargo 5 estão com
-- SALÁRIO R$ 550,O
-- A alteração f o i f e i t a c o r r e t a m e n t e .
-- Por fim, f i n a l i z a r a transação confirmando as
- -alterações
h •''COMMIT TRANSACTION
n
n
n
r-
• Os dados pertencentes a nnúltiplas linhas de uma tabela podem ser alterados por
meio do comando UPDATE;
ici:oi*iy of C:SOocuiiefitt
yZmS 19:12 <|I|>
ir-il ílill
11545
23 "41
• Constraints;
• índices.
TechnoEdition
Constraints e índices Aí
TechnoEdition
1. Constraints
As constraints são objetos utilizados conn a finalidade de definir regras referentes à
integridade e à consistência nas colunas das tabelas que fazem parte de um sistema
de banco de dados.
1 J , Tipos de constraints
Para assegurar a integridade dos dados de uma tabela, o SQL Server oferece
cinco tipos diferentes de constraints, os quais estão relacionados a cinco tipos de
integridade. Na tabela a seguir, veremos quais são esses tipos de constraints e seus
respectivos tipos de integridade:
Como citado no capítulo sobre cnação de banco de dados, as tabelas possuem uma
coluna contendo valores capazes de identificar uma linha de forma exclusiva. Essa
coluna recebe o nome de chave pnmária, cuja finalidade é assegurar a integridade dos
dados da tabela.
UNIQUE - : . V
Além das constraints PRIMARY KEY, também podemos utilizar constraints UNIQUE,
as quais asseguram que dados duplicados não sejam inseridos em colunas que não
fazem parte das chaves primárias. A UNIQUE é uma constraint que também é capaz
de assegurar a exclusividade dos dados. Em uma tabela, várias colunas podem ser
definidas com constraints UNIQUE.
As colunas nas quais são definidas constraints UNIQUE permitem a inclusão de valores
nulos, desde que seja apenas um por coluna.
Similares às constraints FOREIGN KEY no que diz respeito ao controle dos valores
insendos em uma coluna, a constraint CHECK limita os valores que uma coluna é
capaz de aceitar, o que reforça a integridade do domínio.
Podemos criar uma constraint CHECK para que uma coluna aceite somente uma faixa
de valores.
Outra maneira de utilizar CHECK é criá-la com qualquer expressão lógica (booleana)
que retorne TRUE ou FALSE de acordo com operadores lógicos.
Também, podemos criar mais de uma C H E C K em uma mesma coluna. Nesse caso, a
ordem de criação dessas constraints determina a ordem em que elas são avaliadas.
1.1.4. DEFÂULT
No entanto, nem sempre queremos uma coluna que aceite um valor nulo. Então, para
situações como a deschta anteriormente, podemos atnbuir uma definição DEFAULT
às colunas desejadas, p
Para instruir implicitamente o SQL Server a carregar um valor padrão em uma coluna
quando ela não tiver u m valor especificado, basta carregar uma linha da tabela com
tal coluna definida como DEFAULT.
Para instruir explicitamente o SQL Server a inserir um valor padrão em uma coluna,
basta usar a cláusula DEFAULT V A L U E S de uma instrução INSERT.
É imprescindível que uma coluna que não possui um valor aceite valores nulos, o u
possua uma definição DEFAULT, o u tenha u m valor especificado explicitamente. Caso
contrário, o SQL Server retornará u m erro, advertindo sobre a impossibilidade de a
coluna aceitar valores nulos. • • ^ -
Para criarmos uma chave estrangeira, é preciso que a coluna da primeira tabela, na
qual se encontra a chave primária, seja referenciada pela coluna que se encontra
na segunda tabela. Dessa f o r m a , a coluna da segunda tabela torna-se a chave
estrangeira.
Vale destacar, no entanto, que não é necessário que uma constraint FOREIGN K E Y em
uma tabela esteja vinculada apenas a uma constraint PRIMARY K E Y em outra tabela.
Além disso, embora a FOREIGN K E Y possa conter valores nulos, é possível que, nesta
situação, a verificação dos valores que f o r m a m esta constraint não ocorra.
Podemos assegurar que a verificação dos valores de FOREIGN K E Y ocorra por meio da
especificação do valor NOT NULL em todas as colunas que fazem parte deste tipo de
constraint.
Além dos valores padrão, t a m b é m é possível atribuir valores nulos a uma coluna, o
j- que significa que ela não terá valor. Assim, de acordo com as regras de integridade e
consistência dos dados, é preciso athbuir a nulabilidade das colunas de uma tabela a
f i m de determinar se elas aceitarão valores nulos (NULL) ou não (NOT NULL).
Quando athbuímos u m valor nulo para uma coluna, esta pode ocupar espaço no
banco de dados, mas isso depende de seu tipo de dados.
1 OfcD
Relacionamento Um-para-muitos
Já na tabela que representa o relacionamento para muitos (N), deverá haver uma
coluna referente à primeira tabela, a qual deve utilizar a chave estrangeira para
que, dessa forma, seja estabelecido o relacionamento entre ambas as tabelas.
Relacionamento Muitos-para-muitos
É importante destacar que pode não haver associação de fatos nas situações em
que os relacionamentos são de caráter condicional. Neste caso, a cardinalidade
deve ser determinada por meio de uma ampla análise quanto à possibilidade de
ocorrerem relacionamentos.
Para estabelecer este tipo de relacionamento, devemos ter três tabelas, sendo
que a terceira é responsável por relacionar as outras duas. Para isso, é preciso
que essas duas pnmeiras tabelas tenham uma coluna que seja chave primária.
As colunas que são chaves primárias na primeira e na segunda tabela devem
ser colunas com chave estrangeira na terceira. Com isso, esta tabela terá duas
chaves estrangeiras, as quais formam uma chave primária composta.
Constraints e índices
TechnoEdition
Constralnt Descrição
Uma coluna que é definida como chave primária não pode
PRIMARY KEY
aceitar valores nulos. Em cada tabela, pode haver somente
(Chave P r i m á r i a )
uma constralnt de chave primária.
Várias colunas podem ser definidas como chave
estrangeira. No entanto, para que uma coluna seja definida
FOREIGN KEY
dessa forma, é preciso que ela já tenha sido definida como
(Chave
chave primária em outra tabela. As colunas definidas como
Estrangeira)
chave estrangeira podem aceitar valores nulos, e os
datatypes das colunas relacionadas devem ser iguais.
UNIQUE (Chave Várias colunas de uma tabela podem ser definidas como
Única) chave única e, ainda, aceitar valores nulos.
Diversas colunas de uma tabela podem ser definidas como
CHECK CHECK. Essas colunas podem aceitar valores nulos, mas
Isso depende das regras que são determinadas para elas.
Várias colunas de uma tabela podem ser definidas como
DEFAULT
DEFAULT. Essas colunas podem aceitar valores nulos.
A seguir, veremos como criar constraints com uso de CREATE TABLE e ALTER TABLE,
bem como graficamente a partir da interface do SQL Server Management Studio:
Constraints e índices
.,USE TESTE_CONSTRAINT;
CONSTRAINT CK__PR0DUT0S_PREC0S
CHECK( PREC0_VENDA >= PREC0_CUST0 ) ,
COnSTKAim CK_PR0DUT0S_DATA_CAD
CHECK( DATA_CADASTRO <= GETDATEO ) ,
CONSTRAINT CK_PRODUTOS_SN_ATIVO
CHECK( SN_ATIVO I N ('N','S') ) ,
— CONVENÇÃO DE NOME: FK_TABELADETALHE_TABELAMESTRE
CONSTRAINT FK_PRODUTOS_TIPO_PRODUTO
FOREIGN KEY (COD TIPO):|Íí;3ÍÍI|iiB^^^^^^^^^
REFERENCES TIPO PRODUTO (GOD TIPO)
IIIIIIICÔNSTM^^^
BII^
III^
I^^^^^^^^ TABELAMESTRE ( CAKPOPK TABELAME.STRE )
Constraints e índices
TechnoEdition „
INSERT PRODUTOS
(DESCRIÇÃO, C0D_TIP0, PREC0_CUST0, PRECO_VENDA,
QTD_REAL, QTD_MINIMA)
VALUES ('TESTANDO INCLUSÃO', 1 , 10, 12, 10, 5 )
•USE TESTE_CONST'RAINT;
— C R I A Ç Ã O DA TABELA T I P 0 _ P R 0 D U T 0
.CREATE TABLE T I P 0 _ P R 0 D U T 0
; ( coD_TiPo mm>Mk:r: I N T I D E N T I T Y NOT NULL, • ,ili'íili^^^^^^^^^
TIPO V A R C H A R ( 3 0 ) NOT NULL ) :3ÍIH^^^^^
• — CRIANDO AS CONSTRAINTS COM ALTER TABLE
:ALTER TABLE TIPO__PRODUTO ADD
Hiv CONSTRAINT PK_TIPO_PRODUTO PRIMARY KEY (COD_TIPO)
CONSTRAINT CK_PRODUTOS_PRECOS
CHECK ( PRECO_VENDA > = PRECO_CUSTO ) , ''i
CONSTRAINT CK_PR0DUT0S_DATA_CAD
CHECK{ DATA_CADASTR0 < = G E T D A T E ( ) ) ,
! CONSTRAINT CK_PR0DUT0S_SN_ATIV0
j|PÍ||||:^;|iPl CHECK ( SN_ATIV0 I N ('N', 'S') ) , '••§Sèil§%^
"CONSTRAINT FK_PR0DUT0S_TIP0_PR0DUT0
FOREIGN KEY (C0D_TIP0)
^^•'w REFERENCES T I P 0 _ P R 0 D U T 0 { C 0 D _ T I PO) ,
CONSTRAINT DF_SN_ATIV0 DEFAULT ('S') FOR SN_ATIV0,
n CONSTRAINT DF_DATA_CADASTRO DEFAULT (GETDATE())
•^^mmsMéããêU^ FOR DATA CADASTRO;
:3, :s Graficamente
D e p o i s , r e a l i z a r e m o s os s e g u i n t e s passos:
1. N o O b j e c t Explorer, selecionar o b a n c o de d a d o s T E S T E _ C O N S T R A I N T e a b r i r
os s u b i t e n s d o b a n c o ;
3. C l i c a r c o m o botão d i r e i t o d o m o u s e e m D a t a b a s e D i a g r a m s ( D i a g r a m a s
d e B a n c o d e D a d o s ) e selecionar a o p ç ã o N e w D a t a b a s e D i a g r a m ( N o v o
D i a g r a m a de B a n c o de Dados):
4. Uma janela com os nomes das tabelas existentes no banco de dados será
exibida, v ^ . . ;
Selecíonar as 2 tabelas e clicar em Add (Adicionar) e, depois, em Close
(Fechar);
... . I ....
B (Geraf)
O.ATA_CAD*S: •
1 ^ : ' i : e E <v.,,.
£1 Destsner de Banco de i
B lde»aáa<l«
I" Ssc-y 1
Constraints e índices Capítul
TechnoEiíltion „
12. Para definir os valores default (padrão)de cada campo, clicar com o botão
direito do mouse na tabela P R O D U T O S , selecionar Table View... (Exibição
da Tabela...) e depois Modify C u s t o m V i e w (Modificar Personalização);
TlPO_PRODUTO *
9 r>_w.OÃ''0
Seirç.k) de ( oluna
,.cor-ac-ào C€SCfi;:CAO
loeníscase ='3.EC0_vE%DA
'S'
V * ' corro
PRODUTOS * TIPO„PRODUTO *
COS
C0D_?1?0
cs;
1
2.
Informações específicas de uma tabela ou de uma view podem ser localizadas de
maneira mais rápida com a utilização de índices.
Um índice (index) é uma coleção de páginas associadas com uma tabela ou view, a
fim de acelerar o retorno de suas linhas. O índice contém chaves feitas de uma ou
mais colunas da tabela ou view e indicadores que mapeiam o local de armazenamento
do dado especificado.
Em que:
• Para assegurar a integridade dos dados de uma tabela, o SQL Server oferece
cinco tipos diferentes de constraints: PRIMARY KEY, FOREIGN KEY, UNIQUE,
CHECKe DEFAULT;
• 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;
• Cada uma das constraints possui regras de utilização. Uma coluna que é definida
como chave phmária, por exemplo, não pode aceitar valores nulos. Em cada
tabela, pode haver somente uma constraint de chave primária;
TechnoEdition
Associando tabelas
1/2086 19:12
^^2ím 19 l i 5!|>
•mt»^
22:11 <iE
/2ÍWI6 11
• Importância da associação;
• JOIN.
TechnoEdition
V Associando tabelas
ntrodução
A associação de tabelas pode ser realizada para diversas finalidades, como, por
exemplo, converter em informação os dados encontrados em duas ou mais tabelas.
Essa associação pode ser realizada por meio das cláusulas WHERE e JOIN, As tabelas
podem ser combinadas através de uma condição ou um grupo de condições de
junção. Por exemplo, podemos utilizar as chaves estrangeiras como cone :ão para
relacionar as tabelas,
É importante ressaltar que as tabelas devem ser associadas em pares, embora seja
possível utilizar um único comando para combinar várias tabelas. Um procedimento
muito comum é a associação da chave primária da pnmeira tabela com a chave
estrangeira da segunda tabela.
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.
As tabelas podem, ainda, ser associadas de modo que sejam gerados não apenas
dados relacionados entre elas, mas também dados não-relacionados da tabela
encontrada à esquerda ou à direita da cláusula JOIN. A associação de tabelas também
pode ser feita por meio das cláusulas JOIN e WHERE para a obtenção do produto
cartesiano, ou seja, um conjunto de resultados com todas as linhas que são geradas a
partir dessa associação.
Neste capítulo, aprenderemos a utilizar as cláusulas INNER JOIN, LEFT JOIN, RIGHT
JOIN, FULL JOIN e CROSS JOIN para promover a associação de tabelas.
*•'
1. Introdução
A associação de tabelas pode ser realizada para diversas finalidades, como, por
exemplo, converter em informação os dados encontrados em duas ou mais tabelas.
Essa associação pode ser realizada por meio das cláusulas WHERE e JOIN, As tabelas
podem ser combinadas através de uma condição ou um grupo de condições de
junção. Por exemplo, podemos utilizar as chaves estrangeiras como conexão para
relacionar as tabelas,
É importante ressaltar que as tabelas devem ser associadas em pares, embora seja
possível utilizar um único comando para combinar várias tabelas. Um procedimento
muito comum é a associação da chave primária da pnmeira tabela com a chave
estrangeira da segunda tabela.
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.
As tabelas podem, ainda, ser associadas de modo que sejam gerados não apenas
dados relacionados entre elas, mas também dados não-relacionados da tabela
encontrada à esquerda ou à direita da cláusula JOIN. A associação de tabelas também
pode ser feita por meio das cláusulas JOIN e WHERE para a obtenção do produto
cartesiano, ou seja, um conjunto de resultados com todas as linhas que são geradas a
partir dessa associação.
Neste capítulo, aprenderemos a utilizar as cláusulas INNER JOIN, LEFT JOIN, RIGHT
JOIN, FULL JOIN e CROSS JOIN para promover a associação de tabelas.
Associando tabelas Capítulo
2.
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 a outra tabela.
Através da cláusula JOIN, podemos especificar quais colunas das tabelas serão
associadas. Para isso, é preciso definir uma chave estrangeira de uma tabela e a chave
relacionada em outra tabela. Os valores pertencentes às colunas das tabelas associadas
podem ser comparados entre si por meio de um operador lógico definido pela cláusula
JOIN, como o Sinal de igual (=).
As tabelas que serão combinadas devem ser indicadas pela cláusula F R O M . A seieção
de linhas de dados dessas tabelas, por sua vez, será controlada por meio de uma ação
conjunta entre as condições de associação e de busca, como HAVING e W H E R E , Além
de ser a forma mais indicada para a especificação de associações, a cláusula FROM
permite que as condições JOIN sejam identificadas em relação às condições de busca
referenciadas na cláusula W H E R E .
• < t i p o J o i n > : Permite identificar uma das seguintes associações: outer join, inner
join e cross join;
condição: Define um critério para avaliação de duas linhas de dados que já estão
associadas.
Capítulo Associando tabelas
TechnoEdition
ipos de JOIN
Algumas vezes, uma inner join pode retornar todas as colunas em ambas tabelas e
retornar somente as linhas para as quais há um valor igual na coluna de associação.
E M P R E G A D O S T A B E L A D E P
n 11 i DiSETOR.-
S 3 7 TSLS^iSKE-r
ipos de JOIN
A seguir, veremos os tipos existentes de JOIN.
Algumas vezes, uma inner join pode retornar todas as colunas em ambas tabelas e
retornar somente as linhas para as quais há um valor igual na coluna de associação.
EMPREGADOS TABELADEP
CODfU?. Wh-E
1 -ÍSSO-^
;0'.T=:<.E DE £
w. —
CO;_CAS;GC>
GOt-
TabefaCar
SALÁRIO
.-RE'»". -SA.
C'E-5
FOTO
SELECT
EMPREGADOS.CODFUN, EMPREGADOS.NOME,
EMPREGADOS .COD_DEPTO, EMPREGADOS . COD_CARGO, • •1Í:ÍÍÍ1Í|Í
,1T ABE LADE P . DE PT O
FROM EMPREGADOS
JOIN TABELADEP ON EMPREGADOS . COD_DEPTO = ^I^.ÍHÍI"^''''
T ABE LADE P.COD_DEPT,0
Podemos simplificar a escrita dos nomes das tabelas do código anterior com a
utilização de alias, como mostrado adiante:
SELECT
E . CODFUN, E . NOME, E . COD_DEPTO, E . COD_CARGO, D . DEPTO, :
FROM EMPREGADOS E B
IÍII^^^^^^^^^
•
JOIN TABELADEP D ON E.COD_DEPTO = D.COD_DEPTO J:\\ÊÍS^
SELECT • llílilB^^^^^^
E . CODFUN, 'E ;N0MÍ, " E'. C0DIG0_DEPT0, E . C0D_CARG0, DVDÈPTO ''•^:|||||
FROM EMPREGADS E
J O I N TABELADEP D ON E.COD_DEPTO = D.COD_DEPTO • :Íi|tM^^^^^^
TechnoEdition
TechnoEdition
Associando tabelas
n A seguir, temos outro exemplo de join:
r -- EMPREGADOS e TABELACAR (cargos)
OU ''''iiiilí^
SELECT E . CODFUN, E . NOME, C . CARGO^^ÍÍ^^Í|K|P^^i:'^i:^
FROM T A B E L A C A R C JOIN EMPREGADOS E ON E . C O D _ C A R G O =
C . C0D_CARG0;,iyiip^^^^^^^^^^^^^^^
ou •m^:ÍeM:..
SELECT
E . CODFUN, E . N O M E , ^ E ,:C0D__DEPTO, E . C0D_CARG0, D. D E P T O , , J
C . CARGO lilW^^^^^^^
ÍFROM TABELADEP 1
'''||B^^^^^^^^^^^^
D
JOIN EMPREGADOS È ' O N ^ Ê'. C 0 D _ D Í P T Ò ' - D •'C0D;2Í^EPI&
JOIN TABELACAR C ON E . C O D _ C A R G O = C.COD_CARGO;:
OU
SELECT ^p
^
ÍI,;:'^^^^^^^^^^^^^
E.CODFUN, E.NOME, E.COD_DEPTO, E.COD_CARGO, D.DEPTO,
::C. CARGO
il:FROM T A B E L A C A R C
JOIN EMPREGADOS E ON E . C O D _ C A R G O = C.COD_CARGO
f JOIN TABELADEP D ON E . C O D DEPTO == D . C O D DEPTO;
Na consulta a seguir, temos dois erros. O primeiro é que não há join entre TABELADEP
e TABELACAR, como é mostrado no diagrama de tabelas do SSMS. O segundo é que
não podemos fazer referência a uma tabela, no caso E.COD_CARGO, antes de abri-la.
^i;SELECT:>ÍÍB^^^^^^^^^^^^^^^^
E.CODFUN, E.NOME, E.C0D_DEPT0, E.C0D_CARG0, D.DEPTO, C.CARGO
vFROM T A B E L A C A R C
JOIN TABELADEP D ON E . C O D _ D E P T O = D.COD_DEPTO - - « (1) •||ÍIH^^^^^^^
JOIN EMPREGADOS E ON E . C O D CARGO = C.COD CARGO;
A seguir, temos mais um exemplo da utilização de JOIN, desta vez com seis tabelas:
J o i n com 5 t a b e l a s . V a i e x i b i r :
ITENSPEDIDO.NUM_PEDIDO
I TENS PE DIDO.NUM_ITEM
ITENSPEDIDO.COD_PRODUTO
PRODUTOS.DESCRIÇÃO
ITENS PE DIDO. QUANTID ADE ^^^Smgjgj^
ITENSPEDIDO.PR_UNITARIO
TIPOPTODUTO . TIPO
UNIDADES.UNIDADE
TABCOR.COR
PEDIDOS.DATA EMISSÃO
É possível, também, associar valores em duas colunas não idênticas. Nesta operação,
utilizamos os mesmos operadores e predicados utilizados em qualquer inner join. A
associação de colunas só é funcional q u a n d o associamos uma tabela a ela mesma, o
que é conhecido como auto-associação.
-- INNER JOIN
SELECT * FROM Empregados; r e t o r n a ' 6'D l i n h a s •^;;|Íi=!;5
SELECT — r e t o r n a 58 l i n h a s
E.CODFUN, E.NOME, E.COD_DEPTO, E.COD_CARGO, D. DE PTC 119^^^^^^^^^^
FROM EMPREGADOS E :||í:;fÍ;/|fl
,„„ INNER JOIN TABELADEP D ON E . C0D_DEPT0 = 'D . C0D_DEPT0
f;-- ou (a p a l a v r a INNER é o p c i o n a l )
[SELECT — r e t o r n a 58 l i n h a s
l: E . CODFUN, E . NOME, E . C0D_DEPT0, E . C0D__CARG0, D . DEPTO :
.jsFROM EMPREGADOS E
.LV JOIN TABELADEP D ON E.C0D_DEPT0 = D.C0D_DEPT0
• LEFTJOIN
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 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.
• Exemplo 1
^SELECT — r e t o r n a 50 l i n h a s
E.CODFUN, E.NOME, E.COD_DEPTO, E.C0D_CARGO, D.DEPTO
FROM EMPREGADOS E LEFT OUTER JOIN TABELADEP D ON E.C0D_DEPT0 iiiHs:
= D.C0D_DEPT0
— OU (a p a l a v r a OUTER é o p c i o n a l )
'SELECT — r e t o r n a 60 l i n h a s
E.CODFUN, E.NOME, E.C0D_DEPT0, E.C0D_CARG0, D.DEPTO
FROM EMPREGADOS E LEFT JOIN TABELADEP D ON E.C0D_DEPT0 '1::'''^
= D.COD_DEPTO
-- No r e s u l t a d o teremos 2 empregados
— com DEPTO = NULL porque o campo COD_DEPTO não f o i
preenchido 'Si''^:ti'>:iW
• Exemplo 2
RIGHT JOIN
miOk.iim
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.
SELECT •
11 E.CODFUN, E.NOME, E. COD_DEPTO, E.COD_CARGO, D.DEPTO
FROM EMPREGADOS E RIGHT JOIN TABELADEP D ON E.COD_DEPTO =
D. COD_DEPTO
— O r e s u l t a d o terá 2 departamentos que
— não r e t o r n a r a m dados de empregados.
,'5
• FULLJOIN
Quando a cross join não possui uma cláusula W H E R E , ela produz um produto
cartesiano das tabelas envolvidas. Se adicionarmos uma cláusula W H E R E , a cross join
se comportará como uma inner join.
Associando tabelas Capí
TechnoEdition
-- CROSS JOIN
SELECT — retorna 840 l i n h a s
E.CODFUN, E.NOME, E.C0D_DEPT0, E.C0D_CARG0, D.DEPTO
^,,|l|QM^^,JMEi£ÍàBQâ...^^^^^ fflIN ..TMELàDEEJ
SQL Server 2 0 0 8 - M ó d u l o I
Associando tabelas
TechnoEdition
• 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 a outra tabela;
• Há diversos tipos de JOIN: INNER JOIN, OUTER JOIN (LEFT JOIN, RIGHT JOIN
e FULL JOIN) e C R O S S JOIN
• Conceito de subquery;
TechnoEdition
Consultas com subqueries
TechnoEdition
ntro d uçao
Uma consulta aninhada em uma instrução SELECT, INSERT, DELETE ou UPDATE é
chamada de subquery (subconsulta). Também, é comum referir-se a uma subquery
como query interna. Já a instrução em que está inserida a subquery pode ser chamada
de query externa.
• As subqueries podem ser escalares (ou seja, retornam apenas uma linha) ou
tabulares (ou seja, retornam linhas e colunas);
• É possível obter apenas uma coluna por subquery; ' . ' '
• Uma subquery, que pode ser incluída dentro de uma outra subquery, deve estar
entre parênteses, o que a diferenciará da consulta principal;
• Não existe uma quantidade máxima de subqueries que podem ser incluídas
em uma instrução. Além disso, uma subquery pode conter outras subqueries
aninhadas; • • • ' • r - ' - -
• 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 consulta SELECT de uma subquery não pode ter uma cláusula FOR
BROWSE ou COMPUTE incluída;
• Podem ser utilizadas para realizar testes de existência de linhas. Nesse caso, é
adotado o operador EXISTS;
• 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 se precisa 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.
'IELECT * FROM C L I E N T E S
WHERE EiíISTS ( S E L E C T * FROM P E D I D O S
p
l^^^^^^^^^ WHERE C O D C L I = C L I E N T E S . C O D C L I AND
D A T A _ E M I S S A O BETWEEN '2007.1.1' AND
::|2oo7.i^l'^'f!''')^^^i|J^
- - ou
SELECT * FROM C L I E N T E S
WHERE C O D C L I I N ( S E L E C T C O D C L I FROM PEDIDOS
WHERE D A T A _ E M I S S A 0 BETWEEN '2007.1.1' AND
;1
% ' : ' ^W S^' i
• Exemplo 1
• Exemplo 2
r ^
• Exemplo 3
Subqueries introduzidas
Vejamos exemplos de como utilizar o sinal de igualdade (=) para inserir subqueries:
• Exemplo 1
• Exemplo 2
O mesmo que
: SELECT TOP 1 WITH TIES * FROM EMPREGADOS,
i- ORDER BY DATA ADMISSÃO DESC
5.
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.
• Quando EXISTS introduz uma subquery, sua lista de seleção será, normalmente,
um asterisco.
Consultas com subqueries
r TechnoEdttion
Por meio do código a seguir, saberemos se temos clientes que não realizaram compra
no mês de janeiro de 2007:
SELECT * FROM CLIENTES \:f'Ir^-^f^^^^^^^^^^ •
WHERE NOT EXISTS (SELECT * FROM PEDIDOS 'ffi^^^^
WHERE CODCLI = CLIENTES.CODCLI AND
DATA_EMISSAO BETWEEN '2007.1.1' AND
•2007'. 1.31' )
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 2007 e a porcentagem de vendas em relação ao total de vendas
realizadas no mesmo mês:
SELECT C0D_DEPTO,
(SELECT SUM(E.SALÁRIO) FROM Empregados E
WHERE E.SINDICALIZADO = 'S' AND E.C0D_DEPT0 =
Empregados.C0D_DEPT0) AS TOT_
:^SALARI0_SIND,
(SELECT SUM (E .SALÁRIO) FROM Em.pregados E
WHERE E.SINDICALIZADO = 'N' AND E.C0D_DEPT0
Empregados ., CQD_DEPT0) AS.
> T0T_SALARI0_NA0_SIND j
sFROM EMPREGADOS
rGROUP BY COD DEPTO
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.
SE LE C T * FROM PE DIDOS
WHERE CODVEN I N (SELECT CODVEN FROM VENDEDORES WHERE NOME = 'LEIA')
Am CODCLI I N (
SELECT CODCLI FROM CLIENTES , ,
WHERE CODCLI NOT I N (SELECT CODCLI FROM FEDIDOS
WHERE DATA_EMISSA0 BETWEEN
' 2 0 0 7 . 1 . 1 ' AND '2007.1.31') AND
I N (SELECT CODCLI FROM PEDIDOS
WHERE DATA_EMISSA0 BETWEEN '2006.12.1'
'2006.12.31')
AND ESTADO = 'SP' ) "
- - T ã B e l a temporária 1 - Código d a v e n d e d o r a L E I A
Í| SELECT CODVEN INTO #VEND_LEIA FROM VENDEDORES WHERE NOME = 'LEIA'
— SELECT de PEDIDOS
; oara revisão
Atente para os tópicos a seguir. Eles devem ser estudados com muita atenção,
pois representam os pontos mais importantes do capítulo:
• Vejamos algumas das diversas características das subqueries: podem ser escalares
(retornam apenas uma linha) ou tabulares (retornam linhas e colunas). Elas, que
podem ser incluídas dentro de outras subqueries, devem estar entre parênteses,
o que as diferenciará da consulta principal;
• 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;
TechnoEdition
Atualizando e excluindo dados em associações e subqueries TechnoEdition
2. aueries
Podemos utilizar subqueries para remover dados de uma tabela. Basta definir a
cláusula WHERE da instrução DELETE como uma subquery para excluir linhas de uma
tabela base conforme os dados armazenados em outra tabela. Vejamos o próximo
exemplo, que elimina os pedidos do vendedor MARCELO que foram emitidos na
primeira quinzena de dezembro de 2006: . . . r
DELETE FROM PEDIDOS
WHERE DATA_EMISSAO BETWEEN '2006.12.1' AND '2006.12.15' AND
CODVEN = (SELECT CODVEN FROM VENDEDORES WHERE NOME =
'MARCELO')
I
Atualizando e excluindo dados em associações e subqueries TechnoEdition
Podemos usar uma associação em tabelas para determinar quais colunas serão
atualizadas por meio de UPDATE. No exemplo a seguir, aumentaremos em 10% os
salários dos empregados do departamento C.P.D.:
UPDATE Empregados •'•''''•|||Í
SET SALÁRIO *= 1.10
FROM EMPREGADOS E JOIN TABELADEP D ON E.COD_DEPTO =
D.COD__DEPTO
WHERE D. DEPTO = 'C. P. D. ' ;
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 RÉGUA:
UPDATE PRODUTOS SET PRECO_VENDA = PRECO_CUSTO * 1.2
FROM PRODUTOS P JOIN TIPOPRODUTO T ON P.COD_TIPO = T.C0D_TIP0
: WHERE T.TIPO = 'RÉGUA';
4. DELETi
Os dados provenientes de tabelas associadas podem ser eliminados por meio da
cláusula JOIN junto ao comando DELETE. Vejamos o seguinte exemplo, que exclui
os pedidos do vendedor MARCELO emitidos na primeira quinzena de dezembro
de 2006:
DELETE FROM PEDIDOS
FROM PEDIDOS P JOIN VENDEDORES V ON P.CODVEN = V.CODVEN
WHERE P.DATA_EMISSAO BETWEEN '2006.12.1' AND '2006.12.15' AND
V.NOME = 'MARCELO';
Mm m tm
mi
311
U i ^
•m m êM
I...
• 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;
• Podemos utilizar uma associação (join) em tabelas para determinar quais colunas
serão atualizadas por meio de UPDATE;
• Os dados de tabelas associadas podem ser eliminados por meio da cláusula JOIN
com o comando DELETE.
<W«>
<MM>
<W1>
• Agrupamento de dados;
I
• Funções de agregação;
• GROUP BY.
TechnoEdition
Agrupando dados
1 ntro d u Ça o
Neste capítulo, aprenderemos como a cláusula GROUP BY pode ser utilizada para
agrupar vários dados, tornando mais prática a sumarização deles. Também, veremos
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, W I T H ROLLUP
eCUBE
TechnoEdition
Agrupando dados
TechnoEdiuon
2.
As funções de agregação fornecidas pelo SQL Server 2 0 0 8 permitem sumarizar
dados. Por meio delas, podemos somar valores, calcular média e contar resultados. Os
cálculos feitos pelas funções de agregação são feitos com base e m um conjunto ou
grupo de valores, mas retornam um único valor.
^^y^^- .^unções de
r 2À. Ti
AVG
Exemplo:
USE PEDIDOS;
• COUNT
Exemplo:
• MIN
Exemplo:
• MAX
Exemplo:
SUM
Exemplo:
3. GROUP BY
utilizando a cláusula GROUP BY, é possível agrupar diversos registros conn base em
uma ou mais colunas da tabela.
Ela é 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.
Nas situações em que se especifica 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.
Em que:
•
Agrupando dados Capitu
• Exemplo 2
— GROUP BY + J O I N
SELECT E.COD_DEPTO, D.DEPTO, SUM( E.SALÁRIO ) AS TOT_SAL
EROM EMPREGADOS E
J O I N TABELADEP D ON E.COD_DEPTO = D.COD_DEPTO
GROUP BY E.COD_DEPTO, D.DEPTO
ORDER BY TOT_SAL ^•ÍÍÊlÊSÊSSÊÊÊà3:^
• Exemplo 3
• Exemplo 4
mm S Q L Server 2 0 0 8 - Módulo I
TechnoEdition
Agrupando dados Capítulo
TechnoEdition _
Como vimos, ALL inclui todos os grupos e conjuntos de resultados. A seguir, temos
exemplos da utilização de ALL:
• Exemplo 1
2 . Utilizando HÂVINC
É 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.
3 c\áUSU\
Esta cláusula determina que, além das linhas normalmente retornadas por GROUP BY,
também sejam obtidas como resultado as linhas de sumário. O sumário dos grupos é
feito em uma ordem hierárquica, a partir do nível mais baixo até o mais alto. A ordem
que define a hierarquia do grupo é determinada pela ordem na qual são definidas as
colunas agrupadas. Caso essa ordem seja alterada, a quantidade de linhas produzidas
pode ser afetada.
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.
ISELECT ••iiiW^
V. NOME AS VENDEDOR, C . NOME AS CLIENTE r'.':llll^^^^^^^^^^^^^^
T . TIPO AS TIP0_PR0DUT0, SUM ( I . QUANTIDADET AS" 'QTD_fÒT'
••FROM
:Í::::„:,.PEDIDOS Pe JOIN CLIENTES C ON Pe.CODCLI = C.CODCLI ''ÍÍIÍIH^^
|||||||||^:Í:^^ JOIN VENDEDORES V ON Pe. CODVEN = V. CODVEN •:^.'il!|IÍB^^^^^
íi;:|;l||ÍM^^^^^^^^^ JOIN ITENSPEDIDO I ON Pe .NUM_PEDID0 = I.NUM_PEDID0 ''IS:;;
:isíi|H^^^^^^ JOIN PRODUTOS P r ON I . ID_PR0DUT0 = Pr. ID_PR0DUT0;i;Í^^^^
>fSw'^''^'«gmm JOIN TIPOPRODUTO T ON Pr.COD_TIPO = T.C0D_TIP0
WHERE Pe . DATA_EMI S SAO BETWEEN '2006.1.1,',,, ,AND^,, ' 2^0 0,6,, ,6,^, ,3„Q;, ,• , ;|I|||H^
fGROUP BY V. NOME , C .NOME, T. TIPO ••• S^
ÍlÍ-^B
lf^^^^^^^
Podemos notar que um dos vendedores é CELSON MARTINS e que alguns de seus
clientes são 3R (ARISTEU.ADALTON) e ALLAN HEBERT RELÓGIOS E PRESENTES
Também, percebemos, por exemplo, que o cliente 3R (ARISTEU.ADALTON)
comprou 111 unidades de produtos do tipo ACES.CHAVEIRO do vendedor CELSON
MARTINS, enquanto ALLAN HEBERT RELÓGIOS E PRESENTES comprou 153
produtos do tipo CANETA do mesmo vendedor.
Agora, vamos acrescentar a cláusula WITH ROLLUP após a linha de GROUP BY. O
código anterior ficará assim:
SELÈCT
V.NOME AS VENDEDOR, C.NOME AS CLIENTE,
T.TIPO AS TIPO_PRODUTO, SUM( 1.QUANTIDADE ) AS QTD_TOT
FROM
III PEDIDOS Pe JOIN CLIENTES C ON Pe.CODCLI = C.CODCLI
JOIN VENDEDORES V ON Pe.CODVEN = V.CODVEN
JOIN ITENSPEDIDO I ON Pe.NUM_PEDID0 = I.NUM_PEDIDO
JOIN PRODUTOS Pr ON I.ID_PR0DUT0 = Pr.ID_PR0DUT0
JOIN TIPOPRODUTO T ON Pr.C0D_TIP0 = T.C0D_TIP0
WHERE Pe.DATA_EMISSAO BETWEEN '2006.1.1' AND '2006.6.30'
GROUP BY V.NOME , C.NOME, T.TIPO
WITH ROLLUP,.:.
O resultado é o seguinte:
•0-. :.'EME
1 - - : E : : - - £ =.:• 111
STEU iCESSC-' J : = : - \ T i r;
••5
••••rj-'J 51S
3.4. U t i l i z a n d o CUBE
Visto que a cláusula 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.
Para explicar o que faz WITH CUBE, vamos considerar o exemplo utilizado para WITH
ROLLUP. No lugar desta última cláusula, utilizaremos W I T H CUBE. O código ficará
assim:
SELECT
V.NOME AS VENDEDOR, C .NOME AS CLIENTE, :•ír'^'^ov^r:=::í'=-
T. TIPO AS TIP0_PR0DUT0, SUM( I.QUANTIDADE AS QTD_TOT
FROM
PEDIDOS Pe JOIN CLIENTES C ON Pe.CODCLI ='C.CODCLI
JOIN VENDEDORES V ON Pe.CODVEN = V.CODVEN
JOIN ITENSPEDIDO 1 ON Pe.NUM PEDIDO r
I.NUM PEDIDO
JOIN PRODUTOS Pr ON I . I D PRODUTO = Pr.ID PRODUTO
JOIN TIPOPRODUTO T :;DIÍiÍ|:,.C0D_TIP0 = T.C0D_TIP0
WHERE Pe.DATA_EMISSAO BETWEEN :'2OOf?Í.1' AND '2006.6.30'
I
GROUP BY V.NOME , C.NOME, T. TIPO 1
WITH CUBE
O resultado é o seguinte:
3 Mi-. - £ = :'0=: 23
•£= - - - - . - =: TDFA.TDA.
.-js>D=: ::::
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 -
20 produtos - comprado pelo cliente ABÍLIO Já ALAMBRINDES GRÁFICA EDITORA
LTDA comprou 2000 produtos do tipo ABRIDOR. WITH CUBE inclui todas as outras
sub-totalizações possíveis no resultado.
GROUPING é uma função de agregação utilizada com uma cláusula GROUP BY com
ROLLUP ou CUBE. Ela indica se uma coluna/expressão em uma lista GROUP BY é ou
não agregada. Essa função retorna valor 1 para agregada e O para não agregada no
resultado. A sintaxe utilizada para GROUPING é a seguinte:
GROUPING ( <coluna_ou_expressao> )
Em que:
TechnoEdition
Outros recursos
TechnoEdition
Os valores pertencentes a uma coluna podem ser testados por meio da cláusula C A S E
em conjunto com o comando SELECT.
2.
Por meio da cláusula COMPUTE, obtemos visualmente dados totalizados. Há, ainda,
a cláusula COMPUTE BY, que nos permite visualizar totalizações de dados sem o
agrupamento deles. Por meio dela, é possível obter tanto linhas de detalhe como
linhas de sumário com a utilização de uma instrução SELECT. Para utilizar COMPUTE
BY, é preciso uma cláusula ORDER BY. A cláusula COMPUTE BY também pode ser
utilizada juntamente com a cláusula JOIN a fim de associar várias tabelas.
É importante salientar que o resultado gerado pela cláusula COMPUTE é apenas para
visualização e não pode ser utilizado, ou seja, não possui característica relacional.
Junto à cláusula COMPUTE, podemos utilizar nomes de funções como MIN, M A X ,
AVG, COUNTou SUM
Com COMPUTE, é possível obter valores de resumo para grupos, bem como calcular,
para o mesmo grupo, mais de uma função agregada.
Tanto para COMPUTE quanto para COMPUTE B Y são obtidos dois grupos de
resultado para o SELECT, que são descritos na tabela a seguir:
COMPUTE COMPUTE BY
Possui t o d a s as linhas de POSSUÍ o grupo de linhas de
> ^
Primeiro grupo de detalhe c o m a i n f o r m a ç ã o de detalhe c o m a informação de
Quando utilizamos GROUP BY, o resultado obtido mostra os totais, mas não as linhas
que produziram os totais. Já com COMPUTE BY, essas linhas podem ser retornadas.
Vejamos os seguintes exemplos:
• Exemplo 1
^••rSELECT V.NOME AS VENDEDOR, P. NUM_PEDI DO,
P.DATA_EMISSAO, P.VLR_TOTAL
I I I F R O M VENDEDORES V JOIN PEDIDOS P ON V. CODVEN=P. CODVEN
IjlWHERE P.DATA_EMISSA0 BETWEEN ' 2 0 0 6 . 1 . 1 ' AND '2006.1.31'
^ •'ORDER BY V.NOME
COMPUTE SUM(P.VLR_TOTAL) BY V.NOME
• Exemplo 2
i i l S E L E C T C.NOME AS CLIENTE, P .NUM_PEDIDO,'lp^^^^^^^^^^
P.DATA_EMISSAO, P.VLR_TOTAL
|li„,FROM CLIENTES C JOIN PEDIDOS P ON C. CODCLI=P. CODCLI
jjj|WHERE P. DATA_EMISSAO BETWEEN ' 2 0 0 6 . 1 . 1 ' AND ' 2 0 0 6 . 1 . 3 1 ' ^:^§§§^Wgff:
i f O R D E R BY C.NOME
||iCOMPUTE, SUM (P . VLR TOTAL) BY C . NOME ,:
0
Outros recursos
3. UNION • • - ' : • /
A UNION ALL é uma 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.
A utilização da cláusula UNION ALL exige a consideração de algumas regras, as quais
descreveremos a seguir:
• O nome (alias) das colunas, quando realmente necessário, deve ser incluído no
primeiro SELECT;
• A inclusão de WHERE pode ser feita em qualquer comando SELECT;
Outros recursos
• 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.
SE LE C T
'Fornecedor -> ' AS TIPO, NOME, FONEl Í:\fíM
Í' ^^^^^^^^^^^^
EROM EORNECEDORES
UNION A L L — UNE AS LINHAS DE 2 S E L E C T s
SELECT
' C l i e n t e -> ' AS TIPO, NOME, FONE 1 ''-lliílf
FROM CLIENTES
ORDER BY NOME
• Para substituir uma view nas situações em que seu uso geral não é exigido;
• Para referenciar diversas vezes na mesma instrução a tabela resultante. "" '
Podendo ser definidas em rotinas definidas pelo usuário (como funções, procedures
armazenadas, triggers ou views), as common table expresions garantem os benefícios
da boa legibilidade e da fácil manutenção de queries complexas.
O resultado a seguir mostra o maior pedido (de maior valor) vendido em cada um dos
meses de 2006.
3 i 2::Í I:;3?5:
5 5 1113-::
6 S 2::; Í22-1Í
7 7 2::z £221 52
8 8 2::Í 5:5:
3 S 2::S
10 12 2 : : S ';3Ç3 33
11 11 2 : : s 51S13S
12 12 220€ 531233
Esse resultado foi gerado pelo seguinte SELECT, o qual utiliza a cláusula GROUP BY:
SELECT MONTH í DATA_EMISSAO ) AS MS,
YEAR( DATA_EMISSAO ) AS ANO,
MAX ( VLR_TOTAL ) AS MAIOR_VENDIDO .B
ÍJ|^^^^^^^^^^^^
FROM PEDIDOS •|||;;SÍ;::|i|^
WEERE YEAR (DATA_EMISSAD)' =' 2006"
GROUP BY MONTH (DATA_EMISSAO) , YEAR (DATA_EMISSAO)H
ÍI^
||Í•1|^
:^^^^^^^^^
ORDER BY MES
Vamos supor que desejamos incluir uma quarta coluna no resultado para informar
o número do pedido tido como o maior do mês. No entanto, não é possível incluí-
la na consulta SELECT exibida porque estaríamos quebrando o agrupamento. Uma
solução para este caso seria criar uma view com essa consulta e depois fazer uma
associação (join) entre a view e a tabela PEDIDOS. Mas, se assim for feito, a view não
terá utilidade posterior, já que ela só funciona para o ano de 2006. O mais indicado,
então, é utilizar uma Common Table Expression (CTE):
-- Membro âncora
SELECT MONTH( DATA_EMISSAO ) AS MES,
YEAR(VLR_T0TAL
MAX( DATA EMISSÃO
) AS)MAI0R_VENDID0
AS ANO,
FROM PEDIDOS
Outros recursos
CTE Recursiva
Com as common table expressions, também é possível escrever consultas recursivas, as
quais são formadas por três elementos: a invocação da rotina, a invocação recursiva da
rotina e verificação de finalização.
Contador
WITH CONTADOR { N ) '
Membro âncora . ;
H
II^^^^^^^ SELECT 1 •H
ll^
lii^
.^^^^^^^^^
H
II^^^^^^^ ; UNION ALL BII^
I•I^
'^^^^^^^^
-- Membro r e c u r s i v o
SELECT N+1 FROM CONTADOR WHERE N < 100
^^^F''' ; I l l i l ilB^^^^^
Execução da CTE
SELECT * FROM CONTADOR
-- Potencias de 5
SELECT 1,5
UNION ALL
SELECT EXPOENTE+1, POTENCIA * 5
FROM P0TENCIAS_DE_5
WHERE EXPOENTE < 10
)
SELECT * FROM P0TENCIAS_DE_5
O resultado é O seguinte:
_3 Rêsuitados Mensegens
£>:P0£NTE POTtMC
1 ;c
2 2 "" 2S
'i •? 12S
4 4 €25
c 3125
8 15S25
•j
7S125
8 8 33C625
s
10
Outros recursos MÉKit*
TechnoEdition
Adiante, temos um exemplo de CTE que calcula a evolução do total a ser pago para
uma dívida de R$ 1000,00, considerando uma taxa de juros de 5 % ao mês (juros
compostos):
{ mÉMãÊÊÊÊÊÊÊÊÊÊBM
SELECT O, CAST ( 1 0 0 0 AS NUMERIC ( 1 0 , 2 ) V^'^'"':WÊÊF'^^
[ UNION AL L
SELECT MES + 1 , '••|ÍI|:ÍÍÍ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
C A S T ( V A L O R * 1 . 0 5 AS N U M E R I C { 1 O , 2 ) )
I'""'FROM JUROS WHERE MES < 12 ,
2)
I S E L E C T * FROM JUROS -':ÍiÍ|Í:y|'|IÍiiH^^^^
O resultado é o seguinte:
MES
•1 1 y"
1
: 3 1íD2.5fl
h ^ 3 1157:S3
K
i:~£.2S
n i\ 5
u:"ii
8
\c ^ 1551 3^
11 10 1S:2.31
;l 1.2 11 i7i:.?£
ii 13 12
No exemplo a seguir, temos uma CTE que aplica a sequência de Fibonacci. Descrita
primeiramente por Leonardo de Pisa (também conhecido como Fibonacci), essa
sequência é iniciada por O e 1, sendo que o elemento seguinte será sempre a soma
dos dois últimos números. Como os dois números iniciais são O e 1, o número
seguinte é 1, ou seja, 0 + 1 = 1 . Agora, temos 0,1 e 1. Como continuação da
sequência, temos 2, isto é, 1 + 1 = 2, e assim por diante. Vejamos:
O resultado é O seguinte:
1
m 1 1
2 1 2
3 1 •3
í -i 5
c. e
c Í5
13
-g l 1] 21
n
21
21
3--
3^ •
10 34
11 144
12 23 j
13 1,, 2.. 377 ,:,
U 2.. €11..:
15 j , ;
1£ E s
1T 1
18 1. *; álSI
IS S7€S
g
A sequência de Fibonacci é esta: O, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377,
610, 987, 1597, 2584, 4181, 6765, 10946, etc
Robeit
Pessoal Pessoal
George Ronaldo
Pessoal Pessoal Pessoal
Roberto
Pessoal
Presidlnca
José
FÍM»ceiro
Patjb
FiMisceiro
Financeiro
^ TechnoEdition ;•
Outros recursos
TechnoEdicion
Para gerar um relatório como o mostrado adiante, ou criamos uma stored procedure
ou, então, criamos uma CTE recursiva. Não há como gerá-lo com view ou com join
apenas:
11
u - £ " • L—
13
jkj JOSE DE
u
1£
IS
1"
15
Is
Membro âncora
No código anterior, o membro recursivo utiliza a própria CTE para acessar os subníveis.
Estamos subutilizando o poder da recursão. A consulta S E L E C T adiante fana a mesma
coisa:
Em seguida, vamos acrescentar uma coluna NÍVEL, para sabermos em qual nível
do organograma o funcionário está localizado. Para executar essa tarefa, utilizamos
recursão: • ,,
— Membro âncora
SELECT CODFUN, NOME, 1, COD_DEPTO, COD_SUPERVISOR, NOME
FROM Empregados MHERE C0D_SUPERVIS0R = O
UNION ALL
— Membro r e c u r s i v o
SELECT E.CODFUN, E.NOME,
CTE.NIVEL+1, E.C0D_DEPT0, E.C0D_SUPERVIS0R, CTE.NOME
FROM Empregados E JOIN CTE ON E.COD_SUPERVISOR =
CTE.CODFUN
)
— Execução da CTE
SELECT CTE.CODFUN AS [Código],CTE.NOME AS [Funcionário!,"
CTE.NÍVEL AS [ N i v e l ] ,
CTE.NOME_SUP AS [Nome S u p e r v i s o r ]
iFROM CTE
O resultado é o seguinte:
1 1 í- ROSE •EERG
2 S SANTOS =0:-iA JUHSOF 1 ^0R3t DOS SANTC5 ROCA. JUNC
6S A.E STADO 1 A B STA DO
4 4 "-i;. '
2 -£ .•EER3
12 SEBí^STiAí 2 El ' A B D U U -^ROSE ítEER3
Por fim, vamos gerar a árvore que mostra toda hierarquia ascendente de um
funcionário:
TechnoEdition
Resumo de objetos de um banco de dados do SQL Server 2008
1.1. Tabela
Os dados do sistema 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 do SQL Server e são a principal forma para coleção de dados.
1.2. índice
Quando realizamos uma consulta de dados, o SQL Server 2008 faz uso dos índices
(Índex) para buscar, de forma fácil e rápida, informações específicas em uma tabela
ou view indexada.
TechnoEdition
Resumo de objetos de um banco de dados do SQL Server 2008 pêndic
_
Definimos uma view (view) como sendo uma tabela virtual composta por linhas e
colunas de dados, os quais são provenientes de tabelas referenciadas em
uma query que define essa tabela.
Este 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.
Procedure
Neste objeto encontramos um bloco de comandos T-SQL, responsável por uma
determinada tarefa. Sua lógica pode ser compartilhada por diversas aplicações.
A execução de uma procedure (procedure) é realizada no servidor de dados. Por
isso, seu processamento ocorre de forma rápida, visto que seu código tende a ficar
compilado na memória.
Fu nc o n
Neste 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.
Vejamos mais um exemplo, que cria uma função para retornar somente a primeira
palavra de um nome:
CREATE FUNCTION FN_PRIMEIRA_PALAVRA( @NOME VARCHAR(200) )
RETURNS VARCHAR{200)
AS BEGIN
DECLARE @CONT INT, @RET VARCHAR{2OO), @C CHAR(1);
SET @RET = '';
n SET gCONT = 1 ;
;;:SET 8N0ME = LTRIM( @NOME ) ;
iWHILE @CONT <= LEN( mOME )
r
liíl BEGIN
l l f i t SET @C = SUBSTRINGÍ @NOME, @CONT, 1 ) ;
n Í|j:, I F @C = ' ' BREAK;
A I I I SET gRET = @RET + @C;
SET eCONT = @CONT + 1 ;
IJIII.END -- WHILE i^á^
^ H
liíi ^^^^^^^^^^^
^^RETURN @RET':KSl|ilÍH
feND ^
Ji'B
i'l^^^^^^^^^
r
r Para testar a função anterior, devemos digitar o seguinte código:
SELECT DBO.FN PRIMEIRA PALAVRA( 'CARLOS MAGNO' )
ler
Este objeto também possui um bloco de comandos Transact-SQL. O trigger (trigger)
é criado sobre uma tabela e ativado automaticamente no momento da execução dos
comandos UPDATE, INSERT ou DELETE.
Vejamos o seguinte exemplo de criação de um trigger para recalcular o valor total dos
pedidos:
corno o
TechnoEdition
Resumo de objetos de um banco de dados do SQL Server 2008 •|3
Depois disso, criamos duas variáveis, uma para armazenar o número do pedido
alterado e outra para armazenar o novo valor total:
Para testarmos toda a sequência de códigos anterior, podemos, por exemplo, consultar
o pedido de número 1000:
1 ífcs
5. Q u a l seria o t i p o d e c a m p o ( d a t a t y p e ) m a i s a d e q u a d o para os c a m p o s :
NOME_EMPRESA;
CNPJ;
CEP;
QTD_FILHOS; • , .
QUANTIDADE_ESTOQUE;
COD_CLIENTE;
DATA ADMISSÃO.
Exercícios ae iaboratórío
Laboratório 1 - - ., ^ .
A - Criando bancos de dados e suas respectivas tabelas
Resposta:
Resposta:
Resposta:
Resposta:
Criando um banco de dados Capít
TechnoEdjtion
8. Criar uma tabela para armazenar os dados cadastrais dos clientes. Neste caso,
definir por conta própria quais serão os campos da tabela;
Resposta:
9. Criar uma tabela para armazenar os dados cadastrais dos vendedores. Neste caso,
definir por conta própna quais serão os campos da tabela;
Resposta:
10.Criar uma tabela para armazenar os pedidos de venda. Neste caso, considerar que
um pedido possui u m único número (chave primária), pertence a um único cliente,
foi emitido em uma única data, mas pode possuir N produtos. Para não violar a
primeira forma normal, dividir as informações em 2 tabelas;
TABELA PEDIDOS
Resposta:
TABELA ITENSPEDIDO
Exercicic laboratório
Laboratório I
Resposta:
Resposta:
Resposta:
Resposta:
Resposta:
^ o ^ -
Resposta:
cita as ^
as cow?-^^ ^
este caso-
Resposta:
Resposta:
Resposta:
Resposta:
Resposta:
8. Listar produtos com quantidade real acima de 5000 e código do tipo igual a 6;
Resposta:
9. Listar produtos com quantidade real acima de 5000 ou código do tipo igual a 6;
Resposta:
10. Listar pedidos com valor total infenor a R$ 100,00 ou acima de R$ 100.000,00;
Resposta:
11 .Listar produtos com QTD_REAL menor que 500 ou maior que 1000;
Resposta:
TechnoEdition
Consultando dados
TechnoEdiuon _
A - u t i l i z a n d o n o v a m e n t e o b a n c o d e d a d o s PEDIDOS e l i s t a n d o suas t a b e l a s c o m
base e m o u t r o s critérios
Resposta:
Resposta:
Resposta:
4. Listar todos os pedidos com data de emissão em janeiro " E" j u n h o de 2006;
Resposta:
Resposta:
Resposta:
TechnoEdition
Consultando dados A^ ,T.
™ ™ ™ TechnoEdtuon
Exercícios de laboratório
Laboratório 1
Resposta:
Resposta:
Atualizando e excluindo dados CapituI
3. Fazer com que os preços de venda dos produtos do tipo 2 fiquem 3 0 % acima do
preço de custo; : -
Resposta:
Resposta:
Resposta:
Resposta:
1. Na tabela CLIENTES, para clientes dos estados RJ, RO, AC, RR, MG, PR, SC, RS,
MS, MT, Alterar o campo ICMS para 12;
Resposta:
TechnoEdition
Atualizando e excluindo dados Capitu
3. Fazer com que os preços de venda dos produtos do tipo 2 fiquem 30% acima do
preço de custo;
Resposta:
7. Na tabela CLIENTES, para clientes dos estados RJ, RO, AC, RR, MG, PR, SC, RS,
MS, MT, Alterar o campo ICMS para 12;
Resposta:
Atualizando e excluindo dados Capítulo 4
TechnoEdition „
r
Resposta:
9. Alterar o campo ICMS da tabela CLIENTES para 7, isto considerando clientes que
não sejam dos estados RJ, RO, AC, RR, MG, PR, SC, RS, MS, MT, SP;
Resposta:
10. Alterar o campo DESCONTO da tabela ITENSPEDIDO para 7, mas somente dos
itens pertencentes ao produto com ID_PRODUTO = 8, com data de entrega para
janeiro de 2007 e QUANTIDADE acima de 1000;
Resposta:
11. Zerar o campo DESCONTO de todos os itens de pedido com quantidade inferior
a 1000, com data de entrega postenor a 1 de Junho de 2007 e que tenham
desconto acima de zero;
Resposta:
Resposta:
^^JJBII Consultando dados TechnoEdition
13. Por meio do comando SELECT...INTO, gerar uma cópia da tabela PEDIDOS,
chamando-a de COPIA_PEDIDOS;
Resposta:
ixercfci: boratório
,aboratórío 1
A - Criando constraints com ALTER TABLE
Resposta:
Com CLIENTES
Resposta;
Com VENDEDORES
Resposta:
Com TIPOPRODUTO
Resposta:
Resposta:
Com PEDIDOS
Resposta:
Com PRODUTOS
Resposta;
Com TABCOR
Resposta:
Resposta:
Resposta:
Resposta:
Resposta:
Constraints e índices
TechnoEdition
Resposta:
Resposta:
Resposta:
Resposta:
• Zero para P R E C O _ C U S T O e P R E C O _ V E N D A ;
Resposta: . , . ,
Zero para Q T D _ R E A L , Q T D _ M I N I M A e Q T D _ E S T I M A D A ;
Zero para COD_TIPO e C O D _ U N I D A D E
Resposta:
• Campo N O M E
Resposta:
Campo FANTASIA
Resposta:
• Campo ESTADO
Resposta:
• Campo CEP
Resposta:
• Campo C G C
Resposta:
12. Da mesma maneira: criar índices para os campos NOME e FANTASIA da tabela
VENDEDORES; para o campo DESCRIÇÃO da tabela PRODUTOS; e para o campo
DATA EMISSÃO da tabela PEDIDOS.
^' Laboratório 2
Resposta:
Resposta:
TechnoEíition _
Constraints e índices Capítulo 5
Resposta;
Resposta:
•3 bj,.í.-0
3 • r. \
Resposta:
Resposta:
Constraints e índices Capitu
15 Criar tabela C A D J N S T R U T O R E S _ T R E I N A M E N T O S ;
Resposta:
Resposta:
Constraints e índices
TechnoEdition
17 Criar tabela M O V _ C U R S O S _ A L U N O S ;
ID_CURSO inteiro
ID_PESSOA_ALUNO inteiro
DATA_INCLUSAO data e hora, não nulo, defalut data atual
OBS.: A chave pnnnána é composta por ID_CURSO e ID_PESSOA_ALUNO
Resposta:
VENDEDORES CLIENTES
f cos»,
~A-;_Ev;£.SA- f CODCU
ÍÍOME
PSDESECO
BAIRRO
C D ADE
CE?
CE?
Ct>!=
E';D.CC*
S5 BAIjrOE
cir.„coE
?
FAX
ITENSPEDIDO ES^ C O E
EJ«íAlL
CFP_COÊ
9 - ^"E-
::.SCÍ;:CA;>
FONEI
*=AV
2„ E £J»1Aa
FORNECEDORES -A-Í.CA;
f C0DJ=OR>€C£SOS
ÍSA
R.t-.e.:i.::'.5.'--
CODJ=áIS
-®4 TABCOR
a^i f CODCOí
CCS.
EfOERECO
CE?
PRODUTOS
-€ÍCai£AO
C3C'_-* <DAD£
C00_TF'O
—
FAX
»BEC3_.PSA
E>ÍA1L
O—.ES^ZVADA
TIPOPRODilTO
f CDD.TIPO
CLAS.FISC
PROD_FOI»i
TechnoEdition
^mSf Associando tabelas | Capítulo 6
TechnoEdition ^ ^
Resposta:
Resposta:
Resposta:
Resposta:
Resposta:
Resposta:
8 Listar os campos: N U M _ P E D I D O , N U M J T E M , C O D _ P R O D U T O , Q U A N T I D A D E
e PR_UNITARIO da tabela ITENSPEDIDO; C O D _ P R O D U T O e D E S C R I Ç Ã O da
tabela PRODUTOS; seguidos da descrição do tipo de produto ( T I P O P R O D U T O .
TIPO) e do nome da unidade de medida (UNIDADES.UNIDADE);
Resposta:
^ Resposta:
Associando tabelas
TechnoEdition -
Resposta:
Resposta:
Resposta:
Associando tabelas
TechnoEdition „
Resposta:
Resposta:
Resposta:
Resposta:
Resposta:
19. Listar NOME e F0NE1 dos fornecedores, bem como DESCRIÇÃO dos produtos
com QTD_REAL abaixo de QTD_MINIMA;
Resposta:
Resposta:
S Q L Server 2 0 0 8 - M ó d u l o I
TechnoEditíon
Consultas com subqueries
TechnoEdition
íixerc Doralono
A ~ T r a b a l h a n d o c o m JOIN e s u b q u e r y .
Resposta:
Resposta:
Resposta:
Resposta:
Resposta:
Resposta:
7. Apresentar as pessoas que sejam de estados cujo ICMS seja menor que 7;
Resposta:
Resposta:
Atualizando e excluindo dados em associações e subqueries
... ÍEchnoEdition
Exercicic laboratono
Laboratório 1
Resposta:
Resposta:
Resposta:
Resposta:
8. Alterar a tabela ITENSPEDIDO de modo que todos os itens com produto de cor
VERMELHO passem a ser LARANJA. Considerar somente os pedidos com data
de entrega em Outubro de 2007;
Resposta:
9. Alterar o campo ICMS tabela CLIENTES para 12. Considerar apenas clientes dos
estados: RJ, RO, AC, RR, MG, PR, SC, RS, MS, MT;
Resposta:
10. Alterar o campo ICMS para 18, apenas para clientes de SP;
Resposta:
11. Alterar o campo ICMS da tabela CLIENTES para 7. Considerar apenas clientes que
NÃO SEJAM dos estados: RJ, RO, AC, RR, M G , PR, SC, RS, MS, M T SP;
Resposta:
Resposta:
Resposta:
Resposta:
Resposta:
Resposta:
Resposta:
Resposta:
Resposta:
5. Calcular o valor total vendido pela vendedora LEIA enn janeiro de 2007;
Resposta:
TechnoEdition
Agrupando dados
TechnoEdition
Resposta:
10. Listar o total comprado por cada cliente em janeiro de 2 0 0 7 . Deve mostrar o
nome do cliente;
Resposta:
Resposta:
12. Listar os totais vendidos por cada vendedor enn janeiro de 2007. Deve exibir
o nonne do vendedor e mostrar apenas os vendedores que venderam mais de
R$ 800.000,00;
Resposta:
13. Listar o total comprado por cada cliente em janeiro de 2007. Deve mostrar o nome
do cliente e somente os clientes que compraram mais de R$ 50.000,00;
Resposta:
14. Listar o total vendido de cada produto em janeiro de 2007. Deve mostrar apenas
os produtos que venderam mais de R$ 100.000,00;
Resposta:
1 5. Listar o total comprado por cada cliente em janeiro de 2007. Deve mostrar o
nome do cliente e somente os 10 primeiros do ranking;
Resposta:
16. Listar o total vendido de cada produto em janeiro de 2007. Deve mostrar os
10 produtos que mais venderam;
Resposta:
Resposta: