Bancos de Dados
Mestrado em Engenharia de Computação
área de concentração Geomática
UERJ - Agosto 2000
© Oscar Luiz Monteiro de Farias
1
Structured Query Language (SQL)...
• Linguagem de Banco de Dados com comandos
para definição de dados, consulta e atualização
• Origens: SEQUEL (Structured English QUEry
Language)
• Projetada e implementada nos centros de pesquisa
IBM como interface para o SYSTEM R - um
Sistema de Banco de Dados Relacional.
• Linguagem de consulta do DB2 da IBM e de
vários outros bancos de dados
UERJ - Agosto 2000
© Oscar Luiz Monteiro de Farias
2
Structured Query Language (SQL)
• esforços da ANSI (American National Standards
Institute) e ISO (International Standards
Organization) para padronização:
– SQL1 (SQL ANSI 1986)
– SQL2 (SQL ANSI 1992)
– SQL3 (....)
• Inserida em várias hosts-languages (C, Pascal, etc.)
UERJ - Agosto 2000
© Oscar Luiz Monteiro de Farias
3
Definição de Dados em SQL...
• SQL usa os termos table, row e column para relação, tupla e
atributo, respectivamente.
• As primeiras versões do SQL não incluíam o conceito de schema
• Um schema SQL é identificada por um nome de schema e inclui
um identificador de autorização para indicar o usuário
proprietário do schema, bem como descritores para cada
elemento do schema.
• Elementos do schema: tabelas, visões, domínios e outros (ex.
autorizações)
• Um schema pode, ao ser criado, incluir todas as definições de
seus elementos, ou, alternativamente, incluí-las mais tarde.
UERJ - Agosto 2000
© Oscar Luiz Monteiro de Farias
4
Definição de Dados em SQL...
•
•
•
•
CREATE SCHEMA COMPANY AUTHORIZATION SMITH;
Catálogo: representa uma coleção de schemas em um ambiente
SQL
Um catálogo sempre contém um elemento especial chamado
INFORMATION_SCHEMA, que fornece informações sobre todos
os descritores de elementos de todos os seus esquemas, para os
usuários autorizados.
Restrições de integridade podem ser definidas apenas entre as
relações pertencentes a um mesmo catálogo.
Schemas dentro de um mesmo catálogo podem compartilhar certos
elementos, como definições de domínios.
UERJ - Agosto 2000
© Oscar Luiz Monteiro de Farias
5
Definição de Dados em SQL...
• O comando CREATE TABLE é utilizado para
especificar uma relação , incluindo o nome da
relação, seus atributos e restrições de integridade.
Especificam-se os atributos, fornecendo-se um
nome para cada um, bem como um tipo de dados
para determinar o domínio dos valores e,
possivelmente, restrições.
Especificam-se as restrições de chave, integridade
da entidade e integridade referencial.
UERJ - Agosto 2000
© Oscar Luiz Monteiro de Farias
6
UERJ - Agosto 2000
© Oscar Luiz Monteiro de Farias
7
UERJ - Agosto 2000
© Oscar Luiz Monteiro de Farias
8
Exemplo: Banco de Dados “Companhia”
CREATE TABLE EMPLOYEE
(FNAME
VARCHAR(15)
NOT NULL,
MINIT
CHAR,
LNAME
VARCHAR(15)
NOT NULL,
SSN
CHAR(9)
NOT NULL,
BDATE
DATE,
ADDRESS
VARCHAR(30),
SEX
CHAR,
SALARY
DECIMAL(10,2),
SUPERSSN
CHAR(9),
DNO
INT
NOT NULL,
PRIMARY KEY (SSN),
FOREIGN KEY (SUPERSSN) REFERENCES EMPLOYEE (SSN),
FOREIGN KEY (DNO) REFERENCES DEPARTMENT(DNUMBER));
UERJ - Agosto 2000
© Oscar Luiz Monteiro de Farias
9
Exemplo: Banco de Dados “Companhia”
CREATE TABLE DEPARTMENT
(DNAME
VARCHAR(15)
NOT NULL,
DNUMBER
INT
NOT NULL,
MGRSSN
CHAR(9)
NOT NULL,
MGRSTARTDATE
DATE,
PRIMARY KEY (DNUMBER),
UNIQUE (DNAME),
FOREIGN KEY (MGRSSN) REFERENCES EMPLOYEE (SSN));
CREATE TABLE DEPT_LOCATIONS
( DNUMBER
INT
NOT NULL,
DLOCATION
VARCHAR(15)
NOT NULL,
PRIMARY KEY (DNUMBER, DLOCATION),
FOREIGN KEY (DNUMBER) REFERENCES DEPARTMENT (DNUMBER));
UERJ - Agosto 2000
© Oscar Luiz Monteiro de Farias
10
Exemplo: Banco de Dados “Companhia”
CREATE TABLE PROJECT
(PNAME
VARCHAR(15)
NOT NULL,
PNUMBER
INT
NOT NULL,
PLOCATION
VARCHAR(15),
DNUM
INT
NOT NULL,
PRIMARY KEY (PNUMBER),
UNIQUE (PNAME),
FOREIGN KEY (DNUM) REFERENCES DEPARTMENT (DNUMBER));
CREATE TABLE WORKS_ON
(ESSN
CHAR(9)
NOT NULL,
PNO
INT
NOT NULL,
HOURS
DECIMAL(3,1),
NOT NULL,
PRIMARY KEY (ESSN, PNO),
FOREIGN KEY (ESSN ) REFERENCES EMPLOYEE (SSN),
FOREIGN KEY (PNO) REFERENCES PROJECT (PNUMBER));
UERJ - Agosto 2000
© Oscar Luiz Monteiro de Farias
11
Exemplo: Banco de Dados “Companhia”
CREATE TABLE DEPENDENT
(ESSN
CHAR(9)
NOT NULL,
DEPENDENT_NAME VARCHAR(15)
NOT NULL,
SEX
CHAR,
BDATE
DATE,
RELATIONSHIP
VARCHAR(8),
PRIMARY KEY (ESSN, DEPENDENT _NAME),
FOREIGN KEY (ESSN) REFERENCES EMPLOYEE (SSN));
-------------------------------------------------------------------------------------------------------------Dedinição, em SQL2, do Schema Company
• Observação: i) O schema SQL nos quais as relações acima estão declaradas está
implicitamente especificado no ambiente no qual os comandos CREATE TABLE são
executados. Alternativamente poderíamos ter:
CREATE TABLE COMPANY.EMPLOYEE ...
UERJ - Agosto 2000
© Oscar Luiz Monteiro de Farias
12
Definição de Dados em SQL...
• Data types disponíveis: numeric, character-string,
bit-string, date, time.
• Numeric: números inteiros de diferentes tipos
(INTEGER, SMALLINT) e números reais de
diferentes precisões (FLOAT, REAL, DOUBLE
PRECISION).
• Números formatados: DECIMAL(i, j) ou DEC(i, j)
ou NUMERIC(i, j)
i - precisão, ou no total de dígitos decimais
j - escala, ou no de dígitos após o ponto decimal
UERJ - Agosto 2000
© Oscar Luiz Monteiro de Farias
13
Definição de Dados em SQL...
• Character-string:
– comprimento fixo (CHAR(n) ou CHARACTER(n))
– comprimento variável (VARCHAR(n) ou CHAR
VARYING(n) ou CHARACTER VARYING(n))
• Bit-string:
– comprimento fixo (BIT(n))
– comprimento variável (BIT VARYING(n))
• Date e Time:
– TIME(I), TIME com zona, TIMESTAMP (date + time),
INTERVAL
UERJ - Agosto 2000
© Oscar Luiz Monteiro de Farias
14
Definição de Dados em SQL...
• DEFAULT <value> - para especificar valores default para um
atributo.
• UNIQUE - especifica chaves alternativas
• O projetista do schema pode especificar ações a serem
efetivadas, no caso de violação das regras de integridade
referencial, vinculando uma cláusula de “referential triggered
action” a quaisquer rstrições de chaves estrangeiras (SET
NULL, CASCADE, SET DEFAULT).
• Pode-se dar um nome às restrições para referências futuras
• Base tables (base relations)
• Virtual relations (criadas através do comando CREATE VIEW)
UERJ - Agosto 2000
© Oscar Luiz Monteiro de Farias
15
Definição de Dados em SQL...
CREATE TABLE EMPLOYEE
(...,
DNO
INT
NOT NULL DEFAULT 1,
CONSTRAINT EMPPK
PRIMARY KEY (SSN),
CONSTRAINT EMPSUPERFK
FOREIGN KEY (SUPERSSN) REFERENCES EMPLOYEE (SSN)
ON DELETE SET NULL ON UPDATE CASCADE,
CONSTRAINT EMPDEPTFK
FOREIGN KEY (DNO) REFERENCES DEPARTMENT(DNUMBER)
ON DELETE SET DEFAULT ON UPDATE CASCADE);
UERJ - Agosto 2000
© Oscar Luiz Monteiro de Farias
16
Definição de Dados em SQL...
CREATE TABLE DEPARTMENT
(...,
MGRSSN
CHAR(9)
NOT NULL DEFAULT “88865555”,
...,
CONSTRAINT DEPTPK
PRIMARY KEY (DNUMBER),
CONSTRAINT DEPTSK
UNIQUE (DNAME),
CONSTRAINT DEPTMGRFK
FOREIGN KEY (MGRSSN) REFERENCES EMPLOYEE (SSN)
ON DELETE SET DEFAULT ON UPDATE CASCADE);
CREATE TABLE DEPT_LOCATIONS
(...,
PRIMARY KEY (DNUMBER, DLOCATION),
FOREIGN KEY (DNUMBER) REFERENCES DEPARTMENT (DNUMBER)
ON DELETE CASCADE ON UPDATE CASCADE);
UERJ - Agosto 2000
© Oscar Luiz Monteiro de Farias
17
Definição de Dados em SQL...
• O comando DROP SCHEMA possui duas opções:
RESTRICT e CASCADE
CASCADE - remove o schema e todos os seus
elementos: tabelas, domínios, restrições, etc.
RESTRICT - neste caso o schema só é removido se não
mais possuir elementos.
Ex.: DROP SCHEMA COMPANY CASCADE;
• DROP TABLE também possui duas opções: RESTRICT
e CASCADE
Ex.: DROP TABLE DEPENDENT CASCADE;
UERJ - Agosto 2000
© Oscar Luiz Monteiro de Farias
18
Definição de Dados em SQL...
• ALTER TABLE - ações possíveis: adicionar ou excluir uma
coluna (atributo), alterar a definição de uma coluna e adicionar
ou excluir restrições de integridade.
Ex.: ALTER TABLE COMPANY.EMPLOYEE ADD
JOB VARCHAR(12);
Ex: ALTER TABLE COMPANY.DEPARTMENT
DROP ADDRESS CASCADE;
(todas as constraints e views que referenciam a coluna são
automaticamente excluídas do schema)
Ex.: ALTER TABLE COMPANY.EMPLOYEE DROP
CONSTRAINT EMPSUPERFK CASCADE;
UERJ - Agosto 2000
© Oscar Luiz Monteiro de Farias
19
Queries em SQL...
• SELECT FROM WHERE block
SELECT <attribute list>
FROM <table list>
WHERE <condition>
• QUERY Q0: Recupere a data de nascimento e endereço do
empregado cujo nome é John B. Smith.
SELECT BDATE, ADDRESS
FROM
EMPLOYEE
WHERE
FNAME=‘John’ AND MINIT=‘B’ AND
LNAME=‘SMITH’
UERJ - Agosto 2000
© Oscar Luiz Monteiro de Farias
20
Queries em SQL...
• O SELECT FROM WHERE block é semelhante ao par de
operações SELECT-PROJECT da Álgebra Relacional.
• A cláusula SELECT do SQL especifica os atributos a serem
projetados
• A cláusula WHERE especifica a condição de seleção
• Em SQL o resultado da query pode ter tupls duplicadas
UERJ - Agosto 2000
© Oscar Luiz Monteiro de Farias
21
Queries em SQL...
• QUERY Q1: Recupere o nome e o endereço de todos os
empregados que trabalham no departamento ‘Research’.
SELECT FNAME, LNAME, ADDRESS
FROM
EMPLOYEE, DEPARTMENT
WHERE
DNAME=‘Research’ AND DNUMBER=DNO
• Trata-se de uma query do tipo SELECT-PROJECT-JOIN da
Álgebra Relacional
A condição de seleção é DNAME=‘Research”
A condição de JOIN é DNUMBER=DNO
UERJ - Agosto 2000
© Oscar Luiz Monteiro de Farias
22
Queries em SQL...
• QUERY Q2: Para todo projeto localizado em ‘Stafford’, liste o no
do projeto, o no do dpto que o controla, o último nome do gerente e
a data de seu nascimento.
SELECT PNUMBER, DNUM, LNAME, ADDRESS, BDATE
FROM
PROJECT, EMPLOYEE, DEPARTMENT
WHERE
DNUM=DNUMBER AND MGRSSN=SSN AND
PLOCATION=‘Stafford’
A condição de JOIN DNUM=DNUMBER relaciona um projeto ao
depto que o controla;
A condição de JOIN MGRSSN=SSN relaciona o depto contolador
ao empregado que o gerencia;
UERJ - Agosto 2000
© Oscar Luiz Monteiro de Farias
23
Queries em SQL...
• Nomes de atributos ambíguos e aliases
• QUERY Q1A: Supor que os atributos DNO e LNAME da relação
EMPLOYEE fossem chamados de DNUMBER e NAME e que o
atributo DNAME da relação DEPARTMENT também fosse
chamado de NAME. Neste caso a query Q1 teria que resolver as
ambigüidades presentes.
SELECT FNAME, EMPLOYEE.NAME, ADDRESS
FROM
EMPLOYEE, DEPARTMENT
WHERE
DEPARTMENT.NAME=‘Research’ AND
DEPARTMENT.DNUMBER=EMPLOYEE.DNUMBER
UERJ - Agosto 2000
© Oscar Luiz Monteiro de Farias
24
Queries em SQL...
• QUERY Q8: Para cada empregado, recupere o primeiro e último
nome e o o primeiro e último nome do seu supervisor imediato.
SELECT E.FNAME, E.LNAME, S.FNAME, S.LNAME
FROM
EMPLOYEE E, EMPLOYEE S
WHERE
E.SUPERSSN=S.SSN
• Um alias pode seguir de imediato o nome da relação, como
acima, ou seguir a keyword AS. É também possível renomear os
atributos da relação dentro da query.
EMPLOYEE AS E(FN, MI, LN, SSN, BD, ADDR, SEX, SAL,
SSSN, DNO) ...
• Como na Álgebra Relacional não se pode especificar uma query
com um nível arbitrário de recursividade em um único comando.
UERJ - Agosto 2000
© Oscar Luiz Monteiro de Farias
25
Queries em SQL...
• Uma query sem a cláusula WHERE indica que não há condição de seleção
aplicada sobre as tuplas. Assim, todas serão selecionadas (WHERE TRUE).
• QUERY Q9: Recupere os SSNs de todos os empregados.
SELECT SSN
FROM EMPLOYEE
• Se mais de uma relação é especificada na cláusula FROM e não há uma
cláusula WHERE, então o resultado é o CROSS PRODUCT das duas
relações.
• QUERY Q10: Recupere todas as combinações possíveis de EMPLOYEE
SSN e DEPARTMENT DNAME.
SELECT SSN, DNAME
FROM EMPLOYEE, DEPARTMENT
(similar as operações da AR: CROSS PRODUCT seguido de um PROJECT)
UERJ - Agosto 2000
© Oscar Luiz Monteiro de Farias
26
Queries em SQL...
• ATENÇÃO! É extremamente importante especificar todas as
seleções e condições JOIN na cláusula WHERE, sem o que
poderão resultar relações imensas e incorretas.
• Para recuperar os valores de todos os atributos usa-se um ‘*’.
• QUERY Q1C: Recupere todos os valores de atributos das tuplas
de EMPLOYEE, que trabalham no depto de no 5.
SELECT *
FROM EMPLOYEE
WHERE DNO=5
UERJ - Agosto 2000
© Oscar Luiz Monteiro de Farias
27
Queries em SQL...
• QUERY Q1D: Recupere todos os valores de atributos dos
empregados que trabalham no departamento ‘Research’, bem
como os atributos deste depto.
SELECT *
FROM EMPLOYEE, DEPARTMENT
WHERE DNAME=‘Research’ AND DNO=DNUMBER
• QUERY Q10A: Recuperar o CROSS PRODUCT das relações
EMPLOYEE e DEPARTMENT.
SELECT *
FROM EMPLOYEE, DEPARTMENT
UERJ - Agosto 2000
© Oscar Luiz Monteiro de Farias
28
Queries em SQL...
• SQL não elimina tuplas duplicatas do resultado das queries pelas
seguintes razões:
– o custo da operação é alto (solução: classificar as tuplas e eliminar as
duplicatas)
– o usuário pode desejar visualisar as tuplas duplicatas
– quando se aplica uma função agregada às tuplas, em geral não se deseja a
eliminação de duplicatas
• Para se eliminar tuplas duplicatas do resultado deve-se usar a
keyword DISTINCT na cláusula SELECT
• QUERY Q11A: Liste todos os salários diferentes dos empregados.
SELECT DISTINCT SALARY
FROM EMPLOYEE
UERJ - Agosto 2000
© Oscar Luiz Monteiro de Farias
29
Queries em SQL...
• SQL incorporou algumas das operações sobre conjuntos da Álgebra Relacional:
união (UNION), diferença (EXCEPT) e interseção (INTERSECT).
• Nestas operações as tuplas duplicatas são eliminadas, a menos que a operação
seja seguida da keyword ALL.
• QUERY Q4: Faça uma lista de todos os nos de projetos PARA PROJETOS que
envolvam um empregado cujo último nome seja ‘Smith’, ou como um simples
empregado, ou como um gerente do departamento que controla o projeto.
(SELECT PNUMBER
FROM PROJECT, DEPARTMENT, EMPLOYEE
WHERE DNUM=DNUMBER AND MGRSSN=SSN AND LNAME=‘Smith’)
UNION
(SELECT PNUMBER
FROM
PROJECT, WORKS_ON, EMPLOYEE
WHERE PNUMBER=PNO AND ESSN=SSN AND LNAME=‘Smith’)
UERJ - Agosto 2000
© Oscar Luiz Monteiro de Farias
30
Queries em SQL...
• Queries aninhadas (trata-se de uma query SELECT completa,
dentro de uma cláusula WHERE de uma outra query, chamada de
outer query)
• QUERY Q4A = QUERY Q4
(SELECT DISTINCT PNUMBER
FROM PROJECT
WHERE PNUMBER IN (SELECT
FROM
WHERE
PNUMBER
PROJECT, DEPARTMENT, EMPLOYEE
DNUM=DNUMBER AND MGRSSN=SSN
AND LNAME=‘Smith’)
OR
PNUMBER IN (SELECT PNO
FROM WORKS_ON, EMPLOYEE
WHERE ESSN=SSN AND LNAME=‘Smith’)
UERJ - Agosto 2000
© Oscar Luiz Monteiro de Farias
31
Queries em SQL...
• O operador de comparação IN compara um valor v com um
conjunto (ou múltiplos conjuntos) de valores V e resulta em
TRUE se v é um dos elementos de V.
• QUERY Q4B: Selecione o SSN de todos os empregados que
trabalhem a mesma combinação (project, hours) em algum projeto
em que o empregado ‘John Smith’ também trabalhe.
SELECT DISTINCT ESSN
FROM WORKS_ON
WHERE (PNO, HOURS) IN (SELECT PNO, HOURS
FROM WORKS_ON, EMPLOYEE
WHERE LNAME=‘Smith’ AND FNAME=‘John’ AND ESSN=SSN);
UERJ - Agosto 2000
© Oscar Luiz Monteiro de Farias
32
Queries em SQL...
• Além do operador IN, outros operadores de comparação podem
ser usados para comparar um valor singular v (tipicamente o nome
de um atributo) com um conjunto V (tipicamente uma nested
query).
• O operador = ANY (= SOME) retorna TRUE se o valor v é igual
a algum valor no conjunto V (é equivalente a IN).
• Outros operadores que podem ser combinados com as keywords
ANY e SOME: >,>=,<,<= e <>.
• A keyword ALL pode ser usada com quaisquer dos operadores
acima.
UERJ - Agosto 2000
© Oscar Luiz Monteiro de Farias
33
Queries em SQL...
• QUERY QX0: Recupere o nome dos empregados cujo salário seja
maior que os salários de todos os empregados do departamento 5.
SELECT
FROM
WHERE
LNAME, FNAME
EMPLOYEE
SALARY > ALL (SELECT SALARY
FROM EMPLOYEE
WHERE DNO=5);
• Em geral pode-se ter um no arbitrário de nested queries.
• Para se evitar ambigüidades aplica-se a regra: uma referência a um atributo não
qualificado refere-se sempre à relação declarada na nested query mais interna.
UERJ - Agosto 2000
© Oscar Luiz Monteiro de Farias
34
Queries em SQL...
• QUERY Q12: Recupere o nome de cada empregado que tenha um dependente
com o mesmo first name e sexo do empregado.
SELECT
FROM
WHERE
LNAME, FNAME
EMPLOYEE E
E.SSN IN
(SELECT ESSN
FROM DEPENDENT
WHERE ESSN=E.SSN AND
E.FNAME=DEPENDENT_NAME AND
SEX=E.SEX)
• Sempre que uma condição em uma cláusula WHERE de uma nested query
referencia algum atributo de uma relação declarada na outer query, as duas
queries são ditas correlacionadas.
• A nested query é avaliada uma vez para cada tupla (ou combinação de tuplas)
na outer query.
UERJ - Agosto 2000
© Oscar Luiz Monteiro de Farias
35
Queries em SQL...
• Em geral uma query formulada com blocos aninhados SELECT ...
FROM ... WHERE e usando os operadores de comparação ‘=‘ ou
‘IN’ pode ser sempre expressa como uma query com um único
bloco.
• QUERY Q12A= QUERY Q12
SELECT
FROM
WHERE
UERJ - Agosto 2000
E.LNAME, E.FNAME
EMPLOYEE E, DEPENDENT D
E.SSN=D.ESSN AND E.SEX=D.SEX AND
E.FNAME=D.DEPENDENT_NAME
© Oscar Luiz Monteiro de Farias
36
Queries em SQL...
• A função EXISTS é utilizada para verificar se o resultado de
uma nested query correlacionada é vazio, i.e., não contém tuplas.
• QUERY Q12B (Q12 revisitada): Recupere o nome de cada empregado que
tenha um dependente com o mesmo first name e sexo do empregado.
SELECT
LNAME, FNAME
FROM
WHERE
EMPLOYEE E
EXISTS
(SELECT *
FROM DEPENDENT
WHERE E.SSN=ESSN AND
E.FNAME=DEPENDENT_NAME AND
SEX=E.SEX)
• EXISTS(Q) retorna TRUE se existe pelo menos uma tupla como
resultado da query Q e FALSE em caso contrário.
UERJ - Agosto 2000
© Oscar Luiz Monteiro de Farias
37
Queries em SQL...
• QUERY 6: Recupere o nome de todos os empregados que não tenham
dependentes.
SELECT
FROM
WHERE
•
LNAME, FNAME
EMPLOYEE E
NOT EXISTS
(SELECT *
FROM DEPENDENT
WHERE SSN=ESSN)
A função UNIQUE(Q) retorna TRUE se não existem tuplas duplicatas no resultado da
query Q; em caso contrário retorna FALSE.
UERJ - Agosto 2000
© Oscar Luiz Monteiro de Farias
38
Queries em SQL...
• QUERY 7: Liste o nome dos gerentes que tenham pelo menos um dependente.
SELECT
FROM
WHERE
UERJ - Agosto 2000
LNAME, FNAME
EMPLOYEE
EXISTS (SELECT *
FROM DEPENDENT
WHERE SSN=ESSN)
AND
EXISTS (SELECT *
FROM DEPARTMENT
WHERE SSN=MGRSSN)
© Oscar Luiz Monteiro de Farias
39
Queries em SQL...
• QUERY 3: Recupere o nome de cada empregado que trabalhe em todos os
propjetos controlados pelo depto de no 5 (operator CONTAINS - SQL original)
SELECT
FROM
WHERE
UERJ - Agosto 2000
LNAME, FNAME
EMPLOYEE
((SELECT
FROM
WHERE
CONTAINS
(SELECT
FROM
WHERE
PNO
WORKS_ON
SSN=ESSN)
PNUMBER
PROJECT
DNUM=5))
© Oscar Luiz Monteiro de Farias
40
Queries em SQL...
• QUERY 3A (paráfrase de Q3): Selecione cada empregado de tal forma que não
exista um projeto, controlado pelo depto 5 em que o empregado não trabalhe.
SELECT
FROM
WHERE
LNAME, FNAME
EMPLOYEE
NOT EXISTS
(SELECT
*
FROM
WORKS_ON B
WHERE
(B.PNO IN (SELECT PNUMBER
FROM
PROJECT
WHERE
DNUM=5))
AND
NOT EXISTS (SELECT
*
FROM
WORKS_ON C
WHERE
C.ESSN=SSN
AND C.PNO=B.PNO))
Universal quantifier () ou negated existential quantifier (not )
UERJ - Agosto 2000
© Oscar Luiz Monteiro de Farias
41
Queries em SQL...
• É possível explicitar um conjunto de valores em uma cláusula WHERE.
• QUERY 13: Recupere os SSNs de todos os empregados que trabalhem nos
projetos de nos 1, 2 ou 3.
SELECT
DISTINCT ESSN
FROM
WORKS_ON
WHERE
PNO IN (1, 2, 3)
• SQL permite queries que verificam se um valor é NULL (missing or
undefined or not applicable)
• Ao invés de usar os operadores = ou , SQL usa IS ou IS NOT.
• Isto porque SQL considera cada valor NULL distinto de todos os outros
valores NULL.
UERJ - Agosto 2000
© Oscar Luiz Monteiro de Farias
42
Queries em SQL...
• QUERY 14: Recupere os nomes de todos os empregados que não tenham
supervisor.
SELECT
FROM
WHERE
LNAME, FNAME
EMPLOYEE
SUPERSSN IS NULL
• É possível renomear qualquer atributo que apareça no resultado de uma query,
adicionando-se o qualificador AS seguido pelo novo nome desejado.
• QUERY 8A ~ QUERY 8, porém trocando-se os últimos nomes de cada
empregado e de cada supervisor para EMPLOYEE_NAME e
SUPERVISOR_NAME, respectivamente:
SELECT
FROM
WHERE
UERJ - Agosto 2000
E.LNAME AS EMPLOYEE_NAME, S.LNAME AS
SUPERVISOR_NAME
EMPLOYEE AS E, EMPLOYEE AS S
E.SUPERSSN=S.SSN
© Oscar Luiz Monteiro de Farias
43
Queries em SQL...
• O conceito de joined table (or joined relation) foi incorporado em SQL2 para
permitir aos usuários especificar uma tabela que resultasse de uma operação
JOIN, na cláusula FROM de uma query.
• QUERY 1A ~ QUERY 1:
SELECT
FNAME, LNAME, ADDRESS
FROM
EMPLOYEE JOIN DEPARTMENT ON DNO=DNUMBER
WHERE
DNAME=‘Research’
• Os atributos da tabela resultante do JOIN compreendem todos os atributos da
primeira tabela - EMPLOYEE - seguidos por todos os atributos da segunda
tabela - DEPARTMENT.
• Existem diferentes tipos de JOIN: NATURAL JOIN e OUTER JOINS
• NATURAL JOIN para duas relações R e S: nenhuma condição de JOIN é
especificada. Uma condição JOIN implícita (EQUI) é criada para cada par de
atributos com o mesmo nome em R e em S. Apenas um atributo permanece.
UERJ - Agosto 2000
© Oscar Luiz Monteiro de Farias
44
Queries em SQL...
• Se os nomes dos atributos JOIN não são os mesmos nas relações
base, é possível renomear os atributos e, então, aplicar-se o
NATURAL JOIN.
• QUERY 1B ~ QUERY Q1: porém renomeou a relação DEPARTMENT para
DEPT e os atributos para DNAME, DNO (para ser igual ao atributo JOIN da
tabela EMPLOYEE), MSSN e MSDATE.
SELECT
FROM
WHERE
FNAME, LNAME, ADDRESS
(EMPLOYEE NATURAL JOIN (DEPARTMENT AS DEPT
DNAME, DNO, MSNN, MSDATE)))
DNAME=‘Research’
A condição JOIN implícita é EMPLOYEE.DNO = DEPT.DNO
UERJ - Agosto 2000
© Oscar Luiz Monteiro de Farias
45
Queries em SQL...
• O tipo default de JOIN em uma tabela joined é o INNER JOIN,
em que uma tupla é incluída no resultado, apenas se existe uma
tupla na outra relação que satisfaz a condição do JOIN.
• QUERY 8B ~ QUERY 8A: porém desejamos incluir no resultado todos os
empregados, mesmo aqueles que não possuem um supervisor.
SELECT
FROM
E.LNAME AS EMPLOYEE_NAME, S.LNAME AS
SUPERVISOR_NAME
(EMPLOYEE E LEFT OUTER JOIN EMPLOYEE S ON
E.SUPERSSN=S.SSN)
• Opções de JOIN: INNER JOIN (=JOIN), LEFT OUTER JOIN,
RIGHT OUTER JOIN, FULL OUTER JOIN.
• Pode-se omitir a keyword OUT.
UERJ - Agosto 2000
© Oscar Luiz Monteiro de Farias
46
Queries em SQL...
• QUERY Q2A = Q2:
SELECT
PNUMBER, DNUM, LNAME, ADDRESS, BDATE
FROM
((PROJECT JOIN DEPARTMENT ON DNUM=DNUMBER)
JOIN EMPLOYEE ON MGRSSN=SSN)
WHERE
PLOCATION=‘Stafford’
• Funções agregadas (agregate functions) e agrupamento (grouping):
• built-in functions: COUNT, SUM, MAX, MIN, AVG. Aplicadas a um
conjunto ou vários conjuntos de valores.
• Podem ser usadas nas cláusulas SELECT OU HAVING.
• QUERY Q15: Recupere a soma dos salários de todos os empregados, o maior e
menor salário e o salário médio.
SELECT
SUM(SALARY), MAX (SALARY), MIN (SALARY),
AVG (SALARY)
FROM
EMPLOYEE
UERJ - Agosto 2000
© Oscar Luiz Monteiro de Farias
47
Queries em SQL...
• QUERY Q15: Ache a soma dos salários de todos os empregados do depto
‘Research’, como também os salários máximo, mínimo e médio neste depto.
SELECT
SUM(SALARY), MAX (SALARY), MIN (SALARY),
AVG (SALARY)
FROM
EMPLOYEE, DEPARTMENT
WHERE
DNO=DNUMBER AND DNAME = ’Research’
• QUERY Q17: Recupere o no total de empregados na companhia.
SELECT
COUNT(*)
FROM
EMPLOYEE
• A função COUNT( ) retorna o no de tuplas ou valores especificados na query.
UERJ - Agosto 2000
© Oscar Luiz Monteiro de Farias
48
Queries em SQL...
• QUERY Q18: Recupere o no de empregados do depto ‘Research’.
SELECT
COUNT(*)
FROM
EMPLOYEE, DEPARTMENT
WHERE
DNO=DNUMBER AND DNAME=‘Research’
• Pode-se usar a função COUNT para contar valores em uma coluna, ao invés de
em tuplas.
• QUERY Q19: Conte o número de salários distintos no Banco de Dados
Companhia.
SELECT
COUNT (DISTINCT SALARY)
FROM
EMPLOYEE
UERJ - Agosto 2000
© Oscar Luiz Monteiro de Farias
49
Queries em SQL...
• Em alguns casos poderemos necessitar de usar funções para
selecionar tuplas particulares. Nestes casos especifica-se uma
nested query correlacionada com a função desejada e usa-se a
nested query na cláusula WHERE da outer query.
• QUERY Q5: Recuperar os nomes de todos os empregados que tenham dois ou
mais dependentes.
SELECT
FNAME, LNAME
FROM
EMPLOYEE
WHERE
(SELECT
COUNT(*)
FROM
DEPENDENT
WHERE
SSN = ESSN)  2
UERJ - Agosto 2000
© Oscar Luiz Monteiro de Farias
50
Queries em SQL...
• SQL possui uma cláusula GROUP BY com a finalidade de permitir o
agrupamento de atributos.
• Os atributos a serem grupados devem ser especificados na cláusula GROUP BY
e também na cláusula SELECT, de tal forma que os valores resultantes da
aplicação de funções a um grupo de tuplas apareçam juntamente com o valor
do atributo de grupamento.
• QUERY Q20: Para cada depto recupere o no do depto, o no de empregados no
depto e o seu salário médio.
SELECT
DNO, COUNT (*), AVG (SALARY)
FROM
EMPLOYEE
GROUP BY DNO
• A cláusula SELECT inclui somente o atributo a ser agrupado e as funções a
serem aplicadas em cada grupo de tuplas.
UERJ - Agosto 2000
© Oscar Luiz Monteiro de Farias
51
Queries em SQL...
• QUERY Q21: Para cada projeto recupere o seu no, o seu nome e o no de
empregados que trabalham no projeto.
SELECT
PNUMBER, PNAME, COUNT(*),
FROM
PROJECT, WORKS_ON
WHERE
PNUMBER = PNO
GROUP BY PNUMBER, PNAME
Observação: O agrupamento e as funções são aplicadas depois do joining das
duas relações.
• Em alguns casos desejamos recuperar os valores destas funções apenas para
grupos que satisfazem determinadas condições. SQL provê uma cláusula
HAVING para esta finalidade, a qual pode aparecer em conjunto com uma
cláusula GROUP BY.
UERJ - Agosto 2000
© Oscar Luiz Monteiro de Farias
52
Queries em SQL...
• HAVING provê uma condição no grupo de tuplas associadas com cada valor
do atributo de agrupamento. Somente os grupos que satisfazem esta condição
são recuperados no resultado da query.
• QUERY Q22: Para cada projeto no qual trabalham mais de dois empregados,
recupere o no do projeto, o nome do projeto e o no de empregados que
trabalham no projeto.
SELECT
PNUMBER, PNAME, COUNT(*)
FROM
PROJECT, WORKS_ON
WHERE
PNUMBER=PNO
GROUP BY PNUMBER, PNAME
HAVING
COUNT(*) > 2
Observação: a condição de seleção na cláusula WHERE limita as tuplas às
quais as funções são aplicadas; a cláusula HAVING limita grupos inteiros.
UERJ - Agosto 2000
© Oscar Luiz Monteiro de Farias
53
Queries em SQL...
• QUERY Q23: Para cada projeto, recupere o no do projeto, o nome do projeto e
o no de empregados do depto 5 que trabalham no projeto.
SELECT
FROM
WHERE
GROUP BY
PNUMBER, PNAME, COUNT(*)
PROJECT, WORKS_ON, EMPLOYEE
PNUMBER = PNO AND SSN = ESSN AND DNO = 5
PNUMBER, PNAME
• Deve-se ser muito cuidadoso ao se aplicar duas diferentes condições (Uma para
a função na clúsula SELECT e, a outra, para a função na cláusula HAVING).
UERJ - Agosto 2000
© Oscar Luiz Monteiro de Farias
54
Queries em SQL...
• QUERY Q240: Contar o no total de empregados cujos salários excedem US$
40,000 em cada depto, porém apenas para os deptos em que mais de 5
empregados trabalham.
SELECT
DNAME, COUNT(*)
FROM
DEPARTMENT, EMPLOYEE
WHERE
DNUMBER = DNO AND SALARY > 40000
GROUP BY DNAME
HAVING
COUNT(*) > 5
• ERRADO! Selecionará apenas os deptos que tenham mais de 5 empregados,
cada um deles ganhando mais de US$ 40000.
• REGRA: A cláusula WHERE é executada primeiro, para selecionar as tuplas
individuais; depois executa-se a cláusula HAVING, para selecionar os grupos
individuais de tuplas.
UERJ - Agosto 2000
© Oscar Luiz Monteiro de Farias
55
Queries em SQL...
• QUERY Q24: para cada depto em que mais de 5 empregados trabalham,
recuperar o no do depto, e o no de empregados com salário maior que US$
40000.
SELECT
DNAME, COUNT(*)
FROM
DEPARTMENT, EMPLOYEE
WHERE
DNUMBER = DNO AND SALARY > 40000 AND
DNO IN
(SELECT
DNO
FROM
EMPLOYEE
GROUP BY
DNO
HAVING
COUNT(*) > 5)
GROUP BY DNAME
UERJ - Agosto 2000
© Oscar Luiz Monteiro de Farias
56
Queries em SQL...
•
•
•
•
•
Comparações de substrings, operadores aritméticos e classificação
O operador LIKE possibilita comparação entre strings.
% substitui um no arbitrário de caracteres.
_ substitui um único caracter arbitrário.
QUERY Q25: Recupere todos os empregados com endereço em ‘Houston, TX’
SELECT
FNAME, LNAME
FROM
EMPLOYEE
WHERE
ADDRESS LIKE ‘%Houston, TX%’
• QUERY Q26: Encontre todos os empregados nascidos na década de 50.
SELECT
FNAME, LNAME
FROM
EMPLOYEE
WHERE
BDATE LIKE ‘__5_______’
UERJ - Agosto 2000
© Oscar Luiz Monteiro de Farias
57
Queries em SQL...
• Operadores aritméticos podem ser aplicados a valores numéricos
em uma query.
• QUERY Q27: Mostre os salários que resultariam, se a todos os trabalhadores
que trabalham no projeto ‘ProductX’ fosse dado um aumento de 10%.
SELECT
FNAME, LNAME, 1.1*SALARY
FROM
EMPLOYEE, WORKS_ON, PROJECT
WHERE
SSN=ESSN AND PNO=PNUMBER AND
PNAME=‘ProductX’
• O operador ‘||’ para strings
• ‘+’ e ‘-’ podem ser usados com os tipos de dados date, time, timestamp e
interval
UERJ - Agosto 2000
© Oscar Luiz Monteiro de Farias
58
Queries em SQL...
• Classificação: a cláusula ORDER BY
• QUERY Q28: Recupere uma lista de empregados e dos projetos em que eles
trabalham, ordenada por deptos e, dentro de cada depto, ordenada
alfabeticamente por sobrenome e nome.
SELECT
DNAME, LNAME, FNAME, PNAME
FROM
DEPARTMENT, EMPLOYEE, WORKS_ON, PROJECT
WHERE
SSN=ESSN AND DNUMBER=DNO AND
PNO=PNUMBER
ORDER BY DNAME, LNAME, FNAME
• As keywords ASC e DESC
UERJ - Agosto 2000
© Oscar Luiz Monteiro de Farias
59
Download

cap_06_bancos_de_dados_mestrado_uerj_oscar_2000_01