Você está na página 1de 277

Capítulo 1: Introdução 12

2. As linguagens SQL eT-SQL 13


3. O banco de dados relacional 14
4. Arquitetura Cliente / Servidor 15
5. Connponentes 15
6. Ferramentas de gerenciamento 18
7. SQL Server Management Studio 22
7.1. Inicializando o SSMS 22
7.2. Interface • 23
7.3. Contêineres de gerenciamento....: 26
7.4. Acessando um banco de dados 26
7.5. Executando um comando 27
7.6. Salvando scripts 29

Capítulo 2: Criando um banco de dados. 31


1. Introdução 32
2. CREME DAJABASE 33
3. CREME TABLE : 34
4. Tipos de dados.... : , 35
4.1. Categorias 35
4.1.1. Numéricos exatos 36
4.1.2. Numéricos aproximados. 37
4.1.3. Data e hora 38
4.1.4. Strings de caracteres 38
4.1.5. Strings de caracteres Unicode 39
4.1.6. Strings binárias 39
4.1.7. Outros tipos de dados 40
5. Chave primária 41
5.1. C a m p o de autonumeração (IDENTITY) 42
6. Inserindo dados 43
6.1. INSERT posicionai 45
6.2. INSERT declarativo 46
6.3. Constantes 47
7. Normalização de dados 51
7.1.1. Regras de normalização 51

Capítulo 3: Consultando dados 59


1. Introdução 60
2. SELECT 61
2.1. Consultando todas as colunas 63
2.2. Consultando colunas específicas 64
2.3. Consultando colunas por meio de alias 64
3. Ordenando dados 66
3.1. Retornando linhas na ordem ascendente 66
3.2. Retornando linhas na ordem descendente 66

"^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

Capítulo 4: Atualizando e excluindo dados 97


1. Introdução 98
2. UPDATE 99
2.1. Alterando dados de uma coluna ...«> m 101
2.2. Alterando dados de diversas colunas 101
3. DELETE. :.: 103
3.1. Excluindo todas as linhas de uma tabela.... 104
4. - Transações 106 -
4.1. Transações explícitas 107
4.1.1. Iniciando e encerrando transações 108

Capítulo 5: Constraints e índices 111


1. Constraints 112
1.1. Tipos de constraints 112
1.1.1. PRIMARY KEY (Chave primária)) 112
1.1.2. UNIQUE 113 '
1.1.3. CHECK 113
1.1.4. DEFAULT 114
1.1.5. FOREIGN KEY (Chave estrangeira) 115
1.2. Nulabilidade 115
1.3. M o d e l o Entidade - Relacionamento (MER) 116 -
1.3.1. Relacionamento entre tabelas 116
1.4. Regras de constraints 118
1.5. Criando constraints 118
1.5.1. Criando constraints com CREATE TABLE 119
1.5.2. Criando constraints com ALTER TABLE 122
1.5.3. Criando constraints graficamente 123
2. índices 131

TechnoEdition
2.1. Criando índices 132
2.2, Excluindo índices 133

Capítulo 6: Associando tabelas 135


1. Introdução 136
2. JOiNI 37
2.1. Tipos de JOIN : 138
2 . 1 . 1 . INNER JOIN 138
2.1.2. OUTERJOIN 143
2.1.3. CROSSJOIN 146

Capitulo 7: Consultas com subqueries 149


1. Introdução 150
2. Principais características das subqueries 151
3. Subqueries introduzidas c o m IN e NOT IN 155
4. Subqueries introduzidas com sinal de igualdade (=) 157
5. Subqueries correlacionadas 158
5.1. Subqueries correlacionadas c o m EXiSTS 158
6. Diferenças entre subqueries e associações 160
7. Diferenças entre subqueries e tabelas temporárias 161

Capítulo 8: Atualizando e excluindo dados em associações e subqueries 167


1. U PD ATE c o m subqueries ...: : : 168
2. DELETE c o m subqueries 169
3. UPDATE c o m JOIN 170
4. DELETE c o m JOIN 171

Capítulo 9: Agrupando dados 173


1. Introdução 174
2. Funções de agregação 175
2.1. Tipos 175
3. GROUP BY 178
3.1. Utilizando ALL 181
3.2. Utilizando HAVING 181
3.3. Utilizando ROLLUP • 183
3.4. Utilizando CUBE 186
3.5. Utilizando GROUPING 187

Apêndice 1: Outros Recurcos 191


Apêndice 2: Resumo de objetos de um banco de dados 209

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

O Microsoft SQL Server 2008 é uma plataforma de banco de dados utilizada


para armazenar dados e processá-los tanto em um formato relacional quanto em
documentos XML. Também, é utilizada em aplicações de comércio eletrônico e atua
; , como uma plataforma inteligente de negócios para integração e análise de dados,
bem como de soluções.

Para essas tarefas, o SQL Server faz uso 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.

Neste capítulo, abordaremos o conceito das linguagens SQL e Transact-SQL, e do


banco de dados relacional, a compreensão da arquitetura cliente/servidor, as pnncipais
características do SQL Server 2008 e a apresentação do SQL Server Management

o ot- t)-vnL \)TL


bs-v\i'^ "^5.gLr<N0 3:^+;o-NA

SQL Server 2008 - Módulo I TechnoEdition


Introdução ao SQL Server 2008
TechnoEdition

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

Trata-se de um banco de dados complexo, cuja 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.

As tabelas de um banco de dados relacional costumam ter 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. Cada tabela pode conter apenas uma chave pnmária, sendo que a coluna que
a representa não pode aceitar valores nulos.

Além da chave primária, uma tabela possui colunas utilizadas com a finalidade de
estabeleceriapáfa oi:ii^oi;i||t:a|:É^^ estrangeiras.

É por meio ;4ii,gtoives;,|^^^^ entre tabelas


de um b a n c i € è ' Í Í Í b l M
TechnoEdition
Introdução ao SQL Server 2008

2. As linguagens SQL e T-SQL


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 cnar consultas de dados no SQL Server 2008.
Introdução ao SQL Server 2 0 0 8
TechnoEditJon

/
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:

• Usuários acessam o servidor através de um aplicativo deste ou de um . •. .


computador cliente; hy. ^ " .

• O computador cliente executa as tarefas do aplicativo, ou seja, fornece a


interface do usuário (tela, processamento de entrada e saída) e manda uma
s o l i c i t a ç ã o ao servidor;

• O servidor de banco de dados processa a s o l i c i t a ç ã o , ou seja, executa a consulta


oirv (query) e retorna OS resultados ao cliente. t-<''h:z'^ O

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.

TechnoEdition SQL Server 2008 - Módulo I \


Introdução ao SQL Server 2008

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. ;,

A seguir, descreveremos as funcionalidades oferecidas pelos principais componentes


do SQL Server:

• SQL Server Database Engine

O Database Engine é o mecanismo central de armazenamento, processamento


e segurança dos dados. É usado para criar bancos de dados relacionais para
o processamento de transações ou processamento analítico. A cnação inclui
as tabelas para armazenar os dados e objetos como índices, views e stored
procedures. A partir disso, podemos visualizar e manipular os dados e garantir
sua segurança.

Esse mecanismo oferece acesso controlado e processamento de transações


de forma rápida para as solicitações feitas pela maioria das aplicações que
processam dados.

Para essas tarefas, este mecanismo conta com ferramentas como: Service
Broker, Replication, Notification Services e Full-Text Search que
descrevemos adiante:

• Service Broker

Esta ferramenta oferece suporte nativo.ao Database Engine para aplicações


de envio de mensagens e listagem. Facilita, principalmente, a comunicação
entre bancos de dados diferentes por meio de aplicações complexas criadas
a partir dos componentes do Database Engine.

• Replication

Trata-se de um conjunto de ferramentas utilizadas para copiar e distribuir


dados e objetos de um banco de dados para outro e então, sincronizá-los
para manter a consistência.

SQL Server 2008 - Módulo I TechnoEdition


Introdução ao SQL Server 2008 Capítulo
TechnoEíition _

Notification Services

Trata-se de uma plataforma para desenvolvimento de aplicações que geram


e enviam notificações. Costuma-se utilizar essa ferramenta para criar e
enviar mensagens de forma pontual e personalizada para muitos assinantes
e para ampla variedade de dispositivos, como um telefone celular, por
exemplo.

Full-Text Search

Essa ferramenta oferece uma funcionalidade para a realização de buscas full-


text nas tabelas de dados baseados em caracteres.

Analysis Services

Este componente permite desenvolver e controlar o processamento analítico,


através da criação de soluções complexas de exploração de dados. É apliccável a
qualquer estrutura multidimensional que contenha detalhes e dados agregados
de múltiplos códigos de origem.

• Reporting Services

Também conhecido como SSRS, Reporting Services é uma plataforma de |


informações baseada no servidor. Inclui um conjunto de ferramentas com as
quais podemos criar, manipular e comunicar informações através de relatórios.
Funciona dentro do ambiente do Microsoft Visual Studio e é integrada com as
ferramentas e componentes do SQL Server. \
• \

• Integration Services

Trata-se de uma plataforma de desenvolvimento de soluções para transformação


e integração dos dados, com a finalidade de resolver problemas complexos de
negócios. Por meio deste componente, podemos mover os dados, atualizar os
locais de armazenamento, copiar dados, fazer download de arquivos e mandar
mensagens de e-mails em resposta aos eventos.

^ TechnoEdition sí SQL Server 2008 - Módulo I


TechnoEdition _
Introdução ao SQL Server 2 0 0 8 Capitu •
• Microsoft SQL Server Profiler

Essa ferramenta permite capturar e salvar dados de cada evento em um arquivo


ou tabela para análise posterior.

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

Rtpciri: ísrver BT ftUT... 0 Ú Ú


Audit L o g o ut SYSTEM «T ALÍT. . . 0 a
RPCiComple tea • P-eport 5erv«r SrYSTÇM t í T ftMT, . , 0 Q a
n Rcport Server SYSTEM m ÃLiT, , .
declare a p t Rvarc}tarí:fi43 set ««eort íervsr SYSTE» HT ftUT,.. Ú Cí 0
declare « p i nvarchíír(í4) s e t *Í>I*«W. ííaptírt Server SYSTEM ffT * U T . . . 0 0 a
S Q L i B a c c h S t a r t i nç Ríport Server S-YST^ « T AlíT- . .
SQI.íBatCFTC RçpQrt Servir S^^STEM KT AlíT. , . Q 0 0
Audli: Logou t • P.«tf(?rt Server SYSTT» «T ÃlíT. . , 0 0
R,PC:CoiHple íxec 5p_reseí:_CDnneecion " «epQí"!: Server SYSTEM ttr A l í T , , . Cl 0 <i
ftíporE Server sYsrm K T ALíT, . .
P-FCíCQíItplC declare « p i nvãrchar(e4) s ç t ípl»*!. Rcport Server EYSTOÍ «T ftUT... 0 0 0
p,«pc)rt Server SYSTÍM ffT MÍJ> *. 0 0 0
seport Server SYSTEM WT ftl^T, ,
R C D c r f fie'ver K- ÍIU-, . . .« e.

ET»meEnGere(13::

tjonnfiúxnsi l

.-7

TechnoEdition SQL Server 2 0 0 8 - Módulo I


Introdução ao SQL Server 2008 TechnoEdition

Database Engine Tuning Advisor

Trata-se de uma ferramenta que analisa os efeitos de workioads (cargas de


trabalho) executados em um ou mais bancos de dados e fornece recomendações
para o ajuste desses bancos. Dentre os ajustes, temos a adição, exclusão e a
modificação da estrutura de desempenho física do banco de dados, como o
particionamento e views indexadas.
[>>^ãfoâ9ie f.t)Qttite Ttinin^ AttvtHX-
Ête Es* ífim âctrans I « * iíndow X

GUIBE -Aííi«mi>(i3toi IS/t/aW l a t t »

5 Toial T Eriot
StcH>p«d 1 Juccess O W.afnri5)

StoppetJ
; Stópped
Stó>pt>ed

T«imgl.s!)


TechnoEdition
Introdução ao SQL Server 2008

Business Intelligence Development Studio

Trata-se de uma ferramenta de gerenciamento para desenvolvedores de soluções


inteligentes de negócios. -
Çte |íSt ^ Pro»cr guM Êetwg C>Xà 5513 Tc^^i •^-^'Í

•• 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

-. Anàívías 5ef v(ce5 Projecta

_ ^ ^ í í 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 : !

j,' D^â Source vw-ws

CcfTTHSçÍKn
j Hans
i gers 1

TechnoEdition SQL Server 2008 - Módulo I


Introdução ao SQL Server 2008 TechnoEdition

O SQL Server Management Studio, incluído no Microsoft Visual Studio, é uma


ferramenta desenvolvida para o gerenciamento de banco de dados do SQL Server.
O ambiente do SQL Server Management Studio nos permite controlar, configurar,
desenvolver e administrar qualquer componente do SQL Server 2008.

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

^ |jit5„, t ™ (í«w»t»*5!Sl«KS SOL SePíSt BussTgss Weligance Oeviáí^aBe!* StiíiíJ


• • isManagenssfitStisSo":

3. Na tela Connect to Server, escolher a opção Windows Authentication para


o campo Authentication e, no campo Server Name, especificar o nome do
servidor com o qual será feita a conexão;

" rSQLServer2008
Introdução ao SQL Server 2008
TechnoEdition _

4. Clicar no botão Connect A interface do SQL Server Management Studio


será aberta, conforme mostra a figura a seguir:
MM
n gíte fm^ £rH)?aíí Ceíxiç X'3c.fe igli^fcM ionifiwníy j^e^

; Nas^Qíuery ^ ^ . _j ^ _

i SeMton "Soíutionr (O pt-

í^^aSCCíSQtSem» 10.0,1600 - S
'*• >iiá CJ3t3fe^5«?

_>J : a^CoríWíted. (l/i)

JNS

7.2. Interface

A interface do SQL Server Management Studio é dividida basicamente em duas partes:


à esquerda está o Object Explorer e à direita está a janela utilizada para escrever e
executar os comandos SQL. Essa janela é chamada de Code Editor.

• Object Explorer

Trata-se de uma ferramenta integrada para a visualização e gerenciamento de


objetos em qualquer tipo de servidor, entretanto, sua capacidade varia de acordo
com o tipo utilizado. Comumente, o Object Explorer inclui as ferramentas de
desenvolvimento de banco de dados e ferramentas de gerenciamento para
o servidor.

TechnoEdition SQL Server 2008 - Módulo I


Introdução ao SQL Server 2 0 0 8
TechnoEdiuon

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

"+ SQL Server Agent

Para configurar as opções dessa ferramenta, devemos clicar em O p t i o n s do menu


Tools, e, em seguida, clicar em S Q L Server Object Explorer.

Para utilizar o Object Explorer é necessário estar conectado a um servidor. Para isso,
devemos proceder de acordo com os seguintes passos:

1. Clicar em Connect, na barra de ferramentas Object Explorer;

2. Escolher o tipo de servidorna lista d r o p - d o w n ;

3. Na caixa de diálogo C o n n e c t to Server, que será aberta, fornecer o nome do


servidor e a informação de autenticação de f o r m a correta.
Introdução ao SQL Server 2008
TechnoEdition

O Object Explorer usa uma estrutura semelhante a uma árvore para agrupar as
informações em pastas, através da qual podemos:

• Expandir as pastas para que mostrem as informações de forma mais detalhada.


Para isso, devemos clicar em + ou clicar duas vezes sobre a pasta;

• 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

O Code Editor do SQL Server Management Studio permite escrever scripts


T-SQL, MDX, DMX, XML^A e XML.

TechnoEdition SQL Server 2008 - Módulo I


TechnoEdition

O SQL Server Management Studio dispõe de dois tipos de contêineres para


gerenciamento dos projetos de banco de dados; projetos e soluções.

O projeto é um conjunto de arquivos, além de metadadados relacionados a ele.


Permite controlar e armazenar, de forma lógica, os itens que compõem a aplicação
de banco de dados. Já a solução é constituída por um ou mais projetos e tem como
finalidade controlar a maneira como os projetos são agrupados.

Os contêineres de gerenciamento podem conter objetos, tais como scripts, consultas


(quenes), informações de conexão e arquivos que necessitamos criar para uma solução
de banco de dados. Esses objetos são chamados de itens.

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.

Para controlar arquivos e projetos inseridos em uma solução, o Solution Explorer


oferece uma a visualização em árvore de toda a solução.

7.4» Acessando um banco de dados


A barra de ferramentas SQL Editor do SQL Server Management Studio possui
uma lista drop-down chamada Available Databases, por meio da qual podemos
escolher o banco de dados que desejamos acessar. Para escolher um banco de dados,
devemos fazer o seguinte:

1. Na barra de ferramentas SQL Editor, clicar na seta da lista Available


Databases. Caso essa lista não esteja sendo exibida, clicar no botão Toolbar
Options (botão de seta para baixo localizado na extremidade direita da barra
SQL Editor) e, em seguida, em Add or Remove Buttons e em SQL Editor.
Então, marcar a opção Available Databases;
Introdução ao SQL Server 2008
TechnoEdition

2. Na lista exibida, selecionar o nome de um banco de dados.


master

Brasil
Compras
Empréstimos
Japão
Loja
master
Mercado
model
imsdb
i Pedidos
ReportSefver

Para executar um comando a partir do SQL Server Management Studio, adotamos os


seguintes procedimentos;

1 Escrever o comando desejado no Code Editor. Enquanto um comando é


digitado no Code Editor, o SQL Server oferece um recurso denominado
IntelliSense, o qual destaca erros de sintaxe e digitação, e fornece ajuda para a
utilização parâmetros no código. IntelliSense está ativado por padrão, mas pode
ser desativado.
USE VEN|

• J tola :
, J master
_ J Mercado
J íirtodef
J msdb
J Pedidos
J ReportServer
J ReportServerTempDB
J tempdb

2. Selecionar o comando escrito. A seleção é necessária apenas quando comandos


específicos devem ser executados, dentre vários;

3. Na barra de ferramentas SQL Editor, clicar sobre o ícone Execute ou pressionar


a tecla F5 para que o comando seja executado. O resultado do comando será
exibido na parte inferior da interface, conforme a figura a seguir:

TechnoEdition raT SQL Server 2008 - Módulo I


Introdução ao SQL Server 2008
TechnoEdition

SQLQueryLsql-...(Strator (55))* [
CP.EÂ1Z í>k7ÁBã:St fORNECEIíÕREÍ

JLl'

CoimaindtsS c o m p l e t e d sucoessíuXiy.

/a Qowy executed successfuly.|;| iSUIDEÍlO.tJRTM) ; GUIDSsAtesínístrator : tnaster | 00:00;00 [Ortum

• 1^oi
t possível o,cuftaT o tesacorna'
CO'

CTRL-

SQL Server 2 0 0 8 - Módulo I


TechnoEdition
Introdução ao SQL Server 2 0 0 8

.6. Salvando scripts

Para salvar os scripts utilizados, devemos seguir os passos:

1. Ir até o menu File;

2. Clicar em Save As;

3. Digitar o nome escolhido para o script;

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.

TechnoEdition SQL Sef^er 2 0 0 8 - Módulo I


Introdução ao SQL Server 2 0 0 8
TechnoEdition

opícos para revisao ao capiiuio-


A t e n t e para os tópicos a seguir. Eles d e v e m ser e s t u d a d o s com muita atenção,
pois r e p r e s e n t a m os p o n t o s mais importantes do capítulo:

• O Microsoft SQL Server 2 0 0 8 é definido como uma plataforma de banco de


dados utilizada para armazenar dados e processá-los tanto em um f o r m a t o
relacional quanto em documentos XML. Também, é utilizado em aplicações de
comércio eletrônico e atua como uma plataforma inteligente de negócios para
integração e análise de dados, bem como de soluções;

• A SQL é uma linguagem que se apoia no modelo de dados relacional;

• A linguagem Transact-SQL, criada pela Microsoft, contém a linguagem SQL e os


comandos de uma linguagem procedural;

• 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;

• A arquitetura cliente/servidor resume a ação de um computador cliente se


conectar a um servidor que processa suas solicitações;

• O SQL Server 2 0 0 8 oferece diversos componentes opcionais e ferramentas


relacionadas a eles que auxiliam e facilitam na manipulação de seus sistemas.
Por padrão, n e n h u m 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 m o m e n t o da instalação do SQL
Server 2 0 0 8 ;

• O SQL Server 2 0 0 8 disponibiliza diversas ferramentas de gerenciamento, como


o SQL Server M a n a g e m e n t Studio, o SQL Server Configuration Manager e o
Database Engine Tuning Advisor;

• O SQL Server M a n a g e m e n t Studio, incluído no Microsoft Visual Studio, é


uma ferramenta desenvolvida para o gerenciamento de banco de dados do
SQL Server. O ambiente dessa ferramenta nos permite controlar, configurar,
desenvolver e administrar qualquer componente do SQL Server 2008.
Criando um banco de dados

• Criação de um banco de dados;

• 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.

SQL Server 2008 - Módulo I ' TechnoEdition


Criando um banco de dados

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: „ ^

llll CREATE DATABASE <nome_banco_de_dados> íllB^^^^^

A seguir, temos um exemplo de criação de banco de dados:

IJIIÍBREATE DATABASE SALA_DE_AULA; .:|Í;Í|M^^

A instrução anterior cria dois arquivos: -/uiaií-


-.1:4,.'
• SALA_DE_AULA.MDF: Armazena os dados;

• SALA_DE_AULA_LOG.LDF: Armazena os logs de transações, a ser estudado


posteriormente.

Normalmente esses dois arquivos estão localizados na pasta DATA do diretório de


instalação do SQL Server.

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> :

Para utilizarmos o banco de dados SALA_DE_AULA criado, devemos digitar a


seguinte linha:

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.

TechnoEdition ^ SQL Server 2OO8 - Módulo l


Criando um banco de dados
TechnoEdition

Os dados de um sistema são armazenados em objetos denominados tabelas (table).


Cada uma das colunas de uma tabela refere-se a um atributo associado a uma
determinada entidade. Os datatypes (tipos de dados), ou seja, os formatos utilizados
para a gravação dos dados no disco, deverão ser especificados para cada coluna
da tabela.

Uma tabela encontra-se em uma ou várias partições, ou seja, unidade(s) definida(s)


pelo usuário para a organização de dados. Por padrão, uma tabela será localizada em
uma única partição, que por sua vez reside em um só grupo de arquivo.

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:

• <nome_tabela>: É o nome da tabela a ser criada;

• <nome_campo1>, <nome_campo2>: São os nomes dos campos a serem


criados na tabela;

• [IDENTITY [(<inicio>.<incremento>)]: IDENTITY indica que a coluna criada


é uma coluna de identidade. Uma tabela não pode ter mais de um campo
IDENTITY (explicado mais adiante). <inicio> é o valor da primeira linha a ser
carregada na tabela e <incremento> é o valor de incremento a ser somado ao
valor de identidade da linha carregada antenormente;
Criando um banco de dados
TechnoEdition

• [NOT NULL]: Determina que a coluna não aceitará valores nulos;

• <data_type> define o tipo de dado para os valores d o campo. Os tipos de dados


disponíveis para um banco de dados do SQL Server serão descritos ainda neste
capítulo; .. ^ ... .

• [DEFAULT <exprDef>]: DEFAULT determina o valor de uma coluna quando u m


valor, durante um INSERT, não é especificado de maneira explícita. <exprDef>
é o valor padrão definido por DEFAULT. Pode ser uma função do sistema, uma
constante ou valor NULL.

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.

A seguir, temos u m exemplo de c o m o criar uma tabela e m u m banco de dados:

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-

TechnoEdition tiast SQL Server 2 0 0 8 - Módulo I


rafilHr Criando um banco de dados TechnoEdition

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.

A seguir, descreveremos as principais categorias de tipos de dados utilizados na ,


linguagem Transact-SQL.

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 _

Seja para Decimal quanto para Numeric, <T> corresponde à quantidade


máxima de algarismos que o número pode ter e <D> corresponde à quantidade
máxima de casas decimais que o número pode ter A quantidade de casas
decimais <D> está contida na quantidade máxima de algarismos <T>. Já a
quantidade de bytes ocupada varia dependendo de <T>.

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-

TechnoEdition 39] SQL Server 2008 - Módulo I


Criando um banco de dados
TechnoEòition

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.

"1" ' 'YV^.ç

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\

pOV ' ,,,, .;no varcharCmax)


aamos a utWizaçao
l^ecomendamos do .po
, ^^^^^ sera f ,-,do de
^^g^es
Criando um banco de dados
TechnoEditíon

4.1 Strings de caracteres Unicode

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.

. mos a utWiaçâo do tipo n


Recomendamos a ^^^^^^ será ^ ^Màe^

4.1.6. Strings binárias

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.

TechnoEdition SQL Server 2008 - Módulo I


^JUHimil^ Criando um banco de dados TechnoEdition

em vez do * ° •J.tQL Se««. * "^^substWKSo

pelotespe<í«°* .estamo arnp

Outros *'hiní: d dado--


Essa categoria inclui tipos de dados especiais, cuja utilização é específica e restrita a
certas situações. A tabela adiante descreve alguns desses tipos:
Nome Descrição
cursor Uma referência a um cursor.
Um tipo de dado que armazena valores de vános tipos
sqLvariant suportados pelo SQL Server. Exceto os seguintes tipos: text,
ntext, timestamp e sqi_variant
Um tipo de dado usado para armazenar um conjunto de
table resultados para processar posteriormente.
Um número binário exclusivo que é atualizado
timestamp
automaticamente.
Compreende um Globally Unique Identifier (GUID), também
conhecido como Identificador Único Global ou Identificador
uniqueidentifier Único Universal. 0 GUID é uma string utilizada para identificar
de maneira única programas, elementos de instalação e
atualizações.

tim. SQL Server 2008 - Módulo I TechnoEdition


Criando um banco de dados Capítulo

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.

Normalmente, as tabelas possuem uma coluna contendo valores capazes de identificar


uma linha de forma exclusiva. Essa coluna recebe o nome de chave primária, cuja
finalidade é assegurar a integridade dos dados da tabela.

O exemplo a seguir cria uma chave primária para a tabela ALUNOS:

DROP TABLE ALUNOS; |

CREATE TABLE ALUNOS


( NUM_ALUNO INT PRIMARY KEY,
NOME VARCHAR(30),
DATA_NASCIMENTO DATETIME,
IDADE TINYINT,
E_MAIL VARCHAR(50),
FONE_RES VARCHAR(14) ,
FONE_COM VARCHAR(14) ,
FAX VARCHAR(14),
CELULAR VARCHAR(14) ,
PROFISSÃO VARCHAR(40),
EMPRESA VARCHAR(50) ) ; "'

,rieoodermos cm .^^^

TechnoEdition írtasT SQL Server 2 0 0 8 - Módulo I


TechnoEdiúon

. 1 . Campo de autonumeração (IDENTITY) --v:, - .


A coluna de identidade, ou campo de autonumeração, é definida pela propriedade
IDENTITY. Ao atribuímos essa propriedade a uma coluna, o SQL Server cria números
em sequência para linhas que forem posteriormente inseridas na tabela em que a
coluna de identidade está localizada.

É 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.

O exemplo a seguir ena uma coluna IDENTITY na tabela ALUNOS:

DROP TABLE ALUNOS;

CREATE TABLE ALUNOS


{ NUM_ALUNO INT IDENTITY PRIMARY KEY,
NOME VARCHAROO) ,
DATA_NASCIMENTO DATETIME,
IDADE TINYINT,
E_MAIL VARCHAR(50),
FONE_RES VARCHAR(14),
FONE_COM VARCHAR(14),
FAX VARCHAR(14),
CELULAR VARCHAR(14),
PROFISSÃO VARCHAR(40),
EMPRESA VARCHAR(50) I ;
Criando um banco de dados

insennao aa
Para acrescentar novas linhas de dados em uma tabela, utilizamos o comando INSERT,
que possui a seguinte sintaxe:

INSERT [INTO] <nQme_tabela>


[ ( <lista_de_colunas> ) ]
{ VALUES ( < l i s t a _ d e _ e x p r e s s o e s l > ) ''[,' ' l|ÍÍ|ilB^^^^
(<lista_de_expressoes2>)] [,...] I
,<comando s e l e c t > }

Em que:

• <lista_de_colunas>: É uma lista de uma ou mais colunas que receberão dados.


Os nomes das colunas devem ser separadas por vírgula e a lista deve estar entre
parênteses;

• VALUES: Insere uma ou mais listas de valores de dados. Essas listas


são representadas na sintaxe por <lista_de_expressoes1>, lista_de_
expressoes2>..., as quais devem estar entre parênteses e separadas por vírgula.
Esses valores são transformados em uma ou mais linhas da tabela.

Vejamos a seguir como podemos utilizar o INSERT para acrescentar linhas em tabelas
de um banco de dados do SQL Server.

• Inserindo uma única linha em uma tabela

O código adiante insere uma única linha na tabela ALUNOS:

INSERT INTO ALUNOS


(NOME, DATA_NASCIMENTO, IDADE, E_MAIL,
FONE_RES, FONE_COM, FAX, CELUL-".-,
PROFISSÃO, EMPRESA )
VALUES
('CARLOS MAGNO', '1959.11.12', 49, 'magno@magno.com',i
• '1123456789','1123459876','', '1198765432',
.'ANALISTA DE SISTEMAS', 'IMPACTA TECNOLOGIA')

TechnoEdition nosT SQL Server 2008 - Módulo I


Criando um banco de dados

Feita a inserção, consultaremos os ciados da tabela ALUNOS:

SELECT,, * FROM ALUNOS; JgSgM^^^ ,^

O resultado é o seguinte:

• Inserindo várias linhas em uma tabela

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:

INSERT INTO ALUNOS


(NOME, DATA_NASCIMENTO, IDADE, E_MAIL,
FONE_RES, FONE_COM, FAX, CELULAR,
PROFISSÃO, EMPRESA )
VALUES
{'EURICO ELE POBRE', '1980.1.2', 2 8 , ' e - u r i c o g e u r i c o . com' ,
'1123456789', '1123459876', ' ', '11987 65432',
'ANALISTA DE SISTEMAS', 'SOMA INFORMÁTICA'),
('EUVIRA GARRAFA', ' 1 9 8 3 . 4 . 2 1 ' , 28, ' e u v i r a g e u v i r a . c o m ' ,
S: '1123456789', '1123459876', ' ', '1198765432', ,
•'INSTRUTOR', 'IMPACTA TECNOLOGIA');

-- 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^^

• Inserindo o resultado de um SELECT

Também , é possível utilizar o INSERT para insenr o resultado de uma instrução


SELECT, como demonstrado no código adiante:

CREATE TABLE ALUN0S2


(NUM_ALl •: INT,
NOME VARCKAR(30) ,
DATA_NASCIMENTO DATETIME,
IDADE TINYINT,
E_MAIL VARCHAR(50) ,
FONE RES VARCHAR(14) ,

SQL Server 2008 - Módulo I TechnoEdition


r Criando um banco de dados Capitu
TechnoEdition

FONE_COM VARCHAR(14),
FAX VARCHAR(14),
CELULAR VARCHAR(14) ,
PROFISSÃO VARCHAR(40) ,
EMPRESA VARCHAR(50)

INSERT INTO ALyN0S2


SELECT * FROM ALUNOS;

Não é necessário determinar os nomes das colunas na sintaxe do comando


INSERT quando os valores são inseridos na mesma ordem física das colunas no
r banco de dados. Já para valores inseridos aleatoriamente, é preciso especificar
exatamente a ordem das colunas. Esses dois modos de utilização do comando
INSERT são diferenciados por duas denominações: INSERT posicionai e INSERT
declarativo.

6.1. INSERT posiciona

o comando INSERT posicionai deve ser utilizado quando precisamos incluir


dados de acordo com a ordem física das colunas. Vejamos um exemplo a seguir:

INSERT INTO ALUNOS


(NOME, DATA_NAS CIMENTO, IDADE, EjyiAIL,
FONE_RES, F0NE_C0M,FAX, CELULAR,
PROFISSÃO, EMPRESA )
VALUES
('PEDRO PAULO', '1994.2.5', 15, 'peciro@peciro.com',
'1123456789', '1123459876','', '1198765432',
'ESTUDANTE', 'COLÉGIO MONTE VIRGEM')

-- Consultancio os ciacios
SELECT * FROM ALUNOS

^ TechnoEdition SQL Server 2008 - Módulo I .


Capítulo 2 Criando um banco de dados TechnoEdition

6.2. ÍNSERT declarativo


o INSERT declarativo deve ser utilizado quando desejamos incluir dados na
tabela de modo que possamos escolher a ordem em que tais valores serão
adicionados. Vejamos o próximo exemplo;

INSERT INTO ALUNOS


VALUES
('MARIA LUIZA', '1997.10.29', 15, 'luiza@luiza.com',
'11234 567 89','1123459876','', '11987 65432',
'ESTUDANTE', 'COLÉGIO MONTE VIRGEM')

— 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.

• Constantes de cadeia de caracteres

Compreendem caracteres alfanuméricos (de A a Z, maiúsculas e minúsculas, e


de O a 9) e caracteres especiais, como #, ! e @, e devem ser especificadas entre
aspas simples.

Exemplos: ' ' ^^'^^

'IMPACTA TECNOLOGIA", 'SQL-SERVER', 'XK-18Õ8/2',

Caso o conteúdo do texto possua o caractere apóstrofo, ele deve ser repetido,
como mostrado a seguir:

CAIXA D' 'AGUA'^,

• Cadeias de caracteres Unicode

Esse tipo é parecido com as cadeias de caracteres no aspecto do formato, com a


diferença de serem precedidas pela letra maiúscula N (identificador).

Exemplos:

IN'IMPACTA TECNOLOGIA', N'SQL-SERVER', N'XK-1808/2'

• Constantes binárias

São cadeias de números hexadecimais e apresentam as seguintes características:

Não são incluídas entre aspas;

Possuem o prefixo Ox.

Exemplos:

TechnoEdition SQL Server 2008 - Módulo I


Criando um banco de dados

• Constantes datetime

Utilizam valores de data incluídos em formatos específicos. Devem ser incluídos


entre aspas simples. ,^

Exemplos:

'2009.1.15', '20080115', '01/15/20 OB', '22:30:10', ''L*Ws^^


2O O 9.1.15 22:30:10'

O formato da data pode variar dependendo de configurações do SQL Server.


Podemos também utilizar o comando SET DATEFORMAT para definir o formato
durante uma seção de trabalho.

• 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

São constantes representadas por notação científica.

Exemplos:

2 . 53E4 2 . 5 3 X 104 2 . 5 3 X 10000 25300


:4.5 / 102 4 . 5 / 100 0.045

SQL Server 2008 - Módulo I < -''.P^ TechnoEdition


Criando um banco de dados

• 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:

162 .45 "^'^^^^^^^^^


5.7 8 liililH^^^^^^^
Em constantes desse tipo, o separador decimal sempre será o ponto,
independentemente das configurações regionais do Windows.

TechnoEdition ri39i SQL Server 2008 - Módulo I


Criando um banco de dados TechnoEdition

• 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)

*•

SQL Server 2008 - Módulo I TechnoEdition


Criando um banco de dados Capítulo
TechnoEdition

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.

7.1.1. Regras de normalização

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). ,

^ TechnoEdition -ST SQL Server 2008 - Módulo I


Criando um banco de dados
TechnoEdition

Consideramos um o banco de dados está na first normal form quando a primeira


regra (INF) é cumprida. Se as três regras forem cumpridas, o banco de dados estará
na third normal form.

\icações.

Vejamos quais as regras que devem ser cumpridas para atingir cada nível de ^
normalização:

• First Normal Form (INF) ,

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.

Uma tabela sempre terá um formato como o exibido a seguir:


CAMPO 1 CAMPO 2 CAMPO 3 CAMPO 4

Já o formato exibido adiante nunca poderá ser característica de uma tabela de


um banco de dados do SQL Server:
CAMPO 1 CAMPO 2 CAMPO 3 CAMPO 4 i

TechnoEdition
Criando um banco de dados
TechnaEdition _

Vejamos as seguintes considerações: • • , ^

• 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;

• Um aluno da Impacta tem apenas um nome, um RG e um CPF, mas pode ter N


telefones. Percebemos aqui que a tabela ALUNOS que criamos anteriormente
precisa ser reestruturada para que respeite a primeira forma normal.

Caso tenhamos uma linha de tabela com várias informações relacionadas a ela,
deveremos criar uma outra tabela para armazenar essas informações.

Consideremos o caso de um aluno registrado na tabela ALUNOS. Ele possui diversos


números de telefone. Nesse caso, precisaremos criar outra tabela, a qual irá conter os
diferentes números de telefone desse aluno:

DROP TABLE ALUNOS

CREATE TABLE ALUNOS


( NUM_ALUNO TNT IDENTITY PRIMARY KEY,
NOME VARCHAR(30) ,
D A T A _ N A S C IMENTO'" DATETIME,
IDADE TINYINT,
E _ M A i L 'V'':-"'^'!!!:! V A R C H A R (50) ,„.:;,.^_
PROFISSÃO ''iíiiiii VARÇHAR(40),
EMPRESA 'lÊlem V A R C H A R (50) ) ;

CREATE TABLE FONES


i NUM_ALUNO PNT,
FONE ICHAR(14),
TIPO Í ¥ A R C H A R (15) ,3
PRIMARY KEY' (NUM_ALUNO; FONE) )

Na tabela FONES criada, a chave primária é formada por 2 campos, NUM_ALUNO e


FONE. Isso impedirá que um mesmo número de telefone seja cadastrado mais de uma
vez para o mesmo aluno.

TechnoEdition "ih'- SQL Ser'ver 2008 - Módulo I


Criando um banco de dados
TechnoEdition

No exemplo a seguir, o primeiro INSERT insere dados dos alunos na tabela A L U N O S ,


enquanto o segundo adiciona dados de telefone dos alunos na tabela FONES:

INSERT INTO ALUNOS íf:,eí•^^S


; i^^^
(NOME, DATA_NAS C l MENTO, IDADE, E-MAIL,
PROFIS SAO, EMPRE SA )
VALUES
('CARLOS MAGNO', ' 1 9 5 9 . 1 1 . 1 2 ' , 4 9 , 'magno9magno.com','
"ANALISTA DE SISTEMAS', 'IMPACTA TECNOLOGIA'),
('EURICO E ELE POBRE', '1980.1.2', 2 8 , ' e u r i c o Q e u r i c o . c o m ' ,
iv,,,,.,,'ANALISTA DE SISTEMAS', 'SOMA I N F O R M Á T I C A " ) ,
f ('EUVIRA GARRAFA' , ' 1983.4 . 2 1 ' , 2 8 , ' e u v i r a S e u v i r a . com'., i!|v^|||.
• 'INSTRUTOR', 'IMPACTA TECNOLOGIA'),
. (' PEDRO PAULO' , '1994.2.5', 1 5 , ' p e d r o S p e d r o . com' • :Í|i:Í
•ESTUDANTE', ' C O L É G I O MONTE VIRGEM"),
("MARIA LUIZA", " 1 9 9 7 . 1 0 . 2 9 " , 1 5 , ' l u i z a ( a i u i z a ' . cdiS'','' -.llli;^^^^^^^
"ESTUDANTE", ' C O L É G I O MONTE VIRGEM")

i^;;1:ÍlNSERT INTO FONES •^iillSII^^^^^^^^^^^^^^^


ISÊM NUM_ALUN0, FONE, TIPO )'' ^ ^ \ Í Í | ' Í K
lliif VALUES
II • ( 1,'1128'739988','RESI DENDI AL ' ) , ^
III( 1 , '1168336989','COMERCIAL'),
IIIU 1 , ' 1 1 9 1 2 5 9 9 7 6 ' , 'CELULAR' ) , ,
" '•'( 2, '1192736266',' CELULAR' ) , ' •|ÍiÍÍ||Í;|Í
. ( 3, ' 11524172 62 ', ' COMERCIAL ' ) rllilH^^^^^^^^^
( 3, '1198271717',' CELULAR' ) ,
( 5, '1177162525", 'RESIDENDIAL')

fROM •ALUNOS
•''•'•'SEÍElcf'"'"*
,L: SELECT;,,* FROM FONES

O resultado do código anterior é o seguinte:

1 « l NOME IDADE E.MAIL FfiOFiSSâC 1 EMPRESA


[1 CARLOS M A È N O 1959.n-12al;lXKB(B0 •t« AíJAiJSTAD£S!STEtA4S IMPACTA T E C H O L O G í í . ,

EURICO £ ELE POBRE 138WJt-02i»l»OaOOO 28 eufKo^iewca corri A f t ò i l S T A D E SISTEMAS SOMA I N F O R M Á T I C A

3 3 EUVlRASARRifA 1983-M-21 O O O O O O O Í M 2S INSTRUTOR l«P4C!AT£CW0LOG»


i i PEORO PAULO 1334-n2.t6 0Q!S:EQO0O0 15 ESTUWI^TE COLÍGfflMOMÍEVIRQEi

5 5 MAftUi L U O 1 9 9 M 0 - 2 9 O 0 O Í J 0 0 000 15 !lJÍ3a@tlJG3,C0ri-l ESIUtíANTE C O L Í G f â M O N I E V1RGE(

MUM,ALUNO FOME 1 TÍF>0 1


1 : 1 «28735388 RESIOENDiAL
2 ! 1IK336989 COMERCtii

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 _

Second Normal Form (2NF) C Í I J A ; M/^I I

No segundo nível de nornnalização, devemos criar tabelas separadas para


conjuntos de valores que se aplicam a vários registros, ou seja, que se repetem.

Com a finalidade de criar relacionamentos, devemos relacionar essas novas


tabelas com uma chave estrangeira e identificar cada grupo de dados
relacionados com uma chave primária. '

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

Essas diversas formas de grafar o nome da profissão torna inviável a geração


de um relatório com a filtragem de ALUNOS por PROFISSÃO. Neste caso, a
solução é criar uma tabela de profissões em que cada profissão tenha um código.
Além disso, substituiremos, na tabela ALUNOS, o campo PROFISSÃO por COD_
PROFISSÃO:

DROP TABLE ALUNOS

CREATE TABLE ALUNOS


( NUM_ALUN0 INT IDENTITY PRIMARY KEY,
NOME VARCHAR(30),
DATA_NASCIMENTO DATETIME,
IDADE TINYINT,
E_MAIL VARCHAR(5 0) ,
C0D_PR0FISSA0 INT,
COD EMPRESA INT ) ;

CiREATE TABLE PROFISSÕES


{ C0D_PR0FISSA0 INT IDENTITY PRIMARY KEY,
. PROFISSÃO (30) )

TechnoEdition SQL Server 2008 - Módulo I


Criando um banco de dados

;|| I N S E R T INTO PROFISSÕES


| Í : . ( PROFISSÃO )
l l l v A L U E S {'ANALISTA DE SISTEMAS'),'
l i ' {'INSTRUTOR'), ('ESTUDANTE')

::|;' SELECT * FROM PROFISSÕES

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) )

|:|;1NSERT INTO EMPRESAS


|||: ( EMPRESA )
fliVALUES ('IMPACTA TECNOLOGIA'), ('SOMA I N F O R M Á T I C A ' ) ,
('COLÉGIO MONTE VIRGEM') ímMS:^^'

SELECT * FROM EMPRESAS

INSERT INTO ALUNOS ••|ÍÍÍIfc


(NOME, DATA__NASCIMENTO, IDADE, E__MAIL,'
COD__PROFISSAO, COD_EMPRESA )
IIIYALUES
111 ('CARLOS MAGNO', '1959.11.12', 49, " magno@rTíagno. com' ,
' 1, 1),
{'EURICO E E L E POBRE', '1980.1.2', 28, ' e u r i c o @ e u r i c o . c o m ' ,
1, 2 ) ,
i | i , { ' E U V I R A GARRAFA', '1983. 4.21', 28, ' e i i v i r a @ e u v i r a . cora',

|||r( ' PEDRO PAULO' ,


III
'1994 .2.5', 15, 'pedroíapedro . (;.\-!' ,
3, 3),
Í|f('MARIA L U I Z A ' , '1997.10.29', 15, ' l u i z a 8 l u i za.com',M
li' 3, 3)
lliSELECT * FROM ALUNOS

O resultado do código anterior é o seguinte:

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

mu AlUtiO 1 NOME j tlÀTí NASCIMENIB lOAOE í E ttó!L cot .PROFISSÃO tC0e.£MPRE&4 j


1 íl j « R L O S MífiíJO IKS-ll-líKlOOMOCti 4S í T
2 2 EUflIDSEELf POeftÉ I»««Í»ÍO:«0«( 28 í 2
3 ÊUMBASÍÍltíAfA fSê3-04-21 MiOttM.O» 2S e«viía#eyvsa. com 2 1
i 4 PEDRO PAULO iM4-a2-OÇ(B:COOaa» 15 3 3
S i MAfíiíiLUiai mTAQ-ammmmt IS 3

SQL Server 2008 - l\/lódulo I TechnoEdition


TechnoEdition ^
Criando um banco de dados

• Third Normal Form (3NF)


No terceiro nível de normalização, após ter concluído todas as tarefas do INF e
2NF, devemos eliminar os campos que não dependem de chaves primárias.
Cumpridas essas três regras, atingimos o nível de normalização requerido pela maioria
dos programas. - • ' 9. -.^
Exemplos:
Em uma tabela de PRODUTOS que tenha os campos PRECO_COMPRA e
PRECO_VENDA, não devemos ter um campo LUCRO, pois ele não depende do
código do produto (chave primária), mas sim dos preços de compra e de venda.
O lucro será facilmente gerado através da expressão PRECO_VENDA - PRECO_
CUSTO,
Na tabela ALUNOS, não devemos ter o campo IDADE, pois eia não depende do
número do aluno (chave pnmária), mas sim do campo DAJA^NASCIMENTO.

Vejamos o seguinte exemplo, que elimina o campo IDADE da tabela ALUNOS e


calcula a idade do aluno: .,r--,',.-,>A

— • E l i m i n a r o campo IDADE da t a b e l a ALUNOS ••<||Í|Íi!íl;:ÍA:;iÍÍ


ALTER TABLE ALUNOS DROP COLUKN,, IDADE,,
f— C a l c u l a r a IDADE ,do ALUNO
iSELECT *,
:^ CAST ( (GETDATEír - DATA_NASCIMENTO) AS FLOAT)/365 . 25 AS
:•• IDADE , ..
FROM .ALUNOS

Por fim, o banco de dados SALA_DE_AULA ficou com a seguinte estrutura:


ALUNOS » PROFISSÕES •

EMPRESAS •
eco

FONES '
•5 v_i

TechnoEdition si SQL Server 2008 - Módulo I


Capitu Criando um banco de dados
TechnoEdition

Tópicos para revisão do c a p i i u i 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:

• 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;

• Os dados de um sistema são armazenados em objetos denominados tabelas


(table). Cada uma das colunas de uma tabela refere-se a um atributo associado
a uma determinada entidade. A instrução CREATE TABLE deve ser utilizada para
criar tabelas dentro de bancos de dados já existentes;

• 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;

• Normalmente, as tabelas possuem uma coluna contendo valores capazes de


identificar uma linha de forma exclusiva. Essa coluna recebe o nome de chave
primária, cuja finalidade é assegurar a integridade dos dados da tabela;

• Para acrescentar novas linhas de dados em uma tabela, utilizamos o comando


INSERT;

• 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.
• Consulta de dados;
• SELECT;
• Ordenação dos dados;
• Filtragenn de consultas;
• Manipulação de campos datetime.
Capitu Consultando dados
TechnoEdition

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.

Na linguagem SQL, o principal comando utilizado para a realização de consultas é o


SELECT. Por meio dele, torna-se possível consultar dados pertencentes a uma ou mais
tabelas de um banco de dados.

No decorrer deste capítulo, serão apresentadas as técnicas de utilização do comando


SELECT, bem como algumas diretrizes para a realização de diferentes tipos de
consultas SQL.
Consultando dados
TechnoEdition

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.

A sintaxe de SELECT, com seus principais argumentos e cláusulas, é exibida a seguir:

SELECT [DISTINCT] [TOP '{N) [ P E R C È N T r [WITH f l E S ] ]


< l i s t a _ d e _ c o l u n a s > [INTO <nome_tabela>]
FROM t a b e l a i [JOIN t a b e l a 2 ON expressaoJoin [, JOIN
t a b e l a S ON e x p r J o i n [ , . . . ] ] ]
[WHERE < c o n c i i c a o F i l t r o L i n h a s > ]
[GROUP BY < l i s t a E x p r G r u p o > [HAVING <con(lióaoFiltròGrupo>] ]
[ORDER BY <campol> {[DESC] | [ASC]} [, <campo2> {[DESC] |
.[ASC]} , [ , . . . ] ] ]

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;

• <lista_de_colunas>: Colunas que serão selecionadas para o conjunto de


resultados. Os nomes das colunas devem ser separados por vírgulas. Caso tais
nomes não sejam especificados, todas as colunas são consideradas na seleção;

• [ INTO nome_tabela ]: nome_tabela é o nome de uma nova tabela a ser


criada com base nas colunas especificadas em <lista_de_colunas> e linhas
especificadas por meio da cláusula WHERE;

• FROM tabelai [JOIN tabela2 ON exprJoin [, JOIN tabelaS ON exprJoin


[,...]]]: A cláusula FROM define tabelas utilizadas no SELECT. expressaoJoin é
a expressão necessária para relacionar as tabelas da cláusula FROM. tabelai,
tabela2,... se referem às tabelas que possuem os valores utilizados na condição
de filtragem <condicaoFiltroLinhas>;

^ TechnoEdition émf SQL Server 2008 - Módulo I


Capítulo 3 Consultando dados
TechnoEdition

• [WHERE <condicaoFiltroLinhas>]: A cláusula WHERE aplica uma condição


de filtro que determinará quais linhas farão parte do resultado. Essa condição é
especificada em <condicaoFiltroLinhas>;

• [GROUP BY <listaExprGrupo>: A cláusula GROUP BY agrupa uma quantidade


de linhas em um conjunto de linhas resumidas por valores de uma ou várias
colunas ou expressões. <listaExprGrupo> representa a expressão na qual será
realizada a operação por GROUP BY;

• [HAVING <condicaoFiltroGrupo>]]: A cláusula HAVING define uma condição


• de busca para o grupo de linhas a ser retornado por GROUP BY;

• [ORDER BY <campo1> {[DESC] | [ASC]} [, <campo2> {[DESC] | [ASC]} [,...]]]:


A cláusula ORDER BY é utilizada para determinar a ordem em que os resultados
são retornados. Já campo2, campo2,.„ são as colunas utilizadas na ordenação
dos resultados;

• {[DESC]/[ASC]}: ASC determina que os valores das colunas especificadas em


campol, campoZ... sejam retornados em ordem ascendente, enquanto DESC
retorna esses valores em ordem descendente. As duas opções são opcionais e
a barra indica que são excludentes entre si, ou seja, não podem ser utilizadas
simultaneamente. As chaves indicam um grupo excludente de opções. Se
nenhuma delas for utilizada, ASC será assumido.

Para consultarmos uma lista de colunas de uma determinada tabela de um banco de


dados, simplesmente podemos utilizar a seguinte sintaxe:

SELECT < l i s t a de colunas> FROM < t a b e l a > ''S'^''''^''-'-^''''^'


SQL Server 2008 - Módulo I TechnoEdition


Consultando dados

Em que:

• <lista_de_colunas>: Representa o nome da coluna ou colunas a serem


selecionadas. Quando a consulta envolve mais de uma coluna, elas deverão
ser separadas por vírgula;

• tabela: É o nome da tabela a partir de onde será feita a consulta.

Para especificar o banco de dados de origem das tabelas - a partir do qual as -


informações serão consultadas - utiliza-se a instrução USE seguida pelo nome do
banco de dados, da seguinte maneira:

-O USE <nome_banco_de_dados>

Essa instrução deve ser especificada na parte inicial da estrutura de código,


anteriormente às instruções destinadas à consulta. Os exemplos mais adiante
demonstrarão como utilizá-la junto ao SELECT.

^ 2 Consultando todas as colunas

Pnmeirãrr^Qnie, devemos registrar no SQL-Server o banco de dados PEDIDOS, que está


em C:\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>

SELECT * FROM < t a b e l a >

r TechnoEdition .^^sT SQL Server 2008 - Módulo I


apitulo Consultando dados
TechnoEdition

O código a seguir consulta todas as colunas da tabela EMPREGADOS do banco de


dados PEDIDOS:

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 <nome_banco_de_dados> ||Í||ÍM^^^^^

SELECT < C o l u n a l , Coluna2,' '.'T;>'" FROM <tabela>"""' 'IB^^^ '


O código a seguir consulta as colunas CODFUN, NOME e SALÁRIO da tabela
EMPREGADOS:

USE PEDIDOS;
:SELECT CODFUN, NOME, ' SALÁRIO FROM EMPREGADOS"

23» Consultando colunas por meio de alias


o nome de uma coluna ou tabela pode ser substituído por uma espécie de apelido
que é criado para facilitar a visualização. Esse apelido é chamado de alias.

Costuma-se utilizar a cláusula AS a fim de facilitar a identificação do alias. No


entanto, não é uma obrigatoriedade. A sintaxe para a utilização de alias é descrita
a seguir:

SELECT <Colunal> [[AS] < n o m e _ a l i a s > ] ,


<Coluna2> [[AS] <nome_alias>] [,..."
FROM <tabaJa>
Consultando dados Capítulo

Vejamos o seguinte exemplo de consulta com uso de aliases:

USE PEDIDOS;

SELECT CODFUN AS Codigo,


NOME AS Nome, SALÁRIO AS Salário
FROM EMPREGADOS
-- A p e l i d o contendo c a r a c t e r e s e s p e c i a i s (espaço)
SELECT CODFUN AS Código, NOME AS Nome, SALÁRIO AS Salário,
DATA_ADMISSA0 AS [Data de Admissão]
FROM EMPREGADOS
-- Campo c a l c u l a d o
SELECT CODFUN AS Codigo,
NOME AS Nome,
SALÁRIO AS Salário,
SALÁRIO * 1.10 [Salário com 10% de Aumento]
FROM EMPREGADOS

',Qj -í: í» <^'r, í

r TechnoEdition SQL SerVer 2008 - Módulo I


Consultando dados
TechnoEdition

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.

Utilizamos a cláusula ORDER BY em conjunto com o comando SELECT a fimde


retornar os resultados de consulta de uma tabela em uma determinada ordem.

3,1. Retornando linhas na ordem ascendente


A cláusula ORDER BY pode ser utilizada com a opção ASC, a qual faz com que as
linhas sejam retornadas em ordem ascendente.

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

.2. Retornando linhas na ordem descendente


A cláusula ORDER BY pode ser utilizada com a opção DESC, a qual faz com que as
linhas sejam retornadas em ordem descendente.

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

3.3. Ordenando por nome ou posição


É possível utilizar a cláusula ORDER BY para ordenar dados retornados utilizando
como critério o nome ou número referente à posição, no SELECT, da coluna a
ser ordenada.

• Ordenando por uma coluna

O exemplo adiante descreve como devemos proceder para que os dados da


tabela sejam retornados e exibidos de acordo com o nome da coluna:

USE PEDIDOS,

SELECT CODFUN, NOME, DATA_ADMISSAO, SALÁRIO


FROM EMPREGADOS
ORDER BY NOME

Vejamos outros exemplos de retorno de dados de acordo com o nome


da coluna:

SELECT CODFUN, NOME, DATA_ADMISSAO, SALÁRIO


FROM EMPREGADOS
ORDER BY SALÁRIO

SELECT CODFUN, NOME, DATA_ADMISSA0, SALÁRIO


FROM EMPREGADOS
ORDER BY DATA ADMISSÃO
Consultando dados
TechnoEdition

Já o exemplo a seguir retorna dados de acordo com a posição da coluna no


SELECT:

USE PEDIDOS

SELECT CODFUN, NOME, •DATA_ADMISSAO, SALÁRIO


FROM EMPREGADOS
ORDER BY 2

Vejamos outros exemplos de retorno de dados de acordo com a posição


da coluna:

iSELECT CODFUN, NOME, DATA_ADMISSAO, SALÁRIO


FROM EMPREGADOS
ORDER BY 4

SELECT CODFUN, NOME, DATA_ADMISSAO, SALÁRIO


FROM EMPREGADOS
ORDER BY 3

• Ordenando por várias colunas Jo

Também, é possível utilizar a cláusula ORDER BY para ordenar os dados por


várias colunas com base nos nomes de várias colunas e nas posições das colunas
no SELECT.

O exemplo a seguir mostra como realizar a ordenação de acordo com os nomes


das colunas: ... . . . . . ., . . .

USE PEDIDOS

SELECT COD_DEPTO, NOME, DATA_ADMISSAO, SALÁRIO


FROM EMPRE GADOS
ORDER BY COD DEPTO, SALÁRIO
Consultando dados
TechnoEdition _

Vejamos outros exemplos dessa ordenação de dados: '

SELECT COD_DEPTO, NOME, DATA_ADMISSAO, SALÁRIO


FROM EMPREGADOS
ORDER BY COD_DEPTO DESC, SALÁRIO

SELECT C0D_DEPT0, NOME, DATA_ADMISSA0, SALÁRIO


FROM EMPREGADOS
ORDER BY C0D_DEPT0, SALÁRIO DESC

SELECT COD_DEPTO, NOME, DATA_ADMISSAO, SALÁRIO


FROM EMPREGADOS
ORDER BY COD_DEPTO DESC, SALÁRIO DESC
SELECT COD_DEPTO, NOME, DATA_ADMISSAO, SALÁRIO
FROM EMPREGADOS
ORDER BY COD_DEPT0 DESC, SALÁRIO DESC

Já o exemplo adiante ordena de acordo com a posição das colunas no SELECT:

USE PEDIDOS

SELECT C0D_DEPT0, NOME, DATA_ADMISSA0, SALÁRIO


FROM EMPREGADOS
ORDER BY 1, 4

Vejamos outros exemplos dessa ordenação:

SELECT C0D_DEPT0, NOME, DATA_ADMISSA0, SALÁRIO "


FROM EMPREGADOS
ORDER BY 1 DESC, 4

SELECT COD_DEPTO, NOME, DATA_ADMISSAO, SALÁRIO


FROM EMPREGADOS
ORDER BY 1, 4 DESC

SELECT COD_DEPTO, NOME, DATA_ADMISSAO, SALÁRIO


FROM EMPREGADOS
.ORDER BY 1 DESC, 4 DESCiÍl||M^^^^^^

r TechnoEdition ,31 SQL Server 2008 - Módulo I


Consultando dados

ORDER BY com TOP


Como resultado de uma consulta a uma tabela de banco de dados, temos a
opção de retornar a quantidade de linhas desejada, a partir da pnmeira linha
selecionada. Para isso, utilizamos a cláusula TOP.

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 p r i m e i r o s empregados de acordo com a chave


— primária
SELECT, TOP 5 * FROM EMPREGADOS

-- 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

— L i s t a os 5 empregados mais novos


SELECT TOP 5 * FROM EMPREGADOS
ORDER BY DATA__ADMISSAO DESC

— L i s t a os 5 empregados que ganham menos


SELECT TOP 5 * FROM EMPREGADOS
ORDER BY SALÁRIO .^M^^U^

-- L i s t a os 5 empregados que ganham.mais


SELECT TOP 5 * FROM EMPREGADOS
ORDER BY SALÁRIO DESC

Úmk SQL Server 2 0 0 8 - Módulo I TechnoEdition


Consultando dados

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..

TechnoEdition SQL Server 2008 - Módulo I


Consultando dados
TechnoEdition

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.

A cláusula WHERE é utilizada da seguinte maneira:

USE <nome_banco_de_dados>

SELECT < l i s t a _ d e _ c o l u n a s >


FROM <nome_da_tabela>
WHERE < c r i t e r i o >

Em que:

• <nome_banco_de_dados>: Refere-se ao nome do banco de dados em que a


fonte de dados está localizada;

• <lista_de_colunas>: É a coluna ou colunas consultadas;

• <nome_da_tabela>: É a tabela na qual estão localizadas as colunas a serem


consultadas;

• <criterio>: É o critério adotado para o conjunto de resultados obtido com


SELECT.

SQL Server 2008 - Módulo I TechnoEdition


Consultando dados Capítulo 3
TechnoEdition „

4.1. Consultando com ores de


comparação e com dores de string
Em uma consulta, operadores de comparação podem ser utilizados j u n t o à cláusula
W H E R E com o propósito de verificar se dois valores ou expressões são idênticos. O
resultado retornado varia; FALSE para valores diferentes, T R U E para valores iguais e
U N K N O W N para valores nulos ou vazios.

Os operadores de comparação incluem;

• = (igual); . • -Í": „
• o ou != (desigual); • •
• > (maior que);
• < (menos que); ^;;;;;-
• > = (maior que ou igual);
• < = (menor que ou igual).

O exemplo a seguir seleciona todos os empregados da tabela E m p r e g a d o s cujo


salário seja inferior a 1000. O resultado é exibido por valor salarial e m ordem
crescente;

USE PEDIDOS

SELECT * FROM Empregados


WHERE SALÁRIO < 1000
ORDER BY SALÁRIO

O exemplo a seguir seleciona todos os empregados da tabela E m p r e g a d o s cujo


salário seja superior a 1000. O resultado é exibido por valor salarial e m ordem
crescente; . , - -

USE PEDIDOS

SELECT * FROM Empregados


WHERE SALÁRIO > 20000
ORDER BY SALÁRIO

^ TechnoEdition SQL Server 2 0 0 8 - Módulo I


Consultando dados
TechnoEdition

O exemplo a seguir seleciona todos os empregados da tabela Empregados cujo


código do departamento (COD_DEPTO) seja menor ou igual a 3. O resultado é
exibido por código de departamento em ordem crescente:

USE PEDIDOS

SELECT * FROM Empregados


WHERE COD_DEPTO <= 3
ORDER BY COD_DEPTO

O exemplo a seguir seleciona todos os empregados da tabela Empregados cujo


código do departamento (COD_DEPTO) seja igual a 2. O resultado é exibido por
código de departamento em ordem crescente:

USE ¥EDlDQS.MMMÊxãÊ'^'^^^
SELECT * FROM Empregados
WHERE COD_DEPTO = 2 ••••^'•^'••'•'l•^;í^
ORDER BY COD_DEPTO

O exemplo a seguir seleciona todos os empregados da tabela Empregados cujo


código do departamento (COD_DEPTO) seja diferente de 2. O resultado é exibido por
código de departamento em ordem crescente:

USE PEDIDOS

SELECT * FROM Empregados


WHERE COD_DEPT0 <> 2
ORDER BY C0D_DEPT0 |

Em paralelo aos operadores de comparação regulares, estão as comparações de string,


as quais permitem verificar a string total ou apenas parte dela em uma coluna, por
meio de caracteres curingas. Tais strings podem sér do tipo text, ntext, char, nchar,
varchar ou nvarchar.
TechnoEdition
Consultando dados Capitu

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.

4.2. Consultando com operadoresjógicos • *


A filtragem de dados em uma consulta também pode ocorrer com a utilização dos
operadores lógicos AND, OR ou NOT, cada qual permitindo uma combinação
específica de expressões, conforme apresentado adiante:
• O operador AND combina duas expressões e exige que sejam verdadeiras, ou
seja, TRUE;

• O operador OR verifica se uma ou ambas as expressões retornam TRUE;


• O operador NOT avalia, para cada coluna retornada no resultado, se a primeira
expressão é TRUE e a segunda FALSE.
As duas instruções SELECT a seguir são utilizadas com operadores lógicos. Na
primeira, foi utilizado o operador AND, ou seja, desejamos saber quais empregados
têm 2 como código de departamento e recebem um salário superior a 5000.

TechnoEdition ' g i SQL Server 2008 - Módulo I


Consultando dados
TechnoEdJtion

Na segunda instrução SELECT, utilizamos o operador OR, ou seja, desejamos detectar


os funcionários do departamento cujo código é 2 ou os funcionários com saláno
maior do que 5000;

USE PEDIDOS""

SELECT * FROM EMPREGADOS


WHERE COD_DEPTO - 2 AND SALÁRIO > 5 0 0 0

SELECT * FROM EMPREGADOS


WHERE COD_DEPTO = 2 OR SALÁRIO > 5 0 0 0

É 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:

SELECT * FROM Empregados


WHERE COD DEPTO = 2 AND COD DEPTO = 5 , •v:;;::llÍÍÍÍiÍlíffi^^^^

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 * FROM Empregados


WHERE C0D_DEPT0 = 2 OR C0D_DEPT0 - 5

Vejamos outros exemplos da utilização de AND e OR;

SELECT * FROM EMPREGADOS


WHERE SALÁRIO >= 3 0 0 0 AND SALÁRIO <= 5 0 0 0
ORDER BY SALÁRIO

SELECT * FROM EMPREGADOS


WHERE SALÁRIO < 3 0 0 0 OR SALÁRIO > 5 0 0 0
ORDER B Y SALÁRIO

SELECT''*^'F EMPREGADOS
WHERE NOT (SALÁRIO >= 3 0 0 0 AND SALÁRIO <= 5 0 0 0 )
ORDER.. B Y SALÁRIO

SQL Server 2008 - Módulo I TechnoEdition


Consultando dados Capítulo

4 3 . Consultando um intervalo de valores •


A cláusula BETWEEN permite filtrar dados em uma consulta tendo como base uma
faixa de valores, ou seja, um intervalo entre um valor menor e outro maior Podemos
utilizá-la em vez de escrever uma cláusula WHERE com várias expressões contendo os
operadores = e <= ou interligadas pelo operador OR.
A funcionalidade da cláusula BETWEEN assemelha-se à dos operadores AND, >= e
<=, no entanto, vale considerar que, por meio dela, a consulta torna-se ainda mais
simples de ser realizada.
No mais, a cláusula BETWEEN, que permite checar se o valor de uma coluna encontra-
se em um determinado intervalo, pode ser utilizada para verificar intervalos de data,
caracteres, entre outros.
Os dois exemplos adiante pesquisam um inten/alo entre dois valores, 3000 e 5000. No
pnmeiro, são utilizados os operadores >=, <= e AND. No segundo, são utilizados o
operador AND e a cláusula BETWEEN:
SELECT * FROM EMPREGADOS 1
WHERE SALÁRIO >= 3000 AND SALÁRIO <= 5000

ORDER BY SALÁRIO •, yJHtí:,i:i!i;ir

SELECT * FROM EMPREGADOS


WHERE SALÁRIO BETWEEN 3000 AND 5000 l
ORDER BY SALÁRIO 1||
Na instrução adiante, serão retornados os funcionários cuja data de admissão (DATA_
ADMISSÃO) esteja compreendida entre 1 de janeiro de 2000 e 31 de dezembro do
mesmo ano. Os valores são ordenados por data de admissão, em ordem ascendente:
SELECT * FROM Empregados . .]||
WHERE DATA_ADMISSA0 BETWEEN ' 2 0 0 0 . 1 . 1 ' AND ' 2 0 0 0 . 1 2 . 3 1 ' 1
ORDER BY DATA_ADMIS SAO . ;|||

Além de BETWEEN, podemos utilizar NOT BETWEEN, que permite consultar os


valores que não se encontram em uma determinada faixa de valores.

^ TechnoEdition SQL Server 2008 - Módulo I


Consultando dados
TechnoEdiíion

O exemplo a seguir pesquisa valores não compreendidos no intervalo especificado:

SELECT * FROM EMPREGADOS


WHERE SALÁRIO < 3000 OR SALÁRIO > 5 000
ORDER BY SALÁRIO

Em vez de <, > e OR, podemos utilizar NOT BETWEEN - mais o operador AND -
para pesquisar os mesmo valores da consulta anterior:

SELECT * FROM EMPREGADOS


WHERE SALÁRIO NOT BETWEEN 3000 AND 5000 ^^MÊÊISSM'
ORDER BY SALÁRIO

4.4. Consuitand-: cc—n-^vi - ~ . 3


o operador LIKE é empregado nas situações em que utilizamos como base para 1
realizar pesquisas as colunas que estão no formato caractere.

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.

O exemplo a seguir pesquisa nomes que começam com MARIA:

SELECT * FROM EMPREGADOS


WHERE NO^I: LIKE 'MARIA%'

O exemplo a seguir pesquisa nomes que começam com MA:

SELECT * FROM EMPREGADOS


WHERE NOME LIKE 'MA%'

SQL Server 2008 - Módulo I TechnoEdition


Consultando dados Capítiil
TechnoEdition

O exemplo a seguir pesquisa nomes que começam com M:

SELECT * FROM EMPREGADOS


WHERE NOME LIKE 'M%'

Na verdade, esse recurso de consulta pode buscar palavras que estejam contidas no
texto, seja no início, no meio ou no final dele.

O exemplo a seguir pesquisa nomes que terminam com MARIA:

SELECT * FROM EMPREGADOS


WHERE NOME LIKE '%MARIA'

O exemplo a seguir pesquisa nomes que terminam com SOUZA:

SELECT * FROM EMPREGADOS


WHERE NOME LIKE '%S0UZA'

O exemplo a seguir pesquisa nomes que terminam com ZA:

SELECT * FROM EMPREGADOS


WHERE NOME LIKE '%ZA'

O exemplo a seguir pesquisa nomes que contenham MARIA:

SELECT "*'FROM'EMPREGADOS"
WHERE NOME LIKE '%MARIA%'

O exemplo a seguir pesquisa nomes que contenham SOUZA:

SELECT * FROM EMPREGADOS


WHERE NOME LIKE '%S0UZA%'

O exemplo a seguir pesquisa nomes que contenham ZA:

SELECT * FROM EMPREGADOS


WHERE NOME LIKE '%ZA%'

TechnoEdition SQL Server 2008 - Módulo I


Consultando dados

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:

SlLÉCT' * ^ FROM Empregado s


W H E R E N O M E LIKE '_A%'

O exemplo a seguir busca nomes cujo penúltimo caractere seja a letra Z:

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 _ '

O exemplo a seguir busca nomes terminados em LU e seguidos de 3 outras letras:

'SELECT * F R O M E m p r e g a d o s „
WHERE NOME LIKE ' %LU •^ÍIiÍÍIÍ|.

Também, podemos fornecer várias opções para um determinado caractere da chave


de busca, como no exemplo a seguir, que busca nomes que contenham SOUZA
ou SOUSA:

SELECT * FROM EMPREGADOS .ijí''*'


W H E R E NOME LIKE ' % S O U [ S Z ] A % ' •f:!:;, • •^•;:;'::;ÍÍÍ

Vejamos outro exemplo, que busca nomes contendo JOSÉ ou JOSE:

SELECT * FROM EMPREGADOS


WHERE NOME LIKE '%J0S[EÉj%'

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.

O exemplo a seguir busca nomes que não contenham a palavra MARIA:

SELECT * FROM EMPREGADOS


WHERE NOME NOT LIKE ' %MJVRIA%'

SQL Server 2008 - Módulo I TechnoEdition


Consultando dados
iiià

O exemplo a seguir busca nomes que não contenham a sílaba MA:

SELECT * FROM EMPREGADOS


WHERE NOME NOT L I K E '%MA%'

4.5. Consultando valores


pertencentes ou não a uma lista de eiementos
o operador IN, que pode ser utilizado em lugar do operador OR em determinadas
situações, permite verificar se o valor de uma coluna está presente em uma lista de
elementos.

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. - -

O exemplo â seguir busca todos os empregados cujtítódigo do departamento ( C O D _


DEPTO) seja 1, 3, 4 o u 7:

lllllLSELECT * FROM EMPREGADOS •::ÍI'':'Í|':ÍÍÍ


lllpWHERE COD_DEPTO I N ( 1 , 3 , 4 , 7 )
ORDER BY COD_DEPTO

O exemplo adiante busca, nas colunas N O M E e ESTADO da tabela CLIENTES,


os clientes dos estados do A m a z o n a s (AM), Paraná (PR), Rio de Janeiro (RJ) e São
Paulo (SP):

IIJRISELECT NOME, ESTADO FROM CLIENTES

' WHERE ESTADO I N ( ' AM' , ' PR' , ' R J ' , ' SP ' ) '^IIB

Já o próximo exemplo busca, nas colunas N O M E e E S T A D O da tabela CLIENTES, os


clientes que não são dos estados do Amazonas (AM), Paraná (PR), Rio de Janeiro (RJ)
e São Paulo (SP):

SELECT NOME, E S T A D O FROM CLIENTE


V:HERE E S T A D O N O T I N ('A-M', 'PR', ' R J ' , 'SP'

r TechnoEdition iifasT SQL Server 2008 - Módulo I


Consultando dados TechnoEdltíon

4.6. Lidando com valores nulos • - - •


Durante a filtragenn de dados, podem surgir valores nulos (NULL) como resultado
inesperado de uma consulta. Estes valores, geralmente, são exibidos no lugar dos
dados realmente esperados para o resultado da consulta.

Por serem indefinidos, os valores nulos exigem um tratamento diferenciado,


especialmente para evitá-los no resultado final. ; ;

Algumas causas para o surgimento de valores nulos são descritas a seguir:

• Criação de linhas em uma tabela e falta de configuração de um valor explícito


para uma de suas colunas;

• Criação de colunas com a palavra-chave SPARSE no intuito de conservar espaço


quando um valor explícito não é definido.

Entre outros aspectos de um valor nulo, vale considerar:

• Não é um valor zero;

• Retorna um valor desconhecido, mesmo quando comparado a outro valor não-


nulo ou nulo;

• Não é uma string vazia;

• Em cálculos, retorna um valor desconhecido.

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.

O exemplo a seguir busca na tabela EMPREGADOS os registros cujo COD_DEPTO


seja nulo:

SELECT * FROM Empregado


WHERE COD DEPTO IS NULL

SQL Server 2008 - Módulo I TechnoEdition


n
r
r Consultando dados Capítulo
^ TechnoEdition

O exemplo a seguir busca na tabela EMPREGADOS os registros cuja DATA_


NASCIMENTO seja nula:

SELECT * FROM Empregados


WHERE DATA_NASClMENTO IS NULL

O exemplo a seguir busca na tabela EMPREGADOS os registros cuja DATA_


NASCIMENTO não seja nula: : j,^.,, . .

SELECT * FROM Empregados


WHERE DATA NASCIMENTO IS NOT NULL

4.7. Substituindo valores nulos


Em síntese, as funções ISNULL e COALESCE permitem retornar outros valores quando
valores nulos são encontrados durante a filtragem de dados. A partir de agora,
apresentaremos a descrição dessas funções.

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 .

^ TechnoEdition SQL Server 2008 - Módulo I


Consultando dados TechnoEditioti

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

SQL Server 2008 - Módulo 1 TechnoEdition


TechnoEdítíon
Consultando dados

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

O exemplo a seguir determina o formato.ano/mês/dia para o valor de data a ser


retornado:
SET DATEFORMAT YMD;

n TechnoEdition SQL Server 2008 - Módulo I


Consultando dados
TechnoEdition

• GETDATEQ

Retorna a data e hora atual do sistema sem considerar o intervalo de fuso-


horário. O valor é derivado do sistema operacional do computador no qual o
SQL Server é executado.

Para, sabermos qual será a data daqui a 45 dias, utilizamos o seguinte código:

SELECT GETDATE () + 45,

. Já no código a seguir, GETDATEO é utilizado para saber a quantos dias cada


funcionário da tabela EMPREGADOS foi admitido:

SELECT CODFUN, NOME, CAST ( G E f M f f t r - DATA_ADMISSAO AS INT) AS


DIAS_NA_EMPRESA
FROM EMPRE GADO S

• DAYO

Esta função retorna um valor inteiro que representa o dia da data especificada
como argumento data na sintaxe adiante:

DAY (data) 'lH^^^^^

O argumento data pode ser uma expressão, literal de stnng, variável definida
pelo usuário ou expressão de coluna.

Exemplo:

SELECT * FROM EMPREGADOS


.WHERE DAY (DATA_ADMISSAO) = 1

• 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)

SQL Server 2 0 0 8 - Módulo I TechnoEdition


Consultando dados
TechnoEòítion _

O argumento data pode ser uma expressão, literal de string, variável definida
pelo usuário ou expressão de coluna.

Exemplo:

SELECT * FROM EMPREGADOS


WHERE MONTH(DATA_ADMISSAO) = 1 2

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.

O exemplo a seguir retorna os empregados admitidos no ano 2000:

SEEECT * FROM EMPREGADOS


WHERE YEAR(DATA_ADMISSAO) = 2 000

O exemplo a seguir retorna os empregados admitidos no mês de dezembro do


ano 2000:

SELECT * FROM EMPREGADOS ^


WHERE YEAR{DATA_ADMISSAO) = 2000 AND MONTH (DATA_ADMISSAO)

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)

n TechnoEdition SQL Server 2008 - Módulo I ,


Consultando dados
TechnoEdititin

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

Vale dizer que o resultado retornado será o mesmo, independentemente de


termos especificado um valor ou respectiva abreviação.

O exemplo a seguir utiliza DATEPART para retornar os empregados admitidos


em dezembro de 2000. Para tal, são especificadas as partes de ano (YEAR) e
mês (MONTH):

SELECT * FROM E M P R E G A D O S ••'l-'-


WHERE DATEPART(YEAR, DATA_ADMISSAO) = 2000 AND
Ijijfea DATA A D M I S S Ã O ) = 12 '^Vy:y:'..•••^ [•

• 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.

SQL Server 2 0 0 8 - Módulo I TechnoEdition


Consultando dados

O exemplo a seguir é utilizado para obter os funcionários que foram admitidos


em uma sexta-feira:

— 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

Esta função retorna um novo valor de datetime ao adicionar um intervalo à uma


porção da data ou hora definida no argumento data da sintaxe adiante:

DATEADD { p a r t e , numero,^ : data} . tÍIIÍi


O argumento parte é a porção de data ou hora que receberá o acréscimo
definido em numero. O argumento data pode ser uma expressão, literal de
string, variável definida pelo usuário ou expressão de coluna, enquanto parte
pode ser um dos valores descritos na tabela anterior, com exceção de TZoffset.

O código a seguir retorna o dia de hoje mais 45 dias: ''

SELECT DATEADD{ DAY, 45, GETDATE())

^ TechnoEdition SQL Server 2008 - Módulo I ^ |


os
TechnoEdition

O código a seguir retorna o dia de hoje mais 6 meses:

S.ELECT,PATEADD:| ;:HONTH, ,6, ^ GETDATE ( ) y^Sffm

O código a seguir retorna o dia de hoje mais 2 anos:

SELECT DATEADDÍ YEAR, 2 , GETDAH^E {) )'''''WS'

• DATEDIFFQ

Esta função o b t é m como resultado u m número de data ou hora referente aos


limites de uma porção de data ou hora cruzados entre duas datas especificadas
nos argumentos d a t a j n i c i o e data_final da seguinte sintaxe: •

DATEDIFF { p a r t e , data_inicio, data_final):'^^|||f||Í

O a r g u m e n t o parte representa a porção de d a t a j n i c i o e data_final que


especificará o limite cruzado.

O exemplo a seguir retorna a quantidade de dias vividos até hoje por uma
pessoa nascida em 12 de novembro de 1959:

í SELECT D A T E D I F F Í DAY, U 9 5 9 . 1 1 . 1 2 \E ?f)

O exemplo a seguir retorna a quantidade de meses vividos até hoje pela pessoa
citada no exemplo anterior:

SELECT D A T E D I F F Í MONTH, '1959.11.12', GETDATE ( ) )

O exemplo a seguir retorna a quantidade de anos vividos até hoje por essa
mesma pessoa: ... . , ,

SELECT DATEDIFFÍ YEAR, '1959.11.12', GETDATE())

Na utilização de DATEDIFFQ para obter a diferença em anos ou meses, o valor


retornado não é exato. O código a seguir retorna 1. No entanto, a diferença
somente sena 1 no dia 20 de fevereiro de 2009:

SELECT D A T E D I F F Í MONTH, 2009 . 1 . 2 0 2009.2.15')

SQL Server 2008 - Módulo I TechnoEdition


TechnoEdition
Consultando dados Capítulo

No próximo exemplo, o resultado retornado também é 1, mas a diferença


somente seria 1 no dia 20 de junho de 2009:
SELECT DATEDIFF( YEAR, '2008.6.20', '2009.2.15')

5.1. Alterando a configuração de idioma a partir do SSMS } '

o resultado retornado pela função DATENAMEQ dependerá do idioma do servidor


SQL. Então, para que essa função retorne o nome do mês ou do dia da semana da
maneira desejada, pode ser necessário alterar o idioma do SQL Server. Isso pode ser
feito a partir do SQL Server Management Studio, como descrito no passo-a-passo a
seguir:
1. Clicar com o botão direito do mouse no nome do servidor, selecionando
Properties no menu de contexto, como ilustrado a seguir:
Mttíosoa SQi setvet ManoaeniMit stu<*o

_i SjswQiítiy Jj -Xf-^j jj ^ ÍA ié ii^ J ^ .i


Ttí1E_PBOCS - t EiKutí ^ ^; *!
P3S_ÍNSrRUT0...<nÍj>ro«.«cí* S«ini«v

* J C>«*«es íomea... SET l?ríUM_CARTAO - 1 ;

SET §CONT_DES - 1 ;
W H I L E l?COKT_DES - 6
BEGIH

SET grK:;ENA « J T l - 60 A£- IHT


--- - -..^z-.:.- i~ • -ti '
fELECT FROH TBL__MEiaASEMA
WHERE MUM_CARTAO 8NUM_CARTA0 /
í>rLlM__DESEHA 1|DEZE:MA ;
CONTINUE; ratoina ao ; ' '

-- 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 }

SET gCONT_DES §C0NT_DE3 1;


EITO VÍHII.F '•

SELECT * FROK TBL_MEGASENA


O R D B R B Y N U M C A R T Ã O , lOTH D E Z E N A *

P3S.INSTSUI0RI30RTMÍ imiU5TMSA*«nt*»£,(Ç3) ÍTESTE.WÍICS OftOttOO itom

í*'»**! ^ ^ jáj .2*1 ,. 4S f. la-is

^ TechnoEdition SQL SerVer 2008 - Módulo I


Consultando dados
TechnoEdition

A seguinte janela aparecerá:

True
1
183J
PecáuaítCiTt

_ j f+iWc*»»-! Services

Oi*rh
R efneíe Logr. T rr^oU

j ^'i^íltxíywsaleâvucfmt/ P:»JÍ*StRUTOfl|St)RIMt ÍP4UUSTA38W«»w»!lt*oi 155) TE6TE.PR0CS OOajOO 6i»«

Re»»

g^sM"! J .Si ^ ê tiit:

2. Na janela, selecionar a opção Advanced;

3. No painel, selecionar a opção Default Language;

4. Escolher o idionna com o qual se deseja trabalhar.

O formato da data pode variar de acordo com o idioma escolhido:

• Brazilian: Pode utilizar os formatos dd/mm/yy ou dd/mm/yyyy;

• English: Pode utilizar os formatos mm/dd/yy, mm/dd/yyyy ou yyyy;mm.dd.

A configuração escolhida será aplicada a todos os logins criados posteriormente.


Logins já existentes deverão ser configurados novamente para que possuam o
novo formato.

TechnoEdition
Consultando dados

Para alterar a configuração de logins existentes, devemos seguir os passos descritos


adiante:

1. No navegador do SQL Server M a n a g e m e n t Studio, abrir a pasta Security e, em


seguida, Logins;

2. Clicar com o botão direito no login a ser alterado e selecionar Proprerties no


menu de contexto, conforme ilustrado a seguir:

gle 5 * vew ^«m loQts Wi«to« gjtmtMyi a*

, J SSWCWIV j j A lá . ^ '

GO
n,^F. TE5TE__ER0CS
GO

• ^ fervei Eíçí*5 «ef^g^h

AS BEGIN
DECLARE êQ I K T ;
SET @Q - m-í ' m;
mim r$Q:

E:-:E; STP QUADPAD.:. S

ALTER PK.:-;E:>r.~.E 3TE_yUADPJi.D.j @K :N1


hS BSGTXí

P3S_lHStaUT0RiS0RTM|ftiUUSTA38V«ío>r»s(iiSa(52! M U S iaiíftM tOtms


maót

TechnoEdition SQL Server 2 0 0 8 - Módulo I


Consultando dados
TechnoEdition

Será exibida a seguinte janela:


I l<Kíin Properttes - BUíLTlNXAdmintstr^ors
^ Scnpf • l^j
Genetá
Ssrvei Role*
_jf Um Mapping

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

4. Na caixa de seleção Default Language, escolher o idioma desejado e


clicarOK.

Mte^^^^' L t todos os a^P^

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:

• Para trabalhar com dados armazenados em um servidor SQL, é preciso


primeiramente solicitá-los a partir de sua origem. Este processo de solicitação é
denominado consulta;

• Na linguagem SQL, o principal comando utilizado para a realização de consultas


é o SELECT. Pertencente à categoria DML (Data Manipulation Language), esse
comando é utilizado para consultar todos os dados de uma fonte de dados ou
apenas uma parte específica deles;

• À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;

• A cláusula WHERE é utilizada para definir critérios com o objetivo de filtrar o


resultado de uma consulta. As condições definidas nessa cláusula podem ter
diferentes propósitos, tais como a comparação de dados na fonte de dados,
a verificação de dados de determinadas colunas e o teste de colunas nulas ou
valores nulos;

• 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

n TechnoEdition SQL Server 2008 - Módulo I


Atualizando e excluindo dados


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.

Os comandos responsáveis por alterações e exclusões são, respectivamente, UPDATE


e DELETE.

Para executarmos diferentes comandos ao mesmo t e m p o , podemos escrevê-los em


um' só script. Porém, esse procedimento dificulta a correção de eventuais erros na
sintaxe. Portanto, recomenda-se executar cada um dos comandos separadamente.

É 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.

Quando utilizamos o comando UPDATE, devemos especificar algumas informações,


como o nome da tabela que será atualizada e as colunas cujo conteúdo será alterado.
Também, devemos incluir uma expressão ou um determinado valor que realizará
essa atualização, bem como algumas condições para determinar quais linhas serão
editadas.

A sintaxe de UPDATE é a seguinte:

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:

• tabela: Tabela cuja linha ou grupo de linhas será alterado;

• nome_coluna: Trata-se do nome da coluna a ser alterada;

• expressão: Trata-se da expressão cujo resultado será gravado em nome_coluna.


Também, pode ser uma constante;

• tabelai, tabelaZ,...: São as tabelas nas quais os valores especificados em


expressão do SET ou em condição;

• expressaoJoin: Define a expressão utilizada para relacionar as tabelas


especificadas por meio da cláusula FROM;

• condição: É a condição de filtragem utilizada para definir as linhas de tabela a


serem alteradas.

TechnoEdition . ^ 9 1 SQL Server 2008 - Módulo I


Atualizando e excluindo dados TechnoEditlon

V
-ao\tu\ a o " ' " " ,.o\tu\ pos^
.... .,mcaP^^^^°^..^ao
caP^^ - t m v i n ^ ^ ' * ^ ^ comando
de

com

Nas expressões especificadas com o comando UPDATE, costumamos utilizar


operadores aritméticos, os quais realizam operações matemáticas, e o operador de
atribuição =. A tabela a seguir descreve esses operadores:
Operador Descrição
+ Adição
- Subtração
* Multipiicação
1 Divisão
%
Retorna o resto inteiro de
uma divisão
= Atribuição
Tais operadores podem ser combinados, como descreve a próxima tabela:
Operadores Descrição
+= Soma e atribui.
-= Subtrai e atnbui. -âlStí «IWi
*= Multiplica e atribui.
/= Divide e atribui.
%= Obtém 0 resto da divisão
e atribui.
Vejamos alguns exemplos da utilização desses operadores:
— Operadores ^
DECLARE QA INT = 10;
SET @A += 5; O mesmo que SET @A =•@A + 5;
F-RINT @A;
SET @A -= 2; O mesmo que SET @A = @A - 2;::
PRINT @A;
SET QA *= 4; O mesmo que SET @A = @A * Ap.
PRINT @A;
SET @A /= 2; O mesmo q-ae SET @A = @A / ;
PRINT @A;
GO

'•.•lilil SQL Server 2008 - Módulo I TechnoEdition


n
Atualizando e excluindo dados

2,1, Alterando dados de uma coluna

o exemplo a seguir descreve como alterar dados de uma coluna:

— A l t e r a n d o dados de uma coluna


USE PEDIDOS;

-- Aumenta o salário de todos os funcionários em 20%


UPDATE EMPREGADOS
r SET SALÁRIO = SALÁRIO * 1.2;
-- OU
UPDATE EMPREGADOS
SET SALÁRIO *= 1.2;

-- Soma 2 na q u a n t i d a d e de dependentes do funcionário código 5


UPDATE EMPREGADOS
r SET NUM_DEPEND = NUM^DEPEND + 2
p WHERE CODFUN - 5;

UPDATE EMPREGADOS
SET NUM_DEPEND += 2
n WHERE CODFUN = 5;

2.2. Alterando dados de diversas colunas

O exemplo a seguir descreve como alterar dados de várias colunas. Corrigiremos o


endereço do cliente de código 5:

ISELECT * FROM CLIENTES WHERE CODCLI = 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

No exemplo a seguir, corrigiremos dados de um grupo de produtos:

SELECT * FROM PRODUTOS


WHERE COD_TIPO = 5

— 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:

DELETE [FROM] t abe1a


[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 t a b e l a S ON '
expressaoJoin,...]
[WHERE condição]

Em que;

• tabela: É a tabela cuja linha ou grupo de linhas será excluído;

• tabelai, tabela2,...: São as tabelas nas quais estão contidos os valores


especificados em condição;

• expressaoJoin: Define a expressão utilizada para relacionar as tabelas


especificadas por meio da cláusula FROM;

• condição: É a condição de filtragem utilizada para definir as linhas de tabela a


serem excluídas. -^ . M

Uma alternativa ao comando DELETE sem especificação da cláusula WHERE é o


uso de TRUNCATE TABLE, o qual também exclui todas as linhas de uma tabela. No
entanto, este último apresenta as seguintes vantagens;

• 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; . . ,.

• A tabela não terá páginas de dados vazias;

• Os valores originais da tabela, quando ela foi cnada, são restabelecidos, caso haja
uma coluna de identidade. ^ *IMí

A sintaxe dessa instrução é a seguinte;

ETRUNCATE TABLE <nome tabel.--:"-

TechnoEdition . j - ' SQL Server 2008 - Módulo I


Atualizando e excluindo dados
TechnoEdition

ixcluindo todas as linhas de uma tabela


Podemos excluir todas as linhas de uma tabela com o comando DELETE. Nesse caso,
não utilizamos a cláusula WHERE.

Primeiramente, vamos gerar uma cópia da tabela EMPREGADOS:

SELECT * INTO EMPREGADOS_TMP FROM EMPREGADOS; %'MÈM^9ÊÊÊÊIÊÊÍI

Agora, vamos excluir os empregados que ganham mais do que 50000:

ií-a SELECT * FROM EMPREGADOS_TMP WHERE SALÁRIO > 50000;

II;'DELETE FROM EMPREGADOS_TMP WHERE SALÁRIO > 5 O O O O ; ;l||Íp^^^^^^^^

A linha a seguir venfica se os empregados que ganham mais do que 50000 realmente
foram excluídos:

l':'SELECT * FROM ,EMPREGApOS_TMP WHERE: . SALÁRIO > .SOOQO;,,


m

A seguir, excluiremos os empregados de código 3, 5 e 7:

||"'ÍELÍlCy*^^^^^^^^^ ÍMÍ'RÈGÍfíOS'2TMP'''•ÍHE^RÈ' ""CÍCÍDFUN"'IN (3,5,7);

II DELETE FROM EMPREGADOS_TMP„ WHEJ^E ; CQDpUN IN,. ( 3 , 5 , 7 ) ; , , ,

A linha a seguir verifica se os empregados dos referidos códigos realmente foram


excluídos: • • ., . ,

IfPlELECf' * FROM EMPREGADOS_TMP WHERE CODFUN IN ( 3 , 5 , 7 ) ;

Já no código adiante, vamos eliminar todos os registros da tabela EMPREGADOS_


TMP:

' DELETE" FROM EMPREGÂDOS_TMI ;


ou
:: TRUNCATE TABLE EMPREGADOS " ;
TechnoEdition
Atualizando e excluindo dados

A linha a seguir verifica se todos os registros foram da referida tabela foram


eliminados:
SELECT * FROM EMPREGADOS ;TMP;'"'''l:vflÍÍ|;;Í|||

-• 'íj"-' r*o

TechnoEdition SQL Server 2008 - Módulo I A « |


Atualizando e excluindo dados TechnoEdition

Transações são unidades de programação capazes de manter a consistência e a


integridade dos dados. Devemos considerar uma transação como uma coleção de
operações que executa uma função lógica única em uma aplicação de banco de
dados.
Todas as alterações de dados realizadas durante a transação são submetidas e tornam-
se parte permanente do banco de dados caso a transação seja executada com êxito.
No entanto, caso a transação não seja finalizada com êxito por conta de erros, são
excluídas quaisquer alterações feitas sobre os dados.
O sistema de gerenciamento de banco de dados tem como um de seus itens principais
um esquema de recuperação capaz de encontrar falhas e de restaurar um banco de
dados para seu estado consistente, ou seja, para o estado em que ele encontrava-se
antes da ocorrência da falha.
É comum que uma unidade lógica de trabalho seja formada por diversas operações do
banco de dados. Um exemplo que ocorre com bastante frequência é a transferência
de fundos, em que temos o débito de uma conta para o crédito em outra. Para que
este tipo de operação seja realizado da forma adequada, a consistência do banco de
dados é essencial, visto que
as duas operações são realizadas, ou nenhuma delas é. Isso significa que, se algum
erro impedir a operação de parte do débito, o crédito não será realizado. Esse
requerimento, em que é tudo ou nada, é denominado atomicidade. Cada transação é
uma unidade de atomicidade.
A preservação da atomicidade é uma das questões mais importantes para o
processamento de transações, mesmo com a possibilidade de ocorrência de falhas
no sistema do computador, visto que isso pode acontecer com qualquer dispositivo
elétrico ou mecânico. Dentre essas falhas, podemos mencionar problemas com o
fornecimento de energia elétrica, com o disco ou com o software, entre outros.
O tratamento das falhas deve ser realizado de acordo com seu tipo. As falhas mais
simples são aquelas que não resultam em perda de informações. Já as falhas mais
complexas e, portanto, mais difíceis de tratar são aquelas que resultam na perda de
informações. Este tipo de falha pode fazer com que o banco de dados perca sua
consistência. Novamente, devemos ressaltar que a consistência do banco de dados
depende da atomicidade das transações.
Atualizando e excluindo dados
TechnoEdiUon

Os comandos INSERT, DELETE e UPDATE são tratados individualmente como sendo


uma transação. O comando SELECT não é tratado como uma transação porque esta
é definida como sendo o comando que altera o estado inicial de uma tabela, seja por
meio de uma inclusão, uma alteração ou uma exclusão de dados.

4.1. ! ransaçõ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.

• COMMIT TRANSAaiON e COMMIT WORK

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.

• ROLLBACK TRANSACTION e ROLLBACK WORK

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.

O modo explícito dura apenas até o encerramento da transação, quando a


conexão retorna ao modo de transação no qual se encontrava antes de a
transação explícita ter início.

TechnoEdition SQL server 2OO8 - Módulo l ^Hl


Atualizando e excluindo dados

niciando e encerran d o tran saco e s


Os exemplos adiante demonstram a utilização de BEGIN TRANSACTION, ROLLBACK
TRANSACTION e COMMIT TRANSACTION para iniciar uma transação, para finalizá-
la descartando as alterações realizadas e para finalizá-la aceitando as alterações
realizadas, respectivamente:
^— A l t e r a r os salários d o s funcionários COITÍ C0D_CARG0 = 5
— p a r a R$ 550,00
-- C o p i a r os d a d o s a t u a i s p a r a uma t a b e l a temporária
-- (segurança, conferência p o s t e r i o r e t e s t e da condição)
SELECT * INTO #EMPR__TMP1 FROM Empregados
WEERE COD_CARGO - 5;
-- M o s t r a r os e m p r e g a d o s que terão s e u s salários a l t e r a d o s
SELECT * FROM #EMPR_TMP1;
— A b r i r p r o c e s s o de transação
BEGIN TRANSACTION;
— Para v e r i f i c a r se e x i s t e processo'' 'de' transação a b e r t o ,
podemos f a z e r :
SELECT @@TRANCOUNT;
— A l t e r a r os salários d o COD_CARGO = 5 J|ÍI:;:|Íli&ÍÍ:'f
UPDATE Empregados SET SALÁRIO = 5 5 0
WHERE COD__CARGO = 6 - Podemos v e r que EÁ UM ERRO DE DIGITAÇÃO
-- C o n f e r i r se a alteração está : G o r r e t a :
SELECT * FROM Empregados
WâERE COD_CARGO = 5;
Percebemos que f o i c o m e t i d o a l g u m e r r o p o r q u e o s
í^- salários c o n t i n u a m o s a n t i g o s . . .
— F i n a l i z a r a transação d e s c a r t a n d o as alterações. -='::Í|'™
— Os salários do C0D_DEPT0 = 6 v o l t a m a s e r o que eram.
a n t e s do i n i c i o da transação
ROLLBACK TRANSACTIONá::,;i

P*' E x e c u t a r a alteração n o v a m e n t e ,,11


A b r i r p r o c e s s o de transação
^BEGIN TRANSACTION;
A l t e r a r os salários do C0D_CARG0 = 5
UPDATE Empregados SET SALÁRIO = 550 , Vã
WHERE C0D_CARG0 = 5 — A g o r a está 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, SALÁRIO rVÍ;
FROM EMPREGADOS

SQL Server 2008 - Módulo I TechnoEdition


TechnoEdition
Atualizando e excluindo dados Capítulo 4

Os comandos INSERT, DELETE e UPDATE são tratados individualmente como sendo


uma transação. O comando SELECT não é tratado como uma transação porque esta
, é definida como sendo o comando que altera o estado inicial de uma tabela, seja por
meio de uma inclusão, uma alteração ou uma exclusão de dados.

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.

• COMMIT TRANSACTION e COMMIT WORK

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.

• ROLLBACK TRANSACTION e ROLLBACK WORK

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.

O modo explícito dura apenas até o encerramento da transação, quando a


conexão retorna ao modo de transação no qual se encontrava antes de a
transação explícita ter início.
^^g^gHHll^ Atualizando e excluindo dados TechnoEdition

nic ando e encerrando transações


Os exemplos adiante demonstram a utilização de BEGIN TRANSACTION, ROLLBACK
TRANSACTION e COMMIT TRANSACTION para iniciar uma transação, para finalizá-
la descartando as alterações realizadas e para finalizá-la aceitando as alterações
realizadas, respectivamente:
- - A l t e r a r os s a l á r i o s d o s f u n c i o n á r i o s com COD_CARGO = 5
— p a r a R$ 550,00
-- C o p i a r os d a d o s a t u a i s p a r a uma t a b e l a t e m p o r á r i a
— ( s e g u r a n ç a , c o n f e r ê n c i a p o s t e r i o r e t e s t e da c o n d i ç ã o )
SELECT * INTO #EMPR_TMP1 FROM Empregados
WEERE COD_CARGO = 5;
— M o s t r a r os e m p r e g a d o s que t e r ã o seus s a l á r i o s a l t e r a d o s
SELECT * FROM #EMPR_TMP1;
A b r i r p r o c e s s o de t r a n s a ç ã o
BEGIN TRANSACTION; ' 'ÍÍIÍM^^^^
— Para v e r i f i c a r se e x i s t e p r o c e s s o de t r a n s a ç ã o a b e r t o , ' " "^":iy|p=f
podemos f a z e r :
SELECT @@TRANCOUNT;
— A l t e r a r os s a l á r i o s do COD_CARGO = 5
UPDATE Empregados SET S A L Á R I O = 5 5 0
WHERE COD__CARGO = 6 - Podemos v e r que K Á UM ERR.O DE D I G I T A Ç Ã O
-- C o n f e r i r se a a l t e r a ç ã o e s t á c o r r e t a
SELECT * FROM Empregados
WHERE C0D_CARG0 = 5; •;i|Í||É^^^^^^^^^^^^^^^
Percebemos que f o i c o m e t i d o 'algum e r r o p o r q u e 'osv:|;ii'i|||5^^^^^^^^
s a l á r i o s c o n t i n u a m os a n t i g o s . . .
— F i n a l i z a r a t r a n s a ç ã o d e s c a r t a n d o as a l t e r a ç õ e s .
— Os s a l á r i o s do C0D__DEPT0 = 6 v o l t a m a s e r o que erami
a n t e s do i n i c i o da t r a n s a ç ã o ^^pg§g
ROLLBACK TRANSACTION

-- 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-

TechnoEdition 33 SQL Server 2 0 0 8 - Módul


TechnoEdition

ópicos para revis: " ^^apí^ ^'^'V


A t e n t e para os tópicos a seguir. Eles d e v e m ser e s t u d a d o s com muita a t e n ç ã o ,
pois representam os pontos mais importantes do capítulo:

• Os dados pertencentes a nnúltiplas linhas de uma tabela podem ser alterados por
meio do comando UPDATE;

• O comando DELETE deve ser utilizado quando desejamos excluir os dados de


uma tabela;

• Transações são unidades de programação capazes de manter a consistência e a


integridade dos dados. Devemos considerar uma transação como uma coleção
de operações que executa uma função lógica única em uma aplicação de banco
de dados.

• Todas as alterações de dados realizadas durante a transação são submetidas


e tornam-se parte permanente do banco de dados caso a transação seja
executada com êxito. No entanto, caso a transação não seja finalizada com êxito
por conta de erros, são excluídas quaisquer alterações feitas sobre os dados.

m SQL Server 2008 - Módulo I TechnoEditiOD


Constraints e índices

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.

A utilização desses objetos é importante porque, para planejar e criar tabelas,


devemos garantir a integridade dos dados existentes nas colunas e identificar os
valores válidos para tais 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:

Constraint Tipos de integridade


PRIMARY K £ Y Chave Primária
FOREIGN KEY Chave Estrangeira
Chave Primária Secundária
UNIQUE
ou Chave Única
CHECK Regras de Validação
DEFAULT Valor Padrão

IJJ. PRIMARY KEY (Chave primária))

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.

A chave primária pode ser gerada no momento da criação ou da alteração da tabela,


bastando para isso definir uma constraint P R I M A R Y K E Y . Esse tipo de constraint é
capaz de assegurar que os dados sejam únicos e exclusivos.
Constraints e índices
TcchnoEdition _

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.

No entanto, as CHECK determinam os valores válidos a partir de uma expressão lógica


não baseada em dados de uma outra coluna, enquanto FOREIGN KEY obtém uma
lista de valores válidos de uma outra tabela.

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.

TechnoEdition SQL Server 2008 - Módulo I


Capítulo 5 Constraints e índices
TechnoEdition

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.

Ao criarmos C H E C K no nível de tabela, essa constraint é aplicada às diversas colunas


da tabela.

1.1.4. DEFÂULT

Em um registro, as colunas obrigatoriamente devem possuir um valor. Como nem ;


sempre esse valor será existente, a coluna deve ter, pelo menos, o valor NULL.
Então, nos casos em que precisarmos carregar uma linha de dados em uma tabela
sem termos conhecimento acerca do valor de uma coluna, ou com uma coluna que
simplesmente não possua um valor, podemos fazê-lo com um valor nulo (se a coluna
permitir valores nulos).

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. • • ^ -

Se tivermos uma coluna definida pela combinação do valor inserido na coluna, da


definição DEFAULT e da nulabilidade, seu valor poderá ser sumarizado.
Constraints e índices
TechnoEdition

1.1.5. FOREIGN KEY (Chave estrangeira) ^•

As colunas que representam chaves estrangeiras são utilizadas com a finalidade de


estabelecer u m vínculo entre os dados de tabelas distintas. A criação deste tipo de
chave requer a utilização da constraint FOREIGN K E Y . . .. ,

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.

.2. Nulabilidade - v^^^-^v;

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

SQL Server 2008 - Módulo I


mm: Constraints e índices
TechnoEditton

1 3 . Modelo Entidade - Relacionamento (MER)


o MER (Modelo Entidade-Relacionamento) tem seu conceito baseado na teoria
relacional de Codd. Esse conceito diz que a expressão da realidade baseia-se no
relacionamento existente entre as entidades, uma vez que essa realidade é dirigida
pelos fatos determinados por tais relacionamentos.
O conceito referente ao MER, que está relacionado principalmente aos bancos de
dados, permite representar os tipos de relacionamentos existentes entre os dados de
um sistema.
A evolução desse modelo, o MER, foi fundamentada em mecanismos de abstração,
cujo conceito permite determinar quais partes da realidade são importantes para
que o sistema de informações seja construído. Além disso, por meio do conceito de
abstração também é possível determinar quais aspectos referentes à modelagem são
importantes para modelar o ambiente.
Alguns dos mecanismos de abstração nos quais se baseia a evolução do MER são:
agregação, classificação e generalização.

13.1. Relacionamento entre tabelas


Quando trabalhamos com aplicações construídas e administradas por um sistema de
gerenciamento de banco de dados, o relacionamento é o responsável por unir duas ou
mais tabelas de bancos de dados.
Vale destacar que o grau de relacionamento entre duas entidades é determinado pela
quantidade de ocorrências de uma entidade que está relacionada à outra. O grau de
relacionamento entre entidades também é chamado de cardinalidade.
• Relacionamento Um-para-um

No relacionamento Um-para-um (1:1), cada um dos elementos de uma


determinada entidade possui relacionamento com apenas um dos elementos de
outra entidade.
TechnoEdition
Constraints e índices Capítulo

Relacionamento Um-para-muitos

Para compreendermos o relacionamento Um-para-muitos (1 :N), consideremos


duas entidades, as quais serão chamadas de A e B. Nesse tipo de relacionamento,
cada elemento da entidade A pode estar relacionado com vários elementos
da entidade B. Entretanto, cada um dos elementos da entidade B pode estar
relacionado a apenas um elemento da A.

Para que seja estabelecido um relacionamento de Um-para-muitos (1 :N),


devemos contar com duas tabelas, sendo que a primeira (1) obrigatonamente
deve ter uma coluna que utilize a chave primária. Vale recordar que colunas com
chave pnmána não aceitam a inserção de valores repetidos.

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.

Devemos estar atentos ao fato de que, diferentemente da chave primária,


colunas que utilizam a chave estrangeira aceitam a inserção de valores repetidos.

Relacionamento Muitos-para-muitos

O relacionamento Muitos-para-muitos (N:N) possui uma característica diferente


dos outros. Nesse caso, os dados estão diretamente relacionados ao fato, e não
às entidades, como observamos nos outros tipos de relacionamento estudados.

É 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

A tabela a seguir descreve as regras de utilização de cada uma das constraints


estudadas neste capítulo:

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

L5J Criando constraints com CREATE TABLE

A seguir, temos um exemplo de criação de constraints com o uso de CREATE TABLE.


Primeiramente criaremos o banco de dados TESTE_CONSTRAINT:

IÇREATE DATABAS E TES TE_CONS TRAI NT; ^^^^^MítÊ: ^

.,USE TESTE_CONSTRAINT;

Agora, criaremos a tabela TIPO_PRODUTO com os tipos (categorias) de produto:

•-- TABELA DE TIPOS (CATEGORIAS) DE PRODUTO


CREATE TABLE TIPO_PRODUTO , i;iÍÍÍ||l|g
j, { COD_TIPO yg;g:MU:M^^^ IDENTITY NOT NULL,
TIPO ' VARCHAR(30) NOT NULL,
-- CONVENÇÃO DE NOME: PK_N0METABELA
CONSTRAINT PK_TIP0_PR0DUT0 PRIMARY KEY {C0D_TIP0),
jllll CONVENÇÃO DE NOME: UQ_N0METABELA_N0MECAMP0
l l l l j l CONSTRAINT UQ_TIP0_PR0DUT0_TIP0 UNIQUE { TIPO ) )

Em seguida, testamos a constraint UNIQUE criada:

-- TESTANDO A CONSTRAINT UNIQUE


vINSERT TIP0_PR0DUT0 VALUES ('MOUSE')
•INSERT TIP0_PR0DUT0 VALUES ('PEN-DRIVE')
:INSERT TIP0_PR0DUT0 VALUES ('HARD DISK')
VAI DAR ERRO PORQUE VIOLA UNIQUE CONSTRAINTs
llNSERT TIPO PRODUTO VALUES ('HARD DISK')

^ TechnoEdition f i SQL Server 2008 - Módulo I


Constraints e índices

O próximo passo é criar a tabela de produtos (PRODUTOS):


-- TABELA DE PRODUTOS
CREATE TABLE PRODUTOS
I D PRODUTO INT IDENTITY NOT NULL,
DESCRIÇÃO VARCHAR(50),
COD TIPO
PRECO CUSTO NUMERIC(10,2),
PRECO VENDA NUMERIC(10,2),
QTD_REAL NUMERIC(10,2),
QTD_MINIMA NUMERIC (10, 2) ,i
DATA CADASTRO DATETIME DEEAULT
GETDATE ( ) ,
SN ATIVO
CHAR(l) DEFAULT 'S',
CONSTRAINT PK_PR0DUT0S PRIMARY KEY{ ID_PR0DUT0 ) ,
CONSTRAINT UQ_PR0DUT0S_DESCRICA0 UNIQUE( DESCRIÇÃO ) ,

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)

Vejamos um modelo para a criação de chave estrangeira:


— CRIAÇÃO DE CHAVE ESTRANGEIRA .

IIIIIIICÔNSTM^^^

ÍÍIÍIÍI|.::d:ii:LJ.:i FOREIGN KEY (CAMPOTABELADETALHE)

BII^
III^
I^^^^^^^^ TABELAMESTRE ( CAKPOPK TABELAME.STRE )
Constraints e índices
TechnoEdition „

Feito isso, testaremos a constraint DEFAULT criada anteriormente. A sequência de


código adiante gera os valores para os campos D A T A _ C A D A S T R O e SN_ATIVO que
não foram mencionados no INSERT:

INSERT PRODUTOS
(DESCRIÇÃO, C0D_TIP0, PREC0_CUST0, PRECO_VENDA,
QTD_REAL, QTD_MINIMA)
VALUES ('TESTANDO INCLUSÃO', 1 , 10, 12, 10, 5 )

SELECT * FROM PRODUTOS

No código seguinte, testaremos a constraint UNIQUE:

--''VAI ••DÃR'ERRO PORQUE V I O L A Ã'CONSTRAINT''UNIQUÉ '


INSERT PRODUTOS
(DESCRIÇÃO, C0D_TIPQ, PREC0__CUST0, , PRECO_VENDA,
QTD_REAL, QTD_MINIMA)
VALmS ('TESTANDO INCLUSÃO', 10, 10, 12, 10, 5 )

No próximo código, testaremos a constraint FOREIGN K E Y :

-- V A I DAR ERRO PORQUE: V I O L A A CONSTRAINT F O R E I G N KEY


:INSERT PRODUTOS
{DESCRIÇÃO, COD_TIPO, PRECO_CUSTO, PRECO_VENDA,:|||||||:í
l QTD_REAL, QTD_MINIMA)
iiVALUES ('TESTANDO INCLUSÃO 2', 1 0 , 1 0 , 1 2 , 1 0 , 5 )

Por f i m , o código adiante testa a constraint CHECK:

;-- V A I DAR ERRO PORQUE V I O L A CONSTRAINT CHECK -


(CK_PR0DUT0S_PREC0S) ,^;:;::.:g
••••INSERT PRODUTOS
(DESCRIÇÃO, C0D_TIP0, PREC0_CUST0, ,:PREQQ_VE:NPA,,
; QTD_REAL, QTD_MINIMA)
IVALUES ('TESTANDO INCLUSÃO 2', 1, 14,' 12, 107 5

SQL Server 2008


Constraints e índices
TechnoEdition

O exemplo a seguir demonstra a criação de constraints utilizando ALTER TABLE:

•USE TESTE_CONST'RAINT;

DROP TABLE PRODUTOS ' • '^fetSlP-^^^^


GO
DROP TABLE T I P 0 _ P R 0 D U T 0^
lgíl^
•j^
if^^^^^^^^^^^^^^

— 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)

^ALTER TABLE TIPO_PRODUTO ADD


CONSTRAINT UQ_TIPO_PROD:UTO_TIPO U N I Q U E ( T I P Q , |, ^
, pl.^^^^^^^^
CRIANDO A TABELA PRODUTOS
CREATE TABLE PRODUTOS
{ ID_PRODUTO ,f:|':^^ I D E N T I T Y NOT NULL,
DESCRIÇÃO ^ t :* VARCHAR{5P)
COD_TIPO I N T , ^ |:Í';;IHl;|síÍÍs^ .
||Í«:^^ PRECO_CUSTO /:|ÍÍÍi NUMERIC ( 1 0 , 2 ) ,
IJIlIl: PRECO_VENDA '^MMÍW^ NUMERIC ( 1 0 , 2 ) ,
|Í|Í QTD_REAL siàlllltí!! NUMERIC ( 1 0 , 2 ) ,
Iflli QTD_MINIMA H
I^
I^
I^^^^^^^^^^^ NUMERIC (:,l,.fl,,J ),v,:Í
'gN'.. DAT A_CADAS TRO D A T E T I ME, •
••:ÍlÍH^
SN_ATIVO mÊlSM:ÊÍÍÊãÊêS^^ CHAR ( 1 ) )

-- CRIANDO AS CONSTRAINTS COM ALTER TABLE


A L T E R TABLE PRODUTOS ADD

IIJP PK_PRODUTOS PRIKARY KEY{ ID_PRODUTO ) ;

•ALTER TABLE PRODUTOS ADD


•y,^^:^.; CONSTRAINT UQ_PRODUTOS_DESCRICAO U N I Q U E ( D E S C R I Ç Ã O )
F— CRIANDO V Á R I A S CONSTRAINTS EM UM Ú N I C O A L T E R TABLE
•:^ALTER TABLE PRODUTOS ADD

SQL Server 2008 - Módulo I TechnoEdition


Constraints e índices
TechnoEditJon

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

O exemplo a seguir demonstra a criação de constraints graficamente. Primeiramente,


criaremos as tabelas TIPO_PRODUTO e PRODUTOS no banco de dados TESTE_
CONSTRAINT:
n
USE TESTE_CONSTRAINT;

o. DROP TABLE PRODUTOS

DROP TABLE TIPO_PRODUTO


'.GO ' ''''''Í^''Í^ÍÍ'?
:-- CRIAÇÃO DA TABELA TIPO__PRODUTO
xCREATE TABLE TIPO_PRODUTO
í COD_TIPO INT IDENTITY NOT NULL,
TIPO VARCHAROO) NOT NULL )

CRIANDO A TABELA PRODUTOS


iCREATE TABLE PRODUTOS
( ID_PRODUTO I N T I D E N T I T Y NOT NULL,
DESCRIÇÃO :VARCHAR(50),
COD_TIPO INT,
PRECO_CUSTO NUMERIC(10, 2) ,
PRECO_VENDA NUMERIC(10, 2) ,
QTD_REAL NUMERIC(10, 2) ,
QTD_MINIMA NUMERIC(10, 2) ,
DATA_CADASTRO DATETIME,
SN ATIVO CHAR(1) )

TechnoEdition sT SQL server 2OO8 - Módulo l


Constraints e índices
TechnoEdicion

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 ;

2. Abrir Selection D a t a b a s e Diagrams (Diagramas de Banco de Dados).


Aparecerá u m a j a n e l a d e diálogo. Clicar e m Y e s (Sim);

X SQlQuervl »ql ,..0 iQUlA (Í.3)) X

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):

SQL Server 2 0 0 8 - Módulo I TechnoEdition


Constraints e índices Capítulo
TechnoEdiuon

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);

As tabelas aparecerão na área de desenho do diagrama:

PRODUTOS IIPO. PRODUTO *


9
DESCSUCAO

TechnoEdition SQL Server 2008 - Módulo I


Constraints e índices Capítulo

7. Para criar a chave única (UNIQUE CONSTRAINT), selecionar a tabela TIPO_


PRODUTO, dar um dique com o botão direito do mouse sobre ela e clicar
na opção Indexes/Keys... (Índices/Chaves...) para abnr a caixa de diálogo
Índices/Chaves: . _

... . I ....

ECi3BS0 »-8>sr«!!íiSt5 O*?» -svo KCiC* cr.ive exv^sve.

B (Geraf)

B De<ig»«r de Banco ileOadot

43 í 5**^ ' ísi;^

8. Clicar no botão Add (Adicionar) e alterar as propriedades Type (Tipo) para


Unique Key (Chave Exclusiva) e Name (Nome) para UQ_TIPO_PRODUTO_
TIPO. Depois, clicar em Close (Fechar);

9. Para criar as constraints CHECK, clicar com o botão direito do mouse em


PRODUTOS e selecionar a opção Check Constraints... (Restrições de
Verificação...): i

PROOUTOS I TiPís Ri^OOUTG'


5>!!íàsoeT«be«

^_ ^,, ~H cxiiií TsaeisE ao Sanes Se Saís»

O.ATA_CAD*S: •

1 ^ : ' i : e E <v.,,.

TechnoEdition SQL Server 2008 - Módulo I


Constraints e índices
TechnoEdition

A seguinte caixa de diálogo é aberta:


IU«.tf df V * ' l i t t V ttt.'tO ,

10. Clicar em Add (Adicionar);

11. Alterar as propriedades como indicado na figura:


tiestrJçÔM àe Vprifif«sç<»o

£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

13. Informar o valor padrão ao lado do nome do campo;

r~ TechnoEdition fi SQL Server 2008 - Módulo I


Constraints e índices TechnoEdlUon

14. Para definir a chave estrangeira, selecionar o campo COD_TIPO da tabela


PRODUTOS e arrastá-lo até a tabela TIPO PRODUTO:

PRODUTOS * TIPO„PRODUTO *

COS

C0D_?1?0

cs;
1

m SQL Server 2008 - Módulo I TechnoEdition


Constraints e índices
TechnoEdition

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.

Os índices apontam a localização de uma linha em um banco de dados sem pesquisar


todas as páginas de dados, colaborando para a diminuição da quantidade de dados
que devem ser lidos para retornar os dados desejados, tornando as consultas mais
ágeis. Além disso, os índices garantem a integridade das linhas nas tabelas, tornando-
as exclusivas (UNIQUE).

Duas estruturas diferentes de índices podem ser utilizadas:

• Clustered (Clusterizado): Neste tipo de estrutura, a tabela é ordenada


fisicamente. Por meio do índice clusterizado, é possível otimizar a performance
de leituras baseadas na filtragem de dados de acordo com uma faixa de valores.
É permitido o uso de apenas um índice clusterizado por tabela, já que as linhas
de dados só podem ser ordenadas de uma maneira;

• NonClustered (Não-dusterizado): Neste tipo de estrutura, os dados de uma


tabela são ordenados de maneira lógica. Os índices não-clusterizados possuem
valores chave, sendo que um ponteiro para a linha de dados é encontrado
em cada entrada desses valores. Esse ponteiro é conhecido como localizador
de linha.

^ TechnoEdition ti3s SQL Server 2008 - Módulo I


Constraints e índices
TechnoEdition

2/1. Criando índices


A criação de índices se dá por meio do comando CREATE INDEX. Sua sintaxe é
exibida a seguir: uv

CREÍ'rM' INDEX 'fuNIQUE] [CLUSTERED | NONCLUSTERED] INDEX


<nome do_indice>
ON < n o m e _ t a b e l a _ o u _ v i e w > ( <nome_col'una> ,[ASC i DESC]
[,...])
[ON < f i l e _ g r o u p > ]

Em que:

• UNIQUE: A duplicidade do campo chave do índice não será permitida se


utilizarmos essa palavra;

• CLUSTERED: Indica que as linhas da tabela estarão fisicamente ordenadas pelo


campo que é a chave do índice;

, • NONCLUSTERED: Indica que o índice não interfere na ordenação das linhas da


tabela (default);

• <nome_tabela_ou_view>: Nome da tabela ou view para a qual o índice será


criado;

• <nome_coluna>: É a coluna da tabela que será a chave do índice;

• ASC: Esta palavra determina a ordenação ascendente (padrão);

• DESC: Esta palavra determina a ordenação descendente;

• ON <file_group>: Define o grupo de arquivos do banco de dados no qual o


índice será cnado.
TechnoEdition „
Constraints e índices Capitu
1
,2. Excluindo índices - • . ,,

, Para a exclusão de índices de um banco de dados, utilizamos o comando DROP


INDEX, cuja sintaxe é a seguinte: ,=

DROP INDEX <nome_tabela_ou_view>.<nome_indice>

Em que: ?uor.D rH. -ji - - Í:,;.-^ • ;

• <nome_tabela_ou_view>: É o nome da tabela ou view com a qual o índice a


ser excluído está associado; . , . ^ ;

• <nome indice>: É o nome do índice a ser excluído.

^ TechnoEdition SQL Server 2008 - Módulo I


Atente para os tópicos a seguir. Eles devem ser estudados com muita atenção,
pois representam os pontos mais importantes do capítulo:

• As constraints são objetos utilizados com a finalidade de definir regras referentes


à integridade e à consistência nas colunas das tabelas que fazem parte de um
sistema de banco de dados;

• 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;

• O MER (Modelo Entidade-Relacionamento) tem seu conceito baseado na teoria


relacional de Codd. Esse conceito diz que a expressão da realidade baseia-se
no relacionamento existente entre as entidades, uma vez que essa realidade é
dirigida pelos fatos determinados por tais relacionamentos; '%

• Quando trabalhamos com aplicações construídas e administradas por um


sistema de gerenciamento de banco de dados, o relacionamento é o responsável
por unir duas ou mais tabelas de bancos de dados;

• 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;

• Podemos cnar constraints com uso de CREATE TABLE, ALTER TABLE ou


graficamente (a partir da interface do SQL Server Management Studio).

• 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.

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.

*•'

SQL Server 2008 - Módulo i TechnoEdition


Associando 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 .

A sintaxe de JOIN é a seguinte:* f A . « ^>

FROM <nome_primeira_tabela> < t i p o _ j o i n > <nome_segunda_tabela>


[ON (condição)] .

Em que: _ 'oJ ' ' ' -., ^,

• < 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

A seguir, veremos os tipos existentes de JOIN.

A cláusula INNER JOIN compara os valores de colunas provenientes de tabelas


associadas, utilizando, para isso, operadores de comparação. Por meio desta
cláusula, os registros de duas tabelas são utilizados para que sejam gerados os dados
relacionados de ambas. A especificação desse tipo de associação pode ocorrer por
meio das cláusulas WHERE e FROM.

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.

Observando as duas tabelas a seguir, é possível concluir que a funcionária Euvira


Loka trabalha no departamento de produção, cujo código é 5: ^^-v-^^,^

E M P R E G A D O S T A B E L A D E P

COJ_D£Í=TO C0D_CAR&3 COD_OEPTO CE»T0

3 í SyvsfB íska 'TV___^ 2 3 COf;T=0-£DEEST

n 11 i DiSETOR.-
S 3 7 TSLS^iSKE-r

O que acabamos de demonstrar é um join, ou associação. Quando relacionamos


2 tabelas, é preciso informar qual campo permite essa ligação. Normalmente, o
relacionamento se dá entre a chave estrangeira de uma tabela e a chave primária da
outra, mas isso não é uma regra.

Na figura a seguir, podemos notar um ícone de chave na posição horizontal localizado


na linha que liga as tabelas EMPREGADOS e TABELADEP. Essa chave está ao lado da
tabela TABELADEP, o que indica que é a chave primária dessa tabela (COD_DEPTO)
que se relaciona com a tabela EMPREGADOS. Vale citar que esta também possui um
campo COD_DEPTO

SQL Server 2008 - Módulo I TechnoEdition


Capítulo Associando tabelas
TechnoEdition

ipos de JOIN
A seguir, veremos os tipos existentes de JOIN.

A cláusula INNER JOIN compara os valores de colunas provenientes de tabelas


associadas, utilizando, para isso, operadores de comparação. Por meio desta
cláusula, os registros de duas tabelas são utilizados para que sejam gerados os dados
relacionados de ambas. A especificação desse tipo de associação pode ocorrer por
meio das cláusulas WHERE e FROM.

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.

Observando as duas tabelas a seguir, é possível concluir que a funcionária Euvira


Loka trabalha no departamento de produção, cujo código é 5: • ^:-^^^v

EMPREGADOS TABELADEP
CODfU?. Wh-E
1 -ÍSSO-^

;0'.T=:<.E DE £
w. —

O que acabamos de demonstrar é um join, ou associação. Quando relacionamos


2 tabelas, é preciso informar qual campo permite essa ligação. Normalmente, o
relacionamento se dá entre a chave estrangeira de uma tabela e a chave primária da
outra, mas isso não é uma regra.

Na figura a seguir, podemos notar um ícone de chave na posição horizontal localizado


na linha que liga as tabelas EMPREGADOS e TABELADEP. Essa chave está ao lado da
tabela TABELADEP, o que indica que é a chave primána dessa tabela (COD_DEPTO)
que se relaciona com a tabela EMPREGADOS. Vale citar que esta também possui um
campo COD_DEPTO

SQL Server 2008 - Módulo I TechnoEdition


TechnoEdition „
Associando tabelas

Há, também, uma join entre a tabela EMPREGADOS e TABELACAR. Podemos


perceber a existência de uma chave horizontalmente posicionada na linha que
liga essas tabelas, e ela está ao lado de TABELACAR. Então, é a chave primária de
TABELACAR (COD_CARGO) que se relaciona com a tabela EMPREGADOS. Em
EMPREGADOS, também temos um campo COD_CARGO.
Empregados TabelaDep
ÍXX. -Os

CO;_CAS;GC>
GOt-
TabefaCar
SALÁRIO
.-RE'»". -SA.

C'E-5
FOTO

Vejamos o exemplo a seguir (é importante ler as linhas de comentário do código para


entender sua execução);
A seguir, consultamos todos os registros das colunas CODFUN, NOME, COD_DEPTO,
COD_CARGO da tabela EMPREGADOS:
'•USE PEDIDOS•.::ÍIÍ|lfi;ÍPp^^^^^
SELECT CODFUN, NOME, COD_DEPTO, COD_CARGO
ÍFROM EMPREGADOS

^ TechnoEdition sr SQL Server 2008 - Módulo I


luykJlkk^ Associando tabelas
^^ÍPPÍ^^PPI^P"' ^ TechnoEdition

Já no SELECT a seguir, consultamos todos os registros da tabela T A B E L A D E P :

SELECT * FROM TABELADEP

Em seguida, consultamos as tabelas E M P R E G A D O S e T A B E L A D E P em um mesmo


SELECT

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^

Quando executamos um SELECT, a primeira cláusula lida é F R O M , antes de qualquer


coisa. Depois é que as outras cláusulas são processadas. No código a seguir, temos
dois erros: E . C O D I G O _ D E P T O (que não existe) e F R O M E M P R E G A D S (erro de
digitação):

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^^^^^^

Executado o código anterior, a seguinte mensagem de erro será exibida:

Mensagem 208,' N i v e l 16, Estado 1, Linha 1


I n v a l i d o b j e c t name 'EMPREGADS'

O primeiro erro acusado na execução do código foi na cláusula F R O M , o que prova


que ela é processada antes.

TechnoEdition
TechnoEdition
Associando tabelas
n A seguir, temos outro exemplo de join:
r -- EMPREGADOS e TABELACAR (cargos)

n SELECT E.CODFUN, E.NOME, C.CARGO^:§$§M^^^^^


FROM EMPREGADOS E JOIN TABELACAR CONE.COD_CARGO =
C . COD_CARGO;

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^^^^^^^^^^^^^^^

No próximo exemplo, temos o uso de JOIN para consultar três tabelas:


-- Consultando 3 tabelas
SELECT
E.CODFUN, E.NOME, E.C0D_DEPT07 E.C0D_CARG0, D.DEPTO, '
C.CARGO

n :FROM EMPREGADOS E ^ ''mm^Mmmwm


JOIN TABELADEP D ON E . C 0 D _ D E P T 0 = D.C0D_DEPT0
JOIN TABELACAR C ON E . C 0 D _ C A R G 0 = C.C0D_CARG0;

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;

r TechnoEdition SQL Seríer 2008 - Módulo I


Cap Associando tabelas
TechnoEdition

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

liiiliíiii: F i l t r a n d o pedidos e m i t i d o s em J a n e i r o de 2 007


*/^'"'"'"
;'SELECT
. I .NUM_PEDIDO, I.NUM_ITEM, I . COD_PRODUTO, PR. DESCRIÇÃO^
IJB^^ I . PRJJNITARIO, T. TIPO, U. UNIDADE, CR. COR,
||Í|VPE.DATA_EMISSA0 M ;:.M
|Í;i|^^^^^^^^^^^
FROM ITENSPEDIDO I
JOIN PRODUTOS PR ON I . ID_PRODUTO = PR. ID_PRODUTO
III JOIN TABCOR CR ON I.CODCOR = CR.CODCOR
iiil JOIN TIPOPRODUTO T ON PR.COD_TIPO = T.COD_TIPO
JOIN UNIDADES U ON PR.COD_UNIDADE = U.COD_UNIDADE
JOIN PEDIDOS PE ON I.NUM_PEDIDO = PE .NUM__PEDIDO
WHERE PE.DATA_EMISSAO BETWEEN '2007.1.1' AND '2007.1.31'

É 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.

Em uma auto-associação, utilizamos a mesma tabela duas vezes na consulta, porém,


especificamos cada instância da tabela por meio de aliases, que são utilizados para
especificar os nomes das colunas durante a consulta.
Associando tabelas

2.1.2. OUTER JOIN

A cláusula INNER JOIN, vista anteriormente, tem como característica retornar


apenas as linhas em que o campo de relacionamento exista em ambas as tabelas. Se
o conteúdo do campo chave de relacionamento existe em uma tabela, mas não na
outra, esta linha não será retornada pelo SELECT. Vejamos um exemplo de INNER
JOIN:

-- 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

iPilf E x i s t e m 60 l i n h a s na t a b e l a EMPREGADOS, mas quando fazemos


o INNER JOIN com TABELADEP, são r e t o r n a d a s apenas 58 l i n h a s . •->^>^"^^«*^-'>^^'«^'^''
A explicação para i s s o é que e x i s t e m 2 l i n h a s em
EMPREGADOS
com C0D_DEPT0 inválido, i n e x i s t e n t e em TABELADEP.
||/
Uma cláusula OUTER JOIN retorna todas as linhas de uma das tabelas presentes em
uma cláusula FROM. Dependendo da tabela (ou tabelas) cujos dados são retornados,
podemos definir alguns tipos de OUTER JOIN, como veremos a seguir.

• 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.

TechnoEdition SQL Server 2008 - Módulo


TechnoEdition

Vejamos exemplos da utilização de LEFT JOIN:

• Exemplo 1

OUTER JOIN: Exibe também as l i n h a s que não tenham


correspondência. •.'•^l'^'flÍB
: ^^^^^^^^^^^^^^^
No exemplo a s e g u i r mostramos TODAS as l i n h a s da t a b e l a ^ililii:lí:
que está à esquerda da p a l a v r a JOIN (EMPREGADOS)

^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

O S E L E C T a seguir verifica, na tabela E M P R E G A D O S , os empregados que


não possuem um código de departamento (COD_DEPTO) válido:

SELECT '— retorna' 2 l i n h a s '


E.CODFUN, E.NOME, E.C0D_DEPT0, E . CÕD_CÍRGO,'''D. ÍIPTÓ"^^^^^^^^
:FROM EMPREGADOS E LEFT JOIN TABELADEP D ON E.C0D_DEPT0 = [
D.C0D_DEPT0
:WHERE D.COD DEPTO I S NULL

SQL Server 2008 - Módulo I TechnoEdition


Associando tabelas

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.

Vejamos o seguinte uso de RIGHT JOIN. Da mesma forma que existem


empregados que não possuem um COD_DEPTO válido, podemos verificar se
existe algum departamento sem nenhum empregado cadastrado. Neste caso,
deveremos exibir todos os registros da tabela que está à direita (RIGHT) da
palavra JOIN, ou seja, da tabela TABELADEP;

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.

— F i l t r a n d o somente os r e g i s t r o s não correspondentr-;;


SELECT
E. CODFUN, E.NOME, E.COD_DEPTO, E.COD_CARGO, D.DEPTO
FROM EMPREGADOS E RIGHT .JOIN TABELADEP D ON E.C0D_DEPT0 =
||, D.C0D_DEPT0
WHERE E.COD DE P T O ' ' T s'' NULL•^illlH^^^

,'5

TechnoEdition SQL Server 2008 - Módulo I


Associando tabelas
TechnoEdition

• FULLJOIN

Todas as linhas da tabela à esquerda de JOIN e da tabela à direita serão


retornadas pela cláusula FULL JOIN ou FULL O U T E R JOIN. Caso unna linha
de dados não esteja associada a qualquer linha da outra tabela, os valores das
colunas da lista de seleção serão nulos. Caso contrário, os valores obtidos serão
baseados nas tabelas utilizadas como referência.

A seguir, exemplificamos a utilização de FULL JOIN:

FULL JOIN^'u"rie'"o LEFT JOIN e o RIGHT JOIN


SF.LECT
• E.CODFUN, E.NOME, E.C0D_DEPTO, E.COD_CARGO, D.DEPTO
:FROM EMPREGADOS E FULL 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.

.-- F i l t r a n d o somente os r e g i s t r o s não c o r r e s p o n d e n t e s


SELECT
E. CODFUN, E.NOME, E.COD_DEPTO, E.COD_CARGO, D.DEPTO
;FROM EMPREGADOS,^^E,.,FDLL JOIN TABELADEP D ON E.COD_DEPTO ^^:,'g§!lͧ^
D.COD_DEPTO • ^ ^ i i l i i i
;WHERE E.COD DEPTO IS NULL OR D.COO DEPTO IS NULL

2.13. CROSS JOIN


Todos os dados da tabela à esquerda de JOIN são cruzados com os dados da tabela
à direita de JOIN ao utilizarmos CROSS JOIN. As possíveis combinações de linhas em
todas as tabelas são conhecidas como produto cartesiano. O tamanho do produto
cartesiano será definido pelo número de linhas na. primeira tabela multiplicado pelo
número de linhas na segunda tabela. É possível cruzar informações de duas ou mais
tabelas.

Quando 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

A seguir, temos um exemplo da utilização de C R O S S JOIN:

-- 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

CROSS iOm deve ser utilizada apenasf


,uar)do for realmente necessário um
q)roduto cartesiano, já que o resultado
ido pode ser muito granáe.

SQL Server 2 0 0 8 - M ó d u l o I
Associando tabelas
TechnoEdition

opicos para revisão a o capitulo


Atente para os tópicos a seguir. Eles devem ser estudados com muita atenção,
pois representam os pontos mais importantes do capítulo:

• A associação de tabelas pode ser realizada, por exemplo, para converter em


informação os dados encontrados em duas ou mais tabelas. As tabelas podem
ser combinadas através de uma condição ou um grupo de condições de junção;

• É 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 primeira tabela
com a chave estrangeira da segunda tabela;

• 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

SQL Server 2008 - Módulo I TechnoEdition


^ Consultas com subqueries

• Conceito de subquery;

r\^ • Principais características;


^, IIIIPIIIH • Subqueries introduzidas com IN e NOT IN;
r IIIIIIIIJ • Subqueries introduzidas com sinal de igualdade;
É||J||HJ3||^H • Subqueries correlacionadas;
• Subqueries X Associações;

•llli™*BllBIII • Subqueries X Tabelas temporárias.

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.

O limite máximo de aninhamento de uma subquery é de 32 níveis, limite este que


varia de acordo com a complexidade das outras instruções que compõem a consulta e
com a quantidade de memória disponível.

m SQL Server 2 0 0 8 - Módulo 1 TechnoEdition


Consultas com subqueries Capítulo

2. PrinciDais características das s i

A seguir, temos a descrição das principais características das subqueries:

• 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;

• Em instruções SELECT, UPDATE, INSERT e DELETE, uma subquery é utilizada


nos mesmos locais em que poderiam ser utilizadas expressões;

• Pelo fato de podermos trabalhar com consultas estruturadas, as subqueries


permitem que partes de um comando sejam separadas das demais;

• Se uma instrução é permitida em um local, este local aceita a utilização de uma


subquery;
._ Q *
• Alguns tipos de dados não podem ser utilizados na lista de seleção de uma
subquery. São eles: ntext, text e image;

• 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 - ' - -

• Um único valor será retornado ao utilizarmos o sinal de igualdade (=) no início da


subquery;

• As palavras-chave ALL, ANY e SOME podem ser utilizadas para modificar


operadores de comparação que introduzem uma subquery. Podemos fazer as
seguintes considerações a respeito delas:

• ALL realiza uma comparação entre um valor escalar e um conjunto de


valores de uma coluna. Então, retornará TRUE nos casos em que a
comparação for verdadeira para todos os pares;

TechnoEdition SQL Server 2 0 0 8 - Módulo I


Capítulo 7 Consultas c o m subqueries
TechnoEdiUDn

• SOME (padrão ISO que equivale a A N Y ) e A N Y realizam uma comparação


entre um valor escalar e um conjunto de valores de uma coluna. Então,
retornarão TRUE nos casos em que a comparação for verdadeira para
qualquer um dos pares.

• 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*;

• As cláusulas GROUP BY e HAVING não p o d e m ser utilizadas em subqueries


introduzidas por um operador de comparação não seguido pelas palavras-chave
ANYouALL;

• A utilização da cláusula ORDER BY só é possível caso a cláusula TOP seja


utilizada; ,

• Alternativamente, é possível formular muitas instruções do Transact-SQL com


subqueries como associações; ^ ^

• O nome de coluna que, ocasionalmente, estiver presente na cláusula WHERE


de uma query externa deve ser associável com a coluna da lista de seleção da
subquery;

• Não é possível especificar as cláusulas COMPUTE e INTO;

• A qualificação dos nomes de colunas de uma instrução é feita pela tabela


referenciada na cláusula F R O M ;

• Subqueries que incluem GROUP BY não aceitam a utilização de DISTINCT;

• Uma view não pode ser atualizada caso ela tenha sido criada com uma
subquery;

• Uma subquery aninhada na instrução SELECT externa é formada por uma


cláusula FROM regular com um ou mais nomes de view ou tabela, por uma
consulta SELECT regular j u n t o dos componentes da lista de seleção regular e
pelas cláusulas opcionais WHERE, H A V I N G e GROUP BY;

SQL Server 2 0 0 8 - M ó d u l o I TechnoEdition


Consultas com subqueries Capitu
TechnoEdition

• 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;

• Por oferecer diversas formas de obter resultados, as subqueries eliminam a


necessidade de utilizarmos cláusulas JOIN e UNION de maior complexidade;

• 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.

A seguir, temos os formatos normalmente apresentados pelas instruções que possuem


uma subquery:

• WHERE expressão [NOT] IN (subquery); ' '

• WHERE expressão operador_comparacao [ANY | ALL] (subquery);

• WHERE [NOT] EXISTS (subquery).

Vejamos um exemplo de subquery que verifica a existência de clientes que compraram


no mês de janeiro de 2007:

'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

TechnoEdition 4331" SQL SeiVer 2008 - Módulo I \


BI Consultas com subqueries TechnoEdition

No próximo exemplo de subquery, é verificada a existência de clientes que não


compraram em janeiro de 2007:
SELECT * FROM CLIENTES • •
WHERE NOT EXISTS (SELECT * FROM PEDIDOS
WHERE CODCLI = CLIENTES.CODCLI AND
DATA EMISSÃO BETWEEN '2007.1.1' AND
'2007.1.31')
— OU ^iK':i:;:;'-i'^'s':;^^
SELECT * FROM CLIENTES
WHERE CODCLI NOT I N (SELECT CODCLI FROM PEDIDOS
WHERE DATA_EMISSAO BETWEEN '2007.1.1' AND
'2 007 .1.31')

;1
% ' : ' ^W S^' i

SQL Server 2008 - Módulo I TechnoEdition


Consultas com subqueries Capítulo
TechnoEdition

uDaueries idas com IN e NOT IN


Uma subquery terá como resultado 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.

Os exemplos adiante demonstram subqueries introduzidas com IN e N O T IN:

• Exemplo 1

— Lista de empregados c u j o cargo tenha salário inicial


— inferior a 5000
SELECT * FROM EMPREGADOS
WHERE COD_CARGO I N (SELECT COD_CARGO FROM TABELACAR
WHERE S A L Á R I O INIC < 5 0 0 0)

• Exemplo 2

— Lista de d e p a r t a m e n t o s onde não e x i s t e nenh-uin a|


-- funcionário cadastrado si
ISELECT * FROM TABELADEP , !
WHERE COD_DEPTO NOT I N (SELECT DISTINCT C 0 D _ D E P T Ò FROM 11
EMPREGADOS 11
WHERE C0D_DEPT0 I SNOT NULL) <
- - O mesmo q u e
SELECT
E.CODFUN, E.NOME, E.COD_DEPTO, E.C0D_CARG0, D.COD_DEPTO,
D.DEPTO t
FROM EMPREGADOS E RIGHT JOIN TABELADEP D O N E.C0D_DEPT0 = D.COD_j
DEPTO I

WHERE E.COD DEPTO IS NULL

r ^

^ TechnoEdition SQL Server 2008 - Módulo I


Capítulo Consultas com subqueries
TechnoEdicion

• Exemplo 3

— L i s t a de cargos em que não e x i s t e nenhum


-- funcionário cadastrado
SELECT * FROM TABELACAR
WHERE COD_CARGO NOT I N (SELECT DISTINCT COD_CARGO FROM
EMPREGADOS
WHERE COD_CARGO IS NOT NULL)
— O mesmo que
SELECT
C.COD_CARGO, C.CARGO
FROM EMPREGADOS E RIGHT JOIN TABELACAR C ON E.COD_CARGO =
C.COD_CARGO
WHERE E.COD CARGO IS NULL
TechnoEdition _
Consultas com subqueries •Sj|£

Subqueries introduzidas

Vejamos exemplos de como utilizar o sinal de igualdade (=) para inserir subqueries:

• Exemplo 1

— Funcionário (s) que ganha (m),, menos


SELECT * FROM EMPREGADOS'
WHERE SALÁRIO = (SELECT MIN (SALÁRIO) FROM Empregados)^'IJ^^^^^^^^^^^^^^^^^^^^
— o me smo qu e
SELECT TOP 1 WITH TIES * FROM EMPREGADOS
WHERE SALÁRIO IS NOT^ NULL,
ORDER BY SALÁRIO p
|^
iÍ:^^^^^^^^^^^^^^^^^

• Exemplo 2

-- Funcionário mais novo na empresa


SELECT * FROM EMPREGADOS
WHERE DATA_ADMISSAO = (SELECT MAX (DATA_ADMISSAO) FR(.;?^;
EMPREGADOS B:);:.Í|1^^^^^^^^^^^^^

O mesmo que
: SELECT TOP 1 WITH TIES * FROM EMPREGADOS,
i- ORDER BY DATA ADMISSÃO DESC

TechnoEdition «131 SQL Server 2008 - Módulo I


Consultas com subqueries

AT
TechnoEdiuon

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.

Também, é possível que subqueries correlacionadas incluam na cláusula FROM


funções definidas pelo usuário que retornam valores de tipo de dado table. Para
isso, basta que colunas de uma tabela na query externa sejam referenciadas como
argumento de uma função desse tipo. Então, será feita a avaliação dessa função de
acordo com a subquery para cada linha da query externa.

Vejamos o exemplo, que grava no campo SALÁRIO de cada funcionário o valor de


salário inicial contido na tabela de cargos:

UPDATE EMPREGADOS SET SALÁRIO = (SELECT SALAR10_1NIC FROM TABELACAR


WHERE C0D_CARG0 = EMPREGADOS.COD_CARGO);

5.1. Subqueries correlacionadas com EXISTS


Subqueries correlacionadas introduzidas com a cláusula EXISTS não retornam dados,
mas apenas TRUE ou FALSE. Sua função é executar um teste de existência de linhas,
portanto, se houver qualquer linha em uma subquery, será retornado TRUE.

Sobre EXISTS, é importante atentarmos para os seguintes aspectos:

• Antes de EXISTS não deve haver nome de coluna, constante ou expressão;

• 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' )

TechnoEdition SQL Server 2 0 0 8 - Módulo I


Consultas com subqueries

iferenças entre subqueries e associações


Ao comparar subqueries e associações (joins), é possível constatar que as associações
são mais indicadas para verificação de existência, pois apresentam desempenlio
melhor nesses casos. Também, podemos verificar que, ao contrário das subqueries, as
associações não operam em listas com um operador de comparação modificado por
ANY ou ALL, ou em listas que tenham sido introduzidas com IN ou EXISTS.

Em alguns casos, pode ser que lidemos com questões muito complexas para serem
respondidas com associações; então, será mais indicado usar subqueries. Isso porque
a visualização do aninhamento e da organização da query é mais simples em uma
subquery, enquanto que, em uma consulta com diversas associações, a visualização
pode ser complicada. Além disso, nem sempre as associações podem reproduzir os
efeitos de uma subquery.

O código a seguir utiliza JOIN para calcular o total vendido por cada vendedor no
período de janeiro de 2007 e a porcentagem de vendas em relação ao total de vendas
realizadas no mesmo mês:

SELECT P.CODVEN, V.NOME, S


IÍf!:^^^^^^^^^^^^^^^^
§mS§Ím^ SUM(P.VLR_TOTAL) AS TOT_VENDIt)Ó, ' ÍIH^^^
100 * SUM{P.VLR_TOTAL) / (SELECT SUM (VLR_TOTAL) FROM ''^^''''«''''"^-'^Sis
PEDIDOS
WHERE DATA_EMISSAO BETWEEN '2 0 0 7 . 1 . 1 ' AND, :
'2007.1.31') AS PORCENTAGEM •
TROM PEDIDOS P JOIN VENDEDORES V ON P.CODVEN =^V.CODVEN
WHERE P . DATA_EMISSAO BETWEEN ' 2 0 0 7 . 1 . 1 ' AND ' 2 0 0 7 . 1 . 3 1 ' ,
GROUP BY P. CODVEN, V. NOME , ^ , :;iÍlB^^^^^
Já o código a seguir utiliza subqueries para calcular, para cada departamento, o total
de salários dos funcionános sindicalizados e o total de salários dos não sindicalizados:

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

SQL Server 2008 - Módulo I TechnoEdition


Consultas com subqueries
TechnoEdition

7. Diferenças entre subqueries e tabelas temporárias


Embora as tabelas temporárias sejam parecidas com as permanentes, elas são •
armazenadas em tempdb e excluídas automaticamente após terem sido utilizadas.

As tabelas temporárias locais apresentam à frente de seu nome o símbolo # e são


visíveis somente durante a conexão atual. Quando o usuário desconecta-se da
instância do SQL Server, ela é excluída.

Já as tabelas temporárias globais apresentam à frente de seu nome os símbolos ## e


são visíveis para todos os usuários. Uma tabela desse tipo será excluída apenas quando
todos os usuários que a referenciam se desconectarem da instância do SQL Server.

A escolha da utilização de tabelas temporárias ou subqueries dependerá de cada


situação e de aspectos como desempenho do sistema e até mesmo das preferências
pessoais de cada usuário. O fato é que, por conta das diferenças existentes entre uma
tabela temporária e uma subquery, o uso de uma, para uma situação específica, acaba
sendo mais indicado do que o emprego de outra.

Assim, quando temos bastante RAM, as subqueries são preferíveis, pois ocorrem na
memória. Já as tabelas temporárias, como necessitam dos recursos disponibilizados
pelo disco rígido para serem executadas, são indicadas nas situações em que o(s)
servidor(es) do banco de dados apresenta(m) bastante espaço no disco rígido.

Há, ainda, uma importante diferença entre tabela temporária e subquery;


normalmente, esta última é mais fácil de se manter. No entanto, se a subquery se
torna muito complexa, a melhor medida a ser tomada pode ser fragmentá-la em
diversas tabelas temporárias, criando, assim, blocos de dados de tamanho menor.

TechnoEdition SQL Server 2 0 0 8 - Módulo I


Consultas com subqueries
TechnoEdition

Vejamos o exemplo a seguir, que utiliza subqueries para retornar os pedidos da


vendedora LEIA para clientes de SP que não compraram em janeiro de 2007, mas
compraram em dezembro de 2006:

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' ) "

, Já no próximo código, em vez de subqueries, utilizamos tabelas temporárias para


obter o mesmo resultado do código anterior:

- - 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'

l i i l i T — T a b e l a temporária 2 - C l i e n t e s que c o m p r a r a m em Jan/2007


''^SELECT CODCLI INTO #CLI_COM_PED_JAN_2 007 FROM PEDIDOS .
m WHERE DATA_EMISSA0 BETWEEN ' 2 0 0 7 . 1 . 1 ' AND ' 2 0 0 7 . 1 . 3 1 '

. ... -- T a b e l a temporária 3 - C l i e n t e s que c o m p r a r a m em Dez/2^006..,,-Illififl


SELECT CODCLI INTO #CLI_C0K_PED_DEZ_2OO6 FROM PEDIDOS
WEERE DATA_EMISSAO BETWEEN ' 2 0 0 6 . 1 2 . 1 ' AND ' 2 0 0 6 . 1 2 . 3 1 '

s..:.::.:.: -- T a b e l a temporárla 4 - C l i e n t e s de SP que c o m p r a r a m em Dez/2006,:;


mas
-- não compraram em J a n de 2 007 'V|ii||B^^^^^^^^^^
SELECT CODCLI INTO #CLI_FINAL F R O M • C L I E N T E S | | j
WHERE CODCLI NOT I N (SELECT CODCLI FROM #CLI_COM_PED_JAN_2007)

CODCLI I N (SELECT CODCLI FROM #CLI_COM_PED_DEZ_2006)


|^Í|Í|:::AND

Íl|||:: ESTADO '= ''SP'

— SELECT de PEDIDOS

SQL Server 2008 - Módulo I TechnoEdition


Consultas com subqueries Capítulo 7
TechnoEdition

SELECT * FROM PEDIDOS


WHERE CODVEN I N (SELECT CODVEN FROM #VEND_LEIA)
AND
••I .CODCLI IN , (SELECT,: CODÇLI EROM ,.,#CLI EINAL),.,

TechnoEdition SQL Server 2008 - Módulo I


Consultas com subqueries
TechnoEdiuon

; 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:

• Uma consulta aninhada em uma instrução SELECT, INSERT, DELFTE ou


UPDATE é denominada subquery (subconsulta). As subqueries são também
referidas como queries internas. Já a instrução em que está inserida a subquery
pode ser chamada de query externa;

• 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;

• O sinal de igualdade (=) pode ser utilizado para inserir subqueries;

• Quando uma subquery possui referência a uma ou mais colunas da query


externa, ela é chamada de subquery correlacionada. Trata-se de uma subquery
repetitiva, pois é executada uma vez para cada linha da query externa. Desta
forma, 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;

• Ao comparar subqueries e associações (joins), é possível constatar que as


associações são mais indicadas para verificação de existência, pois apresentam
desempenho melhor nesses casos;

• 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;

• Tabelas temporárias são armazenadas no tempdb e excluídas automaticamente


após terem sido utilizadas;
Consultas com subqueries
TechnoEdition

As tabelas temporárias locais apresentam à frente de seu nome o símbolo # e


são visíveis somente durante a conexão atual. Quando o usuário desconecta-
se da instância do SQL Server, ela é excluída. Já as tabelas temporárias globais
apresentam à frente de seu nome os símbolos ## e são visíveis para todos os
usuários. Uma tabela desse tipo será excluída apenas quando todos os usuários
que a referenciam se desconectarem da instância do SQL Server;

A escolha da utilização de tabelas temporárias ou subqueries dependerá de


cada situação e de aspectos como desempenlio do sistema e até mesmo das
preferências pessoais de cada usuário.
y^tualizando e excluindo
dados em associações e subqueries

• UPDATE com subqueries;


• DELETE com subqueries;
• UPDATE com JOIN;
• DELETE com JOIN.

TechnoEdition
Atualizando e excluindo dados em associações e subqueries TechnoEdition

Ao utilizarmos a instrução UPDATE em uma subquery, será possível atualizar linhas


de uma tabela com informações provenientes de outra tabela. Para isso, na cláusula
WHERE da instrução UPDATE, em vez de usar como critério para a operação de
atualização a origem explícita da tabela, basta utilizar uma subquery.
Vejamos os dois códigos a seguir. Ambos utilizam UPDATE com subquery No primeiro
código, desejamos aumentar em 10% os salários dos empregados do departamento
C.P.D. No segundo, atualizaremos o preço de venda para que fique 20% acima do
preço de custo de todos os produtos do tipo RÉGUA:
UPDATE Empregados ''^VWWSK^
||i[.':SET SALÁRIO = SALÁRIO * 1.10
WHERE COD_DEPTO (SELECT COD_DEPTO FROM TABELADEP
WHERE DEPTO = 'C.P.D.')

UPDATE PRODUTOS SET PRECO_VENDA = PRECO_CUSTO * 1.2


WHERE COD_TIPO = (SELECT COD_TIPO FROM TIPOPRODUTO
, WHERE TIPO = 'RÉGUA')
Atualizando e excluindo dados em associações e subqueries Capítulo
TectinoEdition _

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';

SQL Server 2008 - ivióduio I TechnoEdition


TechnoEdition
Atualizando e excluindo dados em associações e subqueries

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...

^ TechnoEdition iT SQL Server 2008 - Módulo


Atualizando e excluindo dados em associações e subqueries
TechnoEdition

P Pdra rev sao tío capitule


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 uso da instrução UPDATE em uma subquery permite atualizar linhas de uma


tabela com informações provenientes de outra tabela;

• 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.

SQL Server 2008 - Módulo I TechnoEdition


Agrupando dados

<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.

Para obter os valores sobre os quais poderá realizar os cálculos, as funções de


agregação geralmente são utilizadas com a cláusula G R O U P BY. Quando não há uma
cláusula GROUP BY, os grupos de valores podem ser obtidos de u m a tabela inteira
filtrada pela cláusula W H E R E .

Ao utilizar funções de agregação, é preciso prestar atenção a valores NULL. A maioria


das funções ignora esses valores, o que pode gerar resultados inesperados.

^^y^^- .^unções de

r 2À. Ti

A seguir, estudaremos as principais funções de agregação fornecidas pelo SQL Server


2008:

AVG

Esta função calcula a média dos valores e m determinado grupo, ignorando


valores NULL.

Exemplo:

USE PEDIDOS;

SELECT AVG(SALÁRIO) AS SAEARIO_MEDIO


FROM EMPREGADOS;

TechnoEdition rissT SQL Server 2008 - Módulo I


Agrupando dados
TechnoEdition

• COUNT

Esta função é utilizada para calcular os registros.

Exemplo:

SELECT COUNT(*) AS QTD_EMPREGADOS


FROM EMPREGADOS;

SELECT COUNT(COD_DEPTO) AS QTD_EMPREGADOS


FROM EMPREGADOS;

Ohs.: Se c o l o c a r m o s o nome de um campo como a r g u m e n t o da


função COUNT, não serão c o n t a d o s o s r e g i s t r o s em que o
conteúdo,.desse campo s e j a NULL.
*/

• MIN

Esta função retorna o menor valor de u m conjunto de valores.

Exemplo:

SELECT MIN(SALÁRIO) AS MENOR_SALARIO


FROK EMPREGADOS; lÉgfa^^^^^^^

• MAX

Esta função retorna.o maior valor de u m conjunto de valores.

Exemplo:

SELECT MAX(SALÁRIO) AS MAI0R_SALARI0


FROM EMPREGADOS;

SQL Server 2008 - Módulo I TechnoEdition


Agrupando dados Capíti^

SUM

Esta função realiza a soma de todos os valores na expressão, ou somente


valores DISTINCT.

Exemplo:

SELECT SUM(SALÁRIO) AS SOMA_SALARIOS


FROM EMPREGADOS;

^ TechnoEdition SQL Server 2008 - Módulo I \


Agrupando dados
TechnoEdition

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.

Observemos, a seguir, a sintaxe da cláusula GROUP BY;

f GROUP BY [ A L L ] e x p r e s s a o _ g r o u p _ b y [ ,...n ] [HAVING


<condicaoFiltroGrupo>] ]
í WITH { CUBE I ROLLUP } ]

Em que:

• ALL é a palavra que determina a inclusão de todos os grupos e conjuntos de


resultados. Vale destacar que valores nulos são retornados às colunas resultantes
dos grupos que não correspondem aos critérios de busca quando ALL é
especificada;


Agrupando dados Capitu

• expressao_group_by: Também conhecida como coluna agrupada, é uma


expressão na qual o agrupamento é realizado. Pode ser especificada como
uma coluna ou como uma expressão não agregada que faz referência à coluna
que a cláusula FROM retornou, mas não é possível especificá-la como um alias
de coluna determinado na lista de seleção. Além disso, não podemos utilizar
em expressao_ group_by as colunas de um dos seguintes tipos: image, text
e ntext;
• [HAVING <condicaoFiltroGrupo>]: Determina uma condição de busca para
um grupo ou um conjunto de registros. Essa condição é especificada em
<condicaoFiltroGrupo>;
• { CUBE I ROLLUP }: São operadores utilizados em uma cláusula GROUP BY para
gerar informações de sumário em uma consulta. As diferenças entre um e outro
serão explicadas em tópicos subsequentes.
É importante considerar que as queries que acessam tabelas remotas não são capazes
de suportar a cláusula GROUP BY ALL caso essas queries também possuam uma
cláusula WHERE.
Devemos ter em mente, ainda, que ALL não pode ser utilizada em conjunto com
os operadores CUBE e ROLLUP. A quantidade de itens da expressão_group_by
é limitada de acordo com o tamanho apresentado pela coluna GROUP BY, com
as colunas agregadas e com os valores referentes à query nas situações em que as
cláusulas GROUP BY não possuem os operadores CUBE e ROLLUP. Nas situações
em que tais operadores são especificados, são permitidas até 10 expressões de
agrupamento.

A seguir, temos exemplos da utilização de GROUP BY:


• Exemplo 1
' -- T o t a l de salário de cada departamento j
SELECT COD_DEPTO, SUM( SALÁRIO ) AS TOT_SAL
FROM EMPREGADOS
GROUP BY C0D_DEPT0
ORDER BY TOT SAL

^ TechnoEdition SQL Server 2008 - Módulo I


Agrupando dados
TechnoEdition

• 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

:— Consulta do t i p o R A N K I N G u t i l i z a n d o TOP n + ORDER BY


-- Os 5 departamentos que mais gastam com salários
iSELECT TOP 5 E.COD_DEPTO, D.DEPTO, S U M ( E . S A L A R I O ) AS
T0T_SAL
FROM EMPREGADOS E ••V':i't:^'
J O I N TABELADEP D ON E.COD_DEPTO'= D.COD_DEPTO
GROUP BY E.COD_DEPTO, D.DEPTO

• Exemplo 4

— b s 10 c l i e n t e s qué mais compraram em J a n e i r o de 2 0 07


SELECT TOP 10 C.CODCLI, C.NOME, SUM (P. VLR_TOTAL) AS
TOT_COMPRADO
FROM PEDIDOS P JOIN CLIENTES C ON P.CODCLI = C.CODCLI
WEERE P.DATA_EMISSAO BETWEEN '2007.1.1' AND '2007.1.31'
íGROUP BY C . CODCLI, C . NOME
ORDER BY TOT COMPRADO DESC

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

i i l — C l i e n t e s que compraram em j a n e i r o de 2 0 07. Veremos que


Vfgs;^— todas as l i n h a s do r e s u l t a d o terão um t o t a l não n u l o .
SELECT C.CODCLI, C.NOME, SUM(P.VLR_TOTAL) AS TOT_COMPRADO
FROM PEDIDOS P JOIN CLIENTES C ON P.CODCLI = C.CODCLI
WHERE P.DATA_EMISSAO BETWEEN '2 007.1.1' AND '2007.1.31'
,, ' ,g;ROUP„,BY.^X.ÇODCLI,, ^c.jpME;^,

llllfr'— Neste caso, aparecerão também os c l i e n t e s que não


-- compraram. T o t a i s estarão n u l o s
SELECT C.CODCLI, C.NOME, SUM(P.VLR_TOTAL) AS TOT_COMPRADO
FROM PEDIDOS P JOIN CLIENTES C ON P.CODCLI = C.CODCLI
WHERE P.DATA_EMISSAO BETWEEN '2007.1.1' AND '2007.1.31'
GROUP BY ALL C.CODCLI, C.NOME

2 . Utilizando HÂVINC

A cláusula HAVING determina uma condição de busca para um grupo ou um


conjunto de registros, definindo critérios para limitar os resultados obtidos a partir
do agrupamento de registros. Ela é utilizada para estreitar um conjunto de resultados
por meio de critérios e valores agregados. Ela é usada para filtrar linhas após o
agrupamento ter sido feito e antes dos resultados serem retornados ao cliente.

É importante lembrar que essa cláusula só pode ser utilizada em parceria com GROUP
BY. Se uma consulta é feita sem GROUP BY, a cláusula HAVING pode ser usada
como cláusula WHERE.

TechnoEdition Si SQL Server 2008 - Módulo I


A g r u p a n d o dados
TechnoEdition

3 c\áUSU\

O código de exemplo a seguir utiliza a cláusula HAVING para consultar os


departamentos que totalizam mais de R$ 100.000,00 em salários:

SELECT E.COD_DEPTO, D.DEPTO, SUM ( E.SALARIO ) AS TOT_SAL '


FROM EMPREGADOS E
JOIN TABELADEP D ON E.COD_DEPTO = D.COD_DEPTO
GROUP BY E.COD_DEPTO, D.DEPTO HAVING SUM(E.SALÁRIO) > 100000
ORDER BY TOT_SAL ^••^il'

O próximo código consulta os clientes que compraram mais de R$ 5.000,00 em


janeiro de 2 0 0 7 :

.SELECT C.CODCLI, C.NOME, SUM (P. VLR_TOTAL) AS TOT_COMPRADO •||||


FROM PEDIDOS P JOIN CLIENTES C ON P.CODCLI = C.CODCLI
WHERE P.DATA_EMISSAO BETWEEN ' 2 0 0 7 . 1 . 1 ' AND ' 2 0 0 7 . 1 . 3 1 '
GROUP BY C.CODCLI, C.NOME HAVING SUM(P.VLR_T0TAL) > 500 0
^ORDER BY TOT COMPRADO •:

Já o próximo código consulta os clientes que não realizaram compras em janeiro de


2007:

SELECT C.CODCLI, C.NOME, SUM(P.VLR_T0TAL) AS T0T_COMPRADO


FROM PEDIDOS P JOIN CLIENTES C ON P.CODCLI = C.CODCLI
WHERE P.DATA EMISSÃO BETWEEN ' 2 0 0 7 . 1 . 1 ' AND ' 2 0 0 7 . 1 . 3 1 '
GROUP BY A L L C.CODCLI, C.NOME HAVING SUM(P.VLR_TOTAL) I S NULL

SQL Server 2 0 0 8 - M ó d u l o I TechnoEdition


Agrupando dados M

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.

Vamos supor estamos trabalhando em um banco de dados com as seguintes


características:

• O cadastro de produtos está organizado em categorias (tipos);

• Há vános produtos que pertencem a uma mesma categoria;

• As categohas de produtos são armazenadas na tabela TIPOPRODUTO.

O SELECT a seguir mostra as vendas de cada categoria de produto (TIPOPROODUTO)


que os vendedores (tabela VENDEDORES) realizaram para cada cliente (tabela
CLIENTES) no primeiro semestre de 2006:

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^^^^^^^

TechnoEdition SQL Server 2008 - Módulo I


Capítulo Agrupando dados
Tech no Edílio n

Vamos supor que o resultado retornado é o seguinte:

,F.:>£Cv=. _ _ CL'='.T= TP0_-=?COtfT0 QTD.TOT

2 :£.30'. 'o j= -= ÍTEUO^TOr., -;=3S0=;OS ^CANETA m


I :E.S0r.f.*i»rr.3 > P STÊU-D-i-TO'., C-'.£T- m
í :£.SD'.Vi=T-.S •= --STSU-DiLTOr.' >-,EnO 512
5 :E-SOf."i=.T'^S := -=ST£l>i:-lTOf. E=SOS 322
S ;£.SOr, f.*i=,T >.S 2n -F STEl'-D-iTOfi '''^ - 0 = - - 3 1352
T :£.SDf-r.'iíiT\ -!^;TEI'-:-„TD', -ÍSU- ;:; is
S :E.S0»,'-'Ai^f.S -£Ê£=TPEX'JOSE»=,£SENTES :-*.£T- 1£3
S :£.SDf.rA=.T;,S -EBE=-=E-0:-C3E?=:ESe;T£S :—,£=:• 2S5
t; :E-SOr< r.'iRT %S Í „ Í \ - £ B £ = T = E . 0 5 os £ P R E S E N T E S '.'ÍT.Z-.ERSOS 211
II :£_SDr, r.'-=íT<%S - E E E ^ T « £ . 0 3 os E P R E S E N T E S ^ORT-^-fiS tS2

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.

Terminados os registros de vendas do CELSON MARTINS, iniciam-se os registros de


venda do próximo vendedor, e assim por diante, como podemos ver a seguir: ,
;tf.DEOOR CIENTE TiPO.PRODUTO QTD.TOT
1SS : E - 3 0 ' J M-.RT,'.S . .30N ZO~jz RQ 20 ROSiR.O RS3UA 143
1SS ; E - 3 0 ' ; MÍRT.';S , -s:--. ::=:£-:•:3'R0SAR.0 m
IT: : O R '.-A CAIsETA m
17? Z€'°. '.Hi. 3R :-R ST£U ADAJ.TOH: •í LAPsS

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,.:.

SQL Server 2008 - Módulo I TechnoEdition


Agrupando dados

O resultado é o seguinte:

•0-. :.'EME
1 - - : E : : - - £ =.:• 111

STEU iCESSC-' J : = : - \ T i r;
••5

. •.•- = T >-.ECO Í13


• C
."- =T v-T.: ,E=íos 5S2
ç

- ;= .-'E'.' - : - . T : ' . ar"-! i i 12'

^ s -EEE^TRE.CG E'^S3E'.T£S 152


, ,^ - y-
i: :£.3.:' 225
1! E - - r i r : ; irc> 211
12 . ' > - = T • C" -^_-\-EEE=T ^ E - O ; 0 : E ="ESE*.TE; 1=2
13 0 3 £!=-=S3EM=S NULL 221

Observemos na figura anterior que, após a última linha do vendedor C E L S O N •


MARTINS, existe u m NULL na coluna T I P O _ P R O D U T O , o que significa que o valor
apresentado na coluna QTD_TOT corresponde ao total vendido pelo esse vendedor
para o cliente 3R (ARISTEU.ADALTON), ou seja, a coluna T I P O _ P R O D U T O (null) não
foi considerada para a totalização. Isso se repetirá até o último cliente que comprou de
C E L S O N MARTINS.
-4
Antes de iniciar as totalizações do vendedor seguinte, existe uma linha na qual apenas
o nome do vendedor não é NULL, o que significa que o total apresentado na coluna
Q T D _ T O T representa o total vendido pelo vendedor C E L S O N MARTINS, o u seja,
55912 produtos, independentemente do cliente e do tipo de produto:
^s^E^iEiEDOR "L'ENTE •T:_TOT

••••rj-'J 51S

2u ;E.30-.'--"'.5 ;,„SD*;:O=.:'=Í!O:OROS-Í^O 3258


215 2E-S0*. V-,=:T'õ m\X ML- 55312
215 :0='.— ]=• :Ar;;STEli,-2»i^T0V 2-*.ETi
l%~ 2>0='J"i 3» :-.ft!ST£U,»2;-A.-T0;^, K)RTA U=;S

Na última linha do resultado, temos NULL nas 3 primeiras colunas. O total


corresponde ao total vendido (1022534) no período mencionado, independentemente
do vendedor, do cliente ou do tipo de produto:

1321 "Í=:E^O £ 20" ET C O S . T : - - 50=ÍTA S 112


1S32 ST 2 0 3 . 1 2 - *ilLl
MV. M L . 21E-22
12225?^

SQL Server 2008 - Módulo I


TechnaEdition

3.4. U t i l i z a n d o CUBE

A cláusula CUBE tem a finalidade de determinar que as linhas de sumário sejam


inseridas no conjunto de resultados. A linha de sumário é retornada para cada
combinação possível de grupos e de subgrupos no conjunto de resultados.

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.

A quantidade de linhas de sumário no conjunto de resultados é especificada de


acordo com a quantidade de colunas incluídas na cláusula G R O U P BY. Cada uma
dessas colunas é vinculada sob o valor NULL do agrupamento, o qual é aplicado a
todas as outras colunas.

A cláusula WITH CUBE, em conjunto com G R O U P BY, gera totais e subtotais,


apresentando vários agrupamentos de acordo c o m as colunas definidas com G R O U P
BY

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

SQL Server 2008 - Módulo I TechnoEdition


Agrupando dados Capítulo
TechnoEdition

O resultado é o seguinte:

CLIENTE TS50_=síODUTO QTD.TOT


1

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.

Neste outro trecho do mesmo resultado retornado, as colunas VENDEDOR e CLIENTE


são nulas e o total corresponde ao total vendido de produtos do tipo CANETA, ou
seja, 526543:
1211
1212 nuu HUíÀ.

Seguindo a mesma regra, se apenas o CLIENTE não é nulo, o total corresponde ao


total comprado por este cliente, independentemente de vendedor ou de produto:
3531 LEIA
vm
3532 V Í T O R BRIGN miL

3.5, Utilizando GROUPING

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> )

TechnoEdition SQL Server 2008 - Módulo I


Agrupando dados

Em que:

• <coluna_ou_expressao> determina a coluna ou expressão que contém a


cláusula GROUP BY

Vejamos o exemplo a seguir. Se a coluna produzida por GROUPING (COD_DEPTO)


retornar O (zero), significa que o valor da soma não corresponde a um total das linhas
anteriores:

SELECT COD_DEPTO, SUK ( SALÁRIO ) AS TOT_SAL,


GROUPING(COD_DEPTO) AS TOTAL
FROM EMPREGADOS
GROUP BY COD_DEPTO WITH CUBE'lil||Í^^^^^^^^^^^^
ORDER BY TOT SAL íMWMÍ^^

SQL Server 2008 - Módulo I TechnoEdition


Agrupando dados

opicos Dara revisão ao capiiuio


A t e n t e para os tópicos a seguir. Eles d e v e m ser e s t u d a d o s com muita a t e n ç ã o ,
pois representam os pontos mais importantes do capítulo:

• A s 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
em um conjunto ou grupo de valores, porém retornam um único valor. Para
obtermos os valores sobre os quais poderemos realizar os cálculos, geralmente
utilizamos as funções de agregação com a cláusula G R O U P BY;

• Utilizando a cláusula G R O U P BY, é possível agrupar diversos registros com base


em uma ou mais colunas da tabela.

TechnoEdition SQL Server 2008 - Módulo I


Outros recursos

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.

No exemplo a seguir, C A S E é utilizado para verificar se os funcionários da tabela


E M P R E G A D O S são ou não sindicalizados:

•SELECT NOME, SALÁRIO, CASE SINDICALIZADO'


WHEN ^S' THEN 'Sim'
WHEN 'N' THEN 'Não'
ELSE 'N/C
END AS [ S i n d i c a t o ? ]
IKmmm DAT A_ADMI S S AO
FROM EMPREGADOS

Já no próximo exemplo, verificamos em qual dia da semana os empregados foram


admitidos:

:SELECT NOME, SALÁRIO, DATA_ADMISSA0,


CASE DATEPART(WEEKDAY,DATA_ADMISSAO)
^|^|i;:Í^^^^^^^^^^^^^^^
WHEN 1 THEN 'Domingo'
M |Í ^^^^^^^^^^
WHEN 2 THEN 'Segunda-Feira'
:l||ÍÍjf WHEN 3 THEN 'Terça-Feira'
^ WHEN 4 THEN 'Quarta-Feira'
g|:;||Í!||:
WHEN 5 THEN ' Q u i n t a - F e i r a '
WHEN 6 THEN 'Sexta-Feira'
WHEN 7 THEN 'Sábado'
END AS DIA_SEKiANÃ
..FR0M,,EMPRE.GADOS,., „ ,„
Outros recursos
TechnoEdition _

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

Quando utilizamos a cláusula COMPUTE, obtemos valores de resumo, os quais são


exibidos nos resultados de pesquisa como grupos de resultado divididos. Os resultados
de uma pesquisa que inclui uma cláusula COMPUTE são como relatórios que resumem
dados em intervalos e grupos que o usuáno define.

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

n resultado lista de s e l e ç ã o . lista de seleção de cada


grupo.
Possui u m a linha c o m os Possui u m a linha c o m os
totais d a s f u n ç õ e s d e subtotais das funções de
Segundo grupo de
a g r e g a ç ã o definidas n a a g r e g a ç ã o definidas no
resultado
cláusula COMPUTE grupo pela cláusula.
COMPUTE

Conforme a maneira como alguns utilitários formatam a saída, os resumos agregados


totais ou subtotais múltiplos são exibidos como se cada um dos subtotais fosse
uma linha separada em um grupo de resultado (os agregados totais ou subtotais
são retornados em uma linha). Um desses utilitários é o osql. Existem aplicações
que fazem, na mesma linha, a formatação de diversos agregados. O SQL Server
Management Studio é uma dessas aplicações.

TechnoEdition SQL Server 2008 - Módulo I


^"''^^QIIQI^ Outros recursos TechnoEdition

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 cláusula UNION combina resultados de duas ou mais queries em um conjunto


resultado simples, que inclui todas as linhas de todas as queries combinadas. Ela
é utilizada quando é preciso recuperar todos os dados de duas tabelas, sem fazer
associação entre elas.
Para utilizar UNION, é necessário que o número e a ordem das colunas nas queries
seja igual, bem como que os tipos de dados sejam compatíveis. Se os tipos de dados
forem diferentes em precisão, escala ou extensão, as regras para determinar o
resultado serão as mesmas das expressões de combinação.
O operador UNION, por padrão, elimina linhas duplicadas do conjunto de resultados.
Vejamos o seguinte exemplo:
pi: SELECT ' :||Í||Í|íA
' F o r n e c e d o r '-> ' AS' T I P O , NOMEFONEl' •'•"'•••^•í'*';:'Í^llv^^^
Í;g:, IFROM FORNECEDORES
lllil;:UNION - - UNE A S L I N H A S DE 2 S E L E C T s ^
|Í,;|íÍ; S E L E C T
'Cliente -> ' AS T I P O , NOME, FONEl
|||Í|,,FROM C L I E N T E S >
;: s,ÍIB^IB
í ^^^^^^^^^^^
|!ÍÍÍ:0RDER B Y NOME

3A . Utilizando UNION ALL

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

• É possível escrever qualquer SELECT com JOIN ou subquery^ caso seja


necessário;

• É necessário que todos os comandos SELECT utilizados apresentem o mesmo


número de colunas;

• É necessário que todas as colunas dos comandos SELECT tenham os mesmos


tipos de dados em sequência. Por exemplo, uma vez que a segunda coluna do
primeiro SELECT baseia-se no tipo de dado decimal, é preciso que as segundas
colunas dos outros SELECT também apresentem um tipo de dado decimal;

• 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.

Enquanto UNION, por padrão, elimina linhas duplicadas do conjunto de resultados,


UNION ALL inclui todas as linhas nos resultados e não remove as linhas duplicadas. A
seguir, temos um exemplo da utilização de UNION ALL;

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

SQL Server 2008 - Módulo I ^ -iúZ TechnoEdition


Outros recursos Apêndice!
TechnoEdition _

Common Table Expressions (CTE)


Chamamos de common table expression o conjunto de resultados temporário que se
define no escopo de execução de uma instrução SELECT, INSERT, UPDATE, DELETE
ou CREATE VIEW. As common table expressions não são armazenadas como objetos
e conservam-se apenas durante a consulta, sendo, por estes motivos, parecidas com as
tabelas derivadas.

O uso de common table expressions está voltado para as seguintes finalidades:

• Para criar uma consulta recursiva;

• Para substituir uma view nas situações em que seu uso geral não é exigido;

• Para habilitar o agrupamento por uma coluna derivada de um subselect escalar;

• 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.

Uma common table expression é composta de um nome de expressão (que a


representa), de uma lista de colunas (que é opcional) e de uma consulta (que a define).
A lista de colunas é opcional quando, na definição da consulta, forem fornecidos
nomes diferentes para todas as colunas resultantes.

As common table expressions já definidas podem ser referenciadas nas instruções


SELECT, INSERT, UPDATE ou DELETE, da mesma maneira como referenciamos
tabelas ou views em tais instruções. ' ; , r ^ ,: ^
; - . • . :^ ;^-vor :o ^

Os procedimentos para a criação e utilização de uma common table expression são:


escolher um nome e uma lista de colunas, criar a consulta SELECT da expressão e,
então, usá-la em uma consulta.

^ TechnoEdition SQL Server 2008 - Módulo I


Outros recursos
TechnoEdition

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):

WITH CTE( MES, ANO, MAIOR_PEDIDO )

-- Membro âncora
SELECT MONTH( DATA_EMISSAO ) AS MES,
YEAR(VLR_T0TAL
MAX( DATA EMISSÃO
) AS)MAI0R_VENDID0
AS ANO,
FROM PEDIDOS
Outros recursos

WHERE YEAR(DATA_EMISSAO) = 2006


GROUP BY MONTH(DATA_EMISSAO) , YEAR(DATA_EMISSAO)
) :

— Utilização da CTE fazendo JOIN com a t a b e l a PEDIDOS


SELECT CTE.MES, CTE.ANO, CTE.MAI0R_PEDID0, P.NUM_PEDIDO
FROM CTE JOIN PEDIDOS P ON CTE.MES - MONTH{P.DATA_EMISSAD) AND
CTE.ANO = YEAR(P.DATA_EMISSAO) AND
CTE.MAIOR PEDIDO = P.VLR TOTAL

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.

Uma common table expression recursiva é capaz de retornar diversas linhas, ao


contrário de uma rotina recursiva de outras linguagens, que retorna um valor escalar.

É importante lembrar que a estrutura de uma common table expression recursiva


precisa possuir, no mínimo, um membro âncora e um membro recursivo. O membro
âncora é executado somente uma vez. Já o membro recursivo executa a própria CTE.

Enquanto criamos a common table expression, podemos modificar sua consulta


SELECT. Para isso, basta criar a consulta do membro âncora, adicionar o operador
UNION ALL e, então, criar a consulta do membro recursivo que faça auto-referência à
common table expression. Vejamos:

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

TechnoEdition Hl SQL Server 2008 - Módulo I


Apêndice I Outros recursos TechnoEdiuon

O resultado do código anterior é uma sequência de números inteiros de 1 até 100.

A seguir, temos uma CTE que retorna potências de 5 como resultado:

-- Potencias de 5

WITH P0TENCIAS_DE_5 ( EXPOENTE, POTENCIA )


AS

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):

WITH JUROS( MES, VALOR )

{ 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

TechnoEdition SQL Server 2 0 0 8 - Módulo I li


Outros recursos TechnoEdiuon

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:

WITH F I B O ( NI, N2, PROX)


AS
íi
l^/.SELECT 0,1,1
i:';:^;: UNION ALL
r SELECT N2, PROX, N2 + PR0X FROM FIBO WHERE PROX < 10000 :l|jÍ|ÍÍ|^^^^
',)
SELECT * FROM FIBO

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

SQL Server 2008 - Módulo I TechnoEditiOD


Outros recursos mm
pênd
TechnoEdition _

Vejamos outro exemplo. Na tabela EMPREGADOS do banco de dados PEDIDOS,


existe um campo chamado COD_SUPERVISOR, que indica quem é o supervisor do
empregado, que está cadastrado na mesma tabela EMPREGADOS. No entanto, a
quantidade de subníveis do organograma é variável, como mostra a figura a seguir:

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

IS
1"

15

Is

Para obter o resultado anterior, primeiramente criamos a seguinte CTE:

WITH CTE( CODFUN, NOME, COD_DEPTO, CODSUP, NOME_SUP )

Membro âncora

||:;ÍÍSELECT C O D F U N , NOME, C 0 D _ D E P T 0 , COD_SUPERVISpR,:„,NOME ,


|ÍÍ|;.:'FR0M Empregados WHERE COD_SUPERVISOR = O
Í|||''UNION hlã^:$^;g.
I l l — Membro' r e c u r s i v o ' ''^^:''Í;:I|R
W'^ SELECT E. CODFUN, E.NOME, E.COD_DEPTO, E XOD_SUPERVIg É^
iR
S
O^
-^
,^^
^^^^^^^^^^ ^^^ ^
^
CTE. NOME t™^^'^ffÍÍÊ.
FROM Empregados E J O I N C T E ON E.C0D_SUPERVIS0R = CTE.CODFUN
)
— Execução da CTE
SELECT CTE. CODFUN AS [Código], CTE.NOME AS [Funcionário] ,::||ÍíS^^^^^^^^^^^
D.DEPTO AS [ D e p a r t a m e n t o ] , Ç.XE.NOME^SUP AS , [Nome. ,,j|ÍÍÍIÍ:|H^^^^
S upe r v i s o r ] : : | | i i | i i ^
FROM CTE J0IN''''EMPREGfBDs"E''"0N''CTE'rC0DFUN'''=''E\C0bF^
JOIN TABELADEP D ON E.C0D_DEPTO - D.C0D_DEPT0
ORDER BY CTE.COD DEPTO

jfl SQL Server 2008 - Módulo I TechnoEdition


Outros recursos pênd
TechnoEdition

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:

SELECT E.CODFUN, E.NOME, E.COD_DEPTO, E.COD_SUPERVISOR,


CTE.NOME
FROM Empregados E J O I N EMPREGADOS CTE ON E.COD_SUPERVISOR =
CTE.CODFUN
ORDER BY COD_DEPTO

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: • ,,

WITH CTE( CODFUN, NOME, NÍVEL, COD_DEPTO, CODSUP, NOME_SUP )


AS

— 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

r TechnoEdition SQL Server 2008 - Módulo I '^ÊkjÁ


Outros recursos

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

6 2s SUJ-0 <r rlUA • U_i •eE=3


'5 ..' • -E
s 31 f:4A'iOEi. B.0 T O N C O RDNTOURA fy'!Q :Í.EJLLA - ROSE .'EER5
s S
' E? } A S:tVA - K05E •SSR3
ID -Ri ^'."O - í/o—^-E:
11 _ nOSE .•E£AS
12 64 .EROSO mO"A?.«£t = AEOULi <'B£RG
13 S7 i souza *: Vr, ~ _ • • r --BS:J-A «ROSE .^EERG
U ~Z OS-.'.'-. £ ' . EeSH •i ROSE .'BERQ
1E ROBEHT K 3 QSAMAi; . BUS-'
ÍÊ 51 0S-'t
V CARLOS DA SSL VA OS-.M- Bi . eu5H

Por fim, vamos gerar a árvore que mostra toda hierarquia ascendente de um
funcionário:

WITH CTE ( CODFUN, NOME, NÍVEL, COD__DEPTO, CODSUP, NOKiE_SUP,


ARVORE )
AS V:i;||i||H^^^^^^^
(
IÍIJ.— Membro âncora
IJISELECT CODFUN, NOME, 1 , COD_DEPTO, COD_SUPERVISOR, NOME,''^'
CAST(NOME AS VARCEAR(MAX))
? ' A | E R O M Empregados WHERE COP_SUPERVISOR = 0^

UNION ALL Í||ÍM^^^^


l l i i - - — 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 . NÕMliaA A,
CTE.ARVOiElE + ' < - ' + E.NOME
lifiFROM
Empregados E J O I N CTE ON E.C0D_SUPERVIS0R =
tTE.CODFUN
\-)
— Execução da CTE
SELECT CTE.CODFUN AS [Código]., CTE.NOMJ] AS [Funcionário],
CTE . NIVEL AS [ N i v e 1 ] , :
CTE.N0ME_SUP AS [Nome " S u p e r v i s o r ] ^ ' C f I I ASVÕ^^
[Árvore ]
FROM CTE '•lilllIlHlB^^ s iillillíl

íiiak SQL Server 2008 - Módulo I - TechnoEdition


Resumo de objetos de um banco de dados
do SQL Server 2008

TechnoEdition
Resumo de objetos de um banco de dados do SQL Server 2008

Obj etos d e banco d e d a d os


Os objetos que fazem parte de um sistema de banco de dados do SQL Server são
criados dentro do objeto database, que é uma estrutura lógica formada por dois
tipos de arquivo: um arquivo responsável por armazenar os dados e outro, por
armazenar as transações realizadas. Vejamos quais são os objetos de banco de dados
do SQL Server:

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.

Por meio de chaves baseadas em colunas, os índices permitem definir a localização de


uma determinada informação. Os índices otimizam não só a performance das queries,
como também a leitura de informações encontradas em um banco de dados como
um todo.

TechnoEdition
Resumo de objetos de um banco de dados do SQL Server 2008 pêndic
_

ConStraint - ^ ^ u ; . s;-...:,-- : - : :v. : [ r , r. ^

São objetos cuja finalidade é estabelecer regras de integridade e consistência nas


colunas das tabelas de um banco de dados. Cinco são os tipos de constraints
oferecidos pelo SQL Server: PRIMARY KEY, FOREIGN KEY, UNIQUE, CHECK e
DEFAULT

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.

Vejamos um exemplo de criação de view:

CREATE VIEW VIE_ITENSPEDIDO


;AS
;SELECT I.NUM_PEDIDO, I.NUM_ITEM, I.ID_PRODUTO,
I . QUANTIDADE, I . PR_UNITARIO, I . DE SCONTO, " ÍL
|(:;:B^^^^^^^^^^^
I.QUANTIDADE * I.PR_UNITARIO *
{ 1 - I.DESCONTO / 100 ) AS VALOR,
P.DESCRIÇÃO, T.TIPO, U.UNIDADE, C.COR
•FROM ITENSPEDIDO I J O I N PRODUTOS P
ON I.ID_PR0DUT0 = P.ID_PR0DUT0
J O I N TIPOPRQDUTO T
ON P.C0D_TIP0 = T.C0D_TIP0
J O I N UNIDADES U
ON P.C0D_UNIDADE = U.C0D_UNIDADE
J O I N TABCOR C ON I.CODCOR = C.C0R^''(V.R
J O I N PEDIDOS PE ON I.NUM PEDID0=PE .NUM' PÉDÍDÒ'

^ TechnoEdition SQL Server 2008 - Módulo I


Resumo de objetos de um banco de dados do SQL Server 2008
TEchnoEdition

Para testar o exemplo anterior, devemos utilizar o seguinte código:

SELECT NUM_PEDIDO, QUANTIDADE, VALOR, DESCRIÇÃO


FROM VIE_ITENSPEDIDO . , , .

A seguir, temos outro exemplo de criação de view;

CREATE VIEW VIEJV[AI0R_PEDID0


AS
SELECT MONTE (DATA_EMISSAO) AS MES, •IIIÍÍ^ÍH^^^^^
YEAP.! DATA_EMISSAO) AS ANO,
MAX( VLR_TOTAL ) AS VLR_DO_MAIOR_PEDIDO
FROM PE DIDOS
GROUP BY MONTH(DATA EMISSÃO), YEAR(DATA_EMISSAO)

O código a seguir testa a view que acabamos de criar:

SELECT V.MES, V.ANO, V.VLR_DO_MAIOR_PEDIDO, P.NUM_PEDIDO


FROM VIE_MAIOR_PEDIDO V JOIN PEDIDOS P
ON V.MES = MONTE ( P. DATA_EMISSAO ) AND^.:.,^gg:,
V.ANO = YEAR( P.DATA_EMISSAO ) AND
V . VLR_DO_MAIOR_PEDIDO = P , VLR_TOTAL l Í Í Í | j Í ' i | Í Í Í Í ^
ORDER BY 2, 1

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.

SQL Server 2 0 0 8 - Módulo I TechnoEdition


Resumo de objetos de um banco de dados do SQL Server 2 0 0 8 Apêndice

Vejamos um exemplo de stored procedure, que calcula a comissão de vendedores:

CREATE PROCEDURE SP_CQMISSAQ @DT1 DATETIME, @DT2 DATETIME


AS BEGIN
SELECT V.CODVEN, V.NOME,
SUM(P.VLR_TOTAL) AS TOT_VENDIDO,
SUM(P.VLR_TOTAL * V.PORC_COMISSAO/100) AS COMISSÃO
FROM
PEDIDOS P JOIN VENDEDORES V ON P.CODVEN=V.CODVEN
WHERE
P.DATA_EMISSA0 BETWEEN @DT1 AND @DT2
GROUP BY V.CODVEN, V.NOME
END

Para testar o exemplo anterior, devemos utilizar o seguinte código:

EXEC SP_C0MISSA0 '2006.6.1', '2006.6.30'

Vejamos outro exemplo de stored procedure, que realiza um reajuste de preços:

CREATE PROCEDURE SP_REAJUSTA_PRECOS


gFATOR NUMERIC(4,2), @TIP01 INT = O, @TIP02 INT =
999
AS BEGIN
UPDATE PRODUTOS
SET PRECO_VENDA = PREC0_CUSTO * @FAT0R
WHERE C0D_TIP0 BETWEEN @TIP01 AND @TIPG2
END

Para testar o exemplo anterior, devemos utilizar o seguinte código:

EXEC SP REAJUSTA PREÇOS 1.3

TechnoEdition SQL Server 2 0 0 8 - Módulo I


Resumo de objetos de um banco de dados do SQL Server 2008
TechnoEdition

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.

No exemplo a seguir, a função MONTH retorna o número referente ao mês de uma


determinada data:

MONTH ( DATA ) ::IÍi||;:;-'S ^


O exemplo a seguir cria uma função que retorna o nome do dia da semana de uma
data:

CREATE^ FUNCTION FN_NÒME_DIA_SEMANA( @DT DATETIME )


RETURNS VARCHAR(15)
AS BEGIN

DECLARE @NUM__DS INT — para o número do d i a da semana


DECLARE @RESULT VARCHAR(15) — para o nome do d i a da semana

SET @NUM_DS = DATEPART( WEEKDAY, @DT )

I F @NUM_DS = 1 SET @RESULT = 'DOMINGO'


IF @NUM_DS = 2 SET @RESULT = 'SEGUNDA-FEIRA'
I F @NUM_DS = 3 SET SRESULT = 'TERÇA-FEIRA'
I F @NUM_DS = 4 SET @RESULT = 'QUARTA-FEIRA'
I F @NUM_DS = 5 SET gRESULT = 'QUINTA-FEIRA'
ÉF @NUM_DS = 6 SET SRESULT = ' SEXTA-FEIRA' \::.i|ÍÍ|||Í::|ÍÍ^^^^^^^^^^^^^^
TF @NUM_DS = 7 SET gRESULT = 'SÁBADO'
RETURN ( @RESULT )

No código antenor, destacamos as seguintes linhas:

• CREATE FUNCTION FN_NOME_DIA_SEMANA( @DT DATETIME ): Cria uma


função de nome FN_NOME_DIA_SEMANA e define o tipo de dado a ser
recebido;

• RETURNS VARCHAR(15); Define o tipo de dado que a função retornará;

SQL Server 2008 - Módulo I TechnoEdition


Resumo de objetos de um banco de dados do SQL Server 2008
r TechnoEdition

• DECLARE @NUM_DS INT: Declara uma variável para o número do dia da


semana;
• DECLARE ©RESULT VARCHAR(15): Declara uma variável para o nome do dia
da semana. ;; . i •, , .
Para testar a função criada com o código anterior, devemos digitar as seguintes linhas:
SELECT NOME, DATA_ADMISSAO, DATENAME{WEEKDAY,DATA_ADMISSAO),
DBO.FN_NOME_DIA_SEMANA( DATA_ADMISSAO )
FROM EMPREGADOS

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' )

^ TechnoEdition SQL Se'rver 2008 - Módulo


Resumo de objetos de um banco de dados do SQL Server 2008
TechnaEdition

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.

Quando atualizamos, inserimos ou excluímos dados em uma tabela, o trigger


automaticamente grava em uma tabela temporária os dados do registro atualizado,
inserido ou excluído. A tabela adiante descreve esse procedimento:
Comando que Tabela temporária
Dados da tabela temporária gerada
ativa 0 trigger gerada
DELETE DELETED Dados do registro excluído.
INSERT INSERTED Dados do registro inserido.
DELETED Dados do registro anteriores à alteração.
UPDATE
INSERTED Dados do registro posteriores à alteração.

Vejamos o seguinte exemplo de criação de um trigger para recalcular o valor total dos
pedidos:

corno o

CREATE TRIGGER RECALC_VLR_TOTAL ON ITENSPEDIDO


FOR DELETE, INSERT, UPDATE
AS BEGIN

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:

DECLARE (aNUM_PEDIDO INT;


DECLARE @VLR_TOTAL NUMERIC (15,2) •:!Í|iH
Criadas as duas variáveis, vamos detectar o número do pedido alterado:

SELECT @NUM_PEDIDO = NUM_PEDIDO FROM INSERTED


„.IF §NUM_PEDIDO IS NULL
. SELECT @NUM_PEDIDO = NUM_PEDIDO FROM DELETED

Em seguida, digitaremos as linhas a seguir para recalcular o valor total do pedido:

; SELECT @VLR_TOTAL = SUM ( QUANTIDADE * PR_UNITARIO * WMKÊMMbSsM


Ml-DESCONTO/lOO))
FROM ITENSPEDIDO WHERE NUM_PEDIDO = @NUM_PEDIDO ,

Para gravar o novo valor total na tabela PEDIDOS:

i;;UPDATE PEDIDOS SET VLR_T0TAL == @VLR_TOTAL BM^^^


i-^WHERE NUM_PEDID0 = @NUM_PEDIDO

Para testarmos toda a sequência de códigos anterior, podemos, por exemplo, consultar
o pedido de número 1000:

'SELECT * FROM PEDIDOS >IHERE NUM_PEDIDO = 1000 — VLR_TOTAL = 3800 T;

Já para consultarmos os itens desse pedido, devemos digitar a seguinte linha:

SELECT * FROM ITENSPEDIDO WHERE NUM_PEDIDO = 1000

Para alterarmos para 2 o preço unitáno (PR_UNITARIO) do pedido número 1000,


devemos digitar a seguinte linha:

UPDATE ITENSPEDIDO SET PR_UNITARI0 = 2


WHERE NUM PEDIDO = 1000

TechnoEdition SQL Server 2008 - Módulo I


rowfiii; Criando um banco de dados TechnoEdition

1. Que comando é utilizado para a criação de um banco de ciados?

2. Com relação à normalização de tabelas, o que há cJe errado na estrutura a seguir?


CREATE TABLE FUNCIONÁRIOS
( COD_FUNC INT IDENTITY PRIMARY KEY,
NOME VARCHAROO),
DEPARTAMENTO VARCHAR(30),
SALARIO NUMERIC(1O,2)

3. Com relação à normalização de tabelas, o que há de errado na estrutura a seguir?


CREATE TABLE EMPRESAS
( COD_EMPRESA INT IDENTITY PRIMARY KEY,
EMPRESA VARCHAR(50),
CNPJ CHAR(14),
INSCR_EST VARCHAR(18),
NOME_CONTATO_1 VARCHAROO) ,
N0ME_C0NTAT0_2 VARCHAR(30),
N0ME_C0NTAT0_3 VARCHAR(30),
N0ME_C0NTAT0_4 VARCHAR(30),
NOME CONTATO 5 VARCHAR(30) )

m SQL Server 2008 - Módulo I TschnoEdition


Criando um banco de dados Capítulo 2

Ainda com relação à normalização de tabelas, o que há de errado na estrutura


a sequir?
CREATE TABLE PRODUTOS
COD_PRODUTO INT IDENTITY PRIMARY KEY,
DESCRIÇÃO VARCHAR(40),
COD_UNIDADE INT,
COD_CATEGORIA INT,
PRECO_CUSTO NUMERIC(10,2),
PRECO_VENDA NUMERIC(10,2),
PORC LUCRO NUMERIC(5,2) )

1 ífcs

TechnoEdition SQL Server 2008 - Módulo I


Criando um banco de dados

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.

SQL Server 2008 - Módulo I TechnoEdÍtÍOn :;H


TechnoEdition _
Criando um banco de dados

Exercícios ae iaboratórío
Laboratório 1 - - ., ^ .
A - Criando bancos de dados e suas respectivas tabelas

1. Criar um banco de dados chamado PEDIDOS_VENDA,


Resposta:

2. Colocar em uso o banco de dados PEDIDOS_VENDA;


Resposta: '

3. Criar uma tabela chamada PRODUTOS, com os respectivos campos:


Código do produto: Inteiro, autonumeração e chave primária
Nome do produto: Alfanumérico;
Código da unidade de medida: Inteiro;
Código da categoria: inteiro;
Quantidade em estoque: Numérico;
Quantidade mínima: Numérico;
Preço de custo: Numérico;
Preço de venda: Numénco;
Características técnicas: Texto longo;
Fotografia: Binário longo.
Resposta:

TechnoEdition SQLServer 2008 - Módulo I


Criando um banco de dados TechnoEdition

4. Criar uma tabela chamada UNIDADES para armazenar as unidades de medida.


Considerar as seguintes informações:

• Código da unidade: Inteiro, autonumeração e chave primária;


• Nome da unidade: Alfanumérico.

Resposta:

5. Inserir as seguintes unidades na tabela UNIDADES:

PEÇAS, METROS, QUILOGRAMAS, DÚZIAS, PACOTE, CAIXA

Resposta:

6. Criar a tabela CATEGORIAS para armazenar as categorias de produto. Considerar ^


as seguintes informações: ~

• Código da categona: inteiro, autonumeração e chave primária; , ^


• Nome da categoria: alfanumérico.

Resposta:

7. Inserir as seguintes categorias na tabela CATEGORIAS:

MOUSE, PEN-DRIVE, MONITOR DE VÍDEO, TECLADO, C.RU., CABO DE REDE.

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:

^ TechnoEdition SQL Server 2008 - Módulo I


Criando um banco de dados TechnoEdition

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:

SQL Server 2008 - Módulo I TechnoEdition


Criando um banco de dados Capítulo
TechnoEdition

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

Número d o pedido: Inteiro, autonumeração e chave primária;


Código do cliente: Inteiro;
Código do v e n d e d o r : Inteiro;
Data de emissão: Data e hora;
Data de e n t r e g a : Data e hora;
Valor total: Numérico;
Situação: Deve armazenar uma letra ("P" para PENDENTE; " C " para
CANCELADO; "E" para ENTREGUE);
Observações: Texto longo.

Resposta:

TABELA ITENSPEDIDO

Número d o pedido: Inteiro;


Número d o item: Inteiro (este será u m número sequencial dentro de cada
pedido: se um pedido possuir 5 produtos, este campo será preenchido com
1 , 2 , 3 , 4 , 5).
Código d o produto: Inteiro;
Q u a n t i d a d e : Numérico;
Preço unitário: Numérico;
Desconto: Numérico.

^ TechnoEdition SQL server 2 0 0 8 - Módulo I •


Capítulo 3 Consultando dados
TecImoEdition

Exercicic laboratório
Laboratório I

A - Utilizando o banco de dados PEDIDOS e listando suas tabelas com base em


diferentes critérios

1. Colocar em uso o banco de dados PEDIDOS;

Resposta:

2. Listar a tabela PRODUTOS mostrando as colunas COD_PRODUTO, DESCRIÇÃO,


PRECO_CUSTO, PRECO_VENDA e calculando o lucro unitário (PRECO_VENDA-
V PRECO_CUSTO);

Resposta:

3. Listar a tabela PRODUTOS mostrando os campos COD_PRODUTO,


DESCRIÇÃO e calculando o valor total investido no estoque daquele produto
(QTD_REAL * PRECO_CUSTO);

Resposta:

4. Listar a tabela ITENSPEDIDO mostrando as colunas NUM_PEDIDO,


NUMJTEM, COD_PRODUTO, PR_UNITARIO, QUANTIDADE, DESCONTO e
calculando o valor de cada item (PR_UNITARIO * QUANTIDADE *
(1-DESCONTO/100));

Resposta:

Mi SQL Server 2008 - Módulo I TechnoEdition


Consultando dados
TechnoEdition

5 Listar a tabela PRODUTOS mostrando as colunas COD_PRODUTO, DESCRIÇÃO,


PRECO_CUSTO, PRECO_VENDA e calculando lucro estimado em reais (QTD_
REAL * (PRECO_VENDA - PRECO_CUSTO));

Resposta:

6 Listar a tabela PRODUTOS mostrando os campos COD_PRODUTO, DESCRIÇÃO,


PRECO_CUSTO, PRECO_VENDA, calculando o lucro unitário em reais (PRECO_
VENDA - PRECO_CUSTO) e o lucro unitário percentual ((100 * (PRECO_VENDA
PRECO_CUSTO) / PRECO_CUSTO));

' ^ ' existe uma f ^ ^ ^

^ o ^ -

Resposta:

TechnoEdition ífasl SQL Server 2008 - Módulo I


Consultando dados TechnoEdltion

ratório 2 ' * ' '


- utilizando o banco de dados PEDIDOS e listando suas tabelas com base em
novos critérios

1. Colocar em uso o banco de dados PEDIDOS;


Resposta:

2. Listar tabela PRODUTOS criando campo calculado (QTD_REAL - QTD.MINIMA)


e filtrar os registros resultantes, mostrando somente aqueles que tiverem a :,
quantidade real abaixo da quantidade mínima;

cita as ^

as cow?-^^ ^
este caso-

Resposta:

3. Listar a tabela PRODUTOS mostrando os registros que tenham quantidade real


acima de 5000;
Resposta:

SQL Server 2008 - Módulo I TechnoEdition


Consultando dados
TechnoEdition

4. Listar produtos com preço de venda inferior a R$ 0.50;

Resposta:

5. Listar a tabela PEDIDOS com valor total (VLR_TOTAL) acima de R$ 50.000,00;

Resposta:

5. Listar produtos com Q T D _ R E A L entre 500 e 1000 unidades;

Resposta:

7. Listar pedidos com valor total entre R$ 30.000,00 e R$ 50.000,00;

Resposta:

8. Listar produtos com quantidade real acima de 5000 e código do tipo igual a 6;

Resposta:

TechnoEdition SQL Server 2 0 0 8 - Módulo I


Consultando dados TechnoEdition

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 _

Laboratório 3 M-.:.: : . .j;^;.,^ : ,

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

1. Colocar em uso o banco de dados PEDIDOS;

Resposta:

2. Listar todos os pedidos com data de emissão anterior a Jan/2006.

Resposta:

3. Listar todos os pedidos com data de emissão no primeiro semestre de 2006;

Resposta:

4. Listar todos os pedidos com data de emissão em janeiro " E" j u n h o de 2006;

Resposta:

TechnoEdition SQL Server 2008 - Módulo I


Capí Consultando dados
TechnoEdilion

5. Listar todos os pedidos do Vendedor Código 1 em Jan/2006;

Resposta:

6. Listar o$ pedidos emitidos em Jan/2006 em uma sexta-feira;

Resposta:

TechnoEdition
Consultando dados A^ ,T.
™ ™ ™ TechnoEdtuon

Exercícios de laboratório

Laboratório 1

A - Trabalhando com atualizações, exclusões e transações no banco de dados


PEDIDOS

1. Colocar o banco de dados PEDIDOS em uso;

Resposta:

2. Aumentar o preço de custo de todos os produtos do tipo 2 em 1 5 % ;

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:

4. Alterar o campo IPI de todos os produtos com COD_TIPO = 3 para 5%;

Resposta:

TechnoEdition SQL Server 2008 - Módulo I


Capítulo 4 Consultando dados TechnoEdition

5. Alterar os seguintes cannpos do cliente de código 11;


ENDERECO: AV. CELSO GARCIA, 1234;
BAIRRO: TATUAPE;
CIDADE: SAO PAULO;
ESTADO: SP;
CEP: 03407080.

Resposta:

6 Copiar ENDERECO, BAIRRO, CIDADE, ESTADO e CEP do cliente código 13 para


os campos END_COB, BAI_COB, EST_COB e CEP_COB (do mesmo cliente);

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:

4. Alterar o campo IPI de todos os produtos com COD_TIPO = 3 para 5%;


Resposta:

TechnoEdition SQL Server 2008 - Módulo I


I^^^^JQ Consultando dados TechnoEdition

5. Alterar os seguintes cannpos do cliente de código 11;


ENDERECO: AV. CELSO GARCIA, 1234;
BAIRRO: TATUAPE;
CIDADE: SAO PAULO;
ESTADO: SP;
CEP: 03407080.
Resposta:

6 Copiar ENDERECO, BAIRRO, CIDADE, ESTADO e CEP do cliente código 13 para


os campos END_COB, BALCOB, EST_COB e CEP_COB (do mesmo cliente);
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

8. Alterar o campo ICMS de todos os clientes de SP para 18;

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:

M '-'^^^m^ 'm^í ''^^í^

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:

12. Excluir os vendedores (tabela VENDEDORES) com CODVEN acima de 5;

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:

14. Excluir os registros da tabela COPIA_PEDIDOS pertencentes ao vendedor ^


código 2;
Resposta:

15. Excluir os registros da tabela COPIA_PEDIDOS que sejam do primeiro semestre


de 2007;
Resposta:

16. Excluir todos'OS registros restantes da tabela COPIA_PEDIDOS;


Resposta:

17. Excluir a tabela COPIA PEDIDOS do banco de dados.


Resposta: ' ' • '
Constraints e índices TechnoEdition

ixercfci: boratório
,aboratórío 1
A - Criando constraints com ALTER TABLE

1. Abrir o script chamado CRIA_PEDIDOS_VAZIO.SQL fornecido pelo instrutor


e executar todo o código. Isso irá criar um banco de dados chamado
PEDIDOS_VAZIO, cuja a estrutura é a mesma do banco de dados PEDIDOS
já utilizado;
Resposta:

SQL Server 2008 - Módulo I TechnoEdition


Constraints e índices Capítulo

2. Colocar em uso o banco de dados PEDIDOS_VAZIO;

Resposta:

3. Criar chaves estrangeiras para a tabela PEDIDOS;

Com CLIENTES

Resposta;

Com VENDEDORES

Resposta:

4. Criar chaves estrangeiras para a tabela P R O D U T O S ;

Com TIPOPRODUTO

Resposta:

Com UNIDADES ' - - ' •

Resposta:

5. Criar chaves estrangeiras para a tabela ITENSPEDIDO;

Com PEDIDOS

Resposta:

TechnoEdition sT SQL Server 2 0 0 8 - Módulo


tu Constraints e índices TechnoEdition

Com PRODUTOS

Resposta;

Com TABCOR

Resposta:

6. Criar uma chave única para o campo UNIDADE da tabela UNIDADES;

Resposta:

7. Criar uma chave única para o campo TIPO da tabela TIPOPRODUTO;

Resposta:

8. Criar Check constraints para a tabela PRODUTOS, considerando os


seguintes aspectos:

• O preço de venda não pode ser menor que o preço de custo; ;

Resposta:

• O preço de custo precisa ser maior que zero;

Resposta:
Constraints e índices
TechnoEdition

O campo Q T D _ R E A L não pode ser nnenor que zero.

Resposta:

9. Criar Check constraints para a tabela ITENSPEDIDO, considerando os


seguintes aspectos:

O campo Q U A N T I D A D E deve ser maior que zero;

Resposta:

• O campo PR_UNITARIO deve ser maior que zero;

Resposta:

• O campo D E S C O N T O não pode ser menor que zero.

Resposta:

10. Criar valores default para P R O D U T O S , considerando os seguintes aspectos:

• 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

TechnoEdition SQL Server 2 0 0 8 - Módulo


liuinK Constraints e índices

Resposta:

1 1 . Criar índices para os seguintes campos da tabela CLIENTES:

• 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.

SQL Server 2008 - Módulo I TechnoEdÍtÍOn



TechnoEdition _
Constraints e índices

^' Laboratório 2

A - Criando constraints com CREATE TABLE

1 Criar o banco de dados CURSOSJNFORMATICA;


Resposta:

2 Colocar o banco CURSOSJNFORMATICA em uso;

Resposta:

3. Criar tabela CAD_SALAS;


ID_SALA inteiro, autonumerção e chave primária
NUM_SALA alfanuménco tamanho 15
QTD_LUGARES inteiro
DATA INCLUSÃO data e hora, não nulo, defalut data atua!
DATA_ALTERACAO data e hora, não nulo, defalut data atua!
SN_ATIVO alfanumérico tamanho 1, não nulo, default 'S'
« %íi» aceita somente " S" o u " N"

Resposta:

TechnoEdition SQL Server 2 0 0 8 - Módulo


Constraints e índices TechnoEdiuon

4 Criar tabela CAD_PERIODOS;


ID_PERIODO inteiro, autonumerção e chave primária
PERÍODO alfanumérico tamanho 20,
HORAJNICIO hora
HORA_FIM hora
DATAJNCLUSAO data e hora, não nulo, defalut data atual
DATA_ALTERACAO data e hora, não nulo, defalut data atual
SN ATIVO alfanumérico tamanho 1, não nulo, default 'S'
aceita somente " S " ou " N "
Resposta:

5. Criar tabela de CAD_ESTADOS;


ID_ESTADO inteiro, autonumeração e chave primária
COD_ESTADO_IBGE inteiro, não nulo, não pode duplicar
ESTADO alfanumérico tamanho 2, não pode duplicar
NOME_ESTADO alfanumérico tamanho 20, não pode duplicar
ICMS numérico tamanho 4 com 2 decimais
SN_ATIVO alfanumérico tamanho 1, não nulo, default 'S'
aceita somente " S " ou " N "
Resposta:

SQL Server 2008 - Módulo TechnoEdition


Constraints e índices
TechnoEdítion

6. Criar tabela de CAD_MUNICIPIOS;


ID_MUNICIPIO inteiro, autonumeração e chave primária
COD_MUNIC_IBGE inteiro, não nulo, não pode duplicar
ID_ESTADO inteiro, não nulo e chave estrangeira para
CAD_ESTADOS
MUNICÍPIO alfanumérico tamanho 50
SN_ATIVO alfanumérico tamanho 1, não nulo, default 'S'
aceita somente " S " ou " N "
Resposta:
Constraints e índices

7. Criar tabela CAD_PESSOAS;


ID_PESSOA inteiro, autonumerção e chave primária
NOME alfanumérico tamanho 40
LOGRADOURO alfanumérico tamanho 50
NUMERO alfanumérico tamanho 15
COMPLEMENTO alfanumérico tamanho 30
ID_MUNICIPIO inteiro, não nulo e chave estrangeira para CAD_MUNICIPIOS
CEP alfanumérico tamanho 8
F0NE1 alfanumérico tamanho 14
F0NE2 alfanumérico tamanho 14
E_MAIL alfanumérico tamanho 100 Í ^
WEB_SITE alfanumérico tamanho 100
DATAJNCLUSAO data e hora, não nulo, defalut data atual
DATA_ALTERACAO data e hora, não nulo, defalut data atual
SN ALUNO alfanumérico tamanho 1, não nulo, default 'S'
aceita somente "S" ou " N "
SN_FUNCIONARIO alfanumérico tamanho 1, não nulo, default 'N'
aceita somente "S" ou " N "
SNJNSTRUTOR alfanumérico tamanho 1, não nulo, default 'N'
aceita somente "S" ou " N "
SN_ATIVO alfanumérico tamanho 1, não nulo, default 'N'
aceita somente "S" ou " N "
Resposta:

3| SQL Server 2008 - Módulo I TechnoEdition


Constraints e índices Capitu

8. Criar tabela CAD_DEPTOS;


ID_DEPTO inteiro, autonunneração, chave primária
DEPTO alfanumérico tamanho 30
DATAJNCLUSAO data e hora, não nulo, defalut data atual
DATA_ALTERACAO data e hora, não nulo, defalut data atual
SN ATIVO alfanumérico tamanho 1, não nulo, default 'S'
aceita somente "S" ou " N '
Resposta;

9. Criar tabela CAD_CARGOS;


ID_CARGO inteiro, autonumeração, chave primária
CARGO alfanumérico tamanho 30
SALÁRIO numérico tamanho 10 com 2 decimais
DATAJNCLUSAO data e hora, não nulo, defalut data atual
DATA_ALTERACAO data e hora, não nulo, defalut data atual
SN ATIVO alfanumérico tamanho 1, não nulo, default 'S'
aceita somente "S" ou " N "
Resposta:

TechnoEdition jm^í SQL Server 2008 - Módulo I


TechnoEdition

10. Criar tabela CAD_FUNCIONARIOS;


ID_PESSOA_FUNC inteiro, chave primária, chave estrangeira para CAD_
PESSOAS
ID_DEPTO inteiro, não nulo, chave estrangeira para CAD_DEPTOS
ID_CARGO inteiro, não nulo, chave estrangeira para CAD_CARGOS
DATAJNCLUSAO data e hora, não nuio, defalut data atua!
DATA_ALTERACAO data e hora, não nuio, defalut data atua!
DATA_AD MISSÃO data e hora, não nulo, defalut data atua!
PORC_COMISSAO número com tamanho 4 e 2 decimais, não nulo
deve estar no intervalo de O até 10
Resposta:

11 Char tabela CADJNSTRUTORES_NIVEIS;


ID_NIVEL inteiro, autonumeração, chave primária
NÍVEL alfanumérico tamanho 20
DATAJNCLUSAO data e hora, não nulo, defalut data atual
DATA_ALTERACAO data e hora, não nulo, defalut data atual
SN_ATIVO alfanumérico tamanho 1, não nulo, default 'S'
aceita somente "S" ou " N "
r

TechnoEíition _
Constraints e índices Capítulo 5

Resposta;

12 Criar tabela CADJNSTRUTORES;


ID_PESSOAJNSTR inteiro, chave pnmária, chave estrangeira para CAD_
PESSOAS
DATA_ADMISSAO data e hora, não nulo, defalut data atual
ESCOLARIDADE alfanumérico tamanho 1, não nulo
aceita " 1 " : primeiro grau
" 2 " segundo grau
r " 3 " superior incompleto
" 4 " superior completo
" 5 " póstexto
graduado
longo
CURRICULUM

Resposta:
•3 bj,.í.-0

3 • r. \

TechnoEdition SQL Server 2008 - Módulo I


Constraints e índices TechnoEdition

13. Criar tabela CAD_TREINAMENTOS_AREAS;


ID_AREA inteiro, autonunnerção e chave primária,
AREA alfanumérico tamanho 30,
DATA_INCLUSAO data e hora, não nulo, defalut data atual
DATA_ALTERACAO data e hora, não nulo, defalut data atuai
SN_ATIVO alfanumérico tamanho 1, não nulo, default 'S'
aceita somente "S" ou " N "

Resposta:

14. Cnar tabela CAD_TREINAMENTOS;


ID_TREINAMENTO inteiro, autonumerção e chave primáha*
TREINAMENTO alfanumérico tamanho 40 ^
ID_AREA inteiro, não nulo, chave
estrangeira para CAD_AREAS_TREINAMENTO
CARGA_HORARIA inteiro
DATAJNCLUSAO data e hora, não nulo, defalut data atual
DATA_ALTERACAO data e hora, não nulo, defalut data atual
SN_ATIVO alfanumérico tamanho 1, não nulo, default '5'
aceita somente "S" ou " N "

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 ;

ID_PESSOA_INSTR inteiro, não nulo, chave


estrangeira para CAD_PESSOAS
ID_TREINAMENTO inteiro, não nulo, chave
estrangeira para CAD_TREINAMENTOS
DATA_INCLUSAO data e hora, não nulo, defalut data atual
VLR_HORA , nunnérico t a m a n h o 6 com 2 decimais
ID_NIVEL • inteiro, não nulo, chave estrangeira para CAD_
INSTRUTORES_NIVEIS
OBS.; A chave primária é composta pelos 2 campos

Resposta:

TechnoEdition . i>jr SQL Server 2 0 0 8 - Módulo I


Constraints e índices
TechnoEdition

16. Criar tabela MOV_CURSOS;


ID_CURSO inteiro, autonumerção e chave primária
ID_TREINAMENTO inteiro, não nulo, chave estrangeira para
CAD_TREINAMENTOS
ID_PESSOA_INSTR inteiro, não nulo, chave estrangeira para
CAD_PESSOAS
ID_SALA inteiro, não nulo, chave estrangeira para
CAD_SALAS
ID_PERIODO inteiro, não nulo, chave estrangeira para
CAD_PERIODOS
DATAJNiCIO data, não nulo
DATA_FIM data, não nulo
DATAJNCLUSAO data e hora, não nulo, defalut data atual
DATA_ALTERACAO data e hora, não nulo, defalut data atual
-- "O": Pendente, "1 ": Enn andamento, " 2 " : Finalizado
STATUS alfanumérico tamanho 1

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:

TechnoEdition SQL Server 2 0 0 8 - Módulo I


A s s o c i a n d o tabelas
TechnoEdition

A - Considerando o diagrama relacional


PEDIDOS

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 ^ ^

1. Colocar em uso o banco de dados PEDIDOS;


Resposta:

2 Listar os campos NUM_PEDIDO, DATA_EMISSAO e VLR_TOTAL de PEDIDOS,


seguidos de N O M E do vendedor;

Resposta:

3 Listar os campos NUM_PEDIDO, DATA_EMISSAO e VLR_TOTAL de PEDIDOS,


seguidos de NOME do cliente;

Resposta:

4. Listar os pedidos com o nome do vendedor e o nome do cliente;

Resposta:

5. Listar os itens de pedido (ITENSPEDIDO) com o nome do produto (PRODUTOS.


DESCRIÇÃO);

Resposta:

TechnoEdition SQLServer 2 0 0 8 - Módulo I


Associando tabelas
TechnoEdition

6, Listar os campos 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 (TIPOPRODUTO.TIPO);

Resposta:

7 Listar os campos C O D _ P R O D U T O e D E S C R I Ç Ã O da tabela P R O D U T O S ,


seguidos da descrição do tipo de produto (TIPOPRODUTO.TIPO) e do nome da
unidade de medida (UNIDADES.UNIDADE);

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:

a* SQL Server 2008 - M ó d u l o I TechnoEdition


r
r Associando tabelas
TechnoEdition

n 9. Listar os campos: NUM_PEDIDO, NUMJTEM, COD_PRODUTO, QUANTIDADE


r- e PR_UNITARIO da tabela ITENSPEDIDO; COD_PRODUTO e DESCRIÇÃO da
tabela PRODUTOS; seguidos da descrição do tipo de produto (TIPOPRODUTO.
TIPO), do nome da unidade de medida (UNIDADES.UNIDADE) e nome da cor .3.2;
(TABCOR.COR);
Resposta:
n
n

10.Listar todos os pedidos (PEDIDOS) do vendedor 'MARCELO' em Jan/2007;

^ Resposta:
Associando tabelas
TechnoEdition -

11 .Listar os nomes dos clientes (CLIENTES.NOME) que efetuaram compras em


janeiro de 2007; ./;-,,„-. :. •

Resposta:

12.Listar os nomes de produtos (PRODUTOS.DESCRIÇÃO) que foram vendidos


em Janeiro de 2 0 0 7 ;

Resposta:

13.Listar N U M _ P E D I D O , V L R J T O T A L (PEDIDOS) e NOME (CLIENTE) Mostrar


apenas pedidos de janeiro de 2007 e clientes que tenham N O M E iniciado
com MÁRCIO;

Resposta:
Associando tabelas
TechnoEdition „

14.Listar: N U M _ P E D I D O , Q U A N T I D A D E vendida e PR_UNITARIO (de


ITENSPEDIDO); DESCRIÇÃO (de PRODUTOS); NOME do vendedor (de
V E N D E D O R E S ) que vendeu cada item de pedido;

Resposta:

15.Listar todos os itens de pedido com desconto superior a 7 % . Mostrar NUM_


P E D I D O , DESCRIÇÃO do produto, NOME do cliente, NOME do vendedor e
Q U A N T I D A D E vendida;

Resposta:

16.Listar os itens de pedido com o nome do produto, a descrição do tipo, a descrição


da unidade e o n o m e da cor, mas apenas os itens vendidos em janeiro de 2007 na
cor LARANJA;

Resposta:

TechnoEdition SQL Server 2008 - Módulo I


I; A s s o c i a n d o t a b e l a s
TechnoEditíon

17.Listar NOME e FONE1 dos fornecedores que venderann o produto CANETA


STAR I;

Resposta:

18. Listar a DESCRIÇÃO dos PRODUTOS comprados do fornecedor cujo N O M E


começa com LINCE;

Resposta:

19. Listar NOME e F0NE1 dos fornecedores, bem como DESCRIÇÃO dos produtos
com QTD_REAL abaixo de QTD_MINIMA;

Resposta:

20. Listar todos os PRODUTOS comprados do fornecedor cujo nome inicia-se


com FESTO

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 .

1. Colocar em uso o banco de dados CURSOSJNFORMATICA;

Resposta:

2. Apresentar todas as salas de aula para as quais não há n e n h u m curso marcado;

Resposta:

3. Apresentar todos os treinamentos para os quais não há instrutor;

Resposta:

SQL Server 2 0 0 8 - M ó d u l o I TechnoEdÍtÍOn


Consultas com subqueries

4, Apresentar os alunos ( C A D _ P E S S O A S ) que não têm e nem tiveram cursos


agendados;

Resposta:

5. Apresentar os departamentos que não possuem funcionários cadastrados;

Resposta:

6. Apresentar os cargos para os quais não existem funcionários cadastrados;

Resposta:

TechnoEdition SQL Server 2008 - Módulo I


Consultas com subqueries
TEcrinoEdiUon

7. Apresentar as pessoas que sejam de estados cujo ICMS seja menor que 7;

Resposta:

8. Apresentar os dados do instrutor que possui o maior valor hora (VLR_HORA);

Resposta:
Atualizando e excluindo dados em associações e subqueries
... ÍEchnoEdition

Exercicic laboratono
Laboratório 1

A - Atualizando tabelas do banco de dados PEDIDOS com associações e subquery

1. Colocar em uso o banco e dados PEDIDOS;


Resposta:

2. Alterar a tabela TABELACAR, mudando o salário inicial do cargo OFFICE BOY


para 600,00;

Resposta:

3. Alterar a tabela de cargos, estipulando 10% de aumento para o campo


SALARIOJNIC de todos os cargos;
Resposta:

4. Transferir para o campo SALÁRIO da tabela EMPREGADOS o salário inicial


cadastrado no cargo correspondente da TABELACAR;
Resposta:
Atualizando e excluindo dados em associações e subqueries
TechnoEdition

5. Reajustar os preços de venda de todos os produtos de modo que fiquem 30%


acima do preço de custo (PRECO_VENDA = PRECO_CUSTO * 1.3);

Resposta:

6. Reajustar os preços de venda dos produtos com COD_TIPO = 5, de modo que


II fiquem 20% acima do preço custo; s ,Í:::?;A

Resposta:

TechnoEdition SQL Server 2008 - Módulo I


Atualizando e excluindo dados em associações e subqueries

7. Reajustar os preços de venda dos produtos com descrição do tipo igual


à RÉGUA, de modo que fiquem 40% acima do preço custo. Para isso,
considerar as seguintes informações:
PRECO_VENDA = PRECO_CUSTO * 1.4;
para produtos com TIPOPRODUTO.TIPO = 'RÉGUA';
precisa fazer um JOIN de PRODUTOS com TIPOPRODUTO V.

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:

SQL Server 2008 - Módulo I TechnoEdition


Atualizando e excluindo dados em associações e subqueries

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:

12. Criar a tabela ESTADOS com os respectivos campos:


• C O D _ E S T A D O : Inteiro, autonumeração e chave primária;
SIGLA: Char(2);
• ICMS: Numérico, tamanho 4 com 2 decimais.

Resposta:

13. Copiar o seguinte resultado SELECT para a tabela ESTADOS:

TechnoEdition SQL Server 2 0 0 8 - Módulo I


Atualizando e excluindo dados em associações e subqueries

Resposta:

14. Criar o campo C O D _ E S T A D O na tabela CLIENTES;

Resposta:

15. Copiar para C L I E N T E S . C O D _ E S T A D O o código do Estado gerado na


tabela ESTADOS;

Resposta:

^ SQL Server 2008 - Módulo I ..-31 TechnoEditiOD


Agrupando dados
TechnoEdition

A - Realizando consultas e ordenando dados no banco de dados PEDIDOS

Depois de colocar em uso o banco d e d a d o s P E D I D O S p o r meio da instrução


U S E , realizar os seguintes passos:

1. Calcular a média de preço de venda ( P R E C O _ V E N D A ) do cadastro de P R O D U T O S ;

Resposta:

2. Calcular a quantidade de pedidos cadastrados e m janeiro de 2007 (o maior e o


menor valor total, VLR_TOTAL);

Resposta:

3. Calcular o valor total vendido (soma de P E D I D O S . V L R _ T O T A L ) em janeiro de 2007;

Resposta:

4. Calcular o valor total vendido pelo vendedor código 1 em janeiro de 2007;

Resposta:

|a| SQL Server 2 0 0 8 - Módulo I TechiloEdition


TechnoEdition „
Agrupando dados

5. Calcular o valor total vendido pela vendedora LEIA enn janeiro de 2007;
Resposta:

6. Calcular o valor total vendido pelo vendedor MARCELO em janeiro de 2007;


Resposta:

7. Calcular© valor da comissão (soma de PEDIDOS.VLR_TOTAL * VENDEDORES.


PORC_COMISSAO/100) que a vendedora LEIA recebeu em janeiro de 2007;
Resposta:

8. Calcular o valor da comissão que o vendedor MARCELO recebeu em janeiro


de 2007;
Resposta:

TechnoEdition
Agrupando dados
TechnoEdition

9. Listar os totais vendidos por cada vendedor (mostrar VENDEDOR.NOME ey


a soma de PEDIDOS.VLR_TOTAL) em janeiro de 2007. Deve exibir o nome
do vendedor;

Resposta:

10. Listar o total comprado por cada cliente em janeiro de 2 0 0 7 . Deve mostrar o
nome do cliente;

Resposta:

1 1 . Listar o valor e a quantidade total vendida de cada produto em janeiro de 2007;

Resposta:

m SQL Server 2 0 0 8 - Módulo I TechnoEdition


Agrupando dados

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:

TechnoEdition SQL Server 2008 - Módulo I


MIOILC Agrupando dados
TechnoEdiuon

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:

17. Listar o total vendido em cada um dos meses de 2006.

Resposta:

SQL Server 2 0 0 8 - Módulo I TechnoEdition


2778A: Writing Queries Using MicrosoftÒ SQL Server® 2008 Transact - SQL.
Microsoft Corporation. 2008. 387 p.

6232A: Implementing a Microsoft® SQL Server® 2008 Database. Microsoft


Corporation. 2008. 450 p.

IMPACTA TECNOLOGIA ELETRÔNICA. Departamento de Apostilas. SQL


2005 - Módulo I. São Paulo, 2006. 354 p.

IMPACTA TECNOLOGIA ELETRÔNICA. Departamento de Apostilas. SQL


2005 - Módulo II. São Paulo, 2006. 387 p.

MSDN - Microsoft Developer Network. Disponível em: http://www.msdn.


microsoft.com. Acesso em: 12/01/2009.

Você também pode gostar