Sie sind auf Seite 1von 40

GOVERNO DO ESTADO DO ESPRITO SANTO SECRETARIA DE ESTADO DE CINCIA, TECNOLOGIA, INOVAO, EDUCAO PROFISSIONAL E TRABALHO

Coordenao de Informtica

Sumrio
1 Introduo a SQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 1.1. Um Breve Histrico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 1.2. Banco de Dados Relacional . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 2 Linguagem SQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 2.1. Como definir o banco de dados com SQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 2.1.1 Create Database . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 2.1.2 Create Table . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 Exerccio 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 2.1.3 Alter Table . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 2.1.4 Drop Table . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 2.2. Manipulao com tabelas SQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 2.2.1 Insero de Tuplas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 2.2.2 Alterao de Tuplas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 2.2.3 Remoo de Tuplas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 Exerccio 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 2.3. Consultando Tabelas SQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 2.3.1 Comando Select . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 Exerccio 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 2.3.1.1 Comando SELECT - Clusula DISTINCT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 Exerccio 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 2.3.1.2 Comando SELECT - Retorno de valores calculados . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 Exerccio 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 2.3.1.3 Comando SELECT - Funes de Agregao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 2.3.2 Clusula WHERE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 2.3.2.1 Comparao [NOT] LIKE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 2.3.2.2 Comparao de nulos IS [NOT] NULL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 2.3.3 Clusula UNION . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 2.3.4.Clusula INTERSECT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 2.3.5 Clasula MINUS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 2.4 Consultas envolvendo mais de uma tabela do BD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 Exerccio 6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 2.5. Subconsultas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 2.5.1 Clusula [NOT] IN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 Exerccio 7 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 2.5.2 Clusula ANY . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 Exerccio 8 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 2.5.3 Clusula ALL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 Exerccio 9 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 2.5.4 Clusula [NOT] EXISTS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 Exerccio 10 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 2.5.5 Clusula CONTAINS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 Exerccio 11 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 2.6 Ordenando a exibio de tuplas - Clusula ORDER BY . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 Exerccio 12 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 2.7 Agrupando tuplas - Clusulas GROUP BY e HAVING . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 Exerccio 13 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 2.8 Comandos de atualizao + comandos de consulta . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 3. Vises em SQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27

3.1 Consultas sobre Vises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.2 Atualizaes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.3 Vantagens das vises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.4 Algumas solues para problemas com vises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Exerccio 14 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

28 29 29 30 30

4. Autorizaes de Acesso . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 4.1. Comando Grant . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 4.2. Comando Revoke . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 5. Mais Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 6 O Futuro do Padro SQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 7 Bibliografia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40

1 Introduo a SQL
O objetivo deste curso introduzir o aluno na tarefa de manipular bancos de dados atravs da linguagem SQL. SQL significa Structured Query Language (linguagem estruturada de consulta). Apesar do nome, fazer consultas a bancos de dados no a nica funo de SQL. Ela utilizada para criar tabelas, inserir, excluir e alterar dados do banco de dados, alm de outras utilizaes. A seguir mostrado um breve histrico da linguagem seguido de uma rpida viso de bancos de dados relacionais.

1.1. Um Breve Histrico


A linguagem SQL foi desenvolvida pela IBM em meados dos anos 70 como uma linguagem de manipulao de dados (DML - Data Manipulation Language) para suas primeiras tentativas de desenvolvimento de bancos de dados relacionais. A grande vantagem do SQL sobre modelos de dados anteriores que as operaes realizadas sobre os dados so especificadas numa linguagem no procedural e conjuntos de dados so manipulados com um nico comando. Isto faz com que os programadores no tenham de navegar por uma estrutura complexa de banco de dados, reduzindo a quantidade de cdigo necessrio para acessar os dados. A SQL tornou-se de fato o padro depois de 1986, quando o American National Standards Institute (ANSI), a organizao responsvel pelos padres industriais nos Estados Unidos, endossou o SQL como linguagem padro para os bancos de dados relacionais. Desde ento, o SQL j sofreu duas atualizaes oficiais, uma em 1989, e outra em 1992. A reviso de 1992, SQL-92 (ANSI X3.135-1992) o padro usado atualmente, mas desde 1993 h um trabalho sendo desenvolvido para atualizar o padro de modo que este atenda s caractersticas das ltimas verses de bancos de dados relacionais lanadas no mercado. O novo padro SQL chama-se SQL3; o nmero 3 vem de 1993, o ano em que os trabalhos comearam. Em 1986, o ANSI publicou o primeiro padro SQL, X3.135-1986. A International Organization for Standardization (ISO) pubicou um padro tecnicamente idntico, ISO 9075-1987, alguns meses depois em 1987. O padro representava um denominador comum das implementaes SQL existentes e consequentemente deixou de padronizar muitas caractersticas populares e necessrias da linguagem. Este padro continha caractersticas de SQL de quatro linguagens de programao: COBOL, FORTRAN, Pascal e PL/I. Em 1989, tanto ANSI quanto ISO publicaram padres substitutos (ANSI X3.135-1989 e ISO/IEC 9075:1989) que aumentaram a linguagem e acrescentaram uma capacidade opcional de integridade referencial, permitindo que projetistas de bancos de dados pudessem criar relacionamentos entre dados em diferentes partes do banco de dados. No mesmo ano, o ANSI adicionou ao padro suporte para duas outras linguagens de programao, Ada e C. Em 1992, ISO e ANSI publicaram a terceira reviso do padro SQL, o SQL92 (X3.135-1992 e ISO/IEC 9075:1992). Na mais nova verso, SQL3, a nova caracterstica mais importante a adio de caractersticas de orientao a objetos na linguagem. Devido ao sucesso da forma de consultar e manipular dados da SQL, dentro de um ambiente de banco de dados, a utilizao da SQL foi se tornando ainda maior. Uma grande quantidade de SGBDs foi tendo como linguagem bsica a SQL, a saber, SQL/DS e DB2 da IBM, ZIM, Oracle, RDB, Sybase, dentre outros. Cabe ressaltar que cada implementao de SQL possui uma adaptao da sintaxe para resolver determinados problemas, portanto, qualquer comando mostrado neste curso pode ser usado de forma diferente em um determinado SGBD. Recomenda-se a leitura do manual do fabricante para maiores informaes sobre o uso da linguagem SQL em SGBDs comerciais.

1.2. Banco de Dados Relacional


Para que haja um melhor entendimento da linguagem SQL necessrio abordar a evoluo dos bancos de dados e de sua teoria. Sistemas de bancos de dados relacionais so aqueles baseados no modelo lgico

relacional, o qual foi proposto por E. F. Codd em 1970. A abordagem relacional est baseada no princpio de que as informaes em uma base de dados podem ser consideradas como relaes matemticas e que esto representadas de maneira uniforme, atravs do uso de tabelas bidimensionais. Todos os dados de um BD relacional esto armazenados em relaes (ou tabelas). Cada tabela possui atributos (ou campos), os quais so armazenados em colunas da tabela. As linhas guardam informaes sobre uma entidade (registro). Alguns atributos da tabela so chave primria da mesma. Isto significa que no existem duas linhas iguais numa tabela. Cada linha pode ser identificada univocamente pela sua chave primria (por exemplo matrcula de aluno). A seguir mostrada a tabela de alunos que tem como atributos Matrcula, Nome, Endereo e Cod_Curso. A chave primria da tabela o atributo matrcula. Alunos Matrcula 9100807 9200789 Nome Jos Maria Endereo xxxx yyy Cod_Curso 88 77

A seguir mostrada a tabela de cursos com os atributos Cod_Curso e Nome. Cod_Curso a chave primria.

Cod_Curso 77 88

Nome Computao Eng. Civil

Note que cada aluno da tabela de alunos possui um valor de Cod_Curso que existe na tabela de cursos. Isso significa que se quisermos saber o nome do curso de um aluno, basta sabermos o cdigo do curso do aluno e procurar pelo mesmo cdigo na tabela de cursos. Quando existe essa ligao entre tabelas, o atributo que faz a ligao (no caso, Cod_Curso) considerado chave estrangeira ou chave externa. Isto implica em vrias regras de verificao num SGBD, pois um aluno no pode ter um cdigo de curso que no existe na tabela de cursos, para citar um exemplo. Existem vrias regras definidas por Codd para caracterizar um SGBD relacional. Em resumo, pode-se dizer que todos os dados do SGBD devem ser armazenados em tabelas e que a manipulao dessas tabelas atravs de incluso, excluso, alterao e consultas deve gerar novas tabelas

2 Linguagem SQL
Atualmente, a linguagem SQL assume um papel muito importante nos sistemas de gerenciamento de banco de dados (SGBDs), podendo ter muitos enfoques. Atravs de comandos SQL, os usurios podem montar consultas poderosas sem a necessidade de criao de um programa, ou ainda utilizar comandos SQL embutidos em programas de aplicao que acessam os dados armazenados. O DBA, pessoa responsvel pela administrao de banco de dados pode realizar suas tarefas atravs de SQL. Da mesma forma, a linguagem pode ser usada como linguagem cliente/servidor, linguagem para banco de dados distribudos e caminho de acesso a outros bancos de dados ou outras plataformas. Devido ao fato de possuir vrias aplicaes, a linguagem SQL prov suporte a vrias funes de um SGBD. Ela consiste de:
+ + + +

DDL (linguagem de definio de dados), onde os dados a serem armazenados so definidos e estruturados; DML (linguagem de manipulao de dados), que permite a incluso, remoo, seleo ou atualizao de dados armazenados no banco de dados; Controle de acesso, permitindo proteo dos dados de manipulaes no autorizadas; Restries de Integridade, que auxiliam no processo de definio da integridade dos dados, protegendo contra corrupes, inconsistncias e falhas do sistema de computao.

Alm dessas caractersticas principais, ainda podemos citar o suporte a vises, onde so especificadas as consultas disponveis atravs de tabelas virtuais e especificao de transaes, para garantia do compartilhamento dos dados.

2.1. Como definir o banco de dados com SQL


Para definir o banco de dados utilizamos os comandos de definio de dados de SQL, que a transformam em DDL.

2.1.1 Create Database


O comando create database no est presente em todos as verses de SQL, mas serve para definir um nome para o banco de dados a ser criado. Por exemplo:

create database controle_bancrio

2.1.2 Create Table


O comando create table permite a definio de uma relao ou tabela com restries de integridade de entidade e referencial dentro do banco de dados definido. Para isso ele contm as clusulas:

primary key:

indica os atributos que formam a chave primria;

unique key: indica os atributos que formam a chave candidata; foreign key: indica os atributos que formam a chave estrangeira e o nome da relao referida pela chave estrangeira

Formato do comando create table:

CREATE TABLE nome_tabela (nome_atributo tipo_de_dado [NOT NULL],..., primary key (nome_atributo1, nome_atributo2,...) foreign key (nome_atributo) references nome_relao)

Ex: BD bancrio: create table cliente ( cliente_nome char(20) not null, rua cidade char(30), char(30,

primary key (cliente_nome))

create table agncia ( agencia_nome ativos cidade char(15) not null, integer, char(30),

primary key (agencia_nome))

create table depsito ( agencia_nome char(15) not null, conta_numero char(10), cliente_nome char(20) not null, saldo integer,

primary key (conta_numero, cliente_nome) foreign key (agencia_nome) references agencia, foreign key (cliente_nome) references cliente)

Tipos de dados suportados pelo Personal Oracle 7: Tipo CHAR DATE LONG LONG RAW NUMBER RAW RAWID VARCHAR2 Comentrios dados alfanumricos de at 255 caracteres. Acrescenta espaos depois do valor para complementar o tamanho da coluna Inclui sculo, ano, ms, dia, hora, minuto e segundo strings alfanumricas de tamanho variado de at 2 gigabytes (memo) Dados binrios at 2 gigabytes (BLOB) - grficos, sons, vdeo, etc. Nmeros positivos ou negativos com ou sem ponto decimal Dados binrios at 255 bytes String hexadecimal representando o endereo nico de uma linha em uma tabela Dados alfanumricos de tamanho variado. At 2000 caracteres.

Exerccio 1: Criar as tabelas sql para os esquemas abaixo: a) BD hospitalar mdicos(codm, nomem, idade, especialidade) pacientes(codp, nomep, idade, problema) consultas (codm, codp, data, hora)

b) Zoolgico: animais (codA, tipo, nome, peso, idade) jaulas (nro, area) alocao (nro_jaula, codA, data_entrada) zeladores (codZ, nomez, tempo_servio) manuteno (codZ, nro, horas)

2.1.3 Alter Table


O comando Alter Table permite modificar a estrutura de uma tabela j definida. Pode-se adicionar uma coluna tabela ou modificar uma coluna existente. A sintaxe do comando mostrada a seguir:

alter table nome_tabela [add nome_coluna tipo_dados; | modify nome_coluna tipo_dados;]

O comando a seguir altera a estrutura da tabela agncia para aumentar o tamanho do campo cidade:

alter table agncia modify cidade char(40);

A seguir acrescentado o atributo pas na tabela agncia:

alter table agncia add pas char(20)

2.1.4 Drop Table


Para remoo de uma tabela, usa-se o comando drop table, o qual remove todas as informaes sobre a relao (inclusive do catlogo)

Ex: drop table agncia

2.2. Manipulao com tabelas SQL


Para manipular com tabelas do banco de dados, podem ser usados comandos de insero, excluso, alterao e consulta de tabelas. Os comandos de atualizao de banco de dados com SQL so mostrados a seguir:

2.2.1 Insero de Tuplas


insert into nome_tabela values <campos>

Ex: Insero do cliente Joo: insert into cliente values (Joo, A, Porto Alegre)

Obs: valores nulos podem estar presentes em alguns atributos insert into cliente values (Jos, null, Santa Cruz do Sul)

2.2.2 Alterao de Tuplas


update nome_tabela set alterao [where condio]

Exemplos: Alterar a tabela de depsitos para acrescentar 5% de juros em todos os saldos:

update deposito set saldo = saldo * 1.05

Alterar a cidade do cliente Joo para Belm

update cliente set cidade = Belm where cliente_nome = Joo

Acrescentar 6% de juros s contas com saldo maior que 10000:

update deposito set saldo = saldo * 1.06 where saldo > 10000

2.2.3 Remoo de Tuplas


delete from nome_tabela [where condio]

Ex: Remover todos os depstos da conta de Smith: delete from deposito where cliente_nome = Smith

Remover todas as tuplas da tabela cliente: delete cliente

10

Exerccio 2: Remover as agncias da cidade de Belm

2.3. Consultando Tabelas SQL


Toda consulta SQL baseada no modelo relacional, ou seja, retorna uma tabela como resposta. Para definir uma consulta, basta informarmos o que queremos e no como faz-lo, pois SQL uma linguagem noprocedural.

2.3.1 Comando Select


Estrutura bsica de uma consulta SQL: select <lista de atributos> from <lista de tabelas> [where <condio>]

Select seleciona as colunas que devero compor a tabela resultante. Os nomes dos atributos devem ser os mesmos definidos no banco de dados. uma clusula obrigatria em qualquer consulta. From indica as tabelas do banco de dados que devem ser consultadas. Tambm obrigatria em qualquer consulta. Where indica uma condio pela qual os dados sero filtrados. A condio especificada deve retornar verdadeiro ou falso. Para cada linha da tabela, o interpretador SQL verifica se atende a condio especificada nesta clusula e adiciona a linha na resposta caso seja verdadeira a avaliao. uma clusula opcional de consulta.

- Observaes:
+ + +

Caso a clusula where seja omitida, o predicado P (condio) verdadeiro; A lista de atributos A1, A2, ..., An pode ser substituida por um asterisco (*) para selecionar todos os atributos de todas as relaes da clusula from; SQL forma o produto cartesiano (relaciona cada linha da primeira tabela com todas as linhas da outra tabela) das relaes chamadas na clusula from, verifica a condio da clusula where, e ento, projeta o resultado para os atributos da clusula select; O resultado de uma consulta SQL uma tabela. Operadores lgicos: and, or e not Operadores de comparao: >, >=, <, <=, = , != (ou <>)

+ + +

Exemplo: Dada a seguinte tabela de clientes: cliente_nome Jos Maria rua Pe. Eutquio Pres. Vargas cidade Belm Fortaleza

11

Joana Rogrio

Alm Barroso Praia de Belas

Belm Porto Alegre

Para consultar os clientes (todos os atributos) que moram em Belm: select * from clientes where cidade = Belm

O resultado seria: cliente_nome Jos Joana rua Pe. Eutquio Alm Barroso cidade Belm Belm

Exerccio 3: Consultar no BD hospitalar: a) O nome dos mdicos com idade > 22 ou com especialidade diferente de traumatologia; b) o nome e o problema dos pacientes com menos de 24 anos; c) as consultas para o dia 26/09/96 aps as 15hs.

2.3.1.1 Comando SELECT - Clusula DISTINCT


A clusula DISTINCT usada para remover as duplicaes de linhas no resultado da consulta. select distinct cliente_nome from depsito

Ex: Se a tabela depsito tiver os dados:

O resultado da consulta ser:

Agncia_ nome Ag1 Ag2 Ag3 Ag3

conta_ nmero 001 002 003 003

cliente_n ome Joo Jos Smith Jos

saldo

cliente_nome Joo

100 200 150 350

Jos Smith

12

Exerccio 4: No BD hospitalar: a) Buscar todas as especialidades dos mdicos; b) Buscar todas as datas de consultas com horrio aps as 15hs c) Buscar todas as idades dos mdicos

2.3.1.2 Comando SELECT - Retorno de valores calculados

O comando Select permite retornar expresses aritmticas como resultado da consulta. Cada atributo especificado na clusula Select tambm uma expresso, e como tal pode ser manipulada. Essa uma forma de mostrar resultados que na verdade no esto armazenados no banco de dados. Para atributos numricos, podemos utilizar +, -, *, /. E para atributos do tipo string pode-se utilizar concatenao ||. Alm desses operadores, ainda existem outras funes que sero mostradas na seo a seguir.

Exemplo: Buscar o cdigo do mdico e os dias consecutivos de suas consultas: select codm, data + 1 from consultas

Exerccio 5: buscar a idade em meses de todos os pacientes e seus nomes

Obs: Pode-se dar nomes novos as colunas resultantes de tabelas em algumas implementaes de sql. Por exemplo:

select codm, data + 1 dia_consecutivo from consultas

Esta consulta resultaria em uma tabela com os atributos codm e dia_consecutivo.

2.3.1.3 Comando SELECT - Funes de Agregao


As funes de agregao operam sobre um conjunto de linhas e algumas so mostradas a seguir:

a) Count: contador de ocorrncias Ex: 1) total de linhas (tuplas) da tabela de pacientes: select count (*) from pacientes 2) Quantas consultas para o dia 26/05/96 existem?

13

select count (data) from consultas

{no conta nulos}

where data = 26/05/96"

b) Sum: somador de valores de atributos numricos Ex: Soma dos saldos do dos clientes da agncia Ag1: select sum (saldo) from depsito where agncia_nome = Ag1"

c) Avg: Mdia de valores de atributos numricos Ex: Obter mdia de idade dos mdicos ortopedistas: select avg (idade) from mdicos where especialidade = ortopedia

d) Max / Min: Maior/Menor valor de um atributo Ex: Maior e menor saldo de contas em depsito: select max (saldo), min (saldo) from depsito

2.3.2 Clusula WHERE


Na clusula WHERE so especificadas as condies de busca da tabela. Podem ser usados vrios operadores relacionais, como =, >, <, <=, >=, <> e ainda operadores de comparao de padres em valores, como LIKE e comparao de nulos.

2.3.2.1 Comparao [NOT] LIKE


Permite a definio de padres de busca * Padres possveis: a) Like c* - o valor do atributo inicia com o caracter c b) Like *c - o valor do atributo termina com c c) Like *c* - o valor do atributo possui o caracter c no meio da cadeia

14

Obs: algumas implementaes de SQL usam % no lugar de *

Ex:Buscar o nome de todos os pacientes que comeam com a letra C: select nomep from pacientes where nomep like C*

Buscar o cdigo do mdico, paciente e horrio para todas as consultas marcadas para o ano de 1996: select codm, codp, hora from consultas where data like *96" {ou *}

2.3.2.2 Comparao de nulos IS [NOT] NULL


* Permite o teste sobre valores nulos de atributos

Ex: buscar dados dos mdicos que no tm especialidade: select * from medicos where especialidade is null

2.3.3 Clusula UNION


* Permite a unio de duas tabelas compatveis (equivalente ao operador ? da lgebra relacional;

Ex: buscar o nome de todas as pessoas cadastradas no hospital: select nomem from medicos union select nomep from pacientes

Buscar todos os clientes com emprstimo ou depsito na agncia Ag1: (select cliente_nome from depsito

15

where agencia_nome = Ag1") union (select cliente_nome from emprstimo where agencia_nome = Ag1")

obs: a clusula Union retira as repeties. Em algumas verses de SQL, pode-se utilizar UNION ALL, que retorna todas as tuplas das tabelas unidas, mesmo havendo repetio.

2.3.4.Clusula INTERSECT
Permite a interseo de duas tabelas compatveis (operador  da lgebra relacional), retornando apenas as linhas que pertencem s duas tabelas

Ex: buscar todos os clientes da Ag1 que possuem uma conta e emprstimo: (select distinct cliente_nome from depsito where agencia_nome = Ag1") intersect (select distinct cliente_nome from emprstimo where agencia_nome = Ag1")

2.3.5 Clasula MINUS


* Permite a subtrao de duas tabelas compatveis (operador - da lgebra relacional), retornando apenas as linhas que pertencem primeira tabela, com exceo das que aparecem na segunda tabela.

Ex: Buscar todos os clientes da Ag1 que possuem conta mas no possuem emprstimo: (select distinct cliente_nome from depsito where agencia_nome = Ag1") minus (select distinct cliente_nome from emprstimo where agencia_nome = Ag1")

16

2.4 Consultas envolvendo mais de uma tabela do BD


Quando a resposta de uma consulta precisa ser buscada em vrias tabelas do banco de dados, ento necess rio especificar quais tabelas sero usadas na consulta SQL. Para isso utilizada a clusula FROM. Como SQL baseada no modelo relacional, a forma de juntar tabelas atravs de produto cartesiano das mesmas. Por exemplo, se quisermos usar duas tabelas, a de mdicos e a de consultas, mostradas abaixo, o resultado uma tabela que contm relacionamentos entre todos os mdicos e todas as consultas. Obviamente que vrias tuplas do resultado no so teis, portanto temos que especificar quais as tuplas teis atravs da clusula WHERE.

mdicos(codm, nomem, idade, especialidade)

codm M1 M2 M3

nomem Joo Jos Maria

idade 33 23 30

especialidade traumatologia clnica geral obstetrcia

consultas (codm, codp, data, hora) codm M1 M1 M2 Se a consulta fosse: codp P1 P2 P1 data 12/12/1997 13/12/1997 05/10/1997 hora 15 14 8

select * from mdicos, consultas

O resultado seria: codm M1 M1 M1 M2 M2 M2 nomem Joo Joo Joo Jos Jos Jos idade 33 33 33 23 23 23 especialidade traumatologia traumatologia traumatologia clnica geral clnica geral clnica geral codm M1 M1 M2 M1 M1 M2 codp P1 P2 P1 P1 P2 P1 data 12/12/1997 13/12/1997 05/10/1997 12/12/1997 13/12/1997 05/10/1997 hora 15 14 8 15 14 8

17

M3 M3 M3

Maria Maria Maria

30 30 30

obstetrcia obstetrcia obstetrcia

M1 M1 M2

P1 P2 P1

12/12/1997 13/12/1997 05/10/1997

15 14 8

O resultado expressa valores que nem sempre so verdadeiros. Por exemplo, existe uma linha com mdico M1 e ao lado, uma consulta do mdico M2. Se quisermos saber os dias de consulta do mdico Joo, temos que escolher somente as linhas onde o codm em mdicos igual a codm em consultase o nome do mdico seja Joo. Pode-se perceber que para saber datas de consultas basta olharmos na tabela de consultas, mas esta somente contm o cdigo dos mdicos. Portanto se quisermos avaliar o nome do mdico, temos que buscar na tabela de mdicos. Da a necessidade de juntar as tabelas pelo cdigo do mdico. A esta operao damos o nomes de JOIN, ou seja, juno de valores relacionados. A consulta SQL que obtm tal resposta :

select data from mdicos, consultas where mdicos.codm = consultas.codm and mdicos.nomem = Joo"

O resultado desta consulta data 12/12/1997 13/12/1997 Na clusula FROM, podemos definir quantas tabelas forem necessrias. A nica restrio de que as chaves estrangeiras devem ser igualadas para que os dados retornados sejam verdadeiros.

Ex: Buscar o nome dos mdicos com consulta marcada para o dia 22/05/96: select medicos.nomem from medicos, consultas where consultas.data = 22/05/96" and medicos.codm = consultas.codm

* Pode-se ter variveis de tupla associadas a cada tabela declarada na clusula from Ex: select M.nomem, P. nomep from consultas C, medicos M, pacientes P where C.codm = M.codm and C.codp = P.codp and

18

C. hora = 15

Exerccio 6: Buscar nome e idade dos mdicos com consulta marcada com a paciente Ana.

2.5. Subconsultas
Na linguagem SQL ANSI podem ser definidas subconsultas atravs das clusulas IN, ANY, ALL, EXISTS e CONTAINS. Entretanto, somente podem ser definidas subconsultas na clusula WHERE..

2.5.1 Clusula [NOT] IN


Esta clusula estabelece a relao de pertinncia entre conjuntos (tabelas). Sua avaliao retorna um valor booleano.

sintaxe: where <atributo ou expresso> [not] in (<subconsulta>)

Ex: Buscar nome de todos os pacientes sem consulta marcada: select nomep from pacientes where codp not in (select codp from consultas)

A subconsulta (select codp from consultas) avaliada primeiro, retornando uma tabela com todos os cdigos de pacientes que possuem consulta marcada. Em seguida a consulta principal processada selecionando os nomes dos pacientes cujo cdigo no se encontra no resultado da subconsulta. Pode-se observar que essa consulta tambm poderia ser descrita atravs da clusula minus, subtraindo os pacientes com consulta do conjunto de todos os pacientes cadastrados (mostre como!). Uma outra observao importante que um item (codp) comparado a um conjunto (o resultado da subconsulta). A clusula IN comporta-se como o operador pertence da matemtica, comparando um elemento a um conjunto de elementos do mesmo tipo. A subconsulta no poderia, por exemplo, retornar cdigo de mdico ao invs de pacientes, ou seja, o elemento comparado tem que ser do mesmo tipo dos elementos do conjunto. Ex: Buscar nome e problema dos pacientes com idade > 21 e que tambm so mdicos: select nomep, problema from pacientes where idade > 21 and nomep in (select nomem from medicos)

19

Exerccio 7: Buscar todos os clientes da Ag1 que possuem conta e emprstimo (com clusula in): Buscar todos os clientes da Ag2 que possuem conta mas no possuem emprstimo.

2.5.2 Clusula ANY


Esta clusula permite outras formas de comparao elemento-conjunto. Ao invs de somente verificar se um elemento pertence a um conjunto, podemos verificar se um elemento maior, menor, diferente ou at igual a qualquer elemento do conjunto resultante da subconsulta.

= any (<subconsulta>) > any (<subconsulta>) < any (<subconsulta>) <> any (<subconsulta>)

{mesmo que in} {verdadeiro se o atributo comparado for maior do que algum valor de atributo das tuplas resultantes da subconsulta}

Ex: Buscar o nome de todos os pacientes, exceto o mais idoso: select nomep from pacientes where idade < any (select idade from pacientes)

Exerccio 8: Buscar o nome e a idade do mdico mais jovem.

2.5.3 Clusula ALL


Esta clusula utilizada quando uma condio deve ser satisfeita para todos os elementos de um conjunto. = all (<subconsulta>) > all (<subconsulta>) < all (<subconsulta>) <> all (<subconsulta>) {igual a todos} {maior do que todos} {menor que todos} {diferente de todos (= not in)}

Ex:

1) Buscar o nome dos clientes que tem saldo menor que todos os clientes com depsto na agncia Ag3: select cliente_nome

20

from deposito where saldo < all (select saldo from deposito where agencia_nome = Ag3")

2)Buscar o nome dos mdicos com consultas marcadas para horrios mais tarde que todas as consultas da mdica Maria select from where nomem medicos m, consultas c m.codm = c.codm and c.hora > all (select hora from consultas c1, medicos m1 where c1.codm = m1.codm and m1.nomem = Maria)

Exerc cio 9 : Buscar os dados dos pacientes com consultas marcadas para horrios anteriores a todos os horrios marcados para o dia 22/06/96

2.5.4 Clusula [NOT] EXISTS


Esta clusula testa se uma subconsulta tem alguma tupla em seus resultados. Se for usado o NOT antes de EXISTS, o resultado o contrrio.

Ex: Podemos reescrever a consulta: Encontre os clientes que possuem conta e emprstimo na Ag1. select cliente_nome from cliente where exists (select * from deposito where deposito.cliente_nome = cliente.cliente_nome and agencia_nome = Ag1") and exists (select * from emprestimo where emprestimo.cliente_nome = cliente.cliente_nome and agencia_nome = Ag1")

21

Ex2: Considere novamente a consulta: Encontre todos os clientes que tm uma conta em todas as agncias localizadas em StaCruz. (usando not exists e minus) select distinct S.cliente_nome from deposito S where not exists ((select agencia_nome from agencia where agencia_cidade = StaCruz) minus (select T.agencia_nome from deposito T where S.cliente_nome = T.cliente_nome))

Exerccio 10 (BD hospitalar):

a)Buscar o nome de todos os mdicos com consulta marcada. b)Buscar o nome do mdico mais jovem.

2.5.5 Clusula CONTAINS


A clusula CONTAINS foi introduzida originalmente no sistema R, e no aparece no padro ANSI pois o processamento dessa clusula muito custoso. As constru es in, any e all permitem-nos testar um valor simples contra membros de um conjunto inteiro. Uma vez que o select gera um conjunto de tuplas, podemos querer comparar conjuntos para determinar se um conjunto contm todos os membros de algum outro conjunto. Tais comparaes so feitas em SQL usando contains e not contains. Em outras palavras, esta clusula equivalente ao operador contm @ da matemtica

Ex: Considere a mesma consulta do Ex2 acima. Para cada cliente, precisamos ver se o conjunto de todas as agncias na qual um cliente possui uma conta contm o conjunto de todas as agncias de StaCruz. A consulta pode ser escrita assim: select distinct S.cliente_nome from deposito S where (select T.agencia_nome from deposito T where S.cliente_nome = T.cliente_nome) contains (select agencia_nome from agencia where agencia_cidade = StaCruz)

22

Exerccio 11: identifique outras possveis consultas que possam ser reescritas com a clusula contains.

2.6 Ordenando a exibio de tuplas - Clusula ORDER BY


Esta clusula permite a ordenao do resultado da consulta. utilizada aps a clusula Where.

Sintaxe: ORDER BY <Lista de atributos> [desc] [asc] {desc - ordem decrescente, asc - ordem crescente}

Ex: Buscar os nomes dos clientes em ordem alfabtica com emprstimo na agncia Ag3": select distinct cliente_nome from emprestimo where agencia_nome = Ag3" order by cliente_nome

Ex2: Listar todos os emprstimos na ordem decrescente de quantia e os emprstimos com a mesma quantia devem ser ordenados pelo nmero do emprstimo. select * from emprestimo order by quantia desc, emprestimo_numero asc

Exerccio 12: Buscar os dados de todas as consultas do paciente Carlos, ordenadas de forma decrescente pela hora da consulta.

2.7 Agrupando tuplas - Clusulas GROUP BY e HAVING


* * * Group by: agrupa partes do resultado de uma consulta, a partir do qual possvel utilizar funes de agregao (avg, min, max, count, sum); Having: Especifica condies para a formao de um grupo. S existe associado clusula group by. As condies s podem envolver os atributos a serem buscados ou alguma funo de agregao.

Exemplos:

23

1) Encontre o saldo mdio de conta em cada agncia: select agencia_nome, avg(saldo) from deposito group by agencia_nome

obs: as duplicatas so mantidas.

2) Encontre o nmero de depositantes de cada agncia: select agencia_nome, count(distinct cliente_nome) from deposito group by agencia_nome

obs: evita-se as duplicaes com a clusula distinct.

3) Buscar as agncias nas quais a mdia dos saldos maior do que 1200: select agencia_nome, avg(saldo) from deposito group by agencia_nome having avg(saldo) > 1200

4) Obter as agncias com maior mdia de saldos: select agencia_nome from deposito group by agencia_nome having avg(saldo) >= all (select avg(saldo) from deposito group by agencia_nome) obs: no possvel usar max(avg(...)).

5) Encontre a mdia dos saldos de todos os depositantes que vivem em StaCruz e tm pelo menos 3 contas. (uso de where e having juntos) select avg(saldo) from deposito, cliente where deposito.cliente_nome= cliente.cliente_nome and cliente.cidade= StaCruz

24

group by deposito.cliente_nome having count(distinct conta_numero) >= 3 obs: O predicado na clusula where aplicado antes do predicado de having.

Exerccio 13: 1) buscar todas as datas de consultas e o total de consultas para esta data. 2) buscar somente as datas e o total de consultas para horrios aps as 14 horas 3) buscar somente as datas e o total de consultas para as datas onde haja mais de uma consulta marcada. 4) buscar, para a tabela de mdicos, todas as idades e o total de mdicos com a mesma idade. 5) buscar o nome dos mdicos com mais de uma consulta marcada.

2.8 Comandos de atualizao + comandos de consulta


Expresses de consulta podem estar associadas aos comandos de atualizao de dados, para melhor restringir o universo de tuplas a serem atualizadas. Os comandos usados so os j apresentados delete e update. Exemplos: 1) Remover todas as contas em agncias localizadas em Canoas delete deposito where agencia_nome in (select agencia_nome from agencia where agencia_cidade = Canoas)

2) Remover todas as consultas do mdico Joo: delete consultas where codm in ( select codm from medicos where nomem = Joo)

3) Acrescentar 5% de juros sobre contas cujos saldos sejam maiores do que a mdia: update deposito set saldo = saldo * 1.05 where saldo > (select avg (saldo) from deposito)

4) Passar para as 19hs todas as consultas da paciente Ana

25

update consultas set hora = 19:00" where codp in (select codp from pacientes where nomep = Ana)

26

3. Vises em SQL
Um banco de dados composto de vrias tabelas relacionadas. Se quisermos obter qualquer informao, devemos citar essas tabelas nas consultas. Algumas consultas so bastante utilizadas no dia-a-dia e so complexas de escrever, devido ao uso de subconsultas. Muitas vezes os usurios no tm conhecimento adequado para formular tais consultas. Nesse caso, o DBA poderia colocar algumas consultas prontas disposio, as quais seriam acessadas com consultas simples. As vises so tabelas virtuais derivadas das tabelas do banco de dados e so teis para garantir segurana de acesso ao BD, disponibilizao de tabelas que melhor se adequam s necessidades de uma aplicao e facilitade de acesso aos dados sem ter que formular consultas complexas.

Exemplos: a) Um funcionrio do hospital no deve ter acesso a todos os dados pessoais de um paciente, somente ao seu cdigo e nome; b) Pode ser interessante vincular os dados de um mdico aos dados de suas consultas

A criao de vises em SQL obedece a seguinte sintaxe:

create view <nome_viso> as <expresso_consulta>

obs: a viso criada no executada, e sim, armazenada no catlogo. Porm, para o usurio como se tivesse uma viso <nome_viso> armazenada no BD.

Para remover uma viso, usa-se o comando

drop view <nome_viso>

obs: a vis o especificada eliminada (a definio removida) e todas as vises definidas em termos desta viso tambm so automaticamente anuladas. Porm os dados continuam existindo, j que a viso uma tabela virtual.

Exemplos: a) A seguir criada uma viso chamada DadosPac, que, do ponto de vista do usurio comum, corresponde a uma tabela como outra qualquer. Esta viso retorna somente o cdigo e o nome de todos os pacientes do hospital. Se um funcionrio desse hospital tiver acesso somente a tabela (viso) DadosPac, ento ele no ver o problema do paciente, o qual um atributo da tabela pacientes. create view DadosPac as select codp, nomep

27

from pacientes

b) A vis o a seguir, chamada MedCons contm os nomes dos mdicos e suas datas e horas de consulta. Observe que para obter essa informao, precisamos das tabelas de mdicos e consultas e da juno entre os atributos codm das duas tabelas. A viso facilita a consulta j que, aps a sua criao, basta pedirmos para ver todos os dados da tabela MedCons que automaticamente a consulta da viso processada, sem termos que defini-la novamente. create view MedCons as select nomem, data, hora from medicos, consultas where medicos.codm = consultas.codm

Obs: Uma vez definida uma viso, qualquer operao de consulta ou atualizao pode ser aplicada sobre ela. Operaes realizadas sobre uma viso se refletem diretamente sobre as tabelas fsicas das quais ela deriva.

3.1 Consultas sobre Vises


Nas operaes de recuperao (select) o processo de converso das operaes em viso para operaes em tabelas bsicas bem direto e funciona bem.

Exemplos: a) o funcionro do hospital deseja buscar o nome de todos os pacientes cadastrados que comeam com a letra R: select nomep from DadosPac where nomep like R*

O sistema (tradutor) converte esta consulta em: select nomep from pacientes where nomep like R*

b) Buscar o nome dos mdicos com consulta marcada para horrios aps as 18hs no ms de outubro: select nomem from MedCons

28

where hora > 18 and data like */10/94"

O sistema (tradutor) converte esta consulta em: select nomem from medicos, consultas where medicos.codm=consultas.codm and hora > 18 and data like */10/94"

3.2 Atualizaes
* Operaes de insero, atualizao e remoo de tuplas (insert, update e delete) em uma viso muitas vezes geram problemas. Nem todas as vises so atualizveis

Situao 1: Insero de tuplas na viso MedCons Problemas: - violao da regra de integridade de entidade; (a chave primria no est na viso) - perde-se o relacionamento entre mdicos e consultas

Situao 2: Viso que relaciona total de consultas de um determinado paciente. create view ConsPac as select codp, count (*) from consultas group by codp

Problemas: insero nesta viso viola a regra de integridade de entidade e no se pode inserir no campo count(*); No se pode atualizar um atributo calculado.

3.3 Vantagens das vises


- Elas fazem com que o mesmo dado seja visto por diferentes usurios de diferentes formas (ao mesmo tempo) - A percepo do usurio simplificada; - bvio que o mecanismo da viso possibilita aos usurios centrarem-se unicamente nos dados que lhes

29

so importantes e ignorarem o resto. O que talvez no seja to bvio que, pelo menos na recuperao (select), tal mecanismo tambm possa simplificar consideravelmente as operaes de manipulao de dados feitas pelo usurio. - Segurana automtica para os dados ocultos Dados ocultos so aqueles no visveis atravs de determinada viso. Ficam claramente protegidos por meio desta viso especfica. Assim, obrigar os usurios a acessar o banco de dados atravs de vises um mecanismo simples, porm eficaz de controle de autorizao.

3.4 Algumas solues para problemas com vises


- Impedir operaes de atualizao sobre vises - As tuplas de uma viso devem corresponder a tuplas que tenham condies de serem identificadas nas tabelas fsicas das quais ela deriva; - Cada atributo de uma viso deve corresponder a um atributo distinto e identificvel de alguma das tabelas fsicas das quais ela deriva.

Exerccio 14: Dada o BD de peas e fornecedores: fornecedores (codf, nomef, cidade) peas (codp, nomep, peso, cor) fornecem (codf, codp, qtde)

e dada a definio de viso: create view peas_pesadas as select codp, peso, cor from peas where peso > 20

Demonstrar a operao executada (isto , a forma convertida) do que segue: a) select * from peas_pesadas where cor = preto b) update peas_pesadas set cor = branco where peso = 30 c) insert into peas_pesadas values (P4", 52, vermelha)

30

4. Autorizaes de Acesso
Muitos SGBDs relacionais podem ser acessados por diversos usurios. Cada usurio tem uma determinada necessidade em relao aos dados armazenados. De acordo com o projeto do banco de dados, alguns usurios s podem consultar alguns dados, outros podem atualizar, outros podem inserir, etc. Para que o dado fique protegido do uso indevido de qualquer usurio, a linguagem SQL permite a definio dos privilgios que cada um pode ter em relao s tabelas criadas no banco de dados. Os privilgios garantem a segurana e integridade dos dados, bem como a responsabilidade de cada usurio sobre seus dados especficos.

4.1. Comando Grant


Este comando garante privilgios para os usurios sobre tabelas/vises.

GRANT <privilgios> ON <nome_tabela/view> TO <usurios>

<privilgios> podem ser: Select: Insert: Delete: Update: All Privileges/all: pode executar uma consulta sobre a tabela pode executar uma insero sobre a tabela pode apagar registros da tabela pode modificar registros da tabela pode executar qualquer operao sobre a tabela

<usurio>: PUBLIC:

nome do usurio que vai receber os privilgios. Deve ser um nome cadastrado dentro do ambiente. concede os privilgios especificados a todos os usurios do ambiente

Exemplos: - grant select on medicos to Paulo permite somente consultas do usurio Paulo na tabela de mdicos - grant select, insert, update on consultas to Mary concede ao usurio Mary os privilgios de seleo, insero e atualizao sobre a tabela consultas - grant all privileges on DadosPac to public permite todos os privilgios a todos os usurios sobre a tabela (neste caso, viso) DadosPac.

31

4.2. Comando Revoke


Este comando revoga os privilgios de acesso aos usurios.

REVOKE <privilgios> ON <nome_tabela/view> FROM <usurios>

Exemplos: - revoke select on medicos from Paulo - revoke all on DadosPac to public - revoga todos os direitos sobre a viso DadosPac

32

5. Mais Exerccios
1) BD formado pelas seguintes tabelas: medicos (codm, nomem, idade, especialidade) pacientes (codp, nomep,idade, problema) consultas (codm, codp, data, hora)

a) Mostrar todos os dados da tabela de consultas. SELECT * FROM CONSULTAS

b) Mostrar os dados dos mdicos classificados por ordem de cdigo SELECT * FROM MEDICOS ORDER BY codm ASC

c) Obter os nomes e cdigos de todos os mdicos cirurgies SELECT nomem, codm FROM MEDICOS WHERE especialidade= cirurgia

d) fornecer os nomes e cdigos de todos os mdicos e seus respectivos dias de consulta SELECT nomem, data FROM medicos, consultas WHERE medicos.codm = consultas.codm

e) fornecer os nomes dos mdicos que possuem alguma consulta marcada com o paciente P4 Vrias solues possveis: e.1) SELECT nomem FROM medicos WHERE codm in (SELECT codm FROM consultas WHERE codp= P4") e.2) SELECT nomem FROM medicos WHERE P4" in ( SELECT codp

33

FROM consultas WHERE codm = medicos.codm) e.3) SELECT nomem FROM medicos WHERE EXISTS (SELECT * FROM consultas WHERE codm = medicos.codm and CODP = P4")

f) mostrar os nomes dos mdicos que no tm consulta marcada com a paciente P4 SELECT nomem FROM medicos WHERE NOT EXISTS (SELECT *

FROM consultas WHERE codp = P4" and codm = medicos.codm)

g) Mostrar os nomes dos mdicos que no tem consulta marcada com a paciente Maria

SELECT nomem FROM medicos WHERE codm IN (SELECT codm FROM consultas WHERE codp NOT IN ( SELECT codp

FROM pacientes WHERE nome = Maria)

h) Mostrar o cdigo dos pacientes que tem consulta marcada para o dia 23/09/96 ou com mdicos pediatras.

(SELECT codp FROM consultas WHERE data = 23/09/96") UNION (SELECT codp FROM consultas

34

WHERE codm IN (SELECT codm FROM medicos WHERE especialidade = pediatra)) obs: poderia ter sido utilizado o OR ao invs de UNION na primeira subconsulta?

i) Mostrar os nomes dos mdicos que no fornecem consultas para os pacientes de obstetras.

SELECT nomem FROM medicos WHERE codm NOT IN (SELECT codm FROM consultas WHERE codp IN (SELECT C.codp FROM medicos M, consultas C, pacientes P WHERE M.especialidade = obstetrcia and M.codm = C.codm and C.codp = P.codp))

2) BD formado pelas seguintes tabelas: empregado (codemp, salrio, funo, codd) departamento (codd, cidade, nome) joga (codemp, codtime, posio) time(codtime, nome, endereo)

a) Mostrar os cdigos dos empregados que ganham acima da mdia dos salrios SELECT codemp FROM empregado WHERE salario > (SELECT avg(salario) from empregado)

b) mostrar os departamentos que no tem empregados SELECT codd FROM departamento WHERE codd NOT IN (SELECT distinct codd

35

FROM empregado)

c) mostrar os departamentos com mdia salarial inferior a 500 (obs: no cai na prova) SELECT codd FROM empregado GROUP BY codd HAVING avg(salario) < 500

d) mostrar os departamentos que possuem mais de 10 programadores (obs: no cai na prova) select codd from empregado where funcao = programador group by codd having count(*) > 10

e) mostrar o nome do time do empregado de maior salrio

SELECT nome FROM time WHERE codtime IN (SELECT codtime FROM joga WHERE codemp IN (SELECT codemp FROM empregado WHERE salario IN (SELECT Max(Salario) FROM empregado)))

f) mostrar o maior salrio dos empregados que jogam na ponta direita SELECT max(salario) FROM empregado, joga WHERE posicao = ponta direita and (joga.codemp = empregado.codemp)

g) mostrar a posio e o cdigo dos empregados de maior salrio em cada departamento (obs: no cai na prova)

36

select codemp, posicao from joga where codemp in (select codemp from empregado where salario in (select max(salario) from empregado group by codd))

37

6 O Futuro do Padro SQL


Recentemente temos assistido ao aumento da popularidade dos bancos de dados orientados a objetos (OODBMS -Object Oriented Database Management System). Um banco de dados orientado a objetos aquele que incorpora objetos complexos, tipos abstratos de dados (Abstract Data Types - ADTs), encapsulamento e herana [MULL,1994]. Mantelman define um objeto complexo como aquele que armazena procedimentos alm de dados, e estende a definio de um banco de dados orientado a objetos dizendo que no h restries a dados baseados em caracteres e que podem ser acomodados objetos multimdia [MANT,1996]. Os bancos de dados orientados a objetos tratam os dados de modo diferente dos bancos de dados relacionais. Estes implementam acesso aos dados atravs de linhas e colunas, enquanto os orientados a objetos tm uma estrutura mais complexa, que no suportada pelo padro SQL92. Como alguns fornecedores de SGBDs comearam a acrescentar a seus produtos caractersticas alm do escopo do padro SQL92, houve a necessidade de se estudar um novo padro, de modo a garantir a portabilidade entre os vrios SGBDs. Da a necessidade do SQL3. Algumas das caractersticas implementadas incluem tipos de dados novos e estendidos, incluindo tipos de dados abstratos, mltiplos tipos de estados nulos, suporte para objetos e identidade de objetos, encapsulamento, herana e triggers. O SQL92 tem um conjunto de tipos de dados atmicos. No SQL3, estes tipos de dados so mantidos como tipos de dados pr-definidos, embora alguns tenham sido modificados ou estendidos. Por exemplo, os tipos de dados character e bit foram estendidos para incluir o conceito de um "objeto maior"(large object). Estes "large objects" facilitam o uso de objetos multimdia dentro do banco de dados. Dois tipos adicionais de dados, antes no suportados, foram includos: boolean e enumerated. O tipo boolean somente pode ter os valores "true", "false" e "unknown". O tipo enumerated permite que se defina domnios cujos valores so restritos a um pequeno conjunto de valores. Como exemplo, teramos o comando CREATE DOMAIN cores (azul, vermelho, amarelo) que define um domnio chamado cores e restringe os valores inseridos na coluna de tipo enumerated a um dos trs valores especificados para o domnio [MELT,1995]. Ao contrrio do SQL92, o SQL3 suporta mltiplos estados nulos. Isto significa que diferentes classes de null so suportadas, permitindo s aplicaes definir os significados de determinado estado nulo. Possveis significados incluem "unknown" (como vimos acima, no caso do tipo enumerated), "missing", "not applicable" ou "pending". Cada definio de nulo tem uma representao diferente que o torna identificvel durante uma consulta ou atualizao. O segundo grupo de objeto de dados suportado pela nova verso, e no suportado pela anterior, o tipo abstrato de dados (ADT). O ADT utilizado pelo SQL3 para possibilitar o uso de objetos na estrutura SQL. O ADT permite aos usurios criar novos tipos de dados definindo tipos abstratos de dados a partir de tipos de dados pr-definidos ou a partir de outros ADTs j existentes. Os ADTs suportam os conceitos de encapsulamento e subtipos da orientao a objetos. Estendendo o que vimos acima, objetos so itens de dados que combinam complexas estruturas de dados com processos ou mtodos para manipular estes dados. A noo de combinar dados e processos chamada de encapsulamento. Enquanto os tipos de dados que conhecemos no SQL92 so identificados atravs de seus valores, no SQL3, um dado definido como object ser identificado por um identificador nico de objeto, gerado quando o objeto criado. Os conceitos de subtipo e supertipo so baseados no conceito de herana da orientao a objetos, que a capacidade de se criar novos objetos a partir de outros j existentes, herdando suas caracter sticas. Atributos e mtodos podem ser herdados, o que diminui a redundncia de informaes. No SQL3, um ADT pode ser um subtipo de outro ADT. Por exemplo, podemos definir um ADT como um objeto PESSOA. Um subtipo de PESSOA poderia ser ESTUDANTE, que herdaria as propriedades e comportamento de PESSOA. Um subtipo do subtipo ESTUDANTE poderia ser GRADUANDO, que herdaria as caracterstica de PESSOA e ESTUDANTE.

38

Outra importante caracterstica do SQL3 o suporte a triggers. No padro SQL92, esta caracterstica foi deixada de lado porque seu uso foi subestimado. Existe hoje, entretanto, uma grande demanda desta caracterstica por parte dos usurios, e mais e mais fornecedores esto incluindo suporte a triggers em seus produtos, como, por exemplo, a Oracle no seu SGBD Oracle7. Um trigger um objeto do esquema do banco de dados ou um bloco de cdigo que diz ao banco de dados que outras aes devem ser tomadas depois de executados certos comandos SQL. Por exemplo, pode-se querer adicionar um registro a uma tabela de log toda vez que um registro for excludo de uma outra tabela para se manter uma auditoria de quem est realizando as mudanas. Um trigger seria usado neste caso para iniciar uma sequncia de aes (atualizar a tabela de log) depois que uma funo de deleo fosse executada. O trabalho de reviso de um padro para a incluso de novas caractersticas intenso e dinmico. Os fornecedores de SGBDs aumentam o poder de seus produtos adicionando mais e mais caractersticas, algumas delas no cobertas pelo padro atual, o que cria a necessidade de reviso. No caso do SQL3, a incluso de caractersticas de orientao a objetos a mais importante.

39

7 Bibliografia
CAMPOS, Maria Luiza. Laboratrio de Banco de Dados. Departamento de Cincia da Computao UFRJ. Disponvel no endereo http://www.dcc.ufrj.br/~labbd/texto/sql.htm. 1997.

DATE, C. J. Introduo a Sistemas de Bancos de Dados. Ed. Campus. 1991.

LIMA, CARLA A. G. Linguagem SQL. Banco de Dados I - Notas de Aula. Depto. Informtica - UFPA. 1997.

MACHADO, F.N; ABREU, M. Projeto de Banco de Dados: Uma viso prtica. rica. 1995.

STEPHENS, R.; PLEW, R.; MORGAN, B.; PERKINS, J. Teach yourself SQL in 21 days. 2nd Edition. SAMS Publishing, USA, 1997.

40

Das könnte Ihnen auch gefallen