Linguagem de Consulta Estruturada (SQL)
SQL SQL (Structured Query Language), ou Linguagem de Consulta Estruturada. Usada em Bancos de Dados Relacionais. É padronizada (SQL ANSI). ANSI (American National Standards Institute) ISO (International Standards Organization) Cada SGBD pode ter uma extensão.
SQL : Comandos DDL e DML DDL (Data Definition Language) Linguagem para Definição de Dados DML (Data Manipulation Language) Linguagem para Manipulação de Dados DDL (Estruturas) DML (Dados)
Linguagem para Definição de Dados (DDL) Comandos usados para DEFINIR e DESCREVER os dados e suas relações em um banco de dados: Criação Exclusão Alteração
DDL - Exemplos (Criação) Create database domain table... (Exclusão) Drop database domain table (Alteração) Alter domain table...
DDL - Criação CREATE DATABASE CREATE DATABASE BD01;
ALGUNS TIPOS DE DADOS Categoria Tipo de dado Descrição Caracter/String Text Permite armazenar número ilimitado de caracteres. Varchar(T) T refere-se à quantidade máxima de caracteres a serem armazenados. Tanto text, como varchar ocupam para armazenamento somente a quantidade de caracteres efetivamente utilizada. Char(T) T refere-se à quantidade máxima de caracteres a serem armazenados. Diferente de text e varchar, ocupa o espaço total de armazenamento referido em T. Numéricos Integer Número inteiro na faixa de 2 bilhões. Int2 Número inteiro na faixa de 32 mil. Int8 Número inteiro na faixa de 4 x 10 18 Numeric(P,D) Número real com precisão definida. Ex.: numeric(8,2) define um número com até 6 dígitos antes da vírgula e 2 após a vírgula. Float Número de ponto flutuante, com 15 dígitos de precisão. Float4 Número de ponto flutuante, com 6 dígitos de precisão. Temporais Date Data no formato yy-mm-dd. Time Hora no formato hh:mm:ss. Timestamp Data e hora no formato yy-mm-dd hh:mm:ss. Interval Intervalo de tempo, gerado pela subtração de 2 dados do tipo timestamp. Ex.: 5 horas e 7 dias. Lógicos Bool Dado booleano, pode ser entrado como true, t, yes, y ou 1 e também false, f, no, n ou 0. Mas armazena o dado como t ou f.
O que é um Domínio? É um apelido (aliás) para um determinado tipo de dado. Domínios SIMPLES CREATE DOMAIN ENDER AS VARCHAR (30) CREATE DOMAIN FONE AS VARCHAR (20)
Domínios COMPLEXOS CREATE DOMAIN SALARIO AS NUMERIC (15,2) DEFAULT 1500 CHECK (VALUE>0) CREATE DOMAIN DEPTO AS INT2 CHECK (VALUE BETWEEN 0 AND 6)
DDL - Criação CREATE TABLE (SEM DEFINIR A PRIMARY KEY) Fornecedor cnpj nome Fornecedor cnpj nome CREATE TABLE FORNECEDOR ( CNPJ INT NOT NULL, NOME VARCHAR(30) )
CREATE TABLE e Domínios nome Cliente endereço salario Cliente nome endereço salario CREATE TABLE CLIENTE ( NOME VARCHAR(30), ENDERECO ENDER, SALARIO SALARIO ) Domínios
CREATE TABLE e Chave Primária (PK) Funcionário Código Salario Nome Funcionário Código Nome Salario CREATE TABLE FUNCIONARIO ( CODIGO INT, NOME VARCHAR(30), SALARIO FLOAT, PRIMARY KEY(CODIGO) );
CREATE TABLE e Chave Estrangeira (FK) Nome Cliente Fone* Endereço Codigo Data_nasc ddd número Cliente Codigo Nome Endereço Data_nasc Fone Número DDD Cliente
CREATE TABLE CLIENTE ( CODIGO INT2, NOME VARCHAR(30), ENDERECO VARCHAR(30), DATA_NASC DATE, PRIMARY KEY (CODIGO) ); DICA: Crie sempre a tabela ORIGEM antes da tabela destino
CREATE TABLE FONE ( NUMERO VARCHAR(20), DDD VARCHAR(10), CLIENTE INT2 NOT NULL, PRIMARY KEY (NUMERO,DDD,CLIENTE), FOREIGN KEY(CLIENTE) REFERENCES CLIENTE(CODIGO) );
CREATE TABLE e Relacionamento 1:1 Funcionário 1 1 Gerencia Depto Funcionário Codigo Nome Salario Depto Codigo Gerente Nome
CREATE TABLE FUNCIONARIO ( CODIGO INT2, NOME VARCHAR(30), SALARIO FLOAT, PRIMARY KEY(CODIGO) );
CREATE TABLE DEPARTAMENTO ( CODIGO INT2, GERENTE INT2, NOMED VARCHAR(30), PRIMARY KEY(CODIGO), FOREIGN KEY(GERENTE) REFERENCES FUNCIONARIO(CODIGO) );
CREATE TABLE e Relacionamento 1:N Aluno N 1 estuda Curso Aluno CPF Nome Sexo Curso Curso Codigo Nome
CREATE TABLE CURSO ( CODIGO INTEGER, NOME VARCHAR(30), PRIMARY KEY(CODIGO) );
CREATE TABLE ALUNO ( CPF INT2, SEXO CHAR(1), CURSO INTEGER, NOMEC VARCHAR(30), PRIMARY KEY(CPF), FOREIGN KEY(CURSO) REFERENCES CURSO(CODIGO) );
CREATE TABLE e Relacionamento N:N Atleta N Pratica N Modalidade Atleta Código Nome Endereço Data_nasc. Pratica Atleta Modalidade Modalidade Código Nome
CREATE TABLE ATLETA ( CODIGO INTEGER, NOMEATLETA VARCHAR(30), ENDERECO VARCHAR(30), DATA_NASC DATE, PRIMARY KEY(CODIGO) ); CREATE TABLE MODALIDADE ( CODM INTEGER, NOMEMOD VARCHAR(30), PRIMARY KEY(CODM)
CREATE TABLE PRATICA ( ATLETA INTEGER, MODALIDADE INTEGER, PRIMARY KEY(ATLETA,MODALIDADE), FOREIGN KEY(ATLETA) REFERENCES ATLETA(CODIGO), FOREIGN KEY(MODALIDADE) REFERENCES MODALIDADE(CODM) );
CREATE TABLE e Chave Candidata Professor Codigo Nome Endereço RG CREATE TABLE PROFESSOR ( CODIGO INT2, NOME VARCHAR(30), RG INT2 NOT NULL, PRIMARY KEY(CODIGO), UNIQUE(RG) );
CREATE TABLE PRODUTO ( ); CREATE TABLE e Restrição de Restrição: Aceitar somente produtos cujo peso é maior que 50 CODIGO INTEGER, DESCRICAO TEXT, Produto Codigo Descricao Peso Volume PESO FLOAT CHECK (PESO > 50), VOLUME FLOAT Coluna (Check)
CREATE TABLE e Valor Default CREATE TABLE PRODUTO ( ); Caso o volume não seja informado, atribuir o valor 0 de modo automático CODIGO INTEGER, DESCRICAO TEXT, PESO FLOAT CHECK (PESO > 50), VOLUME FLOAT DEFAULT 0 Produto Codigo Descricao Peso Volume
CREATE TABLE e Restrição de Tabela (Check) Restrição: Aceitar somente produtos cujo volume é menor que o peso. CREATE TABLE PRODUTO ( CODIGO INTEGER, DESCRICAO TEXT, PESO FLOAT CHECK (PESO > 50), VOLUME FLOAT DEFAULT 0, CHECK (VOLUME < PESO) ); Produto Codigo Descricao Peso Volume
Operadores Relacionais = igual a > maior que < menor que >= maior ou igual a <= menor ou igual a!= diferente de
Crie a tabela produto de maneira que não seja possível inserir produtos cujo peso é igual ao volume CREATE TABLE PRODUTO ( ); CODIGO INTEGER, DESCRICAO TEXT, PESO FLOAT, VOLUME FLOAT CHECK (VOLUME!= PESO) Produto Codigo Descricao Peso Volume
Operadores Lógicos AND OR NOT IN BETWEEN LIKE e ou não dentro de entre como
Crie a tabela produto de maneira que seja possível inserir somente produtos cujo peso é igual a 50, 60, 70 ou 80. CREATE TABLE PRODUTO ( CODIGO INTEGER, DESCRICAO TEXT, PESO FLOAT CHECK (PESO IN (50,60,70,80)), VOLUME FLOAT ); Produto Codigo Descricao Peso Volume
Crie a tabela produto de maneira que seja possível somente inserir produtos cujo volume esteja entre 20 e 80. CREATE TABLE PRODUTO ( ); CODIGO INTEGER, DESCRICAO TEXT, PESO FLOAT, VOLUME FLOAT Produto Codigo Descricao Peso Volume CHECK (VOLUME BETWEEN 20 AND 80)
DDL - Exclusão DROP DATABASE Apaga o banco de dados atual e todos os dados que ele contêm! DROP DATABASE BD1;
DDL - Exclusão DROP DOMAIN Apaga um domínio do banco de dados DROP DOMAIN SALARIO; A exclusão falha se houverem colunas usando o domínio. Portanto, deve-se alterar o domínio ou excluir as colunas primeiro!
DDL - Exclusão DROP TABLE Apaga tabelas Fornecedor cnpj nome DROP TABLE FORNECEDOR;
Exemplo Aluno RA Nome Sexo Curso Curso Codigo Nome DROP TABLE ALUNO; DROP TABLE CURSO; DICA: Apague sempre a tabela DESTINO antes da tabela origem
Exemplo Atleta Código Nome Endereço Data_nasc. Pratica Atleta Modalidade Modalidade Código Nome DROP TABLE PRATICA; DROP TABLE ATLETA; DROP TABLE MODALIDADE;
Exemplo Funcionário Codigo Nome Salario Departamento Codigo Gerente Nome DROP TABLE DEPARTAMENTO; DROP TABLE FUNCIONARIO;
DDL - Alteração ALTER DOMAIN Altera a definição de um domínio, afetando as colunas nele baseadas ALTER DOMAIN SALARIO TO NOVO_SALARIO; ALTER DOMAIN DEPTO TO DEPTO_1 TYPE INTEGER;
DDL - Alteração ALTER TABLE Adiciona ou elimina colunas a uma tabela. Adiciona ou elimina restrições em uma tabela Chave Primária (PK) Chave Estrangeira (FK) Chave Candidata (UNIQUE) Cláusula Verificação (CHECK)
ALTER TABLE p/ Adicionar Colunas Fornecedor nome descrição cnpj ALTER TABLE FORNECEDOR ADD COLUMN DESCRICAO TEXT;
create domain lo as oid; CREATE TABLE imagem ( nome varchar(30) NOT NULL, figura lo, PRIMARY KEY (nome) ) INSERT INTO cliente VALUES ('figura1.jpg', lo_import ('d:/meus documentos/minhas imagens/ale/imagem5.jpg')); SELECT lo_export(figura, 'd:/temp/figura1.jpg') FROM cliente WHERE imagem = 'figura1.jpg';
ALTER TABLE p/ eliminar Colunas Fornecedor nome cnpj ALTER TABLE FORNECEDOR DROP COLUMN DESCRICAO;
ALTER TABLE p/ adicionar restrição de Chave Primária (PK) Fornecedor nome cnpj ALTER TABLE FORNECEDOR ADD CONSTRAINT PK_CNPJ PRIMARY KEY(CNPJ);
ALTER TABLE p/ eliminar restrição de Chave Primária (PK) Fornecedor nome cnpj ALTER TABLE FORNECEDOR DROP CONSTRAINT PK_CNPJ;
Exercício: Escreva o comando para criar a tabela cidade conforme o modelo abaixo. Escreva o comando para alterar a tabela criada de maneira que a coluna Código seja chave primária. Cidade Nome Codigo
CREATE TABLE CIDADE ( CODIGO INT2, NOME VARCHAR(30) ); ALTER TABLE CIDADE ADD CONSTRAINT PK_CODIGO PRIMARY KEY(CODIGO);
ALTER TABLE p/ adicionar restrição de Chave Estrangeira (FK) Fornecedor N 1 pertence Cidade nome cnpj nome codigo ALTER TABLE FORNECEDOR ADD COLUMN CIDADE INT2 NOT NULL; ALTER TABLE FORNECEDOR ADD CONSTRAINT FK_CODIGO FOREIGN KEY(CIDADE) REFERENCES CIDADE(CODIGO);
ALTER TABLE p/ eliminar restrição de Chave Estrangeira (FK) Fornecedor Cnpj Nome Cidade ESTRANG Cidade Codigo Nome ALTER TABLE FORNECEDOR DROP CONSTRAINT FK_CODIGO;
ALTER TABLE p/ adicionar restrição de Chave Candidata Professor código nome rg endereço ALTER TABLE PROFESSOR ADD CONSTRAINT CANDIDATA UNIQUE(RG);
ALTER TABLE p/ eliminar restrição de Chave Candidata Professor código nome rg endereço ALTER TABLE PROFESSOR DROP CONSTRAINT CANDIDATA;
ALTER TABLE p/ adicionar restrição (CHECK) Produto código descrição volume peso Restrição: VOLUME < PESO ALTER TABLE PRODUTO ADD CONSTRAINT TESTE CHECK (VOLUME < PESO);
ALTER TABLE p/ eliminar restrição (CHECK) Produto código descrição volume peso ALTER TABLE PRODUTO DROP CONSTRAINT TESTE;
ALTER TABLE p/ alterar nomes de colunas Fornecedor cnpj nome ALTER TABLE FORNECEDOR RENAME COLUMN NOME TO RAZAO_SOCIAL;
ALTER TABLE p/ alterar tipos de dados CREATE TABLE FORNECEDOR ( NOME CHAR(30), CNPJ INT NOT NULL ); ALTER TABLE FORNECEDOR ALTER COLUMN NOME TYPE VARCHAR(30);
Restrições de dados: NOT NULL torna a entrada de valores obrigatória na coluna. CHECK verifica em cada operação de inclusão e alteração se a condição especificada para o campo está sendo cumprida. DEFAULT especifica um valor padrão a ser atribuído ao campo quando nenhuma entrada for especificada. UNIQUE não permite que valores duplicados apareçam na coluna. Todos os campos designados como chave candidata (entrada não repetida), devem ser especificados como UNIQUE. PRIMARY KEY especifica uma chave primária, ou seja, identifica unicamente cada linha.
REFERENCES especifica uma chave estrangeira, ou seja, o valor do campo é baseado nos valores de chave primária de outra tabela. Quando estamos declarando um campo como chave estrangeira em uma tabela, podemos especificar quais ações devem ser tomadas no caso de exclusão ou alteração da chave estrangeira: ON DELETE ON UPDATE SET NULL CASCADE SET DEFAULT Quando a tupla Quando a tupla Quando a tupla correspondente a FK é correspondente a FK é correspondente a FK é excluída seu valor é excluído todas as tuplas excluída seu valor é marcado como nulo. que a tinham como FK marcado com o valor Quando a tupla correspondente a FK é alterada seu valor é marcado como nulo. são excluídas também. Quando a tupla correspondente a FK é alterada todas as tuplas que a tinham como FK são alteradas também. default especificado. Quando a tupla correspondente a FK é alterada seu valor é marcado com o valor default especificado. A opção NO ACTION é o default do Postgresql, e especifica que não podem ser feitas alterações e exclusões em campos que são referenciados como chave estrangeira.
Ex. de restrições CREATE TABLE vendedor( cod_vendedor INT2 PRIMARY KEY, nome varchar(30) NOT NULL, endereco varchar(80), cep char(8), datanascimento date, telefone varchar(18), funcao varchar(50), datacontratacao date, cod_departamento INT2 REFERENCES departamento (coddepto) ON UPDATE CASCADE ON DELETE SET NULL, cod_cidade INT2 DEFAULT 1 REFERENCES cidade (codcidade) ON UPDATE SET NULL ON DELETE SET DEFAULT);
MySQL x PostgreSQL MySQL ou PostgreSQL, qual usar? Ambos são muito bons e não fazem feio diante das alternativas pagas. Além disso, possuem recursos e vantagens em comum, o que significa que, para a maioria das aplicações, ambos podem ser usados. Na verdade, o correto não é tentar descobrir qual é o melhor, mas em que situação um ou outro deve ser utilizado.
O PostgreSQL é otimizado para aplicações complexas, isto é, que envolvem grandes volumes de dados ou que tratam de informações críticas. Assim, para um sistema de comércio eletrônico de porte médio/alto, por exemplo, o PostGreSQL é mais interessante, já que esse SGBD é capaz de lidar de maneira satisfatória com o volume de dados gerado pelas operações de consulta e venda.
O MySQL, por sua vez, é focado na agilidade. Assim, se sua aplicação necessita de retornos rápidos e não envolve operações complexas, o MySQL é a opção mais adequada, pois é otimizado para proporcionar processamento rápido dos dados e tempo curto de resposta sem exigir muito do hardware. Se você precisa, por exemplo, de um banco de dados para armazenar o conteúdo do seu site, de seu fórum ou necessita manter um cadastro de usuários de um portal, o MySQL "serve como uma luva", pois tais aplicações não necessitam dos recursos avançados que o PostgreSQL oferece.
Para escolher um destes dois SGBD, procure entender bem quais recursos sua aplicação precisa. Tente estimar o volume de dados, avalie o hardware disponível, certifiquese das funcionalidades necessárias e, posteriormente, procure por informações mais detalhadas do MySQL e do PostGreSQL. Se sua aplicação for simples - principalmente se for algo ligado à internet -, não é preciso pensar muito: o MySQL é uma escolha satisfatória, pois é facilmente encontrado em serviços de hospedagem.