Vous êtes sur la page 1sur 86

Linguagem de Programao para BD - SQL

Structured Query Language SQL


Prof. Ricardo Amaral

Linguagem de Programao para BD - SQL

O preguioso deseja, e coisa nenhuma alcana; mas o desejo do diligente ser satisfeito.
Provrbios 13.4

Linguagem de Programao para BD - SQL


Introduo Linguagem de programao para banco de dados a linguagem por meio da qual os usurios criam banco de dados e gerenciam as informaes ali existentes.

Um breve histrico Os fundamentos de bancos de dados relacionais surgiram na empresa IBM, nas dcadas de 1960 e 1970, atravs de pesquisas de funes de automao de escritrio. Nessa poca, as empresas tinham um custo muito elevado com um grande nmero de pessoal para a manuteno de arquivos e documentos em geral.

Linguagem de Programao para BD - SQL


A IBM aproveitou a necessidade trabalhando na criao de um sistema que gerenciasse todos os dados (arquivos e documentos em geral), tendo como meta a segurana, a confiabilidade, a rapidez de consulta e de manuteno dos dados, por um custo mais favorvel. Em 1970 um pesquisador da IBM - Edgar Frank Codd publicou o primeiro artigo sobre bancos de dados relacionais. Neste trabalho, Codd estabeleceu princpios sobre gerncia de banco de dados. Este artigo tratava sobre o uso de clculo e lgebra relacional para permitir que usurios no tcnicos armazenassem e recuperassem grande quantidade de informaes. Codd visionava um sistema onde o usurio seria capaz de acessar as informaes atravs de comandos em ingls, onde as informaes estariam armazenadas em tabelas.

Linguagem de Programao para BD - SQL

Codd levou a IBM a montar um grupo de pesquisa conhecido como System R (Sistema R) com o objetivo de criar um sistema de banco de dados relacional o qual eventualmente se tornaria um produto. Os primeiros prottipos foram utilizados por muitas organizaes, tais como MIT Sloan School of Management (uma escola renomada de negcios norte-americana). Novas verses foram testadas com empresas aviao para rastreamento do manufaturamento de estoque. O Sistema R evoluiu para SQL/DS, o qual posteriomente tornou-se o DB2.

Linguagem de Programao para BD - SQL


A linguagem criada para desenvolver o sistema inicialmente chamava-se SEQUELStructured English Query Language, posteriormente passou a se chamar SQLStructured Query Language (Linguagem de Consulta Estruturada). Esta linguagem tornou-se um padro na indstria para bancos de dados relacionais e hoje em dia um padro ISOInternational Organization for Standardization (Organizao Internacional de Padronizao) - ISO/IEC 9075 Database Language SQL.

Linguagem de Programao para BD - SQL


O que SQL?
SQL (Structured Query Language) um conjunto de comandos de manipulao de banco de dados utilizado para criar e manter a estrutura desse banco de dados, alm de incluir, excluir, modificar e pesquisar todas as informaes ali contidas. A linguagem SQL no uma linguagem de programao autnoma; poderia ser chamada de sublinguagem. Quando se escrevem aplicaes para banco de dados, necessrio utilizar uma linguagem de programao tradicional (C, Java, Pascal, COBOL, etc.) e embutir comandos SQL para manipular os dados.

Linguagem de Programao para BD - SQL


O software de banco de dados relacionais foi sendo refinado durante a dcada de 80. Com o passar dos anos, os bancos de dados tm tido aumento nos dados de armazenamento, desde os 8 MB (Megabytes) at centenas de Terabytes de dados em listas de e-mail, informaes sobre consumidores, sobre produtos, vdeos, informaes geogrficas, etc.. Com este aumento de volume de dados, os sistemas de bancos de dados em operao tambm sofreram aumento em seu tamanho.

Linguagem de Programao para BD - SQL

O padro SQL passou da IBM para a ANSI (American National Standards Institute) - Insituto Nacional Americano para Padres - e para a ISO, os quais formaram um grupo de trabalho para continuar o desenvolvimento. Este desenvolvimento ainda acontece com outras novas verses dos padres definidos.

Linguagem de Programao para BD - SQL


Orientao a Objetos Em meados da dcada de 80 tornou-se bvio que existiam vrias reas onde bancos de dados relacionais no eram aplicveis, por causa dos tipos de dados envolvidos. Estas reas incluam medicina, multimdia e fsica de energia elevada, todas com necessidades de flexibilidade em como os dados seriam representados e acessados.

Este fato levou ao incio de pesquisas em bancos de dados orientados a objetos, os quais os usurios poderiam definir seus prprios mtodos de acesso aos dados e como estes seriam representados e acessados.

Linguagem de Programao para BD - SQL


No incio de 1990, temos a apario do primeiro Sistema de Gerenciamento de Banco de Dados Orientado a Objetos, atravs da companhia Objectivity. Isso permitiu com que usurios criassem sistemas de banco de dados para armazenar resultados de pesquisas como o CERN (maior laboratrio que trabalha com partculas fsicas em pesquisas nucleares - europeu) e SLAC (Centro de Acelerao Nuclear - norte-americano), para mapeamento de rede de provedores de telecomunicaes e para armazenar registros mdicos de pacientes em hospitais, consultrios e laboratrios.

Linguagem de Programao para BD - SQL

Ento, o que um banco de dados? Um banco de dados um conjunto coerente e lgico de dados relacionados que possuem significncia intrnseca. Esses dados representam aspectos do mundo real e so dispostos em uma ordem predefinida para atender a determinadas necessidades dos usurios.

Linguagem de Programao para BD - SQL


Quais so os elementos que compem um Banco de Dados? Um banco de dados composto por tabelas contendo campos e registros. Campo: a menor unidade de armazenamento de um banco de dados. O campo um conjunto de dados, e cada dado isoladamente representa um determinado valor de identificao, por exemplo: nome, endereo, telefone, salrio, cidade, estado, etc.

Linguagem de Programao para BD - SQL


Registro: um conjunto de campos relacionados a um determinado tema. Tabela: um conjunto de registros. Pode ser definida mais de uma tabela para um mesmo banco (o que muito comum).

* Banco de dados, ento, um conjunto de tabelas, as quais podem estar ou no relacionadas entre si.

Linguagem de Programao para BD - SQL


A linguagem SQL dividida nos seguintes componentes: Data Definition Language (DDL): permite a criao dos componentes do banco de dados, como tabelas, ndices, etc. Principais comandos DDL: CREATE TABLE ALTER TABLE DROP TABLE CREATE INDEX ALTER INDEX DROP INDEX DATA MANIPULATION LANGUAGE (DML): manipulao dos dados armazenados no BD. Comandos DML: INSERT DELETE UPDATE permite a

Linguagem de Programao para BD - SQL


Data Query Language (DQL): permite extrair dados do BD. Comando DQL: SELECT

Data Control Language (DCL): prov a segurana interna do BD. Comandos DCL: CREATE USER ALTER USER GRANT REVOKE CREATE SCHEMA

Linguagem de Programao para BD - SQL


Exerccios de fixao: 1. Defina campo, registro, tabela e banco de dados. 2. Quem o idealizador do BD Relacional?

3. Qual o significado da sigla SQL? (Ingls/Portugus)


4. Como um BD Relacional armazena seus dados? 5. O que significa a sigla SGBD?

Linguagem de Programao para BD - SQL


Comandos SQL Criar de Banco de Dados: CREATE DATABASE <nome>[;] CREATE DATABASE bancoteste;

Observaes: 1. Cada banco de dados (software) utiliza um terminador de comando especfico. Normalmente utilizado o ponto e vrgula (;) no Oracle, MySQL e DB2, mas encontra-se ponto (.) no Progress e o comando go no SQLServer.

2. O comando SHOW DATABASES[;] mostra todos os bancos de dados existentes.

Linguagem de Programao para BD - SQL


3. Quanto aos comandos SQL apresentados, os bancos de dados no so sensveis a letras maisculas ou minsculas. Contudo, o contedo das colunas normalmente sensvel, portanto deve-se tomar cuidado ao realizar comparaes entre valores alfanumricos. Uso do BD: Quando um banco de dados criado, ele deve ser usado, o que acontece com a instruo: USE <nome> [;] USE bancoteste

Linguagem de Programao para BD - SQL


Remoo de BD: Para remover um banco de dados criado usamos a instruo DROP DATABASE, sequida do nome do bd [;] e da ao da tecla <Enter>.

DROP DATABASE bancoteste;

Utilize o comando SHOW DATABASES; e verifique que o bd bancoteste no existe mais. Agora crie outro bd com o nome virtual, este ser o bd que iremos criar nossas tabelas para estudo.

Linguagem de Programao para BD - SQL


Tabelas e Registros do BD virtual: As tabelas so os componentes mais importantes para o trabalho de manuteno dos bd, pois o local onde inserida uma coleo de dados, cujo nome registro.

Criao de Tabelas:
CREATE TABLE <tabela> (<campo> <tipo dado campo> [NULL/NOT NULL] [PRIMARY KEY] ) [;] do

<tabela> a definio do nome da tabela; <campo> o nome do campo definido;

Linguagem de Programao para BD - SQL


<tipo dado do campo> um tipo de dado a partir de uma lista de tipos de padro que veremos abaixo; [NULL/NOT NULL] a definio do campo em aceitar ou no valores nulos. Constraint de coluna regra agregada coluna.; [PRIMARY KEY] determina que o campo a chave primria da tabela. Constraint de tabela regra agregada tabela.

Lista dos principais tipos de dados mais comuns: BIGINT utiliza-se esse tipo de dado quando usar valores inteiros grandes na faixa de valores de 9.223.372.036.854.775.808 a 9.223.372.036.854.775.807. Esse tipo de dado ocupa 8 bytes de tamanho de armazenamento.

Linguagem de Programao para BD - SQL


CHAR(tamanho) usado com sequncias de caracteres de tamanho fixo que estejam entre 1 e 8.000 caracteres de comprimento. O parmetro (tamanho) determina o valor mximo em caracteres que pode conter a sequncia. Esse tipo de dado, quando definido, preenche o campo com espaos em branco at completar o total de caracteres definidos, quando a totalidade do tamanho do campo no preenchida.
DATE utiliza-se esse tipo de dado para definir uma data que esteja no intervalo de tempo entre 01-01-0001 e 31-12-9999. A preciso de um dia. Esse tipo de dado ocupa 3 bytes de tamanho de armazenamento. DATETIME utilizado com uma data de calendrio combinada com a hora do dia no formato DD-MM-AAAA HH:MM:SS [,NNN] (considerando o uso no idioma portugus-br do bd a ser utilizado) no intervalo de tempo entre 01-01-1753 e 31-12-9999. Esse tipo de dado ocupa 8 bytes de tamanho de armazenamento.

Linguagem de Programao para BD - SQL


DECIMAL[(tamanho[, decimal])] utiliza-se esse tipo de dado quando for preciso usar valores com ponto flutuante de preciso e escala fixos na faixa de valores de 10E-28 +1 a 7.9x10E+28 -1. O parmetro (tamanho) determina a quantidade mxima de dgitos decimais que podem ser armazenados esquerda e direita do ponto flutuante (ponto decimal). O parmetro (decimal) determina a quantidade mxima de dgitos decimais que podem ser armazenados direita do ponto flutuante.
FLOAT utiliza-se esse tipo de dado quando usar valores com ponto flutuante pequeno (preciso simples) na faixa de 1.79E+308 a -2.23E-308, e entre 2.23E-308 e 1.79E+308. O parmetro decimal determina o nmero de casas decimais que pode variar de 1 a 53. INT utilizado quando houver a necessidade de usar valores inteiros longos na faixa de valores de -2.147.483.648 a 2.147.483.647, ou de o a 4.294.967.295. Esse tipo de dado ocupa 4 bytes de tamanho de armazenamento.

Linguagem de Programao para BD - SQL


REAL utiliza-se esse tipo de dado quando USAR VALORES REAIS NA FAIXA DE VALORES DE -3,40e+38 a 1,18E-38 e 1,18E-38 a 3,40e+38. Esse tipo de dado ocupa 4 bytes de memria.
SMALLINT utiliza-se esse tipo de dado quando for necessrio usar valores inteiros curtos na faixa de -32.768 a 32.767, ou de 0 a 65533. Esse tipo ocupa 2bytes de memria. TIME utiliza-se esse tipo de dado para definir uma determinada hora de um dia que se encontra sem reconhecimento de fuso horrio e se baseia em um relgio de 24 horas operando na faixa de 00:00:00.0000000 a 23:59:59.9999999. A preciso de clculo de 100 nanossegundos. TINYINT utiliza-se esse tipo de dado quando precisar de valores inteiros pequenos na faixa de 0 a 255. Ele ocupa 1 byte de tamanho de armazenamento.

Linguagem de Programao para BD - SQL


VARCHAR(tamanho) utiliza-se esse tipo de dado quando precisar de sequncias de caracteres de tamanho varivel que estejam entre 1 e 8.000 caracteres de cumprimento. A diferena entre esse tipo e o CHAR que, neste caso, os espaos em brancos excedentes do lado direito da sequncia de caracteres no utilizados so automaticamente desprezados.

Criaremos uma tabela para cadastro de funcionrios no bd virtual. Ela deve se chamar cadfun:

CREATE TABLE cadfun ( CODFUN INT NOT NULL PRIMARY KEY, NOME VARCHAR(40) NOT NULL, DEPTO CHAR(2), FUNCAO CHAR(20), SALARIO DECIMAL(10, 2) );

Linguagem de Programao para BD - SQL


Para visualizarmos, no MySQL, os campos criados, devemos escrever o seguinte comando:
DESCRIBE <tabela>; DESCRIBE cadfun;

Insero de Registros: A partir do momento que uma tabela est pronta, ela j pode receber a entrada de dados atravs da instruo INSERT INTO, da seguinte forma: INSERT INTO <tabela (campo1, campo2, campoN)> VALUES <(valor1, valor2, valorN)>[;] campo3, valor3,

Linguagem de Programao para BD - SQL

Faremos agora a primeira insero de um registro no bd virtual. INSERT INTO cadfun ( CODFUN, NOME, DEPTO, FUNCAO, SALARIO) VALUES (12, CARLOS ALBERTO, 3, VENDEDOR, 1530.00);

Linguagem de Programao para BD - SQL

Podemos simplificar a instruo INSERT INTO, omitindo os nomes dos campos.


Exemplo:

INSERT INTO cadfun VALUES (12, CARLOS ALBERTO, 3, VENDEDOR, 1530.00);

Vamos prosseguir inserindo novos registros (pg.63 a 65)

Linguagem de Programao para BD - SQL


Consulta de Registros
Essa uma das tarefas mais importantes no trabalho de gerenciamento de banco de dados. Para visualizarmos todos os registros inseridos, devemos utilizar o seguinte comando: SELECT [DISTINCT] [condio] [;] <campos> FROM <table>

DISTINCT um parmetro opcional que possibilita determinar o tipo de registro a ser selecionado, que pode ser um dos valores distintos ou apresentar todos os registros; campo a lista de campos a serem selecionados, em que pode ser utilizado * (asterisco) representando todos os campos da tabela; tabela a indicao do nome da tabela ou tabelas de onde se deseja retirar os registros;

Linguagem de Programao para BD - SQL


condio um parmetro opcional que determina a condio de ao da pesquisa, sendo aceitos os valores: WHERE (determina a ao de trabalho de uma condio baseada em uma relao lgica), GROUP BY (indica a forma de ordenao dos registros, podendo ser ASC ascendente e DESC descendente).
SELECT * FROM cadfun;

O comando SELECT faz a apresentao dos dados e o comando FROM indica de que tabela a apresentao ser feita.

Linguagem de Programao para BD - SQL


Outros exemplos:
SELECT NOME, FUNCAO FROM cadfun; O exemplo acima apresenta uma listagem dos nomes e das funes de todos os registros armazenados na tabela cadfun.

SELECT NOME FROM cadfun WHERE DEPTO=3;

O exemplo acima exibe uma listagem dos registros da tabela cadfun que estejam relacionados com o campo DEPTO=3.

SELECT NOME, SALARIO FROM cadfun ORDER BY NOME; O exemplo acima exibe uma listagem dos nomes e dos salrios dos registros da tabela cadfun por ordem alfabtica do campo NOME

Linguagem de Programao para BD - SQL


SELECT NOME, SALARIO FROM cadfun ORDER BY NOME DESC;
O exemplo acima exibe uma listagem dos nomes e dos salrios dos registros da tabela cadfun ordenados por NOME em formato descendente. SELECT DEPTO, NOME FROM cadfun ORDER BY DEPTO, NOME DESC;

O exemplo apresenta uma listagem dos departamentos e nomes colocados por ordem do campo DEPTO em ascendente e do campo NOME em descendente.
SELECT NOME, CODFUN FROM cadfun WHERE DEPTO=3 ORDER BY NOME; O exemplo mostra os nomes da tabela cadfun ordenados pelo campo NOME em formato ascendente, dos funcionrios do DEPTO=3.

Linguagem de Programao para BD - SQL


Alterao de Registros
No processo de manuteno de registros em bd necessrio periodicamente atualizar dados e informaes existentes. As instrues para a atualizao so UPDATE... SET:

UPDATE <tabela> [condio] [;]

SET

<campo>

<expresso>

tabela a indicao da tabela na qual se deseja atualizar os registros;

campo a indicao de um determinado campo da tabela;


expresso a indicao do valor do campo a ser atualizado; condio um parmetro opcional que determina a condio de ao da pesquisa baseada no argumento WHERE.

Linguagem de Programao para BD - SQL


O funcionrio de cdigo de registro 7 teve um aumento de salrio, passando a ganhar um total de R$ 2300,56. Devemos atualizar esse dado na tabela cadfun. Porm, antes de atualizar, vamos consultar os dados referente a esse funcionrio utilizando a condio WHERE. Vejamos: SELECT * FROM cadfun WHERE CODFUN = 7;

Agora executaremos a instruo de atualizao de dados de um registro para atualizar o campo SALARIO:
UPDATE cadfun CODFUN = 7; SET SALARIO = 2300.56 WHERE

Execute novamente a consulta para checar a alterao: SELECT * FROM cadfun WHERE CODFUN = 7;

Outras alteraes a serem feitas: pgs 72 e 73 (SQLServer2005).

Linguagem de Programao para BD - SQL


Remoo de Registros

Dentre as vrias atividades de manuteno de registro, existe a possibilidade de remover registros que no sejam mais necessrios. Para isso, usaremos a instruo DELETE FROM, conforme a sintaxe abaixo:
DELETE FROM <tabela> [condio] [;] tabela a indicao da tabela da qual se deseja remover registros. condio um parmetro opcional que determina a ao da pesquisa baseada no argumento WHERE.

Obs.: Este comando deve ser cuidadosamente aplicado, pois se for acionado de forma inadequada pode ocasionar prejuzos, perdendo dados desnecessriamente. Por isso conveniente sempre utilizar o parmetro WHERE nas operaes de remoo de registros, evitando perda de dados dos demais registros.

Linguagem de Programao para BD - SQL


A empresa Virtual Ltda. Est passando por uma reengenharia; o departamento 2 foi extinto e seus funcionrios foram demitidos. Desta forma, torna-se necessrio remover os registros que atendam a este critrio de condio. Antes e depois da remoo faremos consulta de toda a tabela cadfun para percebermos a excluso dos registros. SELECT * FROM cadfun; DELETE FROM cadfun WHERE DEPTO = 2; SELECT * FROM cadfun;

O funcionrio MARCELO SOUZA, insatisfeito com as mudanas, conseguiu emprego na empresa concorrente da Virtual Ltda., ento solicitou sua demisso, portanto esse registro precisa ser removido. Faa a remoo deste registro e comprove o resultado.

Linguagem de Programao para BD - SQL


Alterao de Tabelas A estrutura de uma tabela algo que pode ser modificado com o tempo devido a alguma necessidade especfica. Podemos, assim, incluir um novo campo, retirar um campo existente ou mesmo modificar a sua estrutura. Para isso se utiliza a instruo ALTER TABLE, que possui a seguinte sintaxe: ALTER TABLE <tabela> <operao> [;] tabela a indicao da tabela na qual se deseja fazer a alterao do campo. operao um parmetro que pode receber um dos seguintes valores: ADD <campo> <tipo> - utiliza-se esse comando quando houver necessidade de insero de um novo campo em uma determinada tabela. O parmetro <campo> representa o nome do novo campo e <tipo> a sua estrutura (INT, CHAR, VARCHAR, etc.)

Linguagem de Programao para BD - SQL


DROP <campo> - usado quando h necessidade de remover um campo de uma determinada tabela. O parmetro <campo> representa o nome do campo a ser retirado da tabela. [;] opcional, de acordo com o software bd em utilizao.

Vamos inserir na tabela cadfun o campo ADMISSAO, com o atributo DATETIME, utilizando a instruo ALTER TABLE. Aps essa alterao, execute a instruo de listagem de todos os registros: ALTER TABLE cadfun ADD ADMISSAO DATETIME; SELECT * FROM cadfun;

Linguagem de Programao para BD - SQL


Agora necessrio atualizar todos os registros da tabela cafun com as datas de admisso dos funcionrios ativos. Utilize o comando UPDATE para alterao de registros, conforme abaixo:
UPDATE cadfun CODFUN=6; UPDATE cadfun CODFUN=3; UPDATE cadfun CODFUN=4; UPDATE cadfun CODFUN=5; UPDATE cadfun CODFUN=7; UPDATE cadfun CODFUN=9; UPDATE cadfun CODFUN=12; UPDATE cadfun CODFUN=25; SET SET SET ADMISSAO ADMISSAO ADMISSAO = = = 2006-01-15 1999-10-21 2004-10-21 WHERE WHERE WHERE

SET
SET SET SET SET

ADMISSAO
ADMISSAO ADMISSAO ADMISSAO ADMISSAO

=
= = = =

2006-04-26
1980-05-10 1999-12-15 2000-12-21 2000-10-21

WHERE
WHERE WHERE WHERE WHERE

Linguagem de Programao para BD - SQL


Aps as instrues de atualizao para preenchimento do campo ADMISSAO, consulte os registros atualizados.

Verificando a funcionalidade do novo campo, apresente a relao de todos os funcionrios admitidos no ms de dezembro de qualquer ano. Para tal solicitao, utilize a seguinte sintaxe: SELECT NOME, ADMISSAO MONTH(ADMISSAO) = 12; FROM cadfun WHERE

Consulte a lista de todos os funcionrios admitidos a partir de 1 de janeiro de 2000. Para tanto use a seguinte sintaxe:
SELECT NOME, ADMISSAO FROM cadfun WHERE ADMISSAO >= 2000-01-01;

Linguagem de Programao para BD - SQL


Aps a concluso do processo de reengenharia da empresa Virtual Ltda., a sua diretoria decidiu reabrir o departamento 2. Dos trs funcionrios anteriormente demitidos um aceitou seu antigo emprego e cargo, retornando empresa. Execute o recadastramento deste funcionrio com os seguintes registros:
(15, MARCOS HENRIQUE, 2006-05-25) 2, GERENTE, 2184.33,

Alm do funcionrio readmitido foram necessrias novas contrataes. Foram contratados trs novos funcionrios com os seguintes registros: (20, AUDREY TOLEDO, 2, SUPERVISORA, 1700.00, 2006-07-05) (22, SANDRA MANZANO, 2, ANALISTA, 2000.00, 2006-07-01) (24, MARCIO CANUTO, 2, PROGRAMADOR, 1200.00, 2006-07-10) Aps cadastrar os quatro funcionrios, consulte a listagem completa.

Linguagem de Programao para BD - SQL


Uso de Subconsultas para transferncia de dados entre tabelas
Imagine que a empresa mantivesse um arquivo morto no banco de dados (uma outra tabela) com os dados dos funcionrios que saram da empresa. Considere a necessidade de fazer uma consulta para apresentar os nomes dos registros de todos os funcionrios da tabela cadfun que possuam seu salrio igual aos salrios dos funcionrios demitidos. Ser necessrio fazer uma confrontao de buscas nas duas tabelas. Antes, porm, preciso criar a tabela morto com a mesma estrutura da tabela cadfun, com a diferena, apenas, de que no ser necessrio utilizar nos campos da tabela morto a definio NOT NULL, uma vez que o preenchimento dessa tabela no ser executado como foi o da cadfun. Vamos ao trabalho...

Linguagem de Programao para BD - SQL


Uma vez criada a tabela morto, para colocar um registro nela antes de remov-lo definitivamente da tabela ativa (obviamente), necessrio usar a instruo INSERT INTO anexa ao comando SELECT, conforme o exemplo abaixo:
INSERT INTO morto SELECT CODFUN, NOME, DEPTO, FUNCAO, SALARIO, ADMISSAO FROM cadfun WHERE CODFUN = 12;

Agora faa uma busca do contedo da tabela morto, e veja o resultado.

Obs.: No comando SELECT definido aps o comando INSERT INTO, podemos tambm substituir os nomes dos campos por asterstico, agilizando a transferncia dos dados.

Linguagem de Programao para BD - SQL


Agora estamos aptos a resolver a questo anterior que para apresentar uma consulta de todos os funcionrios da tabela cadfun que tenham os seus salrios iguais aos salrios dos funcionrios demitidos. Execute a seguinte instruo e observe faa posteriormente uma consulta para ver o resultado: SELECT * FROM cadfun SALARIO FROM morto); WHERE SALARIO = (SELECT

Agora, apresente uma consulta de todos os funcionrios da tabela cadfun que tenham o seu nmero de departamento igual ao nmero de departamento do registro existente na tabela morto.

Exerccios de fixao (Pg. 86)

Linguagem de Programao para BD - SQL


CONSULTA COM OPERADORES
Operadores Aritmticos possvel efetuar as quatro operaes matemticas no SQL, utilizando os seguintes smbolos:

Operaes Adio Subtrao

Operador + -

Multiplicao
Diviso

*
/

Resto da diviso

Linguagem de Programao para BD - SQL


Por exemplo, a empresa Virtual Ltda. Deseja fazer uma simulao de aumento de salrio em R$ 100,00. Usaremos a seguinte instruo:
SELECT NOME, SALARIO + 100 FROM cadfun;

Obs.: Esta soma apenas um recurso visual e de fato o valor R$100 no foi adicionado fisicamente aos dados da tabela cadfun.
Igualmente possvel realizar as demais operaes matemticas. Por exemplo, qual seria o valor dos salrios se eles fossem reajustados em 20%? Faa a operao, e veja o resultado. possvel definir algumas expresses aritmticas usando apenas o SELECT. Faa a operao abaixo, e veja o resultado. SELECT (2 + 3) * 5;

Linguagem de Programao para BD - SQL


Operadores de Comparao
Tambm conhecidos como operadores relacionais, so ferramentas utilizadas na definio de condies em que h necessidade de comparao entre dois valores e assim extrair uma variedade de consultas de uma determinada tabela.

Operador
> < = <> Ou != >= <= <=>

Descrio
Maior que Menor que Igual a Diferente de Maior ou igual a Menor ou igual a Igual para NULL

Linguagem de Programao para BD - SQL


Exemplos de operadores de comparao:
SELECT * FROM cadfun WHERE DEPTO = 5; SELECT * FROM cadfun WHERE FUNCAO = VENDEDOR;

SELECT * FROM cadfun WHERE SALARIO <= 1700;


SELECT * FROM cadfun WHERE SALARIO > 1700 + 50;

Linguagem de Programao para BD - SQL


Operadores Lgicos
Faz o relacionamento entre duas ou mais condies ao mesmo tempo, e realiza testes mltiplos para obter consultas mais elaboradas.

Operador AND OR NOT

Descrio Operador de conjuno Operador de disjuno Operador de negao

Linguagem de Programao para BD - SQL


Exemplos de operadores lgicos:
SELECT * FROM cadfun WHERE (FUNCAO = PROGRAMADOR); (DEPTO = 3) AND

SELECT * FROM cadfun WHERE (DEPTO = 3) OR (DEPTO = 5); SELECT * FROM VENDEDOR); cadfun WHERE NOT (FUNCAO =

Linguagem de Programao para BD - SQL


Operadores Auxiliares
Facilitam a definio de condies a serem utilizadas com os comandos SELECT, UPDATE e DELETE, quando do uso da WHERE.

Operador IS NULL
BETWEEN

Descrio Verifica se um campo vazio


Verifica um valor numa faixa de valores

IN
LIKE

Verifica se um valor existe na tabela


Verifica um valor buscando seus semelhantes

Linguagem de Programao para BD - SQL


Exemplos de operadores auxiliares:
Para este exemplo, vamos inserir um novo campo nas tabelas cadfun e morto para registrar o nmero de filhos de cada funcionrio. Os funcionrios que no tiverem filhos tero nesse campo o valor NULL, uma vez que estar vazio. ALTER TABLE cadfun ADD FILHOS SMALLINT; ALTER TABLE morto ADD FILHOS SMALLINT;

Agora faa uma consulta do campo FILHOS nas duas tabelas.


SELECT NOME, FILHOS FROM cadfun; SELECT NOME, FILHOS FROM morto;

Linguagem de Programao para BD - SQL


Agora precisamos definir o nmero de filhos para alguns funcionrios (no todos, claro). UPDATE cadfun SET FILHOS = 1 WHERE CODFUN = 2;

UPDATE cadfun SET FILHOS = 3 WHERE CODFUN = 3;


UPDATE cadfun SET FILHOS = 2 WHERE CODFUN = 5; UPDATE cadfun SET FILHOS = 1 WHERE CODFUN = 9;

UPDATE cadfun SET FILHOS = 4 WHERE CODFUN = 20;


UPDATE cadfun SET FILHOS = 3 WHERE CODFUN = 25;

Linguagem de Programao para BD - SQL


Faa uma consulta apresentando o cdigo, o nome e o nmero de filhos de todos os funcionrios. SELECT CODFUN, NOME, FILHOS FROM cadfun;

Agora j possvel usar o operador auxiliar IS NULL para visualizar todos os registros que estejam com o campo FILHO sinalizado com NULL. Execute a seguinte linha de instruo:
SELECT CODFUN, FILHOS IS NULL; NOME, FILHOS FROM cadfun WHERE

Consulte nos campos CODFUN, NOME e FILHOS da tabela cadfun os funcionrios que possuem filhos, utilizando o operador lgico NOT. SELECT CODFUN, NOME, FILHOS FROM cadfun WHERE NOT FILHOS IS NULL;

Linguagem de Programao para BD - SQL


BETWEEN SELECT NOME, SALARIO FROM BETWEEN 1700 AND 2000; cadfun WHERE SALARIO

Agora considere a necessidade de apresentar com o operador auxiliar BETWEEN os nomes e salrios dos registros dos funcionrios que ganham abaixo de 1700 e acima de 2000, utilizando em conjunto com o operador lgico NOT. SELECT NOME, SALARIO FROM cadfun WHERE SALARIO NOT BETWEEN 1700 AND 2000;

Linguagem de Programao para BD - SQL


IN O operador IN possibilita fazer a busca de um valor especfico dentro de uma lista de valores definidos, retornando TRUE caso o valor especfico esteja na lista. Os valores da lista devem ser indicados entre apstrofos (). Por exemplo, apresentar uma consulta dos nomes de todos os funcionrios que esto locados no departamento (DEPTO) 2 ou 3: SELECT NOME, (2, 3); DEPTO FROM cadfun WHERE DEPTO IN

Agora faa uma consulta dos nomes de todos os funcionrios que no esto locados nos departamentos 2 e 3.
SELECT NOME, DEPTO FROM cadfun WHERE DEPTO NOT IN (2, 3);

Linguagem de Programao para BD - SQL


LIKE O operador LIKE usado para verificar e comparar sequncias de caracteres dentro de um determinado campo, sendo utilizado com a clusula WHERE. O operador auxiliar LIKE aceita o uso de operadores curinga, aumentando assim sua capacidade de operao. Operadores curinga: % (porcentagem) representa zero, um ou vrios caracteres; e (_) (underline) representa um nico caractere. Veremos agora algumas sugestes de uso dessas referncias:

Linguagem de Programao para BD - SQL

Referncia
WHERE SALARIO LIKE 11%; WHERE SALARIO LIKE %8%; WHERE SALARIO LIKE _0%;

Operao
Encontra valores que comeam com 11. Encontra valores que tenham 8 em qualquer posio. Encontra valores tenham 0 na segunda posio.

WHERE SALARIO LIKE 1_%_%;


WHERE SALARIO LIKE %6;

Encontra valores que comeam com 1 e tenham trs caracteres de comprimento.


Encontra qualquer valor que termine com 6.

WHERE SALARIO LIKE _1%6;

Encontra qualquer valor que tenham 1 na segunda posio e que termine com 6.

Linguagem de Programao para BD - SQL


Faa uma consulta dos registros de todos os funcionrios cujo nome comece com o caractere A. SELECT NOME FROM cadfun WHERE NOME LIKE A%; Faa uma consulta que apresente os nomes de todos os funcionrios que possuam como segunda letra em seus nomes o caractere A.

SELECT NOME FROM cadfun WHERE NOME LIKE _A%;

Faa uma consulta que apresente os nomes de todos os funcionrios que possuam a sequncia de caracteres AN em qualquer posio de seu nome. SELECT NOME FROM cadfun WHERE NOME LIKE %AN%;

Linguagem de Programao para BD - SQL


Faa uma consulta dos campos NOME e SALARIO de todos os funcionrios cujos salrios terminem com o caractere 6.

SELECT NOME, LIKE %6;

SALARIO

FROM

cadfun

WHERE

SALARIO

Faa uma consulta dos campos NOME e SALARIO de todos os funcionrios cujos salrios terminem com o caractere 5 e tenham como segundo caractere do campo o valor 2. SELECT NOME, LIKE _2%5; SALARIO FROM cadfun WHERE SALARIO

Faa uma consulta que apresente os nomes de todos os funcionrios com exceo dos nomes que contenham a sequncia de caracteres SILVA. SELECT NOME %SILVA%; FROM cadfun WHERE NOME NOT LIKE

Linguagem de Programao para BD - SQL

Exerccios de fixao: Pg 107 (SQL Server 2005)

Linguagem de Programao para BD - SQL


Chave estrangeira
uma campo que possui uma constraint de tabela que possibilita estabelecer o relacionamento entre duas tabelas. A chave estrangeira de uma determinada tabela pode ser nomeada igualmente chave primria na tabela referenciada ou pode obter outro nome, no entanto, em ambas as partes, necessrio evidenciar a referncia. Vejamos: ALTER TABLE tabela1 ADD [CONSTRAINT nome_FK] FOREIGN KEY (nome_do_campo_FK) REFERENCES tabela2 (nome_do_campo_PK); Onde: Constraint admite outro nome para o campo da tabela1 que ser chave estrangeira (se no houver constraint, por default ser o nome_do_campo_FK); References d a referncia ao campo que chave primria na tabela2. Construir tabelas Pg.83, 84, 86, 87

Linguagem de Programao para BD - SQL


INDEX

um ndice que serve para prover um acesso rpido aos registros das tabelas. Os valores indexados so armazenados em um objeto do banco de dados em ordem, o que permite ao gerenciador do banco de dados pesquisar primeiro no ndice, para depois buscar na tabela. Deve-se evitar, entretanto, criar muitos ndices para os campos das tabelas, isto porque, quando criamos um ndice estamos criando um novo objeto que manter as informaes indexadas e armazenar a referncia linha fsica da tabela. Se so criados muitos ndices em uma tabela, pode-se prejudicar demasiadamente o desempenho do BD. Porm, se so criados poucos ndices, pode-se prejudicar o desempenho da aplicao.
Algumas dicas para ajud-lo a decidir: a) Chaves Primrias: se o seu BD no cri-las automaticamente, crie. b) Chaves Estrangeiras: Crie.

Linguagem de Programao para BD - SQL


c) Colunas utilizadas frequentemente na clusula WHERE do comando SELECT: crie. d) Colunas com muito contedo NULO (NULL): no crie. e) Colunas com muitos valores iguais: no crie. f) Tabelas muito pequenas: no crie. Naturalmente, sempre que uma consulta ao BD estiver muito lenta, verifique a possibilidade de criar um ndice para facilitar a busca. CREATE [UNIQUE] INDEX nome campo2,..., [ASC | DESC] ); Ou on tabela (campo1,

ALTER TABLE tabela ADD campo2,...,[ASC | DESC]);


Onde:

INDEX

nome

(campo1,

UNIQUE identifica que esse ndice no permite repetio de contedo na chave. Se o ndice no for especificado, admitir repetio;

Linguagem de Programao para BD - SQL


nome nome do objeto que ser criado;
tabela nome da tabela que contm o(s) campo(s); campo lista de campos que compe a chave de indexao. ASC determina que a ordem de indexao ascendente (default, caso no seja definido DESC); DESC determina que a ordem de indexao descendente.

Crie os ndices que sero utilizados nas tabelas de exemplo: CREATE ASC); CREATE ASC); CREATE ASC); INDEX INDEX XIF9cd ON cd (codigo_gravadora ON faixa (codigo_cd

XIF10faixa

INDEX XIF14faixa ON faixa (codigo_musica

Linguagem de Programao para BD - SQL


CREATE INDEX XIF12musica_autor ON musica_autor (codigo_musica ASC);

CREATE INDEX XIF13musica_autor ON musica_autor (codigo_autor ASC);

DROP INDEX

Para excluir um ndice, utilize o seguinte comando:


DROP INDEX nome on table; Inserir registros Pg. 92, 94 e 95

Linguagem de Programao para BD - SQL


Consulte o valor da mdia aritmtica dos salrios recebidos por todos os funcionrio da empresa Virtual Ltda.

SELECT AVG(salario) FROM cadfun;


Consulte a mdia aritmtica dos salrios de todos os funcionrios do departamento 3. SELECT AVG(salario) FROM cadfun WHERE depto = 3; Consulte os funcionrios que se encontram locados no departamento 3. SELECT COUNT(*) FROM cadfun WHERE depto = 3;

Linguagem de Programao para BD - SQL


Consulte os salrios de todos os funcionrio da empresa Virtual Ltda que recebem salrios acima de R$ 2000,00.
SELECT 2000; COUNT(*) FROM cadfun WHERE salario >

Apresente o nmero exato de departamentos ativos na empresa. SELECT COUNT(DISTINCT depto) FROM cadfun; Apresente o valor do maior salrio existente entre todos os funcionrios da empresa. SELECT MAX(salario) FROM cadfun; Apresente o valor do menor salrio existente entre todos os funcionrios da empresa. SELECT nome, MIN(salario) FROM cadfun;

Linguagem de Programao para BD - SQL


Consulte a soma dos salrios a serem pagos mensalmente para os funcionrios da empresa.
SELECT SUM(salario) FROM cadfun; Consulte a soma dos salrios a serem pagos a todos os funcionrios do departamento 2. SELECT SUM(salario) FROM cadfun WHERE depto = 2; Funes de Data e Hora do MySQL So ferramentas usadas para obter acesso a vrias caractersticas de tempo disponibilizadas no gerenciamento de BD relacional. Alguns exemplos de funes do MySQL: DATE_ADD() adiciona um determinado nmero de dias a uma data especificada.

Linguagem de Programao para BD - SQL


Apresente o valor da data acrescido de cinco dias a uma data informada.
SELECT DATE_ADD('2008-01-15', INTERVAL 31 DAY); DATEDIFF() apresenta a diferena de dias entre duas datas fornecidas. Exemplo: Apresente o tempo em dias de trabalho na empresa dos funcionrios cadastrados cuja data de admisso for at o dia 15/09/2006. SELECT nome, FROM cadfun; DATEDIFF(admissao, 2006-09-15)

MONTHNAME() retorna o nome do ms de uma data. Exemplo:


Apresente os meses de admisso de cada funcionrio da empresa.

Linguagem de Programao para BD - SQL


SELECT nome, MONTHNAME(admissao) FROM cadfun; Funes: DAY(), MONTH() e YEAR() retornam, respectivamente, dia, ms e ano de uma data fornecida. Exemplo: Apresente o dia, o ms e o ano de admisso de cada um dos funcionrios.

SELECT NOME, DAY(admissao), MONTH(admissao), YEAR(admissao) FROM cadfun;

CURDATE() retorna o valor da data atual do sistema (data atual do computador). SELECT CURDATE();

Linguagem de Programao para BD - SQL


Funes Numricas do MySQL
As funes numricas ou matemticas so as ferramentas que possibilitam respostas matemticas para alguns problemas. ABS(X) retorna o valor absoluto de X. Exemplo: SELECT ABS(-32); SIGN(X) retorna o sinal como -1, 0, ou 1, dependendo se X for negativo, zero, ou positivo. exemplo:

SELECT SIGN(-32);
SELECT SIGN(0); SELECT SIGN(234);

MOD(N,M), % Mdulo (como o operador % em C). Retorna o resto de N dividido por M. Exemplo:

Linguagem de Programao para BD - SQL


SELECT MOD(29, 9);
SELECT 29 % 9; SELECT 29 MOD 9; FLOOR(X) retorna o maior valor inteiro no maior que X. Exemplo: SELECT FLOOR(1.23); SELECT FLOOR(-1.23); CEILING(X), CEIL(X) retorna o menor valor inteiro acima de X. Exemplo: SELECT CEILING(1.23); SELECT CEIL(-1.23); DIV retorna o valor do quociente, desprezando o resto. Exemplo: SELECT 5 DIV 2;

Linguagem de Programao para BD - SQL


POW(X,Y), POWER(X,Y) retorna o valor de X elevado a potncia de Y. Exemplo:
SELECT POW(4,2); SQRT(X) retorna o a raiz quadrada no negativa de X. Exemplo: SELECT SQRT(25); PI() retorna o valor de PI. A quantidade de nmeros decimais padro 5, mas o MySQL usa internamente a preciso dupla completa para PI:

SELECT PI();
COS(X) retorna o cosseno de X. Exemplo: SELECT COS(1); SIN(X) retorna o seno de X. Exemplo: SELECT SIN(1); TAN(X) retorna a tangente de X. Exemplo: SELECT TAN(1);

Linguagem de Programao para BD - SQL


POSITION/INSTR retorna a posio do caractere solicitado, referente aos caracteres demonstrados. Exemplo:
SELECT POSITION(Ru IN Renato Russo) BUSCA DUAL; SELECT INSTR(Renato Russo,Ru) BUSCA FROM FROM DUAL;

CHARACTER_LENGTH retorna o nmero de caracteres referentes aos caracteres demonstrados. Exemplo: SELECT DUAL; CHARACTER_LENGTH('Renato Russo') TAM FROM

SELECT nome_autor, CHARACTER_LENGTH(nome_autor) from autor where codigo_autor='1;


UPPER/LOWER retorna em caracteres maisculos o string informado. Exemplo: SELECT * FROM 'RENATO%'; SELECT * FROM 'renato%'; AUTOR AUTOR WHERE WHERE UPPER(NOME_AUTOR) LOWER(NOME_AUTOR) LIKE LIKE

Linguagem de Programao para BD - SQL


SUBSTRING retorna uma parte de uma cadeia de caracteres. Exemplo: SELECT SUBSTRING(nome_autor FROM 1 FOR 3) RES, nome_autor FROM AUTOR WHERE nome_autor LIKE R%; SUBSTRING(cadeia_origem FROM nmero_caractere) TABELA(ALIAS), ... Onde:

posio_incio

FOR

Outras funes do MySQL:


http://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html#function_adddate

Linguagem de Programao para BD - SQL


Pesquisa em mltiplas tabelas
At o momento vimos como realizar pesquisas em uma nica tabela. Agora aprenderemos a vincular informaes de vrias tabelas ao mesmo tempo. Chamamos esta forma de busca (pesquisa) de unio de tabelas (join). A unio entre as Entidades (tabelas) se d por meio de campos contendo chaves primrias e estrangeiras em comum. Para realizar a unio de tabelas, basta acrescentarmos, aps a clusula FROM do comando SELECT, as tabelas que queremos unir. Devemos colocar na clusula WHERE a condio de unio das tabelas, ou seja, as respectivas chaves primria e estrangeira. Veja a sintaxe: SELECT [tabela1.coluna], [tabela1.coluna] [...] FROM tabela1, tabela2 [...] WHERE [tabela1.coluna(PK)] = [tabela2.coluna(FK)];

Unio regular (inner join ou equi-join)

Linguagem de Programao para BD - SQL


Denomina-se unio regular as unies que tm a clusula WHERE unindo a chave primria estrangeira das tabelas afetadas pelo comando SELECT. Exemplo: SELECT cd.codigo_cd, cd.nome_cd, gravadora.nome_gravadora FROM cd, gravadora WHERE cd.codigo_gravadora = gravadora.codigo_gravadora; Outras duas maneiras definidas no padro SQL para realizar esse tipo de unio de tabelas determinar qual(is) coluna(s) utilizar na unio (clusula USING) e, caso o nome das colunas no seja igual, determinar quais so as colunas com a clusula ON. Todos os comandos produzem o mesmo efeito. Vejamos: SELECT cd.codigo_cd, cd.nome_cd, gravadora.nome_gravadora FROM cd JOIN gravadora USING (codigo_gravadora); SELECT cd.nome_cd, gravadora.nome_gravadora FROM cd JOIN gravadora ON cd.codigo_gravadora = gravadora.codigo_gravadora;

Linguagem de Programao para BD - SQL

Apelido em tabelas Para evitar que o comando fique extremamente extenso, possvel atribuir apelidos s tabelas utilizadas no comando SELECT. Devemos fazer isso, colocando o apelido aps o nome da tabela na clusula FROM. Dessa forma, o seguinte comando teria o mesmo efeito do comando anterior: SELECT a.codigo_cd, a.nome_cd, b.nome_gravadora FROM cd a, gravadora b WHERE a.codigo_gravadora = b.codigo_gravadora;

Linguagem de Programao para BD - SQL


Unio de mais de duas tabelas Frequentemente necessrio unir mais de duas tabelas para fornecer uma informao relevante do banco de dados. No nosso caso, suponha que queiramos saber o nome das msicas, a faixa e o nome do CD em que est a msica. Para isso ser necessrio usar trs tabelas para chegar a essa informao: cd, faixa e musica. Vejamos: SELECT a.nome_cd, b.numero_faixa, c.nome_musica FROM cd a, faixa b, musica c WHERE a.codigo_cd = b.codigo_cd AND b.codigo_musica = c.codigo_musica;

Linguagem de Programao para BD - SQL


Unio de tabelas sem colunas em comum (non-equijoin) Existem situaes em que, mesmo no havendo um relacionamento explcito entre colunas de tabelas, h relacionamento de uma coluna com o intervalo de outras colunas em outra tabela. Veja, por exemplo, a tabela cd_categoria; nela temos a menor e a maior faixa de preos de CD dividida por categoria. Como temos o preo dos CDs na tabela cd, fica claro que podemos definir a qual categoria pertence cada um dos CDs realizando uma busca nessas tabelas. Esse tipo de relacionamento no definido por uma igualdade (=), e sim por um intervalo (BETWEEN). Para no gerar mais de uma linha para cada CD, certifique-se de que as faixas estejam bem definidas (cd_categoria). Caso haja a possibilidade de um nico CD estar em duas faixas (preo maior e de uma faixa coincidir com o preo menor da prxima faixa), ele ser mostrado duas vezes. Veja como fica o comando para checar as categorias de preos dos CDs: SELECT a.nome_cd, a.preco_venda, b.codigo_categoria FROM cd a, cd_categoria b WHERE a.preco_venda BETWEEN b.menor_preco AND b.maior_preco;

Linguagem de Programao para BD - SQL


Aplicao pgs. 149 a 171 SQL Server 2005. Pgs. 148, 154, 155, 158 SQL novatec Visualizao de dados em tabelas virtuais O recurso de visualizao de dados til quando h necessidade de fazer determinadas consultas com frequncia, ou seja, uma forma eficiente de deixar definidas as consultas que sero usadas como relatrios e que ocorrem sempre com grande frequncia. As vises podem ocorrer a partir de uma nica tabela, de mltiplas tabelas ou mesmo a partir de outras vises j constituda. Veja a sintaxe: CREATE VIEW <TABELA VIRTUAL> AS <consulta> [;]

Linguagem de Programao para BD - SQL


CREATE VIEW VISAO1 AS SELECT NOME, DEPTO, SALARIO FROM CADFUN;

Imagine ter uma viso definida para apresentar os ttulos em atraso a partir da data de 31/12/2005. CREATE VIEW VISAO2 AS SELECT cliente.nome AS CLIENTE, COUNT(*) AS VENCIDOS FROM cliente, venda where cliente.codcli = venda.codcli and vencto <=2005-12-31 group by cliente.nome

Pgs. 175, 176 e 177.

Faa uma tabela virtual contendo os nomes dos Cds, o preo de venda, o nome da gravadora, o nome e a durao de cada msica:

Linguagem de Programao para BD - SQL


CREATE VIEW Lista as select cd.nome_cd as CD, cd.preco_venda as Valor, gravadora.nome_gravadora as Gravadora, musica.nome_musica as Musica, musica.duracao as Tempo from cd, gravadora, faixa, musica
WHERE cd.codigo_gravadora = gravadora.codigo_gravadora and cd.codigo_cd = faixa.codigo_cd and musica.codigo_musica = faixa.codigo_musica order by cd.nome_cd

Linguagem de Programao para BD - SQL

Bibliografia:
SQL: Curso Prtico, Celso H. Poderoso de Oliveira, Ed. Novatec, 272 pg; Microsoft SQL Server 2005 Express Edition: Interativo: Guia Bsico, Jos Augusto Navarro Garcia Manzano, Ed. rica, 224pg.

Vous aimerez peut-être aussi