Académique Documents
Professionnel Documents
Culture Documents
Índice Pag
1. Introdução a SQL 04
1.1. O que é SQL 04
1.2. O que é um Banco de Dados Relacional 04
1.3. Regras de um Banco de Dados Relacional 05
2. Introdução a QUERY – O comando SELECT 07
3. Expressões, condições e operadores 11
3.1. Expressões 11
3.2. Condições 11
3.3. Operadores 11
3.3.1.Operadores aritméticos 11
3.3.2.Operadores de comparação 17
3.3.3.Operadores de caractere 22
3.3.4.Operadores lógicos 25
3.3.5.Operadores SET 26
3.3.6.Outros operadores 30
4. Funções - Modelando os dados capturados 33
4.1. Funções de agregação 33
4.2. Funções de data/hora 36
4.3. Funções aritméticas 39
4.4. Funções de caractere 42
4.5. Funções de Conversão 48
4.6. Outras funções 48
5. Clausulas do SQL 50
5.1. A clausula WHERE 50
5.2. A clausula STARTING WITH 51
5.3. A clausula ORDER BY 51
5.4. A clausula GROUP BY 53
5.5. A clausula HAVING 54
6. Unindo Tabelas – JOIN 56
6.1. INNER JOIN 57
6.2. OUTER JOIN 60
7. SUBQUERIES – Aprofundando o comando SELECT 62
8. Manipulando dados 68
8.1. O comando INSERT 68
8.2. O comando UPDATE 70
8.3. O comando DELETE 73
9. Criando e mantendo Tabelas 74
9.1. Criando um Banco de Dados 74
9.2. Criando Tabelas 74
9.3. Alterando a estrutura de uma Tabela 77
9.4. Excluindo Tabelas e Banco de Dados 77
10. VIEW 78
2
10.1. WITH CHECK OPTION 79
10.2. WITH ENCRYPTION 79
10.3. VIEW de VIEW 80
11. STORED PROCEDURE 81
11.1. Regras para criar STORED PROCEDURE 81
12. Transação 84
12.1. Comandos de Transação 84
12.2. @@ERROR 85
13. Tópicos avançados de SQL – CURSOR 87
13.1. Criando um CURSOR 87
13.2. Abrindo um CURSOR 88
13.3. Acessando um CURSOR 88
13.4. Fechando um CURSOR 89
14. Erros comuns em SQL e suas soluções 93
15. Exercícios propostos 95
3
1 – Introdução a SQL.
4
1.3 – Regras de um Banco de Dados Relacional.
5
A maioria dos Bancos de Dados possui a estrutura de relacionamentos pai-
filho, onde a entidade-pai possui ponteiros apontando para as entidades-
filho.
6
2 – Introdução a QUERY – O comando SELECT.
Tabela
Campo1 campo2 campo3
XXX AAA BBB
CCC AAA BBB
XXX BBB AAA
DDD BBB AAA
7
SELECT campo1, campo2, campo3 AS teste FROM Tabela;
Saída:
4 rows selected
Ou:
8
SELECT * FROM Tabela WHERE campo1=“XXX”;
Saída:
2 rows selected
Neste caso são mostrados todos os campos (*) dos registros onde o
campo1 tenha o valor de XXX.
O retorno será:
campo1
----------
XXX
CCC
XXX
DDD
4 rows selected
Saída:
campo1
----------
XXX
CCC
DDD
3 rows selected
9
Assim serão listados todos os valores de campo1, sem repetições. Esta
clausula só pode ser aplicada a uma coluna.
10
3 – Expressões, condições e operadores.
3.1 – Expressões.
3.2 – Condições.
WHERE campo1=“XXX”
3.3 – Operadores.
+, -, *, / e %
11
Operador +:
tab_frutas
Saída:
nome soma_coluna
------------ --------------------------------
Mamão 2.5
Laranja 1.25
Maçã 3.0
Banana 4.5
4 rows selected
12
Exemplo 2: Somando uma constante a uma coluna de uma tabela.
Saída:
nome valor_varejo+1.0
------------ --------------------
Mamão 2.0
Laranja 1.5
Maçã 2.2
Banana 3.0
4 rows selected
Operador –:
Saída:
nome diferenca
-------------- -----------
Mamão 0.5
Laranja 0.25
Maçã 0.4
Banana 0.5
4 rows selected
13
Exemplo 2: Diminuindo uma constante de uma coluna de uma tabela.
Saída:
nome valor_desconto
---------------- -----------------
Mamão 0.85
Laranja 0.35
Maçã 1.05
Banana 1.85
4 rows selected
Saída:
nome sinal_trocado
------------- ---------------
Mamão -1.0
Laranja -0.5
Maçã -1.2
Banana -2.0
4 rows selected
Operador *:
14
SELECT F.nome, F.valor_varejo * F.valor_atacado AS produto FROM
tab_frutas F;
Saída:
nome produto
------------ ----------
Mamão 1.5
Laranja 0.375
Maçã 2.16
Banana 5.0
4 rows selected
Saída:
nome dobro
--------------- ------
Mamão 2.0
Laranja 1.0
Maçã 2.4
Banana 4.0
4 rows selected
Operador /:
O operador / faz uma divisão entre duas colunas ou entre uma coluna e
uma constante:
15
Exemplo 1: Dividindo duas colunas de uma tabela.
Saída:
nome divisão
-------------- ---------
Mamão 0.66666
Laranja 0.66666
Maçã 0.66666
Banana 0.8
4 rows selected
Saída:
nome metade
-------------- ----------
Mamão 0.5
Laranja 0.25
Maçã 0.6
Banana 1.0
4 rows selected
Operador %:
16
SELECT F.nome, F.valor_varejo % 3 AS resto FROM tab_frutas F;
Saída:
nome resto
------------- ------
Mamão 0.0
Laranja 0.0
Maçã 0.0
Banana 0.0
4 rows selected
Dizer que o valor de um campo é igual a NULL significa que não existe
nenhum valor armazenado no elemento. Quando dizemos nenhum valor, é
importante diferenciar isto de zeros ou espaços. Quando temos um
elemento numérico cujo valor é zero, ou um alfanumérico contendo
espaço vazio, os elementos contêm um valor, já quando o conteúdo é
especificado como NULL, nenhum valor está associado ao elemento.
Ao executar uma busca em uma tabela que tenha campos com valor
NULL, estes retornarão como colunas vazias. Por isso é fácil perceber
quando um campo numérico tem o valor igual a NULL, mas se o campo for
alfanumérico, o valor NULL pode ser confundido com espaços.
tab_itens
Nome valor_venda
Vassoura 10.0
Pá 5.0
Lixeira Null
Null 6.0
Escovão 4.5
17
Ao aplicar o comando:
nome valor_venda
---------------- --------------
Vassoura 10.0
Pá 5.0
Lixeira
6.0
Escovão 4.5
4 rows selected
Saída:
nome valor_venda
---------------- --------------
Lixeira
1 row selected
Saída:
nome valor_venda
---------------- --------------
18
Isto ocorre por que a comparação utilizando o operador = retorna um
valor desconhecido, como somente listamos as linhas que retornam TRUE,
nenhuma linha será listada.
Operador =:
Saída:
nome valor_venda
------------------ --------------
Vassoura 10.0
1 row selected
A saída será:
nome valor_venda
------------------ --------------
Os operadores > e >= indicam que a seleção se dará nas linhas cujo
campo comparado seja maior que, ou maior ou igual ao elemento
comparado. Considerando a tabela:
tab_carro:
Nome valor_venda
Gol 15000
Fusca 3000
Mercedes Benz 45000
Clio 25000
Fiat Uno 9000
19
SELECT * FROM tab_carro WHERE valor_venda > 9000;
Saída:
nome valor_venda
--------------------- --------------
Gol 15000
Mercedes Benz 45000
Clio 25000
3 rows selected
Saída:
nome valor_venda
----------------------- --------------
Gol 15000
Mercedes Benz 45000
Clio 25000
Fiat Uno 9000
4 rows selected
20
Exemplo 1 - selecionando valores menores que uma constante:
Saída:
nome valor_venda
-------------------- --------------
Fusca 3000
Clio 25000
Fiat Uno 9000
3 rows selected
Saída:
nome valor_venda
-------------------- --------------
Gol 15000
Fusca 3000
Clio 25000
Fiat Uno 9000
4 rows selected
Assim como podemos selecionar linhas cujo conteúdo campos seja igual,
maior ou menor que um determinado valor, existem situações em que é
necessário selecionar as linhas cujo campo de comparação seja diferente
do valor especificado. Fazemos isto utilizando os operadores <> ou =!:
21
SELECT * FROM tab_carro WHERE valor_venda <> 3000
Saída:
nome valor_venda
------------------------- --------------
Gol 15000
Mercedes Benz 45000
Clio 25000
Fiat Uno 9000
4 rows selected
Operador LIKE:
tab_aluno:
Nome Endereco
Fernando Rua Amaral nº
30
Alex Av Oxford nº 123
Sheila Rua June nº 7
apto 802
Ana Maria Rua Bastos nº 10
Luiza Av London nº 2
apto 17
Ou:
22
Saída:
nome endereco
------------------------- ------------------------------
Fernando Rua Amaral nº 30
Carla Rua June nº 7 apto 802
Ana Maria Rua Bastos nº 10
3 rows selected
Saída:
nome endereco
------------------------ -----------------------------
Carla Rua June nº 7 apto 802
Luiza Av London nº 2 apto 17
2 rows selected
tab_aluno
Nome Estado
Fernando RN
Alex MG
Carla XRJX
Ana Maria GO
Luiza SP
23
SELECT * FROM tab_aluno WHERE estado LIKE ‘R?’;(Access)
Saída:
nome estado
----------------- --------
Fernando RN
1 row selected
Saída:
nome estado
--------------------- ------
Carla XRJX
1 row selected
Operador || ou + ou &:
Saída:
NomEst
--------------------------------
Fernando RN
Alex MG
Carla XRJX
Ana Maria GO
Luiza SP
5 rows selected
24
Saída:
NomEst
--------------------------------
Fernando - RN
Alex - MG
Carla - XRJX
Ana Maria - GO
Luiza - SP
5 rows selected
tab_curso:
Saída:
2 rows selected
25
SELECT * FROM tab_curso WHERE professor = ‘Rui’ OR horario =
‘manhã’;
Saída:
3 rows selected
Saída:
2 rows selected
Operador UNION:
26
tab_futebol
Clube
Cruzeiro
Grêmio
Flamengo
Fluminense
Vasco
tab_volei
Clube
Flamengo
Minas Gás
Parmalat
Vasco
clube
------------------
Cruzeiro
Grêmio
Flamengo
Fluminense
Minas Gás
Parmalat
Vasco
7 rows selected
27
SELECT * FROM tab_futebol UNION ALL SELECT * FROM tab_volei;
Saída:
clube
------------------
Cruzeiro
Grêmio
Flamengo
Fluminense
Vasco
Flamengo
Minas Gás
Parmalat
Vasco
9 rows selected
clube
------------------
Flamengo
Vasco
2 rows selected
28
SELECT DISTINCT Country FROM Customers
WHERE EXISTS
(SELECT Country FROM Employees WHERE Customers.Country =
Employees.Country)
Saída:
Country
-----------------------
UK
USA
Saída:
clube
------------------
Cruzeiro
Grêmio
Fluminense
3 rows selected
Saída:
clube
------------------
Minas Gás
Parmalat
2 rows selected
29
O exemplo a seguir retorna os países não comuns nas tabelas Customers
e Employees:
Saída
---------------
Argentina
Austria
Belgium
Brazil
Canada
Denmark
Finland
France
Germany
Ireland
Italy
Mexico
Norway
Poland
Portugal
Spain
Sweden
Switzerland
Venezuela
Operador IN:
30
tab_cidades
Cidade Estado
Rio de Janeiro RJ
Cabo Frio RJ
Santos SP
Salvador BA
Ribeirão Preto SP
Saída:
cidade estado
---------------------- --------
Rio de Janeiro RJ
Cabo Frio RJ
Santos SP
Ribeirão Preto SP
4 rows selected
Operador BETWEEN:
tab_livros
nome valor
Senhor dos Anéis 120.0
Cem anos de solidão 40.0
Ensaio sobre a cegueira 35.0
O iluminado 60.0
A casa dos espíritos 30.0
31
SELECT * FROM tab_livros WHERE valor > 35 AND valor < 100;
Saída:
nome valor
------------------------ -----------
Cem anos de Solidão 40.0
Ensaio sobre a cegue 35.0
O iluminado 60.0
3 rows selected
32
4 – Funções - Modelando os dados capturados.
Estas funções retornam valores baseados em valores das colunas. Elas são
conhecidas também como funções de grupo ou de agrupamento.
Função COUNT:
tab_livros
Saída:
qtd_livros_autor
----------------------
2
Saída:
total_linhas
----------------------
4
33
Função SUM:
Saída:
total_preço
---------------------
147.0
Função AVG:
Saída:
media_total_preço
---------------------
36.75
Assim como a função SUM, esta função somente é válida para campos
numéricos.
Função MAX:
34
SELECT MAX(L.preço) AS maior_preço FROM tab_livros L;
Saída:
maior_preço
--------------------
42.0
Função MIN:
Saída:
menor_preço
--------------------
30.0
Saída:
menor_preço maior_preço
-------------------- --------------------
30.0 42.0
Função VARIANCE:(Oracle)
Saída:
variação
--------------------
10.333
35
Esta função somente pode ser usada em colunas numéricas.
Função STDDEV:
Saída:
desvio_padrão
---------------------
2
Função ADD_MONTHS:(Oracle
tab_projeto
36
SELECT P.nome, P.data_inicio, P.data_final AS data_prevista
ADD_MONTHS(P.data_final, 2) AS nova_data_fina
FROM tab_projeto P;
Saída:
4 rows selected
DateAdd(unidade,valorAcrescimo,DataOrigem)
Sintaxe :
DATANOVA
-------------
2004-11-02
37
SELECT P.data_final, LAST_DAY(P.data_final) AS ultimo_dia_mes
FROM tab_projeto P;
data_final ultimo_dia_mes
---------------- ------------------
02-Set-04 30-Set-04
03-Nov-04 30-Nov-04
03-Nov-04 30-Nov-04
03-Dez-04 31-Dez-04
4 rows selected
Saída:
nome duração_projeto
---------------------- ---------------------
Agenda 1.033333
Cadastro Aluno 2.033333
Shell 3.933333
Projeto_final 0.967741
4 rows selected
38
SELECT P.data_inicio NEXT_DAY(P.data_inicio, ‘monday’) AS
prox_segunda_feira
FROM tab_projeto P;
Saída:
data_inicio prox_segunda_feira
------------- -----------------------
02-Ago-04 09-Ago-04
03-Set-04 06-Set-05
02-Ago-04 09-Ago-05
04-Nov-04 05-Nov-05
4 rows selected
Saída:
SYSDATE
----------------------
29-Jul-04 1030AM
Usamos a clausula DISTINCT para que apenas uma linha seja mostrada,
pois teríamos a mesma resposta para cada linha da tabela.
Função ABS:
39
tab_saldo
movimento_absoluto
------------------------
600.00
1000.00
450.00
100.00
4 rows selected
Saída:
saldo_atual aprox_cima
---------------- ------------------
-99.10 -98.00
899.70 900.00
-150.00 -150.00
351.20 352.00
4 rows selected
40
SELECT S.saldo_atual, FLOOR(S.saldo_atual) AS aprox_baixo
FROM tab_saldo S;
Saída:
saldo_atual aprox_baixo
---------------- ------------------
-99.10 -100.00
899.70 898.00
-150.00 -150.00
351.21 351.00
4 rows selected
O formato geral é:
Função EXP:
Função LN e LOG:(Oracle)
LOG(),LOG10(): (Sql Server)
41
SELECT campo1, campo2, MOD(campo1, campo2) FROM tabela;
Função POWER:
Função SIGNS:(Oracle)
SIGN() : (Sql Server)
Função SQRT:
tab_caracteres
42
SELECT C.codigo ,CHR(C.codigo) AS caractere FROM tab_caracteres C;
Ou:
SELECT C.codigo ,CHAR(C.codigo) AS caractere FROM tab_caracteres C;
Saída
codigo caractere
-------- -----------
73 I
77 M
65 A
67 C
4 rows selected
Saída:
nome_sobrenome
-------------------------------
Isabel ALLENDE
Garcia MARQUES
Isaac ASIMOV
Carlos CASTAÑEDA
4 rows selected
43
SELECT C.sobrenome AS antes, INITCAP(C.sobrenome) AS depois
FROM tab_caracteres C;
Saída:
antes depois
--------------- ---------------
ALLENDE Allende
MARQUES Marques
ASIMOV Asimov
CASTAÑEDA Castañeda
4 rows selected
Saída:
4 rows selected
44
SELECT LPAD(C.nome, 15, ‘*’) AS esquerda, RPAD(C.nome, 15, ‘*’)
AS direita
FROM tab_caractere C;
Saída:
esquerda direita
--------------------- ---------------------
*****Isabel Isabel*****
*****Garcia Garcia*****
*****Isaac Isaac*****
*****Carlos Carlos*****
4 rows selected
Saída:
esquerda direita
--------------------- ---------------------
**********Isabel Isabel*********
**********Garcia Garcia*********
**********Isaac Isaac**********
**********Carlos Carlos*********
4 rows selected
Função REPLACE:
45
SELECT REPLACE(C.nome, ‘a’, ‘*’) AS subst_a
FROM tab_caractere C;
Saída:
subst_a
-----------------
Is*bel
G*rci*
Is**c
C*rlos
4 rows selected
nome
--------------------
ab
rc
aa
rl
4 rows selected
Função TRANSLATE:(Oracle)
46
SELECT TRANSLATE(C.nome, ‘abcdefghijklmnopqrstuvwxyz’,
‘@@@@@@@@&&&&&&&&**********’) FROM tab_caractere C;
Saída:
nome
---------------------
I*@@@&
G@*@&@
I*@@@
C@*&**
4 rows selected
posicao_C
------------
0
4
5
1
4 rows selected
47
SELECT LENGHT(C.sobrenome) AS tam_sobrenome
FROM tab_caractere C;
Ou:
SELECT LEN(C.sobrenome) AS tam_sobrenome
FROM tab_caractere C;
Saída:
tam_sobrenome
------------------
7
6
6
9
4 rows selected
A sintaxe é:
Sintaxe :
48
Estas funções retornam respectivamente o maior e o menor de uma lista
de argumentos.
Sintaxe :
Sintaxe :
49
5 – Clausulas do SQL.
tab_curso
Saída:
5 rows selected
50
SELECT * FROM tab_curso C WHERE C.curso = ‘C+’;
Saída:
1 row selected
Saída:
2 rows selected
51
SELECT * FROM tab_curso C ORDER BY C.curso;
Saída:
5 rows selected
Saída:
5 rows selected
5 rows selected
52
5.4 – A clausula GROUP BY.
tab_livros
Saída:
QtdLivrosAutor
-------------------
5
Saída:
QtdLivrosEditora
-------------------
980
53
A informação assim apresentada não nos diz o que realmente queremos
saber. Se fossemos utilizar as funções de agregação combinadas com a
clausula WHERE, teríamos que realizar várias instruções de SQL, além de
termos que conhecer antecipadamente o conteúdo da tabela, para assim
poder selecionar os dados que desejamos. Podemos ao invés disto utilizar
a clausula GROUP BY. Esta clausula agrupa os resultados obtidos em um
SELECT a partir do campo ou lista de campos apresentada. Assim, se
quisermos saber a quantidade de livros por autor na tabela, podemos
simplesmente dizer:
Saída:
Autor QtdLivrosAutor
------------------- ---------------------
Platão 2
J.P. Sartre 2
Nietzsche 1
Saída:
editora QtdLivrosEditora
------------------- --------------------
Brasil 500
Ouro 480
54
o HAVING se refere a colunas que trazem resultados de funções, ou seja,
não pertencem à estrutura da tabela:
Saída:
autor QtdLivrosAutor
-------------- ------------------
Platão 2
J.P.Sartre 2
Saída:
autor QtdLivrosAutor
-------------- ------------------
Platão 2
SELECT campo(s)
FROM tabela(s)
WHERE condição/expressão(ões) para os campos
GROUP BY campo(s) a serem agrupados
HAVING condição(ões) do grupo
ORDER BY campo(s)
55
6. Unindo Tabelas – JOIN.
tab_livro
tab_editora
Codigo nome Uf
001 Ouro RJ
002 Brasil SP
003 Europa RJ
tab_vendas
56
6.1 – INNER JOIN.
Uma associação do tipo INNER JOIN tem por objetivo selecionar de duas
ou mais tabelas apenas os dados relacionados entre todas elas. Um INNER
JOIN pode ser:
SELECT
L.nome AS NomeLivro, E.nome AS NomeEditora, V.qtd_vendida AS
QTD, V.valor_venda AS Valor, V.qtd_vendida*V.valor_venda AS Total
FROM
tab_livro L, tab_editora E, tab_vendas V
WHERE
L.codigo=V.codigo_livro And E.codigo=V.codigo_editora;
Saída:
6 rows selected
57
SELECT
E.nome, L.nome, V.qtd_vendida, V.valor_venda,
V.qtd_vendida*V.valor_venda AS TOTAL
FROM
(tab_editora E
INNER JOIN tab_livro L ON E.codigo=L.codigo_editora
INNER JOIN tab_vendas V ON L.codigo=V.codigo_livro AND
E.codigo=V.codigo_editora;
58
SELECT * FROM tab_editora, tab_livro;
Saída:
18 rows selected
59
• SELF JOIN: É um INNER JOIN de uma tabela com ela mesma.
tab_editora
Código Nome Uf
001 Ouro RJ
002 Brasil SP
003 Europa RJ
004 África SP
Saída:
6 rows selected
Neste caso, a linha contendo a editora África não aparece, pois não
existem livros com esta editora. Se quisermos listar todas as editoras e
seus livros, mesmo aquelas que não tenham livros editados, usamos um
OUTER LEFT JOIN, assim listaremos todas as linhas da tabela à esquerda
60
do JOIN, independente delas terem ou não dados correspondentes na
segunda tabela:
Saída:
7 rows selected
Saída:
7 rows selected
61
7 – SUBQUERIES – Aprofundando o comando SELECT.
Saída:
Livro
-------------------
O Rei do Inverno
1984
Excalibur
3 rows selected
62
tab_filmes
Nome qtd_espectadores
ET 1500000
Pulp Fiction 500000
Homem Aranha 2000000
O homem que 750000
copiava
Saída:
Filme
-----------------
Homem Aranha
1 row selected
Saída:
Filme
---------------------
ET
O homem que copi
2 rows selected
63
A SUBQUERY:
Saída:
tab_filmes.qtd_espectadores
--------------------------------
750000
2000000
Saída:
Filme
---------------------
Pulp Fiction
Homem Aranha
2 rows selected
64
tab_bilheteria
Nome bilheteria
ET 2000000
Homem Aranha 2500000
Saída:
Filme
-----------------
ET
Homem Aranha
2 rows selected
Saída:
Filme
------------------
Pulp Fiction
O homem que c
2 rows selected
65
Ao utilizarmos este formato, para cada linha selecionada na tabela
tab_filmes o SQL executa uma vez a SUBQUERY que obtém os dados da
tabela tab_bilheteria, assim a SUBQUERY é executada 4 vezes, uma para
cada linha da tabela tab_filmes. Pelo fato destas SUBQUERIES estarem
amarradas à QUERY, são chamadas de SUBQUERIES correlacionadas. Este
tipo de SUBQUERY consome muitos recursos do sistema no seu
processamento, portanto seu uso deve ser cuidadoso.
Considerando as tabelas:
tab_editora
Codigo Nome Uf
001 Ouro RJ
002 Brasil SP
003 Europa RJ
004 África SP
tab_livro
tab_vendas
66
Aninhando SUBQUERIES temos:
Saída
EditoraLivrosVendidos
----------------------------
Ouro
Brasil
Europa
3 rows selected
67
8 – Manipulando dados.
Observamos que:
68
tab_filmes
Nome qtd_espectadores
ET 1500000
Pulp Fiction 500000
Homem Aranha 2000000
O homem que 750000
copiava
Ou:
tab_filmes
Nome qtd_espectadores
ET 1500000
Pulp Fiction 500000
Homem Aranha 2000000
O homem que 750000
copiava
Homem Aranha 2500000
II
69
tab_filmes_tmp
Nome qtd_espectadores
ET 1500000
Pulp Fiction 500000
Homem Aranha 2000000
O homem que 750000
copiava
Homem Aranha 2500000
II
tab_filmes_tmp
Nome qtd_espectadores
Homem Aranha 2000000
Homem AranhaII 2500000
70
Onde a primeira clausula executada é o WHERE, e os valores serão
alterados sempre que a condição for verdadeira. Se a clausula WHERE não
existir todas as linhas da tabela serão alteradas:
tab_filmes
Nome qtd_espectadores
ET 1500000
Pulp Fiction 500000
Homem Aranha 2000000
O homem que 750000
copiava
Homem Aranha 2500000
II
Resultado:
tab_filmes
Nome qtd_espectadores
Teste 1500000
Pulp Fiction 500000
Homem Aranha 2000000
O homem que 750000
copiava
Homem Aranha 2500000
II
Resultado:
tab_filmes
Nome qtd_espectadores
Teste 1500000
Teste 500000
Teste 2000000
Teste 750000
Teste 2500000
71
Podemos usar qualquer tipo de condição no WHERE, inclusive uma
SUBQUERY:
tab_filmes
nome qtd_espectadores
ET 1500000
Pulp Fiction 500000
Homem Aranha 2000000
O homem que 750000
copiava
Homem Aranha 2500000
II
tab_bilheteria
nome Bilheteria
ET 25000000
Pulp Fiction 1000000
Homem Aranha 4000000
O homem que 1500000
copiava
Homem Aranha 5000000
II
UPDATE tab_filmes
SET tab_filmes.qtd_espectadores=0 WHERE tab_filmes.nome IN
(SELECT tab_bilheteria.nome FROM tab_bilheteria WHERE
tab_bilheteria.bilheteria > 2000000);
Resultado:
tab_filmes
nome qtd_espectadores
ET 0
Pulp Fiction 500000
Homem Aranha 0
O homem que 750000
copiava
Homem Aranha 0
II
72
8.3 – O comando DELETE.
tab_filmes
Nome qtd_espectadores
ET 0
Pulp Fiction 500000
Homem Aranha 0
O homem que 750000
copiava
Homem Aranha 0
II
Resultado:
tab_filmes
Nome qtd_espectadores
Pulp Fiction 500000
O homem que 750000
copiava
73
9 – Criando e mantendo Tabelas.
O comando para criação de uma tabela via comando SQL é um pouco mais
complexo do que o usado para criar o Banco de Dados. Além do comando
CREATE TABLE, devemos especificar os campos, com o tipo e o tamanho
de cada um:
74
Para o Oracle:
Tipo Descrição
CHAR Dados alfanuméricos com tamanho suportado entre 1 e 255
caracteres.
DATE Data/hora, incluindo século, ano, mês, dia, horas minutos e
segundos.
LONG Dados alfanuméricos de até 2 Gb. Também chamado de
MEMO
LONG Dados binaries até 2 Gb, também chamado de BINARY LARGE
RAW OBJECT, ou BLOB
NUMBER Numérico, positivo ou negativo inteiro ou com casas
decimais.
RAW Dado Binário de até 255 bytes.
ROWID Hexadecimal representando o endereço da linha na tabela.
Também chamado de chave primária ou IDENTFY FIELD
VARCHAR2 Alfanumérico cujo tamanho pode variar entre 1 e 2.000
caracteres.
Numéricos Inteiros
bigint Armazena dados numa faixa de valores entre -2^63 (-
9223372036854775808) e 2^63-1 (9223372036854775807), utiliza 8
bytes.
int Armazena dados numa faixa de valores entre -2^31 (-2,147,483,648) e
2^31 - 1 (2,147,483,647), utiliza 4 bytes.
smallint Armazena dados numa faixa de valores entre 2^15 (-32,768) e 2^15 - 1
(32,767), utiliza 2 bytes
tinyint Armazena dados numa faixa de valores entre 0 e 255, utiliza 1 bytes.
Bin
bit Datatype utilizado para armazenar os valores 1 ou 0, utiliza 1 byte.
decimal e numeric
decimal Precisao fixa e faixa de valores vai de -10^38 +1 a 10^38 –1.
numeric Funcionalidade igual ao decimal.
Numéricos Monetários
money Representa valor na moeda norte-americana, que podem ter até quatro
dígitos para as casas decimais e, portanto, terão o arredondamento
acontecendo na quarta casa decimal. Ocupa 8 bytes armazena uma faixa de
valor que vai de
-2^63 (-922,337,203,685,477.5808) a
2^63 - 1 (+922,337,203,685,477.5807).
smallmoney Representa valor na moeda norte-americana, que podem ter até quatro
dígitos para as casas decimais e, portanto, terão o arredondamento
acontecendo na quarta casa decimal. Ocupa 4 bytes armazena uma faixa de
valor que vai de
-214,748.3648 e +214,748.3647.
75
Numéricos Aproximados
float Datatype para armazenar números que não têm uma quantidade certa de
dígitos para as casas decimais, e justamente por isso são chamados de
ponto flutuante, armazena valores na faixa de -1.79E + 308 a 1.79E + 308,
ocupa 8 bytes.
real Datatype para armazenar números que não têm uma quantidade certa de
dígitos para as casas decimais, e justamente por isso são chamados de
ponto flutuante, armazena valores na faixa de -3.40E + 38 through 3.40E +
38, ocupa 4 bytes.
Data/Hora
datetime Armazena uma data que vai de 1/1/1753 a 31/12/9999, com uma precisao
de 3.33 milissegundos. Ocupa 8 bytes. Os primeiros 4 são usados pra
data(mês/dia/ano), e os outros 4 bytes são usados pro
horário(HH:MM:SS:MS).
smalldatetime Armazena uma data que vai de 1/1/1900 até 6/6/2079 com uma precisão de
1 minuto. Os 2 primeiros bytes são usados pra data(mês/dia/ano), e outros
2 pro horário(HH:MM:SS).
Caracteres
char Datatype de tamanho fixo que armazena até 8.000 caracteres, cada caracter
ocupa 1 byte.
varchar Datatype de tamanho variável que armazena até 8.000 caracteres, cada
caracter ocupa 1 byte.
text Datatype de tamanho variável que armazena até
2^31 - 1 (2,147,483,647) caracteres, cada caracter ocupa 1 byte.
Caracteres Unicode
- O unicode foi inventado para resolver o problema de um único dígito ser armazenado com um
determinado valor em um sistema de códigos e ser armazenado com outro valor em outro sistema
de códigos diferente. O unicode atribui apenas um único número a cada caractere existente.
nchar Datatype de tamanho fixo que armazena dados no formato caractere
unicode, pode armazenar até 4.000 caracteres, cada caracter ocupa 2 bytes.
nvarchar Datatype de tamanho variável que armazena dados no formato caractere
unicode, pode armazenar até 4.000 caracteres, cada caracter ocupa 2 bytes.
ntext Datatype de tamanho variável que armazena dados no formato caractere
unicode, pode armazenar até 2^30 - 1 (1,073,741,823) characters, cada
caracter ocupa 2 bytes.
Datatypes Binários
binary Datatype de tamanho fixo que armazena dados binarios no formato
hexadecimal, armazena até 8,000 bytes.
76
9.3 – Alterando a estrutura de uma Tabela.
77
10 – VIEW
• JOIN;
• UNION;
• GROUP BY - com função de totalização;
• SUBQUERY;
• ORDER BY - apenas com TOP.
Sintaxe:
É possível ainda manipular dados de uma tabela por meio de VIEWS, com
os comandos INPUT, UPDATE E DELETE:
Sintaxe:
78
Para alterar a estrutura de uma VIEW já existente, você pode utilizar o
comando ALTER VIEW com o qual é possível realizar qualquer alteração
dentro de uma VIEW, desde que não altere o seu nome.
79
WITH ENCRYPTION
AS
SELECT Campo1 as Alias1, Campo2 as Alias2,... FROM Tabela
WHERE Campo3 = valor
É possível ainda criar uma VIEW que filtre dados de outra VIEW. Mas a
necessidade de criar VIEWS aninhadas deve sempre ser bem avaliada, já
que esta prática pode causar problemas de performance.
Primeira VIEW:
VIEW aninhada:
80
11 – STORED PROCEDURES
Sintaxe:
Corpo da Procedure:
Comandos Transact-SQL:
81
• P_AlteraSal;3
• P_AlteraSal;4
82
PRINT @Resultado
83
12 – Transação
Este requerimento do tipo “ou faz tudo ou não faz nada” é chamado de
atomicidade.
84
o Interromper o processamento;
• Realizar o CRÉDITO;
• Checar a ocorrência de erro
• Se ocorreu erro:
o Desfazer qualquer operação que tenha sido feita até este
ponto;
o Interromper o processamento;
• Se não ocorrer nenhum problema:
o Confirmar a operação.
BEGIN TRANSACTION
Realizar o DÉBITO
Checar a ocorrência de algum erro
Se ocorreu erro :
ROLLBACK TRANSACTION
RETURN
Realizar o CRÉDITO
Checar a ocorrência de algum erro
Se ocorreu erro :
ROLLBACK TRANSACTION
RETURN
12.2 - @@ERROR
85
representando um determinado erro (existente na tabela SYSMESSAGES),
caso tenha ocorrido algum problema no processamento do comando:
BEGIN TRANSACTION
Realizar o DÉBITO
IF @@ERROR <> 0
BEGIN
ROLLBACK TRANSACTION
RETURN
END
Realizar o CRÉDITO
IF @@ERROR <> 0
BEGIN
ROLLBACK TRANSACTION
RETURN
END
COMMIT TRANSACTION
86
13 – Tópicos avançados de SQL – CURSOR.
Quando não for necessário o uso de cursores, estes devem ser evitados,
pois o SQL é uma linguagem criada para tratamento de conjuntos, ou
seja, a performance de um comando SQL utilizando cursores é menos
eficaz do que a manipulação de dados em conjunto.
Onde:
87
DECLARE NomeCursor CURSOR
[LOCAL/ GLOBAL/ FORWARD_ONLY/ SCROLL/ STATIC/ KEYSET/
DYNAMIC/ FAST_FORWARD/ READ ONLY/ SCROLL_LOCKS/
OPTIMISTIC/ TYPE_WARNING]
FOR comando SELECT
[FOR UPDATE OF campo1, campo2.../]
Onde:
OPEN NomeCursor;
88
Ao utilizarmos o comando, o ponteiro do cursor avança através do
resultado da consulta, uma linha por vez. Quando usamos a opção INTO,
os dados resultantes serão armazenados na(s) variável(variáveis)
especificada(s). Para resgatar todas as linhas de uma consulta é
necessário que o comando FETCH seja executado dentro de uma estrutura
de repetição.
CLOSE NomeCursor;
89
Exemplos :
Primeiro exemplo:
DECLARE
@cod_pai int,
@nome_pai char(50),
@idade_pai tinyint
SELECT Cod_Pai,
Nome_Pai,
Idade_pai FROM PAI2
Abrindo o cursor:
OPEN COPIA_TABELA
INTO
@cod_pai,
@nome_pai,
@idade_pai
WHILE @@FETCH_STATUS = 0
BEGIN
90
Lendo a próxima linha do cursor:
FETCH NEXT FROM COPIA_TABELA
INTO
@cod_pai,
@nome_pai,
@idade_pai
END
Fechando o cursor:
CLOSE COPIA_TABELA
DEALLOCATE COPIA_TABELA
Segundo exemplo:
DECLARE
@codrt int,
@codgrpprio int,
@codsusep char(4),
@codresolucao int,
@indpriosusep int
OPEN tblParametros_Cursor
91
INSERT INTO tblPrioridadesRT
(codRT,
codGrpPrio,
codSusep,
codResolucao,
indPrioSusep )
VALUES
(@codrt,
@codgrpprio,
@codsusep,
@codresolucao,
@indpriosusep)
FETCH NEXT FROM tblParametros_Cursor
INTO
@codgrpprio,
@codsusep ,
@codresolucao,
@indpriosusep
SET @codrt = @codrt + 1
END
CLOSE tblParametros_Cursor
DEALLOCATE tblParametros_Cursor
92
14 – Erros comuns do SQL e suas soluções.
Erros de sintaxe/operacionais:
93
• missing expression – Acontece quando terminamos uma lista de
argumentos com virgula, como em um SELECT ou valores a serem
inseridos em um INSERT;
• not enough arguments for function – Os argumentos passados para
a função estão incompletos ou incorretos;
• not enough values – Ocorre quando ao realizar um INSERT a lista de
campos é maior que a lista de valores a serem inseridos;
• integrity constraint (campo1) violated – parent key not found –
Acontece quando tentamos inserir um valor em uma tabela1 que
possui uma chave estrangeira da tabela2 e este valor é inválido, ou
seja, não existe na tabela2;
• inserted value too large for column – Um ou mais valores inseridos é
maior que a capacidade da coluna;
• insufficient privileges – O usuário não tem permissão para executar
o comando;
Erros de lógica:
94
15 – Exercícios propostos.
95
13 – Usando a tabela Order Details, escreva uma QUERY que retorne o
Valor Total do pedido (OrderID), cujo numero seja o 10273.
96
25 – Usando a tabela Order Details, escreva uma QUERY que retorne
Código do Pedido, Preço Unitário, Quantidade e o Valor do Pedido de todos
os pedidos.
97
SELECT P.Nome_Pai as 'Nome do Pai', F.Nome_Filho as 'Nome do Filho',
Sexo_Filho as 'Sexo do Filho'
FROM Pai P RIGHT JOIN Filho F
ON P.Cod_Pai = F.Cod_Pai
42 – Execute a QUERY: INSERT INTO PAI VALUES ('5', 'seu nome', 'sua
idade'). Descreva o resultado.
44 – Execute a QUERY: INSERT INTO PAI VALUES ('seu nome', sua idade).
Analise o resultado.
98
45 – Execute a QUERY: INSERT INTO PAI VALUES (seu nome, sua idade).
Descreva o resultado.
58 – Crie uma Tabela no seu Banco Chamada “Pai’sua idade’”, com três
colunas:
• Coluna Cod_Pai -> do tipo que suporte de –32768 a 32767, com
autonumeração, não aceitando nulos e Constraint Chave Primária.
99
• Coluna Nome_Pai -> do tipo de tamanho variável que receba até
8000 caracteres, limitada a 30 e que não aceite nulos.
100