Skip navigation

Monthly Archives: novembro 2014

A segunda prova irá exigir mais especificamente conhecimentos adquiridos entre os capítulos 5 e 7, inclusive, do livro Lógica para Ciência da Computação do Prof. João Nunes de Souza, lembrando que todo o conhecimento prévio também é exigido, uma vez que é utilizado nas definições e ferramentas.

Em Adição, será exigido também conhecimento em portas lógicas, funções e circuitos lógicos e simplificação de funções/circuitos lógicos utilizando a álgebra booleana ou mapas de Karnaugh.

Para essa ementa consulte as seguintes fontes na internet:

http://www.estgv.ipv.pt/PaginasPessoais/ffrancisco/sd0506/05km.pdf

http://www.inf.ufsc.br/~guntzel/isd/isd2.pdf

http://dcm.ffclrp.usp.br/~augusto/teaching/aba/AB-Funcoes-Logicas-Portas-Logicas.pdf

http://www.feng.pucrs.br/~decastro/pdf/ED_C1.pdf

http://www.inf.ufsc.br/ine5365/clteoria.html

http://pt.slideshare.net/thild/simplificacao-mapas-karnaugh

Bons Estudos.

Fig 9.1:

wpid-01_-2014-11-24-12-251.png

Fig 9.2:

wpid-02_-2014-11-24-12-251.png

Fig 9.3

wpid-03_-2014-11-24-12-251.png

Fig. 9.4

wpid-04_-2014-11-24-12-251.png

Fig 9.5

wpid-05_-2014-11-24-12-251.png

Fig 9.6

wpid-06_-2014-11-24-12-251.png

Fig 9.7

wpid-07_-2014-11-24-12-251.png

Fig 9.8

wpid-08_-2014-11-24-12-251.png

Fig 9.9

wpid-09_-2014-11-24-12-251.png

Fig 9.10

wpid-10_-2014-11-24-12-251.png

Fig 9.11

wpid-11_-2014-11-24-12-251.png

Fig 9.12

Fig 9.13

wpid-13_-2014-11-24-12-25.png

Fig 9.14

wpid-14_-2014-11-24-12-25.png

Fig 9.16

wpid-15_-2014-11-24-12-25.png

Fig 9. 17

wpid-16_-2014-11-24-12-25.png

Fig 9.18

wpid-17_-2014-11-24-12-25.png

Fig 9.19

wpid-18_-2014-11-24-12-25.png

Fig 9.20

wpid-19_-2014-11-24-12-25.png

Expressões

Utilizadas para retornar um cálculo no SQL

Exemplo:

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 NewSalary

FROM employee, project, works_on

WHERE ssn=essn AND pno=pnumber

AND pname=’ProductX’

Cláusula BETWEEN

Retorna os dados entre intervalos fechados definidos.

Q14) Listar todos os empregados no departamento 5 cujo

salário está entre 30000 e 40000

SELECT *

FROM employee

WHERE dno=’5’

AND salary BETWEEN 30000 AND 40000

Cláusula Order By

Ordena o resultado pela(s) coluna(s) escolhida(s), da maneira desejada: Ascendente ou Descendente

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, pno

FROM employee, works_on

WHERE essn=ssn

ORDER BY dno, fname, lname

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
Cláusula IN (pertinência)

A consulta Q4 abaixo pode ser reformulada, removendo a cláusula UNION e incluindo a cláusula IN

Q4) Listar todos os números de projetos que envolvam um empregado 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, employee

WHERE dnum=dnumber AND msgrssn=ssn AND lname=’Smith’)

UNION

(SELECT DISTINCT pnumber FROM project, works_on, employee

WHERE pno=pnumber AND essn=ssn AND lname=’Smith’)

SELECT DISTINCT pnumber FROM project

WHERE pnumber IN

(SELECT pnumber FROM project, department, employee

WHERE dnum=dnumber AND mgrssn=ssn

AND lname=’Smith’)

OR pnumber IN

(SELECT pno FROM works on,employee

WHERE essn=ssn AND lname=’Smith’);

Comparando conjuntos com ALL, ANY ou SOME

Outras cláusulas para comparação de conjuntos:

ALL

ANY ou SOME (são sinônimos)

Ex: salary > ALL (SELECT salary FROM …);

salary < ANY (SELECT salary FROM …);

salary > SOME (SELECT salary FROM …);

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

SELECT e.fname,e.lname

FROM employee as e

WHERE e.ssn IN

(SELECT essn FROM dependent as d

WHERE fname=dependent_name

AND e.sex=d.sex);

SELECT e.fname,e.lname

FROM employee as e, dependent as d

WHERE ssn=essn

AND fname=dependent_name

AND e.sex=d.sex;

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.lname

FROM employee as e

WHERE EXISTS

(SELECT * FROM dependent d

WHERE e.ssn=d.essn

AND e.fname=d.dependent_name

AND e.sex=d.sex);

FUNÇÃO NOT EXISTS – consultas aninhadas correlacionadas

Q6) Listar os nomes de empregados sem dependentes

SELECT fname,lname

FROM employee

WHERE NOT EXISTS (SELECT *

FROM dependent

WHERE ssn=essn);

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. Em SQL a divisão pode ser especificada de diversas formas.

SELECT lname, fname FROM employee

WHERE NOT EXISTS

(SELECT * FROM project WHERE dnum=4

AND NOT EXISTS

(SELECT * FROM works_on

WHERE essn=ssn

AND pnumber=pno));

Alternativas de Divisão para 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)

divisão usando cláusulas NOT EXISTS e IN

SELECT lname, fname FROM employee

WHERE 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.ecpf=cpf AND w2.pno=w1.pno));

divisão usando cláusulas NOT EXISTS e EXCEPT

SELECT lname, fname FROM employee e

WHERE NOT EXISTS

(SELECT pnumber FROM project WHERE dnum=4

EXCEPT

(SELECT pno FROM works_on w

WHERE w.ecpf=e.cpf))

divisão usando cláusulas FOREACH e EXISTS

SELECT lname, fname FROM employee

WHERE FOREACH

(SELECT pnumber FROM project WHERE dnum=4)

EXISTS

(SELECT * FROM works_on

WHERE ecpf=cpf AND pno=pnumber));

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

Tabelas obtidas de junção

Q1a) Listar o nome e endereço dos empregados que

trabalham no departamento ’Research’

SELECT fname, minit, lname, address, dnumber

FROM (employee JOIN department ON dno=dnumber)

WHERE dname=’Research’

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, address

FROM (employee NATURAL JOIN

(department AS dept (dname, dno, mssn,

msdate)))

WHERE dname= ’Research’

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 acompanhado do primeiro nome de seu supervisor, mesmo 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 JOIN

employee AS s ON e.supercpf =s.cpf)

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.supercpf =s.cpf)

ORDER BY 1

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

SELECT pnumber, dnum, lname

FROM ((project JOIN department ON dnum=dnumber

(JOIN employee ON mgrssn=ssn))

WHERE plocation = ’Stafford’

Funções de agregação

• COUNT

• SUM

• MAX

• MIN

• AVG

• etc.

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;

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, department

WHERE dno=dnumber AND dname=’Research’;

Q21) Listar o número de empregados

SELECT COUNT(*) FROM employee;

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

SELECT COUNT(DISTINCT salary) FROM employee;

Funções de agregação em subconsultas

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

SELECT lname, fname

FROM employee

WHERE (SELECT COUNT(*)

FROM dependent

WHERE essn=ssn) >= 2;

Cláusulas group by

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, employee

WHERE dno=dnumber

GROUP BY dnumber;

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

Group by com duas colunas

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;

Cláusulas group by e having

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

SELECT pnumber, pname, COUNT(*)

FROM project, works_on

WHERE pno=pnumber

GROUP BY pnumber, pname

HAVING COUNT (* )> 2;

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

SELECT dno, COUNT(*)

FROM employee

WHERE salary > 40000

AND dno IN

(SELECT dnumber FROM department

WHERE(SELECT COUNT(*)

FROM employee e2

WHERE e2 .dno=dnumber)>5)

SQL/DML e o PostgreSQL

EXERCÍCIOS DE IMPLEMENTAÇÃO

=> Exercícios de consultas simples no esquema company

=> Exercicios de consultas complexas no esquema company e exercícios usando o esquema SEE

Bibliografia:

[SK] Capítulos 3,4,5

Expressões

Utilizadas para retornar um cálculo no SQL

Exemplo:

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 NewSalary

FROM employee, project, works_on

WHERE ssn=essn AND pno=pnumber

AND pname=’ProductX’

Cláusula BETWEEN

Retorna os dados entre intervalos fechados definidos.

Q14) Listar todos os empregados no departamento 5 cujo

salário está entre 30000 e 40000

SELECT *

FROM employee

WHERE dno=’5’

AND salary BETWEEN 30000 AND 40000

Cláusula Order By

Ordena o resultado pela(s) coluna(s) escolhida(s), da maneira desejada: Ascendente ou Descendente

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, pno

FROM employee, works on

WHERE essn=ssn

ORDER BY dno, fname, lname

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
Cláusula IN (pertinência)

A consulta Q4 abaixo pode ser reformulada, removendo a cláusula UNION e incluindo a cláusula IN

Q4) Listar todos os números de projetos que envolvam um empregado 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, employee

WHERE dnum=dnumber AND msgrssn=ssn AND lname=’Smith’)

UNION

(SELECT DISTINCT pnumber FROM project, works_on, employee

WHERE pno=pnumber AND essn=ssn AND lname=’Smith’)

SELECT DISTINCT pnumber FROM project

WHERE pnumber IN

(SELECT pnumber FROM project, department, employee

WHERE dnum=dnumber AND mgrssn=ssn

AND lname=’Smith’)

OR pnumber IN

(SELECT pno FROM works on,employee

WHERE essn=ssn AND lname=’Smith’);

Comparando conjuntos com ALL, ANY ou SOME

Outras cláusulas para comparação de conjuntos:

ALL

ANY ou SOME (são sinônimos)

Ex: salary > ALL (SELECT salary FROM …);

salary < ANY (SELECT salary FROM …);

salary > SOME (SELECT salary FROM …);

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

SELECT e.fname,e.lname

FROM employee as e

WHERE e.ssn IN

(SELECT essn FROM dependent as d

WHERE fname=dependent_name

AND e.sex=d.sex);

SELECT e.fname,e.lname

FROM employee as e, dependent as d

WHERE ssn=essn

AND fname=dependent_name

AND e.sex=d.sex);

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.lname

FROM employee as e

WHERE EXISTS

(SELECT * FROM dependent d

WHERE e.ssn=d.essn

AND e.fname=d.dependent_name

AND e.sex=d.sex);

FUNÇÃO NOT EXISTS – consultas aninhadas correlacionadas

Q6) Listar os nomes de empregados sem dependentes

SELECT fname,lname

FROM employee

WHERE NOT EXISTS (SELECT *

FROM dependent

WHERE ssn=essn);

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. Em SQL a divisão pode ser especificada de diversas formas.

SELECT lname, fname FROM employee

WHERE NOT EXISTS

(SELECT * FROM project WHERE dnum=4

AND NOT EXISTS

(SELECT * FROM works_on

WHERE essn=ssn

AND pnumber=pno));

Alternativas de Divisão para 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)

divisão usando cláusulas NOT EXISTS e IN

SELECT lname, fname FROM employee

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

divisão usando cláusulas NOT EXISTS e EXCEPT

SELECT lname, fname FROM employee e

WHERE NOT EXISTS

(SELECT pnumber FROM project WHERE dnum=4

EXCEPT

(SELECT pno FROM works_on w

WHERE w.essn=e.ssn))

divisão usando cláusulas FOREACH e EXISTS

SELECT lname, fname FROM employee

WHERE 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

Tabelas obtidas de junção

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’

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, address

FROM (employee NATURAL JOIN

(department AS dept (dname, dno, mssn,

msdate)))

WHERE dname= ’Research’

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 acompanhado do primeiro nome de seu supervisor, mesmo 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 JOIN

employee AS s ON e.superssn =s.ssn)

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

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

SELECT pnumber, dnum, lname

FROM ((project JOIN department ON dnum=dnumber

(JOIN employee ON mgrssn=ssn))

WHERE plocation = ’Stafford’

Funções de agregação

• COUNT

• SUM

• MAX

• MIN

• AVG

• etc.

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;

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, department

WHERE dno=dnumber AND dname=’Research’;

Q21) Listar o número de empregados

SELECT COUNT(*) FROM employee;

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

SELECT COUNT(DISTINCT salary) FROM employee;

Funções de agregação em subconsultas

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

SELECT lname, fname

FROM employee

WHERE (SELECT COUNT(*)

FROM dependent

WHERE essn=ssn) >= 2;

Cláusulas group by

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, employee

WHERE dno=dnumber

GROUP BY dnumber;

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

Group by com duas colunas

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;

Cláusulas group by e having

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

SELECT pnumber, pname, COUNT(*)

FROM project, works_on

WHERE pno=pnumber

GROUP BY pnumber, pname

HAVING COUNT (* )> 2;

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

SELECT dno, COUNT(*)

FROM employee

WHERE salary > 40000

AND dno IN

(SELECT dnumber FROM department

WHERE(SELECT COUNT(*)

FROM employee e2

WHERE e2 .dno=dnumber)>2)

SQL/DML e o PostgreSQL

EXERCÍCIOS DE IMPLEMENTAÇÃO

=> Exemplos de consultas simples no esquema company

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

Bibliografia:

[SK] Capítulos 3,4,5

Os comandos da Linguagem de Modelagem de Dados do SQL são responsáveis por:

– Comandos de inserção de tuplas em tabelas

– Comandos de alteração e supressão de tuplas

– Comandos de consulta (básicos e complexos)

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

• 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.

Insert

INSERT INTO tabela [ ( coluna [, …] ) ]

{ DEFAULT VALUES

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

[, …]

| comando-select

}

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)

Exemplo 2

INSERT INTO tabela ( coluna [, …] )

VALUES (expressão [, …] )

INSERT INTO employee(fname, minit, lname, ssn, dno)

VALUES (‘John’, ‘B’, ‘Smith’, ‘123456789’, 5);

Exemplo 3

INSERT INTO tabela comando-select

INSERT INTO works_on

SELECT ssn, pnumber, 0

FROM employee, project;

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

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

Update Exemplo 1

UPDATE employee

SET address = ‘Av. Joao Naves de Avila, 2121’,

salary = salary * 1.5

WHERE ssn = ‘123456789’

Update Contra-Exemplo

UPDATE works_on

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

Update Exemplo 2

UPDATE works_on

SET (pno, hours) = (1, 10)

WHERE essn=’123456789′;

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

–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.

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;

Restrição + Projeção

QO) Listar a data de nascimento e o endereço dos

empregados com nome : John B. Smith.

SELECT bdate, address

FROM employee

WHERE fname=’John’

AND minit=’B’

AND lname=’Smith’;

Restrição + Projeção + Junção

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’

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.

SELECT pnumber, dnum, lname, address, bdate

FROM project, department, employee

WHERE plocation=’Stafford’

AND dnum=dnumber

AND ssn=mgrssn

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)

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)

SELECT fname, minit, employee.name

FROM employee, department

WHERE employee.dnumber=department.dnumber

AND department.name=’Research’

Apelidos de Tabelas (Renomeação)

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.lname

FROM employee AS e, employee AS s

WHERE e.superssn=s.ssn

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, address

FROM employee e, department d

WHERE e.dnumber=d.dnumber

AND d.name=’Research’

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

Produto Cartesiano

Q1Ob) Listar o produto cartesiano de empregados e departamentos

SELECT *

FROM employee, department

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

Q11a) Listar todos os salários distintos

SELECT DISTINCT salary

FROM employee

Cláusula UNION

Q4) Listar todos os números de projetos que envolvam um

empregado cujo último nome é ’Smith’ sendo que o

empregado deve sertrabalhador ou gerente do

departamento que controla o projeto.

(SELECT DISTINCT pnumber

FROM project, department, employee

WHERE dnum=dnumber AND msgrssn=ssn AND lname=’Smith’)

UNION

(SELECT DISTINCT pnumber

FROM works_on, employee

WHERE essn=ssn AND lname=’Smith’)

Cláusula LIKE

Q12) Listar o nome de todo empregado cujo endereço está

em Houston, Texas

SELECT fname, minit, lname

FROM employee

WHERE address LIKE ’%Houston%TX%’

Like usando underline _

Q12a) Listar o nome de todos os empregados nascidos na

década de 50

SELECT fname, minit, lname

FROM employee

WHERE bdate LIKE ’_ _ 5%’

Considerando o DER desenvolvido no trabalho anterior:

Faça o mapeamento do DER anterior para o modelo relacional, incluindo as restrições de chave, integridade referencial e de domínio.