banco de dados distribuídosilmerio/sbd20132/sbd6sqldml.pdf · ufu/facom página 3 sql/dml def. a...

85
GBC043 - Sistemas de Banco de Dados SQL/DML no PostgreSQL Ilmério Reis da Silva [email protected] www.facom.ufu.br/~ilmerio/sbd UFU/FACOM/BCC

Upload: others

Post on 11-Oct-2020

4 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Banco de Dados Distribuídosilmerio/sbd20132/sbd6sqlDML.pdf · UFU/FACOM Página 3 SQL/DML Def. A SQL/DML(Data Manipulation Language) é um subconjunto da SQL usada para recuperar,

GBC043 - Sistemas de Banco de DadosSQL/DML no PostgreSQL

Ilmério Reis da [email protected]/~ilmerio/sbdUFU/FACOM/BCC

Page 2: Banco de Dados Distribuídosilmerio/sbd20132/sbd6sqlDML.pdf · UFU/FACOM Página 3 SQL/DML Def. A SQL/DML(Data Manipulation Language) é um subconjunto da SQL usada para recuperar,

Página 2

Prgrama Teórico/Prático - SQL

• Linguagem SQL– Comandos de criação e eliminação de tabelas– Especificação de restrições em bancos de dados– Evolução de esquemas de banco de dados– Comandos de inserção de tuplas em tabelas– Comandos de alteração e supressão de tuplas– Comandos de consulta (básicos e complexos)– Definição de visões

Álgebra Relacional Cálculo Relacional

Page 3: Banco de Dados Distribuídosilmerio/sbd20132/sbd6sqlDML.pdf · UFU/FACOM Página 3 SQL/DML Def. A SQL/DML(Data Manipulation Language) é um subconjunto da SQL usada para recuperar,

UFU/FACOM Página 3

SQL/DML

Def. A SQL/DML(Data Manipulation Language) é um subconjunto da SQL usada para recuperar, inserir, atualizar e suprimir dados de tabelas do BD.

Page 4: Banco de Dados Distribuídosilmerio/sbd20132/sbd6sqlDML.pdf · UFU/FACOM Página 3 SQL/DML Def. A SQL/DML(Data Manipulation Language) é um subconjunto da SQL usada para recuperar,

UFU/FACOM Página 4

SQL/DML - Principais Comandos • INSERT – inserção de linhas;• DELETE – supressão de linhas;• UPDATE – atualização de dados;• SELECT – recuperação de tabelas;

OBS: serão mostradas características do padrão SQL implementadas pelo PostgreSQL, omitindo funcionalidades adicionais e destacando eventuais omissões.

Page 5: Banco de Dados Distribuídosilmerio/sbd20132/sbd6sqlDML.pdf · UFU/FACOM Página 3 SQL/DML Def. A SQL/DML(Data Manipulation Language) é um subconjunto da SQL usada para recuperar,

UFU/FACOM Página 5

SQL/DML - INSERT

INSERT INTO tabela [ ( coluna [, ...] ) ] { DEFAULT VALUES

|VALUES ( { expressão | DEFAULT } [, ...] ) [, ...]

| comando-select }

Page 6: Banco de Dados Distribuídosilmerio/sbd20132/sbd6sqlDML.pdf · UFU/FACOM Página 3 SQL/DML Def. A SQL/DML(Data Manipulation Language) é um subconjunto da SQL usada para recuperar,

UFU/FACOM Página 6

SQL/DML - INSERT – Exemplo 1

INSERT INTO tabela VALUES (expressão [, ...] )INSERT INTO employee

VALUES ('John', 'B', 'Smith', '123456789',DATE '1965-01-09', '731 Fondren, Houston, TX','M', 30000, '333445555', 5);

Compatibilidade de tipos: employee (fname VARCHAR (15) NOT NULL, minit CHAR, lname VARCHAR (15) NOT NULL,

ssn CHAR(9) PRIMARY KEY, bdate DATE, address VARCHAR(30), sex CHAR CHECK (sex IN (’M’, ’F’)), salary DECIMAL(10,2), superssn CHAR(9), dno INT NOT NULL)

Page 7: Banco de Dados Distribuídosilmerio/sbd20132/sbd6sqlDML.pdf · UFU/FACOM Página 3 SQL/DML Def. A SQL/DML(Data Manipulation Language) é um subconjunto da SQL usada para recuperar,

UFU/FACOM Página 7

SQL/DML- INSERT - Exemplo 2

INSERT INTO tabela ( coluna [, ...] ) VALUES (expressão [, ...] )

INSERT INTO employee(fname, minit, lname, ssn, dno)VALUES ('John', 'B', 'Smith', '123456789', 5);

Page 8: Banco de Dados Distribuídosilmerio/sbd20132/sbd6sqlDML.pdf · UFU/FACOM Página 3 SQL/DML Def. A SQL/DML(Data Manipulation Language) é um subconjunto da SQL usada para recuperar,

UFU/FACOM Página 8

SQL/DML – INSERT – Exemplo 3

INSERT INTO tabela comando-select

INSERT INTO works_onSELECT ssn, pnumber, 0 FROM employee, project;

Page 9: Banco de Dados Distribuídosilmerio/sbd20132/sbd6sqlDML.pdf · UFU/FACOM Página 3 SQL/DML Def. A SQL/DML(Data Manipulation Language) é um subconjunto da SQL usada para recuperar,

UFU/FACOM Página 9

SQL/DML– DELETE

DELETE FROM tabela [ [ AS ] alias ] [ WHERE condição

| WHERE CURRENT OF cursor_name ]

DELETE FROM employee WHERE ssn = '123456789'

OBS: o uso de cursores será visto posteriormente

Page 10: Banco de Dados Distribuídosilmerio/sbd20132/sbd6sqlDML.pdf · UFU/FACOM Página 3 SQL/DML Def. A SQL/DML(Data Manipulation Language) é um subconjunto da SQL usada para recuperar,

UFU/FACOM Página 10

SQL/DML– UPDATE

UPDATE tabela [ [ AS ] alias ] SET {coluna = { expresssão | DEFAULT } | ( coluna [, ...] ) =

( { expressão | DEFAULT } [, ...] ) } [, ...]

[ WHERE condição | WHERE CURRENT OF cursor_name ]

OBS: o uso de cursores será visto posteriormente

Page 11: Banco de Dados Distribuídosilmerio/sbd20132/sbd6sqlDML.pdf · UFU/FACOM Página 3 SQL/DML Def. A SQL/DML(Data Manipulation Language) é um subconjunto da SQL usada para recuperar,

UFU/FACOM Página 11

SQL/DML– UPDATE – Exemplo 1

UPDATE employee SET address = 'Av. Joao Naves de Avila, 2121', salary = salary * 1.5WHERE ssn = '123456789'

Page 12: Banco de Dados Distribuídosilmerio/sbd20132/sbd6sqlDML.pdf · UFU/FACOM Página 3 SQL/DML Def. A SQL/DML(Data Manipulation Language) é um subconjunto da SQL usada para recuperar,

UFU/FACOM Página 12

SQL/DML– UPDATE – Contra Exemplo

UPDATE works_onSET (pno, hours) =

(SELECT pnumber, 10 FROM project WHERE pnumber = 1)

WHERE essn='123456789';OBS: o padrão permite associação de uma lista de

atributos com uma tupla resultante da saída de uma consulta, mas isto não foi implementado pelo PostgreSql 8.3, onde as expressões devem ser independentes. Logo o comando acima não funciona no PostgreSql 8.3 (teste isso nas versões mais recentes)

Page 13: Banco de Dados Distribuídosilmerio/sbd20132/sbd6sqlDML.pdf · UFU/FACOM Página 3 SQL/DML Def. A SQL/DML(Data Manipulation Language) é um subconjunto da SQL usada para recuperar,

UFU/FACOM Página 13

SQL/DML– UPDATE – Exemplo 2

UPDATE works_onSET (pno, hours) = (1, 10)WHERE essn='123456789';

Page 14: Banco de Dados Distribuídosilmerio/sbd20132/sbd6sqlDML.pdf · UFU/FACOM Página 3 SQL/DML Def. A SQL/DML(Data Manipulation Language) é um subconjunto da SQL usada para recuperar,

UFU/FACOM Página 14

SQL/DML– SELECT

SELECT [ALL | DISTINCT] * | expressão [ AS nome_saida ] [, ...] FROM item_from [, ...] [ WHERE condição ] [ GROUP BY expressão [, ...] ] [ HAVING condição [, ...] ] [ { UNION | INTERSECT | EXCEPT } [ ALL ] select ] [ ORDER BY expressão [ ASC | DESC | USING operador ] [ NULLS { FIRST | LAST } ] [, ...] ] [ FOR { UPDATE | SHARE } [ OF nome_tabela [, ...] ] [ NOWAIT ] [...] ]

Page 15: Banco de Dados Distribuídosilmerio/sbd20132/sbd6sqlDML.pdf · UFU/FACOM Página 3 SQL/DML Def. A SQL/DML(Data Manipulation Language) é um subconjunto da SQL usada para recuperar,

UFU/FACOM Página 15

SQL/DML–Consultas básicas e complexas Considerando os diversos parâmetros do comando SELECT, para efeito didático, vamos dividir nosso estudo em:

consultas básicas: na condição do WHERE não existe outro SELECT

consultas complexas: são consultas aninhadas, onde na condição do SELECT existe outra cláusula SELECT.

Page 16: Banco de Dados Distribuídosilmerio/sbd20132/sbd6sqlDML.pdf · UFU/FACOM Página 3 SQL/DML Def. A SQL/DML(Data Manipulation Language) é um subconjunto da SQL usada para recuperar,

UFU/FACOM Página 16

SQL/DML–SELECT-FROM-WHERE Formato de comando SELECT para consultas básicas:

SELECT lista-de-atributos FROM lista-de-tabelas WHERE condição

OBS:– condições sem cláusula SELECT;– os exemplos a seguir seguem a numeração de EN e estão

baseados no BD company;

Page 17: Banco de Dados Distribuídosilmerio/sbd20132/sbd6sqlDML.pdf · UFU/FACOM Página 3 SQL/DML Def. A SQL/DML(Data Manipulation Language) é um subconjunto da SQL usada para recuperar,

UFU/FACOM Página 17

SQL/DML–SELECT-FROM-WHERE (Esquema Company)

Page 18: Banco de Dados Distribuídosilmerio/sbd20132/sbd6sqlDML.pdf · UFU/FACOM Página 3 SQL/DML Def. A SQL/DML(Data Manipulation Language) é um subconjunto da SQL usada para recuperar,

UFU/FACOM Página 18

SQL/DML–SELECT-FROM-WHERE (Uma instância de Company)

Page 19: Banco de Dados Distribuídosilmerio/sbd20132/sbd6sqlDML.pdf · UFU/FACOM Página 3 SQL/DML Def. A SQL/DML(Data Manipulation Language) é um subconjunto da SQL usada para recuperar,

UFU/FACOM Página 19

SQL/DML - Seleção/projeção

QO) Listar a data de nascimento e o endereço dos empregados com nome : John B. Smith.

Page 20: Banco de Dados Distribuídosilmerio/sbd20132/sbd6sqlDML.pdf · UFU/FACOM Página 3 SQL/DML Def. A SQL/DML(Data Manipulation Language) é um subconjunto da SQL usada para recuperar,

UFU/FACOM Página 20

SQL/DML- Exemplo Q0

Q0) Listar a data de nascimento e o endereço dos empregados com nome : John B. Smith.

SELECT bdate, address FROM employeeWHERE fname=’John’

AND minit=’B’ AND lname=’Smith’;

Page 21: Banco de Dados Distribuídosilmerio/sbd20132/sbd6sqlDML.pdf · UFU/FACOM Página 3 SQL/DML Def. A SQL/DML(Data Manipulation Language) é um subconjunto da SQL usada para recuperar,

UFU/FACOM Página 21

SQL/DML– Seleção/projeção/junção

Q1) Listar o nome e endereço dos empregados que trabalham no departamento ’Research’

Page 22: Banco de Dados Distribuídosilmerio/sbd20132/sbd6sqlDML.pdf · UFU/FACOM Página 3 SQL/DML Def. A SQL/DML(Data Manipulation Language) é um subconjunto da SQL usada para recuperar,

UFU/FACOM Página 22

SQL/DML – Exemplo Q1

Q1) Listar o nome e endereço dos empregados que trabalham no departamento ’Research’

SELECT fname, minit, lname, address FROM employee, department

WHERE dno=dnumber AND dname=’Research’

Page 23: Banco de Dados Distribuídosilmerio/sbd20132/sbd6sqlDML.pdf · UFU/FACOM Página 3 SQL/DML Def. A SQL/DML(Data Manipulation Language) é um subconjunto da SQL usada para recuperar,

UFU/FACOM Página 23

SQL/DML- Junção com duas condições

Q2) Para todo projeto localizado em ’Stafford’, listar o número do projeto, o número do departamento que o controla e o último nome, endereço e data de nascimento do gerente do departamento.

Page 24: Banco de Dados Distribuídosilmerio/sbd20132/sbd6sqlDML.pdf · UFU/FACOM Página 3 SQL/DML Def. A SQL/DML(Data Manipulation Language) é um subconjunto da SQL usada para recuperar,

UFU/FACOM Página 24

SQL/DML- Exemplo Q2

Q2) Para todo projeto localizado em ’Stafford’, listar o número do projeto, o número do departamento que o controla e o último nome, endereço e data de nascimento do gerente do departamento.

SELECT pnumber, dnum, lname, address, bdateFROM project, department, employeeWHERE plocation=’Stafford’

AND dnum=dnumber AND ssn=mgrssn

Page 25: Banco de Dados Distribuídosilmerio/sbd20132/sbd6sqlDML.pdf · UFU/FACOM Página 3 SQL/DML Def. A SQL/DML(Data Manipulation Language) é um subconjunto da SQL usada para recuperar,

UFU/FACOM Página 25

SQL/DML-Ambiguidade de nomes de atributos

Suponha que DNUMBER e NAME são os nomes dos atributos DNO e LNAME em EMPLOYEE, respectivamente. Além disso, suponha que NAME é o nome do atributo DNAME em DEPARTMENT.

Então:

employee(fname, minit, name, ssn, bdate, address, sex, salary, superssn, dnumber)

department(name, dnumber, mgrssn, mgrstartdate)

Page 26: Banco de Dados Distribuídosilmerio/sbd20132/sbd6sqlDML.pdf · UFU/FACOM Página 3 SQL/DML Def. A SQL/DML(Data Manipulation Language) é um subconjunto da SQL usada para recuperar,

UFU/FACOM Página 26

SQL/DML – Qualificando atributos

Q1a) Listar o nome e endereço dos empregados que trabalham no departamento ’Research’ considerando os esquemas abaixo

employee(fname, minit, name, ssn, bdate, address, sex, salary, superssn, dnumber)

department(name, dnumber, mgrssn, mgrstartdate)

Page 27: Banco de Dados Distribuídosilmerio/sbd20132/sbd6sqlDML.pdf · UFU/FACOM Página 3 SQL/DML Def. A SQL/DML(Data Manipulation Language) é um subconjunto da SQL usada para recuperar,

UFU/FACOM Página 27

SQL/DML- Exemplo Q1a

Q1a) Listar o nome e endereço dos empregados que trabalham no departamento ’Research’ considerando os novos esquemas

SELECT fname, minit, employee.name FROM employee, department

WHERE employee.dnumber=department.dnumber AND department.name=’Research’

Page 28: Banco de Dados Distribuídosilmerio/sbd20132/sbd6sqlDML.pdf · UFU/FACOM Página 3 SQL/DML Def. A SQL/DML(Data Manipulation Language) é um subconjunto da SQL usada para recuperar,

UFU/FACOM Página 28

SQL/DML – Apelidos de Tabelas

Q8) Para cada empregado, liste o seu primeiro e o seu último nome acompanhados do último nome de seu supervisor.

Page 29: Banco de Dados Distribuídosilmerio/sbd20132/sbd6sqlDML.pdf · UFU/FACOM Página 3 SQL/DML Def. A SQL/DML(Data Manipulation Language) é um subconjunto da SQL usada para recuperar,

UFU/FACOM Página 29

SQL/DML – Exemplo Q8

Q8) Para cada empregado, liste o seu primeiro e o seu último nome acompanhados do último nome de seu supervisor.

SELECT e.fname, e.lname, s.lnameFROM employee AS e, employee AS sWHERE e.superssn=s.ssn

Page 30: Banco de Dados Distribuídosilmerio/sbd20132/sbd6sqlDML.pdf · UFU/FACOM Página 3 SQL/DML Def. A SQL/DML(Data Manipulation Language) é um subconjunto da SQL usada para recuperar,

UFU/FACOM Página 30

SQL/DML – Apelidos de tabelas

Q1b') Listar o nome e o endereço dos empregados que trabalham no departamento ’Research’ considerando as novas tabelas employee e department e usando apelidos

Page 31: Banco de Dados Distribuídosilmerio/sbd20132/sbd6sqlDML.pdf · UFU/FACOM Página 3 SQL/DML Def. A SQL/DML(Data Manipulation Language) é um subconjunto da SQL usada para recuperar,

UFU/FACOM Página 31

SQL/DML - Exemplo Q1b

Q1b') Listar o nome e o endereço dos empregados que trabalham no departamento ’Research’ considerando as novas tabelas employee e department e usando apelidos

SELECT fname, minit, e.name, addressFROM employee e, department dWHERE e.dnumber=d.dnumber

AND d.name=’Research’

Page 32: Banco de Dados Distribuídosilmerio/sbd20132/sbd6sqlDML.pdf · UFU/FACOM Página 3 SQL/DML Def. A SQL/DML(Data Manipulation Language) é um subconjunto da SQL usada para recuperar,

UFU/FACOM Página 32

SQL/DML-Exemplo Q1c–Omitindo WHERE e uso do * para consulta sem projeção

Qlc') Listar todos os valores de atributos de todos os empregados

SELECT * FROM employee

Page 33: Banco de Dados Distribuídosilmerio/sbd20132/sbd6sqlDML.pdf · UFU/FACOM Página 3 SQL/DML Def. A SQL/DML(Data Manipulation Language) é um subconjunto da SQL usada para recuperar,

UFU/FACOM Página 33

SQL/DML-Ex. Q10b – Produto Cartesiano

Q1Ob) Listar o produto cartesiano de empregados e departamentos

SELECT *FROM employee, department

Page 34: Banco de Dados Distribuídosilmerio/sbd20132/sbd6sqlDML.pdf · UFU/FACOM Página 3 SQL/DML Def. A SQL/DML(Data Manipulation Language) é um subconjunto da SQL usada para recuperar,

UFU/FACOM Página 34

SQL/DML - Tabela x relação// multset ou bags x set // Cláusula DISTINCT

Q11a) Listar todos os salários distintos

SELECT DISTINCT salaryFROM employee

Page 35: Banco de Dados Distribuídosilmerio/sbd20132/sbd6sqlDML.pdf · UFU/FACOM Página 3 SQL/DML Def. A SQL/DML(Data Manipulation Language) é um subconjunto da SQL usada para recuperar,

UFU/FACOM Página 35

SQL/DML – Cláusula UNION

Q4) Listar todos os números de projetos que envolvam umempregado cujo último nome é ’Smith’ sendo que o

empregado deve sertrabalhador ou gerente do departamento que controla o projeto.

Page 36: Banco de Dados Distribuídosilmerio/sbd20132/sbd6sqlDML.pdf · UFU/FACOM Página 3 SQL/DML Def. A SQL/DML(Data Manipulation Language) é um subconjunto da SQL usada para recuperar,

UFU/FACOM Página 36

SQL/DML – Exemplo Q4

Q4) Listar todos os números de projetos que envolvam umempregado cujo último nome é ’Smith’ sendo que o empregado deve ser

trabalhador ou gerente do departamento que controla o projeto.(SELECT DISTINCT pnumberFROM project, department, employeeWHERE dnum=dnumber AND msgrssn=ssn AND lname=’Smith’)UNION(SELECT DISTINCT pnumberFROM works_on, employeeWHERE essn=ssn AND lname=’Smith’)

Page 37: Banco de Dados Distribuídosilmerio/sbd20132/sbd6sqlDML.pdf · UFU/FACOM Página 3 SQL/DML Def. A SQL/DML(Data Manipulation Language) é um subconjunto da SQL usada para recuperar,

UFU/FACOM Página 37

SQL/DML – Cláusula LIKE

Q12) Listar o nome de todo empregado cujo endereço está em Houston, Texas

Page 38: Banco de Dados Distribuídosilmerio/sbd20132/sbd6sqlDML.pdf · UFU/FACOM Página 3 SQL/DML Def. A SQL/DML(Data Manipulation Language) é um subconjunto da SQL usada para recuperar,

UFU/FACOM Página 38

SQL/DML – Exemplo Q12

Q12) Listar o nome de todo empregado cujo endereço está em Houston, Texas

SELECT fname, minit, lnameFROM employeeWHERE address LIKE ’%Houston%TX%’

Page 39: Banco de Dados Distribuídosilmerio/sbd20132/sbd6sqlDML.pdf · UFU/FACOM Página 3 SQL/DML Def. A SQL/DML(Data Manipulation Language) é um subconjunto da SQL usada para recuperar,

UFU/FACOM Página 39

SQL/DML – Like usando underline _

Q12a) Listar o nome de todos os empregados nascidos na década de 50

Page 40: Banco de Dados Distribuídosilmerio/sbd20132/sbd6sqlDML.pdf · UFU/FACOM Página 3 SQL/DML Def. A SQL/DML(Data Manipulation Language) é um subconjunto da SQL usada para recuperar,

UFU/FACOM Página 40

SQL/DML - Exemplo Q12a

Q12a) Listar o nome de todos os empregados nascidos na década de 50

SELECT fname, minit, lnameFROM employeeWHERE bdate LIKE ’_ _ 5%’

Page 41: Banco de Dados Distribuídosilmerio/sbd20132/sbd6sqlDML.pdf · UFU/FACOM Página 3 SQL/DML Def. A SQL/DML(Data Manipulation Language) é um subconjunto da SQL usada para recuperar,

UFU/FACOM Página 41

SQL/DML – Expressões

Q13) Listar o nome e os salários resultantes de um aumento de 10% para os funcionários do projeto ’Productx’

Page 42: Banco de Dados Distribuídosilmerio/sbd20132/sbd6sqlDML.pdf · UFU/FACOM Página 3 SQL/DML Def. A SQL/DML(Data Manipulation Language) é um subconjunto da SQL usada para recuperar,

UFU/FACOM Página 42

SQL/DML – Exemplo Q13

Q13) Listar o nome e os salários resultantes de um aumento de 10% para os funcionários do projeto ’Productx’

SELECT fname, minit, lname, salary*1.1 as NewSalaryFROM employee, project, works_onWHERE ssn=essn AND pno=pnumber

AND pname=’ProductX'

Page 43: Banco de Dados Distribuídosilmerio/sbd20132/sbd6sqlDML.pdf · UFU/FACOM Página 3 SQL/DML Def. A SQL/DML(Data Manipulation Language) é um subconjunto da SQL usada para recuperar,

UFU/FACOM Página 43

SQL/DML – Cláusula BETWEEN

Q14) Listar todos os empregados no departamento 5 cujo salário está entre 30000 e 40000

Page 44: Banco de Dados Distribuídosilmerio/sbd20132/sbd6sqlDML.pdf · UFU/FACOM Página 3 SQL/DML Def. A SQL/DML(Data Manipulation Language) é um subconjunto da SQL usada para recuperar,

UFU/FACOM Página 44

SQL/DML – Exemplo Q14

Q14) Listar todos os empregados no departamento 5 cujo salário está entre 30000 e 40000

SELECT *FROM employeeWHERE dno=’5’

AND salary BETWEEN 30000 AND 40000

Page 45: Banco de Dados Distribuídosilmerio/sbd20132/sbd6sqlDML.pdf · UFU/FACOM Página 3 SQL/DML Def. A SQL/DML(Data Manipulation Language) é um subconjunto da SQL usada para recuperar,

UFU/FACOM Página 45

SQL/DML – Cláusula ORDER BY

Q 15) Listar os empregados e projetos em que eles estão trabalhando, ordenados pelo departamento e, dentro de cada departamento, ordenado pelo último e primeiro nome

Page 46: Banco de Dados Distribuídosilmerio/sbd20132/sbd6sqlDML.pdf · UFU/FACOM Página 3 SQL/DML Def. A SQL/DML(Data Manipulation Language) é um subconjunto da SQL usada para recuperar,

UFU/FACOM Página 46

SQL/DML – Exemplo Q15

Q 15) Listar os empregados e projetos em que eles estão trabalhando, ordenados pelo departamento e, dentro de cada departamento, ordenado pelo último e primeiro nome

SELECT dno, fname, lname, pnoFROM employee, works onWHERE essn=ssnORDER BY dno, fname, lname

Page 47: Banco de Dados Distribuídosilmerio/sbd20132/sbd6sqlDML.pdf · UFU/FACOM Página 3 SQL/DML Def. A SQL/DML(Data Manipulation Language) é um subconjunto da SQL usada para recuperar,

UFU/FACOM Página 47

SQL/DML - Consultas Complexas

• consultas aninhadas e comparação de conjuntos• tabelas obtidas de junção• funções de agregação• cláusulas “group by” e having

Page 48: Banco de Dados Distribuídosilmerio/sbd20132/sbd6sqlDML.pdf · UFU/FACOM Página 3 SQL/DML Def. A SQL/DML(Data Manipulation Language) é um subconjunto da SQL usada para recuperar,

UFU/FACOM Página 48

SQL/DML- Cláusula IN (pertinência) A consulta Q4 abaixo pode ser reformulada, removendo a

cláusula UNION e incluindo a cláusula INQ4) Listar todos os números de projetos que envolvam umempregado cujo último nome é ’Smith’ sendo que o

empregado deve ser trabalhador ou gerente do departamento que controla o projeto.

(SELECT DISTINCT pnumber FROM project, department, employeeWHERE dnum=dnumber AND msgrssn=ssn AND lname=’Smith’)

UNION(SELECT DISTINCT pnumber FROM project, works_on, employeeWHERE pno=pnumber AND essn=ssn AND lname=’Smith’)

Page 49: Banco de Dados Distribuídosilmerio/sbd20132/sbd6sqlDML.pdf · UFU/FACOM Página 3 SQL/DML Def. A SQL/DML(Data Manipulation Language) é um subconjunto da SQL usada para recuperar,

UFU/FACOM Página 49

SQL/DML Exemplo Q4a

SELECT DISTINCT pnumber FROM projectWHERE pnumber IN

(SELECT pnumber FROM project, department, employeeWHERE dnum=dnumber AND mgrssn=ssn

AND lname=’Smith’)OR pnumber IN(SELECT pno FROM works on,employeeWHERE essn=ssn AND lname=’Smith’);

Page 50: Banco de Dados Distribuídosilmerio/sbd20132/sbd6sqlDML.pdf · UFU/FACOM Página 3 SQL/DML Def. A SQL/DML(Data Manipulation Language) é um subconjunto da SQL usada para recuperar,

UFU/FACOM Página 50

SQL/DML – Comparando conjuntos com ALL, ANY ou SOME

Outras cláusulas para comparação de conjuntos: ALLANY ou SOME (são sinônimos)

Ex: salary > ALL (SELECT salary FROM ...); salary < ANY (SELECT salary FROM ...); salary > SOME (SELECT salary FROM ...);

Page 51: Banco de Dados Distribuídosilmerio/sbd20132/sbd6sqlDML.pdf · UFU/FACOM Página 3 SQL/DML Def. A SQL/DML(Data Manipulation Language) é um subconjunto da SQL usada para recuperar,

UFU/FACOM Página 51

SQL/DML – Ambiguidade em consultas aninhadas – (apelidos de tabelas)

Q16) Listar o nome dos empregados com dependente(s) de mesmo ’first name’ e sexo que o empregado

Page 52: Banco de Dados Distribuídosilmerio/sbd20132/sbd6sqlDML.pdf · UFU/FACOM Página 3 SQL/DML Def. A SQL/DML(Data Manipulation Language) é um subconjunto da SQL usada para recuperar,

UFU/FACOM Página 52

SQL/DML – Exemplo Q16

Q16) Listar o nome dos empregados com dependente(s) de mesmo ’first name’ e sexo que o empregado

SELECT e.fname,e.lnameFROM employee as eWHERE e.ssn IN

(SELECT essn FROM dependent as dWHERE fname=dependent_name

AND e.sex=d.sex);

Page 53: Banco de Dados Distribuídosilmerio/sbd20132/sbd6sqlDML.pdf · UFU/FACOM Página 3 SQL/DML Def. A SQL/DML(Data Manipulation Language) é um subconjunto da SQL usada para recuperar,

UFU/FACOM Página 53

SQL/DML – Substituindo subconsulta por junção

Q16a) Listar o nome dos empregados com dependente(s) de mesmo ’first name’ e sexo que o empregado

SELECT e.fname,e.lnameFROM employee as e, dependent as dWHERE ssn=essn

AND fname=dependent_name AND e.sex=d.sex);

Page 54: Banco de Dados Distribuídosilmerio/sbd20132/sbd6sqlDML.pdf · UFU/FACOM Página 3 SQL/DML Def. A SQL/DML(Data Manipulation Language) é um subconjunto da SQL usada para recuperar,

UFU/FACOM Página 54

SQL/DML – Q16b - FUNÇÃO EXISTS - consultas aninhadas correlacionadas

Q16b) Listar o nome dos empregados com dependente(s) de

mesmo ’first name’ e sexo que o empregado

SELECT e.fname,e.lnameFROM employee as eWHERE EXISTS

(SELECT * FROM dependent dWHERE e.ssn=d.essn AND e.fname=d.dependent_name AND e.sex=d.sex);

Page 55: Banco de Dados Distribuídosilmerio/sbd20132/sbd6sqlDML.pdf · UFU/FACOM Página 3 SQL/DML Def. A SQL/DML(Data Manipulation Language) é um subconjunto da SQL usada para recuperar,

UFU/FACOM Página 55

SQL/DML– FUNÇÃO NOT EXISTS - consultas aninhadas correlacionadas

Q6) Listar os nomes de empregados sem dependentes

Page 56: Banco de Dados Distribuídosilmerio/sbd20132/sbd6sqlDML.pdf · UFU/FACOM Página 3 SQL/DML Def. A SQL/DML(Data Manipulation Language) é um subconjunto da SQL usada para recuperar,

UFU/FACOM Página 56

SQL/DML – Exemplo Q6

Q6) Listar os nomes de empregados sem dependentes

SELECT fname,lnameFROM employeeWHERE NOT EXISTS (SELECT *

FROM dependent WHERE ssn=essn);

Page 57: Banco de Dados Distribuídosilmerio/sbd20132/sbd6sqlDML.pdf · UFU/FACOM Página 3 SQL/DML Def. A SQL/DML(Data Manipulation Language) é um subconjunto da SQL usada para recuperar,

UFU/FACOM Página 57

SQL/DML – Aninhamento em dois níveis

Q3b) Listar o nome dos empregados que trabalham em todos os projetos controlados pelo departamento número 4

OBS: Observe a expressão todos no enunciado da consulta. Esta é a divisão da álgebra relacional, que será estudada posteriormente. Em SQL a divisão pode ser especificada de diversas formas.

Page 58: Banco de Dados Distribuídosilmerio/sbd20132/sbd6sqlDML.pdf · UFU/FACOM Página 3 SQL/DML Def. A SQL/DML(Data Manipulation Language) é um subconjunto da SQL usada para recuperar,

UFU/FACOM Página 58

SQL/DML – Exemplo Q3b

Q3b) Listar o nome dos empregados que trabalham em todos os projetos controlados pelo departamento número 4

SELECT lname, fname FROM employeeWHERE NOT EXISTS (SELECT * FROM project WHERE dnum=4

AND NOT EXISTS (SELECT * FROM works_on

WHERE essn=ssn AND pnumber=pno));

Page 59: Banco de Dados Distribuídosilmerio/sbd20132/sbd6sqlDML.pdf · UFU/FACOM Página 3 SQL/DML Def. A SQL/DML(Data Manipulation Language) é um subconjunto da SQL usada para recuperar,

UFU/FACOM Página 59

SQL/DML – Alternativas para divisão em SQL

Alternativas de especificação de divisão em SQL: Usando cláusulas NOT EXISTS e IN Usando cláusula NOT EXISTS e EXCEPT Usando cláusula FOREACH e EXISTS(não

implementada no PostgreSql 8.3)

Page 60: Banco de Dados Distribuídosilmerio/sbd20132/sbd6sqlDML.pdf · UFU/FACOM Página 3 SQL/DML Def. A SQL/DML(Data Manipulation Language) é um subconjunto da SQL usada para recuperar,

UFU/FACOM Página 60

SQL/DML - divisão usando cláusulas NOT EXISTS e IN

SELECT lname, fname FROM employeeWHERE NOT EXISTS (SELECT * FROM works_on w1 WHERE (w1.pno IN (SELECT pnumber FROM

project WHERE dnum=4)) AND NOT EXISTS

(SELECT * FROM works_on w2 WHERE w2.essn=ssn AND w2.pno=w1.pno));

Page 61: Banco de Dados Distribuídosilmerio/sbd20132/sbd6sqlDML.pdf · UFU/FACOM Página 3 SQL/DML Def. A SQL/DML(Data Manipulation Language) é um subconjunto da SQL usada para recuperar,

UFU/FACOM Página 61

SQL/DML - divisão usando cláusulas NOT EXISTS e EXCEPT

SELECT lname, fname FROM employee eWHERE NOT EXISTS

(SELECT pnumber FROM project WHERE dnum=4EXCEPT (SELECT pno FROM works_on w

WHERE w.essn=e.ssn))

Page 62: Banco de Dados Distribuídosilmerio/sbd20132/sbd6sqlDML.pdf · UFU/FACOM Página 3 SQL/DML Def. A SQL/DML(Data Manipulation Language) é um subconjunto da SQL usada para recuperar,

UFU/FACOM Página 62

SQL/DML - divisão usando cláusulas FOREACH e EXISTS

SELECT lname, fname FROM employeeWHERE FOREACH

(SELECT pnumber FROM project WHERE dnum=4)EXISTS (SELECT * FROM works_on

WHERE essn=ssn AND pno=pnumber));

ATENÇÃO: este comando não funciona no PostgreSql 8.3

Page 63: Banco de Dados Distribuídosilmerio/sbd20132/sbd6sqlDML.pdf · UFU/FACOM Página 3 SQL/DML Def. A SQL/DML(Data Manipulation Language) é um subconjunto da SQL usada para recuperar,

UFU/FACOM Página 63

SQL/DML – Tabelas obtidas de junção

Q1a) Listar o nome e endereço dos empregados que trabalham no departamento ’Research’

Page 64: Banco de Dados Distribuídosilmerio/sbd20132/sbd6sqlDML.pdf · UFU/FACOM Página 3 SQL/DML Def. A SQL/DML(Data Manipulation Language) é um subconjunto da SQL usada para recuperar,

UFU/FACOM Página 64

SQL/DML – Exemplo Q1a

Q1a) Listar o nome e endereço dos empregados que trabalham no departamento ’Research’

SELECT fname, minit, lname, address FROM (employee JOIN department ON dno=dnumber)

WHERE dname=’Research’

Page 65: Banco de Dados Distribuídosilmerio/sbd20132/sbd6sqlDML.pdf · UFU/FACOM Página 3 SQL/DML Def. A SQL/DML(Data Manipulation Language) é um subconjunto da SQL usada para recuperar,

UFU/FACOM Página 65

SQL/DML - Junção Natural

Na junção natural iguala-se atributos de mesmo nome

Qlb)Listar o nome e endereço dos empregados que trabalham no departamento ’Research’

SELECT fname, name, addressFROM (employee NATURAL JOIN

(department AS dept (dname, dno, mssn, msdate)))

WHERE dname= ’Research’

Page 66: Banco de Dados Distribuídosilmerio/sbd20132/sbd6sqlDML.pdf · UFU/FACOM Página 3 SQL/DML Def. A SQL/DML(Data Manipulation Language) é um subconjunto da SQL usada para recuperar,

UFU/FACOM Página 66

SQL/DML - OUTER JOIN

A cláusula {LEFT | FULL | RIGHT} OUTER JOIN mantêm no resultado todas as tuplas da tabela da esquerda,

das duas tabelas ou da tabela da direita da junção, respectivamente, inserindo NULL quando não há casamento (matching)

Q8b)Para cada empregado, liste o seu primeiro e o seu último nome acompanhado do último nome de seu supervisor, memo se o empregado não tiver supervisor, liste seu nome

Page 67: Banco de Dados Distribuídosilmerio/sbd20132/sbd6sqlDML.pdf · UFU/FACOM Página 3 SQL/DML Def. A SQL/DML(Data Manipulation Language) é um subconjunto da SQL usada para recuperar,

UFU/FACOM Página 67

SQL/DML – Exemplo Q8b

Q8b)Para cada empregado, liste o seu primeiro acompanhado do primeiro nome de seu supervisor, memo se o empregado não tiver supervisor, liste seu nome

SELECT e.fname as employee_name, s.fname as supervisor_name

FROM (employee AS e LEFT OUTER JOINemployee AS s ON e.superssn =s.ssn)

Page 68: Banco de Dados Distribuídosilmerio/sbd20132/sbd6sqlDML.pdf · UFU/FACOM Página 3 SQL/DML Def. A SQL/DML(Data Manipulation Language) é um subconjunto da SQL usada para recuperar,

UFU/FACOM Página 68

SQL/DML – Exemplo Q8b'Q8b')Liste o primeiro nome do supervisor e o primeiro nome

de seus supervisionado, ordenado pelo primeiro. Mesmo se o empregado não for supervisor de ninguém, liste seu nome na primeira coluna e mesmo se o empregado não tiver supervisor, liste seu nome na segunda coluna.

SELECT s.fname as supervisor_name, e.fname as employee_name FROM (employee AS e FULL OUTER JOIN

employee AS s ON e.superssn =s.ssn)ORDER BY 1

Page 69: Banco de Dados Distribuídosilmerio/sbd20132/sbd6sqlDML.pdf · UFU/FACOM Página 3 SQL/DML Def. A SQL/DML(Data Manipulation Language) é um subconjunto da SQL usada para recuperar,

UFU/FACOM Página 69

SQL/DML - Junções aninhadas

Q2a) Para todo projeto localizado em ’Stafford’, listar o número do projeto, o número do departamento que o controla e o último nome do gerente do departamento

Page 70: Banco de Dados Distribuídosilmerio/sbd20132/sbd6sqlDML.pdf · UFU/FACOM Página 3 SQL/DML Def. A SQL/DML(Data Manipulation Language) é um subconjunto da SQL usada para recuperar,

UFU/FACOM Página 70

SQL/DML – Exemplo Q2a

Q2a) Para todo projeto localizado em ’Stafford’, listar o número do projeto, o número do departamento que o controla e o último nome do gerente do departamento

SELECT pnumber, dnum, lname FROM ((project JOIN department ON dnum=dnumber (JOIN employee ON mgrssn=ssn)) WHERE plocation = ’Stafford’

Page 71: Banco de Dados Distribuídosilmerio/sbd20132/sbd6sqlDML.pdf · UFU/FACOM Página 3 SQL/DML Def. A SQL/DML(Data Manipulation Language) é um subconjunto da SQL usada para recuperar,

UFU/FACOM Página 71

SQL/DML- Funções de agregação

• COUNT• SUM• MAX• MIN• AVG• etc.

Page 72: Banco de Dados Distribuídosilmerio/sbd20132/sbd6sqlDML.pdf · UFU/FACOM Página 3 SQL/DML Def. A SQL/DML(Data Manipulation Language) é um subconjunto da SQL usada para recuperar,

UFU/FACOM Página 72

SQL/DML – Exemplo Q19

Q19) Listar a soma de salários de todos os empregados,o maior salário e a média de salários

SELECT SUM(salary), MAX(salary), MIN(salary) AVG(salary)FROM employee;

Page 73: Banco de Dados Distribuídosilmerio/sbd20132/sbd6sqlDML.pdf · UFU/FACOM Página 3 SQL/DML Def. A SQL/DML(Data Manipulation Language) é um subconjunto da SQL usada para recuperar,

UFU/FACOM Página 73

SQL/DML – Exemplo Q20

Q20) Listar a soma de salários, o maior salário e a média de salários, somente para funcionários do departamento 'Research'

SELECT SUM(salary), MAX(salary), MIN(salary), AVG(salary)FROM employee, departmentWHERE dno=dnumber AND dname='Research';

Page 74: Banco de Dados Distribuídosilmerio/sbd20132/sbd6sqlDML.pdf · UFU/FACOM Página 3 SQL/DML Def. A SQL/DML(Data Manipulation Language) é um subconjunto da SQL usada para recuperar,

UFU/FACOM Página 74

SQL/DML – Exemplos Q21 e Q23

Q21) Listar o número de empregadosSELECT COUNT(*) FROM employee;

Q23) Listar o número de salários distintos

SELECT COUNT(DISTINCT salary) FROM employee;

Page 75: Banco de Dados Distribuídosilmerio/sbd20132/sbd6sqlDML.pdf · UFU/FACOM Página 3 SQL/DML Def. A SQL/DML(Data Manipulation Language) é um subconjunto da SQL usada para recuperar,

UFU/FACOM Página 75

SQL/DML - Funções de agregação em subconsultas

Q5) Listar o nome dos empregados que têm dois ou mais dependentes

SELECT lname, fnameFROM employeeWHERE (SELECT COUNT(*)

FROM dependentWHERE essn=ssn) >= 2;

Page 76: Banco de Dados Distribuídosilmerio/sbd20132/sbd6sqlDML.pdf · UFU/FACOM Página 3 SQL/DML Def. A SQL/DML(Data Manipulation Language) é um subconjunto da SQL usada para recuperar,

UFU/FACOM Página 76

SQL/DML - Cláusulas group by

Q24) Listar para cada departamento seu número, a quantidade de empregados e a média salarial de seus empregados.

Page 77: Banco de Dados Distribuídosilmerio/sbd20132/sbd6sqlDML.pdf · UFU/FACOM Página 3 SQL/DML Def. A SQL/DML(Data Manipulation Language) é um subconjunto da SQL usada para recuperar,

UFU/FACOM Página 77

SQL/DML – Exemplo Q24

Q24) Listar para cada departamento seu número, a quantidade de empregados e a média salarial de seus empregados.

SELECT dnumber, COUNT(*), AVG(salary)FROM department, employeeWHERE dno=dnumberGROUP BY dnumber;

OBS: o agrupamento deve incluir todas as colunas da projeção que não incluem função de agregação

Page 78: Banco de Dados Distribuídosilmerio/sbd20132/sbd6sqlDML.pdf · UFU/FACOM Página 3 SQL/DML Def. A SQL/DML(Data Manipulation Language) é um subconjunto da SQL usada para recuperar,

UFU/FACOM Página 78

SQL/DML – Group by com duas colunas

Q25) Listar para cada projeto seu número, nome e a quantidade de empregados que trabalham no projeto.

Page 79: Banco de Dados Distribuídosilmerio/sbd20132/sbd6sqlDML.pdf · UFU/FACOM Página 3 SQL/DML Def. A SQL/DML(Data Manipulation Language) é um subconjunto da SQL usada para recuperar,

UFU/FACOM Página 79

SQL/DML – Exemplo Q25

Q25) Listar para cada projeto seu número, nome e a quantidade de empregados que trabalham no projeto.

SELECT pnumber, pname, COUNT(*) FROM project, works_on WHERE pno=pnumber GROUP BY pnumber, pname;

Page 80: Banco de Dados Distribuídosilmerio/sbd20132/sbd6sqlDML.pdf · UFU/FACOM Página 3 SQL/DML Def. A SQL/DML(Data Manipulation Language) é um subconjunto da SQL usada para recuperar,

UFU/FACOM Página 80

SQL/DML - Cláusulas group by e having

Q26) Listar para cada projeto onde trabalham mais de doisempregados seu número e a quantidade de empregados que

trabalham no projeto

SELECT pnumber, pname, COUNT(*) FROM project, works_on WHERE pno=pnumberGROUP BY pnumber, pnameHAVING COUNT (* )> 2;

Page 81: Banco de Dados Distribuídosilmerio/sbd20132/sbd6sqlDML.pdf · UFU/FACOM Página 3 SQL/DML Def. A SQL/DML(Data Manipulation Language) é um subconjunto da SQL usada para recuperar,

UFU/FACOM Página 81

SQL/DML - Cláusulas group by e consultas aninhadas com cláusula IN

Q28) Listar para cada departamento que tem mais que 5 empregados, o número do departamento e o número de empregados que ganham mais que 40000

Page 82: Banco de Dados Distribuídosilmerio/sbd20132/sbd6sqlDML.pdf · UFU/FACOM Página 3 SQL/DML Def. A SQL/DML(Data Manipulation Language) é um subconjunto da SQL usada para recuperar,

UFU/FACOM Página 82

SQL/DML – Exemplo Q28Q28) Listar para cada departamento que tem mais que 5

empregados, o número do departamento e o número de empregados que ganham mais que 40000

SELECT dno, COUNT(*)FROM employeeWHERE salary > 40000

AND dno IN(SELECT dnumber FROM department

WHERE(SELECT COUNT(*) FROM employee e2

WHERE e2 .dno=dnumber)>2)GROUP BY dno;

Page 83: Banco de Dados Distribuídosilmerio/sbd20132/sbd6sqlDML.pdf · UFU/FACOM Página 3 SQL/DML Def. A SQL/DML(Data Manipulation Language) é um subconjunto da SQL usada para recuperar,

UFU/FACOM Página 83

SQL/DML e o PostgreSQLEXERCÍCIOS DE IMPLEMENTAÇÃO

=> Lab2 – Exemplos de consultas simples no esquema company=> Lab3 – Exemplos de consultas complexas no esquema company e exercícios usando o esquema SEE

Page 84: Banco de Dados Distribuídosilmerio/sbd20132/sbd6sqlDML.pdf · UFU/FACOM Página 3 SQL/DML Def. A SQL/DML(Data Manipulation Language) é um subconjunto da SQL usada para recuperar,

UFU/FACOM Página 84

Bibliografia• [EN] Capítulos 4,5• [SK] Capítulos 3,4,5 • [RG] Capítulos 5

Page 85: Banco de Dados Distribuídosilmerio/sbd20132/sbd6sqlDML.pdf · UFU/FACOM Página 3 SQL/DML Def. A SQL/DML(Data Manipulation Language) é um subconjunto da SQL usada para recuperar,

UFU/FACOM Página 85

FIM – SQL/DML e o PostgreSQL

FIM – SQL/DML e o PostgreSQL