Linguagem SQL Sub-linguagem DDL A SQL - Structured Query Language, foi desenvolvido pela IBM em meados dos anos 70 como uma linguagem de manipulação de dados (DML - Data Manipulation Language) para suas primeiras tentativas de desenvolvimento de bancos de dados relacionais. Sua vantagem sobre modelos de dados anteriores é que as operações realizadas sobre os dados são especificadas numa linguagem não procedural e conjuntos de dados são manipulados com um único comando. Isto faz com que os programadores não tenham de navegar por uma estrutura complexa de banco de dados, reduzindo a quantidade de código necessário para acessar os dados. SQL tornou-se padrão depois de 1986, quando o American National Standards Institute (ANSI), definiu a SQL como linguagem padrão para os bancos de dados relacionais. Desde então, o SQL já sofreu diversas atualizações oficiais. O novo padrão SQL chama-se SQL3, nesta versão a mais importante é a adição de características de orientação a objetos na linguagem. . Atualmente este padrão é utilizado para o acesso a diversos bancos de dados relacionais, tais como Oracle, DB2, SQL Server, Sybase, Mysql, Postgresql, Interbase, Firebird etc. Os comandos da SQL podem ser agrupados em três categorias: ● ● ● ·DML – Data Manipulation Language ·DDL – Data Definition Language ·DCL – Data Control Language A DDL da SQL é composta de um conjunto de comandos que permite definir, alterar e excluir a estrutura de uma base de dados, para ser manipulada por meio de comandos da sublinguagem DML da SQL. 1 - CREATE DATABASE Sintaxe básica: CREATE DATABASE nome_da_base_dados Exemplos: CREATE DATABASE DeptoPessoal Para alguns SGBD é necessário informar, no momento da criação, o usuário e a sua respectiva senha CREATE DATABASE DeptoPessoal user “sidney” password “xxxx” 2 - CREATE TABLE Este comando cria uma nova tabela em um banco de dados. Sintaxe: CREATE TABLE nome_da_tabela ( Coluna1 <tipo_dado>, Coluna2 <tipo_dado>, ... coluna <tipo_dado> n Restrição1 Restrição2 ... Restriçãon ) • • • • • • • • Cada coluna é a definição de um campo da tabela associado a um tipo de dado n Exemplo: Nome varchar(50) Idade int ou idade integer (depende do SGBD) Os tipos de dados dependem o SGBD em questão, todos empregam o padrão SQL-ANSI, entretanto cada qual possui sua particularidade. Cada Restriçãon é uma restrição para um campo definido anteriormente. Qualquer campo pode ser declarado como NOT NULL. A chave primaria deve ser declarada como NOT NULL. Pode-se empregar o termo UNIQUE para identificar que o valor do campo é único. Uma tabela que faz referência a outra, por meio de uma chave estrangeira, deve ser criada antes de fazer a referência Notação para restrição o Caso 1: Descrição informal da restrição: Exemplo genericos: Primary Key (coluna , coluna ,..., coluna ), i j k Foreign key (coluna ) References nome_tabela1(coluna ) on delete [set n t null | cascade | no action] ) Unique(campon ) o Caso 2: Descrição formal da restrição: Exemplo genéricos: Constraint Pk_nome Primary Key (coluna , coluna ,..., coluna ), i j k Constraint Fk_nome Foreign key (coluna ) References n nome_tabela1(coluna ) on delete [set null | cascade | no action] ) t Constraint UQ_campo Unique(campon ) REFERÊNCIA DE TABELAS A Referência da chave estrangeira – a referência na definição da chave estrangeira determina o que fazer com quando um elemento da outra tabela for deletado. Isto é feito por meio da palavra chave ON DELETE que determina o que deve ser feito com a tupla (linha) desta tabela, quando o elemento refenciado por foreign key for deletado. Casos possíveis: NO ACTION – não permite a exclusão da linha CASCADE – apaga a todas as linhas que possuírem o campo referenciado SET NULL aponta para nulo os campos que possuem a referencia Exemplos: CREATE TABLE funcionario ( Cod_fun integer not null PRIMARY KEY, Nome_fun char(30), Sexo_fun varchar(1), Cod_dep varchar(2), Cpf decimal(13,0) not null UNIQUE, FOREIGN KEY (cod_dep) References departamento(cod_dep) on delete SET NULL, ) CREATE TABLE funcionario ( Cod_fun integer not null, Nome_fun char(30), Sexo_fun varchar(1), Cod_dep varchar(2), Cpf decimal(13,0) not null, PRIMARY KEY (cod_fun), FOREIGN KEY (cod_dep) References departamento(cod_dep) on delete CASCADE , UNIQUE (cpf) ) CREATE TABLE funcionario ( Cod_fun integer not null, Nome_fun char(30), Sexo_fun varchar(1), Cod_dep varchar(2), Cpf decimal(13,0) not null, CONSTRAINT PK_fun PRIMARY KEY (cod_fun), CONSTRAINT FK_depto FOREIGN KEY (cod_dep) References departamento(cod_dep) on delete NO ACTION, CONSTRAINT UQ_CPF UNIQUE(cpf) ) É possível determinar valores por omissão, default , na criação de uma tabela. CREATE TABLE funcionario ( Cod_fun integer not null, Nome_fun char(30), Sexo_fun varchar(1) default ‘M’, cod_dep varchar(2), admissao date default today, PRIMARY KEY (cod_fun), FOREIGN KEY (cod_dep) References departamento(cod_dep) on delete no action ) Obs: A data atual, obtida do S.O., para o valor de um campo do tipo date depende do SGBD podendo ser now, today, sysdate etc RESTRIÇÕES PARA ATRIBUTOS Por meio do comando check é possível criar uma restrição para uma linha da tabela, nem todo SGBD aceita efetuar uma restrição logo após a definição do campo, neste caso é necessário se criar uma restrição ao final da definição da tabela. Exemplos: Não funciona no postgres CREATE TABLE funcionario ( Cod_fun integer not null, Nome_fun char(30), Salario decimal(10,2) check salario > 0 , Estado_civil char(10) check value in (‘casado’,’solteiro’,’divorciado’) … PRIMARY KEY (cod_fun) ) CREATE TABLE funcionario ( Cod_fun integer not null, Nome_fun char(30), Salario decimal(10,2), Estado_civil char(10), … CONSTRAINT Tipo_estado_civil check Estado_civil ( value in (‘casado’,’solteiro’,’divorciado’) ), CONSTRAINT Tipo_salario check salario > 0 , CONSTRAINT PK_func PRIMARY KEY (cod_fun) ) 3 - CREATE DOMAIN Permite a criação de domínios específicos a serem usados na definição de colunas da tabela Sintaxe: CREATE DOMAIN nome_dominio AS Tipo_de_dado [Default valor] [NOT NULL] [CHECK (CONDIÇÃO)] Algumas situações de uso da cláusula condição: • • Value [not] between valor1 and valor2 Value [not] IN (valor , valor , valor , …valor ) 1 2 3 n Exemplo: CREATE DOMAIN tipo_sexo AS varchar(1) CHECK (VALUE IN ('M','F')) 4 - CREATE INDEX Permite criar índices par acesso a informações. O interbase já cria automaticamente índices para manter as restrições das chaves primarias e estrangeiras. Porém, quando necessitamos fazer consultas a dados por outros campos por intermédio de Group By e Order by com uma certa freqüência devemos criar índices para obtermos um acesso mais rápido. Sintaxe: CREATE [unique] [asc | desc] index nome_indice on nome_tabela[coluna , coluna , i k …] O índice pode ser único ou ou não assim como pode ser ascendente ou descendente Exemplo: CREATE desc index nome_fun_idx on funcionario[nome_fun , salario] i 5 - ALTER TABLE Este comando permite alterar a estrutura de uma tabela. 5.1 Para adicionar e excluir um campo da tabela. Sintaxe: Inclusão ALTER TABLE nome_tabela nome_coluna tipo_dado Exclusão ADD ALTER TABLE nome_tabela nome_coluna OBS: É possível adicionar e remover mais de uma coluna em um único comando Ex: ALTER TABLE funcionario DROP comissao ALTER TABLE funcionario ADD nascimento date, comissão decimal(10,2) 5.2 Para modificar o tipo de dado de um determinado campo. Sintaxe: ALTER TABLE nome_tabela ALTER COLUMN nome_coluna TYPE tipo_dado DROP Ex: ALTER TABLE funcionario ALTER COLUMN comissao TYPE varchar(50) 5.3 Para renomear o nome de um campo. Sintaxe: ALTER TABLE nome_tabela RENAME nome_coluna TO novo_nome_coluna Ex: ALTER TABLE funcionario RENAME nome_func TO nome_funcionario Exemplo: CREATE DATABASE XPTO CREATE TABLE engenheiro( matr INTEGER NOT NULL PRIMARY KEY, crea INTEGER NOT NULL UNIQUE, nome VARCHAR(50)); CREATE TABLE gerente( mat INTEGER NOT NULL PRIMARY KEY, nome VARCHAR(50) comissao DECIMAL(10,2)); CREATE TABLE cliente( codigo INTEGER NOT NULL PRIMARY KEY, nome VARCHAR(50) not null, endereco VARCHAR(40)); CREATE TABLE projeto( codigo INTEGER NOT NULL PRIMARY KEY, nome VARCHAR(50), valor DECIMAL(15,2), matr INTEGER NOT NULL, mat INTEGER NOT NULL, codigo_cli INTEGER NOT NULL, FOREIGN KEY (matr) REFERENCES engenheiro (matr), FOREIGN KEY (mat) REFERENCES gerente (mat), FOREIGN KEY (codigo_cli) REFERENCES cliente (codigo)); CREATE TABLE realiza( matr INTEGER, codigo INTEGER, FOREIGN KEY (matr) REFERENCES engenheiro (matr), FOREIGN KEY (codigo) REFERENCES projeto (codigo), PRIMARY KEY (matr,codigo)); ALTER TABLE cliente ADD telefone char(10); ALTER TABLE funcionario DROP comissao 6 - DROP DATABASE Sintaxe: DROP DATABASE nome_da_base_dados Exemplo: DROP DATABASE DeptoPessoal 7 - DROP TABLE Sintaxe: DROP TABLE nome_tabela Exemplo: DROP TABLE funcionario 8 - DROP INDEX Sintaxe: DROP INDEX nome_do_index Exemplo: DROP INDEX nome_fun_idx