t11 - SQL DDL e DML
t11 - SQL DDL e DML
2
Resultados de Aprendizagem
1. Construir bases de dados SQL segundo esquemas relacionais
2. Popular bases de dados SQL com dados
3
Recapitulação
Desenho de Bases de Dados
Especificação Modelação Modelação Desenho
de Requisitos Conceptual Lógica Físico
● requisito funcional 1
● requisito funcional 2
● …
● restrição de integridade 1
● restrição de integridade 2
● …
Normalização
5
Modelo Entidade-Associação
6
Conversão E-A–Relacional
Modelo E-A Modelo Relacional
Entidade Relação (mesmos atributos e mesma chave)
Associação 0-N–* Relação (chaves das entidades associadas mais atributos da associação)
Associação 1-N–* Relação + restrição de integridade para participação obrigatória
Associação 1–* Chave da segunda entidade e atributos da associação incorporados na
primeira entidade
Associação 0-1–* Como 0-N mas chave é a primeira entidade ou como 1 (mas com NULLs)
Entidade Fraca Relação com chave composta por chave parcial + chave da entidade forte
Generalização / Relação para superclasse e subclasses (sempre possível) ou só subclasses
Especialização (apenas se total) ou só superclasse (sempre possível mas com NULLs)
Agregação Interior = associação; exterior = associação c/ agregação como entidade
7
O que é o SQL?
Structured Query Language (SQL)
● Linguagem de programação declarativa desenhada para gerir
dados em bases de dados
● Materializa (aproximadamente) o modelo relacional
● Interrogações aos dados originalmente baseadas em álgebra
relacional e cálculo relacional
● Introduzida em 1970 pela IBM; ISO Standard em 1987
○ Nem todas as implementações seguem completamente o
standard (PostgreSQL é das que segue mais)
9
Structured Query Language (SQL)
● Inclui:
○ Data Control Language (DCL): controlo de acesso
○ Data Definition Language (DDL): criação e edição de esquemas de BD
○ Data Manipulation Language (DML): inserção, deleção e atualização
de dados em tabelas
○ Data Query Language (DQL): interrogação de BD
○ Transaction Control Language (TCL)
10
Como se define uma BD em SQL?
Data Definition Language (DDL)
Comando Descrição
CREATE DATABASE / TABLE / TYPE / SEQUENCE Cria uma nova base de dados, tabela, tipo de dados ou sequência.
DROP DATABASE / TABLE / TYPE / SEQUENCE Remove uma base de dados, tabela, tipo de dados, ou sequência.
ALTER DATABASE / TABLE / TYPE / SEQUENCE Edita uma base de dados, tabela, tipo de dados, ou sequência.
TRUNCATE Esvazia uma ou mais tabelas.
12
Criar e Apagar Bases de Dados
CREATE DATABASE database_name;
https://www.postgresql.org/docs/current/sql-createdatabase.html
https://www.postgresql.org/docs/current/sql-dropdatabase.html
13
Criar Tabelas
CREATE TABLE table_name (
column_name data_type [column_constraint],
…
[table_constraint],
…
);
14
Tipos de Dados: Numéricos
https://www.postgresql.org/docs/14/datatype-numeric.html
15
Exemplo de Problemas com Float
CREATE TABLE test(
x FLOAT,
y FLOAT);
x+y
------------------
2.4000000953674316
16
Tipos de Dados: Textuais
https://www.postgresql.org/docs/14/datatype-character.html
● Considerações:
○ char ocupa mais espaço de disco
○ Limites de tamanho levam a inserção de valores mais lenta, a evitar
quando não necessários para restrições de integridade
○ varchar sem limite é igual a text e um dos dois deve ser escolhido na
maioria dos casos
17
Tipos de Dados: Temporais
https://www.postgresql.org/docs/14/datatype-datetime.html
18
Tipos de Dados
● O PostgreSQL suporta várias funções para tipos textuais e temporais
● É ainda possível criar tipos de dados usando CREATE TYPE
○ Tipos enumerados (e.g. ‘male’, ‘female’)
○ Combinando atributos de tipos existentes
19
Restrições de Coluna e Tabela
● Coluna:
○ NOT NULL
○ PRIMARY KEY
○ UNIQUE
○ REFERENCES reftable [ ( refcolumn ) ]
○ CHECK expression
● Tabela:
○ PRIMARY KEY ( column_name [, ... ] )
○ UNIQUE ( column_name [, ... ] )
○ FOREIGN KEY ( column_name [, ... ] ) REFERENCES reftable [ ( refcolumn ) ]
○ CHECK expression
20
Restrições de Chave / Unicidade
CREATE TABLE department(
did INTEGER PRIMARY KEY,
name VARCHAR(80) UNIQUE NOT NULL,
budget NUMERIC(12,4)
);
21
Restrições de Chave Estrangeira
CREATE TABLE employee(
eid INTEGER PRIMARY KEY,
name VARCHAR(80) UNIQUE NOT NULL
);
22
Outras Restrições de Integridade
● NOT NULL: Necessário para obrigar a inserção de um valor
○ Por omissão todas as colunas que não fazem parte da chave primária
podem ter NULL (mesmo colunas UNIQUE, dado que NULL != NULL)
● DEFAULT: Usar quando há um valor assumido no caso de não-inserção
● CHECK: Permite verificações de domínio de dados mais avançadas, e.g.:
CHECK (LENGTH(name) > 3)
CHECK (birthdate > '1920-01-01')
CHECK (EXTRACT(YEAR FROM AGE(birthdate)) > 18)
CHECK (gender in ('Female','Male','Other'))
23
Mapeamento Modelo Relacional → SQL
● Nome da relação → nome da tabela
● Para cada atributo
○ Nome de atributo → nome de atributo
??? → tipo de dados do atributo
● Chave primária → declaração de PRIMARY KEY (coluna ou tabela)
● UNIQUE → declaração de UNIQUE (coluna ou tabela)
● NOT NULL → declaração de NOT NULL (coluna)
● FK → declaração de REFERENCES / FOREIGN KEY (coluna / tabela)
● ICs (alguns) → declarações de CHECK (apenas valores de um tuplo a inserir)
24
Exercício: Converter para SQL
Animal(name,DOB)
Pig(name,DOB,job)
name,DOB: FK(Animal.name, Animal.DOB)
Non-Pig(name,DOB,species)
name,DOB: FK(Animal.name, Animal.DOB)
species NOT NULL
Produce(name,DOB,prod_date,amount,type)
name,DOB: FK(Non-Pig.name,Non-Pig.DOB)
type NOT NULL
Merchant(SSN)
Buys(SSN,name,DOB,prod_date,date,value)
SSN: FK(Merchant)
name,DOB,prod_date: FK(Produce.name,Produce.DOB,Produce.prod_date)
Manages(name1,DOB1,SSN,name2,DOB2,prod_date)
name1,DOB1: FK(Pig)
SSN,name2,DOB2,prod_date: FK(Buys.SSN,Buys.name)
25
Exercício: Converter para SQL
RI-1: todos os pares name,DOB em Animal têm de estar em Pig ou Non-Pig mas não
em ambos
RI-2: species tem de ser ‘cow’, ‘goat’, ‘sheep’ ou ‘chicken’
RI-3: type tem de ser ‘eggs’ ou ‘milk’
RI-4: instâncias com type ‘eggs’ em Produce têm de estar associadas a pares
name,DOB que existem em Non-Pig com species ‘chicken’, e instâncias com type
‘milk’ têm de estar associadas a pares name,DOB que existem em Non-Pig com
species não ‘chicken’
RI-5: todos os quartetos SSN,name,DOB,prod_date em Buys têm de estar presentes
em Manages
26
Solução
CREATE TABLE merchant(
SSN NUMERIC(12) PRIMARY KEY);
27
Solução
CREATE TABLE nonpig(
name VARCHAR(80),
DOB DATE,
species VARCHAR(7) NOT NULL CHECK
(species IN (‘cow’,‘goat’,‘sheep’,‘chicken’)),
PRIMARY KEY(name,DOB),
FOREIGN KEY(name,DOB) REFERENCES animal);
28
Solução
CREATE TABLE buys(
SSN NUMERIC(8) REFERENCES merchant,
name VARCHAR(80),
DOB DATE,
prod_date DATE,
sell_date DATE,
value NUMERIC,
PRIMARY KEY(SSN,name,DOB,prod_date),
FOREIGN KEY(name,DOB,prod_date) REFERENCES produce);
29
Solução
IC-4: If type is ‘eggs’ in Produce then the species of Non-Pig must
be ‘chicken’, and if the type is ‘milk’ the species must not be
‘chicken’
● Não conseguimos verificar com um CHECK porque são atributos de tabelas
diferentes
○ Podíamos importar “species” em “Produce” (acrescentando-o à chave
estrangeira que já tem para “Non-Pig”) para permitir usar CHECK, mas é uma
duplicação de dados desnecessária sem ganho claro de desempenho
30
Chaves Substitutas
● Chave substituta: chave artificial (sem sentido no domínio) unária,
tipicamente de tipo integer e auto-incrementada (SERIAL)
○ Facilita joins quando a chave natural é composta e/ou de tipo mais
complexo de comparar do que integer (e.g. textual)
○ Pode poupar armazenamento se a chave natural é composta e/ou
de tipo que requer mais armazenamento do que integer SE a chave
for usada em pelo menos uma chave estrangeira
○ Custa armazenamento se a chave não é usada em chaves
estrangeiras
31
Edição de Tabelas
ALTER TABLE table_name
RENAME column_name TO new_column_name,
ADD column_name data_type,
DROP column_name,
ALTER column_name TYPE data_type;
32
Remoção de Tabelas
DROP TABLE [IF EXISTS] table_name;
33
Como se popula uma BD em SQL?
Data Manipulation Language
Comando Descrição
INSERT Popula uma tabela com valores passados como argumentos
COPY Copia dados de um ficheiro para uma tabela ou vice-versa
Atualiza valores de uma ou mais colunas numa tabela (de linhas que cumprem critérios
UPDATE
especificados)
DELETE Apaga valores de uma tabela segundo critérios especificados.
35
Inserção Atómica de Dados
INSERT INTO table_name [(column_name, …)]
VALUES
(value_list_1),
(value_list_2),
…
(value_list_n);
Exemplo:
INSERT INTO department VALUES(1, 'Finance', 1000.0),(2, 'Marketing',
2000.0);
36
Inserção de Dados de Outras Tabelas
INSERT INTO table_name [(column_name, …)]
SELECT [*|expression1, …]
FROM table1_name, …
WHERE
condition1, …;
37
Importação/Exportação de Dados
Importação: COPY … FROM
COPY table_name [(column_name [, ...])]
FROM {'filename' | PROGRAM 'command' | STDIN}
[[WITH] (option [, ...])]
[WHERE condition]
Exportação: COPY … TO
COPY {table_name [(column_name [, ...])] | (query) }
TO { 'filename' | PROGRAM 'command' | STDOUT}
[[WITH] (option [, ...])]
38
Atualização de Dados
UPDATE table_name SET
column_name = expression,
…
;
Exemplos:
UPDATE department SET budget = 3000 WHERE name = 'Marketing';
ALTER TABLE department ADD share FLOAT;
UPDATE department SET share = budget /
(SELECT SUM(budget)) FROM department;
39
Remoção de Dados
DELETE FROM table_name WHERE condition;
Exemplos:
DELETE FROM department WHERE name = 'Marketing';
DELETE FROM department WHERE share < 0.1;
40