Skip navigation

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