Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
mecnico, sem a permisso expressa por escrito da Domnio Sistemas Ltda. Nesse caso,
somente a Domnio Sistemas poder ter patentes ou pedidos de patentes, marcas comerciais,
direitos autorais ou outros de propriedade intelectual, relacionados aos assuntos tratados nesse
documento. Alm disso, o fornecimento desse documento no lhe concede licena sobre tais
patentes, marcas comerciais, direitos autorais ou outros de propriedade intelectual; exceto nos
termos expressamente estipulados em contrato de licena da Domnio Sistemas.
importante lembrar que as empresas, os nomes de pessoas e os dados aqui
mencionados so fictcios; salvo indicao contrria.
Voc tambm dispe do seguinte formulrio para enviar-nos suas notaes. Basta
destacar essa folha, relatar sua sugesto e/ou reclamao e remeter ao seguinte endereo:
___________________________________________________________________________
___________________________________________________________________________
___________________________________________________________________________
___________________________________________________________________________
___________________________________________________________________________
___________________________________________________________________________
___________________________________________________________________________
___________________________________________________________________________
___________________________________________________________________________
___________________________________________________________________________
___________________________________________________________________________
___________________________________________________________________________
ndice
SELECT *
FROM funcionarios
A fonte Arial em Itlico utilizada para definir os nomes dos sistemas da Domnio,
bem como marcas registradas citadas nesse material, por exemplo:
Este treinamento direcionado aos usurios dos sistemas da Domnio Sistemas que
no tm conhecimento em SQL, sendo que as informaes de SQL obtidas durante o curso
so voltadas s necessidades do Gerador de Relatrio.
O cone abaixo, voc encontrar nos resultados de comandos aplicados no ISQL, para
a conferncia dos mesmos, por exemplo:
9
Centro de Treinamento Domnio Construindo uma marca forte.
10
Centro de Treinamento Domnio Construindo uma marca forte.
Descrio
Pblico Alvo
Este treinamento direcionado aos usurios dos sistemas da Domnio Sistemas, que
no tm conhecimento em SQL, sendo que as informaes de SQL obtidas durante o curso
so voltadas s necessidades do Gerador de Relatrios.
Pr-requisitos
Objetivos
11
Centro de Treinamento Domnio Construindo uma marca forte.
1. Conceitos Bsicos
1.1. Introduo
Neste mdulo daremos uma viso geral (terica) de banco de dados, tabelas, chaves
primria e estrangeira, tipos de dados e operadores aritmticos, lgicos e de comparao.
1.2. Objetivo
Esses Bancos de Dados, alm de manterem todo esse volume de dados organizado,
tambm devem permitir atualizaes, incluses e excluses do volume de dados sem nunca
perder a consistncia. E no podemos esquecer que, na maioria das vezes, estaremos lidando
com acessos concorrentes a vrias tabelas de nosso banco de dados. Em algumas delas, com
mais de um acesso ao mesmo registro de uma mesma tabela.
Um Banco de Dados representa aspectos do mundo real. Assim sendo, uma Base de
Dados (ou Banco de Dados, ou ainda BD) uma fonte de onde podemos extrair uma gama de
informaes derivadas, que possui um nvel de interao com eventos, como o mundo real
que representa. A forma mais comum de interao Usurio e Banco de Dados se d atravs de
12
Centro de Treinamento Domnio Construindo uma marca forte.
sistemas especficos, que, por sua vez, acessam geralmente atravs da linguagem SQL o
volume de informaes.
Podemos ento dizer que as colunas so um conjunto de clulas dentro de uma tabela
que armazenam sempre um mesmo tipo de informao em particular. Por exemplo, supondo
que em uma tabela exista uma coluna onde ser mostrado o percentual de natalidade de um
determinado ano. Nessa coluna sero mostrados somente percentuais, pois o tipo de
informao que deve ser exibida, tendo em vista que no haveria sentido mostrar em algumas
clulas percentuais e em outras clulas um outro nome ou uma data por exemplo.
Mais adiante veremos alguns tipos de dados que uma coluna pode receber dentro de
um banco de dados.
13
Centro de Treinamento Domnio Construindo uma marca forte.
14
Centro de Treinamento Domnio Construindo uma marca forte.
2. Introduo a SQL
Structured Query Language (Linguagem de Consulta Estruturada)
A SQL uma linguagem usada pela maioria dos bancos de dados relacionais, baseada
no ingls. Os comandos de SQL utilizados para a definio de dados, so conhecidos como
DDL (Data Definition Language) e compostos, entre outros, pelos comandos Create, que
destinado criao do Banco de Dados e Tabelas que o compem. Alm das relaes
existentes entre as tabelas, o comando Alter, permite inserir e eliminar atributos nas tabelas
existentes, e o comando Drop, utilizado para eliminar a definio da tabela, seus dados e
referncias.
Devemos notar que a linguagem SQL consegue implementar essas solues por estar
baseada em Banco de Dados, que garante a integridade das relaes existentes entre as tabelas
e seus ndices.
Para futuros testes com comandos SQL, montamos um modelo contendo trs tabelas:
15
Centro de Treinamento Domnio Construindo uma marca forte.
16
Centro de Treinamento Domnio Construindo uma marca forte.
Chave primria uma coluna ou conjunto de colunas (chave composta), que identifica,
de forma nica, os demais dados de uma linha. Por exemplo: na tabela funcionrios o
cod_func identifica cada linha. Assim, duas linhas no podem ter a mesma chave primria.
Operador Descrio
+ Adio
- Subtrao
* Multiplicao
/ Diviso
17
Centro de Treinamento Domnio Construindo uma marca forte.
Para explicar operadores lgicos, vamos empregar algo que utilizamos muito em nosso
cotidiano, a linguagem falada e escrita.
Observe que nas frases abaixo, os operadores lgicos esto em negrito e so chamados
de E e OU.
Se toro para o Flamengo OU toro para o Vasco OU toro para o Botafogo, ento
sou do Rio de Janeiro.
No caso do operador E, para que uma determinada afirmao seja verdadeira, todos os
membros da frase devem ser verdadeiros, ou seja, o que est a direita e o que est esquerda
do operador E devem ser verdadeiros.
J no caso do operador OU, basta que um dos membros da frase seja verdadeiro, como
o exemplo da terceira frase.
Perceba nesse exemplo, que as duas afirmaes precisam ser verdadeiras para que a
expresso seja verdadeira.
18
Centro de Treinamento Domnio Construindo uma marca forte.
Ex.: (2) Departamento = 10
Se (departamento = 1 ) OU (departamento = 2)
OU (departamento=10)
Ento Funcionrio pertence ao departamento 1 ou 2 ou 10.
Seno Funcionrio no pertence aos departamentos 1, 2 e 10.
Perceba nesse exemplo, que as duas primeiras condies so falsas, porm, a ltima
verdadeira. Assim, a expresso torna-se verdadeira com o operador OU.
Os exemplos acima so apenas para compreenso dos operadores, pois, assim que
funciona na SQL. Contudo, todos os comandos em SQL so escritos em ingls, inclusive
esses operadores. Quando voc utilizar operadores lgicos em SQL, escreva AND, que
significa E em ingls e OR que significa OU.
Vamos ento visualizar as tabelas anteriormente listadas, para tentar extrair a seguinte
informao:
tabela depto, e na coluna cod_depto, selecionamos a linha que possui o valor igual ao que
estava na coluna cod_depto, da tabela de funcionrios. Uma vez selecionado, basta identificar
qual o nome do departamento.
20
Centro de Treinamento Domnio Construindo uma marca forte.
3. Exerccios de Reviso
21
Centro de Treinamento Domnio Construindo uma marca forte.
6.) Para que utilizamos a chave primria?
___________________________________________________________________________
___________________________________________________________________________
___________________________________________________________________________
___________________________________________________________________________
( )= ( )-
( )+ ( )>
( ) !< ( ) OR
( )/ ( ) !>
( ) >= ( )*
( ) AND ( ) <=
( ) != ( )<
( ) <>
3.)Que tipo de dado utilizado no campo dt_admisso da tabela funcionrio e qual o tipo de
dado utilizado no campo agncia da tabela bancos?
___________________________________________________________________________
___________________________________________________________________________
___________________________________________________________________________
22
Centro de Treinamento Domnio Construindo uma marca forte.
4. Consultas Simples
4.1. Introduo
4.2. Objetivo
Parte Descrio
campo1, campo2 Os nomes dos campos dos quais os dados sero recuperados. Se voc
incluir mais de um campo, eles sero recuperados na ordem listada.
alias1, alias2 Os nomes que sero usados como ttulos de colunas em vez dos
nomes originais das colunas na tabela.
SELECT funcionarios.cod_func,funcionarios.nome,funcionarios.
cod_depto,funcionarios.salario,funcionarios.dt_admissao,
funcionarios.dt_nascto,funcionarios.cod_banco
FROM funcionarios
SELECT fu.cod_func,fu.nome,fu.cod_depto,fu.salario,fu.dt_admissao,
fu.dt_nascto,fu.cod_banco
FROM funcionarios AS fu
SELECT *
FROM funcionarios
SELECT cod_func,nome,cod_depto,dt_admissao
FROM funcionarios
24
Centro de Treinamento Domnio Construindo uma marca forte.
ou
SELECT codigo=cod_func,descricao=nome
FROM funcionarios
SELECT *
FROM funcionarios
ORDER BY cod_func DESC
SELECT *
FROM funcionarios
ORDER BY nome ASC
SELECT *
FROM funcionarios
ORDER BY nome ASC, dt_admissao ASC
25
Centro de Treinamento Domnio Construindo uma marca forte.
SELECT *
FROM funcionarios
WHERE cod_func = 5
SELECT cod_func,nome,cod_depto,dt_admissao
FROM funcionarios
WHERE cod_func = 5
SELECT *
FROM funcionarios
WHERE dt_admissao > '1990/05/02'
SELECT *
FROM funcionarios
WHERE dt_admissao < '1990/05/02'
SELECT *
FROM funcionarios
WHERE dt_admissao <= '1990/05/02'
SELECT *
FROM funcionarios
WHERE cod_depto <> 4
SELECT *
FROM funcionarios
WHERE nome LIKE'Joao%'
SELECT *
FROM funcionarios
WHERE nome LIKE'%Pizzolo'
27
Centro de Treinamento Domnio Construindo uma marca forte.
SELECT *
FROM funcionarios
WHERE nome LIKE'%de%'
SELECT *
FROM funcionarios
WHERE nome LIKE'M%ri%'
SELECT *
FROM funcionarios
WHERE cod_depto = 4 AND dt_admissao = '1985/02/11'
SELECT *
FROM funcionarios
WHERE cod_banco = 2 OR cod_banco = 4
SELECT *
FROM funcionarios
WHERE cod_depto = 4 AND dt_admissao = '1985/02/11' OR
dt_admissao = '1985/01/10'
28
Centro de Treinamento Domnio Construindo uma marca forte.
Observe que o comando anterior no funcionou como deveria, pois fez retornar um
funcionrio que no pertence ao departamento de cdigo 4. Isso ocorreu porque o operador
OR dividiu a SQL em duas condies. Tudo o que est antes do OR uma condio e tudo o
que estiver depois outra condio. Sendo assim, se uma das duas forem verdadeiras, a linha
da tabela ser retornada.
O prximo comando mostra como deveria ser feito para que a SQL retornasse
corretamente o que foi descrito acima.
SELECT *
FROM funcionarios
WHERE cod_depto = 4 AND (dt_admissao = '1985/02/11' OR
dt_admissao = '1985/01/10')
SELECT *
FROM funcionarios
WHERE cod_func = 2 AND cod_func = 3 AND cod_func = 7
Observe que o comando anterior no retornou nada, pois quando se utiliza o operador
AND todas as condies tm de ser verdadeiras para a linha ser retornada.
SELECT *
FROM funcionarios
WHERE cod_func = 2 OR cod_func = 3 OR cod_func = 7
SELECT *
FROM funcionarios
WHERE cod_func IN (2,3,7)
29
Centro de Treinamento Domnio Construindo uma marca forte.
SELECT *
FROM funcionarios
WHERE cod_func >= 2 AND cod_func <= 6
SELECT *
FROM funcionarios
WHERE cod_func BETWEEN 2 AND 6
4.7. Distinct
O comando abaixo mostra na tela todos os salrios diferentes que so pagos aos
funcionrios cadastrados, pois a clusula DISTINCT s mostra valores distintos.
A clusula GROUP BY pode ser usada para dividir as linhas de uma tabela em
grupos menores. As funes de grupo devolvem uma informao sumarizada para cada grupo.
O comando abaixo mostra na tela o total de salrios pagos por departamento. Utiliza a
funo de agregao sum() em conjunto com group by.
30
Centro de Treinamento Domnio Construindo uma marca forte.
SELECT cod_depto,sum(salario)
FROM funcionarios group by cod_depto
SELECT cod_depto,count()
FROM funcionarios group by cod_depto
4.9. Null
Ex.: Vamos supor que tenhamos trs colunas: vlr_irrf = 10, vlr_horas_extras = NULL,
vlr_inss = 15.
Para solucionar esse problema poderamos antes de somar o valor das horas extras,
perguntar se esse valor nulo ou no. Caso seja, considerar que o valor zero.
SELECT *
FROM funcionarios
WHERE cod_banco is null
31
Centro de Treinamento Domnio Construindo uma marca forte.
SELECT cod_func,nome,isnull(cod_banco,0)
FROM funcionarios
At agora vimos vrios exemplos onde utilizamos condies para selecionar linhas
dentro de uma tabela. Para tanto, utilizamos operadores lgicos, operadores de condio, etc.
Porm h casos em que mais fcil eliminar linhas que no se deseja mostrar do que criar
uma seleo para mostrar somente as linhas que desejamos. Vejamos o exemplo:
Mas vamos supor ento que se deseje mostrar todos os funcionrios, exceto os que
possuem cdigos 2 e 7.
SELECT *
FROM funcionarios
WHERE cod_func <> 2 AND cod_func <> 7
Contudo, para operaes onde mais fcil excluir as linhas do que criar condies
para selecion-las, podemos utilizar o operador NOT para negar a condio. Ex.:
SELECT *
FROM funcionarios
WHERE cod_func NOT in (2,7)
32
Centro de Treinamento Domnio Construindo uma marca forte.
Tanto a forma anterior quanto essa funcionam, mas verifique que a segunda menor e
mais clara. Ir selecionar todos os funcionrios onde o cdigo no seja 2 ou 7.
Outros exemplos:
SELECT *
FROM funcionarios
WHERE cod_banco is not null
SELECT *
FROM funcionarios
WHERE not cod_depto = 4 nesse caso seria melhor o operador <> (diferente)
33
Centro de Treinamento Domnio Construindo uma marca forte.
Observe que criamos uma coluna temporria para armazenar o total de funcionrios
por departamento.
SELECT cod_func,nome,
agencia= (SELECT agencia
FROM bancos
WHERE bancos.cod_banco = funcionarios. cod_banco),
conta_bancaria = (SELECT numero_banco
FROM bancos
WHERE bancos.cod_banco = funcionarios.cod_banco)
FROM funcionarios
No existe segredo em utilizar sub-consultas. O nico cuidado que tem que se tomar
fazer corretamente os relacionamentos, pois se esses no forem executados corretamente a
sub-consulta poder retornar mais de uma linha ocasionando assim um erro.
Os dois exemplos acima mostram o uso de sub-consultas, mas voc pode observar que
poderia ser feito sem utiliz-las. Pelo modelo apresentado ser extremamente simples, no
existem muitos casos em que possa utilizar sub-consultas.
Sendo assim, enquadra-se no conceito visto anteriormente, onde vimos que uma sub-
consulta s pode retornar um valor singular, ou seja, uma nica linha.
No exemplo abaixo, o select deve retornar somente os bancos que tenham algum
funcionrio vinculado a ele, ou seja, somente os bancos que o cdigo esteja em alguma linha
da tabela funcionrios.
SELECT *
FROM bancos
WHERE EXISTS
(SELECT funcionarios.cod_banco FROM funcionarios
WHERE funcionarios.cod_banco = bancos.cod_banco)
Da mesma forma podemos fazer para tabela de deptos, conforme exemplo a seguir:
SELECT *
FROM deptos
WHERE EXISTS (SELECT funcionarios.cod_depto
FROM funcionarios
WHERE funcionarios.cod_depto = deptos.cod_depto)
Comandos equivalentes:
SELECT *
FROM bancos
WHERE (SELECT count()
FROM funcionarios
WHERE funcionarios.cod_banco = bancos.cod_banco) > 0
35
Centro de Treinamento Domnio Construindo uma marca forte.
SELECT *
FROM deptos
WHERE (SELECT count()
FROM funcionarios
WHERE funcionarios.cod_depto = deptos.cod_depto) > 0
ou
SELECT *,
TOTFUNC = (SELECT count()
FROM funcionarios
WHERE funcionarios.cod_banco = bancos.cod_banco)
from bancos where totfunc > 0
SELECT *,
TOTFUNC = (SELECT count()
FROM funcionarios
WHERE funcionarios.cod_depto = deptos.cod_depto)
from deptos where totfunc > 0
Deve-se tomar cuidado para sempre que utilizar uma sub-consulta na clusula
WHERE do SELECT principal e essa sub-consulta no estiver em conjunto com a condio
EXISTS, utilizar funes de agregao, para impedir que a sub-consulta possa retornar mais
de uma linha e assim ocorrer erro na execuo. Caso no deseje utilizar uma funo de
agregao, deve-se ento ter certeza que o resultado da sub-consulta vai retornar sempre uma
linha apenas.
36
Centro de Treinamento Domnio Construindo uma marca forte.
Vamos supor que precisemos gerar uma SQL que mostre primeiro todos os
funcionrios seguidos de todos os departamentos e depois todos os bancos, ordenados por
cdigo.
UNION All
UNION All
Perceba que o nmero de colunas de cada SQL tem que ser idntico para todos. Nesse
exemplo, todas as linhas geradas pela primeira SQL tero identificador = 1, pela segunda SQL
tero identificador = 2 e pela terceira SQL identificador = 3. Como a clusula ORDER BY
est utilizando a ordem pela primeira coluna (identificador), primeiro viro listados todos os
funcionrios seguidos de todos os departamentos e depois todos os bancos.
Basicamente, quem sabe trabalhar com SQL no ter dificuldade em utilizar unies.
37
Centro de Treinamento Domnio Construindo uma marca forte.
5. Funes
Pode-se dizer que em computao as funes so nossas melhores amigas. Quando se
tem algum problema, quase sempre tem uma funo para salvar a ptria. Alm de evitar que
se digite vrios comandos para chegar a um determinado resultado, as funes tornam a SQL
mais clara reduzindo o seu tamanho, e so geralmente mais rpidas na execuo.
Quem j trabalhou com planilhas eletrnicas (como Excel) deve ter visto e utilizado
funes. Apesar de no terem nenhuma relao com as funes em SQL, o conceito de
passagem de parmetros e retorno de valores o mesmo.
NOME_DA_FUNCAO([<parametro1,parametro2..parametro>])
--> os parmetros so opcionais, por isto esto entre colchetes.
onde:
Ex.: TODAY( ) essa uma funo que retorna a data atual. Note que ela no possui
parmetros.
COS(<nmero>) essa uma funo que retorna o coseno de um nmero. Note que
o nmero no est entre colchetes, portanto obrigatrio.
Nota: Se voc executar em SQL uma funo que deveria obrigatoriamente enviar
parmetros ser gerado o seguinte erro:
wrong number of parameter to funcion cos (nmero de parmetros incorreto na funo cos)
38
Centro de Treinamento Domnio Construindo uma marca forte.
SELECT count()
FROM funcionarios
SELECT count()
FROM deptos
SELECT count()
FROM bancos
SELECT sum(salario)
FROM funcionarios
SELECT sum(salario)
FROM funcionarios
WHERE cod_depto = 4
SELECT avg(salario)
FROM funcionarios
SELECT min(salario)
FROM funcionarios
SELECT max(salario)
FROM funcionarios
SELECT list(cod_func)
FROM funcionarios
WHERE cod_depto = 4
39
Centro de Treinamento Domnio Construindo uma marca forte.
SELECT today()
SELECT getdate()
SELECT date(getdate())
SELECT dayname(today())
SELECT monthname(today())
O comando abaixo mostra na tela o cdigo e nome do funcionrio e o ano da sua data
de admisso:
SELECT cod_func,nome,dt_admissao,year(dt_admissao)
FROM funcionarios
O comando abaixo mostra na tela o cdigo e nome do funcionrio e o ano da sua data
de admisso acrescido de 1:
SELECT cod_func,nome,dt_admissao,years(dt_admissao,1)
FROM funcionarios
40
Centro de Treinamento Domnio Construindo uma marca forte.
O comando abaixo mostra na tela o cdigo e nome do funcionrio e o ano da sua data
de admisso deduzindo 1.
SELECT cod_func,nome,dt_admissao,years(dt_admissao,-1)
FROM funcionarios
Quando passamos como parmetro para a funo YEARS duas datas, ela interpreta
que queremos saber a diferena entre as datas, sendo assim ela calcula a (segunda data -
primeira data) e retorna o resultado em anos. Se as duas datas estiverem compreendidas dentro
do mesmo ano, o retorno ser zero.
SELECT cod_func,nome,dt_admissao,month(dt_admissao)
FROM funcionarios
SELECT cod_func,nome,dt_admissao,months(dt_admissao,1)
FROM funcionarios
41
Centro de Treinamento Domnio Construindo uma marca forte.
O comando abaixo mostra na tela o cdigo e nome do funcionrio e o ms da sua data
de admisso, deduzindo 1.
SELECT cod_func,nome,dt_admissao,months(dt_admissao,-1)
FROM funcionarios
SELECT cod_func,nome,dt_admissao,months(dt_admissao,today())
FROM funcionarios
Quando passamos como parmetro para a funo MONTHS duas datas, ela interpreta
que queremos saber a diferena entre as datas, sendo assim ela calcula a (segunda data -
primeira data) e retorna o resultado em meses.
O comando abaixo mostra na tela o cdigo e nome do funcionrio e o dia da sua data
de admisso.
SELECT cod_func,nome,dt_admissao,day(dt_admissao)
FROM funcionarios
O comando abaixo mostra na tela o cdigo e nome do funcionrio e o dia da sua data
de admisso, acrescido de 1.
SELECT cod_func,nome,dt_admissao,days(dt_admissao,1)
FROM funcionarios
42
Centro de Treinamento Domnio Construindo uma marca forte.
O comando abaixo mostra na tela o cdigo e nome do funcionrio e o dia da sua data
de admisso, reduzindo 1.
SELECT cod_func,nome,dt_admissao,days(dt_admissao,-1)
FROM funcionarios
SELECT cod_func,nome,dt_admissao,days(dt_admissao,today())
FROM funcionarios
Quando passamos como parmetro para a funo DAYS duas datas, ela interpreta que
queremos saber a diferena entre as datas, sendo assim ela calcula a (segunda data - primeira
data) e retorna o resultado em dias.
SELECT cod_func,nome,dt_nascto,hour(dt_nascto)
FROM funcionarios
SELECT cod_func,nome,dt_nascto,minute(dt_nascto)
FROM funcionarios
43
Centro de Treinamento Domnio Construindo uma marca forte.
O comando abaixo mostra na tela o cdigo e nome do funcionrio e o(s) segundo(s) do
seu nascimento:
SELECT cod_func,nome,dt_nascto,second(dt_nascto)
FROM funcionarios
O comando abaixo mostra na tela todos os funcionrios que foram admitidos no ano
de 2001:
SELECT *
FROM funcionarios
WHERE year(dt_admissao) = 2001
Antes de utilizarmos funes para tratamento de strings, devemos saber o que uma
string. String uma seqncia de caracteres alfanumricos, ou seja, nessa seqncia podem
haver letras, nmeros, dgitos, sinais, etc. Qualquer palavra e letra tambm considerada uma
string. Todas as strings, quando no esto em seu formato varivel (no so variveis do tipo
string), devem estar entre aspas. Ex.: 017.061.079-94, Joao, 123456.
Soma de strings: JDK + 1.2.2 ir gerar uma string nica, unindo as duas
anteriores (concatenao): JDK1.2.2.
SELECT lcase(nome)
FROM deptos
SELECT ucase(nome)
FROM deptos
44
Centro de Treinamento Domnio Construindo uma marca forte.
O comando abaixo mostra na tela o cdigo, nome e data de admisso de todos os
funcionrios:
SELECT cod_func,nome,dt_admissao,left(dt_admissao,4)
FROM funcionarios
O ltimo comando onde foi utilizada a funo LEFT serve para mostrar o ano em que
o funcionrio foi admitido.
SELECT cod_func,nome,dt_admissao,right(dt_admissao,2)
FROM funcionarios
O ltimo comando que foi utilizada a funo RIGHT serve para mostrar o dia em que
o funcionrio foi admitido.
SELECT nome,length(nome)
FROM deptos
O comando abaixo mostra na tela os caracteres (string) que digitamos entre aspas.
O comando abaixo mostra na tela os caracteres (string) que digitamos entre aspas,
retirando possveis espaos em branco esquerda.
O comando abaixo mostra na tela os caracteres (string) que digitamos entre aspas,
retirando possveis espaos em branco a direita e a esquerda.
Note que esse comando utiliza um operador matemtico para a soma de nmeros.
Porm, nesse caso no queremos somar nmeros e sim somar letras de forma a unir em uma
string nica (concatenao). Contudo, pela coluna cod_func ser um nmero inteiro, a SQL ir
pensar que estou querendo fazer uma soma de nmeros e no uma soma (concatenao) de
caracteres (string) e ir retornar um erro, pois no possvel somar um nmero mais uma
letra. Para solucionar isso, devemos antes transformar (converter) o que nmero para
caracter (string) para que a SQL saiba que estamos efetuando uma concatenao, conforme
segundo exemplo:
46
Centro de Treinamento Domnio Construindo uma marca forte.
1 7
(1,7) (1,8)
8
2 (1,0) (2,7)
0 (2,8) (2,0)
Perceba que o comando abaixo est mostrando o cdigo do funcionrio, o seu nome e
o nome do seu departamento. Nesse caso obrigatrio que se coloque o nome da tabela antes
da coluna nome, pois existem colunas com esse nome na tabela de funcionrios e deptos.
Sendo assim, a SQL no saberia a que nome voc se refere. Outro detalhe e o mais
importante, que esse SQL abaixo retornou para cada funcionrio tantas linhas quando
existiam na tabela de deptos, ou seja, fez exatamente o que foi descrito no diagrama anterior.
Considerou a tabela funcionrios como o conjunto A e a tabela deptos como o conjunto B e
efetuou um produto cartesiano das duas.
SELECT cod_func,funcionarios.nome,deptos.nome
FROM funcionarios,deptos
47
Centro de Treinamento Domnio Construindo uma marca forte.
Contudo, no queremos que esse tipo de informao seja mostrada na tela, pois
imagine um relatrio impresso mostrado nesse formato. Para solucionarmos esse problema,
devemos efetuar o relacionamento entre as duas tabelas para que retorne apenas uma linha
para cada funcionrio e com o nome correto do seu departamento. O comando a seguir
implementa isto:
SELECT cod_func,funcionarios.nome,deptos.nome
FROM funcionarios,deptos
WHERE funcionarios.cod_depto = deptos.cod_depto
Verifique que o comando anterior funcionou perfeitamente, pois s listou o nome dos
departamentos cujo cdigo igual ao cdigo presente na coluna cod_depto da tabela de
deptos. O fato de ter feito o relacionamento tambm eliminou a multiplicidade de linhas
(produto cartesiano). O comando abaixo funciona da mesma maneira, porm tem uma
vantagem em sua sintaxe, observe:
SELECT cod_func,funcionarios.nome,deptos.nome
FROM funcionarios KEY JOIN deptos
48
Centro de Treinamento Domnio Construindo uma marca forte.
Perceba que o comando anterior no possui o relacionamento na clusula WHERE,
pois esse est sendo efetuado automaticamente pela clusula KEY JOIN. Cuidado, essa
clusula s funciona perfeitamente quando sabe-se que o relacionamento entre as duas tabelas
direto, ou seja, como o relacionamento funcionrios departamentos. Nesse
relacionamento no pode haver valor na coluna cod_depto de funcionrios que no exista na
tabela deptos, inclusive no podem haver valores NULL.
SELECT deptos.cod_depto,deptos.nome,funcionarios.*
FROM funcionarios KEY JOIN deptos
Existem ocasies onde relacionamos mais de uma tabela e que o contedo da coluna
que foi relacionada no existe na outra tabela.
Vamos supor ento que eu queira listar o cdigo, nome do funcionrio e nome do
banco de todos os funcionrios. Para os funcionrios que no trabalharem com banco, o nome
do mesmo no ser mostrado, mas o cdigo e nome do funcionrio sim.
SELECT cod_func,funcionarios.nome,bancos.nome
FROM funcionarios,bancos
WHERE funcionarios.cod_banco = bancos.cod_banco
Esse comando possui um problema. Ele s trar os funcionrios que possurem algum
valor no campo cod_banco da tabela de funcionrios, em funo da relao funcionrio
banco, que diz que o cdigo do banco existente na tabela de funcionrios deve ser igual a um
cdigo existente na tabela de bancos. Porm, como vimos, o valor NULL, comparado a
49
Centro de Treinamento Domnio Construindo uma marca forte.
qualquer coisa NULL, e no caso desses relacionamentos sero desprezados os funcionrios
que possuem banco igual a NULL.
Para solucionar esse problema, utilizaremos o mesmo comando acima com uma
pequena diferena:
SELECT cod_func,funcionarios.nome,bancos.nome
FROM funcionarios,bancos
WHERE funcionarios.cod_banco *= bancos.cod_banco
Mas e se a SQL estivesse dessa forma, primeiro a tabela bancos e depois a tabela
funcionrios?
SELECT cod_func,funcionarios.nome,bancos.nome
FROM funcionarios,bancos
WHERE bancos.cod_banco = funcionarios.cod_banco
SELECT cod_func,funcionarios.nome,bancos.nome
FROM funcionarios,bancos
WHERE bancos.cod_banco =* funcionarios.cod_banco
SELECT cod_func,funcionarios.nome,bancos.nome
FROM funcionarios LEFT OUTER JOIN bancos ( *= )
50
Centro de Treinamento Domnio Construindo uma marca forte.
SELECT cod_func,funcionarios.nome,bancos.nome
FROM bancos RIGHT OUTER JOIN funcionarios ( =* )
51
Centro de Treinamento Domnio Construindo uma marca forte.
7. Exerccios de Reviso 2
5 Selecione todos os funcionrios que tenham sido admitidos depois do dia primeiro de
1990, que tenham salrio maior que R$ 500 reais e nascido ao meio dia.
8 Selecione todos os funcionrios em que o salrio seja maior ou igual a R$ 200,00 e menor
ou igual a R$ 500,00.
14 Mostrar o cdigo, nome e data de nascimento do funcionrio, sendo que essa data deve
desprezar a hora/minuto/segundo. Somente devem ser mostrados os funcionrios que tiverem
mais de 21 anos.
52
Centro de Treinamento Domnio Construindo uma marca forte.
15 Mostrar o cdigo e nome do funcionrio. Tambm deve ser mostrado o dia/ms/ano do
nascimento do funcionrio no seguinte formato: Dia: dd Ms: mm Ano: yyyy.
IN ('1','2') _____________________________________________
_____________________________________________
53
Centro de Treinamento Domnio Construindo uma marca forte.
8. Caderno de Respostas
R: (3) um conjunto de colunas que ficam dispostas horizontalmente. Todas as linhas que
possuem o mesmo nmero de colunas.
R: (6) Chave primria uma coluna ou conjunto de colunas (chave composta) que identifica
de forma nica os demais dados de uma linha dada. Por exemplo: na tabela funcionrios o
cod_func identifica cada linha. Assim, duas linhas no podem ter a mesma chave primria.
R: (7)
(1) Aritmtico (2) Lgico (3) Relacional
(3)= (1)-
(1)+ (3)>
( 3 ) !< ( 2 ) OR
(1)/ ( 3 ) !>
( 3 ) >= (1)*
( 2 ) AND ( 3 ) <=
( 3 ) != (3)<
( 3 ) <>
R: (1) funcionrios
R: (2) Char
R: (1)
Select *
from funcionarios
where years(dt_admissao) = 1985
order by salario DESC
54
Centro de Treinamento Domnio Construindo uma marca forte.
R: (2)
Select *,
'Idade' = years(dt_nascto,today())
from funcionarios
R: (3)
select deptos.cod_depto,deptos.nome,
Tot_func= (select count()
from funcionarios
where funcionarios.cod_depto = deptos.cod_depto and
year(dt_admissao) = 1985)
from deptos
order by deptos.nome asc
R: (4)
select 'Codigo do banco' = bancos.cod_banco,
'Nome do banco' = bancos.nome
from bancos
where nome like '%Brasil%'
R: (5)
select *
from funcionarios
where dt_admissao > '1990/01/01' and
salario > 500 and
hour(dt_nascto) = 12
R: (6)
select *
from funcionarios
where cod_banco is null
R: (7)
select *
from funcionarios key join deptos
where deptos.nome = 'Financeiro'
ou
select *
from funcionarios, deptos
where funcionarios.cod_depto = deptos.cod_depto and
deptos.nome = 'Financeiro'
R: (8)
select *
from funcionarios
where salario >= 200 and salario <= 500
ou
select *
from funcionarios
where salario between 200 and 500
R: (9)
select dayname('2002/06/24')
R: (10)
select *
from funcionarios
where cod_banco in (1,3,4)
55
Centro de Treinamento Domnio Construindo uma marca forte.
R: (11)
select lcase(nome),(salario * 1.02)
from funcionarios
where cod_banco is not null and cod_depto <> 4
R: (12)
select cod_func,func.nome,func.cod_banco,ba.nome,func.cod_depto,
de.nome
from funcionarios func,bancos ba, deptos de
where func.cod_banco = ba.cod_banco and func.cod_depto = de.cod_depto
order by cod_func
R: (13)
select max(cod_depto),min(cod_depto)
from deptos
R: (14)
select cod_func,nome,date(dt_nascto)
from funcionarios
where years(dt_nascto,today()) > 21
R: (15)
select cod_func,nome,'Dia: ' + right(date(dt_nascto),2) ,
'Ms: ' + substr(dt_nascto,6,2),'Ano: ' + left(dt_nascto, 4)
from funcionarios
56
Centro de Treinamento Domnio Construindo uma marca forte.
9. Tabelas Modelo
57