GBC043 - Sistemas de Banco de Dados
SQL/DDL e Implementação no PostgreSQL
Ilmério Reis da Silva ilmerio arroba ufu.br
www.facom.ufu.br/~ilmerio/GBC043
MS Teams: SBD.GBC043.2020/1
Página 2
SBD
Visão Panorâmica do Programa Teórico
• Introdução a SBD, Modelos de Dados e Projeto de BD • Manipulação de Dados
• PL/pgSQL, Transações e Controle de Concorrência
Página 3
SBD
Projeto e Implementação de SBD
• Linguagem SQL/DDL– 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
Linguagem SQL/DML
– Comandos de inserção de tuplas em tabelas
– Comandos de alteração e supressão de tuplas
– Comandos de consulta (simples e complexos)
– Definição de visões
Álgebra Relacional Cálculo Relacional
UFU/FACOM Página 4
SQL - Definição
Def. A SQL(Structured Query Language) é uma Linguagem de Consulta Estruturada declarativa para acesso a
sistemas de banco de dados relacionais.
OBS: como linguagem declarativa descreve o problema ao invés da solução, especificando o que deve ser feito e não como.
UFU/FACOM Página 5
SQL – Breve Histórico
• 1970s → SEQUEL/SYSTEM R - IBM
• SQL-86 → Padrão ANSI (SQL1)
• SQL–92 → introdução de chave estrangeira (SQL2) • SQL:1999 → gatilhos; características
objeto-relacional(tipo LOB-Large Object); consultas recursivas, etc. (SQL3)
• SQL:2003 → mais recursos para tipos (OO); SQL/XML
• SQL:2006 → XQUERY
• SQL:2008: mais recursos para orientação a objetos
• SQL:2011: bd temporal (system versioning)
UFU/FACOM Página 6
UFU/FACOM Página 7
SQL - Classes de Comandos
Duas classes principais de comandos SQL:
DDL: Data definition language
Comandos para a definição de dados
DML: Data manipulation language
Comandos para a manipulação de dados
DML interativa – interface direta com o SGBD
UFU/FACOM Página 8
SQL-DDL
Def SQL/DDL (Data Definition Language) permite ao usuário
definir tabelas e elementos associados.
OBS: A SQL/DDL se caracteriza por poucos comandos
básicos, embora implementações comerciais tenham várias extensões.
UFU/FACOM Página 9
SQL/ DDL Conceitos associados
• Banco de dados e Catálogo • Esquema • Tabela • Linha • Coluna • Índice
UFU/FACOM Página 10
SQL/ DDL Comandos
CREATE – Cria uma definição
CREATE TABLE tab ...
ALTER – Altera uma definição
ALTER TABLE tab ADD ...
DROP – Exclui uma definição
UFU/FACOM Página 11
SQL/ DDL Abrangência
• Definição de tabelas• Definição de restrições de integridade • Definição de índices
• Definição de privilégios de acesso • Definição de visões
UFU/FACOM Página 12
O SGBD PostgreSQL
PostgreSQLUFU/FACOM Página 13
PostgreSQL - Breve Histórico
• 1986-1993: Postgres / University of California at Berkeley • 1995: Postgres95 (Open source) / PostgreSQL 6;
• 2005: PostgreSQL 8 suporte nativo para Windows • 2010: PostgreSQL 9 replicação nativa
• 2017: PostgreSQL 10 melhorias no paralelismo
• 2018: PostgreSQL 11 melhorias em particionamento e transações embutidas em procedimentos armazenados • 2019: PostgreSQL 12 melhorias de desempenho
UFU/FACOM Página 14
PostgreSQL - Principais Características
• implementa padrão SQL • herança • tipos de dados • funções • restrições (constraints) • gatilhos (triggers) • regras(rules) • integridade transacional
UFU/FACOM Página 15
PostgreSQL – Criação de Banco de Dados
CREATE DATABASE nome[ [ WITH ] [ OWNER [=] dono_bd ] [ TEMPLATE [=] modelo ]
[ ENCODING [=] codificação ] [ TABLESPACE [=] tablespace ] ]
[ CONNECTION LIMIT [=] limite_con ] ] Exemplo: CREATE DATABASE sbdX
WITH OWNER bccX;
UFU/FACOM Página 16
PostgreSql - Sintaxe do manual/slides
Sintaxe completa: consultar manual PostgreSQL
http://www.postgresql.org/docs/8.4/static/sql -createtable.html Convenção UPPERCASE (maiúsculo) Palavra-chave SQL. lowercase
(minúsculo) Identificadores ou constantes SQL informadas pelo usuário
itálico Nome de um bloco de sintaxe. Essa convenção é usada para indicar blocos longos de sintaxe que podem ser usados em mais de um local.
| (barra vertical) Separa elementos opcionais da sintaxe dentro de colchetes ou chaves. Somente um dos itens pode ser escolhido.
[ ] (colchetes) Item de sintaxe opcional. Os colchetes não fazem parte do comando.
{ } (chaves) Item da sintaxe obrigatório. As chaves não fazem parte do comando.
[,...] O item precedente pode ser repetido N vezes. A separação entre os itens é feita por uma vírgula
UFU/FACOM Página 17
PostgreSQL – Criação de Esquemas
CREATE SCHEMA schemaname [ AUTHORIZATION username ]
Exemplo:
UFU/FACOM Página 18
PostgreSQL – Criação de Tabela
CREATE TABLE tabela (
{coluna tipo [restricoes coluna] | restricoes tabela} [, ...]
)
UFU/FACOM Página 19
PostgreSQL – Exemplo de Tabela
CREATE TABLE tabela ({coluna tipo [restricoes coluna] | restricoes tabela} [, ...]) [ INHERITS (tabela pai [, ...])] Exemplos de identificadores de tabela:
company.employee
public.employee employee
UFU/FACOM Página 20
PostgreSQL – regras para identificadores
Iniciam com letras (a-z) ou underscore (_)
Caracteres subsequentes: letras, dígitos (0-9), _
Identificadores e palavras-chave não são
case-sensite
UPDATE MY_TABLE SET A = 5; uPDaTE my_TabLE SeT a = 5;
Convenção adotada
Palavras-chave em maiúscula Identificadores em minúsculo
UPDATE my_table SET a = 5;
Identificadores com aspas
Aceitam quaisquer caracteresUFU/FACOM Página 21
PostgreSQL–regras para identificadores cont.
Ao colocar aspas em um identificador ele torna-secase-sensitive
Identificadores sem aspas são sempre transformados em
minúsculo (embora o padrão SQL defina que se transforme em maiúscula)
Se você criar um esquema ou tabela usando a interface
gráfica do pgAdmin e, caso o identificador deste objeto não seja composto por letras minúsculas, o objeto será identificado somente por meio de aspas.
Faça o teste, criando esquemas e tabelas por meio da
interface gráfica e utilizando letras maiúsculas.
Mais informações e referência:
UFU/FACOM Página 22
PostgreSQL – Exemplo de Tipos
CREATE TABLE tabela ({coluna tipo [restricoes coluna] | restricoes tabela} [, ...]) [ INHERITS (tabela pai [, ...])] Exemplos de coluna tipo:
nome VARCHAR(40)
sexo CHAR
salario DECIMAL(10, 2)
UFU/FACOM Página 23
PostgreSQL – Outros exemplos de tipos
CREATE TABLE tabela ({coluna tipo [restricoes coluna] | restricoes tabela} [, ...]) [ INHERITS (tabela pai [, ...])] Outros tipos:
INT; SMALLINT; REAL; DATE; TIME; TIMESTAMP;
BOOLEAN, GEOMETRIC(POINT, LINE, etc), NETWORK ADDRES, BIT, XML, ARRAYS, COMPOSITE, OID, etc.
VER DOCUMENTAÇÃO DO POSTGRES: www.postgres.org
UFU/FACOM Página 24
UFU/FACOM Página 25
UFU/FACOM Página 26
UFU/FACOM Página 27
UFU/FACOM Página 28
UFU/FACOM Página 29
PostgreSQL – Outros Tipos
Existem outros tipos de dados além dos
apresentados anteriormente. Consulte o manual do
PostgreSQL:
UFU/FACOM Página 30
PostgreSQL-Exemplo de restrições de coluna
CREATE TABLE tabela ({coluna tipo [restricoes coluna] |restricoes tabela} [, ...]) [ INHERITS (tabela pai [, ...])] [CONSTRAINT restrição]
{NOT NULL | NULL | UNIQUE | PRIMARY KEY
| CHECK (expressão) | REFERENCES tabela [ ( coluna ) ] [ON DELETE ação ] [ ON UPDATE ação ]}
[DEFERRABLE | NOT DEFERRABLE ]
[INITIALLY DEFERRED | INITIALLY IMMEDIATE ] Exemplos de restricoes coluna:
UFU/FACOM Página 31
UFU/FACOM Página 32
PostgreSQL – CREATE DOMAIN
CREATE DOMAIN name [ AS ] data_type [ DEFAULT expression ]
[ constraint [ ... ] ] onde constraint é:
[ CONSTRAINT constraint_name ]
UFU/FACOM Página 33
PostgreSQL–CREATE DOMAIN- Exemplos
CREATE DOMAIN sexo AS char(1) DEFAULT 'M'
NOT NULL
CHECK ( VALUE IN ('M', 'F'));
CREATE DOMAIN data_evento AS date CONSTRAINT valida_data
CHECK ( VALUE > '01/01/1900' AND VALUE > '01/01/2099'); Obs.: podemos então definir os tipos sexo ou data_evento no
UFU/FACOM Página 34
PostgreSQL – Exemplo de restrição de tabela
CREATE TABLE tabela ({coluna tipo [restricoes coluna] |restricoes tabela} [, ...]) [ INHERITS (tabela pai [, ...])] [CONSTRAINT restrição]
{UNIQUE(coluna [,...]) | PRIMARY KEY(coluna [,...]) | CHECK (expressão)
| FOREIGN KEY REFERENCES tabela [ ( coluna, [,...] ) ] [ON DELETE ação ] [ ON UPDATE ação ]}
[DEFERRABLE | NOT DEFERRABLE ]
[INITIALLY DEFERRED | INITIALLY IMMEDIATE ] Exemplo restricoes tabela: PRIMARY KEY(ssn)
UFU/FACOM Página 35
PostgreSQL – Exemplo de criação de tabela
CREATE TABLE emp (ssn CHAR(9) NOT NULL, name VARCHAR(40),
sex CHAR CHECK (sex IN (’M’, ’F’)), salary DECIMAL(10,2),
mngrsalary DECIMAL(10,2), CHECK (mngrsalary > salary), PRIMARY KEY (ssn));
UFU/FACOM Página 36
PostgreSQL – CREATE TABLE
Sintaxe completa: consultar manual PostgreSQL
UFU/FACOM Página 37
PostgreSQL – Company Database - employee
CREATE TABLE employee (fname VARCHAR (15) NOT NULL, minit CHAR, lname VARCHAR (15) NOT NULL,
ssn CHAR(9) NOT NULL, bdate DATE,
address VARCHAR(30), sex CHAR CHECK (sex IN (’M’, ’F’)), salary DECIMAL(10,2), superssn CHAR(9),
dno INT NOT NULL, PRIMARY KEY (ssn));
CREATE TABLE department (dname varchar(15) not null, dnumber int not null, mgrssn char(9),
mgrstartdate date,
UFU/FACOM Página 38
PostgreSQL – Company Database - outras
CREATE TABLE dependent (essn char (9) not null,
dependent_name varchar (30) not null, sex char, bdate date,
relationship varchar(15), PRIMARY KEY (essn, dependent_name) );
CREATE TABLE dept_locations (dnumber int not null, dlocation varchar(15)); CREATE TABLE project (pname varchar(20),
pnumber int not null, plocation varchar(15), dnum int,
PRIMARY KEY (pnumber))
CREATE TABLE works_on (essn char(9) not null, pno int not null, hours decimal(4,2));
UFU/FACOM Página 39
PostgreSQL – DROP TABLE
DROP TABLE – Exclui uma tabela existente de um banco de dados. Não pode ser excluída a tabela que possui alguma referência. Neste caso, deve-se primeiro excluir a tabela que possui algum campo que a está
referenciando e depois excluir a tabela inicial. DROP TABLE <nome da tabela>
Exemplo:
/* Apaga tabela Departamento */
UFU/FACOM Página 40
PostgreSQL – ALTER TABLE
ALTER TABLE – Altera as definições de campos e de
restrições.
ALTER TABLE <nome da tabela>
ADD <definição de Coluna>
ADD <Restrição de integridade> ALTER <definição de Coluna>
ALTER <definição de Coluna> DEFAULT <default-value>
ALTER <definição de Coluna> [ NOT ] NULL DROP <definição de Coluna>
DROP CONSTRAINT <nome da restrição>
RENAME <novo nome>
RENAME <Atributo> TO <novo atributo> Onde <definição de coluna> pode ser:
<Nome Atributo> <Tipo de Dado> [NULL ] | [ DEFAULT default-value ]
UFU/FACOM Página 41
PostgreSQL–Company Database – Alter table
ALTER TABLE employee
ADD CONSTRAINT emp_superssn FOREIGN KEY (superssn) REFERENCES employee(ssn) DEFERRABLE
ALTER TABLE employee
ADD CONSTRAINT emp_dno FOREIGN KEY (dno) REFERENCES department(dnumber) DEFERRABLE; ALTER TABLE department
ADD CONSTRAINT dept_mgrssn FOREIGN KEY (mgrssn) REFERENCES employee(ssn) DEFERRABLE;
ALTER TABLE dependent
ADD CONSTRAINT depe_essn FOREIGN KEY(essn) REFERENCES employee(ssn);
UFU/FACOM Página 42
PostgreSQL–Company Database–Alter table2
ALTER TABLE dept_locations
ADD CONSTRAINT loc_dnumber
FOREIGN KEY (dnumber) REFERENCES department(dnumber) ALTER TABLE project
ADD CONSTRAINT proj_dnum
FOREIGN KEY (dnum) REFERENCES department(dnumber) ALTER TABLE works_on
ADD CONSTRAINT w_essn
FOREIGN KEY (essn) REFERENCES employee(ssn), ALTER TABLE works_on
ADD CONSTRAINT w_pno
UFU/FACOM Página 43
PostgreSQL – Objetivos da Criação de Índices OBJETIVOS:
Restrições de integridade: chaves
Desempenho: atributos frequentemente usados em comparações da cláusula WHERE)
CREATE [UNIQUE] INDEX nome_do_indice ON tabela
[ USING metodo_de_acesso ]
( coluna [ nome_operador ] [, ...] ) [ WHERE predicado ]
UFU/FACOM Página 44
PostgreSQL – sintaxe de criação de índices
CREATE [UNIQUE] INDEX nome_do_indice ON tabela
[USING metodo_de_acesso ] (coluna [nome_operador] [, ...] ) [WHERE predicado ]
• metodo_de_acesso: BTREE; RTREE; HASH; GIST;
BTREE: para operadores <,<=,=,>=,>
RTREE: para operadores espaciais, por exemplo, left of
HASH: para operador de igualdade (=)
GIST: operadores genéricos entre classes
• nome_operador: operador usado na comparação, por exemplo, valor
absoluto em BTREE
UFU/FACOM Página 45
PostgreSQL – exemplos de criação de índices
EXEMPLOS:CREATE INDEX ind_ename
ON employee (fname, minit, lname) CREATE UNIQUE INDEX ind_pname
ON project (pname)
OBS: antes de implementar um BD em nosso SGBD, vamos discutir alguns detalhes do servidor
PostgreSQL
UFU/FACOM Página 46
PostgreSQL - Arquitetura Cliente/Servidor
• Servidor - processo postmaster
acessa arquivos aceita conexões
cria canal direto cliente/servidor
• Cliente
ferramente textual, por exemplo, psql
aplicação gráfica, por exemplo, pgadmin
servidor web, por exemplo, apache rodando phpadmin
UFU/FACOM Página 47
PostgreSQL – Criando o Ambiente no
Servidor
• Superusuário, geralmente o postgres • Criando um Cluster de BD:
[postgres]$ initdb -D <diretório>
• Configurando:
postgresql.conf : geral, como número de conexões pg_hba.conf : métodos de autenticação de conexões pg_ident.conf : mapeamento de ids de usuários do SO
• Colocando o SGBD, que gerencia um Cluster de BD, no ar [postgres]$ pg_ctl start -l <arquivo_log> -D
<diretório>
UFU/FACOM Página 48
PostgreSQL – Criando um usuário
Criando um usuárioCREATE USER nome [ [ WITH ] opções [ ... ] ] Conexão via psql:
[postgres]$ psql template1 Exemplo:
template1 => CREATE USER uuuuuuuu
template1 => PASSWORD ‘pwpwpwpw’;
UFU/FACOM Página 49
PostgreSQL – Criando um banco de dados
Exemplo de um banco de dados criado para um usuário:template1 => CREATE DATABASE dbdbdbdb template1 => OWNER uuuuuuuu;
UFU/FACOM Página 50
PostgreSQL – Controle de acesso - Grant
GRANT lista_privilegiosON tipo_objeto lista_objetos TO lista_usuarios
Exemplo:
GRANT SELECT, DELETE ON employee
UFU/FACOM Página 51
PostgreSQL – Concedendo Privilégios
Privilégios de acordo com o objeto:• TABLE: { { SELECT | INSERT | UPDATE | DELETE | RULE | REFERENCES | TRIGGER } [,...] | ALL
[PRIVILEGES] }
• DATABASE: { { CREATE | TEMPORARY | TEMP } [,...] |
ALL [ PRIVILEGES] }
• FUNCTION: { EXECUTE | ALL [PRIVILEGES] } • LANGUAGE: { USAGE | ALL [ PRIVILEGES ] }
• SCHEMA: {{CREATE | USAGE} [,...] | ALL [PRIVILEGES] }
UFU/FACOM Página 52
Bibliografia/Exercícios
• Ver roteiros de aulas de laboratório
• [EN] Capítulo 4, 5
• [RG] Capítulo 5
• [SK] Capítulo 4, 5 e 6
UFU/FACOM Página 53