Professional Documents
Culture Documents
PRÉ-REQUISITOS
DURAÇÃO
Duração total de 40 horas divididas em 4,5 horas em 9 sábados.
Expectativa de início em ......... e término em .........
OBJETIVO
Inserir participantes do treinamento no aprendizado da linguagem SQL SERVER,
através da apresentação dos assuntos fundamentais para compreender os conceitos
básicos acerca do SQL, além da prática de exercícios simples para reforçar a teoria
e conhecer os principais comandos e ferramentas da linguagem.
INTRODUÇÃO
Este é o primeiro módulo de uma série de três, neste módulo iremos aprender os
conceitos básicos de banco de dados relacional, sua utilização e boa parte dos
recursos que o SQL Server nos disponibiliza para manipular as informações
armazenadas na base de dados.
SUMÁRIO
Banco de dados
Num banco de dados pode-se adicionar, atualizar e consultar informações, mas para
que tudo isso ocorra de maneira organizada é necessário um software que gerencie
todo este processo e garanta a integridade dos dados. Este software e denominado
SGBD - Sistema Gerenciador de Banco de Dados.
Atualmente existem diversos SGBDs no mercado, como por exemplo, DB2, Sybase,
Oracle, SQL Server, MySql, Firebird, PostGreSQL. A grande maioria destes SGBDs
possuem uma versão free que podem ser baixados do site de seus fabricantes.
Fica evidente então que existe uma diferença entre banco de dados e SGBD, apesar
de ser comum o banco de dados ser chamado pelo mesmo nome do seu
gerenciador. Exemplificando, SQL Server é o nome do SGBD e não do banco de
dados, como é comum se pensar.
Quando se fala de modelo de banco de dados é preciso entender que isso se refere
ao modelo conceitual de banco de dados. Um modelo conceitual é a representação
de estrutura do banco de dados. Pode comparar com a planta de uma casa ou um
mapa de estradas, pois estes apenas representam objetos do mundo real.
Existem diversos tipos de modelos de banco de dados, entretanto a maior parte dos
SGBDs do mercado atual segue o modelo relacional. Tomando este modelo como
base nós podemos identificar três gerações de modelos:
7
Capítulo 1 - Conceitos básicos
1- Geração Pré-Relacional
2- Geração Relacional
• Modelo Relacional – não segue a evolução dos modelos anteriores, pois foi
criado baseado na teoria dos conjuntos, ramo da matemática que
simultaneamente simples e poderoso. A estrutura de dados utilizada é a
relação, ou seja, tabela. Uma tabela é constituída de colunas(atributo ou
campo) e linhas(registro, instância ou tupla).
3- Geração Pós-Relacional
8
Capítulo 1 - Conceitos básicos
9
Capítulo 1 - Conceitos básicos
Embora o SQL tenha sido originalmente criado pela IBM, rapidamente surgiram
vários "dialetos" desenvolvidos por outros produtores. Essa expansão levou à
necessidade de ser criado e adaptado um padrão para a linguagem. Esta tarefa foi
realizada pela American National Standards Institute (ANSI) em 1986 e ISO em
1987.
O SQL foi revisto em 1992 e a esta versão foi dado o nome de SQL-92. Foi revisto
novamente em 1999 e 2003 para se tornar SQL:1999 (SQL3) e SQL:2003,
respectivamente. O SQL:1999 usa expressões regulares de emparelhamento,
queries recursivas e gatilhos (triggers). Também foi feita uma adição controversa de
tipos não-escalados e algumas características de orientação a objeto. O SQL:2003
introduz características relacionadas ao XML, seqüências padronizadas e colunas
com valores de auto-generalização (inclusive colunas-identidade).
Tal como dito anteriormente, o SQL, embora padronizado pela ANSI e ISO, possui
muitas variações e extensões produzidos pelos diferentes fabricantes de sistemas
gerenciadores de bases de dados. Tipicamente a linguagem pode ser migrada de
plataforma para plataforma sem mudanças estruturais principais.
Os padrões da SQL:
10
Capítulo 1 - Conceitos básicos
Estes comandos são relativamente simples o que pode levar algumas pessoas a
acharem que é extremamente simples manipular informações em uma base de
dados, e que qualquer um pode ser um DBA, mas a história não é bem essa, estes
comandos possuem clausulas que podem tornar um comando SQL muito complexo,
maior ainda se realizado em ambientes onde aplicações acessam e alteram
informações o tempo todo, a linguagem SQL é muito poderosa, mas só com ela não
se pode construir uma aplicação completa, pois a SQL não possui instruções para
construção de programas, por este motivo a Microsoft criou a linguagem Transact-
SQL, para que funcione os comandos SQL em conjunto com uma linguagem
procedural.
11
Capítulo 1 - Conceitos básicos
12
Capítulo 3 – DML Simples
13
Capítulo 3 – DML Simples
Databases
Os objetos que fazem parte de um sistema de banco de dados são criados dentro de
um database, uma estrutura lógica composta por dois tipos de arquivos, um
responsável por manter a estrutura de tabelas com seus dados e outro responsável
pelo armazenamento de Transactionlog, ou seja, é armazenado todas as transações
efetuadas.
CREATE DATABASE
Por exemplo, para criarmos uma base de dados com o nome de DB_ESTUDO,
utilizamos a seguinte instrução: CREATE DATABASE DB_ESTUDO.
Quando um banco de dados é criado o mesmo encontra-se vazio, até que uma
tabela seja inserida, no entanto para criarmos uma tabela no banco de dados
precisamos ter acesso a ele, para utilizarmos um banco de dados utilizamos a
clausula use, então executaremos a seguinte instrução:
14
Capítulo 3 – DML Simples
Caso seja necessário eliminar uma base de dados, devemos utilizar a instrução
drop database.
Tabelas
CREATE TABLE
inCod_Cli vcNome_Cli
1 Marina Farina
2 Edson Mendes
3 Aline Moda
4 Tatiana Souza
5 Cássio Adriano
Iremos criá-la em nossa base de dados DB_Estudo para isso caso você tenha
excluído a base de dados será necessário recriá-la e utilizar a instrução “use” para
acessarmos a base de dados onde iremos criar nossa primeira tabela.
15
Capítulo 3 – DML Simples
O comando Insert
Obs. No SQL 7 e Access é obrigatório usar a clausula “into”, a partir do SQL 2000 e
superior está clausula não é mais obrigatória.
16
Capítulo 3 – DML Simples
A instrução Select
Por exemplo, para lermos os dados da tabela Tb_Clientes que criamos utilizamos a
instrução:
O asterisco (*) significa que queremos trazer todas as colunas da tabela Cliente.
17
Capítulo 3 – DML Simples
A segunda Tabela
Agora, devemos criar a tabela cliente com diferentes dados, com e-mail e endereço,
de modo que ela seja exibida da seguinte maneira:
use DB_Estudo
create table tb_cliente
(
inCod_cli int
,vcNome_cli varchar(30)
,vcEnd_cli varchar(30)
,chFone_cli char(11)
,vcEmail_cli varChar(30)
)
insert tb_cliente
values(1,'Marina Farina','R Campos, 299','3211-1563','mari@blue.com')
insert tb_cliente
values(2,'Edson Mendes','Av. Paulista, 277','5125-2000','emendes@tree.com')
insert tb_cliente
values(3,'Aline Moda','Al. Santos, 512','4116-1518','amoda@estilo.com')
insert tb_cliente
values(4,'Tatiana Souza','Av. Rebouças, 15','9985-0965','tsouza@comp.com')
insert tb_cliente
values(5,'Cássio Adriano','Av. 9 de julho, 60','5465-1358','cadriano@tetra.com')
Finalmente podemos finalizar este script e partir para o próximo, mas antes
eliminaremos está tabela através da instrução:
18
Capítulo 3 – DML Simples
A terceira Tabela
Neste próximo exemplo iremos inserir dados referentes ao salário e a data que o
funcionário foi registrado, para isso, utilize o datatype decimal e o datatype datetime.
O tipo decimal necessita de dois parâmetros separados por vírgula para identificar a
parte inteira e qual será a parte decimal como (10,2),
Durante a inclusão dos dados decimais, o ponto (.) deverá ser utilizado como
separador de casas decimais.
use db_estudo
create table tb_cliente
(
inCod_cli int
, vcNome_cli varchar(30)
, vcEnd_cli varchar(30)
, chFone_cli char(11)
, vcEmail_cli varChar(30)
, dcSal_cli decimal(10,2)
, dtData_cli datetime
)
Depois de criada a tabela adicione os dados:
19
Capítulo 3 – DML Simples
• INSERT é usada para somar uma fila (formalmente uma tupla) a uma tabela
existente.
• SELECT é o comumente mais usado do DML, comanda e permite ao usuário
especificar uma query como uma descrição do resultado desejado. A questão
não especifica como os resultados deveriam ser localizados.
• UPDATE para mudar os valores de dados em uma fila de tabela existente.
• DELETE permite remover filas existentes de uma tabela.
INSERT
20
Capítulo 3 – DML Simples
INSERT posicional
INSERT Tb_Cliente
VALUES (1,'Marcos Evangel','Rua 1','3515-2119','mEva@free.com','4500.26','10/15/02')
INSERT Tb_Cliente
VALUES (2,'Adalberto Bacili','Rua 2','3288-1563','aBaci@free.com','5600.38','10/20/03')
INSERT Tb_Cliente
VALUES (3,'Sérgio Manoel','Rua São Bento','4545-1212','sMano@free.com','4982.74','01/25/04')
INSERT Tb_Cliente
VALUES (4,'Thiago Hawano','Rua Direta','7875-1520','tHawa@free.com','6423.12','02/14/06')
INSERT Tb_Cliente
VALUES (5,'Carina Tugues','Rua Torta ','3132-3113','cTugue@free.com','6800.98','01/13/98')
INSERT Tb_Cliente
VALUES (6,'Fabio Monte','Av. Santos','2526-1515','fMonte@free.com','4678.15','06/25/92')
21
Capítulo 3 – DML Simples
INSERT declarativo
Obs. As três estruturas estão corretas, neste exemplo apenas estruturei as instruções de
formas diferentes para ilustrar algumas maneiras de organizar a instrução, lembrando
que para executarmos uma instrução, temos de selecionar todo o comando referente a
mesma.
22
Capítulo 3 – DML Simples
SELECT
Para que todos os dados contidos dentro da tabela cliente sejam exibidos,
devemos utilizar o seguinte comando:
23
Capítulo 3 – DML Simples
24
Capítulo 3 – DML Simples
25
Capítulo 3 – DML Simples
Algumas vezes necessitamos exibir alguns dados que não existem em uma
tabela, como por exemplo, se quisermos exibir um aumento de 10% no salário
de cada cliente. Desejamos exibir esta informação, mas não queremos salvar
esta informação na tabela. Vejamos o exemplo:
26
Capítulo 3 – DML Simples
Conforme a tabela abaixo o cliente Fabio Monte foi adicionado duas vezes na
tabela de cadastro de cliente, mas desejamos exibir apenas uma vez cada
registro.
27
Capítulo 3 – DML Simples
Para copiarmos dados de uma tabela para outra, precisamos que a estrutura
das tabelas seja similar, ou se diferentes, que a tornemos similares por meio
da instrução SELECT.
Para este exemplo, criaremos duas tabelas com estruturas idênticas, mas
representando entidades diferentes.
CREATE TABLE tb_cliente
(
inCod_cli int
, vcNome_cli varchar(30)
, vcEnd_cli varchar(30)
, chFone_cli char(11)
, vcEmail_cli varChar(30)
, dcSal_cli decimal(10,2)
, dtData_cli datetime
)
28
Capítulo 3 – DML Simples
Para este exemplo, criaremos duas tabelas com estruturas idênticas, mas
representando entidades diferentes.
29
Capítulo 3 – DML Simples
3.3. UPDATE
Os registros de cada tabela podem ser alterados por meio do comando UPDATE,
por exemplo, por meio deste comando podemos aumentar o valor do salário de
todos os clientes em 5%.
Para utilizarmos esta instrução precisamos, especificar algumas informações.
Como o nome da tabela que será atualizada e as colunas que sofrerão a
alteração
UPDATE Tb_cliente
SET dc_Sal_cli = dc_Sal_cli * 1.05
30
Capítulo 3 – DML Simples
DELETE
Por exemplo:
Obs. Caso alguma linha não possa ser removida da tabela, nenhum dado será
eliminado.
31
Capítulo 4 - A cláusula WHERE
32
Capítulo 4 - A cláusula WHERE
Exemplos:
Exemplo 2: Seleção
33
Capítulo 4 - A cláusula WHERE
34
Capítulo 4 - A cláusula WHERE
Logo queremos os produtos “onde” Tipo= Eletrônicos “ou” Valor <= 700,00
UPDATE tb_Produto
SET dcValor_Prod = dcValor_Prod *1.1
WHERE vcTipo_Prod = 'Eletrônicos'
OR dcValor_Prod < = 700.00
• Exemplo Operador OR
• Exemplo Operador IN
35
Capítulo 4 - A cláusula WHERE
O operador lógico NOT IN, ao contrário de IN, permite obter resultados que não
esteja em uma determinada condição. Por exemplo, não queremos os produtos
do tipo Eletrônicos e Informática.
36
Capítulo 4 - A cláusula WHERE
37
Capítulo 4 - A cláusula WHERE
O Operador LIKE
Para obter todos os produtos que contenham as letras 'ad' no meio (ou no início
ou no fim), use:
38
Capítulo 4 - A cláusula WHERE
39
Capítulo 4 - A cláusula WHERE
Por exemplo, queremos produtos que não possuem a letra “R” no nome do
produto.
Outro caractere para usar em padrões é o sublinhado (_). Ele combina com um
único caractere. Por exemplo, se nos seus dados existem campos como, por
exemplo, nome 'Sousa' ou 'Souza', você pode usar: LIKE '%sou_a%'.
40
Capítulo 5 - A Cláusula ORDER BY
ORDER BY
Para ver o resultado numa ordem particular, use a cláusula ORDER BY. Se
estiver presente, deve ser a última cláusula do comando SELECT, a cláusula
ORDER BY é utilizada em conjunto com a instrução SELECT, a fim de retornar
o resultado de uma consulta em uma determinada ordem.
41
Capítulo 5 - A Cláusula ORDER BY
• ASC
Quando utilizamos está instrução, estamos solicitando uma ordenação
ascendente, ou seja, do menor para o maior.
vcNome_Prod dcValor_Prod
CD 1.82
DVD 4.24
Mouse 54.45
Caixas de Som 96.80
DVD Player 165.00
Teclado 181.50
Celular 1500.00
Filmadora Digital 2500.00
Televisor 25000.00
• DESC
Quando utilizamos está instrução, estamos solicitando uma ordenação
descendente, ou seja, do maior para o menor.
vcNome_Prod dcValor_Prod
Televisor 25000.00
Filmadora Digital 2500.00
Celular 1500.00
Teclado 181.50
DVD Player 165.00
Caixas de Som 96.80
Mouse 54.45
DVD 4.24
CD 1.82
42
Capítulo 5 - A Cláusula ORDER BY
• ASC e DESC
A cláusula TOP
Está cláusula é muito utilizado também para realizarmos testes para verificarmos
nomes de campos de uma determinada tabela sem precisarmos retornar todos
os registros.
43
Capítulo 5 - A Cláusula ORDER BY
Agora vamos supor que precisamos obter como resultado o produto com a
menor quantidade de unidades. Porém, é preciso considerar a existência do e
produtos com a mesma quantidade de unidades. Neste caso o comando para
retornar os produtos com menor numera de unidades:
44
Capítulo 5 - A Cláusula ORDER BY
45
Capítulo 7 - Associando Tabelas
Integridade de Domínio
Integridade de Entidade
Integridade Referencial
46
Capítulo 7 - Associando Tabelas
GO
47
Capítulo 7 - Associando Tabelas
Constraints
A fim de assegurar a integridade dos dados, o SQL SERVER oferece cinco tipos
de restrições diferentes, os quais estão relacionados na tabela abaixo:
Chaves primárias
48
Capítulo 7 - Associando Tabelas
IDENTITY
Quando indicamos um campo como IDENTITY estamos dizendo que este campo
será auto incrementável, portanto não podemos especificá-lo ou adicionar um
valor ao mesmo quando realizarmos um INSERT na tabela, pois os valores deste
campo são auto geráveis.
SEED - Semente
Corresponde ao numero do primeiro valor que será inserido na tabela.
INCREMENT - Incremento
É o valor incremental que é acrescentado ao valor de identidade à linha anterior,
que foi carregado, é o famoso “passo”.
49
Capítulo 7 - Associando Tabelas
50
Capítulo 7 - Associando Tabelas
Nota: As constraints do tipo UNIQUE podem ser utilizadas para referenciar uma
chave estrangeira.
Chaves estrangeiras
• Tabela de Colaborador
• Tabela de Dependente
inIdDepen chSexo
Chave Primária inIdColab vcNome dtNasc apenas M ou F vcParente
1 4 Isabella da Silva 02/13/95 F Filha
2 2 Marina Faria 01/15/82 F Esposa
3 3 Paulo Henrique 09/21/80 M Marido
4 3 Aline Faria 07/16/93 F Filha
3 1 Thiago Maia 09/21/99 M Filho
51
Capítulo 7 - Associando Tabelas
Regras de validação
Por exemplo, ao criarmos um campo que classifique uma pessoa como sexo
Masculino ou Feminino, poderia restringir a informação para este campo como
sendo somente Masculino e Feminino, dessa forma garantimos que ao retornar
uma consulta, não encontraremos um valor estranho como, por exemplo, o
endereço na coluna de sexo.
Valor Padrão
O valor padrão é uma regra que pode ser aplicada a inúmeras colunas de sua
tabela, quando um valor padrão é estabelecido para uma determinada coluna,
o sistema assume que ele deve ser utilizado nas situações em que o usuário,
deixa de inserir um valor a um campo da tabela.
• Tabela de Colaborador2
dcSalario
inIdColab vcNome chSexo valor padrão 1000.00
1 Luana Maia M 1000.00
2 André Inca M 1000.00
3 Suzana Silva F 2530.00
4 Rogério Tecca M 1752.00
Além dos valores padrão, podemos atribuir valores nulos e não nulos a uma
determinada coluna. Assim ao deixarmos de inserir um valor em um
determinado campo, o mesmo assumiria um valor nulo, e ao restringirmos
como não nulo, não poderemos deixar de inserir valor neste campo, ao
52
Capítulo 7 - Associando Tabelas
Data types
Datatypes são os tipos de dados que o SQL Server aceita. Eles existem para
que possamos definir o tipo de conteúdo de um campo de tabela ou de uma
variável ou parâmetro.
TIPOS TEXTO
LIMITE TAMANHO
NOME TABELA ARMAZENA
(CARACTERES) (CARACTERES)
CARACTERES, ONDE N INDICA O TAMANHO DO
CHAR(N) ASCII 8000 EXATAMENTE N
CAMPO
CARACTERES, ONDE N INDICA O TAMANHO DO
VARCHAR(N) ASCII 8000 ATÉ N
CAMPO
UNICOD CARACTERES, ONDE N INDICA O TAMANHO DO
NCHAR(N) 4000 EXATAMENTE N
E CAMPO
NVARCHAR(N UNICOD CARACTERES, ONDE N INDICA O TAMANHO DO
4000 ATÉ N
) E CAMPO
TEXT ASCII 231 - 1 ATÉ 231 - 1 CARACTERES
UNICOD 31
NTEXT 2 -1 ATÉ 231 - 1 CARACTERES
E
53
Capítulo 7 - Associando Tabelas
Regras de Constraints
As constraints são utilizadas para limitar o tipo de informação que pode ser
inserida em uma tabela, uma constraint pode ser especificada quando uma
tabela é criada (com a declaração CREATE TABLE) ou após a tabela ser
criada (com o ALTER TABLE).
Constraint DEFAULT
Esta constraint serve para indicar um valor padrão para um campo, quando
uma declaração INSERT não especifica o valor para a coluna. Uma omissão
de um campo no INSERT pode atribuir um valor constante, o valor de um
sistema de função, ou NULL para uma coluna. Você pode usar uma
constraint Default em qualquer coluna, exceto colunas IDENTIDADE e
colunas do tipo timestamp.
Constraint UNIQUE
Constraint CHECK
Quando criamos uma constraint do tipo CHECK o banco irá analisar os dados
quando tentarmos inserir ou modificar uma coluna. Se a expressão é avaliada
para false, o banco de dados não irá salvar a nova linha ou alteração.
Implementar uma contraint check é semelhante a construir uma cláusula
WHERE. Podemos utilizar muito dos mesmos operadores (>, <, <=,> =, <>, =)
e mais o BETWEEN, IN, LIKE, e NULL. Podemos também utilizar expressões
com os operadores AND e OR. Assim podemos restringir a entrada de valores
em um determinado campo.
54
Capítulo 7 - Associando Tabelas
Quando o campo que está sendo referenciado residir na mesma tabela, não
precisamos uitilizar a palavra-chave FOREIGN KEY, podendo somente utilizar
REFERENCES. Esta constraint também pode ser desabilitada, para o caso
de uma grande inserção de dados na tabela.
Entidade, do latim, entitas, significa ser, existência; é algo que possui existência
distinta e separada, real ou imaginária.
Uma entidade corresponde à representação de todo e qualquer substantivo,
concreto ou abstrato, sobre o qual se precisa armazenar e/ou recuperar
informações.
Em inglês, o conceito de entidade recebe o nome que demonstra bem o seu
significado, que é “entity type”, ou seja, um tipo de entidade.
Outro aspecto importante no conceito de entidade é a possibilidade de
individualização de cada um dos objetos que compõem o padrão.
55
Capítulo 7 - Associando Tabelas
Relacionamento
Relacionamento 1:1
Relacionamento 1:N
56
Capítulo 7 - Associando Tabelas
• Tabela Colaborador
• Tabela Dependente
Relacionamento N:N
57
Capítulo 7 - Associando Tabelas
A chave primária desta tabela é criada pela junção dos campos chaves das
tabelas interligadas.
use db_aula
• Tabela tb_aluno
58
Capítulo 7 - Associando Tabelas
• Tabela tb_curso
59
Capítulo 7 - Associando Tabelas
• Tabela tb_AlunoCurso
inCodAluno inCodCurso
1 1
1 2
2 1
2 2
2 3
3 3
1 3
1 4
60
Capítulo 7 - Associando Tabelas
JOIN
Joins são operações onde podemos retornar dados de duas ou mais tabelas, a
clausula JOIN indica como o Microsoft Sql Server deve utilizar o dado de uma
tabela, para selecionar dados de outra tabela.
O T-SQL suporta dois tipos diferentes de sintaxes para joins implementado pelo
padrão ANSI, e nenhuma delas está em processo de depreciação ainda. Os
elementos do Join antigo são complementos do novo estilo, isto quer dizer que,
você poderá utilizar ambos, sem preocupação de o SQL Server não suportar a
sintaxe futuramente.
O estilo mais antigo foi introduzido no SQL ANSI em 1989, utilizando vírgulas
para separar os nomes das tabelas após a cláusula FROM, e não existiam as
cláusulas JOIN e ON.
Exemplo:
O ANSI SQL: 1989 têm suporte apenas para os tipos CROSS e INNER JOIN.
Este padrão não tem suporte para OUTER JOINS (Left, Right e Full).
O estilo mais novo ANSI SQL: 1992, foi removido as vírgulas para separar as
tabelas e introduzido as cláusulas JOIN e ON.
Exemplo:
61
Capítulo 7 - Associando Tabelas
A condição da clausula JOIN define a forma como duas tabelas devem ser
unidas em uma consulta.
• Tabela Colaborador
• Tabela Dependente
62
Capítulo 7 - Associando Tabelas
INNER JOIN
Inner Join é utilizado para combinar as linhas entre duas ou mais tabelas, com
base em alguns critérios de junção.
Uma junção interior é chamada de equijoin quando as colunas são comparadas
usando o =, e as duas colunas aparecem no resultado, mostrando dados
redundantes, já que elas têm o mesmo valor. Uma junção interior é chamada
junção natural quando a coluna usada para junção aparece apenas uma vez no
resultado, vinda de uma ou outra tabela.
• Tabela de Cliente
inIdClient
vcCliente vcDocumento vcEMail dtNascimento chFlagAtivo dtCadastro
e
1 Romulo Wendell 22653229812 rWendell@trans.com.br 08/01/2000 S 06/11/2008
2 Cristina Lima 42653229812 cLima@Sunn.com.br 08/01/1985 S 06/11/2008
3 Carla Tardoche 62653229812 Ctardoche@terra.com.br 08/12/1982 S 06/11/2008
4 Wagner Sasaki 92653229812 wSasakil@tucs.com.br 05/10/2001 S 06/11/2008
5 Daniel Bo 23053229812 dBo@lumens.com.br 07/05/1985 S 06/11/2008
6 Leticia Padovani 45653229812 lePadovani@tecnet.com.br 05/07/2002 S 06/11/2008
• Tabela de Veiculo
63
Capítulo 7 - Associando Tabelas
64
Capítulo 7 - Associando Tabelas
Como podemos observar, nas tabelas acima, a coluna inIdCliente, aparece nas duas
tabelas, porém cada tabela tem os seus atributos, a associação entre estas tabelas,
deverá ser feita através do código comum entre as tabelas, para retornarmos todos
os clientes que possuem veiculo utilizamos a seguinte instrução:
OU
Estás duas formas será aceito pelo SQL Server, e ambas retornam o mesmo
resultado.
Notem que os clientes de ID 1 e 4 não foram listados nestas tabela, isso acontece
porque a função do INNER JOIN é justamente cruzar as informações que existem
em ambas as tabelas.
65
Capítulo 7 - Associando Tabelas
LEFT JOIN
Left Join ou Left Outer Join retorna os dados referentes a duas tabelas ou mais,
mas neste caso as linhas da primeira tabela, sem correspondência na segunda
tabela são preservadas e todos os dados da primeira tabela (esquerda), serão
apresentados.
66
Capítulo 7 - Associando Tabelas
RIGHT JOIN
Right Join ou Right Outer Join retorna os dados referentes a duas tabelas ou
mais, mas neste caso as linhas da segunda tabela, sem correspondência na
primeira tabela são preservadas e todos os dados da segunda tabela (direita),
serão apresentados.
Para este exemplo, será necessário inserir mais alguns veículos em nossa base
de dados.
Após a inserção dos novos veiculo, reparem que os mesmos não estão
associados a nenhum inCodCliente por enquanto.
67
Capítulo 7 - Associando Tabelas
FULL JOIN
Full Join ou Full Outer Join retorna todos os dados referentes a duas ou mais
tabelas, quando realizamos uma consulta utilizando a cláusula Full Outer Join,
todas a linhas das tabelas são retornadas. Caso uma linha de dado de uma
tabela não seja associado a linha de outra, os valores não encontrados na outra
tabela serão listados como nulos.
inIdClient chPlac
e vcCliente vcVeiculo a vcAnoModelo
CDX687
NULL NULL C4 VTR 9 2008/2008
NULL NULL Audi A8 FBI6878 2005/2006
GTD685
NULL NULL New Civic 6 2007/2008
Romulo
1 Wendell NULL NULL NULL
ATD687
2 Cristina Lima Vectra 8 2005/2006
DDD687
3 Carla Tardoche C3 2 2008/2008
4 Wagner Sasaki NULL NULL NULL
DDX687
5 Daniel Bo Golf 9 2008/2008
Leticia DTD685
6 Padovani Astra 6 2007/2008
Note que neste caso não é necessário se preocupar com a tabela da direita ou
esquerda, este tipo de consulta retorna todos os registros que existem nas
tabelas referenciadas.
68
Capítulo 7 - Associando Tabelas
CROSS JOIN
Em uma consulta utilizando o Cross Join, não devemos utilizar a cláusula ON,
pois como o Cross Join cruza todos registros da primeira tabela, com todos os
registros da segunda tabela, não precisamos especificar uma condição de
consulta para estás tabelas.
OU
Select C.inIdCliente, C.vcCliente, V.vcVeiculo, V.chPlaca, V.vcAnoModelo
From tb_Cliente C, tb_Veiculo V
Order By 1
69
Capítulo 7 - Associando Tabelas
70
Capítulo 7 - Associando Tabelas
Sasaki 56
Wagner CDX68
4 Sasaki C4 VTR 79 2008/2008
Wagner FBI687
4 Sasaki Audi A8 8 2005/2006
Wagner New GTD68
4 Sasaki Civic 56 2007/2008
DDD68
5 Daniel Bo C3 72 2008/2008
DDX68
5 Daniel Bo Golf 79 2008/2008
ATD68
5 Daniel Bo Vectra 78 2005/2006
DTD68
5 Daniel Bo Astra 56 2007/2008
CDX68
5 Daniel Bo C4 VTR 79 2008/2008
FBI687
5 Daniel Bo Audi A8 8 2005/2006
New GTD68
5 Daniel Bo Civic 56 2007/2008
Leticia DDD68
6 Padovani C3 72 2008/2008
Leticia DDX68
6 Padovani Golf 79 2008/2008
Leticia ATD68
6 Padovani Vectra 78 2005/2006
Leticia DTD68
6 Padovani Astra 56 2007/2008
Leticia CDX68
6 Padovani C4 VTR 79 2008/2008
Leticia FBI687
6 Padovani Audi A8 8 2005/2006
Leticia New GTD68
6 Padovani Civic 56 2007/2008
7.1. Os comandos UPDATE e DELETE
71
Capítulo 7 - Associando Tabelas
• Tb_Cliente
• Tb_Veiculo
• Tb_OrdemServico
72
Capítulo 7 - Associando Tabelas
Para isso podemos fazer uso da cláusula INNER JOIN que listará apenas o
cliente que tiver veiculo e ter efetuado algum tipo de serviço.
SELECT O.inCodOS
, C.vcCliente
, V.vcVeiculo
, O.vcServico
, O.dvValorServico
, O.dtDataServico
FROM tb_Cliente AS C
INNER JOIN tb_veiculo AS V
ON C.inIdcliente = V.inIdcliente
INNER JOIN tb_ordemServico AS O
ON V.inIdVeiculo = O.inIdVeiculo
AND V.inIdcliente = O.inIdcliente
UPDATE
SELECT O.inCodOS
, C.vcCliente
, V.vcVeiculo
, O.vcServico
, O.dvValorServico
, O.dtDataServico
FROM tb_Cliente AS C
INNER JOIN tb_veiculo AS V
ON C.inIdcliente = V.inIdcliente
INNER JOIN tb_ordemServico AS O
ON V.inIdVeiculo = O.inIdVeiculo
AND V.inIdcliente = O.inIdcliente
WHERE V.vcVeiculo like '%C3%'
OR V.vcVeiculo like '%Vectra%'
73
Capítulo 7 - Associando Tabelas
UPDATE tb_OrdemServico
SET dcValorServico = dcValorServico * 1.1
FROM tb_Cliente AS C
INNER JOIN tb_veiculo AS V
ON c.inIdcliente = v.inIdcliente
INNER JOIN tb_ordemServico AS O
ON V.inIdVeiculo = O.inIdVeiculo
AND V.inIdcliente = O.inIdcliente
WHERE V.vcVeiculo like '%C3%'
OR V.vcVeiculo like '%Vectra%'
74
Capítulo 7 - Associando Tabelas
DELETE
SELECT O.inCodOS
, C.vcCliente
, V.vcVeiculo
, O.vcServico
, O.dvValorServico
, O.dtDataServico
FROM tb_Cliente AS C
INNER JOIN tb_veiculo AS V
ON C.inIdcliente = V.inIdcliente
INNER JOIN tb_ordemServico AS O
ON V.inIdVeiculo = O.inIdVeiculo
AND V.inIdcliente = O.inIdcliente
WHERE V.vcVeiculo like '%C3%'
DELETE tb_ordemServico
FROM tb_Cliente AS C
INNER JOIN tb_veiculo AS V
ON c.inIdcliente = v.inIdcliente
INNER JOIN tb_ordemServico AS O
ON V.inIdVeiculo = O.inIdVeiculo
AND V.inIdcliente = O.inIdcliente
WHERE V.vcVeiculo like '%C3%'
75
Capítulo 8 - Union e Subquery
Para entendermos o uso das cláusulas Union, Union All e Except utilizaremos as
tabelas abaixo:
Tb_cliente
inIdClie
nte vcCliente vcEMail dtCadastro
Romulo rWendell@trans.co 08/01/2000
1 Wendell m.br 00:00
Renata rFerreiral@sql.com. 08/01/2000
2 Ferreira br 00:00
08/01/2000
3 Marcia Rita rRita@mmc.com.br 00:00
eYuriko@two.com.b 08/01/2000
4 Erika Yuriko r 00:00
mWillians@omg.co 08/01/2000
5 Max Willians m 00:00
Renato rPereira@cathu.co 08/01/2000
6 Pereira m.br 00:00
Tb_ator
inIdAto
r vcAtor mnSalario
Romulo 3500,00
1 Wendell
2 Max Willians 4500,00
Silmara 2500,00
3 Campos
4 Juliana Paes 8500,00
76
Capítulo 8 - Union e Subquery
Suzan 23500,00
5 Sarandon
77
Capítulo 8 - Union e Subquery
Tb_Comprador
inIdCompra
dor vcComprador chSexo
1 Denise Reis F
2 Marta Cordeiro F
3 Silmara Sullan F
4 Cassio Hebeshi M
Suzan
5 Sarandon F
78
Capítulo 8 - Union e Subquery
Union
Selecione apenas o código e nomes dos clientes e compradores
inIdCliente vcCliente
Romulo
1 Wendell
2 Max Willians
Select inIdCliente, vcCliente 2 Renata Ferreira
From tb_cliente 3 Marcia Rita
Union Silmara
Select inIdAtor, vcAtor 3 Campos
From tb_ator
4 Erika Yuriko
4 Juliana Paes
5 Max Willians
Suzan
5 Sarandon
6 Renato Pereira
Repare que para este exemplo não houve ocorrência de dados duplicados.
Union All
inIdCliente vcCliente
1 Romulo Wendell
2 Renata Ferreira
3 Marcia Rita
Select inIdCliente, vcCliente
From tb_cliente 4 Erika Yuriko
Union All 5 Max Willians
Select inIdAtor, vcAtor 6 Renato Pereira
From tb_ator
1 Romulo Wendell
2 Max Willians
3 Silmara Campos
4 Juliana Paes
5 Suzan Sarandon
79
Capítulo 8 - Union e Subquery
Veja o exemplo:
inIdCliente vcCliente
1 Denise Reis
Romulo
1 Wendell
2 Marta Cordeiro
Select inIdCliente, vcCliente 2 Max Willians
From tb_cliente 2 Renata Ferreira
Union 3 Marcia Rita
Select inIdAtor, vcAtor
Silmara
From tb_ator
Union 3 Campos
Select inIdComprador, vcComprador 3 Silmara Sullan
From tb_comprador 4 Cassio Hebeshi
Order by inIdCliente, vcCliente
4 Erika Yuriko
4 Juliana Paes
5 Max Willians
Suzan
5 Sarandon
6 Renato Pereira
Except
Selecione apenas nomes que apareçam na primeira tabela de clientes, mas não
apareçam na tabela de atores.
Nomes
Select vcCliente As Nomes
From tb_cliente2 Erika Yuriko
Except Marcia Rita
Select vcAtor Renata Ferreira
From tb_ator
Renato Pereira
80
Capítulo 8 - Union e Subquery
81
Capítulo 8 - Union e Subquery
Subquery
Tb_Cargo
inCodCar
go vcCargo
Analista de
4 Sistemas
5 Arquiteto
2 Diretor
1 Presidente
3 Supervisor
Tb_Funcionario
Tb_Dependente
82
Capítulo 8 - Union e Subquery
Luxamanaus
6 5 Rocksivan de Paivo
7 5 Renato de Oliveiro
83
Capítulo 8 - Union e Subquery
go
84
Capítulo 8 - Union e Subquery
Para este tipo de consulta, devemos selecionar os cargos que estão na tabela de
funcionários, para isso podemos utilizar uma subquery com o operador IN:
inCodCargo vcCargo
1 Presidente
2 Diretor
3 Supervisor
5 Arquiteto
inCodCargo vcCargo
Analista de
4 Sistemas
inCodCargo vcCargo
1 Presidente
3 Supervisor
85
Capítulo 8 - Union e Subquery
O maior salário:
O menor salário:
86
Capítulo 8 - Union e Subquery
Update tb_funcionario
set dcSalario = dcSalario* 1.1
Where inCodfunc NOT IN (Select InCodFunc From tb_dependente)
Também podemos utilizar subqueries para remover dados das tabelas. Vamos
supor que precisamos remover todos os funcionários que não possuem
dependentes. Para isso utilizaremos o seguinte conjunto de instruções:
87
Capítulo 9 - Totalizando Dados
A cláusula GROUP BY
89
Capítulo 9 - Totalizando Dados
0
Calça Vila 130.0
19 Social Espartana P 20 0
Calça Vila 130.0
20 Social Espartana M 40 0
Calça Vila 130.0
21 Social Espartana G 15 0
Calça Mario
22 Social Bertolli P 60 80.00
Calça Mario
23 Social Bertolli M 30 80.00
Calça Mario
24 Social Bertolli G 20 80.00
25 Top Gasta-Gasta P 200 15.00
26 Top Gasta-Gasta M 300 15.00
27 Top Gasta-Gasta G 300 15.00
90
Capítulo 9 - Totalizando Dados
GO
insert into tb_roupa values('Calça Jeans', 'Viva Eloah', 'P', 200, 90)
insert into tb_roupa values('Calça Jeans', 'Viva Eloah', 'M', 300, 90)
insert into tb_roupa values('Calça Jeans', 'Viva Eloah', 'G', 100, 90)
91
Capítulo 9 - Totalizando Dados
Está instrução retorna a quantidade de registros (linhas) que existe na tabela, neste
caso 27 linhas.
Mas ainda não estamos satisfeitos com esta informação, queremos saber a
quantidade de cada tipo de roupa que existe em nossa loja:
vcTipoRo
upa Total
Calça
Jeans 1430
Calça
Social 185
Camiseta 910
Top 800
vcMarcaRou
pa Total
Cavalinho 230
Gasta-Gasta 800
Jacarezinho 130
Mario Bertolli 110
NOfficers 600
Rellus 230
Vila
Espartana 75
Viva Eloah 1150
92
Capítulo 9 - Totalizando Dados
vcTipoRoup vcMarcaRo
a upa Total
Camiseta Cavalinho 230
Top Gasta-Gasta 800
Camiseta Jacarezinho 130
Mario
Calça Social Bertolli 110
Calça Jeans NOfficers 600
Calça Jeans Rellus 230
Vila
Calça Social Espartana 75
Calça Jeans Viva Eloah 600
Camiseta Viva Eloah 550
Select vcTipoRoupa
, vcMarcaRoupa
, sum(inQtdRoupa * dcValor) as [Valor Total]
From tb_roupa
Group by vcTipoRoupa, vcMarcaRoupa
93
Capítulo 9 - Totalizando Dados
Select vcTipoRoupa
, vcMarcaRoupa
, sum(inQtdRoupa) as Quantidade
, sum(inQtdRoupa* dcValor) as [Valor Total]
From tb_roupa
Group by vcTipoRoupa, vcMarcaRoupa
94
Capítulo 9 - Totalizando Dados
95
Capítulo 9 - Totalizando Dados
A cláusula WITH ROLLUP gera linhas de subtotal para cada condição exclusiva
de valores definidos EM GROUP BY. A ordem das colunas afeta os
agrupamentos de saída de ROLLUP e pode afetar o numero de linhas do
conjunto de resultado.
Cada campo NULL apresentado nesta tabela representa a linha de total referente
a cada agrupamento, sendo que a ultima linha representa o total geral.
96
Capítulo 9 - Totalizando Dados
Select vcTipoRoupa
, vcMarcaRoupa
, chTamanhoRoupa
, Sum(inQtdRoupa) as Quantidade
, Sum(inQtdRoupa* dcValor) as [Valor Total]
From tb_roupa
Group by vcTipoRoupa, vcMarcaRoupa, chTamanhoRoupa
With Cube
99
Capítulo 9 - Totalizando Dados
100
Capítulo 10 - Compute BY
Capítulo 10 - Compute BY
Select vcTipoRoupa
, vcMarcaRoupa
, inQtdRoupa
From tb_roupa
order by vcTipoRoupa
Compute Sum(inQtdRoupa) By vcTipoRoupa
Para esta instrução temos um resultado com 4 tabelas, pois optamos no exemplo
anterior Computar pelo tipo de roupa, logo é criada uma tabela para cada tipo de
roupa, como nas imagens abaixo:
101
Capítulo 10 - Compute BY
910
A cláusula COMPUTE BY também pode ser utilizada com a cláusula JOIN, a fim
de se ter a associação de várias tabelas.
Para o próximo exemplo devemos criar uma tabela de material que indicara o
tipo de material utilizado para se fazer a roupa e também iremos realizar algumas
alterações na tabela de roupas.
inCodMateri
al vcMaterial
1 Algodão
2 Poliéster
3 Microfibra
4 Misto
update tb_roupa
set incodMaterial = 5
where vctiporoupa = 'calça Jeans'
update tb_roupa
set incodMaterial = 4
where vctiporoupa = 'camiseta'
And incodroupa in(10,11,12)
update tb_roupa
set incodMaterial = 1
where vctiporoupa = 'camiseta'
And incodroupa not in(10,11,12)
update tb_roupa
set incodMaterial = 3
where vctiporoupa = 'Calça Social'
update tb_roupa
set incodMaterial = 2
where vctiporoupa = 'top'
102
Capítulo 10 - Compute BY
Material
Tipo de Material Tipo de Roupa Marca Quantidade
Roupa Marca Quantidade Jeans Calça Jeans Viva Eloah 200
Algodão Camiseta Jacarezinho 50 Jeans Calça Jeans Viva Eloah 300
Algodão Camiseta Jacarezinho 60 Jeans Calça Jeans Viva Eloah 100
Algodão Camiseta Jacarezinho 20 Jeans Calça Jeans NOfficers 200
Algodão Camiseta Cavalinho 80 Jeans Calça Jeans NOfficers 300
Algodão Camiseta Cavalinho 120 Jeans Calça Jeans NOfficers 100
Algodão Camiseta Cavalinho 30 Jeans Calça Jeans Rellus 80
SUM Jeans Calça Jeans Rellus 100
360 Jeans Calça Jeans Rellus 50
SUM
1430
Material Tipo de Roupa Marca Quantidade Material Tipo de Roupa Marca Quantidade
Microfibra Calça Social Vila Espartana 20 Misto Camiseta Viva Eloah 100
Microfibra Calça Social Vila Espartana 40 Misto Camiseta Viva Eloah 200
Microfibra Calça Social Vila Espartana 15 Misto Camiseta Viva Eloah 250
Microfibra Calça Social Mario Bertolli 60 SUM
Microfibra Calça Social Mario Bertolli 30 550
Microfibra Calça Social Mario Bertolli 20 Material Tipo de Roupa Marca Quantidade
SUM Poliéster Top Gasta-Gasta 200
185 Poliéster Top Gasta-Gasta 300
Poliéster Top Gasta-Gasta 300
SUM
800
SUM
3325
103
Capítulo 10 - Compute BY
104
Capítulo 10 - Compute BY
Obs. Você não poderá incluir tipos de dados ntext, text ou image em uma
cláusula COMPUTE ou COMPUTE BY.
105
Capítulo 11 – Tabelas
Capítulo 11 – Tabelas
Tabela permanente
Podemos dizer que uma tabela é permanente quando ela continuar existindo
mesmo que seja encerrada a conexão na qual ela foi criada.
Suponhamos que desejamos criar uma nova tabela de roupa que utilizamos no
exemplo anterior no capitulo 10. Para isso, podemos criar executando a seguinte
instrução:
Há dois tipos de tabelas temporárias: local e global. Elas diferem uma da outra
pelo nome, visibilidade e disponibilidade. As tabelas temporárias locais têm um
único sinal numérico (#) como primeiro caractere no nome; elas são visíveis
somente na conexão atual para o usuário e são excluídas quando o usuário se
desconecta da instância do SQL Server. As tabelas temporárias globais têm dois
sinais numéricos (##) como primeiros caracteres no nome; elas são visíveis a
qualquer usuário após serem criadas e são excluídas quando todos os usuários
que consultam a tabela se desconectam da instância do SQL Server.
106
Capítulo 12 – Case
Capítulo 12 – Case
A cláusula CASE
inCod_cl chSexo
i vcNome_cli _cli
Andre
1 Mobilete M
2 Tiago Abano NULL
Monica
3 Mendes F
4 Luis Carlos M
Renata
5 França F
Após criarmos a nova tabela de cliente iremos selecionar todos os campos, mas
o campo sexo deverá ser apresentado como Masculino ou Feminino.
Vejamos o exemplo do SELECT
Codi
go Cliente Sexo
1 Andre Mobilete Masculino
2 Tiago Abano Não Saber
107
Capítulo 12 – Case
108
BIBLIOGRAFICA BÁSICA
BIBLIOGRAFICA BÁSICA
Livros:
BATISTI, Julio. SQL SERVER 2005 Administração e Desenvolvimento: Curso
Completo. São Paulo, Axcel Books: 2005.
DAMAS, Luís. SQL: Structured Query Language. 6 ed. São Paulo, LTC: 2007.
Paul Wilton and John W. Colby, Beginning SQL, Published by Wiley Publishing, Inc.
Sites:
http://www.mhavila.com.br/link/db/sql.html
http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=4832
http://www.linhadecodigo.com.br/Artigo.aspx?id=669
http://www.50minutos.com.br/2007/05/datatypes-do-sql-server/
http://www.odetocode.com/Articles/79.aspx
http://www.shammas.eng.br/acad/materiais/mer.pdf
http://pt.wikipedia.org/wiki/Modelo_de_Entidades_e_Relacionamentos
http://msdn.microsoft.com/pt-br/library/ms190452.aspx
http://msdn.microsoft.com/pt-br/library/ms177399.aspx
109