Professional Documents
Culture Documents
Disciplina: Banco de Dados II Aula 1: Reviso SQL Bsico Turma: 6 Prof. Silvio Bendini
1
Prof. Silvio Bendini Banco de Dados II Aula 1
Introduo SQL
3
Prof. Silvio Bendini Banco de Dados II Aula 1
4
Prof. Silvio Bendini Banco de Dados II Aula 1
A Linguagem SQL
SQL - Structured Query Language, ou Linguagem de Consulta Estruturada, uma linguagem de pesquisa declarativa para banco de dados relacional (base de dados relacional). Muitas das caractersticas originais do SQL foram inspiradas na lgebra relacional. O SQL foi desenvolvido originalmente no incio dos anos 70 nos laboratrios da IBM em San Jose, dentro do projeto System R, que tinha por objetivo demonstrar a viabilidade da implementao do modelo relacional proposto por E. F. Codd. O nome original da linguagem era SEQUEL, acrnimo para "Structured English Query Language" (Linguagem de Consulta Estruturada em Ingls), vindo da o fato de at hoje a sigla em ingls ser comumente pronunciada "squel" ao invs de "ski-l", letra a letra.
5
Prof. Silvio Bendini Banco de Dados II Aula 1
A Linguagem SQL
No entanto, em portugus, a pronncia mais corrente a letra a letra: "esse-qu-ele". A linguagem SQL um grande padro de banco de dados. Isto decorre da sua simplicidade e facilidade de uso. Ela se diferencia de outras linguagens de consulta a banco de dados no sentido em que uma consulta SQL especifica a forma do resultado e no o caminho para chegar a ele. Ela um linguagem declarativa em oposio a outras linguagens procedurais. Isto reduz o ciclo de aprendizado daqueles que se iniciam na linguagem.
6
Prof. Silvio Bendini Banco de Dados II Aula 1
A Linguagem SQL
Embora o SQL tenha sido originalmente criado pela IBM, rapidamente surgiram vrios dialetos desenvolvidos por outros desenvolvedores. Essa expanso levou necessidade de criao e adaptao de um padro para a linguagem. Esta tarefa foi realizada pela American National Standards Institute (ANSI) em 1986 e ISO em 1987. O SQL foi revisto em 1992 e a esta verso foi dado o nome de SQL-92. Foi revisto novamente em 1999 e 2003 para se tornar SQL:1999 (SQL3) e SQL:2003, respectivamente. Novas caractersticas, como utilizao de java, framework SQL, dados espaciais e data mining foram includas nas verses SQL:2008 e SQL:2011.
7
Prof. Silvio Bendini Banco de Dados II Aula 1
A Linguagem SQL
O SQL:1999 usa expresses regulares de emparelhamento, queries recursivas e gatilhos (triggers). Tambm foi feita uma adio controversa de tipos noescalados e algumas caractersticas de orientao a objeto. O SQL:2003 introduz caractersticas relacionadas ao XML, sequencias padronizadas e colunas com valores de auto incremento (inclusive colunas-identidade). O SQL, embora padronizado pela ANSI e ISO, possui muitas variaes e extenses produzidas pelos diferentes fabricantes de sistemas gerenciadores de bases de dados. Tipicamente a linguagem pode ser migrada de plataforma para plataforma sem mudanas estruturais importantes.
8
Prof. Silvio Bendini Banco de Dados II Aula 1
A Linguagem SQL
Outra aproximao permitir para cdigo de idioma procedural ser embutido e interagir com o banco de dados. Por exemplo, o Oracle e outros SGBDs incluem Java na base de dados, enquanto o PostgreSQL permite que funes sejam escritas em Perl, TCL ou C, entre outras linguagens.
9
Prof. Silvio Bendini Banco de Dados II Aula 1
11
Prof. Silvio Bendini Banco de Dados II Aula 1
12
Prof. Silvio Bendini Banco de Dados II Aula 1
15
Prof. Silvio Bendini Banco de Dados II Aula 1
16
Prof. Silvio Bendini Banco de Dados II Aula 1
17
Prof. Silvio Bendini Banco de Dados II Aula 1
18
Prof. Silvio Bendini Banco de Dados II Aula 1
19
Prof. Silvio Bendini Banco de Dados II Aula 1
20
Prof. Silvio Bendini Banco de Dados II Aula 1
SQL Estrutura Lxica - Constantes cadeia de caracteres ocupando mais de uma linha
Este exemplo tem por finalidade mostrar a utilizao de uma constante cadeia de caracteres ocupando mais de uma linha para inserir dados em uma tabela. No Oracle e no DB2 h necessidade do operador de concatenao ||, enquanto no SQL Server h necessidade do operador de concatenao +. S no houve necessidade do operador de concatenao no PostgreSQL. Em todos os exemplos a tabela acao foi definida como uma tabela temporria, utilizando a sintaxe especfica do gerenciador de banco de dados.
21
Prof. Silvio Bendini Banco de Dados II Aula 1
SQL Estrutura Lxica - Constantes cadeia de caracteres ocupando mais de uma linha
PostgreSQL:
CREATE TEMPORARY TABLE acao (cod_acao int, nome_acao text); INSERT INTO acao (cod_acao, nome_acao) VALUES (1, um nome de acao muito longo); SELECT * FROM acao; cod_acao | nome_acao --------------------------------------------1 | um nome de acao muito longo
22
Prof. Silvio Bendini Banco de Dados II Aula 1
SQL Estrutura Lxica - Constantes cadeia de caracteres ocupando mais de uma linha
SQL SERVER 2000:
CREATE TABLE acao (cod_acao int, nome_acao text); INSERT INTO acao (cod_acao, nome_acao) VALUES (1, um nome + de acao + muito longo); SELECT * FROM acao; cod_acao | nome_acao --------------------------------------------1 | um nome de acao muito longo
23
Prof. Silvio Bendini Banco de Dados II Aula 1
SQL Estrutura Lxica - Constantes cadeia de caracteres ocupando mais de uma linha
ORACLE 10g:
CREATE GLOBAL TEMPORARY TABLE acao (cod_acao int, nome_acao varchar2(32)); INSERT INTO acao (cod_acao, nome_acao) VALUES (1, um nome || de acao || muito longo); SELECT * FROM acao; cod_acao | nome_acao --------------------------------------------1 | um nome de acao muito longo
24
Prof. Silvio Bendini Banco de Dados II Aula 1
SQL Estrutura Lxica - Constantes cadeia de caracteres ocupando mais de uma linha
DB2 9.7:
DECLARE GLOBAL TEMPORARY TABLE acao (cod_acao int, nome_acao varchar(32)) ON COMMIT PRESERVE ROWS; INSERT INTO SESSION.acao (cod_acao, nome_acao) VALUES (1, um nome || de acao || muito longo); SELECT * FROM SESSION.acao; cod_acao | nome_acao --------------------------------------------1 | um nome de acao muito longo
25
Prof. Silvio Bendini Banco de Dados II Aula 1
26
Prof. Silvio Bendini Banco de Dados II Aula 1
27
Prof. Silvio Bendini Banco de Dados II Aula 1
28
Prof. Silvio Bendini Banco de Dados II Aula 1
29
Prof. Silvio Bendini Banco de Dados II Aula 1
um
O texto da constante cadeia de caracteres passado para a rotina de converso da entrada para o tipo chamado tipo. O resultado uma constante do tipo indicado. A converso explcita de tipo pode ser omitida caso no haja ambiguidade com relao ao tipo que a constante deva ter (por exemplo, quando atribuda diretamente para uma coluna de uma tabela), neste caso convertida automaticamente.
30
Prof. Silvio Bendini Banco de Dados II Aula 1
mas nem todos os nomes de tipo podem ser usados desta forma; As sintaxes ::, CAST() e chamada de funo tambm podem ser utilizadas para especificar a converso de tipo em tempo de execuo para expresses arbitrrias. Porm, a forma tipo 'cadeia de caracteres' somente pode ser utilizada para especificar o tipo de uma constante literal. Outra restrio com relao sintaxe tipo 'cadeia de caracteres', que no funciona em tipo matriz (arrays); deve ser usado :: ou CAST() para especificar o tipo de uma constante matriz.
31
Prof. Silvio Bendini Banco de Dados II Aula 1
Entretanto, existem algumas poucas restries para os nomes de operadores: No podem ocorrer as sequncias -- e /* em nenhuma posio no nome do operador, porque so consideradas incio de comentrio. Um nome de operador com vrios caracteres no pode terminar por + ou por -, a no ser que o nome tambm contenha ao menos um dos seguintes caracteres:
~ ! @ # % ^ & | ` ?
Por exemplo, @- um nome de operador permitido, mas *- no . Esta restrio permite ao SGBD analisar comandos em conformidade com o padro SQL sem requerer espaos entre os smbolos.
32
Prof. Silvio Bendini Banco de Dados II Aula 1
33
Prof. Silvio Bendini Banco de Dados II Aula 1
34
Prof. Silvio Bendini Banco de Dados II Aula 1
36
Prof. Silvio Bendini Banco de Dados II Aula 1
37
Prof. Silvio Bendini Banco de Dados II Aula 1
39
Prof. Silvio Bendini Banco de Dados II Aula 1
esquerda
40
Prof. Silvio Bendini Banco de Dados II Aula 1
41
Prof. Silvio Bendini Banco de Dados II Aula 1
42
Prof. Silvio Bendini Banco de Dados II Aula 1
43
Prof. Silvio Bendini Banco de Dados II Aula 1
44
Prof. Silvio Bendini Banco de Dados II Aula 1
Neste caso, $1 ser substitudo pelo primeiro argumento da funo quando esta for chamada.
47
Prof. Silvio Bendini Banco de Dados II Aula 1
SQL ndices
Se uma expresso produzir um valor do tipo matriz, ento um elemento especfico do valor matricial pode ser extrado escrevendo: expresso[ndice] e vrios elementos adjacentes (uma "fatia da matriz") pode ser extrada escrevendo: expresso[ndice_inferior:ndice_superior] (Neste caso, os colchetes [ ] devem aparecer literalmente). Cada ndice por si s uma expresso, que deve produzir um valor inteiro.
48
Prof. Silvio Bendini Banco de Dados II Aula 1
SQL ndices
Geralmente a expresso matricial deve estar entre parnteses, mas os parnteses podem ser omitidos quando a expresso a ser indexada apenas a referncia a uma coluna ou um parmetro posicional. Podem ser concatenados vrios ndices quando a matriz original for multidimensional. Por exemplo:
minha_tabela.matriz_coluna[4] minha_tabela.matriz_duas_dim[17][34] $1[10:42] (funcao_matriz(a,b))[42]
49
Prof. Silvio Bendini Banco de Dados II Aula 1
(Portanto, uma referncia a coluna qualificada , na verdade, apenas um caso especial da sintaxe de seleo de campo).
50
Prof. Silvio Bendini Banco de Dados II Aula 1
51
Prof. Silvio Bendini Banco de Dados II Aula 1
52
Prof. Silvio Bendini Banco de Dados II Aula 1
53
Prof. Silvio Bendini Banco de Dados II Aula 1
54
Prof. Silvio Bendini Banco de Dados II Aula 1
55
Prof. Silvio Bendini Banco de Dados II Aula 1
56
Prof. Silvio Bendini Banco de Dados II Aula 1
57
Prof. Silvio Bendini Banco de Dados II Aula 1
58
Prof. Silvio Bendini Banco de Dados II Aula 1
59
Prof. Silvio Bendini Banco de Dados II Aula 1
60
Prof. Silvio Bendini Banco de Dados II Aula 1
O tipo de dado do elemento da matriz o tipo comum das expresses membro, determinado utilizando as mesmas regras das construes UNION e CASE.
61
Prof. Silvio Bendini Banco de Dados II Aula 1
62
Prof. Silvio Bendini Banco de Dados II Aula 1
63
Prof. Silvio Bendini Banco de Dados II Aula 1
64
Prof. Silvio Bendini Banco de Dados II Aula 1
65
Prof. Silvio Bendini Banco de Dados II Aula 1
66
Prof. Silvio Bendini Banco de Dados II Aula 1
68
Prof. Silvio Bendini Banco de Dados II Aula 1
69
Prof. Silvio Bendini Banco de Dados II Aula 1
72
Prof. Silvio Bendini Banco de Dados II Aula 1
74
Prof. Silvio Bendini Banco de Dados II Aula 1
75
Prof. Silvio Bendini Banco de Dados II Aula 1
DDL Restries
Os tipos de dado so uma forma de limitar os dados que podem ser armazenados na tabela. Entretanto, para muitos aplicativos a restrio obtida no possui o refinamento necessrio. Por exemplo, uma coluna contendo preos de produtos provavelmente s pode aceitar valores positivos, mas no existe nenhum tipo de dado que aceite apenas nmeros positivos. Um outro problema que pode ser necessrio restringir os dados de uma coluna com relao a outras colunas ou linhas. Por exemplo, em uma tabela contendo informaes sobre produtos deve haver apenas uma linha para cada cdigo de produto. Para esta finalidade, a linguagem SQL permite definir restries em colunas e tabelas. As restries permitem o nvel de controle sobre os dados da tabela que for desejado. Se o usurio tentar armazenar dados em uma coluna da tabela violando a restrio, ocorrer um erro. Isto se aplica at quando o erro originado pela definio do valor padro.
79
Prof. Silvio Bendini Banco de Dados II Aula 1
80
Prof. Silvio Bendini Banco de Dados II Aula 1
chk_preco_positivo
Portanto, para especificar o nome da restrio deve ser utilizada a palavra chave CONSTRAINT, seguida por um identificador, seguido por sua vez pela definio da restrio (Se no for escolhido o nome da restrio desta maneira, o sistema escolher um nome para a restrio).
82
Prof. Silvio Bendini Banco de Dados II Aula 1
83
Prof. Silvio Bendini Banco de Dados II Aula 1
84
Prof. Silvio Bendini Banco de Dados II Aula 1
85
Prof. Silvio Bendini Banco de Dados II Aula 1
87
Prof. Silvio Bendini Banco de Dados II Aula 1
88
Prof. Silvio Bendini Banco de Dados II Aula 1
89
Prof. Silvio Bendini Banco de Dados II Aula 1
90
Prof. Silvio Bendini Banco de Dados II Aula 1
91
Prof. Silvio Bendini Banco de Dados II Aula 1
92
Prof. Silvio Bendini Banco de Dados II Aula 1
CONSTRAINT
96
Prof. Silvio Bendini Banco de Dados II Aula 1
97
Prof. Silvio Bendini Banco de Dados II Aula 1
98
Prof. Silvio Bendini Banco de Dados II Aula 1
100
Prof. Silvio Bendini Banco de Dados II Aula 1
101
Prof. Silvio Bendini Banco de Dados II Aula 1
102
Prof. Silvio Bendini Banco de Dados II Aula 1
porque, na ausncia da lista de colunas, a chave primria da tabela referenciada usada como a coluna referenciada.
103
Prof. Silvio Bendini Banco de Dados II Aula 1
Obviamente, o nmero e tipo das colunas na restrio devem corresponder ao nmero e tipo das colunas referenciadas. Pode ser atribudo um nome restrio de chave estrangeira da forma habitual.
104
Prof. Silvio Bendini Banco de Dados II Aula 1
105
Prof. Silvio Bendini Banco de Dados II Aula 1
107
Prof. Silvio Bendini Banco de Dados II Aula 1
108
Prof. Silvio Bendini Banco de Dados II Aula 1
109
Prof. Silvio Bendini Banco de Dados II Aula 1
110
Prof. Silvio Bendini Banco de Dados II Aula 1
111
Prof. Silvio Bendini Banco de Dados II Aula 1
Inicialmente a nova coluna preenchida com o valor padro especificado, ou nulo se a clusula DEFAULT no for especificada. Tambm podem ser definidas, ao mesmo tempo, restries para a coluna utilizando a sintaxe habitual:
ALTER TABLE produtos ADD CHECK (descricao <> ''); COLUMN descricao text
113
Prof. Silvio Bendini Banco de Dados II Aula 1
114
Prof. Silvio Bendini Banco de Dados II Aula 1
Os dados presentes na coluna desaparecem. As restries de tabela que envolvem a coluna tambm so removidas. Entretanto, se a coluna for referenciada por uma restrio de chave estrangeira de outra tabela, o SGBD no ir remover esta restrio em silncio. Pode ser autorizada a remoo de tudo que depende da coluna adicionando CASCADE:
ALTER TABLE CASCADE; produtos DROP COLUMN descricao 115
Prof. Silvio Bendini Banco de Dados II Aula 1
116
Prof. Silvio Bendini Banco de Dados II Aula 1
A restrio ser verificada imediatamente, portanto os dados da tabela devem satisfazer a restrio para esta poder ser adicionada.
117
Prof. Silvio Bendini Banco de Dados II Aula 1
(Caso esteja lidando com um nome de restrio gerado, como $2, no se esquea de colocar entre aspas para torn-lo um identificador vlido).
118
Prof. Silvio Bendini Banco de Dados II Aula 1
119
Prof. Silvio Bendini Banco de Dados II Aula 1
Deve ser observado que este comando no afeta nenhuma coluna existente na tabela, apenas muda o valor padro para os prximos comandos INSERT. Para remover o valor padro para a coluna, utiliza-se:
ALTER TABLE DEFAULT; produtos ALTER COLUMN preco DROP
Efetivamente o mesmo que definir o valor nulo como sendo o valor padro. Como consequncia, no errado remover um valor padro que no tenha sido definido, porque implicitamente o valor nulo o valor padro.
120
Prof. Silvio Bendini Banco de Dados II Aula 1
Este comando somente ser bem-sucedido se todas as entradas existentes na coluna puderem ser convertidas para o novo tipo atravs de uma converso implcita. Se for necessria uma converso mais complexa, poder ser adicionada a clusula USING especificando como calcular os novos valores a partir dos antigos. O SGBD tenta converter o valor padro da coluna (se houver) para o novo tipo, assim bem como todas as restries que envolvem a coluna. Mas estas converses podem falhar, ou podem produzir resultados surpreendentes. Geralmente melhor remover todas as restries da coluna antes de alterar o seu tipo, e depois adicionar novamente estas restries modificadas de forma apropriada.
121
Prof. Silvio Bendini Banco de Dados II Aula 1
122
Prof. Silvio Bendini Banco de Dados II Aula 1
123
Prof. Silvio Bendini Banco de Dados II Aula 1
124
Prof. Silvio Bendini Banco de Dados II Aula 1
125
Prof. Silvio Bendini Banco de Dados II Aula 1
126
Prof. Silvio Bendini Banco de Dados II Aula 1
e todos os objetos dependentes sero removidos. Neste caso no ser removida a tabela pedidos, ser removida apenas a restrio de chave estrangeira (caso se deseje verificar o que DROP ... CASCADE far, deve ser executado o comando DROP sem o CASCADE, e lidas as NOTAs, ou NOTICE em ingls).
127
Prof. Silvio Bendini Banco de Dados II Aula 1
129
Prof. Silvio Bendini Banco de Dados II Aula 1
131
Prof. Silvio Bendini Banco de Dados II Aula 1
133
Prof. Silvio Bendini Banco de Dados II Aula 1
135
Prof. Silvio Bendini Banco de Dados II Aula 1
Este comando pode atualizar nenhuma, uma, ou muitas linhas. No errado tentar uma atualizao que no corresponda a nenhuma linha. Vejamos este comando em detalhe: Primeiro aparece a palavra chave UPDATE seguida pelo nome da tabela. Como usual, o nome da tabela pode ser qualificado pelo esquema, seno procurado no caminho. Depois aparece a palavra chave SET, seguida pelo nome da coluna, por um sinal de igual, e pelo novo valor da coluna. O novo valor da coluna pode ser qualquer expresso escalar, e no apenas uma constante.
136
Prof. Silvio Bendini Banco de Dados II Aula 1
Como pode ser visto, a expresso para obter o novo valor pode fazer referncia ao valor antigo. Tambm foi deixada de fora a clusula WHERE. Quando esta clusula omitida, significa que todas as linhas da tabela sero atualizadas e, quando est presente, somente as linhas que atendem condio desta clusula sero atualizadas. Deve ser observado que o sinal de igual na clusula SET uma atribuio, enquanto o sinal de igual na clusula WHERE uma comparao, mas isto no cria uma ambiguidade. Obviamente, a condio da clusula WHERE no necessariamente um teste de igualdade, esto disponveis vrios outros operadores, mas a expresso deve produzir um resultado booleano.
137
Prof. Silvio Bendini Banco de Dados II Aula 1
138
Prof. Silvio Bendini Banco de Dados II Aula 1
139
Prof. Silvio Bendini Banco de Dados II Aula 1
ento todas as linhas da tabela sero excludas! Cuidado! Isso pode salvar (ou acabar...) com a sua vida profissional...
140
Prof. Silvio Bendini Banco de Dados II Aula 1
Consultas
Os captulos anteriores explicaram como criar tabelas, como preench-las com dados, e como manipular estes dados. Agora, finalmente, mostrado como trazer estes dados para fora do banco de dados.
141
Prof. Silvio Bendini Banco de Dados II Aula 1
As prximas sees descrevem em detalhes a lista de seleo, a expresso de tabela, e a especificao da ordenao. O tipo mais simples de consulta possui a forma:
SELECT * FROM tabela1; 142
Prof. Silvio Bendini Banco de Dados II Aula 1
143
Prof. Silvio Bendini Banco de Dados II Aula 1
(Supondo que b e c possuem um tipo de dado numrico). FROM tabela1 um tipo particularmente simples de expresso de tabela: l apenas uma nica tabela. De uma forma geral, as expresses de tabela podem ser construes complexas contendo tabelas base, junes e subconsultas.
144
Prof. Silvio Bendini Banco de Dados II Aula 1
mais til quando as expresses da lista de seleo retornam resultados variveis. Por exemplo, uma funo pode ser chamada deste modo:
SELECT random();
145
Prof. Silvio Bendini Banco de Dados II Aula 1
146
Prof. Silvio Bendini Banco de Dados II Aula 1
Uma referncia a tabela pode ser um nome de tabela (possivelmente qualificado pelo esquema) ou uma tabela derivada, como uma subconsulta, uma juno de tabelas ou, ainda, uma combinao complexa destas. Se for listada mais de uma referncia a tabela na clusula FROM, feita uma juno cruzada (cross-join) para formar a tabela virtual intermediria que poder, ento, estar sujeita s transformaes das clusulas WHERE, GROUP BY e HAVING, gerando o resultado final de toda a expresso de tabela. Quando uma referncia a tabela especifica uma tabela ancestral em uma hierarquia de herana de tabelas, a referncia a tabela no produz linhas apenas desta tabela, mas inclui as linhas de todas as tabelas descendentes, a no ser que a palavra chave ONLY preceda o nome da tabela. Entretanto, esta referncia produz apenas as colunas existentes na tabela especificada so ignoradas todas as colunas adicionadas s tabelas descendentes.
147
Prof. Silvio Bendini Banco de Dados II Aula 1
O alias se torna o novo nome da referncia tabela na consulta corrente no mais possvel fazer referncia tabela pelo seu nome original.
149
Prof. Silvio Bendini Banco de Dados II Aula 1
no uma sintaxe SQL vlida. O que acontece de verdade que uma referncia a tabela implcita adicionada clusula FROM. Portanto, a consulta processada como se tivesse sido escrita assim:
SELECT * FROM minha_tabela AS m, minha_tabela AS minha_tabela WHERE minha_tabela.a > 5;
150
Prof. Silvio Bendini Banco de Dados II Aula 1
Alm disso, um alis requerido se a referncia a tabela for uma subconsulta. Os parnteses so utilizados para resolver ambiguidades.
151
Prof. Silvio Bendini Banco de Dados II Aula 1
Uma outra forma de alis de tabela especifica nomes temporrios para as colunas da tabela, assim como para a mesma:
FROM referncia_a_tabela [AS] alias ( coluna1 [, coluna2 [, ...]] )
Se for especificado um nmero de aliases de coluna menor que o nmero de colunas da tabela, as demais colunas no tero o nome mudado. Esta sintaxe especialmente til em autojunes e subconsultas.
152
Prof. Silvio Bendini Banco de Dados II Aula 1
153
Prof. Silvio Bendini Banco de Dados II Aula 1
Consultas Subconsultas
Subconsultas especificando uma tabela derivada devem estar entre parnteses, e devem ter um nome de alis de tabela atribudo. Por exemplo:
FROM (SELECT * FROM tabela1) AS nome_alias
Este exemplo equivale a FROM tabela1 AS nome_alias. Casos mais interessantes, que no podem ser reduzidos a junes simples, ocorrem quando a subconsulta envolve agrupamento ou agregao.
154
Prof. Silvio Bendini Banco de Dados II Aula 1
onde a condio_de_pesquisa qualquer expresso de valor que retorne um valor do tipo boolean. Aps o processamento da clusula FROM ter sido feito, cada linha da tabela virtual derivada verificada com relao condio de pesquisa. Se o resultado da condio for verdade, a linha mantida na tabela de sada, seno (ou seja, se o resultado for falso ou nulo) a linha desprezada. Normalmente a condio de pesquisa faz referncia a pelo menos uma coluna da tabela gerada pela clusula FROM; embora isto no seja requerido, se no for assim a clusula WHERE no ter utilidade.
155
Prof. Silvio Bendini Banco de Dados II Aula 1
E
FROM a INNER JOIN b ON (a.id = b.id) WHERE b.val > 5 OU TALVEZ AT MESMO FROM a NATURAL JOIN b WHERE b.val > 5
156
Prof. Silvio Bendini Banco de Dados II Aula 1
158
Prof. Silvio Bendini Banco de Dados II Aula 1
159
Prof. Silvio Bendini Banco de Dados II Aula 1
[,
160
Prof. Silvio Bendini Banco de Dados II Aula 1
161
Prof. Silvio Bendini Banco de Dados II Aula 1
162
Prof. Silvio Bendini Banco de Dados II Aula 1
163
Prof. Silvio Bendini Banco de Dados II Aula 1
Aqui sum() a funo de agregao que calcula um valor nico para o grupo todo.
164
Prof. Silvio Bendini Banco de Dados II Aula 1
166
Prof. Silvio Bendini Banco de Dados II Aula 1
168
Prof. Silvio Bendini Banco de Dados II Aula 1
No exemplo acima, a clusula WHERE est selecionando linhas por uma coluna que no agrupada (a expresso somente verdadeira para as vendas feitas nas quatro ltimas semanas, enquanto a clusula HAVING restringe a sada aos grupos com um total de vendas brutas acima de 5000. Deve ser observado que as expresses de agregao no precisam ser necessariamente as mesmas em todas as partes da consulta.
169
Prof. Silvio Bendini Banco de Dados II Aula 1
170
Prof. Silvio Bendini Banco de Dados II Aula 1
171
Prof. Silvio Bendini Banco de Dados II Aula 1
172
Prof. Silvio Bendini Banco de Dados II Aula 1
173
Prof. Silvio Bendini Banco de Dados II Aula 1
174
Prof. Silvio Bendini Banco de Dados II Aula 1
176
Prof. Silvio Bendini Banco de Dados II Aula 1
Desta forma, foi mostrado em uma linha o mesmo resultado da coluna quantidade do exemplo anterior.
177
Prof. Silvio Bendini Banco de Dados II Aula 1
178
Prof. Silvio Bendini Banco de Dados II Aula 1
179
Prof. Silvio Bendini Banco de Dados II Aula 1
180
Prof. Silvio Bendini Banco de Dados II Aula 1
Os nomes das colunas a, b e c podem ser os nomes verdadeiros das colunas das tabelas referenciadas na clusula FROM, ou aliases dados a estas colunas. O espao de nomes disponvel na lista de seleo o mesmo da clusula WHERE, a no ser que seja utilizado agrupamento e, neste caso, passa a ser o mesmo da clusula HAVING.
181
Prof. Silvio Bendini Banco de Dados II Aula 1
Ao se trabalhar com vrias tabelas, tambm pode ser til solicitar todas as colunas de uma determinada tabela:
SELECT tbl1.*, tbl2.a FROM ...
Se for utilizada uma expresso de valor arbitrria na lista de seleo, esta expresso adiciona, conceitualmente, uma nova coluna virtual tabela retornada. A expresso de valor avaliada uma vez para cada linha do resultado, com os valores da linha substitudos nas referncias a coluna. Porm, as expresses da lista de seleo no precisam referenciar nenhuma coluna da expresso de tabela da clusula FROM; podem ser, inclusive, expresses aritmticas constantes, por exemplo.
182
Prof. Silvio Bendini Banco de Dados II Aula 1
Rtulos de coluna
Podem ser atribudos nomes para as entradas da lista de seleo para processamento posterior. Neste caso, "processamento posterior" uma especificao opcional de classificao e o aplicativo cliente (por exemplo, os ttulos das colunas para exibio). Por exemplo:
SELECT a AS valor, b + c AS soma FROM ...
Se nenhum nome de coluna de sada for especificado utilizando AS, o sistema atribui um nome padro.
183
Prof. Silvio Bendini Banco de Dados II Aula 1
Rtulos de coluna
Para referncias a colunas simples, o nome da coluna referenciada. Para chamadas de funo, o nome da funo. Para expresses complexas o sistema gera um nome genrico. Nota: Aqui, o nome dado coluna de sada diferente do nome dado na clusula FROM. Na verdade, este processo permite mudar o nome da mesma coluna duas vezes, mas o nome escolhido na lista de seleo o passado adiante.
184
Prof. Silvio Bendini Banco de Dados II Aula 1
Distinct
Aps a lista de seleo ser processada, a tabela resultante pode opcionalmente estar sujeita remoo das linhas duplicadas. A palavra chave DISTINCT deve ser escrita logo aps o SELECT para especificar esta funcionalidade:
SELECT DISTINCT lista_de_seleo ...
(Em vez de DISTINCT pode ser utilizada a palavra ALL para especificar o comportamento padro de manter todas as linhas)
185
Prof. Silvio Bendini Banco de Dados II Aula 1
Distinct
Como bvio, duas linhas so consideradas distintas quando tm pelo menos uma coluna diferente. Os valores nulos so considerados iguais nesta comparao. Como alternativa, uma expresso arbitrria pode determinar quais linhas devem ser consideradas distintas:
SELECT DISTINCT ON lista_de_seleo ... (expresso [, expresso ...])
Neste caso, expresso uma expresso de valor arbitrria avaliada para todas as linhas.
186
Prof. Silvio Bendini Banco de Dados II Aula 1
Distinct
Um conjunto de linhas para as quais todas as expresses so iguais so consideradas duplicadas, e somente a primeira linha do conjunto mantida na sada. Deve ser observado que a "primeira linha" de um conjunto imprevisvel, a no ser que a consulta seja ordenada por um nmero suficiente de colunas para garantir a ordem nica das linhas que chegam no filtro DISTINCT (o processamento de DISTINCT ON ocorre aps a ordenao do ORDER BY). A clusula DISTINCT ON no faz parte do padro SQL, sendo algumas vezes considerada um estilo ruim devido natureza potencialmente indeterminada de seus resultados. Utilizando-se adequadamente GROUP BY e subconsultas no FROM esta construo pode ser evitada, mas geralmente a alternativa mais fcil.
187
Prof. Silvio Bendini Banco de Dados II Aula 1
Ordenao de linhas
Aps a consulta ter produzido a tabela de sada (aps a lista de seleo ter sido processada) esta tabela pode, opcionalmente, ser ordenada. Se nenhuma ordenao for especificada, as linhas retornam em uma ordem aleatria. Neste caso, a ordem real depende dos tipos de plano de varredura e de juno e da ordem no disco, mas no se deve confiar nisto. Uma ordem de sada especfica somente pode ser garantida se a etapa de ordenao for especificada explicitamente.
188
Prof. Silvio Bendini Banco de Dados II Aula 1
Ordenao de linhas
A clusula ORDER BY especifica a ordem de classificao:
SELECT lista_de_seleo FROM expresso_de_tabela ORDER BY coluna1 [ASC | DESC] [, coluna2 [ASC | DESC] ...]
onde coluna1, etc., fazem referncia s colunas da lista de seleo. Pode ser tanto o nome de sada da coluna quanto o nmero da coluna.
189
Prof. Silvio Bendini Banco de Dados II Aula 1
Ordenao de linhas
Alguns exemplos:
SELECT a, b FROM tabela1 ORDER BY a; SELECT a + b AS soma, c FROM tabela1 ORDER BY soma; SELECT a, sum(b) FROM tabela1 GROUP BY a ORDER BY 1;
Como extenso ao padro SQL, tambm permite ordenar por expresses arbitrrias:
SELECT a, b FROM tabela1 ORDER BY a + b;
Tambm permitido fazer referncia a nomes de colunas da clusula FROM que no esto presentes na lista de seleo:
SELECT a FROM tabela1 ORDER BY b; 190
Prof. Silvio Bendini Banco de Dados II Aula 1
Ordenao de linhas
Cada especificao de coluna pode ser seguida pela palavra opcional ASC ou DESC, para definir a direo de ordenao como ascendente ou descendente. A ordem ASC o padro. A ordenao ascendente coloca os valores menores na frente, sendo que "menor" definido nos termos do operador <. De forma semelhante, a ordenao descendente determinada pelo operador >. Se for especificada a ordenao por mais de uma coluna, as ltimas entradas so utilizadas para ordenar as linhas iguais sob a ordem imposta pelas colunas de ordenao anteriores.
191
Prof. Silvio Bendini Banco de Dados II Aula 1
Introduo SQL
Lembrem-se que o intuito deste material no o de esgotar o assunto SQL. A pesquisa constante, testes, medies e readequao fazem parte da implementao de instrues eficientes e que atendam os requisitos de negcio. Continuem estudando e pesquisando sempre. Prof. Silvio
192
Prof. Silvio Bendini Banco de Dados II Aula 1