DE BANCO DE DADOS
autor
1 edio
SESES
rio de janeiro 2016
Todos os direitos reservados. Nenhuma parte desta obra pode ser reproduzida ou transmitida
por quaisquer meios (eletrnico ou mecnico, incluindo fotocpia e gravao) ou arquivada em
qualquer sistema ou banco de dados sem permisso escrita da Editora. Copyright seses, 2016.
Dados Internacionais de Catalogao na Publicao (cip)
F676i Fonseca, Cleber Costa da
112 p: il.
isbn: 978-85-5548-297-7
Sumrio
Prefcio 5
1. Modelo Relacional
1.1 Introduo ao Modelo Relacional
1.1.1 Domnios, Relaes, Variveis e Valores
1.1.2 Regras de Integridade Relacional
1.1.2.1 Restries em Domnio
1.1.2.2 Integridade Referencial
1.1.3 lgebra Relacional
1.1.3.1 Operaes de Seleo e Projeo
1.1.3.2 Operaes de Conjuntos
1.1.3.3Juno
2. Linguagem SQL
9
11
11
12
14
14
15
16
18
21
25
27
27
30
30
31
31
32
32
33
33
36
40
44
47
50
57
59
59
62
63
3. Indexao 67
3.1 Tipos de ndices
3.1.1 ndices Ordenados
3.1.2 ndices Densos e Esparsos
3.1.3 ndice Cluster e No Cluster
3.1.4 ndice Multinvel
3.2 Definio de ndice em SQL
69
71
72
74
75
76
4. Transaes 81
4.1 Conceito de Transao
4.2 Estados da Transao
4.3 Propriedades ACID
4.4 Execuo Concorrente de Transaes
83
83
84
87
95
97
98
100
101
102
102
103
104
106
Prefcio
Prezados(as) alunos(as),
Bem-vindos ao curso de Implementao de Banco de Dados. Nesta disciplina veremos as principais teorias empregadas aos Bancos de Dados Relacionais.
Sero abordadas tcnicas e mtodos referentes ao modelo relacional de dados
bem como apresentadas as principais ferramentas para o desenvolvimento,
confeco, manuteno e organizao de um banco de dados relacional.
Vocs, alunos e alunas, tero com esse livro, a condio de experimentar e
aprender a teoria envolvida em um SGBD (Sistemas Gerenciadores de Banco
de Dados Relacionais). Aprendero a criar, alimentar, organizar e manter um
banco de dados relacional e, com isso, facilitando, assim, a extrao de informaes desse banco.
Sero cinco captulos que ajudaro a familiarizarem-se com a linguagem
SQL, onde aprendero a criar suas tabelas de dados, entender como so feitos
os relacionamentos entre essas tabelas e como disponibilizar esses dados relacionados por meio de consultas SQL. Iro descobrir como melhorar essas consultas por meio de criao de ndices e anlises das estruturas. Iro descobrir
como o modelo Relacional garante a integridade dos dados e como so feitas
transaes sem a perda ou incoerncia de dados.
A informao na tomada de uma deciso primordial. A informao organizada e bem estruturada facilita e direciona melhor deciso.
Dados, Metadados, Informao e Conhecimento
Para entendermos como funciona um banco de dados relacional vamos voltar um pouco ao incio da organizao dos dados. E antes ainda, vamos definir
o significado de dados, metadados, informao e conhecimento, para ento dizer como foi definido o modelo relacional de dados.
Olhando rapidamente, as trs palavras poderiam muito bem serem sinnimos. E para algumas reas de estudo, realmente o so. A temperatura medida em um determinado momento do dia pode muito bem ser um dado,
por exemplo, 25C, indicando assim a informao de clima agradvel no momento, que tambm pode ser o conhecimento daquele momento. Mas olhando de um prisma mais amplo, poderamos querer classificar melhor esses
dados para um conhecimento mais significativo da situao.
Ao medirmos a temperatura de uma determinada localidade, e usando metodologias mais rgidas (medio da temperatura em uma rea controlada e
tendo como referncia exatamente um determinado momento) teremos um
conjunto de dados para podermos analisar melhor e obter um conhecimento
inerente a esses dados classificados. Sendo assim, podemos definir melhor:
DADOS: de uma maneira mais genrica, pode-se iniciar o estudo desse termo apresentando a definio de FERREIRA et al. (1999, p. 62) dado o princpio em que se assenta uma discusso ou o elemento ou base para a formao
de um juzo. Ainda, tomando-se um ponto de vista mais filosfico, dado o
que se apresenta conscincia como imediato, no construdo ou no elaborado, FERREIRA et al. (1999, p. 602). Essas definies so teis para exemplificar
o termo dado e situar sua definio de um ponto de vista mais humano.
Computacionalmente falando, pode-se definir dado como um valor armazenado e que por si s no quer dizer muita coisa. Uma lista de nmeros, por
exemplo, 10, 12, 20, 21, 23, 38 no nos fornecem nenhum significado, mas por
assim dizer, so os dados obtidos e anotados de alguma forma. A partir do momento que se rotula a lista, por exemplo, IDADE: 10, 12, 20, 21, 23, 38, tem-se
a definio de METADADOS, ou seja, o dado explicado atravs de um nome.
Seguindo o raciocnio, tem-se o termo informao, que quer dizer o dado
processado, isto , o resultado do processamento dos dados 10, 12, 20, 21, 23,
38 respondendo a alguma pergunta. Por exemplo, quais as IDADES acima de 18
anos armazenadas? Aps PROCESSAR os dados temos 4 idades, ou seja, 20, 21,
23, 38 anos.
Por fim, chega-se ao conhecimento, que nada mais o que se deseja obter
com a informao. No exemplo sabe-se que so 4 idades das 6 armazenadas
acima de 18 anos. Aps processar os dados com a pergunta, quantas pessoas
so maiores de 18 anos temos o conhecimento de 4 idades.
Resumindo:
Dados: valor armazenado;
Metadado: identificao do dado;
Informao: Processamento dos dados mediante uma pergunta;
Conhecimento: Dedues obtidas a partir das informaes.
Bons estudos!
1
Modelo Relacional
1. Modelo Relacional
Aps o conhecimento bsico de dados e seus desdobramentos, pode-se evoluir
mais um pouco e imaginar como toda essa informao pode ser armazenada e
recuperada para se obter o conhecimento.
No princpio, essas listas de valores eram armazenadas de forma despreocupada. Apenas sabia-se da existncia da lista de idades, lista de temperaturas mdias obtidas em determinada cidade, lista dos nomes das pessoas de uma cidade ou qualquer outra lista guardada em um sistema de maneira desproposital.
medida que essas listas foram ficando complexas e volumosas, a obteno da informao e conhecimento foram ficando cada vez mais complexos e
custosos, demandando tempo de processamento e obtendo-se informaes de
pouca qualidade.
Com o objetivo de melhor classificar esses dados e consequentemente obter a informao o mais rpido e fidedigna possvel, alguns modelos matemticos foram aplicados a esse conjunto de dados. Um deles foi o modelo com base
na Teoria Matemtica dos Conjuntos e na lgebra Relacional, chegando-se ao
Modelo de Dados Relacional. Esse modelo uma ferramenta de modelao de
dados com o objetivo principal de, como o prprio nome diz, relacionar os dados entre si.
O Modelo de dados Relacional tem as seguintes vantagens:
independente das linguagens de programao;
independente dos sistemas de gesto de bases de dados.
OBJETIVOS
Conhecer os conceitos de Dominio, Relao, Variveis e Valores no universo do Modelo
Relacional;
Definir as regras de integridade relacional;
Conhecer e aplicar a lgebra Relacional.
10
captulo 1
captulo 1
11
EXEMPLO
Dom(V1): domnio de conta (atributo ou varivel conta); conjunto de todos os nmeros de conta.
Dom(Vn): domnio de agncia (atributo ou varivel agncia); conjunto de todos os nmeros
de agncia.
Um esquema de Relao Rel, indicada por Rel(V1, V2, ..., Vn), composta por
um nome de relao R e de um conjunto de atributos ou variveis V1, V2, ..., Vn.
Cada valor V o nome de um papel desempenhado por um domnio Dom. Os
ndices das variveis so tambm ditos, graus de relao. Para o exemplo de
agncia bancria e conta bancria, tem-se uma relao de grau 2 para o esquema de relao Banco.
Uma relao (ou estado da relao) r(R) uma relao matemtica de grau
n nos domnios dom(V1), dom(V2),..., dom(Vn), que um subconjunto do produto cartesiano dos domnios que definem R: r(R) Q (dom(V1) x dom(V2) x ...
x dom(Vn)). O produto cartesiano especifica todas as possveis combinaes
de valores dos domnios subjacentes. Ento, se indicamos o nmero total de
valores, ou cardinalidade, em um domnio D por I D I (presumindo que todos
os domnios sejam finitos), o nmero total de tuplas no produto cartesiano |
dom(V1) | x I dom(V2) | x ... x I dom(Vn) | De todas essas possveis combinaes,
um estado de relao em um dado momento estado de relao corrente
reflete apenas as tuplas vlidas que representam um estado em particular do
mundo real.
1.1.2 Regras de Integridade Relacional
As regras de Integridade Relacional visam garantir a fidelidade de informaes
em um banco de dados. Basicamente so trs as formas mais comuns:
Integridade de Domnio: diz respeito aos dados que so permitidos nas
colunas da relao (tabela);
Integridade de Entidade: diz respeito a unicidade de linhas da relao;
Integridade Referencial: diz respeito a consistncia entre as tuplas
de relaes.
12
captulo 1
captulo 1
13
EXEMPLO
Considere os seguintes atributos:
NOME_PAI
NOME_ALUNO
DISCIPLINA
NOTA
razovel deduzir que NOME_PAI e NOME_ALUNO fazem parte de um mesmo domnio. Percebe-se que para a tupla NOME_PAI, NOME_ALUNO garantido a atomicidade de
dados, definindo-se o tipo NOME_PESSOA.
razovel deduzir que DISCIPLINA e NOTA so partes de domnios diferentes.
14
captulo 1
EXEMPLO
Considere os seguintes atributos:
NOME_ALUNO
NOME_DISCIPLINA
NOTA
Ao criar uma tabela para lanar as notas de uma disciplina de determinados alunos em
uma tabela DISCIPLINA_NOTA vemos que a Coluna NOME_DISCIPLINA, pode aparecer
vrias vezes com o mesmo nome. Pode-se ento, criar uma outra tabela chamada DISCIPLINA e fazer uma referncia a tabela DISCIPLINA_NOTA:
DISCIPLINA_NOTA
NOME_ALUNO
NOME_DISCIPLINA
NOTA
DISCIPLINA_NOTA
NOME_ALUNO
FK_NOME_DISCIPLINA
DISCIPLINA
FK_DISCIPLINA
NOME_DISCIPLINA
NOTA
captulo 1
15
16
captulo 1
EXEMPLO
1
2
3
4
5
NOME_ALUNO
NOME_DISCIPLINA
NOTA
Jos Geraldo
lgebra
Eduardo Tomaz
lgebra
10
Cleber Dutra
lgebra
Hernesto Paula
Fsica
10
Josu Jos
lgebra
10
Para selecionar os alunos da disciplina lgebra cuja nota foi integral, pode-se especificar
cada uma dessas condies em uma operao de SELEO:
NOME_DISCIPLINA = ALGEBRA AND NOTA = 10
Uma instruo SQL padro, teremos:
SELECT * FROM DISCIPLINA_NOTA WHERE NOME_DISCIPLINA = lgebra AND
NOTA = 10
A lgebra relacional ficaria:
NOME_DISCIPLINA = lgebra
NOTA = 10
(DISCIPLINA_NOTA)
1
2
NOME_ALUNO
NOME_DISCIPLINA
NOTA
Eduardo Tomaz
lgebra
10
Josu Jos
lgebra
10
Figura 1.4 Resultado de uma operao SELECT. Fonte: Elaborada pelo autor.
captulo 1
17
EXEMPLO
Para selecionar as disciplinas e as ocorrncias de notas nas disciplinas, teremos:
SELECT DISTINCT NOME_DISCIPLINA, NOTA FROM DISCIPLINA_NOTA
A lgebra relacional ficaria:
NOME_DISCIPLINA NOTA
(DISCIPLINA_NOTA)
Resultando a relao:
NOME_DISCIPLINA
1
2
3
4
NOTA
lgebra
lgebra
10
lgebra
Fsica
10
Figura 1.5 Resultado de uma operao PROJECT. Fonte: Elaborada pelo autor.
18
captulo 1
EXEMPLO
Temos a tabela ALUNO e a nova tabela PROFESSOR. Podemos fazer a unio dos domnios
NOME_PESSOA com os nomes dos alunos e os nomes dos professores.
Com os seguintes domnios:
NOME_PESSOA
1
2
3
4
5
Cleber Dutra
Elmasri
Fagundes Teles
Ferreira
Navathe
NOME_PESSOA
1
2
3
4
5
6
Cleber Dutra
Eduardo Tomaz
Fagundes Teles
Hernesto Paula
Jos Geraldo
Josu Jos
NOME_PESSOA
1
2
3
4
5
6
7
8
9
Cleber Dutra
Eduardo Tomaz
Elmasri
Fagundes Teles
Ferreira
Hernesto Paula
Jos Geraldo
Josu Jos
Navathe
captulo 1
19
EXEMPLO
Para a interseo entre os nomes de professores e alunos a lgebra relacional ficaria:
NOME_PESSOA (PROFESSOR) NOME_PESSOA (ALUNO)
Resultando:
NOME_PESSOA
1
Cleber Dutra
Resultando:
NOME_PESSOA
1
2
3
4
Elmasri
Fagundes Teles
Ferreira
Navathe
20
captulo 1
1.1.3.3 Juno
A operao de JUNO representado simbolicamente na lgebra relacional
pelo smbolo
, definindo uma juno natural ou pelo smbolo , definindo
uma -juno ou equijuno. Para representar uma juno natural a relao
escrita R
S onde R e S so relaes. O resultado de uma juno natural
uma tabela com as combinaes entre as tuplas R e S, combinadas entre si, por
meio de uma coluna com os nomes em comum.
Com a -juno podemos combinar tuplas de duas relaes R e S, por exemplo, em que a ondio de combinao entre as relaes no simplesmente
S
uma condio de igualdade. A -juno pode ser descrita como: R
ab
onde a e b so nomes de atributos e uma relao binria no conjunto {<, ,
=, >, }.
Por exemplo, para as tabelas abaixo teremos o resultado de uma Juno natural R
S
1
2
3
PROFESSOR
DISCIPLINA
Cleber Dutra
Matemtica
Eduardo Tomaz
Histria
Fagundes Teles
Cincias
captulo 1
21
ALUNO
1
2
3
4
DISCIPLINA
Cleber Dutra
Historia
Hernesto
Ciencias
Jonatan
Matematica
Judas
Ciencias
Disciplina (ALUNO)
Resultando:
1
2
3
4
ALUNO
DISCIPLINA
PROFESSOR
Cleber Dutra
Historia
Eduardo Tomaz
Hernesto
Ciencias
Fagundes Teles
Jonatan
Matematica
Cleber Dutra
Judas
Ciencias
Fagundes Teles
pelo autor.
PROFESSOR
IDADE_PROFESSOR
Cleber Dutra
20
Eduardo Tomaz
30
Fagundes Teles
40
1
2
3
4
PROFESSOR
IDADE_ALUNO
Hernesto
16
Homero
35
Jonatan
15
Judas
55
22
captulo 1
1
2
3
4
5
ALUNO
DISCIPLINA
PROFESSOR
IDADE_PROFESSOR
Homero
35
Cleber Dutra
35
Homero
35
Eduardo Tomaz
35
Judas
55
Cleber Dutra
55
Judas
55
Eduardo Tomaz
55
Judas
55
Fagundes Teles
55
ATIVIDADES
01. Defina chave primria, chave estrangeira e qual a importncia desses atributos em um
modelo relacional.
02. Na tabela abaixo, qual seria uma possvel chave primria? Diga os motivos que levaram
a sua escolha.
NOME DA COLUNA
TIPOS DE DADOS
NOME
nchar(50)
SOBRENOME
nchar(50)
TELEFONE
nchar(8)
ENDERECO
nchar(100)
CPFPAI
nchar(11)
CPFMAE
nchar(11)
RG
nchar(15)
CPF
nchar(10)
PERMITIR NUL...
captulo 1
23
04. Em uma possvel importao de dados de um arquivo do Excel, o que seria necessrio
fazer, caso a chave primria de uma tabela fosse definida como sendo o CPF?
NOME
SOBRENOME
CPFPAI
CPFMAE
ERNESTO
PAULA
JUCA
BRAGA
ANTUNES
JOAQUIM
RUBENS
PAGLIA
CALABRIA
CHAVES
ANTUNES
BRAGA
JOSE
BARTOLOMEU
324.522.437-98
342.534.122-09
341.534.122-10
242.534.122-11
142.534.122-12
832.234.847-19
232.234.123-09
622.192.812-87
123.172.129-81
342.182.187-12
212.112.091-00
RG
CPF
M2.323.210 665.854.455-70
387.946.353-07
8.293.232
139.128.612-00
8.239.238
179.453.260-99
571.972.952-62
018.675.567-82
REFERNCIAS BIBLIOGRFICAS
[1] ELMASRI, R.; NAVATHE, S., Sistemas de Banco de Dados. Pearson Education do Brasil, 4.Ed
2005.
[2] PINHEIRO, lvaro Farias, Fundamentos de Engenharia de Software: Introduo a Banco de
dados, Volume II, 5 Ed 2015.
24
captulo 1
2
Linguagem SQL
2. Linguagem SQL
Com o surgimento do modelo relacional de dados, foi necessrio o desenvolvimento de uma linguagem adequada para a manipulao desses dados. Na dcada de 70, com os estudos de Codd, um pesquisador da IBM, surgiu a linguagem SQL, sigla inglesa que quer dizer Structured Query Language, traduzindo
livremente, Linguagem de Consulta Estruturada. O sucesso da linguagem foi
tamanho que obrigou o ANSI (American National Standarts Institute) a padronizar a linguagem.
Em 1982, foi lanada a primeira verso oficial da SQL, outras revises surgiram: 1987, 1992, 1999 e 2003.
uma linguagem no procedural (no depende de procedures, rotinas,
para ser executada) e bastante similar ao ingls, facilitando seu aprendizado.
O SQL pode ser dividido em 5 categorias:
Data Definition Language (DDL): responsvel pelos comandos de criao, alterao e manipulao das tabelas. Alguns comandos: CREATE, DROP,
ALTER;
Data Manipulation Language (DML): responsvel pela criao, alterao
e manuteno dos dados. Alguns comandos DML: INSERT, UPDATE, DELETE;
Data Query Language (DQL)1: responsvel pela pesquisa de dados.
Basicamente tem-se o comando SELECT;
Data Transaction Language (DTL): responsvel pela integridade de transaes dos dados. Alguns comandos: SAVEPOINT, ROLLBACK, COMMIT;
Data Control Language (DCL): responsvel pela permisso e autorizao
a acesso aos dados. Alguns comandos DCL: GRANT, REVOKE;
Nos pargrafos a seguir iremos estudar os principais comandos desses 5
grupos e iremos ressaltar algumas diferenas entre os principais bancos de
dados existentes (Microsoft SQL Server, Oracle SQL Server, MySQL, Postgre
e Firebird).
OBJETIVOS
Conhecer a linguagem SQL;
Aprender os comandos DDL (Linguagem de Definio de Dados);
Aprender os comandos DML (Linguagem de Manipulao de Dados).
1
DQL tem apenas o comando SELECT, mas o SELECT tambm faz parte do grupo DML.
26
captulo 2
EXEMPLO
Criao de uma tabela de DEPARTAMENTO com os campos NUMERO (inteiro) usado como
chave primria (valor nico que vai identificar a linha da tabela), NOME (30 caracteres) e
FATOR (nmero com 2 casas decimais):
--SQLServer, Postgree, MySQL, Firebird e Oracle:
CREATE TABLE DEPARTAMENTO
(NUMERO INTEGER,
NOME VARCHAR(30) NOT NULL,
FATOR DECIMAL (3,2),
PRIMARY KEY (NUMERO));
captulo 2
27
TEMPORARY
relational_table
SCHEMA
TABLE
TABLE
objetc_table
XMLType_table
Figura 2.1 CREATE TABLE ORACLE. Fonte: documentacao oracle, disponivel em:
<http:// docs.oracle.com/cd/B19306_01/server.102/b14200/statements_7002.htm>.
28
captulo 2
EXEMPLO
--SQLServer, Postgree, MySQL, Firebird e Oracle:
CREATE TABLE DEPARTAMENTO
(NUMERO INTEGER,
NOME VARCHAR(30) NOT NULL,
FATOR DECIMAL (3,2),
PRIMARY KEY (NUMERO));
captulo 2
29
30
captulo 2
captulo 2
31
EXEMPLO
DELETE FROM PECA
1 Quando se trabalha com datas, deve-se ter cuidado ao inserir uma data como texto. Deve-se verificar qual a
configurao de pas do servidor. Na maioria das vezes melhor inserir os dados no formato americano yyyy-mm-dd,
garantindo assim a correta armazenagem do valor.
32
captulo 2
PRODUCTNAME
Chai
Chang
Aniseed Syrup
Chef Anton's Cajun Seasoning
Chef Anton's Gumbo Mix
2 A tabela Products e Categories fazem parte do banco de dados NORTHWIND usado pela Microsoft para
exemplificar vrias situaes encontradas em um SGBD. (voc poder encontr-lo em: https://www.microsoft.com/
en-us/download/details.aspx?id=23654. Acessado em: 20/03/2016.
captulo 2
33
NOME_DO_PRODUTO
Chai
Chang
Aniseed Syrup
Chef Anton's Cajun Seasoning
Chef Anton's Gumbo Mix
Voc pode ainda querer deixar mais visual o nome de suas colunas resultantes, deixando espaos ou at mesmo querendo usar uma palavra reservada3.
Tente fazer um SELECT tentando dar o nome da coluna usando uma palavra
reservada do SQL, por exemplo o SELECT:
select count(TIPO_PECA) AS SELECT
FROM PECA
WHERE TIPO_PECA = ELETRONICO
Mensagem 156, Nvel 15, Estado 1, Linha 1
Sintaxe incorreta prxima palavra-chave SELECT.
34
captulo 2
Com ALIAS:
select count(TIPO_PECA) AS QUANTIDADE
FROM PECA
WHERE TIPO_PECA = ELETRONICO
1
QUANTIDADE
10
captulo 2
35
COUNT(*)
SAVEA
31
ERNSH
30
QUICK
28
HUNGO
19
FOLKO
19
BERGS
18
RATTC
18
Figura 2.6 Select count(*) sem alias no oracle. Fonte: Elaborada pelo autor.
CategoryName
Description
Beverages
Condiments
3
4
Confections
Dairy Products
Cheeses
36
captulo 2
5
6
7
8
Grains/Cereals
Meat/Poultry
Prepared meats
Produce
Seafood
=,>.>=
Select * from Categories where categoryid = 1
1
CategoryID
1
CategoryName
Beverages
1
2
3
CategoryID
CategoryName
Description
Meat/Poultry
Prepared meats
Produce
Seafood
CategoryID
CategoryName
Description
Grains/Cereals
Meat/Poultry
Prepared meats
Produce
Seafood
Between
Select * from Categories where categoryid BETWEEN 1 AND 5
CategoryID
CategoryName
Description
Beverages
Condiments
3
4
5
Confections
Dairy Products
Cheeses
Grains/Cereals
captulo 2
37
Like: Como dito, o Like se semelhante ao =, mas possui alguns caracteres curingas, como o % que basicamente substitui sua posio por qualquer cadeia de caracteres.
Select * from Categories where CategoryName like Beverages
Semelhante a:
Select * from Categories where CategoryName = Beverages
1
CategoryID
CategoryName
Description
Beverages
CategoryID
CategoryName
Description
Condiments
Confections
[]
[^]
DESCRIO
EXEMPLO
38
captulo 2
In
Select * from Categories where categoryid IN (1, 2, 5, 7)
1
2
3
4
CategoryID
CategoryName
Description
Beverages
Condiments
Grains/Cereals
Produce
Not
Select * from Categories where categoryid NOT IN (1, 2, 5, 7)
1
2
3
4
CategoryID
CategoryName
Description
Confections
Dairy Products
Cheeses
Meat/Poultry
Prepared meats
Seafood
ProductID
ProductName
UnitPrice
UnitsOnOrder
UnitsInStock
Chai
18,00
NULL
NULL0
Chang
19,00
40
13
Aniseed Syrup
10,00
70
39
40
captulo 2
DESCRIO
EXEMPLO
RESULTADO
valor absoluto
raiz cbica
o menor inteiro no menor
que o argumento
o menor inteiro no menor
que o argumento (o mesmo
que ceil)
radianos para graus
exponenciao
o menor inteiro no menor
que o argumento
logaritmo natural
logaritmo na base 10
abs(17.4)
cbrt(27.0)
17,40
3,00
ceil(42.8)
42,00
ceiling(95.3)
95,00
degrees(0.5)
exp(1.0)
286478897565412,00
271828182845905,00
floor(42.8)
43,00
In(2.0)
log(100.0)
0,69
2,00
logaritmo na base b
log(2.0, 64.0)
60000000000,00
resto de y/x
constante "r"
a elevado a b
mod(9,4)
pi ( )
power(9.0, 3.0)
1,00
314159265358979,00
729,00
a elevado a b
power(9.0, 3.0)
729,00
radians (45.0)
0,79
random( )
round(42.4)
42,00
round(42.4382, 2) 42,44
setseed(0.54823) 1177314959,00
sign(8.4)
1,00
sqrt(2.0)
trunc(42.8)
14142135623731,00
42,00
trunc(42.4382, 2)
42,43
width_bucket(5.35, 0.024,
10.06, 5)
3,00
captulo 2
41
42
captulo 2
[ ( bulk_column_alias [ ,...n ] ) ]
| user_defined_function [ [ AS ] table_alias ] ]
| OPENXML <openxml_clause>
| derived_table [ AS ] table_alias [ ( column_alias [ ,...n ] ) ]
| <joined_table>
| <pivoted_table>
| <unpivoted_table>
| @variable [ [ AS ] table_alias ]
| @variable.function_call ( expression [ ,...n ] ) [ [ AS ] table_alias ] [ (column_alias [ ,...n ] ) ]
}
<tablesample_clause> ::=
TABLESAMPLE [SYSTEM] ( sample_number [ PERCENT | ROWS ] )
[ REPEATABLE ( repeat_seed ) ]
<joined_table> ::=
{
<table_source> <join_type> <table_source> ON <search_condition>
| <table_source> CROSS JOIN <table_source>
| left_table_source { CROSS | OUTER } APPLY right_table_source
| [ ( ] <joined_table> [ ) ]
}
<join_type> ::=
[ { INNER | { { LEFT | RIGHT | FULL } [ OUTER ] } } [ <join_hint> ] ]
JOIN
<pivoted_table> ::=
table_source PIVOT <pivot_clause> [ AS ] table_alias
<pivot_clause> ::=
( aggregate_function ( value_column [ [ , ]...n ])
FOR pivot_column
IN ( <column_list> )
)
<unpivoted_table> ::=
table_source UNPIVOT <unpivot_clause> [ AS ] table_alias
captulo 2
43
<unpivot_clause> ::=
( value_column FOR pivot_column IN ( <column_list> ) )
<column_list> ::=
column_name [ ,...n ]
2.3.4 Utilizao das clusulas ORDER BY e DISTINCT
Ao retornar um conjunto de dados de um comando SELECT pode ser necessrio a ordenao desses dados por qualquer uma das colunas retornadas. E
tambm uma ordenao do menor valor, para o maior valor (ascendente) ou do
maior valor para o menor valor (descendente). Para isso faz-se uso da clusula
ORDER BY ao final de um comando SELECT.
A clusula DISTINCT garante que o retorno dos dados somente conter valores exclusivos (distintos).
SELECT [ ALL | DISTINCT ]
[ TOP ( expression ) [ PERCENT ] ]
EXEMPLO
Na tabela PECA temos vrios valores repetidos:
1
2
3
4
5
6
7
8
9
10
11
12
13
TIPO_PECA
ID
ELETRONICO
ELETRONICO
ELETRONICO
ELETRONICO
ELETRONICO
ELETRONICO
ELETRONICO
ELETRONICO
ELETRONICO
ELETRONICO
10
OPTICO
11
OPTICO
12
OPTICO
13
44
captulo 2
1
2
3
ELETRONICO
MECANICO
OPTICO
1
2
3
4
5
6
7
8
9
10
ELETRONICO
ELETRONICO
ELETRONICO
ELETRONICO
ELETRONICO
ELETRONICO
ELETRONICO
ELETRONICO
ELETRONICO
ELETRONICO
Figura 2.21 Exemplo de select usando top 10. Fonte: Elaborada pelo autor.
45
Onde:
order_by_expression
Especifica uma coluna ou expresso na qual o conjunto de resultados da
consulta deve ser classificado. Uma coluna de classificao pode ser especificada como um nome ou alias de coluna, ou um inteiro no negativo que representa a posio da coluna na lista de seleo.
Vrias colunas de classificao podem ser especificadas. Os nomes de coluna devem ser exclusivos. A sequncia das colunas de classificao na clusula ORDER BY define a organizao do conjunto de resultados classificado. Ou
seja, o conjunto de resultados classificado pela primeira coluna e ento essa
lista ordenada classificada pela segunda coluna e assim por diante.
Os nomes de coluna referenciados na clusula ORDER BY devem corresponder a uma coluna na lista de seleo ou a uma coluna definida em uma tabela especificada na clusula FROM sem nenhuma ambiguidade.
column_position
Voc poder designar a coluna a ser ordenada especificando a posicao da
coluna no SELECT.
EXEMPLO
Select * from Categories order by 1
Ir ordernar a consulta levando-se em conta a coluna de posio 1, no caso a coluna
CategoryID:
CategoryID
CategoryName
Description
Beverages
Condiments
3
4
5
6
7
8
Confections
Dairy Products
Cheeses
Grains/Cereals
Meat/Poultry
Prepared meats
Produce
Seafood
Figura 2.22 Order by usando posicao de coluna. Fonte: Elaborada pelo autor.
46
captulo 2
ASC | DESC
Define que os valores na coluna especificada devem ser classificados em ordem crescente ou decrescente. ASC classifica do valor mais baixo para o valor
mais alto. DESC classifica do valor mais alto para o valor mais baixo. ASC a
ordem de classificao padro. Valores nulos so tratados como os menores
valores possveis.
EXEMPLO
Select * from Categories order by CategoryName desc
CategoryID
CategoryName
Description
1
2
3
4
5
6
Seafood
Produce
Meat/Poultry
Prepared meats
Grains/Cereals
Dairy Products
Cheeses
Confections
Condiments
Beverages
47
OrdertID
ProductID
UnitPrice
Quantity
Dicount
10248
11
10,00
12
10240
42
0,80
10
10248
72
34,80
10249
14
18,60
10249
51
42,40
40
10250
41
7,70
10
10250
51
42,40
35
0,15
10250
65
16,80
15
0,15
10251
22
16,80
0,05
10251
57
15,60
15
0,05
10251
65
16,80
20
10252
20
64,80
40
0,05
10252
33
2,00
25
0,05
10252
60
27,20
40
10253
31
10,00
20
48
captulo 2
GastoMedioPorPedido
QuantidadeItensPorPedido
GastoTotal
QuantidadeTotal
26,2185
23
56500,91
51317
Outra clusula bastante usada a GROUP BY, responsvel por agrupar dados de uma pesquisa, seu uso intenso quando se quer somar ou contar membros de um determinado grupo. Por exemplo, se quisermos saber quantos
(contar) produtos so do tipo eletrnico em uma tabela de componentes para
montagem de peas podemos usar:
select count(TIPO_PECA) QUANT, TIPO_PECA
FROM PECA
WHERE TIPO_PECA = ELETRONICO
GROUP BY TIPO_PECA
Repare que a pesquisa acima pode ser escrita tambm como:
select count(TIPO_PECA) QUANT, ELETRONICO TIPO_PECA
FROM PECA
WHERE TIPO_PECA = ELETRONICO
Que no faz muito sentido, j que para cada tipo diferente, teramos que
conhecer exatamente seu nome para poder criar o resultado desejado.
Mas, e se quisermos trazer a contagem de todos os tipos existentes (eletrnicos, mecnicos, opticos etc.)?
Agora sim faz mais sentido usar a expresso GROUP BY, pois, ela ir retornar para cada linha de tipos de matria a sua quantidade, sem precisar especificar na sua clusula where:
select count(TIPO_PECA) QUANT, TIPO_PECA
FROM PECA
GROUP BY TIPO_PECA
Que ir retornar:
1
2
3
QUANT
TIPO_PECA
10
ELETRONICO
15
MECANICO
OPTICO
captulo 2
49
A clusula HAVING d um poder a mais para o GROUP BY. Com ela podemos filtrar melhor os resultados de um GROUP BY ela sempre vir aps um
GROUP BY.
Se quisermos descobrir quais os tipos de peas que esto com uma contagem
baixa de estoque (com a contagem em estoque menor do que dez unidades)?
Resposta:
select count(TIPO_PECA) QUANT, TIPO_PECA
FROM PECA
GROUP BY TIPO_PECA
HAVING count(TIPO_PECA) < 10
QUANT
4
TIPO_PECA
OPTICO
50
captulo 2
| <pivoted_table>
| <unpivoted_table>
| @variable [ [ AS ] table_alias ]
| @variable.function_call ( expression [ ,...n ] ) [ [ AS ] table_alias ] [ (column_alias [ ,...n ] ) ]
}
<tablesample_clause> ::=
TABLESAMPLE [SYSTEM] ( sample_number [ PERCENT | ROWS ] )
[ REPEATABLE ( repeat_seed ) ]
<joined_table> ::=
{
<table_source> <join_type> <table_source> ON <search_condition>
| <table_source> CROSS JOIN <table_source>
| left_table_source { CROSS | OUTER } APPLY right_table_source
| [ ( ] <joined_table> [ ) ]
}
<join_type> ::=
[ { INNER | { { LEFT | RIGHT | FULL } [ OUTER ] } } [ <join_hint> ] ]
JOIN
Para melhor exemplificar vamos tomar duas tabelas4 e analisar as diversas
possibilidades para as junes:
ProductID
71
72
73
74
75
76
77
78
79
ProductName
Flotemysost
Mozzarella di Giovanni
Rd Kaviar
Longlife Tofu
Rhnbru Klosterbier
Lakkalikri
Original Frankfurter grne Sobe
Product Test 1
Product Test 2
CategoryFK
4
4
8
7
1
1
2
100
101
4 As tabelas CATEGORIA e PRODUTO foram criadas a partir dos dados das tabelas CATEGORIES e PRODUCTS
do banco de dados exemplo da Microsoft chamado NORTHWIND (voc poder encontr-lo em: https://www.
microsoft.com/en-us/download/details.aspx?id=23654. Acessado em: 20/03/2016.
captulo 2
51
CategoryID
1
9
10
2
3
4
5
6
7
8
CategoryName
Beverages
Category 1
Category 2
Condiments
Confections
Dairy Products
Grains/Cereals
Meat/Poultry
Produce
Seafood
<joined_table>
So as tabelas a serem combinadas onde sero extrados os dados. Podem
ser usadas vrias tabelas e Junes aninhados. Use parnteses para determinar
a ordem de execuo das Junes.
JOIN
Indica que a operao de juno especificada sero executadas entre as tabelas ou vises especificadas.
ON <search_condition>
Especifica o critrio de combinao ou condio de busca a ser usado entre
as tabelas, geralmente so os critrios de relacionamentos definidos entre as
tabelas. Para nossas tabelas mencionadas acima, temos:
SELECT *
FROM
CATEGORIA JOIN PRODUTO
ON
CategoryID = CategoryFK
Quando as condies de busca especificarem colunas entre as tabelas, essas colunas no necessariamente sero de mesmos nomes ou mesmos tipos
de dados. No entanto se os tipos de dados no forem compatveis uma converso entre os tipos ser necessria. Para alguns tipos de dados o SQL faz uma
converso implicita entre esses tipos de dados diferentes, ou seja, o prprio
gerenciador ir tentar combinar os dados convertendo para um tipo de dados
onde ser possvel executar a condio de busca. Para outros tipos, ou dependendo da necessidade do autor da busca, a converso entre os tipos dever ser
52
captulo 2
Beverages
Beverages
Condiments
Dairy Products
Dairy Products
Seafood
Produce
ProductID
75
76
77
71
72
74
73
ProductName
Rhnbru Klosterbier
Lakkalikri
Original Frankfurter grne Sobe
Flotemysost
Mozzarella di Giovanni
Longlife Tofu
Rd Kaviar
CategoryFK
1
1
2
4
4
7
8
Figura 2.30 Exemplo de juno com inner. Fonte: Elaborada pelo autor.
FULL [ OUTER ]
O parmetro FULL especifica o retorno de todos os dados de ambas as tabelas independente da correspondncia entre elas, as colunas que so correspondentes so preenchidas, as que no so correspondentes viro preenchidas
com NULL. Para maior clareza pode vir seguido da palavra OUTER.
EXEMPLO
select * from CATEGORIA FULL OUTER JOIN PRODUTO ON CategoryID = CategoryFK
ou:
captulo 2
53
Resultando:
CategoryID
1
1
9
10
2
3
4
4
5
6
7
8
NULL
NULL
CategoryName
Beverages
Beverages
Category 1
Category 2
Condiments
Confections
Dairy Products
Dairy Products
Grains/Cereals
Meat/Poultry
Produce
Seafood
NULL
NULL
ProductID
75
76
NULL
NULL
77
NULL
71
72
NULL
NULL
74
73
78
79
ProductName
Rhnbru Klosterbier
Lakkalikri
NULL
NULL
Original Frankfurter grne Sobe
CategoryFK
1
1
NULL
NULL
2
Flotemysost
Mozzarella di Giovanni
NULL
NULL
Longlife Tofu
Rd Kaviar
Product Test 1
Product Test 2
4
4
NULL
NULL
7
8
100
101
LEFT [ OUTER ]
O parmetro LEFT especifica o retorno de todos os dados da tabela
ESQUERDA da relao alm dos dados correspondentes a ambas as tabelas, as
colunas que so correspondentes so preenchidas, as que no so correspondentes ( tabela da esquerda) viro preenchidas com NULL. Para maior clareza
pode vir seguido da palavra OUTER.
EXEMPLO
select * from CATEGORIA LEFT OUTER JOIN PRODUTO ON CategoryID = CategoryFK
ou:
select * from CATEGORIA LEFT JOIN PRODUTO ON CategoryID = CategoryFK
54
captulo 2
Resultando:
CategoryID
1
1
9
10
2
3
4
4
5
6
7
8
CategoryName
Beverages
Beverages
Category 1
Category 2
Condiments
Confections
Dairy Products
Dairy Products
Grains/Cereals
Meat/Poultry
Produce
Seafood
ProductID
75
76
NULL
NULL
77
NULL
71
72
NULL
NULL
74
73
ProductName
Rhnbru Klosterbier
Lakkalikri
NULL
NULL
Original Frankfurter grne Sobe
CategoryFK
1
1
NULL
NULL
2
Flotemysost
Mozzarella di Giovanni
NULL
NULL
Longlife Tofu
Rd Kaviar
4
4
NULL
NULL
7
8
RIGHT [OUTER]
praticamente o contrrio de LEFT. O parmetro RIGHT especifica o retorno de todos os dados da tabela DIREITA da relao alm dos dados correspondentes a ambas as tabelas, as colunas que so correspondentes so preenchidas, as que no so correspondentes ( tabela da diretia) viro preenchidas com
NULL. Para maior clareza pode vir seguido da palavra OUTER.
EXEMPLO
select * from CATEGORIA RIGHT OUTER JOIN PRODUTO ON CategoryID = CategoryFK
ou select * from CATEGORIA RIGHT JOIN PRODUTO ON CategoryID = CategoryFK
Resultando:
CategoryID
4
4
8
7
1
1
2
NULL
NULL
CategoryName
Dairy Products
Dairy Products
Seafood
Produce
Beverages
Beverages
Condiments
NULL
NULL
ProductID
71
72
73
74
75
76
77
78
79
ProductName
Flotemysost
Mozzarella di Giovanni
Rd Kaviar
Longlife Tofu
Rhnbru Klosterbier
Lakkalikri
Original Frankfurter grne Sobe
Product Test 1
Product Test 2
CategoryFK
4
4
8
7
1
1
2
100
101
captulo 2
55
CROSS5 JOIN
Especifica o produto carteziano entre duas tabelas. Para cada linha da tabela a esquerda retornado todas as linhas da tabela a direita. No ter a clusula
ON para definir critrios de busca. Se a clusula ON for especificada, um erro
de sintaxe ser retornado.
EXEMPLO
select * from CATEGORIA CROSS JOIN PRODUTO
Resultando 90 linhas (9 linhas da tabela CATEGORIA X 10 linhas da tabela PRODUTO).
Abaixo apenas as primeiras linhas da operao CROSS JOIN:
CategoryID
1
1
1
1
1
1
1
1
1
2
2
2
2
2
2
2
2
2
CategoryName
Beverages
Beverages
Beverages
Beverages
Beverages
Beverages
Beverages
Beverages
Beverages
Condiments
Condiments
Condiments
Condiments
Condiments
Condiments
Condiments
Condiments
Condiments
ProductID
71
72
73
74
75
76
77
78
79
71
72
73
74
75
76
77
78
79
ProductName
Flotemysost
Mozzarella di Giovanni
Rd Kaviar
Longlife Tofu
Rhnbru Klosterbier
Lakkalikri
Original Frankfurter grne Sobe
Product Test 1
Product Test 2
Flotemysost
Mozzarella di Giovanni
Rd Kaviar
Longlife Tofu
Rhnbru Klosterbier
Lakkalikri
Original Frankfurter grne Sobe
Product Test 1
Product Test 2
CategoryFK
4
4
8
7
1
1
2
100
101
4
4
8
7
1
1
2
100
101
56
captulo 2
Para o JOIN:
select * from CATEGORIA JOIN PRODUTO ON CategoryID = CategoryFK
Podemos reescrever:
select * from CATEGORIA, PRODUTO WHERE CategoryID = CategoryFK
O resultado ser o mesmo.
captulo 2
57
Nesse caso, pode haver mais de uma relao entre ID_PECA e COD_PECA
que os dados sero retornados.
Note tambm, que a consulta acima pode ser escrita tambm da seguinte forma:
SELECT TIPO_PECA, COD_PECA, ID_PECA
FROM PECA, NATUREZA_PECA
WHERE ID_PECA = COD_PECA
AND TIPO_PECA = ELETRONICO
A visualizao da pesquisa acima bastante fcil e intuitiva. Ento qual a
vantagem da clusula JOIN?
A resposta est em seus argumentos LEFT, RIGHT e CROSS.
Uma subconsulta no correlata quer dizer que ela no faz referncia a sua
consulta mais interna. muito usada na clusula WHERE como sendo um grupo de dados para restrio da pesquisa. Exemplo:
SELECT TIPO_PECA
FROM PECA
WHERE ID_PECA = (SELECT MAX(COD_PECA) FROM NATUREZA_PECA)
Note que a consulta interna no faz referncia a nenhuma coluna da tabela
principal. Nesse tipo de pesquisa, apenas uma coluna poder ser especificada e
ainda assim poder trazer apenas uma linha de dados.
A pesquisa abaixo no faz sentido e retornar o erro:
SELECT TIPO_PECA
FROM PECA
WHERE ID_PECA = (SELECT COD_PECA, VALOR_NATUREZA
FROM NATUREZA_PECA)
Somente uma expresso pode ser especificada na lista de seleo quando a
subconsulta no introduzida com EXISTS.
E ao tentar corrigir, deixando apenas um argumento ela ainda poder retornar um erro:
SELECT TIPO_PECA
FROM PECA
WHERE ID_PECA = (SELECT COD_PECA FROM NATUREZA_PECA)
A subconsulta retornou mais de 1 valor. Isso no permitido quando a subconsulta segue um =, !=, <, <= , >, >= ou quando ela usada como uma expresso.
58
captulo 2
Isso acontece por que o operador igual (=) est esperando apenas um valor
para comparao. Voc pode corrigir a consulta acima (mas apesar de no retornar um erro isso no quer dizer que ela est logicamente correta) usando
o operador IN:
SELECT TIPO_PECA
FROM PECA
WHERE ID_PECA IN (SELECT COD_PECA FROM NATUREZA_PECA)
2.3.8 Operadores de Conjunto
Vimos no captulo 1 algumas operaes de lgebra relacional, apresentando as
operaes entre conjuntos possveis, incluindo UNION (UNIO), INTERSECTION (INTERSEO), SET DIFFERENCE (DIFERENA ENTRE CONJUNTOS) e
CROSS PRODUCT (PRODUTO CARTESIANO).
Essas operaes permitem descobrir os dados correlatos segundo as
instrues de conjuntos conhecidas, interseo, unio, diferena e produto cartesiano.
SELECT NOME_PROFESSOR NOME_PESSOA FROM PROFESSOR
UNION
SELECT NOME_ALUNO FROM DISCIPLINA_NOTA
SELECT NOME_PROFESSOR NOME_PESSOA FROM PROFESSOR
INTERSECT
SELECT NOME_ALUNO FROM DISCIPLINA_NOTA
SELECT NOME_PROFESSOR NOME_PESSOA FROM PROFESSOR
EXCEPT
SELECT NOME_ALUNO FROM DISCIPLINA_NOTA
captulo 2
59
60
captulo 2
IF @DIG1 > 9
SET @DIG1 = 0;
SET @SOMA = 0
SET @IND = 1
WHILE (@IND <= 10)
BEGIN
SET @Soma = @Soma + CONVERT(INT,SUBSTRING(@CPF,@IND,1)) *
(12 - @IND);
SET @IND = @IND + 1
END
SET @DIG2 = 11 - (@SOMA % 11)
IF @DIG2 > 9
SET @DIG2 = 0;
IF (@DIG1 = SUBSTRING(@CPF,LEN(@CPF)-1,1)) AND (@DIG2 =
SUBSTRING(@CPF,LEN(@CPF),1))
SET @RESULT = S
ELSE
SET @RESULT = N
END
RETURN @RESULT
END
Se voc tem uma consulta que feita vrias vezes ou a usa em diversos locais de seu sistema, voc pode querer criar uma stored procedure com essa
consulta armazenada. Assim, se precisar alterar a pesquisa, poder fazer em
apenas um local, no sendo necessrio procurar em todo o seu sistema e ainda
correr o risco de esquecer algum lugar que vai chamar a consulta da maneira
antiga e retornar um erro para o usurio do sistema.
Um outro uso bastante difundido de stored procedures fazer toda a lgica de inserir, alterar, deletar os dados criando essas regras no prprio banco
de dados. Assim voc tem um controle maior de seus dados e poder fazer a
manuteno dessas operaes em apenas um lugar.
Uma outra forma de consulta armazenada bastante usada, so as VIEWS
que nada mais so, do que consultas prontas para uso, e ainda podem ser usadas em outras consultas de maneira transparente, como sendo uma tabela
(ou entidade).
captulo 2
61
62
captulo 2
Por exemplo:
CREATE VIEW CATEGORIA_PRODUTO
AS
SELECT CategoryID, ProductID, CategoryName, ProductName
from CATEGORIA JOIN PRODUTO
ON CategoryID = CategoryFK;
Aps a criao de uma VIEW seu uso feito como se fosse uma Tabela j
existente no Banco de dados:
SELECT * FROM CATEGORIA_PRODUTO
ORDER BY CategoryName
Olhando apenas o resultando fica impossvel distinguir se uma Tabela ou
uma View:
CategoryID
1
1
2
4
4
7
8
ProductID
75
76
77
71
72
74
73
CategoryName
Beverages
Beverages
Confections
Dairy Products
Dairy Products
Produce
Seafood
ProductName
Rhnbru Klosterbier
Lakkalikri
Original Frankfurter grne Sobe
Flotemysost
Mozzarella di Giovanni
Longlife Tofu
Rd Kaviar
Figura 2.35 Resultado de um select a partir de uma view. Fonte: Elaborada pelo autor.
63
No MS SQL Server, para se definir uma coluna chave, bastante usado o tipo
IDENTITY que corresponde a uma sequncia de nmeros criadas e inseridas
automaticamente em uma tabela de banco de dados.
Por exemplo, para criar uma tabela no SQL e usar um campo de auto numerao para usar como chave primria usamos:
--SQLServer
CREATE TABLE CARGO(
NUMERO INTEGER IDENTITY (1,1),
NOME VARCHAR(30) NOT NULL,
PRIMARY KEY (NUMERO));
Exemplo de uso:
--SQLServer / MySQL
INSERT INTO CARGO (NOME) VALUES (ENGENHEIRO)
Para o Postgree ou Oracle:
--Postgree / Oracle
CREATE TABLE CARGO(
NUMERO INTEGER,
NOME VARCHAR(30) NOT NULL,
PRIMARY KEY (NUMERO));
CREATE SEQUENCE CARGOSEQ, INCREMENT
BY 1 START WITH 1;
Exemplo de uso:
--Postgree
INSERT
INTO
CARGO
(NUMERO,
(nextval(CARGOSEQ),ENGENHEIRO);
--Oracle
INSERT INTO CARGO (NUMERO, NOME)
NextVal,ENGENHEIRO);
Para o MySQL:
--MySQL
CREATE TABLE CARGO(
NUMERO INTEGER AUTO_INCREMENT,
NOME VARCHAR(30) NOT NULL,
PRIMARY KEY (NUMERO));
64
captulo 2
NOME)
VALUES
VALUES
(CARGOSEQ.
Exemplo de uso:
--SQLServer / MySQL
INSERT INTO CARGO (NOME) VALUES (ENGENHEIRO)
ATIVIDADES
01. A relao abaixo possvel? Nela o CPF da Tabela PESSOAS est relaciona com o
CPFPAI da mesma tabela PESSOAS e o CPFMAE tambm est relacionado com o CPF da
mesma tabela.
PESSOAS
CPF
NOME
CPFPAI
CPFMAE
02. Escreva uma consulta (SELECT) para retornar o Nome de uma pessoa e de seu Pai.
03. Escreva uma consulta (SELECT) para retornar o Nome de uma pessoa, seu Pai e
sua Me.
04. Em uma instruo SELECT, retorne os dados da tabela do exerccio 1 do captulo 1 em
duas colunas e no seguinte formato:
Sobrenome em maisculo, (com a vrgula) Nome com o primeiro caractere em Maisculo
e, CPF (sem pontos e traos), exemplo:
PAGLIA, Ernesto
32452243798
05. Escreva a instruo INSERT para a insero dos seguintes dados na tabela PESSOAS:
CPF: 038.053.186-00
NOME: Joo
SOBRENOME: Silva
CPFPAI: NULL
CPFMAE: NULL
06. Qual a diferena entre os SELECTS:
select ((3.0+5.0)*4.0)/3.0 e select ((3+5)*4)/3
captulo 2
65
07. Escreva a consulta abaixo sem usar o JOIN (use o WHERE). Qual voc achou mais fcil
de construir? E de entender? Justifique.
SELECT * FROM Orders JOIN [Order Details] ON [Order Details].OrderID = Orders.OrderID JOIN Products ON Products.ProductID = [Order Details].ProductID
08. Na consulta abaixo, qual o erro? Por que? Como voc reescreveria?
SELECT sum(quantity), ProductName FROM [Order Details], Products where [Order
Details].ProductID = Products.ProductID and sum(quantity) > 10
09. Na sua opinio, qual a maior vantagem de se usar uma VIEW?
10. A consulta a seguir est correta? O que ela faz? Como ela poderia ser reescrita?
select OrderID, (select CustomerID from Customers where customerId = orders.customerId) customerId, (select [CompanyName] from Customers where customerId = orders.
customerId) [CompanyName] from orders
REFERNCIAS BIBLIOGRFICAS
[1] ELMASRI, R.; NAVATHE, S., Sistemas de Banco de Dados. Pearson Education do Brasil, 4.Ed
2005.
[2] PINHEIRO, lvaro Farias, Fundamentos de Engenharia de Software: Introduo a Banco de
dados, Volume II, 5 Ed 2015.
[3] Microsoft SQL SERVER. Documentao Microsoft SQL Server 2014, [Online]. Available: https://
msdn.microsoft.com/library/mt590198.aspx. [Acesso em 20 03 2016].
[3] ORACLE SERVER, Documentao ORACLE, [Online]. Available: http://www.oracle.com/
technetwork/pt/indexes/documentation/index.html. [Acesso em 20 03 2016].
[4] MySQL, Documentao MySQL, [Online]. Available: https://dev.MySQL.com/doc/refman/5.7/
en/. [Acesso em 20 03 2016].
[5] POSTGREE, Documentao POSTGREE , [Online]. Available: http://www.postgreSQL.org/
docs/9.5/static/index.html. [Acesso em 20 03 2016].
66
captulo 2
3
Indexao
3. Indexao
Uma das maiores qualidades de um Sistema Gerenciador de Banco de Dados
(SGBD) a rapidez com que as informaes so resgatadas. Essa informao,
geralmente gravada na forma de arquivo em um disco rgido de computador.
E em um SGBD, uma pesquisa feita entre milhares de megabytes pode ser retornada em questo de segundos. Na maioria das vezes no se tem a ideia da
dimenso e complexidade que o Banco de Dados atinge em um sistema. Isso
passa a ser um mero detalhe para quem o usa. O importante que os dados
esto sendo retornados rapidamente e a confiana nessa informao deve ser
total. E para que essas duas qualidades sejam atendidas, rapidez e qualidade da
informao, quem constri o banco deve se preocupar com a organizao dessa informao. Sem isso o retorno de dados pode ser demorado e o que pior,
pode no ter a veracidade que se espera de um banco de dados.
Uma das estruturas do Banco de Dados responsvel pela rapidez nas respostas s pesquisas, so os ndices. Eles organizam a informao de tal forma
que fica fcil e rpido encontr-la, sobretudo levando-se em conta os milhares
de megabytes que um SBGD pode chegar. Um ndice organiza os dados de uma
tabela, fazendo com que a busca por esses dados seja feita com o mnimo de
leituras, de maneira rpida e eficiente.
Esses ndices so criados por meio de algoritmos eficientes de busca de dados, geralmente o algoritmo usado o B-Tree ou, rvore B.
Uma estrutura B-Tree possui uma raiz (primeiro n da rvore, por onde
sempre se iniciam as buscas), nveis intermedirios e nveis folhas, conforme
figura abaixo:
RAIZ
Nvel Intermedirio
Nvel Folha
Figura 3.1 B Tree. Fonte: Elaborada pelo autor.
68
captulo 3
OBJETIVOS
Aprender sobre o significado e importncia dos ndices;
Conhecer e definir os tipos de ndices;
Definir os ndices no SQL (Microsoft, Oracle, MySQL e PostgreSQL).
captulo 3
69
70
captulo 3
Os ndices de mltiplos nveis ao contrrio dos de nveis nicos, so construdos mediante a criao de vrios arquivos ou vrios ndices em nveis. Onde
no primeiro nvel a tabela ordenada mediante a criao de um ndice qualquer como visto anteriormente. Nos nveis seguintes, so criados ndices primrios sobre os ndices anteriores. Pode-se construir ndices multinveis sobre
qualquer ndice, seja ele primrio, clustering ou secundrio. O problema de
um ndice de mltiplos nveis est quando necessrio excluir ou inserir um
registro. O que antes estava distribudo em arquivos balanceados, acaba ficando desbalanceado. A operao para reorganizar esses ndices se torna bastante
complexa, j que a ordenao desses ndices deve ser feita em tempo real, ou
seja, exatamente no momento que a informao manipulada (na insero ou
excluso do registro).
O ndice denso constitudo por um arquivo onde cada registro indexado.
Os registros podem estar armazenados em qualquer ordem do arquivo e seu arquivo de indexao consegue localizar cada registro em separado pelo arquivo
de indexao.
Um ndice no denso (tambm chamado de ndice esparso) consiste em
um arquivo de ndice para blocos ou pginas do arquivo, cada um dos quais
contendo um grupo de arquivo. Esse bloco precisa estar organizado segundo
o atributo indexador. No arquivo de ndice, cada ndice aponta para o primeiro
registro de cada bloco.
3.1.1 ndices Ordenados
Um ndice ordenado basicamente um guia ordenado para a busca de informao. Como o ndice de um livro-texto, uma informao menor, ordenada que
guiar para uma informao mais completa. Mas, pensando melhor, se toda
a informao est no computador e com o computador podemos fazer o que
queremos, por que no ordenar toda a informao? Isso no possvel?
A resposta sim. possvel. E no comeo foi assim, a informao era ordenada na mesma hora que era inserida. Mas a medida que a informao aumentava, a ordenao ficava mais difcil e o processo, mais lento. A ideia de indexar parte da informao para a busca agilizou todo o processo.
Um ndice geralmente definido sobre um campo importante de uma tabela de dados. Para esse campo definido uma estrutura ordenada de acesso
captulo 3
71
tabela. Ordenar o ndice mais rpido que ordenar a tabela inteira, e uma
estrutura de ponteiros definida ligando o ndice ao campo da tabela, ficando
mais rpido uma busca pelo ndice, que alm de estar ordenado uma estrutura menor. De maneira geral, o ndice armazena o valor de cada campo da tabela
a ser ordenada e associa uma lista de ponteiros para todos os blocos de disco
que contm registros com aquele valor de campo. Um ndice primrio criado
sobre um campo chave da tabela a ser indexada. Se esse campo no um campo chave, mas um campo onde faz-se necessrio a criao de uma estrutura
para busca, esse ndice chamado ndice clustering. Um ndice pode ter, no
mximo, um campo de classificao fsica, portanto, um ndice ou primrio
ou clustering, mas no ambos. Um terceiro ndice de classificao pode ser
especificado sobre qualquer outro campo da tabela que no seja o campo de
classificao da tabela, esse ndice chamado ndice secundrio e uma tabela
pode ter vrios ndices secundrios alm do ndice de classificao primria.
3.1.2 ndices Densos e Esparsos
Os ndices tambm podem ser classificados como densos ou esparsos. Um
ndice denso possui uma entrada de ndice para cada valor da chave de busca
(portanto, para cada ocorrncia do valor no registro) do arquivo de dados. Porm, um ndice esparso (ou no-denso) possui entradas de ndice para apenas
alguns dos valores de busca. Um ndice primrio , portanto, um ndice esparso, uma vez que inclui uma entrada de ndice para cada bloco do arquivo de dados e as chaves de seus registros ncoras em vez de uma entrada para cada valor
de busca (ou cada registro). O arquivo de ndice para um ndice primrio precisa de muito menos blocos do que o arquivo de dados por duas razes. Primeiro,
h menos entradas de ndice que registros no arquivo de dados. Segundo, cada
entrada de ndice tipicamente menor em tamanho que o registro de dados,
porque elas possuem apenas dois campos; consequentemente, mais entradas
de ndice do que registros de dados podem caber em um bloco. Portanto, uma
busca binria no arquivo de ndice exige menos acessos a blocos do que uma
busca binria no arquivo de dados.
Um dos primeiros mtodos de indexao criado utiliza um arquivo indexado sequencialmente, que so utilizados tanto para um acesso sequencial
como para um acesso aleatrio aos registros. Exemplificando, podemos criar
um arquivo de ndices para os departamentos existentes em uma empresa.
72
captulo 3
Para localizar os funcionrios pelos departamentos mais rapidamente, podemos criar um arquivo de ndice onde todos os departamentos so ordenados
sequencialmente e apontar cada departamento para os departamentos em
que cada funcionrio est alocado:
DEPARTAMENTONOME
COMPRAS
DESENVOLVIMENTO
PESQUISA
RECURSOS HUMANOS
VENDAS
DEPARTAMENTONOME
COMPRAS
COMPRAS
COMPRAS
DESENVOLVIMENTO
PESQUISA
PESQUISA
PESQUISA
PESQUISA
RECURSOS HUMANOS
RECURSOS HUMANOS
VENDAS
VENDAS
VENDAS
FUNCIONARIONOME
ANA
EVA
CLARA
JUDAS
PEDRO
PATRICIA
PAULO
MARIA
JUCA
JOAQUIM
JOAO
JOSE
NORBERTO
captulo 3
73
DEPARTAMENTONOME
COMPRAS
DESENVOLVIMENTO
PESQUISA
RECURSOS HUMANOS
VENDAS
DEPARTAMENTONOME
COMPRAS
COMPRAS
COMPRAS
DESENVOLVIMENTO
PESQUISA
PESQUISA
PESQUISA
PESQUISA
RECURSOS HUMANOS
RECURSOS HUMANOS
VENDAS
VENDAS
VENDAS
FUNCIONARIONOME
ANA
EVA
CLARA
JUDAS
PEDRO
PATRICIA
PAULO
MARIA
JUCA
JOAQUIM
JOAO
JOSE
NORBERTO
74
captulo 3
75
Primeiro nvel
PK
40
39
38
PK
40
30
20
PT
Dados
PT
PK
30
29
28
PT
PK
20
19
18
PT
PK
40
35
34
30
25
24
20
15
INFO
76
captulo 3
TIPO DE NDICE
CLUSTERED
NONCLUSTERED
UNIQUE
DESCRIO
Um ndice cluster armazena as linhas de dados da tabela ou exibio em
ordem com base na chave de ndice de cluster.O ndice de cluster implementado como uma estrutura de ndice B-tree que suporta a recuperao
rpida das linhas, com base em seus valores de chave de ndice de cluster.
Um ndice no cluster pode ser definido em uma tabela ou exibio com
um ndice de cluster ou em um heap.Cada linha de ndice no ndice no
cluster contm o valor de chave no cluster e um localizador de linha.Este
localizador aponta para a linha de dados no ndice clusterizado ou heap
tendo o valor da chave.As linhas no ndice so armazenadas na ordem dos
valores de ndice de chave, mas as linhas de dados no so garantidas
para estar em qualquer ordem particular, a menos que um ndice de cluster
criado na tabela.
Um ndice Unique garante que a chave de ndice no contm valores
duplicados e, portanto, todas as linhas na tabela ou exibio , de alguma
forma nica.
Uniqueness pode ser uma propriedade de ambos os ndices clusterizados
e no clusterizados.
COLUMNSTORE
NDICE EM COLUNAS
COMPUTADAS
FILTERED
SPATIAL
Um ndice Spatial fornece a capacidade de executar determinadas operaes de forma mais eficiente em objetos espaciais(dados espaciais)
em uma coluna do tipo de dados degeometria.O ndice espacial reduz
o nmero de objetos sobre os quais operaes espaciais relativamente
dispendiosas precisam ser aplicadas.
XML
FULL-TEXT
captulo 3
77
DESCRIO
NORMAL INDEX
BITMAP INDEX
Usados para colunas com baixa cardinalidade, ou seja, com baixa variao
de valores (por exemplo uma coluna GENERO onde os valores temos
apenas F ou M, para masculino ou feminino.
PARTITIONED INDEX
INDEX BASEADO EM
FUNO
DOMAIN INDEXES
Usando o objeto de esquema Index Type, um ndice especfico do aplicativo pode ser criado. Esse ndice chamado de ndice de domnio, uma
vez que utilizada para a indexao de dados em domnios especficos do
aplicativo.
No MySQL:
TIPO DE NDICE
UNIQUE
DESCRIO
Um ndice Unique garante que a chave de ndice no contm valores
duplicados e, portanto, todas as linhas na tabela ou exibio , de alguma
forma nica.
Uniqueness pode ser uma propriedade de ambos os ndices clusterizados
e no clusterizados.
SPATIAL
Um ndice Spatial fornece a capacidade de executar determinadas operaes de forma mais eficiente em objetos espaciais(dados espaciais)
em uma coluna do tipo de dados degeometria.O ndice espacial reduz
o nmero de objetos sobre os quais operaes espaciais relativamente
dispendiosas precisam ser aplicadas.
FULL-TEXT
78
captulo 3
ATIVIDADES
01. Em sua opinio, qual a importncia na criao de ndices em um sistema de banco
de dados?
02. Defina ndice primrio.
03. Defina ndice secundrio.
04. Por que apenas um ndice primrio pode existir?
05. Quais so as diferenas entre ndices densos e ndices esparsos?
REFERNCIAS BIBLIOGRFICAS
[1] TENEMBAUM,Aaron - Estruturas de Dados Usando C - Ed. Person Makron Books 2004.
[2] ELMASRI, R.; NAVATHE, S., Sistemas de Banco de Dados. Pearson Education do Brasil, 4.Ed
2005.
[3] PINHEIRO, lvaro Farias, Fundamentos de Engenharia de Software: Introduo a Banco de
dados, Volume II, 5 Ed 2015.
[4] Microsoft SQL SERVER. Documentao Microsoft SQL Server 2014, [Online]. Available: https://
msdn.microsoft.com/library/mt590198.aspx. [Acesso em 20 03 2016].
[5] ORACLE SERVER, Documentao ORACLE, [Online]. Available: http://www.oracle.com/
technetwork/pt/indexes/documentation/index.html. [Acesso em 20 03 2016].
[6] MYSQL, Documentao MYSQL, [Online]. Available: https://dev.mySQL.com/doc/refman/5.7/
en/. [Acesso em 20 03 2016].
[7] POSTGREE, Documentao POSTGREE , [Online]. Available: http://www.postgreSQL.org/
docs/9.5/static/index.html. [Acesso em 20 03 2016].
captulo 3
79
80
captulo 3
4
Transaes
4. Transaes
Poder guardar milhares e milhares de informao e faz-la de forma organizada uma das grandes vantagens de um Sistema de Banco de Dados (SGBD).
Mas como saber se toda essa informao realmente confivel? Como saber se
todas as contas que um banco de dados capaz de fazer, esto sendo feitas de
maneira correta, sendo arquivada junto a alguma informao que faa sentido?
Imagine se todas as transaes bancrias no pudessem ser confiveis? Se ao
criar um novo registro, ao tentar recuper-lo descobrssemos que a informao
que deveria estar l est fazendo parte de outro registro? Todas essas respostas
so dadas pelo sistema de transaes de um Banco de Dados. com ele que
garantimos que um registro de banco de dados est sendo guardado no lugar
certo, junto com as informaes certas. Ele capaz de guiar toda a forma que
as informaes so salvas.
Sistemas de transao so sistemas desenvolvidos para bancos de dados
que garantem a execuo de processamento de registros concorrentes no banco de dados. Neste captulo apresentaremos os conceitos de processamentos
de transaes.
Veremos como uma transao deve ser completa e integral para garantir
preciso. Analisaremos o problema das concorrncias que surgem quando
diversas transaes, submetidas por vrios usurios, interferirem nas outras,
produzindo resultados imprecisos. Veremos tambm como possvel recuperar uma informao, caso uma transao no seja feito da maneira esperada.
OBJETIVOS
Definir e conhecer o significado de Transacoes em Bancos de dados;
Conhecer os estados das Transaes;
Definir as propriedades ACID.
82
captulo 4
captulo 4
83
Begin
transaction
Ativa
(Read, Write)
End
transaction
Parcialmente
validada
Commit
Validada
Rollback
Invalidada
Finalizada
84
captulo 4
regras de integridade dos dados, suas chaves e tipos de dados. Deve ser Isolada, ou seja, o trabalho naquele registro, pertinente a aquela transao deve
ser nico, sem a interferncia de nenhuma outra transao ou operao que
possa estar ocorrendo. Deve ser Durvel, uma vez executada e finalizada, seus
dados devem ser persistentes independente de qualquer ocorrncia externa,
tais como uma queda de energia ou interrupo abrupta do sistema. Uma vez
finalizada seu resultado ser confivel.
EXEMPLO
Atomicidade
Ou todo o trabalho feito, ou nada feito.
Em uma transferncia de valores entre contas bancrias, necessrio que, da conta
origem seja retirado um valor X e na conta destino seja somado o mesmo valor X. As duas
operaes devem ser completadas sem que qualquer erro acontea, caso contrrio todas as
alteraes feitas nessa operao de transferncia devem ser desfeitas;
Consistncia
Deve respeitar as regras de chaves e tipos de dados.
Considere um banco de dados que guarde informaes de produtos e que use o Cdigo
de Barras como chave primria, no formato de 11 dgitos numricos. Ento, qualquer insero ou alterao no banco no pode duplicar um cdigo de barras (unicidade de chaves)
ou colocar um valor de cdigo de barras invlido, como o valor 12356789AB (restrio de
integridade lgica).
Isolamento
Evita que transaes paralelas interfiram umas nas outras.
Considere as duas seguintes transaes efetuadas em um banco de dados com informaes de funcionrios de uma empresa (o exemplo a seguir baseado no exemplo disponvel
no wikipedia. Disponvel em: <https://pt.wikipedia.org/wiki/ACID>. Acessado em 22 abr.
2016):
T_1: Aumentar o preo de um produto em 10 reais para o produto de cdigo de barras 12345678901.
T_2: Aumentar o preo de um produto em 10% para o produto de cdigo de barras 12345678901.
captulo 4
85
86
captulo 4
87
bloqueio para cada item de dado no banco de dados e eles so usados como
meio de sincronizar o acesso por transaes concorrentes aos itens do banco de
dados. Ao contrrio de uma transao, um bloqueio no garante um processo
de manipulao de dados de maneira consistente. Um bloqueio apenas impede
que outros recursos acessem a tabela em LOCK. Por esse motivo o uso deliberado do LOCK deve ser ponderado pois podem ocorrer DEADLOCKS (impasse)
ou STARVATION (inanio). Um deadlock ocorre quando um objeto bloqueado
est esperando algum outro recurso que tambm est em bloqueio e, por conseguinte, esse mesmo processo est esperando o primeiro que tambm est na
condio de bloqueio. J a condio de starvation ou inanio ocorre quando
um processo em bloqueio no pode continuar por um perodo indefinido de
tempo, enquanto outras transaes no sistema continuam normalmente.
88
captulo 4
EXEMPLO
@@ERROR:
BEGIN TRANSACTION
UPDATE FUNCIONARIO
SET SALARIO = SALARIO * 1.10
WHERE SALARIO = 1000
IF @@ERROR = 0
COMMIT
ELSE
ROLLBACK
END
Nesse exemplo estamos dando um aumento de salrio de 10% para todos os funcionrios cujo salrio mil reais. Caso algum erro ocorra, o comando revertido, caso no tenha
erro, toda operao validada.
Se ocorrer algum erro, uma mensagem do sistema ser apresentada, s vezes essas
mensagens so um tanto complicadas e geralmente apresentadas na linguagem de instalao do banco de dados, dessa forma, podemos fazer o uso de uma funo no SQL responsvel por gerar um erro com as caractersticas definidas pelo administrador o programador
da rotina.
Ficando assim:
BEGIN TRANSACTION
UPDATE FUNCIONARIO
SET SALARIO = SALARIO * 1.10
WHERE SALARIO = 1000
IF @@ERROR = 0
COMMIT
ELSE
ROLLBACK
END
captulo 4
89
COMMIT
ELSE
ROLLBACK
END
Essa transao dita explicita, pois requer que o comando BEGIN TRANSACTION seja
executado para termos uma transao em andamento. Esse o modo padro com que o
Microsoft SQL Server executado. Mas, podemos fazer com que todas as operaes sejam
executadas mediante as regras de transao. Para isso basta executar o comando abaixo
uma vez, e assim, todas as execues desse ponto em diante sero tratadas como sendo
uma transao. Perceba que no mais ser necessrio a execuo de um begin transaction,
mas o programador do banco de dados dever executar o COMMIT ou ROLLBACK quando necessrio.
SET IMPLICIT_TRANSACTIONS ON
UPDATE FUNCIONARIO
SET SALARIO = SALARIO * 1.10
WHERE SALARIO = 1000
IF @@ERROR = 0
COMMIT
ELSE
90
captulo 4
ROLLBACK
END
Pode-se ainda fazer o uso do comando a seguir:
SET XACT_ABORT ON
O padro dessa propriedade OFF. Colocando em ON o sistema de banco automaticamente executar um ROLLBACK caso algum erro ocorra.
Outra caracterstica interessante de um banco de dados o uso.
Suponhamos que em nosso sistema tenhamos vrias execues de INSERT e UPDADE
e que por algum motivo, queiramos controlar as transaes de forma que elas possam ser
executadas e que sob determinados aspectos somente parte dessa transao se torne vlida, sem que precisemos fazer um ROLLBACK em toda a transao e comecemos novamente para fazer somente a parte que nos interesse. Para isso pode-se recorrer a uma propriedade interessante, chamada SAVE POINT. Com ela pode-se definir alguns pontos da transao
onde ser possvel o ROLLBACK ou COMMIT apenas daquela parte, exemplificando:
BEGIN;
CREATE TEMPORARY TABLE tabela1 (col1 int) ON COMMIT DROP;
INSERT INTO tabela1 VALUES (1);
SAVE TRANSACTION meu_ponto_de_salvamento;
INSERT INTO tabela1 VALUES (2);
ROLLBACK TO SAVEPOINT meu_ponto_de_salvamento;
INSERT INTO tabela1 VALUES (3);
SELECT * FROM tabela1;
COMMIT;
A transao acima inseriu os valores 1 e 3, mas no o 2.
Nos sistemas de bancos de dados POSTGRE, ORACLE e MYSQL ao invs de escrever
SAVE TRANSACTION escrito SAVEPOINT:
BEGIN;
CREATE TEMPORARY TABLE tabela1 (col1 int) ON COMMIT DROP;
INSERT INTO tabela1 VALUES (1);
SAVEPOINT meu_ponto_de_salvamento;
INSERT INTO tabela1 VALUES (2);
ROLLBACK TO SAVEPOINT meu_ponto_de_salvamento;
captulo 4
91
Ainda, no sistema de banco de dados do POSTGRE e MYSQL (no ORACLE no) existe
um comando caso o programador queira liberar um SAVE POINT. O comando o RELEASE
SAVEPOINT esse comando ir destruir o SAVEPOINT previamente criado:
BEGIN;
CREATE TEMPORARY TABLE tabela1 (col1 int) ON COMMIT DROP;
INSERT INTO tabela1 VALUES (3);
SAVEPOINT meu_ponto_de_salvamento;
INSERT INTO tabela1 VALUES (4);
RELEASE SAVEPOINT meu_ponto_de_salvamento;
SELECT * FROM tabela1;
COMMIT;
col1
-----3
4
(2 linhas)
A transao acima inseriu tanto o 3 quanto o 4.
ATIVIDADES
01. O que execuo concorrente de transaes em banco de dados num sistema multiusurio? Em sua opinio, por que o controle de concorrncia necessrio?
02. O controle de transao no exemplo abaixo necessrio, por qu?
begin tran
select * from PESSOAS
commit tran
92
captulo 4
Se uma transao concluda com sucesso (operao commit bem sucedida), ento
seus efeitos so persistentes.
II.
a) Durabilidade e consistncia.
b) Persistncia e automao.
c) Isolao e atomicidade.
d) Durabilidade e atomicidade.
e) Consistncia e persistncia.
05. possvel dividir uma transao em etapas? D exemplo.
REFERNCIAS BIBLIOGRFICAS
[1] TENEMBAUM,Aaron - Estruturas de Dados Usando C - Ed. Person Makron Books 2004.
[2] ELMASRI, R.; NAVATHE, S., Sistemas de Banco de Dados. Pearson Education do Brasil, 4.Ed
2005.
[3] PINHEIRO, lvaro Farias, Fundamentos de Engenharia de Software: Introduo a Banco de
dados, Volume II, 5 Ed 2015.
[4] Definico das propriedades ACID, Wikipdia. Disponivel em: https://pt.wikipedia.org/wiki/
ACID. Acessado em: 22/04/2016.
captulo 4
93
94
captulo 4
5
Otimizao e
Processamento de
Consultas
OBJETIVOS
Conhecer alguns dos algoritmos para processamento de consultas;
Aprender a otimizar uma consulta;
Conhecer um plano de execuo de consultas.
96
captulo 5
captulo 5
97
98
captulo 5
captulo 5
99
100
captulo 5
Inicialize:
i = 1;
j = b;
{tamanho do arquivo em blocos}
k = nB; {tamanho do buffer em blocos}
m = ( j / k );
{Fase de Ordenao}
While (i <= m) {
- Ler os prximos k blocos do arquivo para o buffer ou se houver menos do que k
blocos restantes, ento ler os blocos restantes;
- Ordenar os registros no buffer e grav-los como um subarquivo temporrio;
i = i + 1;
};
{Fase de Fuso: fundir os subarquivos at que reste apenas 1}
Inicialize:
i = 1;
p = logk-1 m;
{p o nmero de passagens da fase de fuso}
j = m;
While (i <= p) {
n = 1;
q = (j / (k-1));
While (n <= q) {
- Ler os prximos k-1 subarquivos ou os subarquivos restantes (da passagem anterior), um bloco por vez;
- Fundir e gravar como novo subarquivo um bloco por vez;
n = n + 1;
}
j = q;
i = i + 1;
}
captulo 5
101
102
captulo 5
Uma consulta inicialmente traduzida para a lgebra relacional, geralmente representada em uma estrutura de dados de rvore de consultas ou de um
grafo de consulta. Aps essa representao o analisador sinttico otimiza essa
consulta de acordo com regras de heurstica.
Uma das principais regras heursticas aplicar as operaes SELECT e
PROJECT antes de aplicar o JOIN. As operaes de SELECT e PROJECT reduzem o tamanho de um arquivo, ao passo que o JOIN ao agregar novos dados e
aumentam o tamanho desse arquivo.
As regras de heursticas devem ser aplicadas nos seguintes passos:
1. Executar operaes de SELEO e PROJEO primeiramente;
2. A JUNO s deve ser realizada depois da SELEO e PROJEO;
3. Somente os atributos solicitados para o resultado da consulta e os
que realmente so necessrios em consultas subsequentes que devem
ser projetados;
4. Evitar gerao de mltiplas tabelas intermedirias;
5. Pesquisar as subexpresses comuns e process-las somente uma vez.
5.2.2 Medidas de Custo de uma consulta
Um otimizador de consultas no deve depender somente de regras heursticas; ele tambm deve estimar e comparar os custos da execuo de uma consulta usando diferentes estratgias de execuo e deve escolher a estratgia com
a menor estimativa de custo. ELMASRI, R.; NAVATHE, S., Sistemas de Banco
de Dados pag. 375.
Para que a escolha de uma estratgia de execuo de uma consulta seja feita, em detrimento a outra, a comparao visando os custos envolvidos deve ser
feita de maneira correta e realista. Alm disso as estimativas de custo levam
tempo para serem analisadas, por isso deve-se empregar essa tcnica em um
nmero reduzido de estratgias. Geralmente estimativas de custos so aplicadas em consultas compiladas, onde sero usadas frequentemente pelo sistema. Para as consultas interpretadas, nas quais todo o processo ocorre em temo
de execuo, uma otimizao em escala completa, alm de consumir tempo em
anlise, e levando-se em conta apenas os custos de otimizao, pode acabar aumentando o tempo de resposta dessas consultas. Nesse caso, uma otimizao
parcial, que acaba consumindo menos tempo de anlise, mais indicado para
esse tipo de abordagem.
captulo 5
103
104
captulo 5
105
captulo 5
106
captulo 5
captulo 5
107
ATIVIDADES
01. Diga os principais pontos que voc utilizaria para melhorar as consultas abaixo?
a)
b)
REFERNCIAS BIBLIOGRFICAS
[1] TENEMBAUM,Aaron - Estruturas de Dados Usando C - Ed. Person Makron Books 2004.
[2] ELMASRI, R.; NAVATHE, S., Sistemas de Banco de Dados. Pearson Education do Brasil, 4.Ed
2005.
[3] PINHEIRO, lvaro Farias, Fundamentos de Engenharia de Software: Introduo a Banco de
dados, Volume II, 5 Ed 2015.
[4] MICROSOFT TECHNET, Ajuste do desempenho de consulta. Disponvel em: https://technet.
microsoft.com/en-us/library/ms172984(v=sql.110).aspx . Acessado em: 24/04/2016.
GABARITO
Captulo1
01. Chave primria, chave estrangeira so conceitos importantes na modelagem de dados,
pois implementam restries que garantir ao futuro banco de dados a integridade dos dados.
108
captulo 5
Chave primria:
Atributo ou combinao de atributos que possuem a propriedade de identificar de forma
nica uma linha da tabela.
Chave estrangeira:
A chave estrangeira ocorre quando um atributo de uma relao for chave primria em
outra relao
02. Poderia ser o campo CPF ou o campo RG, pois ambos garantem um atributo nico que
garantem a unicidade do registro.
03. Na terminologia do modelo relacional formal, uma linha chamada tupla, um cabealho
de coluna conhecido como atributo, e a tabela chamada relao. O tipo de dado que descreve os tipos de valores que podem aparecer em cada coluna representado pelo domnio
de valores possveis.
04. Seria necessrio descobrir o CPF do Rubens ou inserir um valor nico de CPF para ele
se quisermos inseri-lo no banco de dados. Uma boa ideia tambm ver se alguns dos CPFs
j existem no banco de dados, para evitar um erro na insero dos registros.
05. Uma tupla uma linha de registro. No faz sentido termos 2 linhas de registros iguais.
Principalmente se existir uma chave primria definida.
Captulo2
01. Sim possvel. Isso conhecido como auto relao, Onde a chave primria de uma
tabela relacionada com uma chave secundria da mesma tabela.
02. SELECT FILHOS.NOME, FILHOS.CPF, PAIS.NOME
FROM PESSOAS FILHOS, PESSOAS PAIS
WHERE PAIS.CPF = FILHOS.CPFPAI
03. SELECT FILHOS.NOME, FILHOS.CPF, PAIS.NOME
FROM PESSOAS FILHOS, PESSOAS PAIS, PESSOAS MAES
WHERE PAIS.CPF = FILHOS.CPFPAI
AND MAES.CPF = FILHOS.CPFMAE
04. SELECT UPPER(SOBRENOME) + , + UPPER(SUBSTRING(NOME,1,1)) + LOWER(SUBSTRING(NOME,2)) AS NOME, REPLACE(REPLACE(CPF,.,),-,) AS CPF
FROM PESSOAS
05. INSERT INTO PESSOAS (NOME, SOBRENOME, CPF, CPFPAI, CPFMAE)
VALUES (Joo,Silva,038.053.186-00,NULL,NULL)
captulo 5
109
06. A primeira soma como os nmeros representados com os pontos decimais, ir retornar
um decimal (resultado = 10.6666).
O segundo, soma nmeros inteiros e ir retornar um inteiro desprezando a parte decimal.
(resultado = 10)
07. SELECT * FROM Orders,
[Order Details],
Products
where [Order Details].OrderID = Orders.OrderID
and Products.ProductID = [Order Details].ProductID
A resposta de qual melhor bastante subjetiva, mas o join feito com where e AND
parece ser mais fcil de entender e contruir.
08. SELECT sum(quantity), ProductName FROM [Order Details], Products where
[Order Details].ProductID = Products.ProductID group by ProductName
having( sum(quantity) > 10)
No podemos usar funes de agregao junto com colunas sem ser especificada a
clusula GROUP BY. Quando colocamos a coluna ProductName junto a uma funo SUM o
SQL no vai conseguir somar e mostrar os diversos nomes de produtos sem que na pesquisa
seja especificado a clusula GROUP BY. Isso quer dizer, que para qualquer coluna desejada
no SELECT (desde que no seja uma funo) ela deve aparecer tambm na clusula GROUP
BY. Alm disso, se a inteno mostrar somente os produtos cujas quantidades so maiores
do que 10 por pedido, na consulta deve estar especificada a clusula HAVING.
09. Essa uma resposta subjetiva. Mas na opinio do Autor, a maior vantagem de se usar
uma view poder esconder dos usurios valores de colunas que contm informaes vitais
para uma empresa. Por exemplo, se existir uma tabela de funcionrios e nela conter as informaes de salrio, o administrador de banco pode criar uma view com apenas informaes
bsicas de funcionrios e restringir o direito de leitura completa para a tabela funcionrio
apenas para alguns usurios da empresa.
10. As consultas em si no contm nenhum erro. Trata-se de uma consulta usando uma subconsultas. Para cada linha de pedido ela traz o nome e o ID do cliente em questo. Ela pode
ser facilmente reescrita fazendo-se o relacionamento entre as tabelas de pedidos (orders) e
clientes (customers) da seguinte forma:
select OrderID, Customers.CustomerID, [CompanyName] from orders, Customers where
Customers.CustomerID = orders.CustomerID.
110
captulo 5
Captulo3
01. No contexto debanco de dados, um ndice uma estrutura (ouarquivo) auxiliar associado a umatabela(ou coleo de dados). Sua funo acelerar o tempo de acesso s linhas
de uma tabela, criando ponteiros para os dados armazenados em colunas especficas. O banco de dados usa o ndice de maneira semelhante ao ndice remissivo de um livro, verifica um
determinado assunto no ndice e depois localiza a sua posio em uma determinada pgina.
02. Referem-se aos conjuntos de um ou mais campos, cujos valores, considerando a combinao de valores em caso de mais de uma chave primria, nunca se repetem na mesma
tabela e, desta forma, podem ser usadas como um ndice de referncia para criar relacionamentos com as demais tabelas do banco de dados.
03. Um ndice secundrio fornece um meio secundrio de acesso a um arquivo para o qual
j existe algum acesso primrio. O ndice secundrio pode ser usado sobre um campo que
uma chave candidata e possui um valor nico em cada registro, ou um campo que no
chave e que possui valores duplicados.
04. Um arquivo pode ter, no mximo, um campo de classificao fsica, portanto, ele s ter
um ndice primrio ou um ndice de cluster, mas no ambos.
05. Chamamos de ndice denso, o ndice que possui uma entrada de ndice para cada registro no arquivo de dados. Um ndice esparso, no entanto, tem entradas de ndice para somente
alguns valores de pesquisa.
Captulo4
01. Em um tpico sistema de banco de dados, vrios usurios esto fazendo acesso ao banco ao mesmo tempo. Vrios aplicativos podem estar acessando os mesmos dados a cada
instante. Desse modo, no incomum que atualizaes, inseres e delees de registros
estejam ocorrendo ao mesmo tempo. Dessa forma, um controle ao acesso aos dados essencial para manter a integridade dos dados.
02. No, pois est ocorrendo apenas uma consulta a dados sem alterao de contedo.
03. Sim, j que est ocorrendo uma alterao de dados, outros usurios podem estar acessando o registro. Ento, para garantir a operao de update, faz-se necessrio o controle
da transao.
04. D.
05. Sim, em alguns sistemas de banco de dados (Oracle por exemplo) possvel criar pontos de controle usando o comando SAVEPOINT.
captulo 5
111
Captulo5
01.
a) Se ordenaes pelo campo NOME forem constantes seria interessante criar um ndice
para essa tabela a partir desse campo. Isso agilizaria a consulta, pois com um ndice
ordenado a ordenao do resultado seria mais rpido.
b) Se o campo CPF for uma chave primria, nada precisaria ser feito, j que as chaves
primrias geram ndices ideais para serem usados em pesquisas WHERE.
02. Podemos usar o plano de execuo para ver como uma consulta organizada. Testando vrias consultas e analisando os planos de execuo poderemos optar pela consulta com
o melhor plano de execuo.
03. Sim. Essa a tpica criao de um ndice clustering para uma coluna bastante acessada
em pesquisas que otimizar a performance das pesquisas quando fizer referncia a esse
conjunto de dados.
04.
a) Custo de acesso ao armazenamento secundrio;
b) Custo de armazenamento;
c) Custo de computao;
d) Custo do uso de memria;
e) Custo de comunicao
05. Na otimizao heurstica, algumas regras so aplicadas para melhorar o desempenho
da execuo e da transformao das consultas em diversas expresses equivalentes. As
regras so:
Executar operaes de SELEO e PROJEO primeiramente;
A JUNO s deve ser realizada depois da SELEO e PROJEO;
Somente os atributos solicitados para o resultado da consulta e os que realmente so
necessrios em consultas subsequentes que devem ser projetados;
Evitar gerao de mltiplas tabelas intermedirias;
Pesquisar as subexpresses comuns e process-las somente uma vez;
A utilizao dessas regras heursticas influencia no plano de execuo da consulta, pois
uma ordem de execuo das operaes determinada e tambm quais os recursos sero
utilizados no plano, por exemplo, os ndices.
112
captulo 5