Banco de Dados - Senado Structured Query Language (SQL) Material preparado :Prof. Marcio Vitorino
Ambiente Simplificado de um SGBD 2
Características dos SGBDs Natureza auto-contida de um sistema de banco de dados: q metadados armazenados num catálogo ou dicionário de dados. Independência entre programas e dados: q estrutura dos arquivos de dados armazenada no catálogo separadamente dos programas de acesso. Abstração de dados: q representação conceitual dos dados através de modelos de dados. Suporte de múltiplas visões de dados: q diferentes perspectivas ou visões de usuários. Suporte a transações: q compartilhamento de dados e processamento multiusuário. 3
Esquemas, Instâncias e Estado do BD Esquema: descrição do banco de dados. É definido durante o projeto de banco de dados e não se espera que seja alterado frequentemente. Estado ou Instância: composto pelos dados do banco de dados em um determinado momento. 4
Arquitetura de Três-Esquemas 5
Arquitetura de Três-Esquemas Tem por objetivo separar o usuário da aplicação do banco de dados físico. É organizada em três níveis: q Nível Interno: descreve a estrutura de armazenamento físico do banco de dados. q Nível Conceitual: descreve a estrutura de todo o banco de dados para a comunidade de usuários. q Nível Externo ou Visão: cada esquema externo descreve a parte do banco de dados que um dado grupo de usuários tem interesse e oculta o restante do banco de dados desse grupo. A maioria dos SGBDs não separa completamente os níveis, mas suporta essa arquitetura de alguma forma. 6
Independência de Dados Consiste da capacidade de mudar o esquema em um nível do sistema de banco de dados sem que ocorram alterações do esquema no próximo nível mais alto. Independência lógica de dados: é a capacidade de alterar o esquema conceitual sem mudar o esquema externo ou os programas. Independência física de dados: é a capacidade de alterar o esquema interno sem mudar o esquema conceitual. 7
Linguagens de SGBD Durante o desenvolvimento do sistema R, pesquisadores da IBM desenvolveram a linguagem SEQUEL, primeira linguagem de acesso para Sistemas Gerenciadores de Banco de Dados Relacionais. ISO e ANSI lançou em 1986 a primeira versão do padrão da linguagem SQL, o SQL-86. A linguagem passou por aperfeiçoamentos em 1989 e, em 1992, foi lançada a SQL-92 ou SQL2. Um novo padrão, chamado de SQL-99 ou SQL3 foi lançado no ano de 2000. Foi o primeiro padrão a estender a linguagem para permitir a utilização de tipos de dados complexos e a incorporar características da orientação a objetos. Após uma grande revisão do padrão SQL3 foi lançada a SQL:2003. Nesta verão foi adicionada uma nova parte ligada ao tratamento de XML. 8
Linguagens de SGBD Linguagem de Definição de Dados (DDL): q usada para especificar o esquema conceitual. Linguagem de Definição de Armazenamento (SDL): q usada para especificar o esquema interno, mas na maioria dos SGBDs a DDL é usada para definir este esquema. Linguagem de Definição de Visões (VDL): q usada para especificar as visões dos usuários e os seus mapeamentos para o esquema conceitual, mas na maioria dos SGBDs a DDL é usada para definir ambos os esquemas, o conceitual e o externo. Linguagem de Manipulação de Dados (DML): q usada para manipular os dados em um banco de dados. As manipulações típicas são a recuperação, inserção, remoção e modificação dos dados. 9
Tipos de Dados (4 GB) (4 GB) 10
Modelo Utilizado 11
Modelo Utilizado Pessoa (CPF, Nome, Sexo) Piloto (CPF, Cart_Trab) CPF Referencia Pessoa Passageiro(CPF, Dieta) CPF Referencia Pessoa Voo(Numero, Data, P_CPF) CPF Referencia Piloto Reserva(V_Numero, P_CPF) V_Numero Referencia Voo P_CPF Referencia Passageiro Telefone(Numero, P_CPF) CPF Referencia Pessoa 12
Linguagem de Definição de Dados (DDL) Criação de Tabelas: CREATE TABLE NOME_TABELA( COL1 TIPO_COLUNA [NOT NULL], COL1 TIPO_COLUNA [NOT NULL], COL1 TIPO_COLUNA [NOT NULL] ) 13
Linguagem de Definição de Dados (DDL) Na criação de tabelas, é possível especificar vários tipos de restrições: q Chave Primária: PRIMARY KEY ; q Chave Estrangeira: FOREIGN KEY; q Chave Alternativa (ou alternada): UNIQUE; q Restrição de Domínio: CHECK. Pode-se atribuir nomes às restrições de integridade: q CONSTRAINT NOME_RESTRIÇÃO TIPO RESTRIÇÃO. 14
Linguagem de Definição de Dados (DDL) CREATE TABLE Pessoa(CPF VARCHAR(11) NOT NULL, Nome VARCHAR(30) NOT NULL UNIQUE, Sexo VARCHAR(1) NOT NULL, PRIMARY KEY (CPF)); CREATE TABLE Piloto(CPF VARCHAR(11) NOT NULL, Cart_Trab VARCHAR(13) NOT NULL UNIQUE, PRIMARY KEY (CPF), FOREIGN KEY (CPF) REFERENCES Pessoa (CPF)); 15
Linguagem de Definição de Dados (DDL) CREATE TABLE Passageiro(CPF VARCHAR(11) NOT NULL CONSTRAINT PK_PASSAGEIRO PRIMARY KEY CONSTRAINT FK_PESSOA REFERENCES Pessoa (CPF), Dieta VARCHAR(1) CHECK (Dieta IN( S, N ))); CREATE TABLE Voo(Numero Numeric NOT NULL CONSTRAINT PK_VOO PRIMARY KEY, Data Date NOT NULL, TIPO VARCHAR2(15) DEFAULT NACIONAL, P_CPF VARCHAR(11) NOT NULL CONSTRAINT FK_PILOTO DEFERRABLE INITIALY DEFERRED); REFERENCES Piloto (CPF) 16
Linguagem de Definição de Dados (DDL) Deleção de item referenciado:... CONSTRAINT FK_PILOTO FOREIGN KEY (P_CPF) REFERENCES Piloto (CPF) ON DELETE RESTRICT); -- impede a exclusão (default)... CONSTRAINT FK_PILOTO FOREIGN KEY (P_CPF) REFERENCES Piloto (CPF) ON DELETE SET NULL); -- transforma o valor em nulo... CONSTRAINT FK_PILOTO FOREIGN KEY (P_CPF) REFERENCES Piloto (CPF) ON DELETE CASCADE); -- exclui a linha da tabela 17
Linguagem de Definição de Dados (DDL) Criação de uma tabela com linhas de outra: CREATE TABLE Pessoa_Nova AS SELECT CPF, Nome, Sexo FROM Pessoa; 18
Linguagem de Definição de Dados (DDL) CREATE VIEW <nome-de-visão> [ (lista-de-colunas) ] AS <comando-de-seleção> [WITH CHECK OPTION] CREATE VIEW Empregados_Sede AS SELECT (Nome, Endereco, Sexo, Data-nasc) FROM EMPREGADO q Atualização (INSERT, UPDATE, DELETE) de visão: q A query não pode conter join, ou seja, deve ser baseada apenas em uma tabela. q A query deve conter todas as colunas nott null da tabela referenciada. q A query não pode conter operadores de conjunto: UNION, EXCEPT e INTERSECT. q A query não pode conter o operador DISTINCT. q A query não pode conter funções de agregação. q A query não pode conter GROUP BY. 19
Linguagem de Definição de Dados (DDL) Alteração de Tabelas: q Incluir novas colunas em uma tabela; q Excluir colunas existentes em uma tabela; q Adicionar a definição de uma restrição em uma tabela; q Excluir a definição de uma restrição existente em uma tabela; q Modificar uma coluna. 20
Linguagem de Definição de Dados (DDL) CREATE TABLE Reserva(V_Numero Numeric NOT NULL, P_CPF VARCHAR(11) NOT NULL); CREATE TABLE Telefone(Numero VARCHAR(15) NOT NULL, P_CPF VARCHAR(11) NOT NULL, PRIMARY KEY (Numero, P_CPF), FOREIGN KEY (P_CPF) REFERENCES Pessoa(CPF)); 21
Linguagem de Definição de Dados (DDL) ALTER TABLE Telefone ADD COLUMN TIPO VARCHAR2(5) DEFAULT FIXO NOT NULL; ALTER TABLE Telefone DROP COLUMN Tipo; ALTER TABLE TELEFONE ADD CONSTRAINT TIPO_TELEFONE CHECK (TIPO IN( Fixo, Movel )); ALTER TABLE TELEFONE DROP CONSTRAINT TIPO_TELEFONE; ALTER TABLE TELEFONE MODIFY (TIPO VARCHAR2(5)); -- para diminuir tamanho a coluna precisa estar vazia. 22
Linguagem de Definição de Dados (DDL) ALTER TABLE Reserva ADD CONSTRAINT PK_RESERVA PRIMARY KEY (V_Numero, P_CPF); ALTER TABLE Reserva ADD CONSTRAINT FK_RESERVA_VOO FOREIGN KEY (V_Numero) REFERENCES Voo (Numero); ALTER TABLE Reserva ADD CONSTRAINT FK_RESERVA_PASSAGEIRO FOREIGN KEY (P_CPF) REFERENCES Passageiro (CPF); ALTER TABLE Reserva ENABLE CONSTRAINT FK_RESERVA_PASSAGEIRO; ALTER TABLE Reserva DISABLE CONSTRAINT FK_RESERVA_PASSAGEIRO; 23
Linguagem de Definição de Dados (DDL) Renomear Tabela: q Não é um comando SQL:2003. RENAME Pessoa TO Pessoa_Nova; -- Oracle RENAME TABLE Pessoa TO Pessoa_Nova; Deletar Tabela (estrutura): DROP TABLE Pessoa; 24
Linguagem de Manipulação de Dados (DML) Inclusão de dados: INSERT INTO NOME_TABELA (COL1, COL2,...,COLN) VALUES (VAL1, VAL2,...,VALN); Exemplo: Insert Into PESSOA (CPF, NOME, SEXO) values ('11122233344','Paulo Abreu', 'M'); Insert Into PESSOA (CPF, NOME, SEXO) Select CPF, NOME, SEXO From Aluno 25
Consulta Simples SELECT COL1, COL2,...,COLN FROM NOME_TABELA WHERE (expressão lógica) GROUP BY (atributos de agrupamento) HAVING (condição de agrupamento) ORDER BY (lista de atributos) Where: filtra antes do agrupamento. Having: filtra depois do agrupamento. 26
Linguagem de Manipulação de Dados (DML) Exemplo: Select * From PESSOA; Select CPF, NOME, SEXO, IDADE From PESSOA Where sexo = M or sexo = F ; ou Where sexo in ( M, F ); Select CPF, NOME, SEXO, IDADE From PESSOA Where IDADE > ANY (10,20,30); ou Where IDADE > ALL (10,20,30); 27
Linguagem de Manipulação de Dados (DML)
Linguagem de Manipulação de Dados (DML) Exemplo: SELECT * FROM DEPT WHERE DNAME LIKE '/_%' ESCAPE '/ Select CPF, NOME, SEXO From PESSOA Where nome like P% ; ( [CK]% ) ( [C-K]% intervalo) (not like) Select CPF, NOME, SEXO From PESSOA Where idade is null; (not null) Select CPF, NOME, SEXO From PESSOA Where idade >= 10 and idade <= 20; (between 10 and 20) 29
Linguagem de Manipulação de Dados (DML) Exemplo com Alias (apelidos): Select CPF as Meu_CPF From PESSOA Select CPF, NOME, SEXO From PESSOA as P Where P.idade is null; Select NOME, IDADE + 5 AS NOVA_IDADE From PESSOA; 30
Linguagem de Manipulação de Dados (DML) Atualização: UPDATE NOME_TABELA SET COL1=VAL1, COL2=VAL2,...,COLN=VALN WHERE (expressão lógica) Exemplo: UPDATE PESSOA SET idade = 30 WHERE nome = Paulo ; 31
Linguagem de Manipulação de Dados (DML) Deleção: DELETE FROM NOME_TABELA WHERE (expressão lógica) Exemplo: DELETE FROM PESSOA WHERE nome = Paulo ; TRUNCATE TABLE NOME_TABELA (sem rollback): q O comando TRUNCATE remove rapidamente todas as linhas da tabela. Tem o mesmo efeito do comando DELETE sem a cláusula WHERE, mas como não varre a tabela é mais rápido. É mais vantajoso para tabelas grandes. q O comando TRUNCATE não pode ser utilizado dentro de um bloco de transação (delimitado por BEGIN/COMMIT), porque não existe a possibilidade de desfazê-lo. 32
Linguagem de Manipulação de Dados (DML) Funções Agregadas: SELECT COUNT(*) FROM PESSOA; SELECT COUNT(NOME) FROM PESSOA; SELECT SUM(idade) FROM PESSOA; SELECT AVG(idade) FROM PESSOA; SELECT MAX(idade) FROM PESSOA; SELECT MIN(idade) FROM PESSOA; 33
Linguagem de Manipulação de Dados (DML) Tabela Livro: (Codigo, Titulo, Preco, Lancamento, Assunto, Editora) Assunto References Assunto(Sigla) Editora References Editora(Codigo) Tabela Assunto: (Sigla, Descricao) Tabela Editora: Editora(Codigo, Nome) 34
Exemplo (DML) Editora Assunto Livro 35
Funções Agregadas Funções Agregadas: SELECT ASSUNTO, AVG(PRECO) FROM LIVRO GROUP BY ASSUNTO; q Preço médio dos livros por assunto SELECT ASSUNTO, COUNT(*) FROM LIVRO GROUP BY ASSUNTO; q Quantidade de livros por assunto 36
Funções Agregadas SELECT ASSUNTO, MAX(PRECO) FROM LIVRO GROUP BY ASSUNTO; q Preço do livro mais caro de cada assunto. SELECT ASSUNTO FROM LIVRO GROUP BY ASSUNTO HAVING AVG(PRECO) > 50; q Assuntos cuja média de preço dos livros seja maior que R$ 50,00. 37
Funções Agregadas SELECT ASSUNTO, COUNT(*) FROM LIVRO GROUP BY ASSUNTO HAVING COUNT(*) > 2; q Assuntos que possuem pelo menos três livros. 38
Eliminação de Repetições SELECT DISTINCT ASSUNTO AS ASSUNTO FROM LIVRO; q Assuntos distintos. SELECT COUNT (ASSUNTO) AS Qtd_ASSUNTO FROM LIVRO; q Quantidade de ocorrência de assuntos. SELECT COUNT (DISTINCT ASSUNTO) AS Dif_ASSUNTO FROM LIVRO; q Quantidade de assuntos distintos. 39
Linguagem de Manipulação de Dados (DML) Ordenação de Resultados: SELECT ASSUNTO, TITULO, PRECO FROM LIVRO ORDER BY ASSUNTO ASC, PRECO DESC SELECT ASSUNTO, TITULO, PRECO FROM LIVRO ORDER BY ASSUNTO, PRECO DESC; SELECT ASSUNTO, TITULO, PRECO FROM LIVRO ORDER BY 2, PRECO DESC; 40
Linguagem de Manipulação de Dados (DML) Selecionar as 4 pessoas mais jovens e apresentar o resultado ordenado pelo campo COD. SELECT * FROM (SELECT * FROM PESSOA ORDER BY IDADE) WHERE ROWNUM < 5 ORDER BY COD Inline View 41
Funções Para Cadeias de Caracteres - LOWER(col) = apresenta o resultado em minúsculas. - UPPER (col)= apresenta o resultado em maiúsculas. - INITCAP (col)= apresenta o resultado com a primeira letra maiúscula de cada palavra. - REPLACE (col, cadeia1, cadeia2)= Substitui um caractere ou caracteres de uma cadeia com 0 ou mais caracteres. Ex: REPLACE(nome, be, da ) Abel - SUBSTR (col, inicio, qtd)= Obtém parte de uma cadeia. Ex: SUBSTR(nome,2,2) Abel - CONCAT (col1, col2)= Devolve col1" concatenada com col2". 42
Funções Para Cadeias de Caracteres - LPAD (col, tam, char )= Adiciona caracteres à esquerda do resultado até que tenha uma certa longitude. - RPAD (col, tam, char )= Adiciona caracteres à direita do resultado até que tenha uma certa longitude. Ex: LPAD(nome, 10, * ) = ******Abel Ex: RPAD(nome, 10, * ) = Abel****** - LTRIM (col, chars )= Suprime um conjunto de caracteres à esquerda do resultado. - RTRIM (col, chars )= Suprime um conjunto de caracteres à direita da cadeia. Ex: LTRIM(nome, a ) = Abel - bel Ex: RTRIM(nome, el ) = Abel - Ab 43
Funções Para Números ABS(n)= Devolve o valor absoluto de (n). CEIL(n)=Obtém o valor inteiro imediatamente superior ou igual a "n". FLOOR(n) = Devolve o valor inteiro imediatamente inferior ou igual a "n". MOD (m, n)= Devolve o resto resultante de dividir "m" por "n". NVL (col, valor)= Substitui um valor nulo por outro valor. NULLIF(col, valor) = retorna NULL se col = valor; POWER (m, exponente)= Calcula a potência de um número. SQRT(n)= Devolve a raiz quadrada de "n". 44
Funções Para Conversão de Tipos q CAST q Sintaxe: CAST(dado_origem as tipo_dado_destino) SELECT CAST (AVG(PRECO) AS DECIMAL (10,2)) FROM PRODUTO; SELECT CAST ( 11/02/2002 AS DATE) FROM DUAL; 45
Junção Interna (INNER JOIN) q Select Titulo, Descricao From Livro INNER JOIN Assunto on Assunto = Sigla Where Preco > 100 Select Titulo, Descricao From Livro, Assunto Where Assunto = Sigla and Preco > 100 q Select Nome, Titulo From Livro INNER JOIN Editora E on Editora = E.Codigo INNER JOIN Assunto on Assunto = Sigla Select Nome, Idade From Pessoa INNER JOIN Gente USING (CPF) 46
Junção Externa à Esquerda (LEFT OUTER JOIN) q Select * From Livro li LEFT OUTER JOIN Assunto a on li.cod_assunto = a.cod_assunto 47
Junção Externa à Direita (RIGHT OUTER JOIN) q Select * From Livro li RIGHT OUTER JOIN Assunto a on li.cod_assunto = a.cod_assunto 48
Junção Externa Completa (FULL OUTER JOIN) q Select * From Livro li FULL OUTER JOIN Assunto a on li.cod_assunto = a.cod_assunto 49
Junção Cruzada (CROSS JOIN) Junção Cruzada (Produto Cartesiano): q Select Cod_Pac, Nome_Pac, Cod_Med, Nome_Med From Paciente CROSS JOIN Medico PACIENTE PACIENTE X MEDICO MEDICO 50
Subconsultas Não-Correlacionadas SELECT Nome FROM Editora WHERE Codigo IN (SELECT Editora FROM Livro WHERE Lancamento IS NOT NULL) Nome das editoras que já lançaram livros. Editora Livro 51
Subconsultas Não-Correlacionadas q SELECT Descricao FROM Assunto WHERE Sigla NOT IN (SELECT Assunto FROM Livro WHERE Lancamento IS NOT NULL) q Assuntos que não foram lançados livros. Livro Assunto 52
Subconsultas Correlacionadas SELECT Nome FROM Editora ED WHERE EXISTS (SELECT Editora FROM Livro L WHERE Lancamento IS NOT NULL AND ED.Codigo = L.Editora) Editora Livro 53
Subconsultas Correlacionadas q SELECT Descricao FROM Assunto A WHERE NOT EXISTS (SELECT Assunto FROM Livro L WHERE Lancamento IS NOT NULL AND A.Sigla = L.Assunto) Livro Assunto 54
UNION SELECT Titulo FROM Livro WHERE Assunto = B Union [ALL] (com linhas repetidas) SELECT Titulo FROM Livro WHERE Assunto = P Livro 55
UNION SELECT * FROM Livro WHERE Assunto = B UNION CORRESPONDING BY (Nome, Autor, Data_Lancamento) SELECT * FROM Obra WHERE Area_Concentracao = P ; 56
INTERSECT (Intersecção) SELECT Titulo FROM Livro WHERE Assunto IN ( B, R ) INTERSECT SELECT Titulo FROM Livro WHERE Assunto IN ( B, P ) Livro 57
EXCEPT (Diferença) SELECT Titulo FROM Livro WHERE Assunto IN ( B, R ) EXCEPT SELECT Titulo FROM Livro WHERE Assunto IN ( B, P ) Livro 58
MERGE (UPSERT) MERGE INTO Cliente C USING AUTOR A ON (A.CPF = C.CPF) WHEN MATCHED THEN UPDATE SET C.NOME = A.NOME C.ENDERECO = A.ENDERECO C.DATA_NASCIMENTO = A. DATA_NASCIMENTO WHEN NOT MATCHED THEN INSERT (CODIGO, NOME, CPF, ENDERECO, DATA_NASCIMENTO) VALUES (A.MATRICULA, A.NOME, A.CPF, A.ENDERECO, A.DATA_NASC) Atualização da tabela Cliente a partir da tabela Autor 59
Índice Sobre Campo Chave CREATE INDEX ind-nome ON EMPREGADO (CPF); DROP INDEX ind-nome ON tabela-nome; 60
Controle de Segurança em SQL GRANT CREATE TAB ON DATABASE TO usuario; GRANT INSERT, DELETE ON EMPREGADO, PROJETO TO usuario; GRANT SELECT ON EMPREGADO TO usuario; GRANT CONTROL ON INDEX ind-dep TO usuario1, usuario2; GRANT ALL PRIVILEGES ON EMPREGADO TO usuario1; CREATE ROLE role1; GRANT role1 TO usuario1; REVOKE role1 FROM usuario1; REVOKE CONTROL ON INDEX ind-dep FROM usuario2; REVOKE DELETE ON EMPREGADO FROM usuario2; REVOKE ALL PRIVILEGES ON EMPREGADO FROM usuario1; 61