IFSP Campus Presidente Epitácio BND Banco de Dados Professora: Márcia Jani 1.1 Apresentação: Márcia Jani
padrão para o acesso a SGBDs relacionais base: álgebra relacional + cálculo relacional de tupla compreende: DDL (Data Definition Language ) DML (Data Manipulation Language ) Visões - Restrições de Integridade Especificação de Transações 1.2 Prof.ª Márcia Jani Cícero
DDL (Data( Definition Language) Comandos para definição de esquemas: bancos de dados tabelas índices Criação/Remoção de um banco de dados Create / Drop database nome_bd exemplo: criação de um BD para um domínio hospitalar Create database Hospital 1.3 Prof.ª Márcia Jani Cícero
Criação de uma tabela Create table nome_tabela ( nome_atributo 1 tipo 1 [[NOT] NULL][UNIQUE] [{, nome_atributo n tipo n}] n [, primary key (nome(s( nome(s)_ )_atributo(s))])] [{, foreign key (nome_atributo( nome_atributo) references nome_tabela}] ) exemplo: criação da tabela Ambulatórios Create table Ambulatorios ( nroa int, andar numeric(3) NOT NULL, capacidade smallint, primary key (nroa( nroa) ) ) 1.4 Prof.ª Márcia Jani Cícero
Exemplos de Criação de tabelas CREATE TABLE departamento ( numerodepto int(10) unsigned NOT NULL auto_increment, nomedepto varchar(45) ) NOT NULL, matricula int(10) unsigned NOT NULL, datainicio datetime NOT NULL, PRIMARY KEY (numerodepto( numerodepto) ) ENGINE=InnoDB DEFAULT CHARSET=latin1; A criação de tabelas deve respeitar a seguinte seqüencia: nome do campo, tipo, nulidade do campo. Deve-se definir também o campo que será a chave-primária e em seguida a chave-estrangeira. 1.5 Prof.ª Márcia Jani Cícero
criar as seguintes tabelas: Medicos: codm (int), nome (varchar(40)) (não nulo), idade (tinyint) (não nulo), especialidade (char(20)), RG (numeric(10)) (único( único), cidade (varchar(30)), nroa (int) Observação: : definição de chave estrangeira na tabela Medicos: foreign key (nroa( nroa) ) references Ambulatorios(nroa) Pacientes: : codp (int) (sem( sinal), nome (varchar(40)) (não nulo), idade (tinyint) (não nulo), cidade (char(30)), RG (numeric(10)) (único), problema (varchar(40)) (não nulo) 1.6 Prof.ª Márcia Jani Cícero
criar as seguintes tabelas: Consultas: : codm (int), codp (int), data (datetime), hora (datetime) Observação: codm e codp são chaves estrangeiras para as tabelas Medicos e Pacientes, respectivamente (definir!) Um campo unsigned é um campo sem sinal e tem um valor máximo positivo maior que um com sinal. Por ex., se para um campo com 2 bytes, se o campo for unsigned, ele pode valer de 0 a 65.535; se tiver sinal, poderá valer de -32.768 até 32.767. Portanto, se o valor máximo de seu campo for 40.000, você vai precisar de no mínimo 2 bytes, se defini-lo como unsigned; ou 3 bytes, caso contrário. 1.7 Prof.ª Márcia Jani Cícero
Alteração de uma tabela Alter table nome_tabela add [column] nome_atributo 1 tipo 1 [{, nome_atributo n tipo n }] drop column nome_atributo 1 [{, nome_atributo n }] exemplo: inclusão/exclusão do atributo temposerviço na tabela Medicos alter table Medicos add temposerviço smallint alter table Medicos drop column temposerviço observação: não podem ser removidos atributos que formam a chave primária de uma tabela ou que estão indexados 1.8 Prof.ª Márcia Jani Cícero
Remoção de uma tabela Drop table nome_tabela Criação de índices sobre atributos de uma tabela Create [unique] index nome_índice on [nome_tabela nome_visão] ] (nome_atributo( 1 [{, nome_atributo n }]) exemplo: criação de um índice para o atributo RG na tabela Pacientes Create unique index indpac_rg on Pacientes (RG( RG) 1.9 Prof.ª Márcia Jani Cícero
Remoção de indices Drop index nome_índice on nome_tabela exemplo: drop index indpac_rg on Pacientes observação: drop index Pacientes.indPac_RG (SQL Server) Criar os seguintes índices: Medicos: RG (unique) e nroa Pacientes: RG (unique) e problema 1.10 Prof.ª Márcia Jani Cícero
DML (Data( Manipulation Language) manipulação de conjuntos não-procedural (especifica-se o que fazer e não o como fazer) Atualização do BD Inclusão de tuplas insert into nome_tabela [(lista_atributos lista_atributos)] values (lista_valores) exemplo: inclusão do ambulatório 1 insert into Ambulatorios values (1,( 1, 30) 1.11 Prof.ª Márcia Jani Cícero
observação: valores nulos podem ser inseridos em atributos, desde que os mesmos não façam parte da chave primária da tabela ou violem alguma RI (integridade referencial) exemplo: inclusão do médico Carlos insert into Medicos (codm, nome, idade, especialidade, RG, cidade) ) values (4,( Carlos, 28, ortopedia, 1100011000, Joinville ); povoar as tabelas 1.12 Prof.ª Márcia Jani Cícero
Alteração de tuplas update nome_tabela set nome_atributo 1 = Valor [{, nome_atributo n = Valor}] [where condição] exemplo: o ambulatório 2 aumentou sua capacidade em 5 leitos update Ambulatorios set capacidade = capacidade + 5 where nroa = 2 1.13 Prof.ª Márcia Jani Cícero
Alterar: 1. a médica Maria reside agora em Itajaí 2. a consulta do médico 1 com o paciente 4 passou para às 12:00 horas do dia 15 de Maio de 2003 3. a paciente Ana fez aniversário e seu problema agora é tendinite 4. a consulta do médico 3 com o paciente 4 passou para uma hora e meia depois (somar 1:30 ) 1.14 Prof.ª Márcia Jani Cícero
Exclusão de tuplas 1. delete from nome_tabela [where condição] 2. exemplo: o ambulatório 5 foi desativado 1. delete from Ambulatorios where nroa = 5 3. excluir: 1. consultas após as 19 horas 2. pacientes com câncer e cuja idade seja inferior a 10 anos 3. médicos que residem em Biguaçu ou Palhoça 1.15 Prof.ª Márcia Jani Cícero
Linguagem de Consulta (Query( Language) estrutura básica: select lista_atributos from lista_tabelas [where condição] tradução para a álgebra relacional: select a1, a2,,..., an from r1, r2,,..., rn π a1,a2,..., an (σ( c ( r1 X r2 X... X rn) ) ) where c 1.16 Prof.ª Márcia Jani Cícero
Exemplos: buscar os todos os dados de todos os médicos no BD select codm, nome, idade, especialidade, RG, cidade, nroa from Medicos OU select * from Medicos buscar o nome dos médicos ortopedistas select nome from Medicos where especialidade = ortopedia operadores lógicos: and, or e not operadores de comparação: >, > =, <, < =, =, < >,!= 1.17 Prof.ª Márcia Jani Cícero
Comando SELECT cláusula DISTINCT elimina duplicatas no resultado da consulta (tabela( coleção) exemplo: quais são as especialidades dos médicos? select distinct especialidade from Medicos consultar (testar com e sem a cláusula distinct distinct ): a) quais são as datas das consultas marcadas para horários antes das 13hs? b) de quais cidades vêm os pacientes? c) em quais andares existem ambulatórios? 1.18 Prof.ª Márcia Jani Cícero
Comando SELECT Retorno de valores calculados uso de operações aritméticas em uma consulta (+, -, *, / ) exemplo: quantos grupos de 5 leitos podem ser formados nos ambulatórios? select nroa, capacidade / 5 from Ambulatorios observação: uma coluna pode ser renomeada no resultado de uma consulta da seguinte forma: nome_atributo as novo_nome exemplo: select nroa, capacidade / 5 as grupos5 from Ambulatorios assemelha-se a ρ(nome_atributo)( )(nome_relação)) na álgebra relacional (vantagem da SQL: : permite renomear um subconjunto de atributos) 1.19 Prof.ª Márcia Jani Cícero
Funções de agregação aplicam-se sobre uma coleção de tuplas, tendo como parâmetro um nome de atributo da tabela (exceção: função Count(*)) não podem ser combinados com nomes de atributos no resultado da consulta (são informações calculadas a partir de um conjunto de valores e não tem relação com uma tupla particular de uma tabela) úteis na determinação de algumas informações derivadas dos dados das tabelas: totais, médias aritméticas, somas, valor máximo e valor mínimo observação: criar a tabela Funcionarios: codf (int), nome (varchar(40)) (não nulo), idade (tinyint) (não nulo), RG (numeric(10)) (único), salário (numeric(8,2)), departamento (varchar(30)); e povoá-la com as seguintes tuplas: 1.20 Prof.ª Márcia Jani Cícero
Funções de agregação existem 5 funções de agregação: Count, Sum, Avg, Max e Min. com exceção da função Count, todas as demais funções exigem domínios numéricos para o atributo utilizado como parâmetro Count: contador de ocorrências Count(*): retorna o total de tuplas de uma tabela Count(nome_atributo nome_atributo): retorna o total de tuplas que possuem valor no atributo especificado em nome_atributo 1.21 Prof.ª Márcia Jani Cícero
Funções de agregação exemplos: total de médicos ortopedistas select count (*) as TotalOrtopedistas from Medicos where especialidade = ortopedia ortopedia quantos médicos ortopedistas atendem em ambulatórios? select count (nroa( nroa) ) (não conta nulos!) from Medicos where especialidade = ortopedia ortopedia Sum: somador de valores de atributos exemplo: capacidade total dos ambulatórios do 1o andar select sum (capacidade( capacidade) ) from Ambulatorios where andar = 1 1.22 Prof.ª Márcia Jani Cícero
Funções de agregação exemplos: exemplos: Avg: média aritmética de valores de atributos exemplo: média de idade dos pacientes de Fpolis exemplo: média de idade dos pacientes de Fpolis select avg (idade) from Pacientes where cidade = Fpolis Max / Min: maior / menor valores de um atributo exemplo: maior e menor salários pagos aos funcionários select max (salario), min (salario( salario) ) from Funcionarios 1.23 Prof.ª Márcia Jani Cícero
Funções de agregação Exercício: qual a média salarial dos empregados do departamento pessoal? qual o horário mais tarde das consultas do dia 13 de Maio de 2003? qual é a capacidade do ambulatário que possui menor capacidade? quantos pacientes de Fpolis são maiores de 21 anos? quanto se gasta com pagamento de funcionários e qual o número de funcionários? qual é a média de idade dos médicos e o total de ambulatórios atendidos por eles? 1.24 Prof.ª Márcia Jani Cícero
Cláusula WHERE Cláusula [NOT] LIKE definição de padrões de busca padrões possíveis: LIKE s% o valor inicia com o string s LIKE %s o valor termina o string s LIKE %s% o valor possui o string s na sua cadeia de caracteres em qualquer posição convenções utilizadas: % : substitui um string de zero ou mais caracteres _ : substitui um único caractere [a-f] : qualquer caractere dentro do intervalo [^a-f] : qualquer caractere que não estiver dentro do intervalo 1.25 Prof.ª Márcia Jani Cícero
Exemplos buscar o nome e o RG dos funcionários que iniciam com a letra "M" select nome, RG from Funcionarios where nome like M% buscar o nome dos funcionários cujo RG termina com 20000 ou 30000 select nome, RG from Funcionarios where RG like '%[2-3]0000' consultar: nomes e RGs dos médicos com inicial de A a M nomes dos pacientes cujo RG inicia com 2 e termina com 20000 nomes de funcionários que não recebem salários na faixa dos R$ 1000.00 (salários entre 1000.00 e 1999.99) Cláusula IS [NOT] NULL testa valores nulos de atributos exemplo: buscar os códigos e nomes de médicos que não dão atendimento em ambulatórios select codm, nome from Medicos where nroa is null 1.26 Prof.ª Márcia Jani Cícero
Cláusula [NOT] BETWEEN valor1 AND valor2 busca de atributos cujos valores encontram-se em um intervalo desejado válido para atributos com domínios ordinais exemplo: buscar os dados das consultas marcadas entre 14hs e18hs. select from Consultas where hora between 14:00 and 18:00 consultar: número dos ambulatórios com capacidade entre 30 e 50 leitos nome, RG e problema dos pacientes cuja inicial do nome está entre L e Z 1.27 Prof.ª Márcia Jani Cícero
Cláusula UNION permite a união de 2 tabelas (compatíveis) exemplo: buscar o nome de todas as cidades cadastradas no BD select cidade from Medicos union select cidade from Pacientes consultar: nome, RG e idade dos médicos, pacientes e funcionários do hospital que sejam maiores de 30 anos 1.28 Prof.ª Márcia Jani Cícero
Pesquisa em Múltiplas tabelas Para realizarmos a união de tabela, basta acrescentarmos após a clausula FROM do comando SELECT as tabelas que queremos unir. Devemos colocar na claúsula WHERE a condição de união das tabelas, ou seja, as chaves primárias e estrangeiras. Sintaxe: Select [tabela1.]coluna [,tabela2.]coluna,...] from tabela1,tabela2,... where tabela1.chave_primaria = tabela2.chave_estrangeira 1.29 Prof.ª Márcia Jani Cícero
Produto Cartesiano Ocorrerá o produto cartesiano sempre que: A condição de união entre as tabelas for omitida(não houver claúsula WHERE). A condição de união entre as tabelas for inválida (Claúsula WHERE incorreta). Todas as linhas da primeira tabela estiverem unidas a todas as linhas da segunda tabela. 1.30 Prof.ª Márcia Jani Cícero
Veja o que acontece quando ocorre o produto cartesiano: Select cd.codigo_cd, cd.nome_cd, gravadora.nome_gravadora from cd,gravadora Como existem 04 linhas em Gravadora e 7 em CD, chega-se a um total de 28 linhas(7x4) na nossa busca. Como se nota existe uma linha de CD para cada GRAVADORA 1.31 Prof.ª Márcia Jani Cícero
1.32 Prof.ª Márcia Jani Cícero
Consultas envolvendo relacionamentos entre tabelas na cláusula From pode-se especificar uma lista de tabelas produto cartesiano implícito exemplo: buscar o nome dos médicos com consulta marcada para o dia 15 de Maio de 2003 select nome from Médicos, Consultas where data = 05/15/03 and Médicos.codm = Consultas.codm variáveis de tupla podem ser associadas a cada tabela declarada na cláusula From equivale a r novo_nome_relação(nome_relação nome_relação) ) na álgebra relacional select f1.nome from Funcionários f1, Funcionários f2 where f2.nome = Marcelo and f1.salário > f2.salário consultar: nomes dos pacientes com consulta marcada para horários após às 14 hs. nomes dos médicos que dão atendimento em ambulatórios com capacidade inferior a 50 leitos nome e idade dos médicos que têm consulta com a paciente Ana nomes, RGs e idade dos pacientes que têm consultas marcadas com ortopedistas sempre para dias anteriores ao dia 16 1.33 Prof.ª Márcia Jani Cícero
Join é a ligação que fazemos entre duas tabelas na pesquisa de dados, necessariamente deve existir em um join a chave primaria fazendo relação com uma chave estrangeira, esta é a condição e ligação. 1.34 Prof.ª Márcia Jani Cícero
União Regular (inner join ou equi-join) Denomina-se união regular as uniões que tem a claúsula WHERE unindo a chave primária e chave estrangeira. Select cd.codigo_cd, cd.nome_cd, gravadora.nome_gravadora from cd,gravadora where cd.codigo_gravadora = gravadora.codigo_gravadora Quando a chave primária e a chave estrangeira tem o mesmo nome em ambas as tabelas Select cd.codigo_cd, cd.nome_cd, gravadora.nome_gravadora from cd natural join gravadora ou Select cd.codigo_cd, cd.nome_cd, gravadora.nome_gravadora from cd join gravadora using(codigo_gravadora); ou Select cd.codigo_cd, cd.nome_cd, gravadora.nome_gravadora from cd join gravadora on cd.codigo_gravadora = gravadora.codigo_gravadora; 1.35 Prof.ª Márcia Jani Cícero
Existem apenas 07 linhas( o maior n.º de linhas entre as duas tabelas relacionadas 1.36 Prof.ª Márcia Jani Cícero
Inner Join Junção de 2 tabelas através da satisfação de um ou mais predicados entre atributos de cada uma das tabelas (junção tradicional da álgebra) sintaxe: select lista_atributos from nome_tabela1 [inner] join nome_tabela2 on nome_tabela1.nome_atributo1 predicado nome_tabela2.nome_atributo2 [{and/or nome_tabela1.nome_atributo n predicado nome_tabela2.nome_atributo n}] n exemplo: buscar o nome dos médicos com consulta marcada para o dia 13 de maio de 2003 select nome from Médicos inner join Consultas on Médicos.codm = Consultas.codm where data = 05/13/02 observação: o SQL padrão define uma cláusula de junção natural (natual join). Consultar, utilizando inner join: a) nome e RG dos médicos que também são funcionários do hospital b) número e andar dos ambulatórios utilizados por médicos ortopedistas c) nome e RG dos pacientes que têm consultas marcadas entre os dias 14 e 16 de Maio de 2003 d) nome e cidade dos pacientes que têm consultas marcadas com médicos ortopedistas 1.37 Prof.ª Márcia Jani Cícero
Apelidos em tabelas É possível atribuir apelidos às tabelas para diminuir as consultas no select Select a.codigo_cd, a.nome_cd, b.nome_gravadora from cd a,gravadora b where a.codigo_gravadora = b.codigo_gravadora 1.38 Prof.ª Márcia Jani Cícero
União de mais de duas tabelas Saber o nome das músicas, a faixa e o nome do CD em que está a música. Verificar somente os CDs com código 1 ou 2. Select a.nome_cd, b.numero_faixa, c.nome_musica from cd a,faixa b, musica c where a.codigo_cd in(1,2) and a.codigo_cd = b.codigo_cd and b.codigo_musica = c.codigo_musica; Ou Select a.nome_cd, b.numero_faixa, c.nome_musica from cd a natural join faixa b natural join musica c where a.codigo_cd in(1,2); 1.39 Prof.ª Márcia Jani Cícero
1.40 Prof.ª Márcia Jani Cícero
Outer Join sintaxe: select lista_atributos from nome_tabela1 left right full join nome_tabela2 on nome_tabela1.nome_atributo1 predicado nome_tabela2.nome_atributo2 [{and/or nome_tabela1.nome_atributo n predicado nome_tabela2.nome_atributo n}] n consultar: os dados de todos os pacientes e, para aqueles pacientes com consultas marcadas, exibir os dados das suas consultas os números de todos os ambulatórios e, para aqueles ambulatórios onde médicos dão atendimento, exibir também os seus códigos e nomes os nomes e RGs de todos os médicos e os dados de todos as ambulatórios, mostrando os relacionamentos entre médicos e ambulatórios que eles atendem, quando existirem 1.41 Prof.ª Márcia Jani Cícero
Left Join União externa à esquerda A união pela esquerda incluirá linhas da primeira tabela na expressão de união. O left join irá fazer a junção das duas tabelas dando preferência aos registros da tabela CD (é que está na cláusula from por isso está na esquerda). Assim, todos os registros da tabela CD serão mostrados, independente de haver correspondência na tabela GRAVADORA. Quando não houver correspondência na tabela GRAVADORA, será mostrado o valor NULL ou nulo. Sintaxe: tabela 01 left join tabela 02 Exemplo: Select a.codigo_cd,a.nome_cd,b.codigo_gravadora,b.nome_gravadora from cd a left join gravadora b; 1.42 Prof.ª Márcia Jani Cícero
Left Join 1.43 Prof.ª Márcia Jani Cícero
Right Join União externa à direita A união pela direita, ou seja, as linhas da segunda tabela serão incluídas na busca, mesmo sem haver coluna correspondente na primeira tabela. Sintaxe: tabela 01 right join tabela 02 Exemplo: Select a.codigo_cd,a.nome_cd,b.codigo_gravadora,b.nome_gravadora from cd a right join gravadora b; 1.44 Prof.ª Márcia Jani Cícero
Right Join 1.45 Prof.ª Márcia Jani Cícero
Full Outer Join União externa total Realiza a união, independente de a coluna estar à direita ou à esquerda. tabela 01 full outer join tabela 02 Exemplo: Select a.codigo_cd,a.nome_cd,b.codigo_gravadora,b.nome_gravadora from cd a full outer join gravadora b; 1.46 Prof.ª Márcia Jani Cícero
Self Join União de tabela com ela mesma (Auto Relacionamento) Coloca-se duas vezes o nome da tabela, mas com apelidos diferentes. Select a.codigo_cd, a.nome_cd, a.cd_indicado, b.nome_cd from cd a, cd b where a.cd_indicado = b.codigo_cd 1.47 Prof.ª Márcia Jani Cícero
Self Join 1.48 Prof.ª Márcia Jani Cícero