Banco de Dados Distribuídosilmerio/sbd20132/sbd6sqlDML.pdf · UFU/FACOM Página 3 SQL/DML Def. A...

Post on 11-Oct-2020

7 views 0 download

Transcript of Banco de Dados Distribuídosilmerio/sbd20132/sbd6sqlDML.pdf · UFU/FACOM Página 3 SQL/DML Def. A...

GBC043 - Sistemas de Banco de DadosSQL/DML no PostgreSQL

Ilmério Reis da Silvailmerio@facom.ufu.brwww.facom.ufu.br/~ilmerio/sbdUFU/FACOM/BCC

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

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.

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.

UFU/FACOM Página 5

SQL/DML - INSERT

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

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

| comando-select }

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)

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);

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;

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

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

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'

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)

UFU/FACOM Página 13

SQL/DML– UPDATE – Exemplo 2

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

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 ] [...] ]

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.

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;

UFU/FACOM Página 17

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

UFU/FACOM Página 18

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

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.

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’;

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’

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’

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.

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

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)

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)

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’

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.

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

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

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’

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

UFU/FACOM Página 33

SQL/DML-Ex. Q10b – Produto Cartesiano

Q1Ob) Listar o produto cartesiano de empregados e departamentos

SELECT *FROM employee, department

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

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.

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’)

UFU/FACOM Página 37

SQL/DML – Cláusula LIKE

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

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%’

UFU/FACOM Página 39

SQL/DML – Like usando underline _

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

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%’

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’

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'

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

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

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

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

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

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’)

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’);

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 ...);

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

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);

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);

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);

UFU/FACOM Página 55

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

Q6) Listar os nomes de empregados sem dependentes

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);

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.

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));

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)

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));

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))

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

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’

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’

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’

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

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)

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

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

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’

UFU/FACOM Página 71

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

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

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;

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';

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;

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;

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.

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

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.

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;

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;

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

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;

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

UFU/FACOM Página 84

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

UFU/FACOM Página 85

FIM – SQL/DML e o PostgreSQL

FIM – SQL/DML e o PostgreSQL