Translate

quinta-feira, 27 de fevereiro de 2014

Postgresql - Criar tabela segunda parte

Nesta segunda parte, vamos mostrar: 
  • como criar uma tabela. Vamos apresentar um exemplo da criação da tabela "tb_paciente";
  • incluir registros em uma tabela utilizando o comando INSERT
  • criar uma coluna com preenchimento obrigatório ou com preenchimento opcional;
  • como exibir os registros de uma tabela utilizando o comando SELECT;
  • nomenclatura de tabela e coluna: descreve as regras para criar um nome de uma tabela e de uma coluna;
Caso tenha interesse, faça o download do exemplo ou veja no GitHub.
Veja a tabela "tb_paciente" exibida na imagem abaixo:


Para criar uma tabela utilizamos o comando CREATE TABLE, veja a sintaxe do comando abaixo:

SINTAXE BÁSICA

CREATE TABLE nome_da_tabela
(
    nome_da_coluna tipo_de_dado,
    nome_da_coluna tipo_de_dado,
    ...
    nome_da_coluna tipo_de_dado
);

Agora que já conhecemos a sintaxe básica vamos criar a tabela "tb_paciente".

CREATE TABLE tb_paciente
(
    prontuario integer,
    nome character varying(255),
    data_nasc date,
    sexo character(1),
    peso numeric(6,3),
    proc_cirurgico boolean
);

Criamos a tabela "tb_paciente", agora vamos incluir os registros nesta tabela através do comando INSERT, veja a sintaxe do comando INSERT a seguir:

INSERT INTO nome_da_tabela
(
    nome_da_coluna_x ,
    nome_da_coluna_y ,
    ...
    nome_da_coluna_z
)
VALUES

(
    valor_da_coluna_x ,
    valor_da_coluna_y ,
    ...
    valor_da_coluna_z
);

No comando INSERT a ordem das colunas e dos valores devem ser iguais. Se no comando incluirmos as colunas x, y e z, dentro do VALUES devemos colocar os valores das colunas x, y e z.
Agora que já conhecemos a sintaxe básica vamos incluir os registros na tabela "tb_paciente".
Segue a inclusão do primeiro registro:

INSERT INTO tb_paciente
(
    prontuario ,
    nome ,
    data_nasc ,
    sexo ,
    peso ,
    proc_cirurgico
)
VALUES

(
    1 ,
    'Maria Santos' ,
    '1984-04-20' ,
    'f' ,
    52.440 ,
    TRUE
);

Observações
  • Valores armazenados em colunas do tipo character varying, character ou text, como nome e sexo devem ser inseridos entre aspas;
  • Uma data inserida no formato aaaa-mm-dd deve estar entre aspas, se não colocarmos as aspas o postgresql interpretará o hífen como sinal de menos e retornará o resultado de uma subtração de números inteiros e haverá um erro. Se não utilizássemos aspas na primeira inclusão em vez de inserir a data 1984-04-20 seria interpretado que estavamos tentando inserir um número inteiro 1960 e haveria um erro:

    ERRO: coluna "data_nasc" é do tipo date mas expressão é do tipo integer


Se a data fosse passada através de uma função, por exemplo, CURRENT_DATE, não seriam utilizadas aspas. A função CURRENT_DATE retorna a data atual.

Segue a inclusão do segundo registro:

INSERT INTO tb_paciente
( prontuario , nome ,  data_nasc ,  sexo ,  peso ,  proc_cirurgico )
VALUES

( 2 ,  'João Silva' ,  '1974-08-29' ,  'm' ,  80.520 ,   FALSE );

Segue a inclusão do terceiro registro:

INSERT INTO tb_paciente
( prontuario ,  nome ,  data_nasc ,  sexo ,  peso ,  proc_cirurgico )
VALUES

( 3 ,  'Ana Moraes' ,  '1982-10-30' ,  'f' ,  57.700 ,  TRUE );

Criar tabela com coluna do tipo serial 

O números dos prontuários estão sendo inseridos sequencialmente um a um e de forma manual, ou seja, o primeiro prontuário cadastrado tem o valor 1, o segundo prontuário cadastrado tem o valor 2 e assim por diante. Para inserirmos automaticamente o número podemos utilizar o tipo de dado serial na coluna "prontuario".
Vamos excluir a tabela "tb_paciente" e vamos criá-la novamente com a coluna "prontuario" do tipo serial.
Para excluir uma tabela utilizamos o comando DROP TABLE, veja a sintaxe deste comando a seguir:
DROP TABLE nome_da_tabela;

Logo para excluir a tabela "tb_paciente", vamos executar o comando abaixo:

DROP TABLE tb_paciente;

Agora que já excluímos a tabela "tb_paciente", vamos recriá-la com o tipo serial:

CREATE TABLE tb_paciente
(
    prontuario serial,
    nome character varying(255),
    data_nasc date,
    sexo character(1),
    peso numeric(6,3),
    proc_cirurgico boolean
);

Criamos a tabela "tb_paciente", com a coluna "prontuario" do tipo serial. Agora não vamos precisar incluir o número do prontuário manualmente (1, 2, 3, 4 ...), a inclusão será feita automaticamente. No lugar dos números incluíremos o valor DEFAULT (valor padrão).

Segue a inclusão do primeiro registro:

INSERT INTO tb_paciente
(
    prontuario ,
    nome ,
    data_nasc ,
    sexo ,
    peso ,
    proc_cirurgico
)
VALUES

(
    DEFAULT ,
    'Maria Santos' ,
    '1984-04-20' ,
    'f' ,
    52.440 ,
    TRUE
);

Segue a inclusão do segundo registro:

INSERT INTO tb_paciente
( prontuario ,  nome ,  data_nasc ,  sexo ,  peso ,  proc_cirurgico )
VALUES

( DEFAULT ,  'João Silva' ,  '1974-08-29' ,  'm' ,  80.520 ,   FALSE );

Mesmo se não declararmos uma coluna do tipo serial e o seu respectivo valor no comando INSERT, a seqüência será preenchida automaticamente da mesma forma.
Neste caso, não vamos incluir a coluna "prontuario" e seu respectivo valor e a sequéncia continuará sendo preenchida automaticamente. Veja o exemplo abaixo:

Segue a inclusão do terceiro registro:

INSERT INTO tb_paciente
(
    nome ,
    data_nasc ,
    sexo ,
    peso ,
    proc_cirurgico
)
VALUES

(
    'Patricia Duarte' ,
    '1990-11-05' ,
    'f' ,
    72.440 ,
    TRUE
);
Comando Insert somente com valores 

Também é possível executar o comando INSERT fornecendo somente os valores sem fornecer as colunas.
O primeiro valor será inserido na primeira coluna, o segundo valor será inserido na segunda coluna e assim por diante.
Veja o exemplo abaixo:

Segue a inclusão do quarto registro:

INSERT INTO tb_paciente
VALUES
(
    DEFAULT ,
    'Bruno Pereira' ,
    '1980-06-23' ,
    'f' ,
    110.440 ,
    TRUE
);

Apesar de o PostgreSql permitir que seja fornecido somente os valores é preciso tomar cuidado para não inverter a ordem dos valores para não ocasionar a inclusão de dados incorretos ou um possível erro de inclusão.
É uma boa prática informar as colunas e os valores.


Criar colunas com preenchimento obrigatório ou opcional

Para determinar se o preenchimento de uma coluna de uma tabela é obrigatório ou opcional devemos utilizar os comandos abaixo:
  • NOT NULL: uma coluna acompanhada com NOT NULL tem preenchimento obrigatório;
  • NULL: uma coluna acompanhada com NULL tem preenchimento opcional;

Exemplo

Vamos criar a tabela "tb_paciente", mas agora especificando quais são as colunas obrigatórias e quais são opcionais.
  • colunas de preenchimento obrigatório: "prontuario", "nome", "data_nasc", "sexo" e "proc_cirurgico";
  • colunas de preenchimento opcional: "peso";

Antes de criá-la com esta nova opção, vamos excluir a tabela "tb_paciente" que criamos anteriormente, executando o comando a seguir:

DROP TABLE tb_paciente;

Agora que já excluímos a tabela "tb_paciente", vamos recriá-la indicando quais as colunas são obrigatórias e quais são opcionais.
Veja o comando abaixo:

CREATE TABLE tb_paciente
(
    prontuario serial NOT NULL,
    nome character varying(255) NOT NULL,
    data_nasc date NOT NULL,
    sexo character(1) NOT NULL,
    peso numeric(6,3) NULL,
    proc_cirurgico boolean  NOT NULL
);

OBSERVAÇÕES
  • Na coluna "prontuario" foi colocado NOT NULL, para indicar que é obrigatório inserir um valor nesta coluna, porém como ela é do tipo serial, já tem uma restrição não nula, logo não necessário colocar NOT NULL nesta coluna;
  • Na coluna "peso" foi colocado NULL, para indicar que esta coluna opcional, porém se não colocarmos NULL, ela será opcional da mesma forma, pois quando não declararmos nenhum parâmetro de restrição para uma coluna ela será opcional.

A tabela abaixo, será criada com os mesmas restrições da tabela que criamos anteriormente.

CREATE TABLE tb_paciente
(
    prontuario serial,
    nome character varying(255) NOT NULL,
    data_nasc date NOT NULL,
    sexo character(1) NOT NULL,
    peso numeric(6,3),
    proc_cirurgico boolean NOT NULL
);

Quando não incluirmos uma dado em um campo obrigatório haverá um erro. Não vamos inserir uma data no campo "data_nasc" e será exibido um erro. Veja os comandos a seguir:

INSERT INTO tb_paciente (prontuario, nome, sexo, peso, proc_cirurgico )
VALUES (DEFAULT, 'Carlos Pereira', 'm', 57.700, TRUE);

ERRO: valor nulo na coluna "data_nasc" viola a restrição não-nula
SQL state: 23502


INSERT INTO tb_paciente (prontuario, nome, data_nasc, sexo, peso, proc_cirurgico)
VALUES (DEFAULT, 'Paulo Soares', NULL, 'm', 85.400, TRUE);

ERRO: valor nulo na coluna "data_nasc" viola a restrição não-nula
SQL state: 23502


Quando não incluirmos um dado em um campo opcional não haverá problema. Exemplo: campo peso.

INSERT INTO tb_paciente (prontuario, nome, data_nasc, sexo, proc_cirurgico)VALUES (DEFAULT, 'Rosana Alves', '1979-04-13', 'f', TRUE);

INSERT INTO tb_paciente (prontuario, nome, data_nasc, sexo, peso, proc_cirurgico)VALUES (DEFAULT, 'Rafael Brito', '1979-05-14', 'f', NULL, TRUE);


Inserir mais de um registro com o comando INSERT
SINTAXE

INSERT INTO nome_da_tabela
( nome_da_coluna_x ,   nome_da_coluna_y ,  ...  nome_da_coluna_z )
VALUES

( valor_da_coluna_x ,  valor_da_coluna_y , ...  valor_da_coluna_z ) ,
( valor_da_coluna_x ,  valor_da_coluna_y , ...  valor_da_coluna_z ) ,
( valor_da_coluna_x ,  valor_da_coluna_y , ...  valor_da_coluna_z ) ;

EXEMPLO

No exemplo a seguir, inserimos 3 registros.

INSERT INTO tb_paciente
( prontuario ,   nome ,  data_nasc ,  sexo ,  peso ,  proc_cirurgico )
VALUES

( DEFAULT , 'Daniel Alves' ,  '1992-12-06' ,  'm' ,  100.520 ,  FALSE ) ,
( DEFAULT , 'Priscila Monteiro' ,  '1982-10-30' ,  'f' ,  64.280 ,  TRUE ) ,
( DEFAULT , 'Otaviano Costa' ,  '1976-03-18' ,  'm' ,  144.520 ,  FALSE ) ;

Exibir registros de uma tabela

Para exibir os registros de uma tabela utilizamos o comando SELECT.

SELECT
    nome_da_coluna,
    nome_da_coluna,
    ...
    nome_da_coluna
FROM nome_da_tabela;

Exemplo
Exibir os registros das tabela tb_paciente.

SELECT
    prontuario,
    nome,
    data_nasc,
    sexo,
    peso,
    proc_cirurgico
FROM tb_paciente;

Veja os resultados deste comando na imagem abaixo:



Em vez de declarar todas as colunas da tabela, utilize o símbolo de "*" para facilitar.

SELECT * FROM tb_paciente;

Veja os resultados deste comando na imagem abaixo:



Não precisamos selecionar todas as colunas, podemos escolher quais precisamos.

SELECT
    nome,
    data_nasc
FROM tb_paciente;

Veja os resultados deste comando na imagem abaixo:


Nomenclatura das tabelas e colunas

Os nomes das tabelas e colunas devem iniciar com letras ou underscore "_".

Os nomes das tabelas e colunas serão gravados em caracteres minúsculos mesmo que você tenha criado em caracteres maiúculo.

Exemplo

CREATE TABLE Tb_nomenclatura
(
    COLUNA_1 integer,
    Coluna_2 character varying(30)
);

Caso haja necessidade de gravar o nome de uma tabela ou coluna com letras maiúsculas, espaços, acentos, ou iniciada por um número, este nome deve ser gravado entre aspas duplas "". Este tipo de nomenclatura não é recomendável.

Exemplo

CREATE TABLE "Tb nomenclatura 2"
(
    "COLUNA_1" serial,
    "Coluna_2" character varying(30),
    "Coluna 3" char(2),
    "4_Coluna" smallint,
    "endereço" character varying(50)
);

Caso tenha que executar um comando sql, por exemplo, SELECT também será necessário colocar o nome da tabela e das colunas entre aspas duplas "".

SELECT
    "COLUNA_1" ,
    "Coluna_2",
    "Coluna 3",
    "4_Coluna",
    "endereço"
FROM "Tb nomenclatura 2";


Em breve, publicaremos a utilização do comando INSERT com RETURNING

Comente no campo abaixo, suas sugestões e críticas serão bem-vindas.


Leia o artigo:

PostgreSql - Criar tabela primeira parte
PostgreSql - Criar um banco de dados parte I
PostgreSql - Criar um banco de dados parte II
PostgreSql - Criar um banco de dados parte III

PostgreSql - Criar tabela primeira parte

Para criarmos uma tabela, devemos conhecer basicamente o que são colunas, linhas e tipo de dados. Nesta primeira parte do artigo, vamos apresentar estes conceitos, utilizando a tabela "tb_paciente".
Na segunda parte vamos mostrar como criá-la e incluir registros utilizando comandos sql.
Veja a tabela "tb_paciente" exibida na imagem abaixo:



Ao observar a figura concluímos que:
  • as colunas estão dispostas verticalmente (em pé). Neste exemplo temos 6 colunas, cada coluna possui um nome. Os nomes das colunas são:
    • prontuario: número do prontuário do paciente;
    • nome: nome do paciente;
    • data_nasc: data de nascimento do paciente;
    • sexo: sexo do paciente;
    • peso: peso do paciente;
    • proc_cirurgico: indica se o paciente já passou ou não por um procedimento cirúrgico
  • cada linha, disposta horizontalmente (deitada), contém um registro (conjunto de dados), nesta tabela temos 3 registros;
Devemos atribuir a cada coluna um tipo de dado, ou seja devemos indicar qual o tipo de conteúdo que vamos armazenar. Exemplo:
  • data: 15/01/2014, 01/02/2014
  • um número inteiro: 1, 2, 3
  • um número decimal: 40.4, 70.8, 85,7
  • caracteter: caracteres alfanuméricos, ou seja, letras (a-z A-Z) e números (0-9). Também armazena símbolos, por exemplo ,"!@$*&";
A seguir, apresentamos tipos de dados mais utilizados postgresql:

TIPOS DE DADOS NUMÉRICOS
Nome Espaço ocupado Descrição Intervalo
smallint 2 bytes Armazena números inteiros: o intervalo é pequeno.
Estes números seriam aceitos em um campo do tipo smallint: -30000, -500, 0, 7, 800 e 31000.
Estes números não seriam aceitos em um campo do tipo smallint: -40000, -36000, 32800 e 39500. Pois estão fora do intervalo.
De   -32768
Até +32767
integer 4 bytes Armazena números inteiros: o intervalo é médio. Abrange a maioria das necessidades do cotidiano.
Estes números seriam aceitos em um campo do tipo integer: -120341, 95000, 0, 70000, 800000 e 319425.
Estes números não seriam aceitos em um campo do tipo integer: -4147483643 e 5147483646. Pois estão fora do intervalo.
De   -2147483648
Até +2147483647
bigint 8 bytes Armazena números inteiros: o intervalo é grande.
Estes números seriam aceitos em um campo do tipo bigint: -738526341, -4511956147, 0, 2473971242 e 1236843121.
Estes números não seriam aceitos em um campo do tipo bigint: -9453372036854775864 e 9853372036854775935. Pois estão fora do intervalo.
De   -9223372036854775808
Até +9223372036854775807
numeric variável As casas decimais são separadas por ponto. Utiliza-se numeric quando é necessário gravar o valor exato. Sintaxe
numeric(x, y)
  • x: máximo de dígitos permitidos;
  • x - y: a subtração de x menos y, indica o número máximo de dígitos inteiros permitidos;
  • y: número máximo de casas decimais;
Exemplo:
numeric(5, 3)
Aceita no máximo 5 dígitos: 2 dígitos para inteiro e 3 para decimal.

número incluído número gravado
4.2 4.200
4.26 4.260
4.268 4.268
4.2683 4.268
4.268754 4.269
57.432 57.432
572.341 Erro: "Estouro de
campo."

Se o número tiver menos de 3 casas decimais, as casas serão completadas com zero.
Se o número tiver mais de 3 casa decimais, o números será arredondado até 3 casas decimais.
Se o número tiver mais de 2 dígitos inteiros haverá um erro: "estouro de campo".
Armazena até 131072 digítos antes do ponto e 16383 digitos depois do ponto.
decimal variável É equivalente ao tipo numeric. As casas decimais são separadas por ponto.
Sintaxe
decimal(x, y)
  • x: máximo de dígitos permitidos;
  • x - y: a subtração de x menos y, indica o número máximo de dígitos inteiros permitidos;
  • y: número máximo de casas decimais;
Exemplo:
decimal(5, 3)
Aceita no máximo 5 dígitos: 2 dígitos para inteiro e 3 para decimal.

número incluído número gravado
4.2 4.200
4.26 4.260
4.268 4.268
4.2683 4.268
4.268754 4.269
57.432 57.432
572.341 Erro: "Estouro de
campo."

Se o número tiver menos de 3 casas decimais, as casas serão completadas com zero.
Se o número tiver mais de 3 casa decimais, o números será arredondado até 3 casas decimais.
Se o número tiver mais de 2 dígitos inteiros haverá um erro: "estouro de campo".
Armazena até 131072 digítos antes do ponto e 16383 digitos depois do ponto.
real 4 bytes As casas decimais são separadas por ponto. Utiliza-se real quando não é necessário gravar o valor exato. Exemplo:

número incluído número gravado
2.43 2.43
0.12345689 0.123457
0.123456 0.123456
8.123456 8.12346
88.123456 88.1235
888.123456 888.123
8888.123456 8888.12
88888.123456 88888.1
888888.1234567 888888
888888.7234567 888888

Armazena até 6 casas decimais.
double precision 8 bytes As casas decimais são separadas por ponto. Utiliza-se double precision quando não é necessário gravar o valor exato. Exemplo:

número incluído número gravado
5.721 5.721
3.4528 3.4528
8 8
8.0 8
0.123456789012345 0.123456789012345
8.123456789012345 8.12345678901234
88.123456789012345 88.1234567890124
888.123456789012345 888.123456789012

Armazena até 15 casas decimais.
serial 4 bytes Autoincremento inteiro. Seqüência crescente e automática: 1, 2, 3, ...
Esse intervalo atende a maioria das necessidades.
Exemplo:

matrícula aluno
1 Ana
2 Paulo
3 Carlos

Se precisássemos incluir uma nova aluna chamada Maria na tabela, o número da matrícula seria 4, pois é o próximo número da seqüência. Esse número será gerado automaticamente.

matrícula aluno
1 Ana
2 Paulo
3 Carlos
4 Maria

De                 1
Até 2147483647
smallserial 2 bytes Autoincremento inteiro. Seqüência crescente e automática: 1, 2, 3, ...
Este intervalo é pequeno.
Este tipo surgiu na versão 9.2 do PostgreSql, logo funcionará nesta versão ou em versão superiores. Exemplo:

matrícula aluno
1 Ana
2 Paulo
3 Carlos

Se precisássemos incluir uma nova aluna chamada Maria na tabela, o número da matrícula seria 4, pois é o próximo número da seqüência. Esse número será gerado automaticamente.

matrícula aluno
1 Ana
2 Paulo
3 Carlos
4 Maria

De         1
Até 32767
bigserial 8 bytes Autoincremento inteiro. Seqüência crescente e automática: 1, 2, 3, ...
Este intervalo é grande.
Exemplo:

matrícula aluno
1 Ana
2 Paulo
3 Carlos

Se precisássemos incluir uma nova aluna chamada Maria na tabela, o número da matrícula seria 4, pois é o próximo número da seqüência. Esse número será gerado automaticamente.

matrícula aluno
1 Ana
2 Paulo
3 Carlos
4 Maria

De                                1
Até 9223372036854775807


TIPOS DE DADOS CARACTERE
Nome Descrição
character varying(n)

ou

varchar(n)
varchar é uma alias(apelido) para character varying.
Armazena caracteres alfanuméricos, ou seja, letras (a-z A-Z) e números (0-9). Também armazena símbolos, por exemplo ,"!@$*&". Lembrando que espaço em branco é considerado caracter.
n indica a quantidade máxima de caracteres que o campo irá armazenar.

Exemplo:

A tabela abaixo possui uma coluna chamada "descricao" do tipo character varying(5).

descricao
character varying(5)
a
ab
abc
abcde
XYZUT
Efghi
lm no
#am12


Se tentarmos incluir a string "abcdef" ocorrerá um erro: "valor é muito longo para tipo character varying(5)", isso acontece porque o tamanho da string "abcdef" é 6, ou seja, o tamanho da string é maior que o tamanho permitido 5.

Podemos declarar, o character varying sem o n. O campo não terá mais um limite máximo de caracteres, porém poderá armazenar no máximo 1 GB de dados.

descricao
character varying
abcdefghi ABCDEFGHIZ 0123456789 !@#$%&*()+.

character(n)

ou

char(n)
char é uma alias(apelido) para character.
Armazena caracteres alfanuméricos, ou seja, letras (a-z A-Z) e números (0-9). Também armazena símbolos, por exemplo ,"!@$*&". Lembrando que espaço em branco é considerado caracter.
n indica uma quantidade fixa de caracteres que o campo irá armazenar.
Caso a string armazenada seja menor que o tamanho do campo, a string será completada com espaço em branco.


Exemplo:

A tabela abaixo possui uma coluna chamada "descricao" do tipo character(3).

descricao
character(3)
a
ab
abc


A string "a" tem 1 caracter e será completada com 2 espaços em branco para manter o valor fixo de 3 caracteres.

A string "ab" tem 2 caracteres e será completada com 1 espaço em branco para manter o valor fixo de 3 caracteres.

Se tentarmos incluir a string "abcdef" ocorrerá um erro: "valor é muito longo para tipo character (3)", isso acontece porque o tamanho da string "abcdef" é 6, ou seja, o tamanho da string é maior que o tamanho permitido 3.

Devido ao preenchimento com espaços em branco, este tipo de dado é indicado para armazenar strings com valores fixos. Exemplo: armazenar as siglas dos estados brasileiros.

estados
character(2)
AC
BA
RS
SP



Podemos declarar, o character sem o n. O campo terá o limite máximo de 1 caracter.

descricao
character(1)
x

text O campo não tem um limite máximo de caracteres, porém poderá armazenar no máximo 1 GB de dados.


TIPOS DE DADOS DATA E HORA
Nome Espaço
ocupado
Descrição
date 4 bytes Armazena a data.

formato
date
2014-02-20

time with time zone 12 bytes Armazena a hora com o fuso horário (time zone). -03 é o fuso do Brasil (horário de Brasília)
Exemplo:

formato
time with time zone
14:59:49.761-03

time without time zone

ou

time
8 bytes Armazena a hora sem fuso horário (time zone).
Exemplo:

formato
time without time zone
08:21:13.764

timestamp with time zone 8 bytes Armazena a data, hora e o fuso horário (time zone).
-03 é o fuso do Brasil (horário de Brasília)
Exemplo:

formato
timestamp with time zone
2014-02-20 14:20:56.691-03

timestamp without time zone

ou

timestamp
8 bytes Armazena a data e a hora. Não armazena o fuso horário (time zone).
Exemplo:

formato
timestamp without time zone
2014-02-20 13:25:25.255

interval 12 bytes Armazena um intervalo de tempo. O intervalo pode ser, por exemplo, 1 ano (1 year), 1 dia (1 day), 1 hora (1 hour), 1 minuto (1 minute), entre outros.
Exemplo:

formato
interval
1 hour



TIPO BOOLEANO
Nome Espaço
ocupado
Descrição
boolean 1 byte O tipo boolean possui os seguintes estados:
  • estado verdadeiro: é representado por TRUE, 't', 'true', 'y', 'yes', 'on' ou '1';
  • estado falso: representado por FALSE, 'f', 'false', 'n', 'no', 'off' ou '0';
  • estado desconhecido: unknow, representado pelo valor nulo, ou seja NULL;

Exemplo:

teste
boolean
t


Valor nulo
O valor nulo é representado pela identificação null. Significa que nenhum valor foi inserido, em outras palavras, significa ausência de valor. O valor null pode ser utilizado com qualquer tipo de dado.

Leia o artigo:

Postgresql - Criar tabela segunda parte
PostgreSql - Criar um banco de dados parte I
PostgreSql - Criar um banco de dados parte II
PostgreSql - Criar um banco de dados parte III

segunda-feira, 3 de fevereiro de 2014

Mysql - função count

O artigo apresenta 8 exemplos de como utilizar a função de agrupamento "count", das seguintes formas:
  • COUNT(*);
  • COUNT(nome_da_coluna);
  • COUNT COM GROUP BY;
  • COUNT(DISTINCT(nome_da_coluna));
Caso tenha interesse faça o download dos scripts ou veja no GitHub

Nestes exemplos, vamos utilizar a tabela "tb_ordem_servico" que armazena informações sobre ordens de serviço (solicitações de serviços). Exibimos a seguir a imagem da tabela e a descrição das colunas:


  • cod_ordem: código da ordem de serviço;
  • cod_servico: código do serviço que será prestado;
  • data_inicial: data da solicitação da ordem de serviço;
  • data_final: data de encerramento da ordem de serviço;

FUNÇÃO COUNT(*)

A função COUNT(*) retorna o número de registros (linhas) de uma tabela.

SINTAXE
SELECT COUNT(*) FROM nome_da_tabela;

1º Exemplo
Exibir quantidade de registros da tabela "tb_ordem_servico".

Solução
Para exibir a quantidade de registros, vamos executar a sentença abaixo:

SELECT COUNT(*) FROM tb_ordem_servico;

Após a execução do comando, teremos o resultado, conforme exibido na imagem a seguir:



O nome da coluna recebeu o nome da função "count". Caso seja preciso alterar o nome da coluna, por exemplo, para "quantidade", crie uma alias "apelido". Para isso coloque um AS após a função COUNT(*).

SELECT COUNT(*AS quatidade FROM tb_ordem_servico;

Após a execução do comando, o nome da coluna será exibido como "quantidade", veja a imagem abaixo:

FUNÇÃO COUNT(nome_da_coluna)


A função COUNT(nome_da_coluna) retorna o número valores de uma coluna. Valores nulos não entram na contagem.

SINTAXE

SELECT COUNT(nome_da_coluna) FROM nome_da_tabela;


2º Exemplo
Exibir a quantidade de registros onde o código do serviço seja do tipo "A".


Solução
Para fazer a contagem, executamos a sentença abaixo:

SELECT 
COUNT(cod_servico) AS quantidade
FROM tb_ordem_servico
WHERE cod_servico = 'A';

Após a execução do comando, teremos o resultado, conforme exibido na imagem a seguir:



3º Exemplo
Exibir a quantidade de ordens de serviços que já foram finalizadas. 

Solução
As ordens de serviços finalizadas são aquelas que possuem uma data de encerramento. Logo vamos utilizar a função COUNT na coluna data_final
Para fazer a contagem, executamos a sentença abaixo: 

SELECT 
COUNT(data_final) AS quantidade
FROM tb_ordem_servico;

Após a execução do comando, teremos o resultado, conforme exibido na imagem a seguir:


Observação: perceba que os valores nulos não são incluídos na contagem

4º Exemplo
Exibir a quantidade de ordens de serviços que não foram finalizadas.

Solução
As ordens de serviços não finalizadas são aquelas que ainda não possuem data de encerramento,  logo vamos fazer a contagem dos registros onde o valor a coluna "data_final" seja nulo. 

Como precisamos contar valores nulos, vamos utilizar "COUNT(*)", pois COUNT(nome_da_coluna) ignora valores nulos.


SELECT 
COUNT(*) AS quantidade
FROM tb_ordem_servico WHERE data_final IS NULL;

Após a execução do comando, teremos o resultado, conforme exibido na imagem a seguir:



5º Exemplo
Distribuição por tipo de serviço:
  • Quantidade de solicitações para o serviço "A";
  • Quantidade de solicitações para o serviço "B";
  • Quantidade de solicitações para o serviço "C";
Solução

Para exibir a distribuição por tipo de serviço vamos agrupar os dados da coluna "cod_servico" através do comando "group by".

SELECT
cod_servico,
COUNT(cod_servico) AS quantidade
FROM tb_ordem_servico 
GROUP BY cod_servico;

Após a execução do comando, teremos o resultado, conforme exibido na imagem a seguir:


6º Exemplo
Quantidade de ordens finalizadas por mês e ano (mm/aaaa):

Solução

Para exibir a distribuição por mês e ano vamos utilizar a funcão "COUNT(nome_da_coluna)" e agrupar os dados da coluna através do comando "group by". 
A coluna utilizada será a "data_final", pois indica a data de encerramento da ordem de serviço. 
A função "date_format" é utilizada para exibir a data no formato (mm/aaaa).

SELECT
CASE WHEN data_final IS NOT NULL
    THEN  date_format(data_final, '%m/%Y')
END mes_ano,
COUNT(data_final) AS qtd_os
FROM tb_ordem_servico
GROUP BY mes_ano;

Após a execução da sentença obtemos o seguite resultado.




Observação: repare que os valores nulos não entraram na contagem, pois utilizamos a função COUNT(nome_da_coluna).

Para que os valores nulos entrem na contagem vamos utilizar a função COUNT(*)

SELECT
date_format(data_final, '%m/%Y') AS mes_ano,
COUNT(*) AS qtd_os
FROM tb_ordem_servico
GROUP BY date_format(data_final, '%m/%Y');

Após a execução do comando, os valores nulos entram na contagem.





Podemos colocar a mensagem "Pendente" para indicar a quantidade de ordens de serviço que não possuem data de encerramento.

SELECT
CASE WHEN data_final IS NOT NULL
    THEN  date_format(data_final, '%m/%Y')
    ELSE 'Pendente'
END mes_ano,
COUNT(*) AS qtd_os
FROM tb_ordem_servico
GROUP BY mes_ano;

Após a execução do comando, teremos o resultado, conforme exibido na imagem a seguir:





Se não quisermos exibir a contagem de valores nulos, utilizamos um filtro no "WHERE":

SELECT
date_format(data_final, '%m/%Y') AS mes_ano,
COUNT(data_final) AS qtd_os
FROM tb_ordem_servico
WHERE data_final IS NOT NULL
GROUP BY mes_ano;

Após a execução do comando, teremos o resultado, conforme exibido na imagem a seguir:




Caso você queira ordenar por ano e mês em ordem crescente, utilize o comando "ORDER BY". 
Repare que no "ORDER BY" foi invertidos os parâmetros do date_format (destacado em azul): para ano e depois mês. Para que seja exibido primeiro os meses de 2013 e depois o meses de 2014.

SELECT
date_format(data_final, '%m/%Y') AS mes_ano,
COUNT(*) AS qtd_os_finalizadas
FROM tb_ordem_servico
WHERE data_final IS NOT NULL
GROUP BY date_format(data_final, '%m/%Y')
ORDER BY date_format(data_final, '%Y/%m');

Após executar a sentença, teremos o resultado, conforme exibido na imagem a seguir:




7º Exemplo
Quantidade de ordens finalizadas por mês e ano (mm/aaaa) e por tipo de serviço.

Solução:

Perceba que neste exemplo, estamos fazendo o agrupamento de 2 colunas. Vamos utilizar o COUNT(*) para a contagem, e o "group by" para o agrupamento.

SELECT
date_format(data_final, '%m/%Y') AS mes_ano, 
cod_servico,
COUNT(*) AS qtd_os
FROM tb_ordem_servico
WHERE data_final IS NOT NULL
GROUP BY mes_ano, cod_servico;

Após executar a sentença, teremos o resultado, conforme exibido na imagem a seguir:



Caso você queira ordenar em crescente o ano/mês e o serviço, utilize o comando "ORDER BY".

Após executar a sentença, teremos o resultado, conforme exibido na imagem a seguir:

SELECT
date_format(data_final, '%m/%Y') AS mes_ano,
cod_servico,
COUNT(*) AS qtd_os_finalizadas
FROM tb_ordem_servico
WHERE data_final IS NOT NULL
GROUP BY date_format(data_final, '%m/%Y'), cod_servico
ORDER BY date_format(data_final, '%Y/%m'), cod_servico;

Após a execução da consulta, será exibido o resultado a seguir:





FUNÇÃO COUNT(DISTINCT(nome_da_coluna))

SINTAXE

SELECT COUNT(DISTINCT(nome_da_coluna)) FROM nome_da_tabela;

Neste exemplo, vamos explicar como utilizar a função "distinct" dentro da função "count".
Utilizando a função "count" desta forma, os valores iguais só são contados uma vez.

Pareceu complicado? Veja o exemplo.

8º Exemplo

Observação: Incluímos a coluna cliente na tabela "tb_ordem_servico".

Exibir quantas empresas fizeram solicitação de ordem de serviço.



Solução:

Se observarmos a coluna "cliente" veremos que 3 empresas fizeram solicitação a "Padaria P", a  "Marcenaria M" e o "HOSPITAL H".

Para retornar o resultado através de comando SQL executamos a sentença abaixo:

SELECT COUNT(DISTINCT(cliente))  FROM tb_ordem_servico;

Após executar a sentença, teremos o resultado, conforme exibido na imagem a seguir:





Faça um comentário no final do artigo, suas sugestões ou críticas serão bem-vindas.