Beruflich Dokumente
Kultur Dokumente
O preguioso deseja, e coisa nenhuma alcana; mas o desejo do diligente ser satisfeito.
Provrbios 13.4
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.
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.
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.
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.
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.
* Banco de dados, ento, um conjunto de tabelas, as quais podem estar ou no relacionadas entre si.
Data Control Language (DCL): prov a segurana interna do BD. Comandos DCL: CREATE USER ALTER USER GRANT REVOKE CREATE SCHEMA
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.
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.
Criao de Tabelas:
CREATE TABLE <tabela> (<campo> <tipo dado campo> [NULL/NOT NULL] [PRIMARY KEY] ) [;] do
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.
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) );
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,
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);
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;
O comando SELECT faz a apresentao dos dados e o comando FROM indica de que tabela a apresentao ser feita.
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
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.
SET
<campo>
<expresso>
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;
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.
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.
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;
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
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;
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.
Obs.: No comando SELECT definido aps o comando INSERT INTO, podemos tambm substituir os nomes dos campos por asterstico, agilizando a transferncia dos dados.
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.
Operador + -
Multiplicao
Diviso
*
/
Resto da diviso
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;
Operador
> < = <> Ou != >= <= <=>
Descrio
Maior que Menor que Igual a Diferente de Maior ou igual a Menor ou igual a Igual para NULL
SELECT * FROM cadfun WHERE (DEPTO = 3) OR (DEPTO = 5); SELECT * FROM VENDEDOR); cadfun WHERE NOT (FUNCAO =
Operador IS NULL
BETWEEN
IN
LIKE
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;
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;
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);
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.
Encontra qualquer valor que tenham 1 na segunda posio e que termine com 6.
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%;
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
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.
INDEX
nome
(campo1,
UNIQUE identifica que esse ndice no permite repetio de contedo na chave. Se o ndice no for especificado, admitir repetio;
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
DROP INDEX
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;
CURDATE() retorna o valor da data atual do sistema (data atual do computador). SELECT CURDATE();
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:
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);
CHARACTER_LENGTH retorna o nmero de caracteres referentes aos caracteres demonstrados. Exemplo: SELECT DUAL; CHARACTER_LENGTH('Renato Russo') TAM FROM
posio_incio
FOR
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;
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
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:
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.