Pesquisar no Programero

quinta-feira, 21 de junho de 2012

O que devemos conhecer sobre SQL/Oracle Parte 5: Restringindo e ordenando dados

Limitando registros recuperados por uma consulta

Na grande maioria dos casos apenas listar as colunas desejadas de certa tabela não é o suficiente, é necessário restringir o resultado de acordo com regras para que esse resultado possa ter algum significado, isso é alcançado pela cláusula WHERE.
O WHERE não é obrigatório, mas quando usado no comando SELECT deve vir depois da cláusula FROM. Ele sempre testa todos os registros recuperados pela consulta, retornando aqueles que o satisfizerem.
Para realizar as comparações da cláusula WHERE temos o operador de igualdade “=”, maior que “>”, maior ou igual “>=”, menor que “<”, menor ou igual “<=”, diferente “<>“, “!=” ou “^=”, se pertence “IN” e se contém uma parte especifica “LIKE”. Comparações com números são logicas, onde números menores são menores que números maiores. Os caracteres respeitam a ordem do alfabeto, onde “A” é menor que “Z”, e “Z” é menor que “a” (letras maiúsculas são sempre menores), além disso, os caracteres “10” são considerados menores que “2”. Quanto as datas podemos dizer que “hoje” é sempre menor que “amanhã”, logo datas anteriores são menores que datas posteriores.
O operador de comparação “LIKE” é muito poderoso, ele faz uso de caracteres “coringa” que permitem restringir partes, como por exemplo, pode-se usar o underline “_” para indicar um caractere, seja ele qual for, ou a porcentagem “%”, que indica que a partir dali qualquer resultado satisfaz a comparação, veja um exemplo:

SELECT NOME FROM FUNCIONARIOS WHERE NOME LIKE ‘JO__’;

Na consulta acima utilizamos o underline, estamos fazendo uma comparação de tamanho fixo, procurando por nomes que possuem as duas primeiras letras “JO” e que tenham apenas mais dois caracteres “__”. Agora veja o próximo exemplo:

SELECT NOME FROM FUNCIONARIOS WHERE NOME LIKE ‘JO%’;

No exemplo acima a busca ocorre por nomes iniciando em “JO”, onde os próximos caracteres não importam. Suponhamos que na base dos exemplos acima nos temos dois funcionários, “JOÃO” e “JOANA”, o primeiro exemplo retornaria apenas “JOÃO”, enquanto o segundo retornaria ambos.
Com os operadores booleanos (“AND” e “OR”) é possível realizar a combinação de condições, lembrando que sua avaliação se da de acordo com as convenções matemáticas:

SELECT * FROM FUNCIONARIOS WHERE ID != 2 AND STATUS = ‘S’;

Outro operador Booleano é o “NOT”, que é negação de uma condição:

SELECT * FROM FUNCIONARIOS WHERE ID != 2 AND NOT STATUS = ‘S’;

É importante ter em mente a ordem de precedência das comparações, onde temos no topo o “NOT”, depois “AND” e por fim “OR”.
O “IN” é utilizado na comparação com grupos, pode ser usado com datas, números e caracteres, as expressões devem estar dentro de aspas simples, elas também devem ser do mesmo tipo em ambos os lados da comparação:

SELECT * FROM FUNCIONARIOS WHERE NOME IN (‘ANA’, ‘MARIA’, ‘MARTA’);

O BETWEEN é usado para verificar se um determinado valor esta dentro de um limite determinado:

SELECT * FROM FUNCIONARIOS WHERE SALARIO BETWEEN 1000 AND 5000;

Por fim temos os operadores para comparar os valores nulos, ou seja, para a falta de valor:

SELECT * FROM FUNCIONARIO WHERE TELEFONE IS NULL;

Resumindo:

  • A cláusula WHERE vem sempre depois da clausula FROM;
  • O WHERE identifica os registros que devem ser incluídos no comando SQL;
  • O WHERE é usado em SELECT, UPDATE e DELETE;
  • WHERE é uma clausula opcional;
  • A cláusula WHERE é composta por expressões;
  • Essas expressões podem conter nomes de colunas, valores literais. A clausula WHERE compara ambos os lados determinando se o resultado é TRUE ou FALSE;
  • Os operadores booleanos separam as comparações para criar validações complexas. Coletivamente o resultado final para cada registro da tabela será TRUE ou FALSE, se TRUE o registro é retornado;
  • Os operadores booleanos são AND, OR e NOT;
  • As regras de precedência dos operadores booleanos definem que o operador NOT seja avaliado primeiro, em seguida o AND e então o OR;
  • O uso de parênteses pode alterar as regras originais de precedência;
  • Quando comparando datas, datas recentes são consideradas menores que datas antigas, como por exemplo, janeiro é menor que dezembro do mesmo ano;
  • Quando comparando caracteres, a letra ‘a’ é menor que a letra ‘z’, letras maiúsculas são menores que letras minúsculas e a representação de ‘3’ é maior que a representação de ‘22’;
  • LIKE pode ser usado com “coringas”;
  • IN pode ser usado para comparar uma expressão com um conjunto de uma ou mais expressões;
  • BETWEEN é usado para comparar expressões que estejam dentro de um limite. Ele é “inclusivo”, ou seja, “BETWEEN 2 AND 3” incluirá os valores 2 e 3 nos limites;
  • Devem ser usados IS NULL ou IS NOT NULL quando for necessário testar se uma coluna possui valor NULL (ou não);


Ordenando registros recuperados por uma consulta

Além de selecionar e restringir o resultado dessa seleção, também é possível ordenar o resultado, seja de forma descendente ou ascendente (ASC, DESC). Para fazermos uso da cláusula ORDER BY, basta especificar o nome da coluna que desejamos utilizar para a ordenação, ou a posição da coluna na listagem do SELECT.
O ORDER BY é sempre a ultima cláusula do comando SELECT, nele é possível listar uma ou mais colunas, separadas por vírgulas, onde a cada quebra ocorre uma reordenação.
É possível na cláusula WHERE usar expressões, ou mesmo apelidos atribuídos a colunas, também é possível mesclar todas essas possibilidades descritas acima:

SELECT ID, (SALARIO*2) SAL, NOME FROM FUNCIONARIOS ORDER BY ID, SAL, 3;

Resumindo:

  • ORDER BY é uma clausula opcional para ordenar registros recuperados pelo comado SELECT;
  • Se usado, o ORDER BY é sempre a ultima clausula do comando SELECT;
  • O ORDER BY utiliza expressões para direcionar a ordenação do comando SELECT;
  • Cada expressão é avaliada na sequencia, o primeiro item do ORDER BY realizara a primeira ordenação, o segundo ordenará dentro dos grupos já ordenados pelo primeiro item e assim por diante;
  • É possível ordenar por colunas não listadas no SELECT;
  • O ORDER BY pode utilizar expressões de qualquer tipo, seguindo as mesmas regras de expressões vistas na clausula WHERE;
  • Dados numéricos por padrão são ordenados de forma ascendente, do menor para o maior;
  • Caracteres por padrão são ordenados de forma ascendente, de ‘A’ a ‘Z’;
  • Datas por padrão são ordenadas de forma ascendente, de datas anteriores a posteriores;
  • As ordenações podem ser alteradas para descendente com a palavra DESC;
  • O ORDER BY pode identificar colunas por seus nomes, apelidos e posição na lista SELECT;


quarta-feira, 20 de junho de 2012

O que devemos conhecer sobre SQL/Oracle Parte 4: Recuperando dados usando o comando SELECT

Executando um comando básico de SELECT

O comando SELECT é utilizado para analisar, transformar e apresentar dados gravados no banco veja a sintaxe:

SELECT nome_coluna, expressão, FROM nome_da_tabela;

É possível listar na clausula SELECT colunas disponíveis nas tabelas da clausula FROM, também é possível utilizar funções, realizar cálculos, dentre outras coisas que serão vistas a seguir. Sobre o comando SELECT é importante ter em mente:
  • Um SELECT deve possuir ao menos uma lista a ser selecionada e a clausula FROM;
  • Colunas na lista SELECT devem pertencer a uma das tabelas da clausula FROM;


Listando as capacidades do comando SELECT

O comando SELECT é muito poderoso, com ele podemos selecionar colunas de tabelas, formatar seus valores e até utiliza-los para cálculos. Quando a questão são os cálculos e importante ter em mente a precedência de operadores, onde temos com prioridade máxima os parênteses, seguido dos operadores de divisão e multiplicação e por fim adição e subtração.
Como dito anteriormente é possível utilizar funções, sejam elas do próprio Oracle ou desenvolvidas pelos usuários, lembrando que funções geralmente podem receber um ou mais parâmetros e sempre retornam um único valor.
Outro ponto importante que deve ser levado em consideração são as pseudocolunas, elas são definidas de forma automática pelo Oracle para cada tabela. Elas não são descritas com comandos DESC, por exemplo, e seus valores não são armazenados juntamente com os dados da tabela, entre elas temos ROWNUM que é o numero de cada registro de uma coluna, sempre gerado antes da ordenação. ROWID, o endereço físico de cada registro, pode se alterar com o tempo, como por exemplo, quando ocorre exportação dos dados. DISTINCT ou UNIQUE, usado para listar os dados distintos de uma consulta, ou seja, se na clausula SELECT forem informadas três colunas o DISTINCT ira mostra combinações distintas destas três colunas (o UNIQUE funciona da mesma forma). Por fim temos o asterisco, que funciona como um “coringa” indicando que todas as colunas devem ser apresentadas, na mesma ordem em que estão na tabela.
O comando SELECT tambem faz uso da clausula WHERE para restringir o resultado, da clausula GROUP BY para agrupar registros, HAVING para restringir dados agrupados e ORDER BY para ordenar o resultado.
É importante ter em mente que as reais capacidades do comando SELECT são a projeção, que é a capacidade de selecionar colunas de tabelas, seleção, que é a capacidade de selecionar registros de tabelas e junção, capacidade de unir tabelas relacionadas.

Resumindo:
  • Pseudocolunas são definidas pelo sistema e não são armazenadas com a tabela;
  • Pseudocolunas podem ser incluídas na lista de SELECT;
  • DISTINCT ou UNIQUE podem ser usados no SELECT para listar resultados únicos;
  • O asterisco é usado para referenciar todas as colunas da tabela, não pode ser usado com outras colunas;
  • Expressões podem transformar os dados para apresentação antes e depois da recuperação dos dados;
  • Podem ser usados valores literais como números, caracteres, datas e intervalos;
  • Operadores aritméticos obedecem as regras de precedência da matemática;
  • Operadores de multiplicação e divisão tem precedência sobre os operadores de soma e subtração, independente da posição onde possam ser usados;
  • Os parênteses possuem a mais alta prioridade na ordem de precedência dos operadores;
  • Funções podem ser usadas em conjunto com expressões;
  • A cláusula WHERE define condições individuais que os registros devem obedecer para que possam ser apresentados;
  • A cláusula ORDER BY realiza ordenação sobre o resultado da consulta;
  • A cláusula GROUP BY agrega conjuntos de dados de uma consulta;
  • A cláusula HAVING é usada com GROUP BY para restringir os conjuntos de dados agrupados;
  • Quando um SELECT apresenta menos colunas do que uma tabela possui, ele esta mostrando o conceito de projeção (projection);
  • Projeção (projection) se dá pela definição da lista de colunas no comando SELECT;
  • Quando um SELECT esta apresentado menos registros do que existe em uma tabela, ele esta conceituando seleção (selection);
  • Seleção (selection) se da pela definição de condições na clausula WHERE;
  • Quando um SELECT seleciona uma combinação de registros de varias tabelas, sendo identificados por dados comuns e únicos temos o conceito de junção (junction);
  • Junção (junction) se da pelo comando SELECT fazendo uso da clausula WHERE ou JOIN;

segunda-feira, 18 de junho de 2012

O que devemos conhecer sobre SQL/Oracle Parte 3: Manipulando dados

Descrevendo cada comando de manipulação e dados (DML)

Comandos DML (Data manipulation language) são utilizados para inserir, atualizar e remover registros do banco. São cinco os principais comandos DML: INSERT, UPDATE, DELETE, SELECT e MERGE:

  • INSERT adiciona registros na tabela;
  • UPDATE altera registros existentes na tabela;
  • DELETE remove registros existentes na tabela;
  • SELECT mostra dados da tabela;
  • MERGE será visto em breve;


Inserindo registros na tabela

O comando para inserir registros é o INSERT, veja a sinaxe:

INSERT INTO nome_da_tabela(coluna_1, coluna_2) VALUES(valor_1, valor_2);

No comando acima duas colunas e dois valores são listados, essa relação sempre deve ser igual, não importa a ordem em que são listadas. É possível omitir colunas durante o INSERT, desde que as restrições da tabela sejam respeitadas. Também é possível inserir sem informar nenhuma coluna, desse modo é obrigatório informar valores para todas as colunas da tabela, na ordem em que elas estiverem na própria tabela. O recomendável é sempre informar todas as colunas.

Resumindo:
  • O comando INSERT insere um ou mais registros no banco;
  • A sintaxe do INSERT consiste nas palavras reservadas INSERT INTO, o nome da tabela, uma lista de colunas (opcional), a palavra reservada VALUES e a lista de valores a serem inseridos;
  • Se o comando INSERT for escrito sem a lista de colunas então a lista de valores a serem inseridos deve possuir um valor para cada coluna da tabela e devem estar na mesma ordem;
  • A lista de valores do INSERT pode conter expressões;
  • Se qualquer valor violar uma restrição da tabela então a execução gera um erro e nada é inserido;

Atualizando registros da tabela

O comando para atualizar registros é o UPDATE, veja a sintaxe:

UPDATE nome_da_tabela SET coluna_1 = valor_1, coluna_2 = valor_2 WHERE coluna_3 = valor_3;

No exemplo acima duas colunas são atualizadas, mas apenas para os registros que estiverem de acordo com a condição WHERE. A condição WHERE não é obrigatória, mas quando não informada todos os registros da tabela são atualizados. Os novos valores devem respeitar as restrições da tabela.

Resumindo:
  • O comando UPDATE atualiza um ou mais registros;
  • A sintaxe do comando UPDATE começa com a palavra reservada UPDATE e o nome da tabela, a palavra reservada SET, uma série de expressões que atribuem valores, onde do lado esquerdo temos as colunas seguidas de um sinal de igual “=” e do lado direito o valor e finalmente a clausula WHERE;
  • Se mais de um valor for alterado basta separa-los por vírgula;
  • Se a clausula WHERE for omitida todos os registros são atualizados;

Removendo registros da tabela

O comando para remover registros é o DELETE, veja a sintaxe:

DELETE FROM nome_da_tabela WHERE coluna_1 = valor_1;

No comando descrito, todos os registros que se enquadrarem na condição WHERE serão apagados. A cláusula FROM não é obrigatória, se omitida nada muda. A cláusula WHERE não é obrigatória, mas se suprimida todos os registros da tabela serão removidos.

Resumindo:
  • O comando DELETE é usado para remover registros;
  • A sintaxe inicia com a palavra reservada DELETE e a opcional FROM, o nome da tabela e a cláusula WHERE;
  • Se a clausula WHERE for omitida todos os registros são removidos;

Controle de transação

O controle de transação (TCL) é responsável por persistir ou desfazer as alterações realizadas pelos comandos DML. Também é possível “marcar posições” entre comandos, para que apenas parte desses comandos seja persistido ou descartado:

  • Comandos TCL incluem COMMIT, ROLLBACK e SAVEPOINT;
  • Existem dois tipos de eventos de COMMIT: explicito e implícito;
  • O explicito ocorre com o comando COMMIT;
  • O implícito ocorre imediatamente após certos eventos como a execução de um comando DDL válido (CREATE, ALTER, DROP, GRANT e REVOKE);
  • Se um comando DDL falha durante sua execução o COMMIT implícito ocorre, o mesmo não vale para erros de sintaxe;
  • O comando ROLLBAK é usado para desfazer alterações do banco;
  • O comando SAVEPOINT é usado para nomear um ponto entre uma série de comandos SQL, de modo que um ROLLBACK possa ocorrer diretamente para esse ponto;
  • Após um COMMIT, todas as marcações de SAVEPOINT são apagadas;
  • Todo ROLLBACK que aponta para um SAVEPOINT inexistente não ocorre;
  • Um ROLLBACK que não aponte para um SAVEPOINT desfaz todas as alterações da seção a partir do ultimo COMMIT;


sexta-feira, 15 de junho de 2012

O que devemos conhecer sobre SQL/Oracle Parte 2: Usando comandos DDL para criar e manipular tabelas

Categorizando os principais objetos de uma base de dados


Os objetos de banco de dados disponibilizam as estruturas necessárias para que uma aplicação seja formada, ou seja, é tudo aquilo que dá sentido na concepção de uma base de dados. Esses objetos vão desde tabelas, que é a estrutura base, até objetos como visões.


Todos os objetos do banco possuem uma categoria, ou pertencem a um “schema” ou são do tipo “non-schema”. Objetos “schema” pertencem a um usuário e existem enquanto essa conta de usuário existir. Já os objetos “non-schema” existem para dar suporte ao uso do banco, como por exemplo, usuários, regras e sinônimos públicos. Um pequeno resumo sobre objetos:

  • Tabelas armazenam dados;
  • Constraints são regras em tabelas;
  • Views funcionam como “janelas/visões” para tabelas;
  • Indexes proporcionam ganho de velocidade durante consultas em tabelas, funciona como um índice de um livro;
  • Sequences são contadores de objetos;
  • Synonyms são uma forma alternativa de se nomear objetos;
  • Users são objetos que possuem outros objetos;
  • Roles são conjuntos de direitos, ou privilégios, que podem ser concedidos a usuários de modo que esses usuários possam acessar esses objetos;
  • Objetos podem ser “schema” ou “nom-schema”;
  • Tables, views, indexes, sequences, e private synonyms são objetos “schema”;
  • User, roles e public synonyms são objetos “non-schema”;

Criando uma tabela simples


As tabelas são os objetos mais utilizados e conhecidos de um banco, sua sintaxe padrão é a seguinte:

CREATE TABLE nome_da_tabela (nome_da_coluna tipo_de_dados);

É importante ter em mente na criação de uma tabela (ou outro objeto qualquer) que o nome não pode ser o mesmo de outro objeto que esteja no mesmo “namespace”, ou seja, no caso de uma tabela o nome escolhido não pode ser o mesmo de outra tabela, visão, sequencia ou sinônimo privado do “schema” atual. 
Basicamente existe um “namespace” geral do banco onde ficam os usuários, regras e sinônimos públicos, e a cada “schema” temos um “namespace” para tabelas, visões, sequencias, sinônimos privados e tipos definidos pelo usuário, um “namespace” para índices e outro “namespace” para restrições.
Ainda quanto a nomeação devemos ter em mente que os nomes devem ter no máximo 30 caracteres, o caractere inicial deve ser uma letra, e o nome não pode ser uma palavra reservada.

Resumindo:
  • O comando CREATE TABLE é usado para criar uma tabela;
  • Você insere um nome seguindo as regras de nomeação de objetos;
  • Você insere nome para as colunas da tabela, seguindo as mesmas regras;
  • Todas as tabelas devem possuir ao menos uma coluna;

Revisando a estrutura de uma tabela


A revisão da estrutura da tabela é feita por meio de comandos implementados por ferramentas que acessam a base, como por exemplo, o comando DESC do SQL Plus:

  • O comando DESC pode ser usado para mostrar a estrutura de uma tabela;
  • A estrutura inclui o nome da tabela, o nome das colunas, os tipos de dados, e opcionalmente as constraints;
  • Toda coluna deve possuir um tipo de dado;
  • Tipos de dados incluem numéricos, caracteres e tipos data, como por exemplo, VARCHAR2, CHAR (pode ser criado sem uma precisão), NUMER e DATE;
  • Tipos de dados também incluem tipos como BLOB;

Listando os tipos de dados disponíveis para as colunas


A seguir mostraremos os principais tipos de dados do Oracle:

  • Caracteres
    • CHAR(n): caracteres de tipo fixo, onde “n” diz respeito ao tamanho, se for especificado tamanho três e for armazenado um texto de tamanho um, a base será ocupada por três posições (sendo as restantes completadas com espaços a direita). O tamanho é opcional e caso omitido na declaração assume um. O valor máximo para ele é de 2000;
    • VARCHAR2(n): caracteres de tamanho variável, diferente de CHAR, se uma variável com tamanho três for definida e um texto com tamanho um for usado apenas um é salvo na base. A especificação do tamanho é obrigatória, e seu tamanho máximo de 4000 bytes (o que não são necessariamente 4000 caracteres);
  • Numérico
    • NUMBER(n, m): recebe números positivos e negativos, sendo “n” sua precisão (numero máximo de dígitos significantes, total) e “m” a escala, correspondente ao total de dígitos do lado direito do separador decimal. Ambos, “n” e “m”, são opcionais, onde “n” assume o valor máximo e “m” se torna zero. O valor de “n” pode variar de 1 a 38, e “m” de -84 a 127. Se um valor atribuído tiver precisão maior que o especificado ocorre erro e o valor é rejeitado, o mesmo não ocorre com a escala, onde sempre ocorre um arredondamento (.5 arredonda acima), por exemplo, uma declaração de NUMBER recebendo 4.56 armazena 4.56, uma declaração NUMBER(2) recebendo 4.56 armazena 5, uma declaração NUMBER(5,2) recebendo 4.56 armazena 4.56, uma declaração NUMBER(5,2) recebendo 4.5678 armazena 4.57;
  • Datas
    • DATE: recebe data e hora, incluindo ano, mês, dia, hora, minuto e segundo. Podem ser armazenados utilizando valores literais ou com funções de conversão. Literais são utilizadas dentro de aspas simples, e podem ser especificadas de varias maneiras. O padrão do formato de data pode ser identificado pelo parâmetro NLS_DATE_FORMAT, por padrão o corrente é o americano com ‘DD-MON-RR’, onde ‘DD’ é o dia em dois dígitos, ‘MON’ e a abreviação do mês em três letras e ‘RR’ e o ano em dois dígitos;
    • TIMESTAMP(n): é uma extensão de DATE, adicionando a porção de fração dos segundos. Armazena ano, mês, dia, hora, minuto, segundo e as frações de segundo. O valor de “n” define o tamanho da fração dos segundos, indo de 1 a 9, se omitido assume o valor 6 por default;
    • TIMESTAMP(n) WITH TIME ZONE: variação de TIMESTAMP adicionando o nome da zona de tempo ou sua compensação. É utilizado para rastrear informação de diferentes zonas de tempo de áreas geográficas, como por exemplo, uma base de dados que armazena informações de países diferentes;
    • TIMESTAMP(n) WITH LOCAL TIME ZONE: variação de TIMESTAMP, diferenciando de TIMESTAMP WITH TIME ZONE pelo fato de não armazenar junto a coluna o nome da zona de tempo, este ultimo é recuperado e enviado da sessão atual;
    • INTERVAL YEAR(n) TO MONTH: armazena a diferença entre anos e meses, sendo “n” com variação entre 0-9, quando omitido assume o valor 2. Útil para armazenar diferenças entre datas;
    • INTERVAL DAY(n1) TO SECOND(n2): armazena a diferença entre dias, horas, minutos e segundos, sendo “n1” a precisão para dias (de 0-9, default 2) e “n2” a precisão para segundos (0-9, default 6). Útil para armazenar diferenças entre datas;
  • Grandes objetos (large objects (LOBs))
    • BLOB: abreviação de “Binary large object“, aceita dados binários como imagens ou vídeos. Sua declaração ocorre sem precisão ou escala. Seu tamanho máximo e de 4 gb. Não podem ser chaves primarias, ou serem utilizados com DISTINCT, GROUP BY, ORDER BY ou junções;
    • CLOB: abreviação para “Character large object”, aceita grandes textos. Sua declaração ocorre sem precisão ou escala;
    • NCLOB: aceita o CLOB em Unicode. Serve como alternativa a representação ASCII;

Resumindo:

  • Cada coluna deve possuir um tipo de dados;
  • Tipos de dados incluem números, caracteres, datas e texto;
  • Tipos de dados também podem ser binários como, por exemplo, BLOB;


Explicando como restrições são criadas em tempo de criação de tabela


Restrições são objetos que oferecem suporte a tabelas, inserindo regras de modo a organizar os dados recebidos. Essas restrições podem ser criadas no mesmo comando de criação da tabela das seguintes formas:

  • In line
A restrição segue a definição da coluna, apos o tipo, desse modo não é possível especificar, por exemplo, uma chave primaria composta:

CREATE TABLE FUNCIONARIOS(ID_FUN NUMBER CONSTRAINT PK_FUN PRIMARY KEY, NM_FUM VARCHAR2(50));


  • Out of line

A especificação das restrições ocorre apos todas as declarações das colunas, nesse caso é possível indicar restrições compostas, sempre separadas por virgula:

CREATE TABLE FUNCIONARIOS(ID_FUN NUMBER, NM_FUN VARCHAR2(50), CONSTRAINT PK_FUN PRIMARY KEY (ID_FUN));

Também é possível criar restrições fora do comando de criação de tabelas, com ALTER TABLE, desse modo primeiro criamos a tabela e em um segundo comando indica-se a alteração da mesma para adicionar a restrição:

CREATE TABLE FUNCIONARIOS(ID_FUN NUMBER, NM_FUN VARCHAR2(50));
ALTER TABLE FUNCIONARIOS ADD CONSTRAINT PK_FUN PRIMARY KEY (ID_FUN);

Sobre os tipos de restrições:


  • NOT NULL
    • O conceito de NULL indica que ele é a falta de valor, ou seu desconhecimento, logo ele não é zero nem espaço. Por isso todo calculo com colunas nulas sempre resultam em valor nulo. A restrição NOT NULL garante que para as colunas definidas com essa restrição sempre haverá valor. O NOT NULL não pode ser declarado nos moldes “Out of line”, caso seja adicionado com o ALTER TABLE é necessário utilizar o comando equivalente ao “In line”:

ALTER TABLE FUNCIONARIOS MODIFY NM_FUN NOT NULL;

  • UNIQUE
    • Essa restrição indica que para a(s) coluna(s) marcadas como UNIQUE não poderão existir valores repetidos na mesma tabela, ou seja, se uma coluna com essa restrição recebeu a valor 1, os próximos registros inseridos não podem possuir o valor 1. No caso de valores NULL isso não se aplica, já que NULL, como visto anteriormente, é a ausência de valor;
  • PRIMARY KEY
    • Uma PRIMARY KEY é o identificador único para cada registro de uma tabela, só pode haver um, pode-se dizer que ele é a combinação das restrições NOT NULL e UNIQUE;
  • FOREIGN KEY
    • Relaciona uma ou mais colunas de uma tabela a uma chave primária, ou única, de outra. Desse modo fica garantido que as colunas com essa restrição irão possuir apenas valores previamente existentes na tabela referencial. As colunas envolvidas devem possuir o mesmo tipo de dados, o nome não importa. A FOREIGN KEY em conjunto com a PRIMARY KEY constitui a integridade referencial entre duas tabelas;
  • CHECK
    • Aplica certas regras no momento da recepção dos dados, como por exemplo, restringir valores que estejam dentro de um limite. Considerando uma coluna com o tipo NUMBER(1), queremos restringir para ela apenas os valores 0 ou 1, para tal:

CREATE TABLE FUNCIONARIOS(ID_FUN NUMBER, NM_FUN VARCHAR2(50), TP_FUN NUMBER(1) CHECK (TP_FUN IN(0, 1) ) );

Resumindo:
  • Os tipos de restrições são NOT NULL, UNIQUE, PRIMARY KEY, FOREIGN KEY, e CHECK;
  • Uma coluna com a restrição NOT NULL deve possuir um valor para cada registro inserido na tabela;
  • A restrição UNIQUE indica que para a coluna em especifico sempre serão necessários valores distintos para cada registro inserido;
  • A restrição PRIMARY KEY é a combinação das restrições NOT NULL e UNIQUE;
  • Uma PRIMARY KEY pode ser incluída para uma ou mais colunas, quando em muitas colunas é considerada uma chave composta;
  • Uma tabela pode possuir apenas uma PRIMARY KEY;
  • Uma FOREIGN KEY relaciona uma ou mais colunas de uma tabela com colunas similares de outra;
  • Uma FOREIGN KEY requer que a segunda tabela já possua uma PRIMARY KEY associada à coluna relacionada antes que essa FOREIGN KEY seja criada;
  • Uma vez criada, a FOREIGN KEY assegura que os valores inseridos na tabela correspondem a valores existentes na tabela referenciada;
  • Restrições podem ser criadas com CREATE TABLE ou com ALTER TABLE;
  • Restrições podem ser definidas como parte de uma coluna “in line” ou depois “out of line”;


quarta-feira, 13 de junho de 2012

O que devemos conhecer sobre SQL/Oracle Parte 1: Introdução ao SQL




 

Série de postagens sobre SQL


A algum tempo atrás, não me lembro se 2009 ou 2010, comecei a escrever uma serie de artigos contendo pontos importantes sobre banco de dados, mais precisamente Oracle. Porem um descuido e uma formatação apressada fez com que eu perdesse esses artigos.
Porem recentemente, buscando uma declaração de imposto de renda, reencontrei esses artigos, a maior parte ainda esta sem formatação e outra por terminar, mas o fato de ter encontrado me deu vontade de finalizar e publicar tudo, ao todo imaginei cerca dezoito postagens abordando os mais variados tópicos. 
Começaremos hoje com um pouco de historia e um rápido resumo, espero que gostem desse e dos próximos.

Banco de dados relacionais e Dr. E. F. Codd


Antes do advento dos bancos de dados relacionais, cada desenvolvedor formulava seus próprios meios de armazenar, alterar e recuperar dados, dessa forma cada aplicação tratava a informação de um modo único, tornando a integração entre aplicações algo extremamente trabalhoso, além é claro do tempo de desenvolvimento se tornar maior.
Na década de 70 Dr. E. F. Codd desenvolveu um projeto que propunha o modelo atual de bancos de dados relacionais, onde os programadores poderiam por meio de uma linguagem padrão, comum e unificada, construir seus próprios bancos de dados.

Normalização de uma base de dados


Normalização nada mais é do que métodos que se propõe a diminuir problemas durante o uso da base de dados, como por exemplo, a construção de um modelo que não permita dados duplicados.
É importante salientar que as regras de normalização não são necessariamente objetos e sim conceitos que devem ser levados em consideração no momento da modelagem do banco, lembrando que toda base de dados que se preze deve seguir ao menos as três primeiras:

  • Primeira forma normal (1NF): Sem repetição de grupos de dados, tabelas bidimensionais;
  • Segunda forma normal (2NF): 1NF mais o fato de que cada elemento possui um identificador único (chave primária);
  • Terceira forma normal (3NF): 2NF mais o fato de que as tabelas devem possuir apenas informações referentes ao que se propõe a chave primária (informações extras devem ficar em outras tabelas);
  • Boyce-Codd (BCNF): Modificação da 3NF que elimina estruturas que possam gerar inconsistências logicas nos dados;
  • Quarta forma normal (4NF): BCNF mais logica que assegura que toda dependência multivalorada é dependente de uma superkey;
  • Quinta forma normal (5NF): 4NF mais o fato que toda junção dependente para a tabela é resultado de chaves candidatas;

Definindo e entendo o básico do SQL


A linguagem SQL é uma das mais utilizadas na atualidade, devido ao seu padrão para as bases de dados relacionais que dominam o mercado. Ela também é uma das mais poderosas, e em alguns casos também perigosa, pois permite a escrita de comandos sintaticamente corretos e logicamente errados. 
SQL significa linguagem estruturada de consulta e sobre ela podemos:
  • Criar bases de dados e objetos;
  • Armazenar dados nessa base;
  • Alterar e analisar os dados;

A base dos comandos do SQL são as palavras reservadas:
  • Select: recupera dados;
  • Insert: insere dados nas tabelas;
  • Update: atualiza dados nas tabelas;
  • Delete: remove dados das tabelas;
  • Create: cria um objeto do banco, como uma tabela, por exemplo;
  • Alter: altera um objeto do banco, como uma coluna de tabela;
  • Drop: remove um objeto do banco;

A seguir ...