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