Você está na página 1de 31

Aco Co - Financiada pelo Fundo Social Europeu e Estado Portugus

Base de Dados Linguagem SQL

Ficha Tcnica Editor Universus - Consultores de Gesto, S.A.

Autor Fernando Mesquita Ttulo Base de dados Linguagem SQL Ano 2006

Universus - Consultores de Gesto, S.A

Base de Dados Linguagem SQL

ndice

INTRODUO........................................................................................................... 4 A LINGUAGEM SQL PARA DEFINIO DE DADOS........................................................ 6 A LINGUAGEM SQL PARA MANIPULAO DE DADOS ................................................ 10 BIBLIOGRAFIA................................................................................................... 30 ANEXO

Universus - Consultores de Gesto, S.A

Base de Dados Linguagem SQL

1. INTRODUO Neste captulo abordaremos a linguagem SQL baseada no modelo relacional e que constitui um standard para a manipulao e definio de dados. O SQL uma linguagem declarativa, portanto, o programador limita-se a indicar o objectivo que pretende atingir. O primeiro passo na criao de uma BD corresponde a criar o suporte em disco para a sua estrutura. Depois, necessrio a produo de aplicaes para operar os dados da BD. Assim, iremos apresentar alguns aspectos da linguagem SQL que nos permite atingir estes objectivos. De uma forma geral iremos utilizar as seguintes tabelas de forma a fornecer um exemplo concreto da linguagem: Empregados Cod_emp 7369 7499 7521 7566 7654 7698 7782 7788 7839 7844 7876 7900 7902 7934 Nome Smith Allen Ward Jones Martin Blake Clark Scott King Turner Adams James Ford Miller Cargo Secretario Vendedor Vendedor Gestor Vendedor Gestor Gestor Analista Presidente Vendedor Secretario Secretario Analista Secretario 7698 7788 7698 7566 7782 N_Superior 7902 7698 7698 7839 7698 7839 7839 7566 Data 13-06-1983 15-08-1983 26-03-1984 31-10-1983 05-12-1983 11-06-1984 14-05-1984 05-03-1984 09-07-1984 04-06-1984 04-06-1984 23-07-1984 05-12-1983 21-11-1983 Ordenado 800,00 1600,00 1250,00 2975,00 1250,00 2850,00 2450,00 3000,00 5000,00 1500,00 1100,00 950,00 3000,00 1300,00 Cod_Depar 20 30 30 20 30 30 10 20 10 30 20 30 20 10

Universus - Consultores de Gesto, S.A

Base de Dados Linguagem SQL

Departamento Cod_Depart 10 20 30 40 Nome_Pep Contabilidade Investigao Vendas Operaes Localizao Beja vora Faro Portalegre

Universus - Consultores de Gesto, S.A

Base de Dados Linguagem SQL

2. A LINGUAGEM SQL PARA DEFINIO DE DADOS


a) Criao da estrutura Para a definio da estrutura de dados o SQL possui uma instruo para criar tabelas. Atravs desta instruo podemos definir os atributos, os respectivos domnios de cada tabela e tambm algumas restries de integridade. A sintaxe dessa instruo : CREATE TABLE <nome_da_tabela> ( Atributo1 tipo [(tamanho)] [Not Null] [ndice] ..., Atributo2 tipo [(tamanho)] [Not Null] [ndice] ..., CONSTRAINT Nome <restries> ) Os elementos em parntesis rectos so opcionais. O elemento Atributo1 representa o nome do atributo da tabela. O elemento tipo representa o domnio de cada atributo (INTEGER, SMALLINT, DECIMAL, DOUBLE PRECISION, FLOAT, CHAR, VARCHAR, BIT, DATE, TIME, etc.). Ver anexo 1. Exemplo: CREATE TABLE Alunos ( Cod_Aluno SMALLINT PRIMARY KEY, Nome CHAR(20) NOT NULL, Idade SMALLINT, Cod_Curso SMALLINT, FOREIGN KEY (Cod_Curso) REFERENCES Cursos (Cod_Curso) ON UPDATE CASCADE ON DELETE SET NULL, CHECK (Idade BETWEEN 17 AND 70)

Universus - Consultores de Gesto, S.A

Base de Dados Linguagem SQL

Neste exemplo o Cod_Aluno a chave primria e identificada com as palavras PRIMARY KEY. NOT NULL a restrio mais simples e indica que o contedo desse atributo no nulo para o caso do Nome. A restrio CHECK permite verificar se o contedo de um atributo satisfaz determinada condio. No exemplo, a restrio obriga que a idade do aluno esteja entre 17 e 70 anos. As outras palavras chaves permite-nos estabelecer restries de integridade referencial. Recorrendo ao exemplo observamos a restrio de integridade relativa chave estrangeira Cod_Curso importada da tabela Cursos. As aces ON DELETE SET NULL e ON UPDATE CASCADE existentes na tabela referenciadora (Alunos) permite que perante a remoo de um Cod_Curso na tabela Cursos implicar colocar valores nulos s mesmas ocorrncias na tabela Alunos e se o Cod_Curso for alterado na tabela Cursos implicar a alterao do Cod_Curso na tabela Alunos, respectivamente. Uma outra restrio importante a que permite identificar um ou vrios atributos como chave candidata e representada pela palavra UNIQUE. Exemplo, na tabela cujos atributos so Cod_fornecedor e Nome_fornecedor, o Cod_fornecedor a chave primria e o Nome_fornecedor a chave candidata. Assim, CREATE TABLE Fornecedores ( Cod_fornecedor SMALLINT PRIMARY KEY, Nome_fornecedor CHAR(20) NOT NULL, UNIQUE (Nome_fornecedor) ) Outro aspecto a considerar relativamente as chaves primrias a sintaxe utilizada quando a chave primria composta por mais do que um atributo. Considere que os atributos num_factura e cod_produto so a chave primria de uma tabela, ento a sintaxe utilizada seria: PRIMARY KEY(num_factura, cod_produto).

Universus - Consultores de Gesto, S.A

Base de Dados Linguagem SQL

b) Alterao da estrutura Outra operao que se pode realizar sobre a estrutura de dados a alterao das tabelas existentes. Estas alteraes consistem em adicionar novos atributos ou restries de integridade, na modificao das caractersticas dos atributos e na eliminao de atributos ou das restries de integridade existentes. Exemplo: ALTER TABLE Alunos ADD COLUMN nacionalidade CHAR(15) Comando para adicionar o atributo nacionalidade tabela Alunos. ALTER TABLE Alunos DROP COLUMN nacionalidade Comando para eliminar o atributo nacionalidade tabela Alunos. DROP TABLE Alunos Comando para eliminar a tabela Alunos c) Criao de View

As Views so entidades que permitem a visualizao do contedo das tabelas existentes na BD, portanto so tabelas sem existncia fsica. A definio de cada View armazenada no dicionrio de dados e s quando executado o seu contedo (que depende das tabelas envolvidas na definio) calculado. Contudo, este processo completamente transparente ao nvel aplicacional, garantindo uma independncia lgica. Sintaxe: CREATE VIEW <nome> [(<atributos>)] AS <query> Exemplo: CREATE VIEW topo_de_gama (Cod_prod, designao) AS (SELECT Cod_prod, designao, preo FROM Produtos WHERE preo > 100) Como podemos observar as views depois de criadas, comportam-se como tabelas base para a consulta de dados. Relativamente actualizao das views podemos dizer que genericamente todas as views que derivam de uma nica tabela so actualizveis, desde que o esquema da view inclua a Universus - Consultores de Gesto, S.A
8

Base de Dados Linguagem SQL

chave primria, ou alguma chave candidata, da tabela. Outro aspecto que deve ser considerado para que a view possa ser actualizada refere-se ao facto de que no esquema da view deve existir todos os atributos da tabela base que no so nulos (NOT NULL), especificamente para a view que pretende fazer inseres. Por ltimo, outros aspectos a considerar para que a view possa ser actualizada depende da no existncia de funes de agregao. Outra operao aplicada as views a de remoo, o que implica a remoo da definio da view do dicionrio de dados do sistema. Sintaxe: DROP VIEW <nome> d) Criao de Index O Index uma entidade que nos permite realizar eficientemente uma pesquisa dos dados. O index no seleccionado pelo utilizador. Depois de definidos o sistema que decide que index usar perante o resultado que o utilizador pretender. Sintaxe: CREATE [UNIQUE] INDEX<nome> ON <nome_da_tabela> ( noma_atributo1 [ASC|DES], ..) Os parntesis rectos indicam que esses elementos so opcionais. A palavra UNIQUE indica que esse ndice no pode ter valores duplicados. Assim, a opo PRIMARY indica que o(s) atributo(s) envolvido(s) so a chave primria. Nota1: como lgico no necessrio utilizar a opo UNIQUE quando utilizamos a opo PRIMARY. Nota2: s possvel criar um index de cada vez com este comando. Exemplo: CREATE INDEX Chave_prim ON Clientes (Cod_cliente); Outra operao aplicada ao index a de remoo. Sintaxe: DROP INDEX <nome> ON <nome_da_tabela>

Universus - Consultores de Gesto, S.A

Base de Dados Linguagem SQL

3. A LINGUAGEM SQL PARA MANIPULAO DE DADOS


A SQL possui dois grupos de comandos para a manipulao de dados, um para a consulta da BD e outro para a actualizao da BD. a) Comandos para a actualizao da BD INSERT INTO um dos comandos do SQL que permite a introduo de dados nas tabelas. Sintaxe: INSERT INTO <nome_tabela> [(atributo1,atributo2, atributo3,...)] VALUES (<valores>) Os parntesis rectos indicam que esses elementos so opcionais. Os dados de cada atributo (separados por vrgulas) so introduzidos atravs da palavra VALUES. Exemplos: INSERT INTO Departamento VALUES (50, 'Manuteno' , 'Lisboa') Resultado: Tabela Departamento Cod_Depart 50 Nome_pep Manuteno Localizao Lisboa

INSERT INTO Departamento (Cod_Depart, Nome_pep, Localizao) VALUES (50, 'Manuteno' , 'Lisboa') O resultado o mesmo que o exemplo anterior. Esta sintaxe permite inserir dados nas colunas (atributos) especificadas. A alterao de valores em um ou mais atributos numa tabela e com critrios especficos realizada atravs do comando UPDATE. Sintaxe: UPDATE <nome_tabela> SET <atributo> = <expresso>, ... [WHERE <condio>] A palavra SET define quais so os atributos que se pretende actualizar e os novos valores para esse atributo. A palavra WHERE opcional e utilizada quando se pretende condicionar os tuplos. Exemplo: Universus - Consultores de Gesto, S.A
10

Base de Dados Linguagem SQL

UPDATE Empregado SET Ordenado = Ordenado + 500 WHERE Num_Superior=7589 Este conjunto de comandos soma ao ordenado mais 500 dos empregados cujo superior tenha o cdigo 7589. A eliminao de valores em um ou mais tuplos numa tabela e com critrios especficos realizada atravs do comando DELETE. Sintaxe: DELETE FROM <nome_tabela> [WHERE <condio>] Exemplo: DELETE FROM Empregado WHERE Num_Superior=7589 Este conjunto de comandos elimina os empregados cujo superior tenha o cdigo 7589. b) Comandos para a consulta da BD As instrues fundamentais para a realizao de consultas so: SELECT <atributo1, atributo2,...> FROM <nome_tabela1, nome_tabela2,...> [WHERE <condio>] A comando SELECT selecciona conjunto de atributos de uma(s) tabela(s) dada(s) pelo comando FROM. Exemplo: SELECT Cod_aluno, Nome, Morada FROM Aluno

Universus - Consultores de Gesto, S.A

11

Base de Dados Linguagem SQL

O resultados deste cdigo : Cod_aluno 1 2 ... Nome Maria Mrio .. Morada Beja vora ..

O comando SELECT permite incluir expresses aritmticas e modificar o nome dos atributos. Uma expresso pode ser uma combinao de valores, operadores e funes que produzem um valor. Os operadores aritmticos que podemos incluir so: Operadores + * / Exemplo: SELECT Cod_emp, Ordenado*12 FROM Empregado; Cod_emp 7369 7499 7521 7566 7654 7698 7782 7788 7839 7844 7876 Expr1 9600,00 19200,00 15000,00 35700,00 15000,00 34200,00 29400,00 36000,00 6000,00 18000,00 13200,00 Descrio Soma Subtraco Multiplicao Diviso

Universus - Consultores de Gesto, S.A

12

Base de Dados Linguagem SQL

7900 7902 7934

1.1400,00 3.6000,00 1.5600,00

Ao observar o resultado da consulta anterior podemos verificar que o nome da coluna no tem sentido. Utilizando o comando SELECT possvel alterar o nome na coluna. Exemplo: SELECT Cod_emp, Ordenado*12 Ordenado_Anual FROM Empregado; Cod_emp 7369 7499 7521 7566 7654 7698 7782 7788 7839 7844 7876 7900 7902 7934 Ordenado_Anual 9600,00 19200,00 15000,00 35700,00 15000,00 34200,00 29400,00 36000,00 6000,00 18000,00 13200,00 11400,00 36000,00 15600,00

Por ltimo, e ainda utilizando o comando SELECT, possvel eliminar valores duplicados utilizando a palavra DISTINCT. Nota: Existem funes que poderemos utilizar com o comando SELECT, como iremos verificar mais frente neste captulo. Exemplo: SELECT Cod_Depar, Cargo FROM Empregado ORDER BY Cod_Depar; Universus - Consultores de Gesto, S.A
13

Base de Dados Linguagem SQL

Cod_Depar 10 10 10 20 20 20 20 20 30 30 30 30 30 30

Cargo Gestor Presidente Secretario Secretario Gestor Analista Secretario Analista Vendedor Vendedor Vendedor Gestor Vendedor Secretario

Nesta consulta pretende-se saber quais so os cargos que existem em cada departamento. Como podemos observar existem linhas repetidas. Para evitar esta situao utilizamos a palavra DISTINCT. SELECT DISTINCT Cod_Depar, Cargo FROM Empregado ORDER BY Cod_Depar;

Universus - Consultores de Gesto, S.A

14

Base de Dados Linguagem SQL

Cod_Depar 10 10 10 20 20 20 30 30 30

Cargo Gestor Presidente Secretario Analista Gestor Secretario Gestor Secretario Vendedor

Nota: Repare que a palavra DISTINCT se encontra a seguir palavra SELECT. O comando ORDER BY utilizado para ordenar tuplos. Neste exemplo, os tuplos so ordenados por cdigo de departamento que, por defeito, realizado de forma ascendente, apresentando os valores numricos mais baixos primeiro. Para inverter esta sequncia, utiliza-se a palavra DESC. Exemplo: SELECT Cod_Emp, Data FROM Empregado ORDER BY Data DESC; Cod_emp 7900 7839 7698 7876 7844 7782 7521 7788 7902 7654 Universus - Consultores de Gesto, S.A Data 23-07-1984 09-07-1984 11-06-1984 04-06-1984 04-06-1984 14-05-1984 26-03-1984 05-03-1984 05-12-1983 05-12-1983
15

Base de Dados Linguagem SQL

7934 7566 7499 7369

21-11-1983 31-10-1983 15-08-1983 13-06-1983

Esta consulta apresenta-nos o cdigo do empregado e a data da sua entrada no departamento, de forma a que as datas mais recentes sejam apresentadas primeiro. O comando WHERE corresponde ao operador de seleco da lgebra relacional. O comando WHERE utilizado a seguir ao comando FROM e contm uma(s) condio(s) que os tuplos tm que satisfazer para que sejam visualizados. A palavra WHERE dever possuir trs elementos: 1. O nome do atributo. 2. O operador de comparao. 3. O nome de um atributo, uma constante ou uma lista de valores. Os operadores de comparao podem ser divididos em duas categorias: lgicos e SQL. Os operadores lgicos testam as seguintes condies: Operador = > >= < <= <> Significado Igual a Maior que Maior ou igual que Menor que Menor ou igual que Diferente

Universus - Consultores de Gesto, S.A

16

Base de Dados Linguagem SQL

Para listar os nomes, os cargos e departamentos de todos os empregados cujo cargo de secretrio devemos utilizar o seguinte conjunto de comandos: SELECT Nome, Cargo, Cod_Depar FROM Empregado WHERE Cargo='Secretario'; Relativamente aos operadores SQL, existem quatro, que operam sobre todos os tipos de dados: Operador BETWEEN ..AND.. Entre dois valores IN(lista) LIKE IS NULL Corresponde a qualquer valor da lista Cadeia de caracteres que satisfaz uma condio um valor nulo Significado

Utilizaremos exemplos para ilustrar estes operadores. Exemplo: Para encontrar todos os empregados que tm como superior as pessoas com cdigo 7902, 7566 e 7788. SELECT Nome, N_Superior FROM Empregado WHERE N_Superior IN (7902,7566,7788); Nome Smith Scott Adams Ford N_Superior 7902 7566 7788 7566

Exemplo: Para listar todos os nomes dos empregados que comecem por um S. Neste exerccio necessrio utilizar um dos smbolos para construir a cadeia de caracteres de pesquisa. Este smbolo %, que representa qualquer sequncia com vrios caracteres ou nenhum.

Universus - Consultores de Gesto, S.A

17

Base de Dados Linguagem SQL

SELECT Nome FROM Empregado WHERE Nome LIKE 'S%'; Nome Smith Scott Exemplo: Pretende-se encontrar o nome do empregado que no tenha superior hierrquico. SELECT Nome, N_Superior FROM Empregado WHERE N_Superior IS NULL; Nome King Ainda sobre os operadores de comparao utilizados no comando WHERE, existem as respectivas expresses de negao: Operador NOT BETWEEN ..AND.. NOT IN(lista) NOT LIKE IS NOT NULL <> Significado No entre dois valores Corresponde a nenhum valor da lista Cadeia de caracteres que no satisfaz uma condio um valor no nulo Diferente N_Superior

Universus - Consultores de Gesto, S.A

18

Base de Dados Linguagem SQL

Exemplo: Para encontrar os empregados cujo ordenado no esteja entre 1000 e 2000. SELECT Nome, Ordenado FROM Empregado WHERE Ordenado NOT BETWEEN 100000 AND 200000; Nome Smith Jones Blake Clark Scott King James Ford Ordenado 800,00 297.500,00 2850,00 2450,00 3000,00 5000,00 950,00 3000,00

At agora realizamos consultas BD com condies simples. Para podermos consultar dados com condies mltiplas so utilizados os operadores AND e OR, que nos permitem construir expresses lgicas compostas. O operador AND esperar que ambas as condies sejam verdadeiras para que as linhas sejam visualizadas, enquanto que o operador OR esperar que uma das condies seja verdadeira. Pretendemos encontrar os empregados cujo cargo seja de secretrio e o seu ordenado se encontre entre 100000$ e 200000$. Ento o nosso cdigo em SQL ser: SELECT Nome, Ordenado,Cargo FROM EMPREGADO WHERE Ordenado BETWEEN 100000 AND 200000 AND Cargo='Secretrio'; Nome Adams Miller Ordenado 1100,00 1300,00 Cargo Secretario Secretario

Universus - Consultores de Gesto, S.A

19

Base de Dados Linguagem SQL

Pretendemos encontrar os empregados cujo cargo seja de secretrio ou o seu ordenado se encontre entre 100000$ e 200000$. Ento o nosso cdigo em SQL ser: SELECT Nome, Ordenado, Cargo FROM Empregado WHERE Ordenado BETWEEN 100000 AND 200000 OR Cargo='Secretrio'; Nome Smith Allen Ward Martin Turner Adams James Miller Ordenado 800,00 1600,00 1250,00 1250,00 1500,00 1100,00 950,00 1300,00 Cargo Secretario Vendedor Vendedor Vendedor Vendedor Secretario Secretario Secretario

Para por em prtica todos estes conceitos efectue os seguintes exerccios: 1. Realize em linguagem SQL uma consulta que apresente todos os tipos de cargos que existem na BD INFO. 2. Realize em linguagem SQL uma consulta que apresente toda a informao dos empregados dos departamentos 10 e 20 por ordem alfabtica do nome. 3. Realize em linguagem SQL uma consulta que apresente os nomes e os cargos dos secretrios do departamento 20.

b .1.) Consultas sobre grupos de dados Na linguagem SQL possvel obter resultados baseados em grupos de tuplos ao contrrio daquilo que temos feito at agora. Assim, existem funes de grupo que operam sobre conjuntos de tuplos. O comando GROUP BY utilizado para dividir os tuplos de uma tabela em grupos mais pequenos. Algumas das funes de grupo so as abaixo indicadas:

Universus - Consultores de Gesto, S.A

20

Base de Dados Linguagem SQL

Funo AVG(n) COUNT(expr) MAX(expr) MIN(expr) SUM(n)

Valor produzido Valor mdio de n Nmero de vezes que a expr toma um valor Valor mximo de expr Valor mnimo de expr Soma dos valores de n

Expr indica os argumentos que podem ser do tipo CHAR, Number ou DATE. Todas as funes de grupo, excepo de COUNT(*), ignoram os valores nulos. Torna-se ainda importante destacar que as funes de grupo por si s tratam todos os tuplos de uma tabela como um grupo. Para calcular a mdia dos ordenados de todos os empregados teramos o seguinte cdigo em SQL: SELECT AVG(Ordenado) FROM Empregado; Outro exemplo, para encontrar o ordenado mnimo recebido por um secretrio, teramos: SELECT MIN(Ordenado) FROM Empregado WHERE Cargo='secretario'; A palavra GROUP BY utilizada para dividir tuplos da tabela em grupos mais pequenos. As funes de grupo podem ser utilizadas para produzir informao resumida para cada grupo. Exemplo: Pretende-se calcular o ordenado mdio para cada cargo. SELECT Cargo, AVG(Ordenado) MdiaDeOrdenado FROM Empregado GROUP BY Cargo; Cargo Analista Gestor Presidente Secretario Vendedor Mdia De Ordenado 3000,00 275.833,33 5000,00 103.750,00 1400,00

Universus - Consultores de Gesto, S.A

21

Base de Dados Linguagem SQL

O comando GROUP BY pode ser utilizado para obter resultados de grupos contidos em outros grupos. Exemplo: Apresente o cdigo em SQL que permite visualizar o ordenado mensal para cada cargo dentro de cada departamento. SELECT Cargo, Cod_Depar, AVG(Ordenado) MdiaDeOrdenado FROM Empregado GROUP BY Cod_Depar, Cargo ORDER BY Cod_Depar; Cargo Gestor Presidente Secretario Analista Gestor Secretario Gestor Secretario Vendedor MdiaDeOrdenado 2450,00 5000,00 1300,00 3000,00 2975,00 950,00 2850,00 950,00 1400,00 Cod_Depar 10 10 10 20 20 20 30 30 30

NOTA: Pode observar que se incluir funes de grupo no comando SELECT, no poder seleccionar resultados individuais a no ser que o atributo aparea no comando GROUP BY. Se pretender introduzir restries ao grupo de tuplos no poder faz-lo com o comando WHERE, mas sim com HAVING. Esta palavra normalmente colocada depois do comando GROUP BY, pois os grupos so formados antes de impor as restries.

Universus - Consultores de Gesto, S.A

22

Base de Dados Linguagem SQL

Exemplo: Apresente os cargos cujo ordenado mximo maior ou igual a 3000. SELECT Cargo, MAX(Ordenado) MaxDeOrdenado FROM Empregado GROUP BY Cargo HAVING MAX(Ordenado) >= 300000; Cargo Analista Presidente MaxDeOrdenado 3000,00 5000,00

Para por em prtica estes conceitos efectue os seguintes exerccios: 1.- Realize em linguagem SQL uma consulta que apresente o ordenado mais baixo, mais alto e mdio de todos os empregados. 2.- Realize em linguagem SQL uma consulta que apresente todos os departamentos que tm mais do que trs empregados. b .2.) Subconsultas Uma subconsulta um comando SELECT que est encadeado noutro comando SELECT, produzindo resultados intermdios. Uma subconsulta utilizada quando necessrio seleccionar tuplos de uma tabela com uma condio que dependa de dados da mesma tabela. Pretende-se encontrar o empregado que ganhe o menor ordenado na empresa INFO. Como no sabemos qual o ordenado mnimo devemos encontra-lo: SELECT MIN(Ordenado) FROM Empregado; Depois devemos encontrar o empregado que ganha esse ordenado: SELECT Nome, Cargo, Ordenado FROM Empregado WHERE Ordenado = (ordenado mnimo)

Universus - Consultores de Gesto, S.A

23

Base de Dados Linguagem SQL

Assim, podemos combinar os dois cdigos: SELECT Nome, Cargo, Ordenado FROM Empregado WHERE Ordenado = (SELECT MIN(Ordenado) FROM Empregado); Desta forma diramos que existem dois blocos de consulta: a consulta externa e a consulta interna, onde a consulta interna executada primeiro. A consulta interna tal e qual como a estamos a realizar produz apenas um resultado, no ltimo exemplo esse resultado o valor mnimo do ordenado. Exemplo: Apresente o cdigo em SQL que no indique o nome e a funo dos empregados que tenham o mesmo cargo que BLAKE. Primeiro devemos obter o cargo de BLAKE e depois encontrar os empregados com esse cargo. SELECT Nome, Cargo FROM Empregado WHERE Cargo = (SELECT Cargo FROM Empregado WHERE Nome='Blake'); Nome Clark Blake Jones Cargo Gestor Gestor Gestor

A consulta que se segue pretende encontrar os empregados que ganham o menor ordenado, em cada departamento. SELECT Nome, Cod_Depar, Ordenado FROM Empregado WHERE (Ordenado, Cod_Depar)IN(SELECT MIN(Ordenado), Cod_Depar FROM Empregado GROUP BY Cod_Depar);

Repare que a consulta interna produz mais que um valor, logo o operador utilizado o IN pois espera-se uma lista de valores. Universus - Consultores de Gesto, S.A
24

Base de Dados Linguagem SQL

As subconsultas podem tambm ser utilizadas dentro da palavra HAVING. Suponha que se pretende obter os departamentos que tenham um ordenado mdio superior ao do departamento 30. Para obter-mos este resultado devemos calcular a mdia dos ordenados do departamento 30 ( apenas um valor!). Seguidamente iremos calcular a mdia dos ordenados de cada departamento e verificar a condio. SELECT Cod_Depar, AVG(Ordenado) FROM Empregado GROUP BY Cod_Depar HAVING AVG(Ordenado) > (SELECT AVG(Ordenado) FROM Empregado WHERE Cod_depar = 30); Para por em prtica estes conceitos efectue os seguintes exerccios: 1.- Realize em linguagem SQL uma consulta (subconsulta) que apresente o nome, cargo e data dos empregado cujo ordenado superior ao ordenado mais elevado de qualquer dos departamentos de Vendas. 2.- Realize em linguagem SQL uma consulta (subconsulta) que apresente o nome, o cargo e o ordenado dos empregado que ganham o ordenado mais elevado em cada cargo. Outra operao a realizar sobre a BD a juno (join). Uma juno utilizada quando uma consulta SQL requer extrair dados de mais de uma tabela da BD, com base numa condio de juno. Esta condio de juno depende, geralmente, das colunas comuns que existem entre as tabelas onde se pretende realizar esta operao. Em alguns casos, pode ser necessrio efectuar uma juno entre colunas da mesma tabela. Exemplo: Realize uma consulta onde se visualize o nome do empregado, o cargo, e o nome do departamento ao qual o empregado pertence. SELECT Nome, Cargo, Nome_pep FROM Empregado, Departamento WHERE Cod_Depar=Cod_Depart;

Universus - Consultores de Gesto, S.A

25

Base de Dados Linguagem SQL

Nome Clark King Miller Smith Jones Scott Adams Ford Allen Ward Martin Blake Turner James

Cargo Gestor Presidente Secretario Secretario Gestor Analista Secretario Analista Vendedor Vendedor Vendedor Gestor Vendedor Secretario

Nome_Pep Contabilidade Contabilidade Contabilidade Investigao Investigao Investigao Investigao Investigao Vendas Vendas Vendas Vendas Vendas Vendas

Ao observar o resultado da consulta podemos verificar que para cada empregado, mostrado o nome do departamento ao qual ele pertence. Isto possvel devido a condio que existe no comando WHERE, onde apenas so visualizados os tuplos onde o Cod_Depar do empregado igual ao Cod_Depart do departamento. O exemplo seguinte permite obter dados de mais do que uma tabela, incluindo tpicos cobertos anteriormente. Exemplo: Apresente o nome, a localidade e o nome do departamento dos empregados cujo ordenado mensal superior a 150000$, ordenados pelo nome do departamento. SELECT Nome, Localizao, Nome_pep FROM Empregado, Departamento WHERE Cod_Depar=Cod_Depart AND Ordenado > 150000

Universus - Consultores de Gesto, S.A

26

Base de Dados Linguagem SQL

Nome Allen Jones Blake Clark Scott King Ford

Localizao Faro vora Faro Beja vora Beja vora

Nome_Pep Vendas Investigao Vendas Contabilidade Investigao Contabilidade Investigao

O exemplo seguinte permite-nos estabelecer regras para a juno de mais de duas tabelas: Exemplo: Considere que tem uma BD de uma Universidade com informao dos alunos, das disciplinas e das avaliaes realizadas. Assim, temos as seguintes tabelas com os respectivos atributos: ALUNOS(Cod_al, Nome_al, Morada) DISCIPLINAS(Cod_dis, Nome_dis, Crditos) AVALIAES(Cod_al,Cod_dis, Data, Nota) Admita que pretendia visualizar os nomes dos alunos, o nome da disciplina e a nota obtida. SELECT Nome_al, Nome_dis, Nota FROM ALUNOS, DISCIPLINAS, AVALIAES WHERE ALUNOS.Cod_al = AVALIAES.Cod_al AND DISCIPLINAS.Cod_dis = AVALIAES.Cod_dis; Podemos concluir que para realizar a juno entre trs tabelas, necessrio construir duas condies de juno, para quatro tabelas necessrio no mnimo trs condies de juno e assim sucessivamente. Outro exemplo, mostre os nomes dos empregados, cujo departamento esteja localizado em Beja. Ainda podemos dizer que existem vrios tipos de juno, left join e right join. Vejamos um exemplo do left join: SELECT Nome, Localizao, Nome_pep FROM Departamento left join Empregado on Cod_Depar=Cod_Depart Universus - Consultores de Gesto, S.A
27

Base de Dados Linguagem SQL

Nome Clark King Miller Smith Jones Scott Adams Ford Allen Ward Martin Blake Turner James

Localizao Beja Beja Beja vora vora vora vora vora Faro Faro Faro Faro Faro Faro Portalegre

Nome_Pep Contabilidade Contabilidade Contabilidade Investigao Investigao Investigao Investigao Investigao Vendas Vendas Vendas Vendas Vendas Vendas Informtica

Verifique o resultado da ltima linha. Este tuplo tem o atributo Nome a null . Este resultado surge devido ao facto da tabela Departamento (que se encontra esquerda do join) apresentar todos os seus tuplos mesmo que estes no possuam "ligao" com nenhum tuplo da outra tabela, neste caso da tabela Empregados. Vejamos um exemplo de right join: SELECT Nome, Localizao, Nome_pep FROM Departamento right join Empregado on Cod_Depar=Cod_Depart

Universus - Consultores de Gesto, S.A

28

Base de Dados Linguagem SQL

Nome Clark King Miller Smith Jones Scott Adams Ford Allen Ward Martin Blake Turner James

Localizao Beja Beja Beja vora vora vora vora vora Faro Faro Faro Faro Faro Faro

Nome_Pep Contabilidade Contabilidade Contabilidade Investigao Investigao Investigao Investigao Investigao Vendas Vendas Vendas Vendas Vendas Vendas

Este resultado surge devido ao facto da tabela Empregado (que se encontra direita do join) apresentar todos os seus tuplos mesmo que estes no possuam "ligao" com nenhum tuplo da outra tabela, neste caso da tabela Departamento.

Universus - Consultores de Gesto, S.A

29

Base de Dados Linguagem SQL

4. BIBLIOGRAFIA Date, C. J.; "Na Introduction to Database Systems"; Sixth Edition; Addison-Wesley Publishing Company. Pereira, Jos Lus; "Tecnologia de Base de Dados"; FCA- Editora de Informtica; 2. Edio. Carrio, Rui Fernando, Carrio, Jos Antnio; "Desenho de base de dados e linguagem SQL em Access"; CTI- Centro de Tecnologias de Informao; 1998. Groff, James & Weinberg Paul; "The Complete Reference SQL"; Osborne/McGraw Hill;1998.

Universus - Consultores de Gesto, S.A

30

Base de Dados Linguagem SQL

ANEXO 1 TIPOS DE DADOS SQL TIPO TINYINT SMALLINT INTEGER REAL FLOAT(N) DECIMAL(P,S) NUMERIC(P,S) CHAR(N) VARCHAR BIT BINARY(N) VARBINARY(N) DATETIME TIMESTAMP N<=32K ANO, MS E DIA ANO, MS, DIA, HORA, MINUTO SEGUNDO. N<=254 N<=32K TAMANHO 8 bit 16 bit 32 bit 32 bit 64 bit

Universus - Consultores de Gesto, S.A

31