├── artigo_mysql_sum_soma ├── leia-me.txt ├── tb_fornecedor_codificacao_ansi.sql ├── sum_join_mysql_V2.sql └── tb_fornecedor_codificacao_utf8.sql ├── EXEMPLO - CASE WHEN ANINHADO - script postgresql.sql ├── artigo_introducao_a_jquery_seg_parte ├── img │ ├── barra_azul.png │ └── barra_laranja.png ├── css │ ├── intr_jq_seg_parte_ex_1.css │ └── intr_jq_seg_parte_ex_2.css ├── intr_jq_seg_parte_ex_1_nao_comentado.html ├── intr_jq_seg_parte_ex_1.html ├── intr_jq_seg_parte_ex_2_nao_comentado.html └── intr_jq_seg_parte_ex_2.html ├── postgresql_recursividade ├── recursividade_imagem_query_ex_1.png ├── recursividade_imagem_query_ex_2.png └── postgresql_recursividade.sql ├── artigo_copy_to ├── exemplo_2 │ ├── estoque_sc.csv │ ├── estoque_sc.txt │ ├── comando_psql_copy_to.txt │ ├── create_script_tabela_estoque.sql │ └── tabela_estoque_inserir_registros.sql └── exemplo_1 │ ├── comando_psql_copy_to.txt │ ├── estoque.csv │ ├── estoque.txt │ ├── create_script_tabela_estoque.sql │ └── tabela_estoque_inserir_registros.sql ├── artigo_comando_psql_copy ├── 2-exemplo │ ├── estoque_sc.csv │ ├── estoque_sc.txt │ ├── comando psql.txt │ └── create_script_tabela_estoque.sql └── 1_exemplo │ ├── comando psql.txt │ ├── estoque.csv │ ├── estoque.txt │ └── create_script_tabela_estoque.sql ├── README.md ├── postgresql - converter varchar campo texto para timestamp.sql ├── postgresql - converter varchar para data.sql ├── artigo_postgre_somar_dias_uteis ├── exemplo_1.sql ├── exemplo_2.sql ├── leia-me.txt ├── feriados_moveis.sql ├── exemplo_3.sql └── adiciona_dias_uteis.sql ├── artigo_postgre_funcao_min ├── leia-me.txt └── funcao_min.sql ├── artigo_postgre_funcao_max ├── leia-me.txt └── funcao_max.sql ├── artigo_postgresql_regexp_replace_cnpj └── artigo_postgresql_regexp_replace_cnpj.sql ├── artigo_postgre_funcao_substring ├── leia-me.txt └── funcao_substring.sql ├── artigo_postgre_funcao_count ├── leia-me.txt └── postgre_funcao_count.sql ├── artigo_postgre_create_table ├── leia-me.txt └── artigo_criar_tabela_parte_2.sql ├── artigo_postgre_diferenca_data ├── leia-me.txt └── postgre_diferenca_entre_datas.sql ├── artigo_postgre_extrair_parte_de_uma_data_com_extract ├── leia-me.txt └── artigo_postgre_extract.sql ├── artigo_postgre_lower_upper_initcap ├── leia-me.txt └── funcao_lower_upper_e_initcap.sql ├── artigo_postgre_funcao_char_length_e_length ├── leia-me.txt └── funcao_char_length_e_length.sql ├── artigo_postgre_mudar_nome_tabela ├── leia-me.txt └── artigo_postgre_renomear_tabela.sql ├── artigo_postgre_adicionar_intervalo_data_hora ├── leia-me.txt └── postgresql_adicionar_intervalo_data_hora.sql ├── artigo_postgre_funcao_concat_e_operador_de_concatenacao ├── leia-me.txt └── funcao_concat_e_operador_de_concatenacao.sql ├── postgresql_calcular-subtotal_total_equivalente_WITH_ROLLUP_mysql ├── leia-me.txt ├── postgresql_calcular_subtotal_total.sql └── postgres_calcular_subtotal_total_atualizacao_31-01-2014.sql ├── artigo_postgresql_funcao_lag ├── leia-me.txt └── PostgreSql - Função LAG - Diferença de tempo para uma mesma coluna.sql ├── mysql_sum_com_rollup ├── leia-me.txt ├── mysql_sum_com_rollup.sql └── mysql_sum_com_rollup_atualizacao_jan_2015.sql ├── artigo_mysql_rank_de_valores └── leia-me.txt ├── artigo_mysql_count ├── leia-me.txt └── mysql_funcao_count.sql ├── Postgresql - função RPAD.sql ├── artigo_postgresql_funcao_lpad └── lpad.sql ├── artigo_postgre_subtrair_intervalo_de_uma_data ├── leia-me.txt └── subtrair_intervalo_de_uma_data.sql ├── mysql_rank_com_filtro_202008_2000.sql ├── artigo_postgresql_regexp_replace └── artigo_postgresql_regexp_replace.sql ├── mysql_rank_com_filtro_exemplo_2_202008_2000.sql ├── artigo_postgresql_regexp_replace_cpf └── artigo_postgresql_regexp_replace_cpf.sql ├── artigo_postgre_sql_avg_media ├── tabela_tb_fornecedor.sql └── exemplos_postgre_media.sql ├── to_char_exemplo_formatacao_decimal.sql ├── artigo_postgresql_funcao_replace └── replace.sql ├── mysql_57_classificacao_rank_soma_colunas_20200823_1217.sql ├── mysql_dense_rank_mysql_80_20200823_2053.sql ├── alterar timezone postgresql - horario de verao_v2.sql ├── postgresql_somar_horas.sql ├── artigo_dense_rank └── dense_rank.sql ├── Sql Server - função concat e operador de concatenação.sql ├── artigo_oracle_calcular_total_subtotal_com_rollup └── artigo_oracle_total_subtotal_com_rollup.sql ├── copiar_dados_de_uma_tabela_para_uma_nova_tabela_no_SQL_SERVER └── Criar uma tabela no SQL SERVER a partir de uma tabela existente.sql ├── Postgresql - Função split_part └── split_part.sql ├── mysql_classificacao_rank_join_tables_20200627_1937.sql ├── sql_join_exemplo └── sql_script_inner_join_exemplo_20181116_0851.sql ├── artigo_postgre_adicionar_coluna_tabela_existente └── artigo_postgre_adicionar_coluna_tabela_existente.sql ├── artigo_mysql_diferenca_entre_datas └── artigo_mysql_diferenca_entre_datas.sql ├── postgresql └── exemplo_trigger │ └── pg_example_trigger_20191227.sql └── postgresql_funcao_para_renomear_multiplas_colunas_20200907_1543.sql /artigo_mysql_sum_soma/leia-me.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kellysc2013/dicas_sql_jquery/HEAD/artigo_mysql_sum_soma/leia-me.txt -------------------------------------------------------------------------------- /EXEMPLO - CASE WHEN ANINHADO - script postgresql.sql: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kellysc2013/dicas_sql_jquery/HEAD/EXEMPLO - CASE WHEN ANINHADO - script postgresql.sql -------------------------------------------------------------------------------- /artigo_introducao_a_jquery_seg_parte/img/barra_azul.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kellysc2013/dicas_sql_jquery/HEAD/artigo_introducao_a_jquery_seg_parte/img/barra_azul.png -------------------------------------------------------------------------------- /artigo_mysql_sum_soma/tb_fornecedor_codificacao_ansi.sql: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kellysc2013/dicas_sql_jquery/HEAD/artigo_mysql_sum_soma/tb_fornecedor_codificacao_ansi.sql -------------------------------------------------------------------------------- /artigo_introducao_a_jquery_seg_parte/img/barra_laranja.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kellysc2013/dicas_sql_jquery/HEAD/artigo_introducao_a_jquery_seg_parte/img/barra_laranja.png -------------------------------------------------------------------------------- /postgresql_recursividade/recursividade_imagem_query_ex_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kellysc2013/dicas_sql_jquery/HEAD/postgresql_recursividade/recursividade_imagem_query_ex_1.png -------------------------------------------------------------------------------- /postgresql_recursividade/recursividade_imagem_query_ex_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kellysc2013/dicas_sql_jquery/HEAD/postgresql_recursividade/recursividade_imagem_query_ex_2.png -------------------------------------------------------------------------------- /artigo_copy_to/exemplo_2/estoque_sc.csv: -------------------------------------------------------------------------------- 1 | 1;Smartphone Galaxy J7 Prime;Celular;Samsung;869.99;20 2 | 2;ASUS ZenPad 3S 10 Z500M Tablet PC;Tablet;Asus;1533.20;27 3 | 3;Vaio FIT 15 F;Notebook;Sony;2999.00;50 -------------------------------------------------------------------------------- /artigo_copy_to/exemplo_2/estoque_sc.txt: -------------------------------------------------------------------------------- 1 | 1;Smartphone Galaxy J7 Prime;Celular;Samsung;869.99;20 2 | 2;ASUS ZenPad 3S 10 Z500M Tablet PC;Tablet;Asus;1533.20;27 3 | 3;Vaio FIT 15 F;Notebook;Sony;2999.00;50 -------------------------------------------------------------------------------- /artigo_comando_psql_copy/2-exemplo/estoque_sc.csv: -------------------------------------------------------------------------------- 1 | 1;Smartphone Galaxy J7 Prime;Celular;Samsung;869.99;20 2 | 2;ASUS ZenPad 3S 10 Z500M Tablet PC;Tablet;Asus;1533.20;27 3 | 3;Vaio FIT 15 F;Notebook;Sony;2999.00;50 -------------------------------------------------------------------------------- /artigo_comando_psql_copy/2-exemplo/estoque_sc.txt: -------------------------------------------------------------------------------- 1 | 1;Smartphone Galaxy J7 Prime;Celular;Samsung;869.99;20 2 | 2;ASUS ZenPad 3S 10 Z500M Tablet PC;Tablet;Asus;1533.20;27 3 | 3;Vaio FIT 15 F;Notebook;Sony;2999.00;50 -------------------------------------------------------------------------------- /artigo_comando_psql_copy/1_exemplo/comando psql.txt: -------------------------------------------------------------------------------- 1 | psql -h 104.197.20.162 -d db_rem -U postgres 2 | \copy estoque(codigo, produto, categoria, marca, preco, quantidade) from 'C:/temp/estoque.csv' with delimiter as ';' CSV HEADER 3 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Dicas Sql & Jquery 2 | 3 | Scripts sql: postgresql, mysql, sqlserver 4 | 5 | Estes scripts são os exemplos dos artigos do blog "Dicas Sql & Jquery". 6 | O blog contém dicas de sql. 7 | 8 | http://jquerydicas.blogspot.com.br 9 | -------------------------------------------------------------------------------- /artigo_comando_psql_copy/2-exemplo/comando psql.txt: -------------------------------------------------------------------------------- 1 | psql -h 104.197.20.162 -d db_rem -U postgres 2 | \copy estoque(codigo, produto, categoria, marca, preco, quantidade) from 'C:/temp/estoque_sc.csv' with delimiter as ';' 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /artigo_copy_to/exemplo_1/comando_psql_copy_to.txt: -------------------------------------------------------------------------------- 1 | psql -h 104.197.20.162 -d db_rem -U postgres 2 | \COPY ( SELECT codigo, produto, categoria, marca, preco, quantidade FROM estoque) to 'C:/temp/estoque.csv' WITH DELIMITER AS ';' CSV HEADER 3 | -------------------------------------------------------------------------------- /artigo_copy_to/exemplo_1/estoque.csv: -------------------------------------------------------------------------------- 1 | codigo;produto;categoria;marca;preco;quantidade 2 | 1;Smartphone Galaxy J7 Prime;Celular;Samsung;869.99;20 3 | 2;ASUS ZenPad 3S 10 Z500M Tablet PC;Tablet;Asus;1533.20;27 4 | 3;Vaio FIT 15 F;Notebook;Sony;2999.00;50 -------------------------------------------------------------------------------- /artigo_copy_to/exemplo_1/estoque.txt: -------------------------------------------------------------------------------- 1 | codigo;produto;categoria;marca;preco;quantidade 2 | 1;Smartphone Galaxy J7 Prime;Celular;Samsung;869.99;20 3 | 2;ASUS ZenPad 3S 10 Z500M Tablet PC;Tablet;Asus;1533.20;27 4 | 3;Vaio FIT 15 F;Notebook;Sony;2999.00;50 -------------------------------------------------------------------------------- /artigo_copy_to/exemplo_2/comando_psql_copy_to.txt: -------------------------------------------------------------------------------- 1 | psql -h 104.197.20.162 -d db_rem -U postgres 2 | \COPY ( SELECT codigo, produto, categoria, marca, preco, quantidade FROM estoque) to 'C:/temp/estoque_sc.csv' WITH DELIMITER AS ';' 3 | 4 | 5 | -------------------------------------------------------------------------------- /artigo_comando_psql_copy/1_exemplo/estoque.csv: -------------------------------------------------------------------------------- 1 | codigo;produto;categoria;marca;preco;quantidade 2 | 1;Smartphone Galaxy J7 Prime;Celular;Samsung;869.99;20 3 | 2;ASUS ZenPad 3S 10 Z500M Tablet PC;Tablet;Asus;1533.20;27 4 | 3;Vaio FIT 15 F;Notebook;Sony;2999.00;50 -------------------------------------------------------------------------------- /artigo_comando_psql_copy/1_exemplo/estoque.txt: -------------------------------------------------------------------------------- 1 | codigo;produto;categoria;marca;preco;quantidade 2 | 1;Smartphone Galaxy J7 Prime;Celular;Samsung;869.99;20 3 | 2;ASUS ZenPad 3S 10 Z500M Tablet PC;Tablet;Asus;1533.20;27 4 | 3;Vaio FIT 15 F;Notebook;Sony;2999.00;50 -------------------------------------------------------------------------------- /artigo_copy_to/exemplo_1/create_script_tabela_estoque.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE estoque 2 | ( 3 | codigo integer, 4 | produto character varying(100) COLLATE pg_catalog."default", 5 | categoria character varying(100) COLLATE pg_catalog."default", 6 | marca character varying(100) COLLATE pg_catalog."default", 7 | preco numeric(10, 2), 8 | quantidade integer 9 | ); -------------------------------------------------------------------------------- /postgresql - converter varchar campo texto para timestamp.sql: -------------------------------------------------------------------------------- 1 | --Converter varchar para timestamp SEM TIME ZONE (sem fuso horário) 2 | SELECT to_timestamp('2018-11-02 14:35:43', 'YYYY-MM-DD hh24:mi:ss') ::timestamp without time zone 3 | 4 | --Converter varchar para timestamp COM TIME ZONE (fuso horário) 5 | SELECT to_timestamp('2018-11-02 14:35:43', 'YYYY-MM-DD hh24:mi:ss') 6 | -------------------------------------------------------------------------------- /artigo_comando_psql_copy/1_exemplo/create_script_tabela_estoque.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE estoque 2 | ( 3 | codigo integer, 4 | produto character varying(100) COLLATE pg_catalog."default", 5 | categoria character varying(100) COLLATE pg_catalog."default", 6 | marca character varying(100) COLLATE pg_catalog."default", 7 | preco numeric(10, 2), 8 | quantidade integer 9 | ); -------------------------------------------------------------------------------- /postgresql - converter varchar para data.sql: -------------------------------------------------------------------------------- 1 | --Converter varchar para data - 1º EXEMPLO 2 | SELECT to_date('02/11/2018', 'DD/MM/YYYY') AS DATA 3 | 4 | --Converter varchar para data - 2º EXEMPLO 5 | SELECT to_date('2018-11-02', 'YYYY-MM-DD') AS DATA 6 | 7 | --Converter varchar para data - 3º EXEMPLO 8 | SELECT to_date('02112018', 'DDMMYYYY') AS DATA 9 | 10 | --Converter varchar para data - 4º EXEMPLO 11 | SELECT to_date('20181102', 'YYYYMMDD') AS DATA 12 | -------------------------------------------------------------------------------- /artigo_copy_to/exemplo_2/create_script_tabela_estoque.sql: -------------------------------------------------------------------------------- 1 | /* 2 | Crie esta tabela, caso NÃO tenha criado no 1º exemplo. 3 | */ 4 | 5 | CREATE TABLE estoque 6 | ( 7 | codigo integer, 8 | produto character varying(100) COLLATE pg_catalog."default", 9 | categoria character varying(100) COLLATE pg_catalog."default", 10 | marca character varying(100) COLLATE pg_catalog."default", 11 | preco numeric(10, 2), 12 | quantidade integer 13 | ); 14 | -------------------------------------------------------------------------------- /artigo_introducao_a_jquery_seg_parte/css/intr_jq_seg_parte_ex_1.css: -------------------------------------------------------------------------------- 1 | body, p#estudo { 2 | margin: 0px; 3 | padding: 0px; 4 | } 5 | div { 6 | background-color:#F3F9FF; 7 | font-family:Arial,Helvetica,sans-serif; 8 | width:370px; 9 | height:200px; 10 | text-align:center; 11 | color:blue;; 12 | } 13 | 14 | -------------------------------------------------------------------------------- /artigo_comando_psql_copy/2-exemplo/create_script_tabela_estoque.sql: -------------------------------------------------------------------------------- 1 | /* 2 | Crie esta tabela, caso NÃO tenha criado no 1º exemplo. 3 | */ 4 | 5 | CREATE TABLE estoque 6 | ( 7 | codigo integer, 8 | produto character varying(100) COLLATE pg_catalog."default", 9 | categoria character varying(100) COLLATE pg_catalog."default", 10 | marca character varying(100) COLLATE pg_catalog."default", 11 | preco numeric(10, 2), 12 | quantidade integer 13 | ); 14 | -------------------------------------------------------------------------------- /artigo_copy_to/exemplo_1/tabela_estoque_inserir_registros.sql: -------------------------------------------------------------------------------- 1 | /*Comando para inserir multiplos registros na tabela estoque*/ 2 | INSERT INTO estoque 3 | ( 4 | codigo, 5 | produto, 6 | categoria, 7 | marca, 8 | preco, 9 | quantidade 10 | ) 11 | VALUES 12 | (1, 'Smartphone Galaxy J7 Prime', 'Celular', 'Samsung', 869.99, 20), 13 | (2, 'ASUS ZenPad 3S 10 Z500M Tablet PC', 'Tablet', 'Asus', 1533.20, 27), 14 | (3, 'Vaio FIT 15 F', 'Notebook', 'Sony', 2999.00, 50); -------------------------------------------------------------------------------- /artigo_copy_to/exemplo_2/tabela_estoque_inserir_registros.sql: -------------------------------------------------------------------------------- 1 | /*Comando para inserir multiplos registros na tabela estoque*/ 2 | INSERT INTO estoque 3 | ( 4 | codigo, 5 | produto, 6 | categoria, 7 | marca, 8 | preco, 9 | quantidade 10 | ) 11 | VALUES 12 | (1, 'Smartphone Galaxy J7 Prime', 'Celular', 'Samsung', 869.99, 20), 13 | (2, 'ASUS ZenPad 3S 10 Z500M Tablet PC', 'Tablet', 'Asus', 1533.20, 27), 14 | (3, 'Vaio FIT 15 F', 'Notebook', 'Sony', 2999.00, 50); -------------------------------------------------------------------------------- /artigo_postgre_somar_dias_uteis/exemplo_1.sql: -------------------------------------------------------------------------------- 1 | /** 2 | *1º exemplo - Adicionar 6 dias úteis a data 04/07/2014 para a cidade de São Paulo. 3 | * 4 | *Na tabela tab_cidades somente estão cadastradas as cidades de São Paulo e Rio Grande do Sul. 5 | *Caso queira utilizar esta função para outras cidades, cadastre a nova cidade na tabela tab_cidades. 6 | *Caso esta nova cidade tenha feriados municipais, cadastre seus feriados na tabela tab_feriado_municipal 7 | */ 8 | SELECT adiciona_dias_uteis('2014-07-04', 6, 1); 9 | -------------------------------------------------------------------------------- /artigo_postgre_somar_dias_uteis/exemplo_2.sql: -------------------------------------------------------------------------------- 1 | /** 2 | *2º Exemplo- Adicionar 6 dias úteis a data 04/07/2014 para a cidade de Porto Alegre. 3 | * 4 | *Na tabela tab_cidades somente estão cadastradas as cidades de São Paulo e Rio Grande do Sul. 5 | *Caso queira utilizar esta função para outras cidades, cadastre a nova cidade na tabela tab_cidades. 6 | *Caso esta nova cidade tenha feriados municipais, cadastre seus feriados na tabela tab_feriado_municipal 7 | */ 8 | SELECT adiciona_dias_uteis('2014-07-04', 6, 2); 9 | -------------------------------------------------------------------------------- /artigo_postgre_funcao_min/leia-me.txt: -------------------------------------------------------------------------------- 1 | O script "funcao_min.sql" pode ser executado através PgAdmin ou através de linha de comando utilizando o psql 2 | 3 | Descrição das opções do psql 4 | 5 | -h => nome ou ip do host. Como eu estou executando localmente na minha máquina utilizei o ip 127.0.0.1. 6 | Também poderia ter passado o nome localhost. 7 | 8 | -U => nome do usuário, no meu caso postgres. 9 | 10 | -d => nome do banco de dados, o meu banco chama-se db_teste. 11 | 12 | -f => localização do arquivo, no meu caso o arquivo está no diretório: home/kelly/Documentos/blog/funcao_min.sql 13 | 14 | Exemplo de utilização do psql 15 | 16 | psql -h 127.0.0.1 -U postgres -d db_teste -f /home/kelly/Documentos/blog/funcao_min.sql 17 | -------------------------------------------------------------------------------- /artigo_introducao_a_jquery_seg_parte/css/intr_jq_seg_parte_ex_2.css: -------------------------------------------------------------------------------- 1 | 2 | #jq_01_msg_usuario, #jq_01_msg_procedimento { 3 | padding-top:3px; 4 | padding-bottom:3px; 5 | padding-left:1px; 6 | padding-right:1px; 7 | text-align:center; 8 | width: 170px; 9 | font-family:Arial,Helvetica,sans-serif; 10 | font-size:11px; 11 | margin:0px; 12 | } 13 | 14 | #jq_01_msg_usuario { 15 | height: 250px; 16 | background: transparent url(../img/barra_azul.png) no-repeat scroll left top; 17 | } 18 | 19 | #jq_01_msg_procedimento { 20 | cursor: pointer; 21 | background: transparent url(../img/barra_laranja.png) no-repeat scroll left top; 22 | color: #004371; 23 | } 24 | 25 | p { 26 | padding-right:10px; 27 | } 28 | -------------------------------------------------------------------------------- /artigo_postgre_funcao_max/leia-me.txt: -------------------------------------------------------------------------------- 1 | 2 | O script "funcao_max.sql" pode ser executado através PgAdmin ou através de linha de comando utilizando o psql 3 | 4 | Descrição das opções do psql 5 | 6 | -h => nome ou ip do host. Como eu estou executando localmente na minha máquina utilizei o ip 127.0.0.1. 7 | Também poderia ter passado o nome localhost. 8 | 9 | -U => nome do usuário, no meu caso postgres. 10 | 11 | -d => nome do banco de dados, o meu banco chama-se db_teste. 12 | 13 | -f => localização do arquivo, no meu caso o arquivo está no diretório: home/kelly/Documentos/blog/funcao_max.sql 14 | 15 | Exemplo de utilização do psql 16 | 17 | psql -h 127.0.0.1 -U postgres -d db_teste -f /home/kelly/Documentos/blog/funcao_max.sql 18 | -------------------------------------------------------------------------------- /artigo_postgresql_regexp_replace_cnpj/artigo_postgresql_regexp_replace_cnpj.sql: -------------------------------------------------------------------------------- 1 | /** 2 | *Cria a tabela tb_cadastro 3 | */ 4 | CREATE TABLE tb_cadastro 5 | ( 6 | cnpj varchar(14), 7 | razao_social varchar(255) 8 | ); 9 | 10 | /** 11 | *Inclui os registros na tabela tb_cadastro 12 | */ 13 | INSERT INTO tb_cadastro VALUES ('29169120000107', 'A&B Sapataria Ltda'); 14 | INSERT INTO tb_cadastro VALUES ('26663604000101', 'Confecções X&Y Ltda'); 15 | 16 | /** 17 | *Exibe os registros na tabela tb_cadastro 18 | */ 19 | SELECT * FROM tb_cadastro; 20 | 21 | /** 22 | *Exemplo: formatação do CNPJ 23 | */ 24 | SELECT 25 | REGEXP_REPLACE (cnpj, '(\d{2})(\d{3})(\d{3})(\d{4})(\d{2})', '\1.\2.\3/\4-\5') AS cnpj 26 | FROM tb_cadastro; 27 | -------------------------------------------------------------------------------- /artigo_postgre_funcao_substring/leia-me.txt: -------------------------------------------------------------------------------- 1 | 2 | O script "funcao_substring.sql" pode ser executado através PgAdmin ou através de linha de comando utilizando o psql 3 | 4 | Descrição das opções do psql 5 | 6 | -h => nome ou ip do host. Como eu estou executando localmente na minha máquina utilizei o ip 127.0.0.1. Também poderia ter passado o nome localhost. 7 | 8 | -U => nome do usuário, no meu caso postgres. 9 | 10 | -d => nome do banco de dados, o meu banco chama-se db_teste. 11 | 12 | -f => localização do arquivo, no meu caso o arquivo está no diretório: home/kelly/Documentos/blog/funcao_substring.sql 13 | 14 | Exemplo de utilização do psql 15 | 16 | psql -h 127.0.0.1 -U postgres -d db_teste -f /home/kelly/Documentos/blog/funcao_substring.sql 17 | -------------------------------------------------------------------------------- /artigo_postgre_funcao_count/leia-me.txt: -------------------------------------------------------------------------------- 1 | 2 | O script "postgre_funcao_count.sql" pode ser executado através PgAdmin ou através de linha de comando utilizando o psql 3 | 4 | Descrição das opções do psql 5 | 6 | -h => nome ou ip do host. Como eu estou executando localmente na minha máquina utilizei o ip 127.0.0.1. Também poderia ter passado o nome localhost. 7 | 8 | -U => nome do usuário, no meu caso postgres. 9 | 10 | -d => nome do banco de dados, o meu banco chama-se db_teste. 11 | 12 | -f => localização do arquivo, no meu caso o arquivo está no diretório: 13 | home/kelly/Documentos/blog/postgre_funcao_count.sql 14 | 15 | Exemplo de utilização do psql 16 | 17 | psql -h 127.0.0.1 -U postgres -d db_teste -f /home/kelly/Documentos/blog/postgre_funcao_count.sql 18 | -------------------------------------------------------------------------------- /artigo_postgre_create_table/leia-me.txt: -------------------------------------------------------------------------------- 1 | 2 | O script "artigo_criar_tabela_parte_2.sql" pode ser executado através PgAdmin ou através de linha de comando utilizando o psql 3 | 4 | Descrição das opções do psql 5 | 6 | -h => nome ou ip do host. Como eu estou executando localmente na minha máquina utilizei o ip 127.0.0.1. Também poderia ter passado o nome localhost. 7 | 8 | -U => nome do usuário, no meu caso postgres. 9 | 10 | -d => nome do banco de dados, o meu banco chama-se db_teste. 11 | 12 | -f => localização do arquivo, no meu caso o arquivo está no diretório: home/kelly/Documentos/blog/artigo_criar_tabela_parte_2.sql 13 | 14 | Exemplo de utilização do psql 15 | 16 | psql -h 127.0.0.1 -U postgres -d db_teste -f /home/kelly/Documentos/blog/artigo_criar_tabela_parte_2.sql 17 | -------------------------------------------------------------------------------- /artigo_postgre_diferenca_data/leia-me.txt: -------------------------------------------------------------------------------- 1 | 2 | O script "postgre_diferenca_entre_datas.sql" pode ser executado através PgAdmin ou através de linha de comando utilizando o psql 3 | 4 | Descrição das opções do psql 5 | 6 | -h => nome ou ip do host. Como eu estou executando localmente na minha máquina utilizei o ip 127.0.0.1. Também poderia ter passado o nome localhost. 7 | 8 | -U => nome do usuário, no meu caso postgres. 9 | 10 | -d => nome do banco de dados, o meu banco chama-se db_teste. 11 | 12 | -f => localização do arquivo, no meu caso o arquivo está no diretório: home/kelly/Documentos/blog/postgre_diferenca_entre_datas.sql 13 | 14 | Exemplo de utilização do psql 15 | 16 | psql -h 127.0.0.1 -U postgres -d db_teste -f /home/kelly/Documentos/blog/postgre_diferenca_entre_datas.sql 17 | -------------------------------------------------------------------------------- /artigo_postgre_extrair_parte_de_uma_data_com_extract/leia-me.txt: -------------------------------------------------------------------------------- 1 | 2 | O script "artigo_postgre_extract.sql" pode ser executado através PgAdmin ou através de linha de comando utilizando o psql 3 | 4 | Descrição das opções do psql: 5 | 6 | -h => nome ou ip do host. Como eu estou executando localmente na minha máquina utilizei o ip 127.0.0.1. Também poderia ter passado o nome localhost. 7 | 8 | -U => nome do usuário, no meu caso postgres. 9 | 10 | -d => nome do banco de dados, o meu banco chama-se db_teste. 11 | 12 | -f => localização do arquivo, no meu caso o arquivo está no diretório: home/kelly/Documentos/blog/artigo_postgre_extract.sql 13 | 14 | Exemplo de utilização do psql 15 | 16 | psql -h 127.0.0.1 -U postgres -d db_teste -f /home/kelly/Documentos/blog/artigo_postgre_extract.sql 17 | -------------------------------------------------------------------------------- /artigo_postgre_lower_upper_initcap/leia-me.txt: -------------------------------------------------------------------------------- 1 | 2 | O script "funcao_lower_upper_e_initcap.sql" pode ser executado através PgAdmin ou através de linha de comando utilizando o psql 3 | 4 | Descrição das opções do psql 5 | 6 | -h => nome ou ip do host. Como eu estou executando localmente na minha máquina utilizei o ip 127.0.0.1. Também poderia ter passado o nome localhost. 7 | 8 | -U => nome do usuário, no meu caso postgres. 9 | 10 | -d => nome do banco de dados, o meu banco chama-se db_teste. 11 | 12 | -f => localização do arquivo, no meu caso o arquivo está no diretório: home/kelly/Documentos/blog/funcao_lower_upper_e_initcap.sql 13 | 14 | Exemplo de utilização do psql 15 | 16 | psql -h 127.0.0.1 -U postgres -d db_teste -f /home/kelly/Documentos/blog/funcao_lower_upper_e_initcap.sql 17 | -------------------------------------------------------------------------------- /artigo_postgre_funcao_char_length_e_length/leia-me.txt: -------------------------------------------------------------------------------- 1 | 2 | O script "funcao_char_length_e_length.sql" pode ser executado através PgAdmin ou através de linha de comando utilizando o psql 3 | 4 | Descrição das opções do psql 5 | 6 | -h => nome ou ip do host. Como eu estou executando localmente na minha máquina utilizei o ip 127.0.0.1. Também poderia ter passado o nome localhost. 7 | 8 | -U => nome do usuário, no meu caso postgres. 9 | 10 | -d => nome do banco de dados, o meu banco chama-se db_teste. 11 | 12 | -f => localização do arquivo, no meu caso o arquivo está no diretório: home/kelly/Documentos/blog/funcao_char_length_e_length.sql 13 | 14 | Exemplo de utilização do psql 15 | 16 | psql -h 127.0.0.1 -U postgres -d db_teste -f /home/kelly/Documentos/blog/funcao_char_length_e_length.sql 17 | -------------------------------------------------------------------------------- /artigo_postgre_mudar_nome_tabela/leia-me.txt: -------------------------------------------------------------------------------- 1 | 2 | O script "artigo_postgre_renomear_tabela.sql" pode ser executado através PgAdmin ou através de linha de comando utilizando o psql 3 | 4 | Descrição das opções do psql: 5 | 6 | -h => nome ou ip do host. Como eu estou executando localmente na minha máquina utilizei o ip 127.0.0.1. Também poderia ter passado o nome localhost. 7 | 8 | -U => nome do usuário, no meu caso postgres. 9 | 10 | -d => nome do banco de dados, o meu banco chama-se db_teste. 11 | 12 | -f => localização do arquivo, no meu caso o arquivo está no diretório: home/kelly/Documentos/blog/artigo_postgre_renomear_tabela.sql 13 | 14 | Exemplo de utilização do psql 15 | 16 | psql -h 127.0.0.1 -U postgres -d db_teste -f /home/kelly/Documentos/blog/artigo_postgre_renomear_tabela.sql 17 | -------------------------------------------------------------------------------- /artigo_postgre_adicionar_intervalo_data_hora/leia-me.txt: -------------------------------------------------------------------------------- 1 | 2 | O script "postgresql_adicionar_intervalo_data_hora.sql" pode ser executado através PgAdmin ou através de linha de comando utilizando o psql 3 | 4 | Descrição das opções do psql: 5 | 6 | -h => nome ou ip do host. Como eu estou executando localmente na minha máquina utilizei o ip 127.0.0.1. Também poderia ter passado o nome localhost. 7 | 8 | -U => nome do usuário, no meu caso postgres. 9 | 10 | -d => nome do banco de dados, o meu banco chama-se db_teste. 11 | 12 | -f => localização do arquivo, no meu caso o arquivo está no diretório: home/kelly/Documentos/blog/postgresql_adicionar_intervalo_data_hora.sql 13 | 14 | Exemplo de utilização do psql 15 | 16 | psql -h 127.0.0.1 -U postgres -d db_teste -f /home/kelly/Documentos/blog/postgresql_adicionar_intervalo_data_hora.sql 17 | -------------------------------------------------------------------------------- /artigo_postgre_funcao_concat_e_operador_de_concatenacao/leia-me.txt: -------------------------------------------------------------------------------- 1 | 2 | O script "funcao_concat_e_operador_de_concatenacao.sql" pode ser executado através PgAdmin ou através de linha de comando utilizando o psql 3 | 4 | Descrição das opções do psql 5 | 6 | -h => nome ou ip do host. Como eu estou executando localmente na minha máquina utilizei o ip 127.0.0.1. Também poderia ter passado o nome localhost. 7 | 8 | -U => nome do usuário, no meu caso postgres. 9 | 10 | -d => nome do banco de dados, o meu banco chama-se db_teste. 11 | 12 | -f => localização do arquivo, no meu caso o arquivo está no diretório: home/kelly/Documentos/blog/funcao_concat_e_operador_de_concatenacao.sql 13 | 14 | Exemplo de utilização do psql 15 | 16 | psql -h 127.0.0.1 -U postgres -d db_teste -f /home/kelly/Documentos/blog/funcao_concat_e_operador_de_concatenacao.sql 17 | -------------------------------------------------------------------------------- /postgresql_calcular-subtotal_total_equivalente_WITH_ROLLUP_mysql/leia-me.txt: -------------------------------------------------------------------------------- 1 | O script 2 | "postgresql_calcular_subtotal_total.sql" 3 | pode ser executado através PgAdmin ou através de linha de comando utilizando o psql 4 | 5 | Descrição das opções do psql 6 | 7 | -h => nome ou ip do host. Como eu estou executando localmente na minha máquina utilizei o ip 127.0.0.1. 8 | Também poderia ter passado o nome localhost. 9 | 10 | -U => nome do usuário, no meu caso postgres. 11 | 12 | -d => nome do banco de dados, o meu banco chama-se db_teste. 13 | 14 | -f => localização do arquivo, no meu caso o arquivo está no diretório: 15 | home/kelly/Documentos/blog/postgresql_calcular_subtotal_total.sql 16 | 17 | Exemplo de utilização do psql 18 | 19 | psql -h 127.0.0.1 -U postgres -d db_teste -f /home/kelly/Documentos/blog/postgresql_calcular_subtotal_total.sql 20 | -------------------------------------------------------------------------------- /artigo_postgresql_funcao_lag/leia-me.txt: -------------------------------------------------------------------------------- 1 | O script 2 | "PostgreSql - Função LAG - Diferença de tempo para uma mesma coluna.sql" 3 | pode ser executado através PgAdmin ou através de linha de comando utilizando o psql 4 | 5 | Descrição das opções do psql 6 | 7 | -h => nome ou ip do host. Como eu estou executando localmente na minha máquina utilizei o ip 127.0.0.1. 8 | Também poderia ter passado o nome localhost. 9 | 10 | -U => nome do usuário, no meu caso postgres. 11 | 12 | -d => nome do banco de dados, o meu banco chama-se db_teste. 13 | 14 | -f => localização do arquivo, no meu caso o arquivo está no diretório: 15 | home/kelly/Documentos/blog/PostgreSql - Função LAG - Diferença de tempo para uma mesma coluna.sql 16 | 17 | Exemplo de utilização do psql 18 | 19 | psql -h 127.0.0.1 -U postgres -d db_teste -f /home/kelly/Documentos/blog/PostgreSql - Função LAG - Diferença de tempo para uma mesma coluna.sql 20 | -------------------------------------------------------------------------------- /artigo_postgre_mudar_nome_tabela/artigo_postgre_renomear_tabela.sql: -------------------------------------------------------------------------------- 1 | /** 2 | *Caso queira excluir a tabela descomente os comando 3 | */ 4 | --DROP TABLE IF EXISTS tb_empregados; 5 | --DROP TABLE IF EXISTS tb_funcionarios; 6 | 7 | /** 8 | *Criação da tabela "tb_empregados". 9 | */ 10 | CREATE TABLE tb_empregados 11 | ( 12 | registro_id serial, 13 | nome character varying(255) 14 | ); 15 | 16 | /** 17 | *Inclui os registros na "tb_empregados". 18 | */ 19 | INSERT INTO tb_empregados(registro_id, nome) 20 | VALUES 21 | (DEFAULT, 'Aline Santos'), 22 | (DEFAULT, 'Carlos Silva'), 23 | (DEFAULT, 'Rodrigo Paiva'); 24 | 25 | /** 26 | *Exibe os registros na "tb_empregados". 27 | */ 28 | SELECT * FROM tb_empregados; 29 | 30 | /** 31 | *Renomear a tabela "tb_empregados" para "tb_funcionarios" 32 | */ 33 | ALTER TABLE tb_empregados RENAME TO tb_funcionarios; 34 | 35 | /** 36 | *Exibe os registros na "tb_funcionários". 37 | */ 38 | SELECT * FROM tb_funcionarios; -------------------------------------------------------------------------------- /mysql_sum_com_rollup/leia-me.txt: -------------------------------------------------------------------------------- 1 | Para acessar o mysql através da linha de comando (Linux ou Windows) utilize: 2 | 3 | mysql -u -p 4 | 5 | -u: passe o nome do seu usuário. No meu caso o usuário é root. 6 | -p: senha do usuário. Não é necessário digitar a senha depois do '-p', pressione ENTER e o sistema solicitará a senha. 7 | 8 | Exemplo: 9 | mysql -uroot -p 10 | 11 | Digite a sua senha 12 | 13 | Exemplo: 14 | Enter password: ********* 15 | 16 | Escolha o banco de dados que deseja executar o script (criar a tabela tb_fornecedor e executar as consultas) 17 | 18 | mysql>USE 19 | 20 | No meu caso o meu banco é o db_teste 21 | 22 | Exemplo: 23 | mysql>USE db_teste 24 | 25 | Após ter escolhido o banco, rode o script. Para rodar o script digite contra-barra e ponto(\. ) acompanhado de um espaço 26 | e ,em seguida, o nome do arquivo. 27 | 28 | mysql> \. 29 | 30 | Exemplo: 31 | mysql> \. D:\mysql_sum_com_rollup.sql 32 | -------------------------------------------------------------------------------- /artigo_mysql_rank_de_valores/leia-me.txt: -------------------------------------------------------------------------------- 1 | Para acessar o mysql através da linha de comando (Linux ou Windows) utilize: 2 | 3 | mysql -u -p 4 | 5 | -u: passe o nome do seu usuário. No meu caso o usuário é root. 6 | -p: senha do usuário. Não é necessário digitar a senha depois do '-p', pressione ENTER e o sistema solicitará a senha. 7 | 8 | Exemplo: 9 | mysql -uroot -p 10 | 11 | Digite a sua senha 12 | 13 | Exemplo: 14 | Enter password: ********* 15 | 16 | Escolha o banco de dados que deseja executar o script (criar a tabela tb_fornecedor e executar as consultas) 17 | 18 | mysql>USE 19 | 20 | No meu caso o meu banco é o db_teste 21 | 22 | Exemplo: 23 | mysql>USE db_teste 24 | 25 | Após ter escolhido o banco, rode o script. Para rodar o script digite contra-barra e ponto(\. ) acompanhado de um espaço 26 | e ,em seguida, o nome do arquivo. 27 | 28 | mysql> \. 29 | Exemplo: 30 | mysql> \. D:\artigo_mysql_rank_de_valores.sql 31 | -------------------------------------------------------------------------------- /artigo_introducao_a_jquery_seg_parte/intr_jq_seg_parte_ex_1_nao_comentado.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 14 | 15 | 16 |
17 |

Estou estudando jQuery!!!

18 |

Este é o primeiro exemplo!!!

19 |

Só os parágrafos serão escondidos, logo o elemento h4 permanecerá na tela

20 | 21 |
22 | 23 | 24 | -------------------------------------------------------------------------------- /artigo_mysql_count/leia-me.txt: -------------------------------------------------------------------------------- 1 | Para acessar o mysql através da linha de comando (Linux ou Windows) utilize: 2 | 3 | mysql -u -p 4 | 5 | -u: passe o nome do seu usuário. No meu caso o usuário é root. 6 | -p: senha do usuário. Não é necessário digitar a senha depois do '-p', pressione ENTER e o sistema solicitará a senha. 7 | 8 | 9 | Exemplo: 10 | mysql -uroot -p 11 | 12 | 13 | Digite a sua senha 14 | 15 | Exemplo: 16 | Enter password: ********* 17 | 18 | 19 | Escolha o banco de dados que deseja executar o script (criar a tabela tb_fornecedor e executar as consultas) 20 | 21 | mysql>USE 22 | 23 | No meu caso o meu banco é o db_teste 24 | 25 | Exemplo: 26 | mysql>USE db_teste 27 | 28 | 29 | Após ter escolhido o banco, rode o script. Para rodar o script digite contra-barra e ponto(\. ) acompanhado de um espaço 30 | e ,em seguida, o nome do arquivo. 31 | 32 | 33 | mysql> \. 34 | 35 | Exemplo Linux: 36 | mysql> \. /home/kelly/Documentos/blog/mysql_count/mysql_funcao_count.sql 37 | 38 | Exemplo Windows: 39 | mysql> \. D:\mysql_funcao_count.sql 40 | 41 | 42 | 43 | 44 | 45 | -------------------------------------------------------------------------------- /Postgresql - função RPAD.sql: -------------------------------------------------------------------------------- 1 | /* 2 | *Veja os nossos artigos em: http://jquerydicas.blogspot.com.br 3 | *Artigo: Postgresql - função RPAD 4 | *Autora: Kelly Silva Costa 5 | */ 6 | 7 | /* 8 | *Criação da tabela tb_produto 9 | */ 10 | CREATE TABLE tb_produto 11 | ( 12 | codigo_produto integer, 13 | nome_produto varchar(255) 14 | ); 15 | 16 | /* 17 | *Inserir registros na tabela tb_produto 18 | */ 19 | INSERT INTO tb_produto VALUES 20 | (438, 'lápis'), 21 | (8426, 'caderno'), 22 | (22, 'borracha'), 23 | (16547, 'cartolina'); 24 | 25 | /* 26 | *Visualizar a tabela tb_produto 27 | */ 28 | SELECT codigo_produto, nome_produto FROM tb_produto; 29 | 30 | --1º Exemplo 31 | 32 | /* 33 | *Completar com o asterisco ('*') a direita dos nomes dos produtos até a 10ª posição. 34 | */ 35 | SELECT 36 | nome_produto, 37 | RPAD (nome_produto,10, '*') AS nome_produto_com_asterisco 38 | FROM tb_produto; 39 | 40 | --2º Exemplo 41 | /* 42 | *Preencher com zeros "0" a direita, até a 5ª posição, os códigos dos produtos. 43 | */ 44 | SELECT 45 | RPAD (CAST(codigo_produto AS VARCHAR), 5, '*') AS codigo_produto, 46 | nome_produto 47 | FROM tb_produto; 48 | -------------------------------------------------------------------------------- /artigo_postgresql_funcao_lpad/lpad.sql: -------------------------------------------------------------------------------- 1 | /* 2 | *Veja os nossos artigos em: http://jquerydicas.blogspot.com.br 3 | *Artigo: Postgresql - função LPAD 4 | *Autora: Kelly Silva Costa 5 | */ 6 | 7 | 8 | /* 9 | *Criação da tabela tb_produto 10 | */ 11 | CREATE TABLE tb_produto 12 | 13 | ( 14 | codigo_produto integer, 15 | nome_produto character varying(255) 16 | ); 17 | 18 | /* 19 | *Inserir registros na tabela tb_produto 20 | */ 21 | INSERT INTO tb_produto VALUES 22 | (438, 'lápis'), 23 | (8426, 'caderno'), 24 | (22, 'borracha'), 25 | (16547, 'cartolina'); 26 | 27 | /* 28 | *Visualizar a tabela tb_produto 29 | */ 30 | SELECT codigo_produto, nome_produto FROM tb_produto; 31 | 32 | --1º Exemplo 33 | 34 | /* 35 | *Completar com o hifen ('-') a esquerda dos nomes dos produtos até a 10ª posição. 36 | */ 37 | SELECT 38 | nome_produto, 39 | LPAD(nome_produto,10, '-') AS nome_produto_com_hifen 40 | FROM tb_produto; 41 | 42 | 43 | --2º Exemplo 44 | /* 45 | *Preencher com zeros "0" a esquerda, até a 5ª posição, os códigos dos produtos. 46 | */ 47 | SELECT 48 | LPAD(CAST(codigo_produto AS CHARACTER VARYING), 5, '0') AS codigo_produto, 49 | nome_produto 50 | FROM tb_produto; 51 | -------------------------------------------------------------------------------- /artigo_postgre_subtrair_intervalo_de_uma_data/leia-me.txt: -------------------------------------------------------------------------------- 1 | 2 | O script "subtrair_intervalo_de_uma_data.sql" pode ser executado através PgAdmin ou através de linha de comando utilizando o psql 3 | Descrição das opções do psql: 4 | 5 | -h => nome ou ip do host. Como eu estou executando localmente na minha máquina utilizei o ip 127.0.0.1. Também poderia ter passado o nome localhost. 6 | 7 | -U => nome do usuário, no meu caso postgres. 8 | 9 | -d => nome do banco de dados, o meu banco chama-se db_teste. 10 | 11 | -f => localização do arquivo, no meu caso o arquivo está no diretório: 12 | 13 | NO LINUX 14 | 15 | home/kelly/Documentos/blog/subtrair_intervalo_de_uma_data.sql 16 | 17 | NO WINDOWS 18 | 19 | D:\script_postgre\subtrair_intervalo_de_uma_data.sql 20 | 21 | 22 | Exemplo de utilização do psql no LINUX: 23 | 24 | psql -h 127.0.0.1 -U postgres -d db_teste -f /home/kelly/Documentos/blog/subtrair_intervalo_de_uma_data.sql 25 | 26 | Exemplo de utilização do psql no WINDOWS: 27 | 28 | psql -h 127.0.0.1 -U postgres -d db_teste -f D:\script_postgre\subtrair_intervalo_de_uma_data.sql 29 | 30 | O artigo que contém o script se encontra em: https://jquerydicas.blogspot.com/2014/04/subtrair-intervalo-de-uma-data.html 31 | -------------------------------------------------------------------------------- /artigo_introducao_a_jquery_seg_parte/intr_jq_seg_parte_ex_1.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 21 | 22 | 23 |
24 |

Estou estudando jQuery!!!

25 |

Este é o primeiro exemplo!!!

26 |

Só os parágrafos serão escondidos, logo o elemento h4 permanecerá na tela

27 | 28 |
29 | 30 | 31 | -------------------------------------------------------------------------------- /artigo_introducao_a_jquery_seg_parte/intr_jq_seg_parte_ex_2_nao_comentado.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 20 | 21 | 22 |
Clique aqui para esconder a mensagem!
23 |
24 |

Veja como podemos utilizar a biblioteca jquery!!!

25 |
26 | 27 | 28 | -------------------------------------------------------------------------------- /mysql_rank_com_filtro_202008_2000.sql: -------------------------------------------------------------------------------- 1 | /*Rank com filtro no mysql 8*/ 2 | SELECT * FROM 3 | ( 4 | SELECT 5 | DENSE_RANK() OVER(ORDER BY tb_classificacao.total_pontos DESC) AS classificacao, 6 | tb_classificacao.time_codigo, 7 | tb_classificacao.time_nome, 8 | tb_classificacao.total_pontos 9 | FROM 10 | ( 11 | SELECT 12 | time_codigo, 13 | time_nome, 14 | SUM(pontos_jogo) AS total_pontos 15 | FROM tb_classificacao 16 | GROUP BY 17 | time_codigo, time_nome 18 | ) tb_classificacao 19 | ) filtro 20 | WHERE filtro.classificacao = 5 21 | 22 | 23 | 24 | /*Rank com filtro no mysql 5*/ 25 | SELECT * FROM 26 | ( 27 | SELECT 28 | @posicao:= 29 | CASE 30 | WHEN (@total_pontos = IFNULL(pontos_jogo_1, 0) + IFNULL(pontos_jogo_2, 0) + IFNULL(pontos_jogo_3, 0)) 31 | THEN @posicao 32 | ELSE @posicao + 1 33 | END 34 | AS classificacao, 35 | time_codigo, 36 | time_nome, 37 | @total_pontos:= IFNULL(pontos_jogo_1, 0) + IFNULL(pontos_jogo_2, 0) + IFNULL(pontos_jogo_3, 0) 38 | AS total_pontos 39 | FROM 40 | (SELECT @posicao := 0, @total_pontos) classificacao 41 | CROSS JOIN tb_classificacao 42 | ORDER BY 43 | IFNULL(pontos_jogo_1, 0) + IFNULL(pontos_jogo_2, 0) + IFNULL(pontos_jogo_3, 0) DESC, 44 | time_nome DESC 45 | )rn WHERE rn.classificacao = 5; 46 | 47 | -------------------------------------------------------------------------------- /artigo_postgresql_regexp_replace/artigo_postgresql_regexp_replace.sql: -------------------------------------------------------------------------------- 1 | /** 2 | *Atenção!!! Descomente o comando "DROP" (próxima linha), somente se precisar apagar a tabela tb_endereço 3 | *DROP TABLE tb_endereco 4 | */ 5 | 6 | /** 7 | *Cria a tabela tb_endereco 8 | */ 9 | CREATE TABLE tb_endereco 10 | ( endereco varchar(255), 11 | cep varchar(8) 12 | ); 13 | 14 | /** 15 | *Insere os registros na tabela tb_endereco 16 | */ 17 | INSERT INTO tb_endereco VALUES ('RUA DA PAZ', '04954123'); 18 | INSERT INTO tb_endereco VALUES('AVENIDA PAULISTA', '04312222'); 19 | 20 | /** 21 | *Exibe os registros da tabela tb_endereco 22 | */ 23 | SELECT * FROM tb_endereco; 24 | 25 | /** 26 | *1º exemplo - Formatar a coluna CEP da tabela tb_endereco 27 | */ 28 | SELECT 29 | endereco, 30 | REGEXP_REPLACE (cep, '([0-9]{5})([0-9]{3})', '\1-\2') as cep 31 | FROM 32 | tb_endereco; 33 | 34 | /** 35 | *2º exemplo - Também formata a coluna CEP, mas utiliza a expressão [:digit:] ao invés de [0-9] 36 | */ 37 | SELECT 38 | endereco, 39 | regexp_replace(cep,'([[:digit:]]{5})([[:digit:]]{3})','\1-\2') as cep 40 | FROM 41 | tb_endereco; 42 | 43 | /** 44 | *3º exemplo 45 | *Para facilitar, podemos substituir a expressão "[[:digit:]]" que indica a utilização 46 | *de caracteres numéricos de 0 até 9, 47 | *pela expressão abreviada "\d". O resultado será o mesmo. 48 | */ 49 | SELECT REGEXP_REPLACE (cep, '(\d{5})(\d{3})', '\1-\2') AS cep 50 | FROM tb_endereco; 51 | 52 | -------------------------------------------------------------------------------- /mysql_rank_com_filtro_exemplo_2_202008_2000.sql: -------------------------------------------------------------------------------- 1 | /*Exemplo de rank com filtro mysql 8 e 5*/ 2 | 3 | /*No mysql 8, filtrar o time com o código = 2480*/ 4 | SELECT * FROM 5 | ( 6 | SELECT 7 | DENSE_RANK() OVER(ORDER BY tb_classificacao.total_pontos DESC) AS classificacao, 8 | tb_classificacao.time_codigo, 9 | tb_classificacao.time_nome, 10 | tb_classificacao.total_pontos 11 | FROM 12 | ( 13 | SELECT 14 | time_codigo, 15 | time_nome, 16 | SUM(pontos_jogo) AS total_pontos 17 | FROM tb_classificacao 18 | GROUP BY 19 | time_codigo, time_nome 20 | ) tb_classificacao 21 | ) filtro 22 | WHERE filtro.time_codigo = 2480; 23 | 24 | /*No mysql 5, filtrar o time com o código = 2480*/ 25 | /* 26 | *EXEMPLO - Exibir a classificação dos times. 27 | */ 28 | SELECT * FROM 29 | ( 30 | SELECT 31 | @posicao:= 32 | CASE 33 | WHEN (@total_pontos = IFNULL(pontos_jogo_1, 0) + IFNULL(pontos_jogo_2, 0) + IFNULL(pontos_jogo_3, 0)) 34 | THEN @posicao 35 | ELSE @posicao + 1 36 | END 37 | AS classificacao, 38 | time_codigo, 39 | time_nome, 40 | @total_pontos:= IFNULL(pontos_jogo_1, 0) + IFNULL(pontos_jogo_2, 0) + IFNULL(pontos_jogo_3, 0) 41 | AS total_pontos 42 | FROM 43 | (SELECT @posicao := 0, @total_pontos) classificacao 44 | CROSS JOIN tb_classificacao 45 | ORDER BY 46 | IFNULL(pontos_jogo_1, 0) + IFNULL(pontos_jogo_2, 0) + IFNULL(pontos_jogo_3, 0) DESC, 47 | time_nome DESC 48 | )rn WHERE rn.time_codigo = 2480; -------------------------------------------------------------------------------- /artigo_postgresql_regexp_replace_cpf/artigo_postgresql_regexp_replace_cpf.sql: -------------------------------------------------------------------------------- 1 | /** 2 | *Exclui a tabela "tb_alunos" (descomente somente se precisar excluir a tabela "tb_alunos") 3 | *DROP TABLE tb_alunos; 4 | */ 5 | 6 | /** 7 | *Cria a tabela "tb_alunos" 8 | */ 9 | CREATE TABLE tb_alunos 10 | ( 11 | cpf varchar(11), 12 | nome varchar(255) 13 | ); 14 | 15 | /** 16 | *Insere a tabela "tb_alunos" 17 | */ 18 | INSERT INTO tb_alunos VALUES ('15425714587', 'Carlos Andrade'); 19 | INSERT INTO tb_alunos VALUES ('59212347812', 'Ana Oliveira'); 20 | 21 | /** 22 | *Exibe a tabela "tb_alunos" 23 | */ 24 | SELECT * FROM tb_alunos; 25 | 26 | /** 27 | *1 º exemplo: como formatar CEP 28 | */ 29 | SELECT 30 | regexp_replace(cpf,'([0-9]{3})([0-9]{3})([0-9]{3})([0-9]{2})','\1.\2.\3-\4') AS CEP 31 | FROM tb_alunos; 32 | 33 | /** 34 | *2 º exemplo: como formatar CEP 35 | *Substituindo a expressão "0-9" que indica a utilização de caracteres numéricos de 0 até 9, 36 | *pela expressão [:digit:]. O resultado será o mesmo. 37 | */ 38 | SELECT 39 | REGEXP_REPLACE (cpf, '([[:digit:]]{3})([[:digit:]]{3})([[:digit:]]{3})([[:digit:]]{2})', '\1.\2.\3-\4') AS cpf 40 | FROM tb_alunos; 41 | 42 | /** 43 | *3º exemplo 44 | *Para facilitar, podemos substituir a expressão "[[:digit:]]" que indica a utilização 45 | *de caracteres numéricos de 0 até 9, 46 | *pela expressão abreviada "\d". O resultado será o mesmo. 47 | */ 48 | SELECT 49 | REGEXP_REPLACE (cpf, '(\d{3})(\d{3})(\d{3})(\d{2})', '\1.\2.\3-\4') AS cpf 50 | FROM tb_alunos; 51 | -------------------------------------------------------------------------------- /artigo_postgre_sql_avg_media/tabela_tb_fornecedor.sql: -------------------------------------------------------------------------------- 1 | /** 2 | *Cria a tabela tb_fornecedor. 3 | */ 4 | CREATE TABLE tb_fornecedor 5 | ( 6 | produto character varying(70), 7 | segmento character varying(70), 8 | data date, 9 | valor numeric 10 | ); 11 | 12 | 13 | /** 14 | *Inclui os dados na tabela tb_fornecedor. 15 | */ 16 | INSERT INTO tb_fornecedor VALUES('DVD', 'Papelaria e informática', '2013-09-12', 2.00); 17 | INSERT INTO tb_fornecedor VALUES('HD 500 GB', 'Papelaria e informática', '2013-10-20', 300.00); 18 | INSERT INTO tb_fornecedor VALUES('Tonner', 'Papelaria e informática', '2013-11-01', 250.00); 19 | INSERT INTO tb_fornecedor VALUES('Cadeira', 'Marcenaria', '2013-09-19', 50.00); 20 | INSERT INTO tb_fornecedor VALUES('Mesa', 'Marcenaria', '2013-10-21', 600.00); 21 | INSERT INTO tb_fornecedor VALUES('Armário', 'Marcenaria', '2013-11-02', 900.00); 22 | INSERT INTO tb_fornecedor VALUES('Corrimão', 'Serralheria', '2013-09-12', 400.00); 23 | INSERT INTO tb_fornecedor VALUES('Portão', 'Serralheria', '2013-10-22', 1500.00); 24 | INSERT INTO tb_fornecedor VALUES('Grade de proteção para janela', 'Serralheria', '2013-11-03', 800.00); 25 | INSERT INTO tb_fornecedor VALUES('Detergente', 'Limpeza e higiêne', '2013-09-20', 5.00); 26 | INSERT INTO tb_fornecedor VALUES('Desinfetante', 'Limpeza e higiêne', '2013-11-23', 40.00); 27 | INSERT INTO tb_fornecedor VALUES('Papel toalha', 'Limpeza e higiêne', '2013-11-04', 60.00); 28 | 29 | /** 30 | *Exibe os dados da tabela tb_fornecedor. 31 | */ 32 | SELECT * FROM tb_fornecedor; 33 | -------------------------------------------------------------------------------- /to_char_exemplo_formatacao_decimal.sql: -------------------------------------------------------------------------------- 1 | --ANTES DE UTILIZAR A FUNÇÃO "TO_CHAR" VERIFIQUE A CONFIGURAÇÃO DOS VALORES NUMÉRICOS NO POSTGRESQL COM O COMANDO ABAIXO: 2 | 3 | SHOW LC_NUMERIC; 4 | 5 | --Exemplo de retorno da consulta acima 6 | --"Portuguese_Brazil.1252" 7 | 8 | --Observações: 9 | --Para inserir números decimais em uma tabela utilize o tipo de dado numeric. 10 | --Deve-se utilizar o "." como separador decimal no momento da inclusão dos dados. 11 | --Para visualizar o decimal com virgula "," ao executar o comando "SELECT", formate o valor com a função to_char 12 | 13 | --1º) Criação da tabela para teste 14 | CREATE TABLE teste_numerico 15 | ( 16 | num_dec numeric(20,2) null, -- 18 casas reservadas para inteiro e 2 casas reservadas para decimal 17 | num_s_int smallint null, 18 | num_i_int integer null, 19 | num_b_int bigint null 20 | ); 21 | 22 | --2º) Inclusão dos registros 23 | INSERT INTO teste_numerico VALUES 24 | (12323.39, 764, 2474836, 92372036854775800), 25 | (13.24, 2765, -21473622,-92233036854775801), 26 | (123456789.3, -32766, 214743623,92233725802), 27 | (-443456789123456789.8, 32767, 2147483624, -123456789123456789); 28 | 29 | --3º) Consulta com dados formatados 30 | SELECT 31 | num_dec, 32 | to_char(num_dec, 'FM999G999G999G999G999G999D00') AS num_dec_formatado, 33 | num_s_int, 34 | to_char(num_s_int, 'FM99G999') AS num_s_int_formatado, 35 | num_i_int, 36 | to_char(num_i_int, 'FM9G999G999G999') AS num_i_int_formatado, 37 | num_b_int, 38 | to_char(num_b_int, 'FM9G999G999G999G999G999G999') AS num_b_int_formatado 39 | FROM teste_numerico; -------------------------------------------------------------------------------- /artigo_postgresql_funcao_replace/replace.sql: -------------------------------------------------------------------------------- 1 | /** 2 | *Criação da tabela tb_veiculo 3 | */ 4 | CREATE TABLE tb_veiculo 5 | ( 6 | modelo_veiculo character varying(25) 7 | ); 8 | 9 | /** 10 | *Incluir registros na tabela tb_veiculo 11 | */ 12 | INSERT INTO tb_veiculo VALUES 13 | ('GM/AUTO ARTE COLUMBA'), 14 | ('GM/CHEVR.D 20 CUSTOM L'), 15 | ('VW/BMB 31.230 CNC 8X4'), 16 | ('VW/BMB 31.320 CLC CM'); 17 | 18 | 19 | /** 20 | *Criação da tabela tb_mensagem 21 | */ 22 | CREATE TABLE tb_mensagem 23 | ( 24 | data date, 25 | mensagem character varying(100) 26 | ); 27 | 28 | /** 29 | *Incluir registros na tabela tb_mensagem 30 | */ 31 | INSERT INTO tb_mensagem VALUES ('2014-09-07','Filho de gato é gatinho'); 32 | 33 | 34 | /** 35 | *Exibir os registros da tabela tb_veiculo 36 | */ 37 | SELECT modelo_veiculo FROM tb_veiculo; 38 | 39 | 40 | /** 41 | *Exibir os registros da tabela tb_veiculo 42 | */ 43 | SELECT mensagem FROM tb_mensagem; 44 | 45 | 46 | --1º EXEMPLO 47 | /** 48 | *Substituir VW por Wolkswagen 49 | */ 50 | SELECT 51 | modelo_veiculo, 52 | REPLACE(modelo_veiculo, 'VW', 'Wolkswagen') AS substituicao 53 | FROM tb_veiculo; 54 | 55 | --2º EXEMPLO 56 | /** 57 | *Substituir VW por Wolkswagen e GM por General Motors 58 | */ 59 | 60 | SELECT 61 | modelo_veiculo, 62 | CASE 63 | WHEN (modelo_veiculo LIKE '%VW%') 64 | 65 | THEN REPLACE(modelo_veiculo, 'VW', 'Wolkswagen') 66 | WHEN (modelo_veiculo LIKE '%GM%') 67 | 68 | THEN REPLACE(modelo_veiculo, 'GM', 'General Motors') 69 | END AS substituicao 70 | FROM tb_veiculo; 71 | 72 | --3º EXEMPLO 73 | /** 74 | *Substituir o caractere "o" pelo caractere "a" de uma mensagem 75 | */ 76 | SELECT 77 | data, 78 | mensagem, 79 | REPLACE(mensagem, 'o', 'a') AS nova_mensagem 80 | FROM tb_mensagem; 81 | -------------------------------------------------------------------------------- /artigo_postgre_somar_dias_uteis/leia-me.txt: -------------------------------------------------------------------------------- 1 | 2 | Os scripts listados abaixo podem ser executado através PgAdmin ou através de linha de comando utilizando o psql 3 | 4 | 5 | *cria_tab_feriados_est_cid.sql: para criar as tabelas tab_feriado_federal, tab_feriado_estadual, tab_feriado_municipal, tab_cidades, tab_estados que são necessárias para executar os exemplos; 6 | 7 | *feriados_moveis.sql: cria a função feriados_moveis que calcula feriados sem data fixa. A função "feriados_moveis" é utilizada pela função "adiciona_dias_uteis"; 8 | 9 | *adiciona_dias_uteis.sql: cria a função que adicionará dias úteis a uma data; 10 | 11 | *exemplo_1.sql, exemplo_2.sql e exemplo_3.sql: scripts dos exemplos 1, 2 e 3 respectivamente. 12 | 13 | 14 | Descrição das opções do psql: 15 | 16 | -h => nome ou ip do host. Como eu estou executando localmente na minha máquina utilizei o ip 127.0.0.1. Também poderia ter passado o nome localhost. 17 | 18 | -U => nome do usuário, no meu caso postgres. 19 | 20 | -d => nome do banco de dados, o meu banco chama-se db_teste. 21 | 22 | -f => localização do arquivo, no meu caso os arquivos estão no diretório: home/kelly/Documentos/blog/ 23 | 24 | Exemplo de utilização do psql 25 | 26 | psql -h 127.0.0.1 -U postgres -d db_teste -f /home/kelly/Documentos/blog/cria_tab_feriados_est_cid.sql 27 | 28 | psql -h 127.0.0.1 -U postgres -d db_teste -f /home/kelly/Documentos/blog/feriados_moveis.sql 29 | 30 | psql -h 127.0.0.1 -U postgres -d db_teste -f /home/kelly/Documentos/blog/adiciona_dias_uteis.sql 31 | 32 | psql -h 127.0.0.1 -U postgres -d db_teste -f /home/kelly/Documentos/blog/exemplo_1.sql 33 | 34 | psql -h 127.0.0.1 -U postgres -d db_teste -f /home/kelly/Documentos/blog/exemplo_2.sql 35 | 36 | psql -h 127.0.0.1 -U postgres -d db_teste -f /home/kelly/Documentos/blog/exemplo_3.sql 37 | -------------------------------------------------------------------------------- /mysql_57_classificacao_rank_soma_colunas_20200823_1217.sql: -------------------------------------------------------------------------------- 1 | /* 2 | *Cria a tabela "tb_classificacao" 3 | */ 4 | CREATE TABLE tb_classificacao 5 | ( 6 | time_codigo integer not null, 7 | time_nome varchar(255) not null, 8 | pontos_jogo_1 integer not null, 9 | pontos_jogo_2 integer not null, 10 | pontos_jogo_3 integer not null, 11 | CONSTRAINT pk_inscricao PRIMARY KEY(time_codigo) 12 | ); 13 | 14 | /* 15 | *Inclusão dos registros na tabela "tb_classificacao" 16 | */ 17 | INSERT INTO tb_classificacao VALUES 18 | (2479, 'A', 0,1,3), 19 | (2480, 'A', 0,1,3), 20 | (2481, 'B', 3,0,1), 21 | (2482, 'C', 0,1,3), 22 | (2483, 'D', 0,0,1), 23 | (2484, 'E', 1,1,1), 24 | (2485, 'F', 3,1,3), 25 | (2489, 'G', 3,3,3), 26 | (2490, 'H', 0,0,0), 27 | (2495, 'I', 0,0,3), 28 | (2496, 'J', 1,1,3); 29 | 30 | /* 31 | *EXEMPLO - Exibir a classificação dos times. 32 | *Observação: use a função "IFNULL" caso uma das colunas permita 33 | *dado nulo (coluna null). 34 | *A função IFNULL substitui "nulo" por "0" zero. 35 | *Se ao somar colunas o valor de pelo menos uma delas for nulo 36 | *o resultado será nulo e não é esse o resultado esperado. 37 | */ 38 | SELECT 39 | @posicao:= 40 | CASE 41 | WHEN (@total_pontos = IFNULL(pontos_jogo_1, 0) + IFNULL(pontos_jogo_2, 0) + IFNULL(pontos_jogo_3, 0)) 42 | THEN @posicao 43 | ELSE @posicao + 1 44 | END 45 | AS classificacao, 46 | time_codigo, 47 | time_nome, 48 | @total_pontos:= IFNULL(pontos_jogo_1, 0) + IFNULL(pontos_jogo_2, 0) + IFNULL(pontos_jogo_3, 0) 49 | AS total_pontos 50 | FROM 51 | (SELECT @posicao := 0, @total_pontos) classificacao 52 | CROSS JOIN tb_classificacao 53 | ORDER BY 54 | IFNULL(pontos_jogo_1, 0) + IFNULL(pontos_jogo_2, 0) + IFNULL(pontos_jogo_3, 0) DESC, 55 | time_nome DESC; 56 | -------------------------------------------------------------------------------- /mysql_dense_rank_mysql_80_20200823_2053.sql: -------------------------------------------------------------------------------- 1 | /* 2 | Este exemplo mostra como exibir o rank de dados(classificação) no mysql 8.0 3 | Utiliza a window function dense_rank 4 | */ 5 | 6 | /* 7 | *Cria a tabela "tb_classificacao" 8 | */ 9 | CREATE TABLE tb_classificacao 10 | ( 11 | time_codigo integer not null, 12 | time_nome varchar(255) not null, 13 | pontos_jogo integer not null 14 | ); 15 | 16 | /* 17 | *Inclusão dos registros na tabela "tb_classificacao" 18 | */ 19 | INSERT INTO tb_classificacao VALUES 20 | (2479, 'A', 0), 21 | (2480, 'B', 1), 22 | (2482, 'C', 0), 23 | (2483, 'D', 0), 24 | (2484, 'E', 1), 25 | (2485, 'F', 3), 26 | (2489, 'G', 3), 27 | (2490, 'H', 0), 28 | (2491, 'I', 0), 29 | (2492, 'J', 3), 30 | 31 | (2479, 'A', 3), 32 | (2480, 'B', 0), 33 | (2482, 'C', 1), 34 | (2483, 'D', 3), 35 | (2484, 'E', 0), 36 | (2485, 'F', 1), 37 | (2489, 'G', 0), 38 | (2490, 'H', 3), 39 | (2491, 'I', 1), 40 | (2492, 'J', 3), 41 | 42 | 43 | (2479, 'A', 0), 44 | (2480, 'B', 1), 45 | (2482, 'C', 0), 46 | (2483, 'D', 0), 47 | (2484, 'E', 1), 48 | (2485, 'F', 3), 49 | (2489, 'G', 3), 50 | (2490, 'H', 0), 51 | (2491, 'I', 0), 52 | (2492, 'J', 3); 53 | 54 | 55 | /* 56 | *Exibe registros da tabela "tb_classificacao" 57 | */ 58 | SELECT * FROM tb_classificacao; 59 | 60 | 61 | 62 | /* 63 | *Exibe a classificação dos times de acordo com os pontos (rank) 64 | */ 65 | SELECT 66 | DENSE_RANK() OVER(ORDER BY tb_classificacao.total_pontos DESC) AS classificacao, 67 | tb_classificacao.time_codigo, 68 | tb_classificacao.time_nome, 69 | tb_classificacao.total_pontos 70 | FROM 71 | ( 72 | SELECT 73 | time_codigo, 74 | time_nome, 75 | SUM(pontos_jogo) AS total_pontos 76 | FROM tb_classificacao 77 | GROUP BY 78 | time_codigo, time_nome 79 | ) tb_classificacao; 80 | ORDER BY tb_classificacao.time_nome 81 | 82 | 83 | 84 | 85 | 86 | -------------------------------------------------------------------------------- /alterar timezone postgresql - horario de verao_v2.sql: -------------------------------------------------------------------------------- 1 | --Alterar timezone no postgresql 2 | 3 | --1ª Etapa) Selecionar timezone atual e o diretório do arquivo de configuração "postgresql.conf". 4 | 5 | SELECT name, reset_val, sourcefile FROM pg_settings WHERE name = 'TimeZone'; 6 | 7 | name | reset_val | sourcefile 8 | ----------+-------------------+------------------------------------- 9 | TimeZone | America/Araguaina | D:/postgre_dados_96/postgresql.conf 10 | 11 | 12 | --2ª Etapa) Verificar todos os nomes de timezone disponiveis no postgresql 13 | 14 | SELECT * FROM pg_timezone_names 15 | 16 | --3ª Etapa) Escolher o nome do novo timezone, neste caso foi escolhido "America/Sao_Paulo" 17 | 18 | name 19 | ------------------- 20 | America/Sao_Paulo 21 | 22 | 23 | --3ª Etapa) Abrir o arquivo postgresql.conf que foi retornado na 1ª consulta 24 | 25 | --Neste exemplo é: 26 | --D:/postgre_dados_96/postgresql.conf 27 | 28 | --4ª Etapa) Alterar os parametro do arquivo "timezone" e "log_timezone", em seguida, salve o arquivo. 29 | 30 | timezone = 'America/Sao_Paulo' 31 | log_timezone = 'America/Sao_Paulo' 32 | 33 | --5ª Etapa) Reiniciar o servico do postgresql. Veja a seguir o procedimento no windows e no linux. 34 | 35 | /* 36 | 37 | --No windows 38 | 39 | Executar o prompt de comando do Windows como administrador. 40 | 41 | Exemplo para reiniciar o servico do postgresql 9.6 42 | 43 | Executar o seguinte comando 44 | 45 | net stop postgresql-x64-9.6 && net start postgresql-x64-9.6 46 | 47 | Caso não saiba o nome do servico execute o comando abaixo para retornar o nome do servico 48 | 49 | sc queryex type= service state= all | find /i "Postgresql" 50 | 51 | 52 | --No linux 53 | Executar o comando no terminal do Linux (debian) 54 | 55 | sudo service postgresql restart 56 | OU 57 | /etc/init.d/postgresql restart 58 | 59 | Caso não saiba o nome do servico execute o comando abaixo para retornar o nome do servico 60 | 61 | ls /etc/init.d/ 62 | 63 | 64 | */ 65 | 66 | -------------------------------------------------------------------------------- /postgresql_somar_horas.sql: -------------------------------------------------------------------------------- 1 | /** 2 | *ATENÇÃO!!! PARA EXCLUIR A TABELA tb_folha_ponto, DESCOMENTE A LINHA ABAIXO 3 | */ 4 | --DROP TABLE tb_folha_ponto; 5 | 6 | 7 | /** 8 | *Criar a tabela "tb_folha_ponto". 9 | */ 10 | 11 | CREATE TABLE tb_folha_ponto 12 | ( 13 | id serial, 14 | data_inicio timestamp without time zone, 15 | data_saida timestamp without time zone 16 | ); 17 | 18 | /** 19 | *Incluir os registros na tabela "tb_folha_ponto". 20 | */ 21 | INSERT INTO tb_folha_ponto(id, data_inicio, data_saida) VALUES(DEFAULT, '2018-10-01 18:00', '2018-10-02 02:00'); 22 | INSERT INTO tb_folha_ponto(id, data_inicio, data_saida) VALUES(DEFAULT, '2018-10-02 19:00', '2018-10-03 03:00'); 23 | INSERT INTO tb_folha_ponto(id, data_inicio, data_saida) VALUES(DEFAULT, '2018-10-03 20:00', '2018-10-04 04:00'); 24 | INSERT INTO tb_folha_ponto(id, data_inicio, data_saida) VALUES(DEFAULT, '2018-10-04 21:00', '2018-10-05 05:00'); 25 | INSERT INTO tb_folha_ponto(id, data_inicio, data_saida) VALUES(DEFAULT, '2018-10-05 22:00', '2018-10-06 06:00'); 26 | INSERT INTO tb_folha_ponto(id, data_inicio, data_saida) VALUES(DEFAULT, '2018-10-08 08:00', '2018-10-08 16:01'); 27 | INSERT INTO tb_folha_ponto(id, data_inicio, data_saida) VALUES(DEFAULT, '2018-10-09 07:59', '2018-10-09 16:58'); 28 | INSERT INTO tb_folha_ponto(id, data_inicio, data_saida) VALUES(DEFAULT, '2018-10-10 08:00', '2018-10-10 16:01'); 29 | INSERT INTO tb_folha_ponto(id, data_inicio, data_saida) VALUES(DEFAULT, '2018-10-11 08:00', '2018-10-11 16:02'); 30 | INSERT INTO tb_folha_ponto(id, data_inicio, data_saida) VALUES(DEFAULT, '2018-10-12 08:00', '2018-10-12 16:03'); 31 | 32 | 33 | 34 | /** 35 | *Consulta os registros da folha 36 | */ 37 | SELECT id, data_inicio, data_saida, data_saida - data_inicio AS horas_trabalhadas FROM tb_folha_ponto; 38 | 39 | 40 | /** 41 | *Soma total dos registros 42 | */ 43 | SELECT sum(data_saida - data_inicio) AS total_horas_trabalhadas FROM tb_folha_ponto; 44 | 45 | 46 | /** 47 | *Soma parcial dos registros 48 | */ 49 | SELECT id, data_saida, data_inicio, sum(data_saida - data_inicio) OVER (ORDER BY id) AS soma_parcial_horas_trabalhadas FROM tb_folha_ponto; -------------------------------------------------------------------------------- /artigo_mysql_sum_soma/sum_join_mysql_V2.sql: -------------------------------------------------------------------------------- 1 | /** 2 | *Criar tabela produtos. 3 | */ 4 | CREATE TABLE produtos 5 | ( 6 | id_produto int not null AUTO_INCREMENT, 7 | descricao varchar(200), 8 | CONSTRAINT produto_pk primary key(id_produto) 9 | ); 10 | 11 | /** 12 | *Incluir os dados na tabela produtos. 13 | */ 14 | INSERT INTO produtos(descricao) VALUES ('DVD'); 15 | INSERT INTO produtos(descricao) VALUES ('HD 500 GB'); 16 | INSERT INTO produtos(descricao) VALUES ('Tonner'); 17 | INSERT INTO produtos(descricao) VALUES ('Cadeira'); 18 | INSERT INTO produtos(descricao) VALUES ('Mesa'); 19 | 20 | /** 21 | *Criar tabela vendas. 22 | */ 23 | CREATE TABLE vendas 24 | ( 25 | id_produto int, 26 | qtde int, 27 | vlr_unit numeric(15,2), 28 | data datetime, 29 | CONSTRAINT produto_fk foreign key(id_produto) REFERENCES produtos(id_produto) 30 | ); 31 | 32 | /** 33 | *Inclui os dados na tabela vendas 34 | */ 35 | INSERT INTO vendas VALUES(1, 1, 259.10, '2018-09-01 23:59:59'); 36 | INSERT INTO vendas VALUES(1, 2, 300.00, '2018-09-07 22:44:06'); 37 | 38 | INSERT INTO vendas VALUES(2, 8, 200.06, '2018-09-02 12:13:19'); 39 | INSERT INTO vendas VALUES(2, 5, 220.00, '2018-09-08 15:44:25'); 40 | 41 | INSERT INTO vendas VALUES(3, 9, 70.00, '2018-09-03 10:14:59'); 42 | INSERT INTO vendas VALUES(3, 10, 90.06, '2018-09-10 16:24:59'); 43 | 44 | INSERT INTO vendas VALUES(4, 49, 40.29, '2018-09-06 06:43'); 45 | INSERT INTO vendas VALUES(4, 80, 30.00, '2018-09-11 05:44'); 46 | 47 | INSERT INTO vendas VALUES(5, 49, 540.00, '2018-09-07 06:21'); 48 | INSERT INTO vendas VALUES(5, 43, 530.37, '2018-09-12 10:22'); 49 | 50 | /** 51 | *Consultar produtos vendidos dentro de um período. 52 | */ 53 | SELECT 54 | vd.id_produto, 55 | p.descricao, 56 | sum(vd.qtde) as qtd_total, 57 | sum(vd.qtde * vd.vlr_unit) as valor_total 58 | FROM vendas vd 59 | inner join produtos p on (vd.id_produto = p.id_produto) 60 | where 61 | CAST(data AS DATE) >= CAST('2018-09-01' AS DATE) AND 62 | CAST(data AS DATE) <= CAST('2018-09-30' AS DATE) 63 | group by 64 | vd.id_produto, 65 | p.descricao 66 | order by vd.qtde desc; 67 | -------------------------------------------------------------------------------- /artigo_postgre_somar_dias_uteis/feriados_moveis.sql: -------------------------------------------------------------------------------- 1 | /* 2 | Calcula os feriados móveis: páscoa e os feriados derivados derivados desta data 3 | 4 | Importante!!! Esta função será utilizada pela função "adiciona_dias_uteis". 5 | 6 | Os feriados derivados desta data são: 7 | -Terça feira de Carnaval: páscoa -47 dias 8 | -Sexta feira da Paixão: páscoa -2 dias 9 | -Corpus Christi: páscoa +60 dias 10 | 11 | Utiliza o algorítmo de Meeus/Jones/Butcher 12 | 13 | Esta função é encontrada em: 14 | http://pt.wikipedia.org/wiki/C%C3%A1lculo_da_P%C3%A1scoa#Algoritmo_de_Meeus.2FJones.2FButcher 15 | 16 | Exemplo de utilização 17 | 18 | No parâmetro ano devemos passar um valor numérico. 19 | 20 | SELECT descricao, data FROM feriados_moveis(ano) 21 | 22 | Exemplo: 23 | 24 | SELECT descricao, data FROM feriados_moveis(2014) 25 | */ 26 | 27 | CREATE OR REPLACE FUNCTION feriados_moveis(IN ano integer, OUT descricao character varying, OUT data date) 28 | RETURNS SETOF record AS 29 | $BODY$ 30 | 31 | DECLARE 32 | a integer; 33 | b integer; 34 | c integer; 35 | d integer; 36 | e integer; 37 | f integer; 38 | g integer; 39 | h integer; 40 | i integer; 41 | k integer; 42 | l integer; 43 | m integer; 44 | dia integer; 45 | mes integer; 46 | pascoa date; 47 | 48 | BEGIN 49 | 50 | a = ano % 19; 51 | b = ano / 100; 52 | c = ano % 100; 53 | d = b / 4; 54 | e = b % 4; 55 | f = (b + 8) / 25; 56 | g = (b - f + 1) / 3; 57 | h = (19 * a + b - d - g + 15) % 30; 58 | i = c / 4; 59 | k = c % 4; 60 | l = (32 + 2 * e + 2 * i - h - k) % 7; 61 | m = (a + 11 * h + 22 * l) / 451; 62 | mes = (h + l - 7 * m + 114) / 31; 63 | dia = ((h + l - 7 * m + 114) % 31) + 1; 64 | 65 | pascoa := to_date(ano || '-' || mes || '-' || dia, 'yyyy-mm-dd'); 66 | RETURN QUERY SELECT 'Pascoa':: character varying, pascoa ; 67 | RETURN QUERY SELECT 'Carnaval':: character varying, pascoa -47 ; 68 | RETURN QUERY SELECT 'Paixao':: character varying, pascoa -2 ; 69 | RETURN QUERY SELECT 'Corpus Christi':: character varying, pascoa + 60 ; 70 | END; 71 | $BODY$ 72 | LANGUAGE plpgsql VOLATILE 73 | COST 100 74 | ROWS 1000; 75 | ALTER FUNCTION feriados_moveis(integer) 76 | OWNER TO postgres; 77 | -------------------------------------------------------------------------------- /artigo_dense_rank/dense_rank.sql: -------------------------------------------------------------------------------- 1 | /** 2 | *Script do exemplo: Função DENSE_RANK DO BLOG DICAS SQL & JQUERY 3 | *Data: 30/08/2014 Hora: 18:25 4 | */ 5 | 6 | /** 7 | *Criação da tabela "tb_corrida" 8 | */ 9 | 10 | 11 | --1º Exemplo 12 | 13 | CREATE TABLE tb_corrida 14 | ( 15 | inscricao integer, 16 | tempo_gasto time, 17 | sexo char(1), 18 | CONSTRAINT pk_inscricao PRIMARY KEY(inscricao) 19 | ); 20 | 21 | 22 | /** 23 | *Inclusão dos registros na tabela "tb_corrida" 24 | */ 25 | INSERT INTO tb_corrida VALUES 26 | (2480, '00:57:42', 'M'), 27 | (2481, '00:58:42', 'M'), 28 | (2482, '00:55:32', 'F'), 29 | (2483, '00:58:42', 'F'), 30 | (2484, '01:10:42', 'M'), 31 | (2485, '00:59:42', 'F'); 32 | 33 | /** 34 | *Seleção dos registros na tabela "tb_corrida" 35 | */ 36 | SELECT * FROM tb_corrida; 37 | 38 | 39 | /** 40 | *Classificação da posição dos corredores de acordo com o tempo. 41 | */ 42 | SELECT 43 | DENSE_RANK() OVER(ORDER BY tempo_gasto ASC) AS posicao, 44 | inscricao, 45 | tempo_gasto, 46 | sexo 47 | FROM tb_corrida; 48 | 49 | --2º Exemplo 50 | 51 | /** 52 | *Classificação dos corredores separados por sexo. 53 | */ 54 | SELECT 55 | DENSE_RANK() OVER(PARTITION BY sexo ORDER BY tempo_gasto ASC) AS posicao, 56 | inscricao, 57 | tempo_gasto, 58 | sexo 59 | FROM tb_corrida; 60 | 61 | --3º Exemplo 62 | 63 | /** 64 | *Criação da tabela "tb_vendas" 65 | */ 66 | CREATE TABLE tb_vendas 67 | ( 68 | codigo_vendedor integer, 69 | produto_id integer, 70 | valor numeric(10,2), 71 | data date, 72 | setor integer 73 | ); 74 | 75 | /** 76 | *Inclusão dos registros na tabela "tb_vendas" 77 | */ 78 | INSERT INTO tb_vendas VALUES 79 | (52154, 5152 , 102.24, '01/04/2014', 21), 80 | (52154, 2127 , 502.23, '05/04/2014', 10), 81 | (52154, 2721 , 472.82, '20/04/2014', 12), 82 | (52154, 7121 , 701.27, '22/04/2014', 13), 83 | (53153, 9228 , 9005.24, '06/04/2014', 41), 84 | (53153, 9235 , 7138.40, '13/04/2014', 82), 85 | (93142, 1440 , 8005.00, '06/04/2014', 20), 86 | (93142, 1530 , 9130.00, '13/04/2014', 30); 87 | 88 | /** 89 | *Seleção dos registros na tabela "tb_vendas" 90 | */ 91 | SELECT * FROM tb_vendas; 92 | 93 | /** 94 | *Classificação dos vendedores de acordo com o total de vendas 95 | */ 96 | SELECT 97 | codigo_vendedor, 98 | SUM(valor), 99 | DENSE_RANK() OVER(ORDER BY SUM(valor) DESC) AS posicao 100 | FROM tb_vendas 101 | GROUP BY codigo_vendedor; 102 | -------------------------------------------------------------------------------- /artigo_postgre_somar_dias_uteis/exemplo_3.sql: -------------------------------------------------------------------------------- 1 | /** 2 | *Atenção!!! Descomente o comando abaixo somente se deseja excluir a tabela tab_exame_paciente. 3 | */ 4 | --DROP TABLE IF EXISTS tab_exame_paciente; 5 | 6 | /** 7 | *Atenção!!! Descomente o comando abaixo somente se deseja excluir a tabela tab_laboratorio. 8 | */ 9 | --DROP TABLE IF EXISTS tab_laboratorio; 10 | 11 | /** 12 | *Cria a tabela tab_laboratorio. Armazena a localização dos laboratórios. 13 | */ 14 | CREATE TABLE tab_laboratorio 15 | ( 16 | laboratorio_codigo serial, 17 | laboratorio_endereco character varying(80), 18 | cidade_id integer, 19 | CONSTRAINT pk_lab_codigo PRIMARY KEY(laboratorio_codigo), 20 | CONSTRAINT fk_lab_cidades FOREIGN KEY(cidade_id) REFERENCES tab_cidades(cidade_id) 21 | ); 22 | 23 | /** 24 | *Inclui registros na tabela tab_laboratorio. 25 | */ 26 | INSERT INTO tab_laboratorio(laboratorio_codigo, laboratorio_endereco, cidade_id) 27 | VALUES 28 | (DEFAULT, 'Av. Santo Amaro, 514', 1), 29 | (DEFAULT, 'Av. Ibirapuera, 217', 1), 30 | (DEFAULT, 'Rua Vasco Alves, 128', 2); 31 | 32 | /** 33 | *Exibe registros na tabela tab_laboratorio. 34 | */ 35 | SELECT * FROM tab_laboratorio; 36 | 37 | /** 38 | *Cria a tabela tab_exame_paciente. Armazena os exames dos pacientes. 39 | */ 40 | CREATE TABLE tab_exame_paciente 41 | ( 42 | exame_codigo integer, 43 | exame_data date, 44 | laboratorio_codigo integer, 45 | paciente_codigo integer, 46 | CONSTRAINT pk_exame_codigo PRIMARY KEY(exame_codigo), 47 | CONSTRAINT fk_exa_paciente_labor FOREIGN KEY(laboratorio_codigo) REFERENCES tab_laboratorio(laboratorio_codigo) 48 | ); 49 | 50 | /** 51 | *Insere registros na tabela tab_exame_paciente. 52 | */ 53 | INSERT INTO tab_exame_paciente 54 | (exame_codigo, exame_data, laboratorio_codigo, paciente_codigo) 55 | VALUES 56 | ('1541', '2014-04-28', 1, 5146), 57 | ('1542', '2014-05-25', 2, 5147), 58 | ('1543', '2014-06-29', 3, 5148), 59 | ('1544', '2014-07-08', 2, 5149), 60 | ('1545', '2014-07-09', 1, 5149), 61 | ('1546', '2014-09-28', 2, 5162); 62 | 63 | 64 | /** 65 | *Exibe registros da tabela tab_exame_paciente. 66 | */ 67 | SELECT * FROM tab_exame_paciente; 68 | 69 | /** 70 | *Exibe as datas de entrega dos exames dos pacientes. 71 | */ 72 | SELECT 73 | exame_codigo, 74 | tab_exame_paciente.laboratorio_codigo, 75 | paciente_codigo, 76 | exame_data, 77 | adiciona_dias_uteis(exame_data, 5, cidade_id) AS exame_entrega 78 | FROM tab_exame_paciente 79 | JOIN tab_laboratorio 80 | ON tab_exame_paciente.laboratorio_codigo = tab_laboratorio.laboratorio_codigo; -------------------------------------------------------------------------------- /artigo_postgre_funcao_char_length_e_length/funcao_char_length_e_length.sql: -------------------------------------------------------------------------------- 1 | /** 2 | *Atenção!!! Descomente a sentença abaixo, somente se desejar excluir as tabela alunos ou chave 3 | */ 4 | --DROP TABLE IF EXISTS alunos; 5 | --DROP TABLE IF EXISTS chave; 6 | 7 | /** 8 | *1º Exemplo 9 | */ 10 | 11 | /** 12 | *Criação da tabela alunos 13 | */ 14 | CREATE TABLE alunos 15 | ( 16 | cod_matricula integer, 17 | nome varchar(255) 18 | ); 19 | 20 | /** 21 | *Inclusão dos registros na tabela alunos 22 | */ 23 | INSERT INTO 24 | alunos(cod_matricula, nome) 25 | VALUES 26 | (14245, 'bruno da silva araújo'), 27 | (14246, 'paulo santos oliveira'), 28 | (14247, 'cristina costa'); 29 | 30 | /** 31 | *Exibe os registros da tabela criada 32 | */ 33 | SELECT * FROM alunos; 34 | 35 | /** 36 | *A função char_length retorna a quantidade de caracteres. 37 | */ 38 | SELECT 39 | cod_matricula, 40 | nome, 41 | CHAR_LENGTH(nome) 42 | FROM alunos; 43 | 44 | /** 45 | *Quando utilizamos a função char_length, o nome da coluna passa a ter o mesmo nome da função. 46 | *Se quisermos que a coluna tenha um outro nome devemos criar um alias (apelido) depois do "AS". 47 | *Neste exemplo eu preferi ela se chame "qtd_caracteres", então coloquei "qtd_caracteres" depois do "AS". 48 | */ 49 | 50 | SELECT 51 | cod_matricula, 52 | nome, 53 | CHAR_LENGTH(nome) AS qtd_caracteres 54 | FROM alunos; 55 | 56 | /** 57 | *2º Exemplo 58 | */ 59 | 60 | /** 61 | *A função length também retorna a quantidade de caracteres. 62 | */ 63 | SELECT 64 | cod_matricula, 65 | nome, 66 | LENGTH(nome) 67 | FROM alunos; 68 | 69 | /** 70 | *Quando utilizamos a função length, o nome da coluna passa a ter o mesmo nome da função. 71 | *Se quisermos que a coluna tenha um outro nome devemos criar um alias (apelido) depois do "AS". 72 | *Neste exemplo eu preferi ela se chame "qtd_caracteres", então coloquei "qtd_caracteres" depois do "AS". 73 | */ 74 | 75 | SELECT 76 | cod_matricula, 77 | nome, 78 | LENGTH(nome) AS qtd_caracteres 79 | FROM alunos; 80 | 81 | /** 82 | *3º Exemplo 83 | */ 84 | 85 | /** 86 | *Criação da tabela chave 87 | */ 88 | CREATE TABLE chave 89 | ( 90 | seq_caracteres bytea 91 | ); 92 | 93 | /** 94 | *Inclusão dos registros na tabela chave 95 | */ 96 | INSERT INTO chave(seq_caracteres) 97 | VALUES 98 | ('dkfjdfjdkfjire'), 99 | ('jkljkljfkmmjjfdkfjdk'), 100 | ('jfijdfidosf'); 101 | 102 | /** 103 | *Exibe os registros da tabela chave 104 | */ 105 | SELECT * FROM chave; 106 | 107 | /** 108 | *A função length retorna o número de caracteres de uma string de acordo com a codificação. 109 | */ 110 | SELECT 111 | seq_caracteres, 112 | LENGTH(seq_caracteres, 'UTF8') 113 | FROM chave; 114 | -------------------------------------------------------------------------------- /mysql_sum_com_rollup/mysql_sum_com_rollup.sql: -------------------------------------------------------------------------------- 1 | /** 2 | * IMPORTANTE!!! 3 | * DESCOMENTE A SENTENÇA ABAIXO SOMENTE SE DESEJAR EXCLUIR A TABELA tb_fornecedor 4 | */ 5 | /*DROP TABLE IF EXISTS tb_fornecedor;*/ 6 | 7 | 8 | /** 9 | *Cria a tabela tb_fornecedor. 10 | */ 11 | CREATE TABLE tb_fornecedor 12 | ( 13 | segmento character varying(70), 14 | produto character varying(70), 15 | valor numeric 16 | ); 17 | 18 | 19 | /** 20 | *Inclui os dados na tabela tb_fornecedor. 21 | */ 22 | 23 | INSERT INTO tb_fornecedor VALUES('Papelaria e informática','HD 500 GB', 300.00); 24 | INSERT INTO tb_fornecedor VALUES('Papelaria e informática', 'Tonner', 250.00); 25 | 26 | INSERT INTO tb_fornecedor VALUES('Marcenaria', 'Cadeira', 50.00); 27 | INSERT INTO tb_fornecedor VALUES('Marcenaria', 'Mesa', 600.00); 28 | INSERT INTO tb_fornecedor VALUES('Marcenaria', 'Armário', 900.00); 29 | 30 | INSERT INTO tb_fornecedor VALUES('Serralheria', 'Corrimão', 400.00); 31 | INSERT INTO tb_fornecedor VALUES('Serralheria', 'Portão', 1500.00); 32 | INSERT INTO tb_fornecedor VALUES('Serralheria', 'Grade de proteção para janela', 800.00); 33 | 34 | INSERT INTO tb_fornecedor VALUES('Limpeza e higiêne', 'Detergente', 5.00); 35 | INSERT INTO tb_fornecedor VALUES('Limpeza e higiêne','Desinfetante', 40.00); 36 | INSERT INTO tb_fornecedor VALUES('Limpeza e higiêne', 'Papel toalha', 60.00); 37 | 38 | 39 | /** 40 | *Exibe os dados da tabela tb_fornecedor. 41 | */ 42 | SELECT * FROM tb_fornecedor; 43 | 44 | 45 | /** 46 | *1º Exemplo. 47 | */ 48 | 49 | /** 50 | *Calcula o subtotal para cada segmento e total para cada segmento. 51 | */ 52 | SELECT 53 | segmento, 54 | produto, 55 | SUM(valor) 56 | FROM tb_fornecedor 57 | GROUP BY segmento, produto WITH ROLLUP; 58 | 59 | 60 | /** 61 | *2º Exemplo. 62 | */ 63 | 64 | /** 65 | *Para facilitarmos a interpretação do resultado da consulta 66 | *vamos alterar a primeira coluna. 67 | */ 68 | 69 | SELECT 70 | IF 71 | ( 72 | segmento IS NULL, 73 | 'Total Geral', 74 | IF (produto IS NULL, CONCAT('Subtotal - ', segmento), segmento) 75 | ) AS segmento, 76 | produto, 77 | SUM(valor) as valor 78 | FROM tb_fornecedor 79 | GROUP BY segmento, produto WITH ROLLUP; 80 | 81 | 82 | /** 83 | *3º Exemplo. 84 | */ 85 | 86 | /** 87 | * 88 | *Não é possível utilizar "WITH ROLLUP" com "ORDER BY" na mesma consulta, 89 | *caso seja necessário ordenar colunas,teremos que criar uma subconsulta. 90 | *Neste exemplo, vamos colocar a coluna "segmento" e "produto" em ordem decrescente. 91 | */ 92 | SELECT * FROM 93 | ( 94 | SELECT 95 | segmento, 96 | produto, 97 | SUM(valor) AS valor 98 | FROM tb_fornecedor 99 | GROUP BY segmento, produto WITH ROLLUP 100 | ) TOTAL 101 | ORDER BY TOTAL.segmento DESC, TOTAL.produto DESC; 102 | -------------------------------------------------------------------------------- /artigo_postgre_funcao_substring/funcao_substring.sql: -------------------------------------------------------------------------------- 1 | /** 2 | *Atenção!!! Descomente a sentença abaixo, somente se desejar excluir a tabela alunos ou contatos 3 | */ 4 | --DROP TABLE IF EXISTS alunos; 5 | --DROP TABLE IF EXISTS contatos; 6 | 7 | /** 8 | *1º Exemplo 9 | */ 10 | 11 | /** 12 | *Extrair os 3 primeiros caracteres da string "Rio Grande do Sul" a partir da primeira posição. 13 | */ 14 | SELECT SUBSTRING('Rio Grande do Sul' from 1 for 3); 15 | 16 | /** 17 | *2º Exemplo 18 | */ 19 | 20 | /** 21 | *Extrair os 10 primeiros caracteres da string "Rio Grande do Sul" a partir da primeira posição. 22 | */ 23 | SELECT SUBSTRING('Rio Grande do Sul' from 1 for 10); 24 | 25 | /** 26 | *3º Exemplo 27 | */ 28 | 29 | /** 30 | *Extrair os 9 primeiros caracteres da string "Rio Grande do Sul" a partir da quinta posição. 31 | */ 32 | SELECT SUBSTRING('Rio Grande do Sul' from 5 for 9); 33 | 34 | 35 | /** 36 | *4º Exemplo 37 | */ 38 | 39 | /** 40 | *Criação da tabela alunos 41 | */ 42 | CREATE TABLE alunos 43 | ( 44 | cod_matricula integer, 45 | nome varchar(255) 46 | ); 47 | 48 | /** 49 | *Inclusão dos registros na tabela alunos 50 | */ 51 | INSERT INTO 52 | alunos(cod_matricula, nome) 53 | VALUES 54 | (14245, 'bruno da silva araújo'), 55 | (14246, 'paulo santos oliveira'), 56 | (14247, 'cristina costa'); 57 | 58 | /** 59 | *Exibe os registros da tabela criada 60 | */ 61 | SELECT * FROM alunos; 62 | 63 | /** 64 | *A função substring retorna o 6 primeiros caracteres. 65 | */ 66 | SELECT 67 | cod_matricula, 68 | nome, 69 | SUBSTRING(nome FROM 1 FOR 6) 70 | FROM alunos; 71 | 72 | /** 73 | *Quando utilizamos a função substring, o nome da coluna passa a ter o mesmo nome da função. 74 | *Se quisermos que a coluna tenha um outro nome devemos criar um alias (apelido) depois do "AS". 75 | *Neste exemplo, eu preferi ela se chame "caracteres_iniciais", então coloquei "caracteres_iniciais" depois do "AS". 76 | */ 77 | 78 | SELECT 79 | cod_matricula, 80 | nome, 81 | SUBSTRING(nome FROM 1 FOR 6) AS caracteres_iniciais 82 | FROM alunos; 83 | 84 | /** 85 | *5º Exemplo 86 | */ 87 | 88 | /** 89 | *Criação da tabela contatos 90 | */ 91 | CREATE TABLE contatos 92 | ( 93 | cliente_id integer, 94 | telefone character varying 95 | ); 96 | 97 | /** 98 | *Inclui os registros na tabela contatos 99 | */ 100 | INSERT INTO contatos(cliente_id, telefone) 101 | VALUES 102 | (1, '5181-8342'), 103 | (2, '5934-2241'), 104 | (3, '5933-2242'), 105 | (4, '5931-2242'); 106 | 107 | /** 108 | *Exibe a tabela contatos 109 | */ 110 | SELECT * FROM contatos; 111 | 112 | /** 113 | *Extrair o prefixo do telefone(quatro primeiros digítos) 114 | */ 115 | SELECT 116 | cliente_id, 117 | telefone, 118 | substring(telefone from '^[0-9]{4}') 119 | FROM contatos; 120 | 121 | /** 122 | *6º Exemplo 123 | */ 124 | /** 125 | *Extrair os quatros ultimos digitos do telefone 126 | */ 127 | SELECT 128 | cliente_id, 129 | telefone, 130 | substring(telefone from '[0-9]{4}$') 131 | FROM contatos; -------------------------------------------------------------------------------- /artigo_postgre_funcao_max/funcao_max.sql: -------------------------------------------------------------------------------- 1 | /** 2 | *DESCOMENTE O COMANDO ABAIXO SOMENTE SE DESEJAR EXCLUIR A TABELA tb_imoveis 3 | */ 4 | --DROP TABLE IF EXISTS tb_imoveis; 5 | 6 | /** 7 | *DESCOMENTE O COMANDO ABAIXO SOMENTE SE DESEJAR EXCLUIR A TABELA tb_imoveis 8 | */ 9 | --DROP TABLE IF EXISTS tb_treino; 10 | 11 | /** 12 | *Criar a tabela tb_imoveis. 13 | */ 14 | CREATE TABLE tb_imoveis 15 | ( 16 | corretor_id integer, 17 | imovel_id integer, 18 | valor numeric(9,2) 19 | ); 20 | 21 | 22 | /** 23 | *Incluir os dados na tabela tb_imoveis 24 | */ 25 | INSERT INTO tb_imoveis VALUES 26 | (120, 5421, 180000.00), 27 | (124, 5421, 90000.00), 28 | (122, 5421, 130000.00), 29 | (124, 5421, 512000.00), 30 | (120, 5421, 70000.00), 31 | (122, 5421, 622000.00), 32 | (120, 5421, 127000.00); 33 | 34 | /** 35 | *Exibir os dados da tabela tb_imoveis 36 | */ 37 | SELECT * FROM tb_imoveis; 38 | 39 | /** 40 | *1º EXEMPLO 41 | */ 42 | 43 | /** 44 | *Exibe o imóvel com valor mais alto 45 | */ 46 | SELECT MAX(valor) FROM tb_imoveis; 47 | 48 | /** 49 | *Criação do alias imovel_valor_maximo 50 | */ 51 | SELECT MAX(valor) AS imovel_valor_maximo FROM tb_imoveis; 52 | 53 | /** 54 | *2º EXEMPLO 55 | */ 56 | 57 | /** 58 | *Criar a tabela tb_treino. 59 | */ 60 | CREATE TABLE tb_treino 61 | ( 62 | atleta_id integer, 63 | data date, 64 | tempo interval 65 | ); 66 | 67 | /** 68 | *Incluir os dados na tabela tb_treino 69 | */ 70 | INSERT INTO tb_treino VALUES 71 | (42159, '2014-11-20', '01:20:13'), 72 | (53792, '2014-11-20', '01:31:13'), 73 | (84151, '2014-11-20', '01:17:42'), 74 | (42159, '2014-11-21', '01:22:24'), 75 | (53792, '2014-11-21', '01:36:48'), 76 | (84151, '2014-11-21', '01:19:08'), 77 | (42159, '2014-11-22', '01:18:24'), 78 | (53792, '2014-11-22', '01:32:29'), 79 | (84151, '2014-11-22', '01:23:54'); 80 | 81 | /** 82 | *Exibir os dados da tabela tb_treino 83 | */ 84 | SELECT * FROM tb_treino; 85 | 86 | /** 87 | * Qual foi o pior treino para cada atleta, ou seja qual corrida levou maior tempo. 88 | * Vamos agrupar os atletas que estão armazenados na coluna "atleta_id". 89 | * Para agrupar, utilizaremos o " GROUP BY". 90 | */ 91 | 92 | SELECT 93 | atleta_id, MAX(tempo) AS pior_tempo 94 | FROM tb_treino 95 | GROUP BY atleta_id; 96 | 97 | /** 98 | *Para ordenar a identificação dos atleta em ordem crescente, ou seja, do valor menor para o maior, 99 | *deve-se usar "ORDER BY" seguido do nome da coluna, neste caso, 100 | *a coluna 'atleta_id' será ordenada . 101 | */ 102 | SELECT atleta_id, 103 | MAX(tempo) AS pior_tempo 104 | FROM tb_treino 105 | GROUP BY atleta_id 106 | ORDER BY atleta_id; 107 | 108 | 109 | /** 110 | *3º EXEMPLO 111 | */ 112 | 113 | /** 114 | *Também podemos utilizar a função "MAX" para filtrar um registro, 115 | *desde que a função "MAX" pertença a uma subquery. 116 | */ 117 | SELECT 118 | atleta_id, 119 | data, 120 | tempo AS pior_tempo 121 | FROM tb_treino WHERE tempo = 122 | ( 123 | SELECT MAX(tempo) 124 | FROM tb_treino 125 | ) 126 | -------------------------------------------------------------------------------- /artigo_postgre_funcao_min/funcao_min.sql: -------------------------------------------------------------------------------- 1 | /** 2 | *DESCOMENTE O COMANDO ABAIXO SOMENTE SE DESEJAR EXCLUIR A TABELA tb_imoveis 3 | */ 4 | --DROP TABLE IF EXISTS tb_imoveis; 5 | 6 | /** 7 | *DESCOMENTE O COMANDO ABAIXO SOMENTE SE DESEJAR EXCLUIR A TABELA tb_imoveis 8 | */ 9 | --DROP TABLE IF EXISTS tb_treino; 10 | 11 | /** 12 | *Criar a tabela tb_imoveis. 13 | */ 14 | CREATE TABLE tb_imoveis 15 | ( 16 | corretor_id integer, 17 | imovel_id integer, 18 | valor numeric(9,2) 19 | ); 20 | 21 | 22 | /** 23 | *Incluir os dados na tabela tb_imoveis 24 | */ 25 | INSERT INTO tb_imoveis VALUES 26 | (120, 5421, 180000.00), 27 | (124, 5421, 90000.00), 28 | (122, 5421, 130000.00), 29 | (124, 5421, 512000.00), 30 | (120, 5421, 70000.00), 31 | (122, 5421, 622000.00), 32 | (120, 5421, 127000.00); 33 | 34 | /** 35 | *Exibir os dados da tabela tb_imoveis 36 | */ 37 | SELECT * FROM tb_imoveis; 38 | 39 | /** 40 | *1º EXEMPLO 41 | */ 42 | 43 | /** 44 | *Exibe o imóvel com valor mais baixo 45 | */ 46 | SELECT MIN(valor) FROM tb_imoveis; 47 | 48 | /** 49 | *Criação do alias imovel_valor_minimo 50 | */ 51 | SELECT MIN(valor) AS imovel_valor_minimo FROM tb_imoveis; 52 | 53 | /** 54 | *2º EXEMPLO 55 | */ 56 | 57 | /** 58 | *Criar a tabela tb_treino. 59 | */ 60 | CREATE TABLE tb_treino 61 | ( 62 | atleta_id integer, 63 | data date, 64 | tempo interval 65 | ); 66 | 67 | /** 68 | *Incluir os dados na tabela tb_treino 69 | */ 70 | INSERT INTO tb_treino VALUES 71 | (42159, '2014-11-20', '01:20:13'), 72 | (53792, '2014-11-20', '01:31:13'), 73 | (84151, '2014-11-20', '01:17:42'), 74 | (42159, '2014-11-21', '01:22:24'), 75 | (53792, '2014-11-21', '01:36:48'), 76 | (84151, '2014-11-21', '01:19:08'), 77 | (42159, '2014-11-22', '01:18:24'), 78 | (53792, '2014-11-22', '01:32:29'), 79 | (84151, '2014-11-22', '01:23:54'); 80 | 81 | /** 82 | *Exibir os dados da tabela tb_treino 83 | */ 84 | SELECT * FROM tb_treino; 85 | 86 | /** 87 | * Qual foi o pior treino para cada atleta, ou seja, qual corrida levou menor tempo. 88 | * Vamos agrupar os atletas que estão armazenados na coluna "atleta_id". 89 | * Para agrupar, utilizaremos o " GROUP BY". 90 | */ 91 | SELECT atleta_id, MIN(tempo) AS melhor_tempo 92 | FROM tb_treino 93 | GROUP BY atleta_id; 94 | 95 | /** 96 | *Para ordenar a identificação dos atleta em ordem crescente, ou seja, do valor menor para o maior, 97 | *deve-se usar "ORDER BY" seguido do nome da coluna, neste caso, 98 | *a coluna 'atleta_id' será ordenada . 99 | */ 100 | SELECT atleta_id, 101 | MIN(tempo) AS pior_tempo 102 | FROM tb_treino 103 | GROUP BY atleta_id 104 | ORDER BY atleta_id; 105 | 106 | 107 | /** 108 | *3º EXEMPLO 109 | */ 110 | 111 | /** 112 | *Também podemos utilizar a função "MIN" para filtrar um registro, 113 | *desde que a função "MIN" pertença a uma subquery. 114 | */ 115 | SELECT 116 | atleta_id, 117 | data, 118 | tempo AS melhor_tempo 119 | FROM tb_treino 120 | WHERE tempo = 121 | ( 122 | SELECT MIN(tempo) 123 | FROM tb_treino 124 | ) 125 | -------------------------------------------------------------------------------- /artigo_introducao_a_jquery_seg_parte/intr_jq_seg_parte_ex_2.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 45 | 46 | 47 |
Clique aqui para esconder a mensagem!
48 |
49 |

Veja como podemos utilizar a biblioteca jquery!!!

50 |
51 | 52 | 53 | -------------------------------------------------------------------------------- /postgresql_recursividade/postgresql_recursividade.sql: -------------------------------------------------------------------------------- 1 | --Modelo de recursidade no postgresql 2 | --09/09/2018 13:51 3 | --Exclui a tabela "GER_FUNCIONARIO" 4 | --DROP TABLE GER_FUNCIONARIO 5 | 6 | --Criar tabela "ger_funcionario" 7 | CREATE TABLE GER_FUNCIONARIO 8 | ( 9 | GER_MATR_FUNCIONARIO INTEGER, 10 | GER_MATR_CHEFE INTEGER, 11 | GER_NOME VARCHAR(400), 12 | CONSTRAINT MATR_FUNCIONARIO_PK PRIMARY KEY(GER_MATR_FUNCIONARIO), 13 | CONSTRAINT MATR_CHEFE_FK FOREIGN KEY(GER_MATR_CHEFE) REFERENCES GER_FUNCIONARIO(GER_MATR_FUNCIONARIO) 14 | ); 15 | 16 | --Consultar tabela "ger_funcionario" 17 | SELECT * FROM GER_FUNCIONARIO; 18 | 19 | --Inserir registros na tabela "ger_funcionario" 20 | INSERT INTO GER_FUNCIONARIO VALUES(41470, NULL, 'PAULO GOMES'); 21 | INSERT INTO GER_FUNCIONARIO VALUES(48349, 41470, 'RICARDO NOGUEIRA'); 22 | INSERT INTO GER_FUNCIONARIO VALUES(48346, 41470, 'ANA LUCIA SANTOS'); 23 | INSERT INTO GER_FUNCIONARIO VALUES(48541, 48346, 'JOÃO GOMES'); 24 | INSERT INTO GER_FUNCIONARIO VALUES(48312, 48346, 'KATIA APARECIDA'); 25 | 26 | INSERT INTO GER_FUNCIONARIO VALUES(53647, NULL, 'MARIA GOMES'); 27 | INSERT INTO GER_FUNCIONARIO VALUES(56642, 53647, 'RENATA NOGUEIRA'); 28 | INSERT INTO GER_FUNCIONARIO VALUES(57641, 53647, 'JOANA LUCIA SANTOS'); 29 | INSERT INTO GER_FUNCIONARIO VALUES(57643, 57641, 'CARLOS GOMES'); 30 | INSERT INTO GER_FUNCIONARIO VALUES(97645, 57641, 'ROBERTA APARECIDA'); 31 | 32 | --Query recursiva - 1º exemplo 33 | WITH RECURSIVE DEPENDENCIA AS 34 | ( 35 | SELECT 36 | GER_MATR_FUNCIONARIO, 37 | GER_NOME, 38 | GER_MATR_CHEFE, 39 | 1 AS LEVEL, 40 | 0 AS NIVEL , 41 | ARRAY[GER_MATR_FUNCIONARIO] AS PATH_MATR 42 | FROM GER_FUNCIONARIO 43 | WHERE GER_MATR_CHEFE IS NULL 44 | 45 | UNION ALL 46 | 47 | SELECT 48 | C.GER_MATR_FUNCIONARIO, 49 | C.GER_NOME, 50 | C.GER_MATR_CHEFE, 51 | P.LEVEL + 1, 52 | P.LEVEL AS NIVEL, 53 | P.PATH_MATR || C.GER_MATR_FUNCIONARIO 54 | FROM GER_FUNCIONARIO C 55 | JOIN DEPENDENCIA P ON C.GER_MATR_CHEFE = P.GER_MATR_FUNCIONARIO 56 | ) 57 | SELECT 58 | GER_MATR_FUNCIONARIO, 59 | GER_NOME, 60 | GER_MATR_CHEFE, 61 | NIVEL, 62 | PATH_MATR AS MAPEAMENTO_DEP_MATRICULA 63 | FROM DEPENDENCIA; 64 | 65 | 66 | --2º EXEMPLO 67 | WITH RECURSIVE DEPENDENCIA AS 68 | ( 69 | SELECT 70 | GER_MATR_FUNCIONARIO, 71 | GER_NOME, 72 | GER_MATR_CHEFE, 73 | 1 AS LEVEL, 74 | 0 AS NIVEL , 75 | ARRAY[GER_MATR_FUNCIONARIO] AS PATH_MATR, 76 | ARRAY[GER_NOME] :: text[] AS PATH_NOME 77 | FROM GER_FUNCIONARIO 78 | WHERE GER_MATR_CHEFE IS NULL 79 | 80 | UNION ALL 81 | 82 | SELECT 83 | C.GER_MATR_FUNCIONARIO, 84 | C.GER_NOME, 85 | C.GER_MATR_CHEFE, 86 | P.LEVEL + 1, 87 | P.LEVEL AS NIVEL, 88 | P.PATH_MATR || C.GER_MATR_FUNCIONARIO, 89 | P.PATH_NOME || cast(C.GER_NOME as text) 90 | FROM GER_FUNCIONARIO C 91 | JOIN DEPENDENCIA P ON C.GER_MATR_CHEFE = P.GER_MATR_FUNCIONARIO 92 | ) 93 | SELECT 94 | GER_MATR_FUNCIONARIO, 95 | GER_NOME, 96 | GER_MATR_CHEFE, 97 | NIVEL, 98 | PATH_MATR AS MAPEAMENTO_DEP_MATRICULA, 99 | PATH_NOME AS MAPEAMENTO_DEP_NOME 100 | FROM DEPENDENCIA 101 | -------------------------------------------------------------------------------- /artigo_postgre_funcao_concat_e_operador_de_concatenacao/funcao_concat_e_operador_de_concatenacao.sql: -------------------------------------------------------------------------------- 1 | /** 2 | *Atenção!!! Descomente a sentença abaixo, somente se desejar excluir a tabela locacao_filiais 3 | */ 4 | --DROP TABLE IF EXISTS locacao_filiais; 5 | 6 | /** 7 | *Criação da tabela locacao_filiais 8 | */ 9 | CREATE TABLE locacao_filiais 10 | ( 11 | tipo_logradouro varchar(15), 12 | logradouro varchar(100), 13 | numero integer, 14 | complemento character varying(40), 15 | bairro character varying(35) 16 | 17 | ); 18 | 19 | /** 20 | *Inclusão dos registros na tabela locacao_filiais 21 | */ 22 | INSERT INTO 23 | locacao_filiais(tipo_logradouro, logradouro, numero, complemento, bairro) 24 | VALUES 25 | ('Avenida', 'Domingos de Moraes', 10574, '2º ANDAR', 'Vila Mariana'), 26 | ('Rua', 'Enxovia', 1124, NULL, 'Paraíso'), 27 | ('Rua', 'Paes da Silva', 540, NULL, 'Lapa'); 28 | 29 | /** 30 | *Exibe os registros da tabela criada 31 | */ 32 | SELECT * FROM locacao_filiais; 33 | 34 | /** 35 | *Faz a concatenação das colunas, porém somente o primeiro registro é exibido, pois o complemento dos outros 36 | *registros são nulos. 37 | *Ao fazer uma concatenação com um dado nulo, o resultado é nulo. 38 | */ 39 | SELECT 40 | 'Endereço: ' || 41 | tipo_logradouro || ' ' || 42 | logradouro || ' ' || 43 | numero || ' ' || 44 | complemento || ' ' || 45 | bairro 46 | FROM locacao_filiais; 47 | 48 | /** 49 | *Antes de fazer a concatenação da coluna complemento faremos uma verificação. 50 | *Se houver dados no campo faremos a concatenação com os dados deste campo. 51 | *Caso contrário substituiremos o dado nulo por uma string vazia (''). 52 | *Para isso utilizaremos a função coalesce. 53 | */ 54 | SELECT 55 | 'Endereço: ' || 56 | tipo_logradouro || ' ' || 57 | logradouro || ' ' || 58 | numero || ' ' || 59 | COALESCE(complemento, '') || ' ' || 60 | bairro 61 | FROM locacao_filiais; 62 | 63 | /** 64 | *Similar ao exemplo anterior, mas trocamos o nome da coluna "?column?" para filiais, 65 | *ou seja, criamos um alias(apelido) para esta coluna. 66 | */ 67 | SELECT 68 | 'Endereço: ' || 69 | tipo_logradouro || ' ' || 70 | logradouro || ' ' || 71 | numero || ' ' || 72 | COALESCE(complemento, '') || ' ' || 73 | bairro AS filiais 74 | FROM locacao_filiais; 75 | 76 | 77 | /** 78 | *Exemplo da funcão concat. 79 | *A função concat surgiu a partir da versão 9.1, logo ela funcionará nesta versão ou em versões posteriores. 80 | *Ela tem função similar ao operador de concatenação "||", que seria unir string ou valores, 81 | *mas além disso ela possui uma vantagem, pois ignora dados nulos, 82 | *se você concatenar uma string ou valor com nulo o resultado não será nulo. 83 | */ 84 | SELECT 85 | CONCAT 86 | ( 87 | 'Endereço: ', tipo_logradouro, ' ', logradouro, ' ', numero, ' ', complemento, ' ', bairro 88 | ) 89 | FROM locacao_filiais; 90 | 91 | /** 92 | *Similar ao exemplo anterior, mas trocamos o nome da coluna "concat" para filiais, 93 | *ou seja, criamos um alias(apelido) para esta coluna. 94 | */ 95 | SELECT 96 | CONCAT 97 | ( 98 | 'Endereço: ', tipo_logradouro, ' ', logradouro, ' ', numero, ' ', complemento, ' ', bairro 99 | ) AS filiais 100 | FROM locacao_filiais; 101 | -------------------------------------------------------------------------------- /mysql_sum_com_rollup/mysql_sum_com_rollup_atualizacao_jan_2015.sql: -------------------------------------------------------------------------------- 1 | /** 2 | * IMPORTANTE!!! 3 | * DESCOMENTE A SENTENÇA ABAIXO SOMENTE SE DESEJAR EXCLUIR A TABELA tb_fornecedor 4 | */ 5 | /*DROP TABLE IF EXISTS tb_fornecedor;*/ 6 | 7 | 8 | /** 9 | *Cria a tabela tb_fornecedor. 10 | */ 11 | CREATE TABLE tb_fornecedor 12 | ( 13 | segmento character varying(70), 14 | produto character varying(70), 15 | valor numeric 16 | ); 17 | 18 | 19 | /** 20 | *Inclui os dados na tabela tb_fornecedor. 21 | */ 22 | 23 | INSERT INTO tb_fornecedor VALUES('Papelaria e informática','HD 500 GB', 300.00); 24 | INSERT INTO tb_fornecedor VALUES('Papelaria e informática', 'Tonner', 250.00); 25 | 26 | INSERT INTO tb_fornecedor VALUES('Marcenaria', 'Cadeira', 50.00); 27 | INSERT INTO tb_fornecedor VALUES('Marcenaria', 'Mesa', 600.00); 28 | INSERT INTO tb_fornecedor VALUES('Marcenaria', 'Armário', 900.00); 29 | 30 | INSERT INTO tb_fornecedor VALUES('Serralheria', 'Corrimão', 400.00); 31 | INSERT INTO tb_fornecedor VALUES('Serralheria', 'Portão', 1500.00); 32 | INSERT INTO tb_fornecedor VALUES('Serralheria', 'Grade de proteção para janela', 800.00); 33 | 34 | INSERT INTO tb_fornecedor VALUES('Limpeza e higiêne', 'Detergente', 5.00); 35 | INSERT INTO tb_fornecedor VALUES('Limpeza e higiêne','Desinfetante', 40.00); 36 | INSERT INTO tb_fornecedor VALUES('Limpeza e higiêne', 'Papel toalha', 60.00); 37 | 38 | 39 | /** 40 | *Exibe os dados da tabela tb_fornecedor. 41 | */ 42 | SELECT * FROM tb_fornecedor; 43 | 44 | 45 | /** 46 | *1º Exemplo. 47 | */ 48 | 49 | /** 50 | *Calcula o subtotal para cada segmento e total para cada segmento. 51 | */ 52 | SELECT 53 | segmento, 54 | produto, 55 | SUM(valor) 56 | FROM tb_fornecedor 57 | GROUP BY segmento, produto WITH ROLLUP; 58 | 59 | 60 | /** 61 | *2º Exemplo. 62 | */ 63 | 64 | /** 65 | *Para facilitarmos a interpretação do resultado da consulta 66 | *vamos alterar a primeira coluna. 67 | */ 68 | 69 | SELECT 70 | IF 71 | ( 72 | segmento IS NULL, 73 | 'Total Geral', 74 | IF (produto IS NULL, CONCAT('Subtotal - ', segmento), segmento) 75 | ) AS segmento, 76 | produto, 77 | SUM(valor) as valor 78 | FROM tb_fornecedor 79 | GROUP BY segmento, produto WITH ROLLUP; 80 | 81 | 82 | /** 83 | *3º Exemplo. 84 | */ 85 | 86 | /** 87 | * 88 | *Não é possível utilizar "WITH ROLLUP" com "ORDER BY" na mesma consulta, 89 | *caso seja necessário ordenar colunas,teremos que criar uma subconsulta. 90 | *Neste exemplo, vamos colocar em ordem as colunas "segmento" e "produto". 91 | */ 92 | 93 | SELECT 94 | COALESCE(segmento, 'TOTAL GERAL') AS segmento, 95 | CASE 96 | WHEN ((segmento IS NOT NULL) AND (produto IS NULL)) 97 | THEN CONCAT('Subtotal - ', segmento) 98 | WHEN (segmento IS NOT NULL AND produto IS NOT NULL) 99 | THEN produto 100 | END AS produto, 101 | valor FROM 102 | ( 103 | SELECT 104 | segmento, 105 | produto, 106 | SUM(valor) AS valor 107 | FROM tb_fornecedor 108 | GROUP BY segmento, produto WITH ROLLUP 109 | ) TOTAL 110 | ORDER BY 111 | CASE 112 | WHEN(segmento IS NOT NULL) THEN 0 113 | ELSE 1 114 | END, 115 | segmento DESC, 116 | CASE 117 | WHEN(produto IS NOT NULL) THEN 0 118 | ELSE 1 119 | END, 120 | produto DESC; 121 | -------------------------------------------------------------------------------- /Sql Server - função concat e operador de concatenação.sql: -------------------------------------------------------------------------------- 1 | /* 2 | Veja o artigo na integra em: 3 | http://jquerydicas.blogspot.com.br 4 | */ 5 | 6 | /** 7 | *Atenção!!! Descomente a sentença abaixo, somente se desejar excluir a tabela locacao_filiais 8 | */ 9 | --DROP TABLE locacao_filiais; 10 | 11 | /** 12 | *Criação da tabela locacao_filiais 13 | */ 14 | CREATE TABLE locacao_filiais 15 | ( 16 | tipo_logradouro varchar(15), 17 | logradouro varchar(100), 18 | numero integer, 19 | complemento character varying(40), 20 | bairro character varying(35) 21 | 22 | ); 23 | 24 | /** 25 | *Inclusão dos registros na tabela locacao_filiais 26 | */ 27 | INSERT INTO 28 | locacao_filiais(tipo_logradouro, logradouro, numero, complemento, bairro) 29 | VALUES 30 | ('Avenida', 'Domingos de Moraes', 10574, '2º ANDAR', 'Vila Mariana'), 31 | ('Rua', 'Enxovia', 1124, NULL, 'Paraíso'), 32 | ('Rua', 'Paes da Silva', 540, NULL, 'Lapa'); 33 | 34 | /** 35 | *Exibe os registros da tabela criada 36 | */ 37 | SELECT * FROM locacao_filiais; 38 | 39 | /* 40 | Para exibirmos os campos da tabela "locacao_filiais" concatenados, executamos a sentença abaixo: 41 | */ 42 | SELECT 43 | 'Endereço: ' + 44 | tipo_logradouro + ' ' + 45 | logradouro + ' ' + 46 | CAST(numero AS VARCHAR) + ' ' + 47 | complemento + ' ' + 48 | bairro 49 | FROM locacao_filiais; 50 | 51 | /* 52 | Você deve estar pensando o que ocorreu? Por que somente o primeiro registro apareceu concatenado? Cadê os outros? 53 | Se você observar os dois últimos registros, verá que eles não possuem dados na coluna complemento, ou seja, 54 | os dados são nulos nesta coluna. Ao fazer uma concatenação com um dado nulo, o resultado é nulo. 55 | Como vamos resolver isto? 56 | */ 57 | SELECT 58 | 'Endereço: ' + 59 | tipo_logradouro + ' ' + 60 | logradouro + ' ' + 61 | CAST(numero AS VARCHAR) + ' ' + 62 | COALESCE(complemento, '') + ' ' + 63 | bairro 64 | FROM locacao_filiais; 65 | 66 | /* 67 | O nome da coluna será exibido como "(Nenhum nome de coluna)". Caso queira alterar este nome, crie um alias (apelido). 68 | Após o "AS" coloque o nome da coluna que você precisa. Neste exemplo, eu vou chamá-la de filiais. 69 | */ 70 | 71 | SELECT 72 | 'Endereço: ' + 73 | tipo_logradouro + ' ' + 74 | logradouro + ' ' + 75 | CAST(numero AS VARCHAR) + ' ' + 76 | COALESCE(complemento, '') + ' ' + 77 | bairro 78 | AS filiais 79 | FROM locacao_filiais; 80 | 81 | /* 82 | A função concat surgiu a partir da versão 2012, logo ela funcionará nesta versão ou em versões posteriores. 83 | Ela tem função similar ao operador de concatenação "+". Ela possui duas vantagens: 84 | além de unir valores numérico sem utilizar conversão, também ignora dados nulos. 85 | */ 86 | 87 | SELECT 88 | CONCAT 89 | ( 90 | 'Endereço: ', tipo_logradouro, ' ', logradouro, ' ', numero, ' ', complemento, ' ', bairro 91 | ) 92 | FROM locacao_filiais; 93 | 94 | /* 95 | O nome da coluna será exibido como "(Nenhum nome de coluna)". 96 | Caso queira alterar este nome, crie um alias (apelido). Após o "AS" coloque o nome da coluna que você precisa. 97 | Neste exemplo, eu vou chamá-la de filiais. 98 | */ 99 | 100 | SELECT 101 | CONCAT 102 | ( 103 | 'Endereço: ', tipo_logradouro, ' ', logradouro, ' ', numero, ' ', complemento, ' ', bairro 104 | ) AS filiais 105 | FROM locacao_filiais; 106 | -------------------------------------------------------------------------------- /artigo_postgre_create_table/artigo_criar_tabela_parte_2.sql: -------------------------------------------------------------------------------- 1 | /** 2 | *DESCOMENTE O COMANDO DROP TABLE SOMENTE SE DESEJAR EXCLUIR A TABELA "tb_paciente". 3 | */ 4 | --DROP TABLE tb_paciente; 5 | 6 | 7 | /** 8 | *Para criar tabela uma tabela utilize o comando CREATE TABLE. 9 | */ 10 | 11 | CREATE TABLE tb_paciente 12 | ( 13 | prontuario serial , 14 | nome character varying(255) NOT NULL , 15 | data_nasc date NOT NULL , 16 | sexo character(1) NOT NULL , 17 | peso numeric(6,3), 18 | proc_cirurgico boolean NOT NULL 19 | ); 20 | 21 | 22 | /** 23 | *Para incluir um registro utilize o comando INSERT. 24 | */ 25 | 26 | INSERT INTO tb_paciente (prontuario, nome, data_nasc, sexo, peso, proc_cirurgico) 27 | VALUES (DEFAULT , 'Maria Santos', '1984-04-20', 'f', 52.440, TRUE); 28 | 29 | INSERT INTO tb_paciente(prontuario, nome, data_nasc, sexo, peso, proc_cirurgico) 30 | VALUES (DEFAULT, 'João Silva', '1974-08-29', 'm', 80.520 , FALSE); 31 | 32 | INSERT INTO tb_paciente(prontuario , nome , data_nasc , sexo , peso , proc_cirurgico) 33 | VALUES(DEFAULT , 'Ana Moraes', '1982-10-30', 'f', 57.700, TRUE); 34 | 35 | 36 | /** 37 | * 38 | *Mesmo se não for incluída uma coluna do tipo serial e o seu respectivo valor no comando INSERT, a sequéncia será preenchida 39 | *automaticamente da mesma forma. 40 | *Neste caso, não vamos incluir a coluna "prontuario" e seu respectivo valor e a sequéncia continuará sendo preenchida 41 | *automaticamente. 42 | */ 43 | 44 | INSERT INTO tb_paciente (nome, data_nasc, sexo, peso, proc_cirurgico) VALUES 45 | ('Patricia Duarte', '1990-11-05', 'f', 72.440, TRUE); 46 | 47 | /** 48 | *Executar o comando INSERT fornecendo somente os valores sem fornecer as colunas. 49 | O primeiro valor será inserido na primeira coluna, o segundo valor será inserido na segunda coluna e assim por diante. 50 | */ 51 | 52 | INSERT INTO tb_paciente VALUES (DEFAULT, 'Bruno Pereira', '1980-06-23', 'f', 110.440, TRUE); 53 | 54 | 55 | /** 56 | *Se não incluirmos um dado em um campo opcional não haverá problema. Exemplo: campo peso. 57 | */ 58 | 59 | INSERT INTO tb_paciente (prontuario, nome, data_nasc, sexo, proc_cirurgico) 60 | VALUES (DEFAULT, 'Rosana Alves', '1979-04-13', 'f', TRUE); 61 | 62 | INSERT INTO tb_paciente (prontuario, nome, data_nasc, sexo, peso, proc_cirurgico) 63 | VALUES (DEFAULT, 'Rafael Brito', '1979-05-14', 'f', NULL, TRUE); 64 | 65 | 66 | /** 67 | *Inserir mais de um registro com o comando insert 68 | */ 69 | 70 | INSERT INTO tb_paciente (prontuario, nome, data_nasc, sexo, peso, proc_cirurgico) 71 | VALUES 72 | (DEFAULT, 'Daniel Alves', '1992-12-06', 'm', 100.520, FALSE), 73 | (DEFAULT, 'Priscila Monteiro', '1982-10-30', 'f', 64.280, TRUE), 74 | (DEFAULT, 'Otaviano Costa', '1976-03-18', 'm', 144.520, FALSE); 75 | 76 | 77 | /** 78 | *Para exibir os registros de uma tabela utilize o comando SELECT 79 | */ 80 | 81 | SELECT 82 | prontuario , 83 | nome , 84 | data_nasc , 85 | sexo , 86 | peso , 87 | proc_cirurgico 88 | FROM tb_paciente; 89 | 90 | /** 91 | *Em vez de declarar todas as colunas da tabela, utilize o símbolo de "*" para facilitar. 92 | */ 93 | 94 | SELECT * FROM tb_paciente; 95 | 96 | /** 97 | *Não precisamos selecionar todas as colunas, podemos escolher quais precisamos. 98 | */ 99 | 100 | SELECT nome ,data_nasc FROM tb_paciente; -------------------------------------------------------------------------------- /artigo_oracle_calcular_total_subtotal_com_rollup/artigo_oracle_total_subtotal_com_rollup.sql: -------------------------------------------------------------------------------- 1 | /** 2 | *Cria a tabela tb_fornecedor. 3 | */ 4 | CREATE TABLE tb_fornecedor 5 | ( 6 | segmento character varying(70), 7 | produto character varying(70), 8 | valor numeric 9 | ); 10 | 11 | 12 | /** 13 | *Inclui os dados na tabela tb_fornecedor. 14 | */ 15 | 16 | INSERT INTO tb_fornecedor VALUES('Papelaria e informática','HD 500 GB', 300.00); 17 | INSERT INTO tb_fornecedor VALUES('Papelaria e informática', 'Tonner', 250.00); 18 | 19 | INSERT INTO tb_fornecedor VALUES('Marcenaria', 'Cadeira', 50.00); 20 | INSERT INTO tb_fornecedor VALUES('Marcenaria', 'Mesa', 600.00); 21 | INSERT INTO tb_fornecedor VALUES('Marcenaria', 'Armário', 900.00); 22 | 23 | INSERT INTO tb_fornecedor VALUES('Serralheria', 'Corrimão', 400.00); 24 | INSERT INTO tb_fornecedor VALUES('Serralheria', 'Portão', 1500.00); 25 | INSERT INTO tb_fornecedor VALUES('Serralheria', 'Grade de proteção para janela', 800.00); 26 | 27 | INSERT INTO tb_fornecedor VALUES('Limpeza e higiêne', 'Detergente', 5.00); 28 | INSERT INTO tb_fornecedor VALUES('Limpeza e higiêne','Desinfetante', 40.00); 29 | INSERT INTO tb_fornecedor VALUES('Limpeza e higiêne', 'Papel toalha', 60.00); 30 | 31 | 32 | /** 33 | *Exibe os dados da tabela tb_fornecedor. 34 | */ 35 | SELECT * FROM tb_fornecedor; 36 | 37 | 38 | /** 39 | *1º Exemplo. 40 | */ 41 | 42 | /** 43 | *Calcula o subtotal para cada segmento e total geral. 44 | */ 45 | 46 | 47 | SELECT 48 | segmento, 49 | produto, 50 | SUM(valor) 51 | FROM tb_fornecedor 52 | GROUP BY ROLLUP(segmento, produto); 53 | 54 | /** 55 | *2º Exemplo. 56 | */ 57 | 58 | /** 59 | *Para facilitarmos a interpretação do resultado da consulta 60 | *vamos alterar a primeira coluna indicando os subtotais e o total geral. 61 | */ 62 | 63 | SELECT 64 | CASE 65 | WHEN (segmento IS NULL AND produto IS NULL) 66 | THEN 'Total Geral' 67 | WHEN (segmento IS NOT NULL AND produto IS NULL) 68 | THEN 'Subtotal' || ' - ' || segmento 69 | ELSE segmento 70 | END AS segmento, 71 | produto, 72 | SUM(valor) AS valor 73 | FROM tb_fornecedor 74 | GROUP BY ROLLUP ( 75 | segmento, produto 76 | ); 77 | 78 | /** 79 | *Também podemos indicar o total geral na primeira coluna e os subtotais na segunda coluna. 80 | */ 81 | 82 | 83 | SELECT 84 | CASE 85 | WHEN (segmento IS NULL AND produto IS NULL) 86 | THEN 'Total Geral' 87 | ELSE segmento 88 | END AS segmento, 89 | CASE 90 | WHEN (segmento IS NOT NULL AND produto IS NULL) 91 | THEN 'Subtotal' || ' - ' || segmento 92 | ELSE produto 93 | END AS produto, 94 | SUM(valor) AS valor 95 | FROM tb_fornecedor 96 | GROUP BY ROLLUP ( 97 | segmento, produto 98 | ); 99 | 100 | /** 101 | *3º Exemplo. 102 | */ 103 | 104 | /** 105 | *Ordenar as colunas produto e segmento utilizando order by 106 | */ 107 | 108 | SELECT 109 | COALESCE(segmento, 'TOTAL GERAL') AS segmento, 110 | CASE 111 | WHEN ((segmento IS NOT NULL) AND (produto IS NULL)) 112 | THEN CONCAT('Subtotal - ', segmento) 113 | WHEN (segmento IS NOT NULL AND produto IS NOT NULL) 114 | THEN produto 115 | END AS produto, 116 | valor FROM 117 | ( 118 | SELECT 119 | segmento, 120 | CASE 121 | WHEN(segmento IS NOT NULL) THEN 0 122 | ELSE 1 123 | END AS segmento_ordem, 124 | produto, 125 | CASE 126 | WHEN(produto IS NOT NULL) THEN 0 127 | ELSE 1 128 | END AS produto_ordem, 129 | SUM(valor) AS valor 130 | FROM tb_fornecedor 131 | GROUP BY ROLLUP(segmento, produto) 132 | ) TOTAL 133 | ORDER BY 134 | segmento, 135 | segmento_ordem, 136 | produto_ordem, 137 | produto; 138 | -------------------------------------------------------------------------------- /copiar_dados_de_uma_tabela_para_uma_nova_tabela_no_SQL_SERVER/Criar uma tabela no SQL SERVER a partir de uma tabela existente.sql: -------------------------------------------------------------------------------- 1 | /** 2 | *Script do exemplo: Criar uma tabela no SQL SERVER a partir de uma tabela existente DO BLOG DICAS SQL & JQUERY 3 | *Data: 25/06/2017 Hora: 05:48:25 4 | *Link do artigo: http://jquerydicas.blogspot.com.br/2017/06/copiar-dados-de-uma-tabela-para-uma.html 5 | 6 | *Este post é dividido em duas partes: 7 | 8 | 1ª parte: damos um exemplo de como criar a tabela "tb_paciente"; 9 | 2ª parte: vamos fazer a cópia da tabela "tb_paciente" chamada "tb_paciente_bkp" 10 | 3ª parte: vamos aprender a fazer a cópia da tabela "tb_paciente" chamada "tb_paciente_bkp_altera_col" com nome das 11 | colunas diferentes das colunas da tabela original. 12 | 13 | */ 14 | 15 | --1ª Parte 16 | 17 | /** 18 | *Criação da tabela "tb_paciente" 19 | */ 20 | 21 | CREATE TABLE tb_paciente 22 | ( 23 | prontuario int IDENTITY(1,1) PRIMARY KEY, 24 | nome varchar(255) NOT NULL , 25 | data_nasc date NOT NULL , 26 | sexo character(1) NOT NULL , 27 | peso numeric(6,3), 28 | proc_cirurgico bit NOT NULL 29 | ); 30 | 31 | /** 32 | *Inclusão dos registros na tabela "tb_paciente" 33 | */ 34 | 35 | INSERT INTO tb_paciente (nome, data_nasc, sexo, peso, proc_cirurgico) 36 | VALUES ('Maria Santos', '1984-04-20', 'f', 52.440, 1); 37 | 38 | INSERT INTO tb_paciente(nome, data_nasc, sexo, peso, proc_cirurgico) 39 | VALUES ('João Silva', '1974-08-29', 'm', 80.520 , 0); 40 | 41 | INSERT INTO tb_paciente(nome , data_nasc , sexo , peso , proc_cirurgico) 42 | VALUES('Ana Moraes', '1982-10-30', 'f', 57.700, 1); 43 | 44 | 45 | /** 46 | *Seleção dos registros na tabela "tb_paciente" 47 | */ 48 | 49 | SELECT 50 | prontuario , 51 | nome , 52 | data_nasc , 53 | sexo , 54 | peso , 55 | proc_cirurgico 56 | FROM tb_paciente; 57 | 58 | --2ª Parte 59 | 60 | /** 61 | * A sentença SQL abaixo, cria a cópia da tabela "tb_paciente". Esta tabela se chamará "tb_paciente_bkp ". 62 | */ 63 | SELECT * INTO tb_paciente_bkp FROM tb_paciente; 64 | 65 | 66 | --3ª Parte 67 | /** 68 | * A sentença SQL abaixo, cria a cópia da tabela "tb_paciente". Esta tabela se chamará 69 | *"tb_paciente_bkp_altera_col". 70 | * Perceba que as colunas foram criadas com nomes diferentes da original, para isso utilizamos "AS" ao lado do 71 | * do novo nome de cada coluna. 72 | */ 73 | SELECT 74 | prontuario AS pac_prontuario , 75 | nome AS pac_nome, 76 | data_nasc AS pac_data_nasc , 77 | sexo AS pac_sexo, 78 | peso AS pac_peso, 79 | proc_cirurgico AS pac_proc_cirurgico 80 | INTO tb_paciente_bkp_altera_col 81 | FROM tb_paciente; 82 | 83 | 84 | --4ª Parte 85 | /* 86 | *Existe a possibilidade de criar uma nova tabela, apena com alguns registros da tabela original, 87 | *para isso utilizaremos um filtro, representado pelo comando "WHERE". 88 | *Vamos criar a tabela "tb_paciente_bkp_filt", a partir da tabela "tb_paciente", 89 | *e vamos filtrar os pacientes, somente do sexo feminino, ou seja, sexo = 'f'. 90 | */ 91 | 92 | SELECT 93 | prontuario, 94 | nome, 95 | data_nasc, 96 | sexo, 97 | peso, 98 | proc_cirurgico 99 | INTO tb_paciente_bkp_filt 100 | FROM tb_paciente 101 | WHERE sexo = 'f'; 102 | 103 | --5ª Parte 104 | /* 105 | Existe a possibilidade de criar uma nova tabela, apena com algumas colunas da tabela original, para isso, 106 | colocaremos apenas as colunas desejadas, após o comando "SELECT". 107 | Vamos criar a tabela "tb_paciente_bkp_col", a partir da tabela "tb_paciente", apenas com algumas colunas da tabela original. 108 | Neste caso, vamos escolher as colunas: "prontuario", "nome" e "peso" 109 | */ 110 | 111 | SELECT 112 | prontuario, 113 | nome, 114 | peso 115 | INTO tb_paciente_bkp_col 116 | FROM tb_paciente; 117 | -------------------------------------------------------------------------------- /artigo_postgre_lower_upper_initcap/funcao_lower_upper_e_initcap.sql: -------------------------------------------------------------------------------- 1 | /** 2 | *Atenção!!! Descomente a sentença abaixo, somente se desejar excluir a tabela locacao_filiais ou alunos 3 | */ 4 | --DROP TABLE IF EXISTS locacao_filiais; 5 | --DROP TABLE IF EXISTS alunos; 6 | 7 | /** 8 | *Criação da tabela locacao_filiais 9 | */ 10 | CREATE TABLE locacao_filiais 11 | ( 12 | tipo_logradouro varchar(15), 13 | logradouro varchar(100), 14 | numero integer, 15 | complemento character varying(40), 16 | bairro character varying(35) 17 | 18 | ); 19 | 20 | /** 21 | *Inclusão dos registros na tabela locacao_filiais 22 | */ 23 | INSERT INTO 24 | locacao_filiais(tipo_logradouro, logradouro, numero, complemento, bairro) 25 | VALUES 26 | ('Avenida', 'Domingos de Moraes', 10574, '2º ANDAR', 'Vila Mariana'), 27 | ('Rua', 'Enxovia', 1124, NULL, 'Paraíso'), 28 | ('Rua', 'Paes da Silva', 540, NULL, 'Lapa'); 29 | 30 | /** 31 | *Exibe os registros da tabela criada 32 | */ 33 | SELECT * FROM locacao_filiais; 34 | 35 | /** 36 | *A função lower converte todos os caracteres de uma string string para minúsculo. 37 | *Neste caso utilizamos esta função na coluna logradouro. 38 | */ 39 | SELECT 40 | tipo_logradouro, 41 | LOWER(logradouro), 42 | numero, 43 | complemento, 44 | bairro 45 | FROM locacao_filiais; 46 | 47 | /** 48 | *Quando utilizamos a função lower, o nome da coluna passa a ter o mesmo nome da função. 49 | *Se quisermos que o nome da coluna continue se chamando "logradouro" ou quisermos que tenha um outro nome 50 | *devemos criar um alias (apelido) depois do AS. 51 | *Neste exemplo eu preferi que ela continue se chamando "logradouro", 52 | *então coloquei logradouro depois do AS 53 | */ 54 | 55 | SELECT 56 | tipo_logradouro, 57 | LOWER(logradouro) AS logradouro, 58 | numero, 59 | complemento, 60 | bairro 61 | FROM locacao_filiais; 62 | 63 | /** 64 | *A função upper converte todos os caracteres de uma string string para minúsculo. 65 | *Neste caso utilizamos esta função na coluna logradouro. 66 | */ 67 | 68 | SELECT 69 | tipo_logradouro, 70 | UPPER(logradouro), 71 | numero, 72 | complemento, 73 | bairro 74 | FROM locacao_filiais; 75 | 76 | /** 77 | *Quando utilizamos a função upper, o nome da coluna passa a ter o mesmo nome da função. 78 | *Se quisermos que o nome da coluna continue se chamando "logradouro" ou quisermos que tenha um outro nome 79 | *devemos criar um alias (apelido) depois do AS. 80 | *Neste exemplo eu preferi que ela continue se chamando "logradouro", 81 | *então coloquei logradouro depois do AS 82 | */ 83 | SELECT 84 | tipo_logradouro, 85 | UPPER(logradouro) AS logradouro, 86 | numero, 87 | complemento, 88 | bairro 89 | FROM locacao_filiais; 90 | 91 | 92 | /** 93 | *Criação da tabela alunos 94 | */ 95 | CREATE TABLE alunos 96 | 97 | ( 98 | cod_matricula integer, 99 | nome varchar(255) 100 | ); 101 | 102 | /** 103 | *Inclusão dos registros na tabela alunos 104 | */ 105 | INSERT INTO 106 | alunos(cod_matricula, nome) 107 | VALUES 108 | (14245, 'bruno da silva araújo'), 109 | (14246, 'paulo santos oliveira'), 110 | (14247, 'cristina costa'); 111 | 112 | /** 113 | *Exibe os registros da tabela criada 114 | */ 115 | SELECT * FROM alunos; 116 | 117 | /** 118 | *A função initcap converte o primeiro carácter de cada palavra para maiúsculo. 119 | *O restante das letras ficam em minúsculo. 120 | */ 121 | SELECT 122 | cod_matricula, 123 | INITCAP(nome) 124 | FROM alunos; 125 | 126 | /** 127 | *Quando utilizamos a função initcap, o nome da coluna passa a ter o mesmo nome da função. 128 | *Se quisermos que o nome da coluna continue se chamando "nome" ou quisermos que tenha um outro nome 129 | *devemos criar um alias (apelido) depois do "AS". 130 | Neste exemplo eu preferi que ela continue se chamando "nome", então coloquei "nome" depois do "AS". 131 | */ 132 | SELECT 133 | cod_matricula, 134 | INITCAP(nome) AS nome 135 | FROM alunos; 136 | 137 | 138 | 139 | -------------------------------------------------------------------------------- /artigo_postgre_extrair_parte_de_uma_data_com_extract/artigo_postgre_extract.sql: -------------------------------------------------------------------------------- 1 | /** 2 | *Descomente o comando abaixo somente se desejar excluir a tabela tb_exame. 3 | */ 4 | --DROP TABLE IF EXISTS tb_exame; 5 | 6 | /** 7 | *Descomente o comando abaixo somente se desejar excluir a tabela tb_funcionarios. 8 | */ 9 | --DROP TABLE IF EXISTS tb_funcionarios; 10 | 11 | /** 12 | *Cria a tabela tb_exame. 13 | */ 14 | CREATE TABLE tb_exame 15 | ( 16 | paciente_id integer, 17 | nome_exame character varying(50), 18 | data_exame timestamp 19 | ); 20 | 21 | /** 22 | *Inclui os registros na tabela tb_exame. 23 | */ 24 | INSERT INTO 25 | tb_exame (paciente_id, nome_exame, data_exame) 26 | VALUES 27 | (1, 'Urina', '2012-11-13 07:14:24'), 28 | (2, 'Sangue', '2012-07-06 18:11:25'), 29 | (3, 'Ultrasson', '2013-11-05 20:11:27'), 30 | (4, 'Urina', '2013-12-20 12:11:01'), 31 | (5, 'Sangue', '2013-07-03 16:42:02'), 32 | (6, 'Ultrasson', '2013-01-14 17:25:04'), 33 | (7, 'Urina', '2013-02-17 15:30:07'), 34 | (8, 'Sangue', '2013-03-19 19:24:09'), 35 | (9, 'Ultrasson', '2013-04-21 20:30:15'), 36 | (10, 'Urina', '2013-05-27 20:44:39'); 37 | 38 | /** 39 | *Exibe os registros da tabela tb_exame. 40 | */ 41 | SELECT * FROM tb_exame; 42 | 43 | /** 44 | *1ºExemplo 45 | */ 46 | SELECT 47 | paciente_id, 48 | data_exame, 49 | /*exibe o dia do exame*/ 50 | extract( day from data_exame ) AS dia, 51 | /*exibe o mês do exame*/ 52 | extract( month from data_exame ) AS mes, 53 | /*exibe o ano do exame*/ 54 | extract(year from data_exame ) AS ano, 55 | /*exibe a hora do exame*/ 56 | extract( hour from data_exame ) AS hora, 57 | /*exibe o minuto do exame*/ 58 | extract( minute from data_exame ) AS minuto, 59 | /*exibe o segundo do exame*/ 60 | extract( second from data_exame ) AS segundo, 61 | /*exibe os dias da semana que são representados por números inteiros de 0 até 6 62 | *0 - domingo, 1 - segunda e assim sucessivamente até 6 - sábado 63 | */ 64 | extract( dow from data_exame ) AS int_semana 65 | FROM tb_exame; 66 | 67 | /** 68 | *2ºExemplo 69 | */ 70 | SELECT 71 | extract( year from data_exame ) AS ano, 72 | /*A função COUNT faz a contagem*/ 73 | COUNT(*) AS quantidade 74 | FROM tb_exame 75 | /*Agrupa por ano*/ 76 | GROUP BY ano 77 | /*Ordena por ano em ordem crescente*/ 78 | ORDER BY ano; 79 | 80 | /** 81 | *3ºExemplo 82 | */ 83 | 84 | /** 85 | *Retornar a data atual. 86 | */ 87 | SELECT CURRENT_DATE; 88 | 89 | /** 90 | *Cria a tabela tb_funcionários. 91 | */ 92 | CREATE TABLE tb_funcionarios 93 | ( 94 | func_codigo serial, 95 | func_nome character varying(200), 96 | func_data_nascimento date 97 | ); 98 | 99 | /** 100 | *Insere os registros na tabela tb_funcionarios. 101 | */ 102 | INSERT INTO tb_funcionarios(func_codigo, func_nome, func_data_nascimento) 103 | VALUES 104 | (DEFAULT, 'Ana Sousa', '1984-05-25'), 105 | (DEFAULT, 'Paulo Silva', '1978-03-28'), 106 | (DEFAULT, 'Rui Costa', '1982-11-15'), 107 | (DEFAULT, 'Marina Lima', '1982-01-14'), 108 | (DEFAULT, 'Karina Oliveira', '1984-03-28'), 109 | (DEFAULT, 'Carlos Pereira', '1982-06-19'); 110 | 111 | /** 112 | *Exibe os registros da tabela tb_funcionarios. 113 | */ 114 | SELECT * FROM tb_funcionarios; 115 | 116 | 117 | /** 118 | *Exibe os aniversariantes do mes. 119 | */ 120 | SELECT 121 | func_codigo, 122 | func_nome, 123 | func_data_nascimento 124 | FROM tb_funcionarios 125 | WHERE 126 | /*Verifica se o dia do aniversário é igual ao dia atual*/ 127 | EXTRACT (DAY FROM func_data_nascimento) = EXTRACT (DAY FROM CURRENT_DATE) 128 | /* 129 | Operador lógico AND (E) seleciona um registro, somente se, as duas condições forem 130 | satisfeitas, ou seja se o dia e o mês da data de nascimento forem iguais ao dia e o mês da data atual. 131 | */ 132 | AND 133 | /*Verifica se o mês do aniversário é igual ao mês atual*/ 134 | EXTRACT (MONTH FROM func_data_nascimento) = EXTRACT (MONTH FROM CURRENT_DATE); 135 | 136 | 137 | -------------------------------------------------------------------------------- /Postgresql - Função split_part/split_part.sql: -------------------------------------------------------------------------------- 1 | /* 2 | Veja o artigo referente a este script em: 3 | https://jquerydicas.blogspot.com/2025/11/postgresql-funcao-splitpart.html 4 | 5 | Exemplo da função split_part no Postgresql 6 | A função split_part divide a string em duas ou mais partes (pedaços) e retorna um determinado pedaço de acordo com a posição escohida. 7 | SINTAXE 8 | 9 | split_part(string, 'delimitador', posição) 10 | 11 | Onde: 12 | delimitador: o caractere ou o conjunto de caracteres que indica onde a string será quebrada em pedaços. Este delimitador deve ser usado entre aspas simples; 13 | posição: qual o pedaço da string será retornado pela função. Preencha com 1 para o 1º pedaço, 2 para o 2º pedaço, 3 para o 3º pedaço, e assim por diante 14 | 15 | Vamos usar como exemplos e-mails, separando a parte do usuário e a parte do dominio do e-mail. 16 | Na prática: 17 | -no e-mail maria@gmail.com: o usuário (é o que vem antes do "@" neste caso maria), já o domínio (é o que vem depois do "@" neste caso "gmail.com"); 18 | -no e-mail joao123@outlook.com: o usuário (é o que vem antes do "@" neste caso joao123) já o domínio (é o que vem depois do "@" neste caso "outlook.com"); 19 | -no e-mail carolina.alves@empresax.com.br: o usuário (é o que vem antes do "@" neste caso carolina.alves) já o domínio (é o que vem depois do "@" neste caso "empresax.com.br"); 20 | */ 21 | 22 | 23 | /* 24 | Criar a tabela clientes 25 | */ 26 | CREATE table clientes 27 | ( 28 | id serial, 29 | nome varchar(255), 30 | e_mail varchar(256), 31 | CONSTRAINT pk_id PRIMARY KEY(id) 32 | ); 33 | 34 | /* 35 | Inserir dados na tabela clientes 36 | */ 37 | --Insert de e-mails válidos 38 | INSERT INTO clientes (nome, e_mail) VALUES ('Maria Silva', 'maria@gmail.com'); 39 | INSERT INTO clientes (nome, e_mail) VALUES ('João Sousa', 'joao123@outlook.com'); 40 | INSERT INTO clientes (nome, e_mail) VALUES ('Carolina Alves', 'carolina.alves@empresax.com.br'); 41 | 42 | --Insert de e-mails inválidos 43 | INSERT INTO clientes (nome, e_mail) VALUES ('Joana Pereira', 'joanaoutlook.com'); 44 | INSERT INTO clientes (nome, e_mail) VALUES ('Carlos Novaes', 'carlos@'); 45 | INSERT INTO clientes (nome, e_mail) VALUES ('Carla Santos', 'carlagmail.com@'); 46 | INSERT INTO clientes (nome, e_mail) VALUES ('Paulo Gomes', '@paulogomesgmail.com'); 47 | 48 | /* 49 | Exibir os registros da tabela clientes com todas as colunas 50 | */ 51 | SELECT * FROM clientes; 52 | 53 | /* 54 | -Exibir a coluna e-mail 55 | -exibir a coluna usuario - 1ª parte do split antes do @ 56 | -exibir a coluna dominio - 2ª parte do split depois do @ 57 | */ 58 | --Veja os registros que possuem e-mails válidos 59 | SELECT 60 | e_mail, 61 | split_part(e_mail, '@', 1), 62 | split_part(e_mail, '@', 2) 63 | FROM clientes 64 | WHERE id <= 3; 65 | 66 | /* 67 | Exibir os registros válidos com as colunas: 68 | -e-mail 69 | -exibir a coluna usuario - 1ª parte do split antes do @ com alias (apelido) para o nome da coluna para facilitar a identificação da coluna. 70 | -exibir a coluna dominio - 2ª parte do split depois do @ com alias (apelido) para o nome da coluna para facilitar a identificação da coluna. 71 | */ 72 | SELECT 73 | e_mail, 74 | split_part(e_mail, '@', 1) AS usuario, 75 | split_part(e_mail, '@', 2) AS dominio 76 | FROM clientes 77 | WHERE id <= 3; 78 | 79 | /* 80 | Antes de usar "SPLIT_PART", verifique 81 | -se o delimitador existe na string: para evitar resultados inesperados. Neste exemplo foi o "@". 82 | -se o delimitador está bem posicionado: no caso deste exemplo, em específico, verificar se o "@" não está no início ou no fim do e-mail 83 | Se o delimitador NÃO for encontrado ou estiver mal posicionado, algum pedaço de string será vazia. 84 | */ 85 | 86 | /* 87 | Exibir os registro inválidos com as colunas: 88 | -e-mail 89 | -exibir a coluna usuario: 1ª parte do split antes do @ com alias (apelido) para o nome da coluna para facilitar a identificação da coluna. 90 | -exibir a coluna dominio: 2ª parte do split depois do @ com alias (apelido) para o nome da coluna para facilitar a identificação da coluna. 91 | */ 92 | SELECT 93 | e_mail, 94 | split_part(e_mail, '@', 1) AS usuario, 95 | split_part(e_mail, '@', 2) AS dominio 96 | FROM clientes 97 | WHERE id > 3; 98 | -------------------------------------------------------------------------------- /artigo_postgre_diferenca_data/postgre_diferenca_entre_datas.sql: -------------------------------------------------------------------------------- 1 | /** 2 | *ATENÇÃO!!! PARA EXCLUIR A TABELA tb_locacao, DESCOMENTE A LINHA ABAIXO 3 | */ 4 | --DROP TABLE tb_locacao; 5 | 6 | /** 7 | *ATENÇÃO!!! PARA EXCLUIR A TABELA tb_cadastro, DESCOMENTE A LINHA ABAIXO 8 | */ 9 | --DROP TABLE tb_cadastro; 10 | /** 11 | *ATENÇÃO!!! PARA EXCLUIR A TABELA tb_manutencao, DESCOMENTE A LINHA ABAIXO 12 | */ 13 | --DROP TABLE tb_manutencao; 14 | 15 | /** 16 | *Criar a tabela "tb_locacao". 17 | */ 18 | CREATE TABLE tb_locacao 19 | ( 20 | imovel_id serial, 21 | data_oferta date, 22 | data_locacao date 23 | ); 24 | 25 | /** 26 | *Incluir os registros na tabela "tb_locacao". 27 | */ 28 | INSERT INTO tb_locacao(imovel_id, data_oferta, data_locacao) VALUES(DEFAULT, '2013-01-14', '2013-02-17'); 29 | INSERT INTO tb_locacao(imovel_id, data_oferta, data_locacao) VALUES(DEFAULT, '2013-11-27', '2014-02-09'); 30 | INSERT INTO tb_locacao(imovel_id, data_oferta, data_locacao) VALUES(DEFAULT, '2013-07-27', '2014-03-01'); 31 | INSERT INTO tb_locacao(imovel_id, data_oferta, data_locacao) VALUES(DEFAULT, '2013-01-05', '2014-02-28'); 32 | INSERT INTO tb_locacao(imovel_id, data_oferta, data_locacao) VALUES(DEFAULT, '2014-01-05', '2014-02-08'); 33 | INSERT INTO tb_locacao(imovel_id, data_oferta, data_locacao) VALUES(DEFAULT, '2014-02-06', '2014-02-09'); 34 | 35 | /** 36 | *Calculo da diferença entre a data da locação e a data de oferta, em dias 37 | */ 38 | SELECT 39 | imovel_id, 40 | data_oferta, 41 | data_locacao, 42 | data_locacao - data_oferta AS quantidade_dias 43 | FROM tb_locacao; 44 | 45 | /** 46 | *Calculo do intervalo, em ano(s), mes(es) e dia(s) entre a data da locação e a data de oferta. 47 | */ 48 | SELECT 49 | imovel_id, 50 | data_oferta, 51 | data_locacao, 52 | /*Calculo da diferença entre a data da locação e a data de oferta*/ 53 | AGE(data_locacao, data_oferta) AS intervalo 54 | FROM tb_locacao; 55 | 56 | /** 57 | *Calculo do intervalo, em ano(s), mes(es) e dia(s) entre a data da locação e a data de oferta. 58 | *Intervalo, formatado com a função to_char. 59 | */ 60 | SELECT 61 | imovel_id, 62 | data_oferta, 63 | data_locacao, 64 | /*Calculo da diferença entre a data da locação e a data de oferta*/ 65 | TO_CHAR ( AGE(data_locacao, data_oferta) , 'YY "ano(s)" MM "mes(es)" DD "dia(s)" ' ) AS intervalo 66 | FROM tb_locacao; 67 | 68 | /** 69 | *Criar tabela "tb_cadastro". 70 | */ 71 | CREATE TABLE tb_cadastro ( 72 | cliente_id serial, 73 | data_cadastro date 74 | ); 75 | 76 | /** 77 | *Incluir o registros na tabela "tb_cadastro". 78 | */ 79 | INSERT INTO tb_cadastro (cliente_id, data_cadastro) VALUES 80 | (DEFAULT, '2013-06-13'), 81 | (DEFAULT, '2013-07-15'), 82 | (DEFAULT, '2013-08-13'), 83 | (DEFAULT, '2013-10-20'), 84 | (DEFAULT, '2013-11-25'), 85 | (DEFAULT, '2014-01-10'), 86 | (DEFAULT, '2014-02-15'), 87 | (DEFAULT, '2014-03-25'); 88 | 89 | /** 90 | *Exibir a data atual. 91 | */ 92 | SELECT CURRENT_DATE; 93 | 94 | /** 95 | *Exibir clientes cadastrados a mais de 90 dias 96 | */ 97 | SELECT 98 | cliente_id, 99 | data_cadastro, 100 | /*calcula a diferença de dias*/ 101 | CURRENT_DATE - data_cadastro AS quantidade_dias 102 | FROM tb_cadastro 103 | /*filtra somente os clientes que são cadastrados há mais que 90 dias*/ 104 | WHERE CURRENT_DATE - data_cadastro > 90; 105 | 106 | /** 107 | *Criar a tabela "tb_manutencao". 108 | */ 109 | CREATE TABLE tb_manutencao 110 | ( 111 | equipamento_id serial, 112 | data_inicio timestamp, 113 | data_final timestamp 114 | ); 115 | 116 | /** 117 | *Inseri os registros na tabela "tb_manutencao" 118 | */ 119 | INSERT INTO tb_manutencao VALUES(DEFAULT, '2014-03-04 13:42:21', '2014-03-08 06:34:15'); 120 | INSERT INTO tb_manutencao VALUES(DEFAULT, '2014-03-08 07:12:15', '2014-03-11 20:16:10'); 121 | INSERT INTO tb_manutencao VALUES(DEFAULT, '2014-02-15 17:14:18', '2014-02-16 09:40:52'); 122 | INSERT INTO tb_manutencao VALUES(DEFAULT, '2014-01-20 21:24:14', '2014-01-22 11:10:15'); 123 | 124 | /** 125 | *Exibe os equipamentos que tiveram manutenção maior ou igual a 80 horas 126 | */ 127 | SELECT 128 | equipamento_id, 129 | data_inicio, 130 | data_final, 131 | age(data_final, data_inicio) 132 | FROM tb_manutencao 133 | WHERE age(data_final, data_inicio) >= '80 hour'; -------------------------------------------------------------------------------- /artigo_postgresql_funcao_lag/PostgreSql - Função LAG - Diferença de tempo para uma mesma coluna.sql: -------------------------------------------------------------------------------- 1 | /** 2 | *Caso queira excluir as tabelas do exemplo. Descomente o comando "DROP" abaixo: 3 | */ 4 | --DROP TABLE IF EXISTS tb_venda, tb_venda_depart; 5 | 6 | /** 7 | *1º Exemplo 8 | */ 9 | 10 | /** 11 | *Cria a tabela tb_venda 12 | */ 13 | CREATE TABLE tb_venda 14 | ( 15 | cliente_id integer, 16 | data_hora timestamp without time zone 17 | ); 18 | 19 | /** 20 | *Insere os registros na tabela tb_venda 21 | */ 22 | INSERT INTO tb_venda VALUES 23 | (542, '2014-11-26 23:30:01'), 24 | (543, '2014-11-26 23:36:45'), 25 | (544, '2014-11-26 23:47:13'), 26 | (545, '2014-11-26 23:58:17'), 27 | (546, '2014-11-27 01:05:19'), 28 | (547, '2014-11-27 01:12:27'), 29 | (548, '2014-11-27 01:20:08'), 30 | (549, '2014-11-27 01:25:06'); 31 | 32 | 33 | /** 34 | *Visualiza os registros na tabela tb_venda 35 | */ 36 | SELECT * FROM tb_venda; 37 | 38 | /** 39 | *Calcula o intervalo de tempo de espera para cada cliente 40 | */ 41 | SELECT 42 | cliente_id, 43 | data_hora, 44 | data_hora - LAG(data_hora) OVER (ORDER BY data_hora) AS tempo_espera 45 | FROM tb_venda; 46 | 47 | 48 | /** 49 | *2º Exemplo 50 | */ 51 | 52 | /** 53 | *Cria a tabela tb_venda_depart 54 | */ 55 | CREATE TABLE tb_venda_depart 56 | ( 57 | cliente_id integer, 58 | data_hora timestamp without time zone 59 | ); 60 | 61 | 62 | /** 63 | *Insere os registros na tabela tb_venda_depart 64 | */ 65 | INSERT INTO tb_venda_depart VALUES 66 | (542, '2014-11-26 22:22:01'), 67 | (543, '2014-11-26 22:24:45'), 68 | (544, '2014-11-26 22:26:13'), 69 | (545, '2014-11-26 22:35:17'), 70 | (546, '2014-11-27 08:03:19'), 71 | (547, '2014-11-27 08:07:27'), 72 | (548, '2014-11-27 08:10:08'), 73 | (549, '2014-11-27 08:16:06'); 74 | 75 | /** 76 | *Visualiza os registros na tabela tb_venda_depart 77 | */ 78 | SELECT * FROM tb_venda_depart; 79 | 80 | /** 81 | *Calcula o intervalo de tempo de espera para cada cliente, desconsiderando o tempo 82 | *em que a loja estava fechada, ou seja o calculo de intervalo de tempo é feito por dia. 83 | */ 84 | SELECT 85 | cliente_id, 86 | data_hora, 87 | data_hora - LAG(data_hora) 88 | OVER (PARTITION BY(DATE_TRUNC('DAY', data_hora)) ORDER BY data_hora) AS tempo_espera 89 | FROM tb_venda_depart; 90 | 91 | /** 92 | *3º Exemplo 93 | */ 94 | 95 | /** 96 | *Calcula a média do intervalo de espera 97 | */ 98 | WITH cliente_periodo AS 99 | ( 100 | SELECT 101 | cliente_id, 102 | data_hora, 103 | data_hora - LAG(data_hora) 104 | OVER (PARTITION BY(DATE_TRUNC('DAY', data_hora)) ORDER BY data_hora) AS tempo_espera 105 | FROM tb_venda_depart 106 | ) 107 | SELECT AVG(tempo_espera) AS media_tempo_espera 108 | FROM cliente_periodo; 109 | 110 | /** 111 | *4º Exemplo 112 | */ 113 | 114 | /** 115 | *Calcula a média de espera por dia 116 | */ 117 | WITH cliente_periodo AS 118 | ( 119 | SELECT 120 | cliente_id, 121 | data_hora, 122 | data_hora - LAG(data_hora) 123 | OVER (PARTITION BY(DATE_TRUNC('DAY', data_hora)) ORDER BY data_hora) AS tempo_espera 124 | FROM tb_venda_depart 125 | ) 126 | SELECT DATE_TRUNC('DAY', data_hora), AVG(tempo_espera) 127 | FROM cliente_periodo 128 | GROUP BY DATE_TRUNC('DAY', data_hora); 129 | 130 | /** 131 | *Formata a data 132 | */ 133 | WITH cliente_periodo AS 134 | ( 135 | SELECT 136 | cliente_id, 137 | data_hora, 138 | data_hora - LAG(data_hora) 139 | OVER (PARTITION BY(DATE_TRUNC('DAY', data_hora)) ORDER BY data_hora) AS tempo_espera 140 | FROM tb_venda_depart 141 | ) 142 | SELECT TO_CHAR(data_hora, 'DD/MM/YYYY') AS DATA, AVG(tempo_espera) AS media_tempo_espera 143 | FROM cliente_periodo 144 | GROUP BY TO_CHAR(data_hora, 'DD/MM/YYYY'); 145 | 146 | /** 147 | *Truncar a média de tempo de espera 148 | */ 149 | WITH cliente_periodo AS 150 | ( 151 | SELECT 152 | cliente_id, 153 | data_hora, 154 | data_hora - LAG(data_hora) 155 | OVER (PARTITION BY(DATE_TRUNC('DAY', data_hora)) ORDER BY data_hora) AS tempo_espera 156 | FROM tb_venda_depart 157 | ) 158 | SELECT TO_CHAR(data_hora, 'DD/MM/YYYY') AS DATA, 159 | DATE_TRUNC('SECOND',AVG(tempo_espera)) AS media_tempo_espera 160 | FROM cliente_periodo 161 | GROUP BY TO_CHAR(data_hora, 'DD/MM/YYYY'); 162 | -------------------------------------------------------------------------------- /postgresql_calcular-subtotal_total_equivalente_WITH_ROLLUP_mysql/postgresql_calcular_subtotal_total.sql: -------------------------------------------------------------------------------- 1 | /** 2 | * IMPORTANTE!!! 3 | * DESCOMENTE A SENTENÇA ABAIXO SOMENTE SE DESEJAR EXCLUIR A TABELA tb_fornecedor 4 | */ 5 | /*DROP TABLE IF EXISTS tb_fornecedor;*/ 6 | 7 | /** 8 | *Cria a tabela tb_fornecedor. 9 | */ 10 | CREATE TABLE tb_fornecedor 11 | ( 12 | segmento character varying(70), 13 | produto character varying(70), 14 | valor numeric(11,2) 15 | ); 16 | 17 | 18 | /** 19 | *Inclui os dados na tabela tb_fornecedor. 20 | */ 21 | INSERT INTO tb_fornecedor VALUES('Papelaria e informática','HD 500 GB', 300.00); 22 | INSERT INTO tb_fornecedor VALUES('Papelaria e informática', 'Tonner', 250.00); 23 | 24 | INSERT INTO tb_fornecedor VALUES('Marcenaria', 'Cadeira', 50.00); 25 | INSERT INTO tb_fornecedor VALUES('Marcenaria', 'Mesa', 600.00); 26 | INSERT INTO tb_fornecedor VALUES('Marcenaria', 'Armário', 900.00); 27 | 28 | INSERT INTO tb_fornecedor VALUES('Serralheria', 'Corrimão', 400.00); 29 | INSERT INTO tb_fornecedor VALUES('Serralheria', 'Portão', 1500.00); 30 | INSERT INTO tb_fornecedor VALUES('Serralheria', 'Grade de proteção para janela', 800.00); 31 | 32 | INSERT INTO tb_fornecedor VALUES('Limpeza e higiêne', 'Detergente', 5.00); 33 | INSERT INTO tb_fornecedor VALUES('Limpeza e higiêne','Desinfetante', 40.00); 34 | INSERT INTO tb_fornecedor VALUES('Limpeza e higiêne', 'Papel toalha', 60.00); 35 | 36 | /** 37 | *Exibe os dados da tabela tb_fornecedor. 38 | */ 39 | SELECT * FROM tb_fornecedor; 40 | 41 | /** 42 | *1º Exemplo - Calcular os subtotais e total para cada segmento. 43 | */ 44 | 45 | --RESOLVENDO COM SUBQUERY 46 | SELECT 47 | segmento, 48 | produto, 49 | valor 50 | FROM 51 | ( 52 | SELECT segmento, produto, SUM(valor) valor 53 | FROM tb_fornecedor 54 | GROUP BY segmento, produto 55 | UNION ALL 56 | SELECT segmento, NULL AS produto, SUM(valor) valor 57 | FROM tb_fornecedor 58 | GROUP BY segmento 59 | UNION ALL 60 | SELECT NULL AS segmento, NULL AS produto, SUM(valor) AS valor 61 | FROM tb_fornecedor 62 | ) CALCULO 63 | ORDER BY segmento, produto; 64 | 65 | 66 | --RESOLVENDO COM WITH 67 | 68 | WITH CALCULO AS 69 | ( 70 | SELECT segmento, produto, SUM(valor) valor 71 | FROM tb_fornecedor 72 | GROUP BY segmento, produto 73 | UNION 74 | SELECT segmento, NULL AS produto, SUM(valor) valor 75 | FROM tb_fornecedor 76 | GROUP BY segmento 77 | UNION 78 | SELECT NULL AS segmento, NULL AS produto, SUM(valor) AS valor 79 | FROM tb_fornecedor 80 | ) 81 | SELECT 82 | segmento, 83 | produto, 84 | valor 85 | FROM calculo 86 | ORDER BY segmento, produto; 87 | 88 | /** 89 | *2º EXEMPLO - Para facilitarmos a interpretação do resultado da consulta, 90 | *vamos indicar os subtotais e o total geral 91 | */ 92 | 93 | --RESOLVENDO COM SUBQUERY 94 | SELECT 95 | COALESCE(segmento, 'TOTAL GERAL') AS segmento, 96 | CASE 97 | WHEN(segmento IS NOT NULL AND produto IS NOT NULL) THEN produto 98 | WHEN(segmento IS NOT NULL AND produto IS NULL) THEN 'SUBTOTAL' || ' - '|| segmento 99 | END AS produto, 100 | valor 101 | FROM 102 | ( 103 | SELECT segmento, produto, SUM(valor) valor 104 | FROM tb_fornecedor 105 | GROUP BY segmento, produto 106 | UNION 107 | SELECT segmento, NULL AS produto, SUM(valor) valor 108 | FROM tb_fornecedor 109 | GROUP BY segmento 110 | UNION 111 | SELECT NULL AS segmento, NULL AS produto, SUM(valor) AS valor 112 | FROM tb_fornecedor 113 | ) CALCULO 114 | ORDER BY segmento, produto; 115 | 116 | --RESOLVENDO COM WITH 117 | 118 | WITH CALCULO AS 119 | ( 120 | SELECT segmento, produto, SUM(valor) valor 121 | FROM tb_fornecedor 122 | GROUP BY segmento, produto 123 | UNION 124 | SELECT segmento, NULL AS produto, SUM(valor) valor 125 | FROM tb_fornecedor 126 | GROUP BY segmento 127 | UNION 128 | SELECT NULL AS segmento, NULL AS produto, SUM(valor) AS valor 129 | FROM tb_fornecedor 130 | ) 131 | SELECT 132 | COALESCE(segmento, 'TOTAL GERAL') AS segmento, 133 | CASE 134 | WHEN(segmento IS NOT NULL AND produto IS NOT NULL) THEN produto 135 | WHEN(segmento IS NOT NULL AND produto IS NULL) THEN 'SUBTOTAL' || ' - '|| segmento 136 | END AS produto, 137 | valor 138 | FROM calculo 139 | ORDER BY segmento, produto; 140 | -------------------------------------------------------------------------------- /mysql_classificacao_rank_join_tables_20200627_1937.sql: -------------------------------------------------------------------------------- 1 | /** 2 | *Exemplo de classificação (rank) no mysql - utilizando outras tabelas com JOIN*/ 3 | *http://sqlfiddle.com/#!9/11dcd5/1 4 | */ 5 | 6 | 7 | /** 8 | *V4 9 | *Cria a tabela "tb_atleta" 10 | */ 11 | CREATE TABLE tb_atleta 12 | ( 13 | inscricao integer, 14 | nome_atleta varchar(255), 15 | CONSTRAINT pk_inscricao PRIMARY KEY(inscricao) 16 | ); 17 | 18 | /** 19 | *Cria a tabela "tb_patrocinador" 20 | */ 21 | CREATE TABLE tb_patrocinador 22 | ( 23 | patrocinador_id integer, 24 | patrocinador_nome varchar(255), 25 | CONSTRAINT pk_patrocinador PRIMARY KEY(patrocinador_id) 26 | ); 27 | 28 | /** 29 | *Cria a tabela "tb_patrocinador_atleta" 30 | */ 31 | CREATE TABLE tb_patrocinador_atleta 32 | ( 33 | id_pat_atleta integer NOT NULL AUTO_INCREMENT, 34 | patrocinador_id integer, 35 | inscricao integer, 36 | CONSTRAINT pk_patr_atleta PRIMARY KEY(id_pat_atleta), 37 | CONSTRAINT fk_patr_atl_patrocina FOREIGN KEY(patrocinador_id) REFERENCES tb_patrocinador(patrocinador_id), 38 | CONSTRAINT fk_patr_atl_atleta FOREIGN KEY(inscricao) REFERENCES tb_atleta(inscricao) 39 | ); 40 | 41 | /** 42 | *Cria a tabela "tb_corrida" 43 | */ 44 | CREATE TABLE tb_corrida 45 | ( 46 | id_corrida integer NOT NULL AUTO_INCREMENT, 47 | grupo char(1), 48 | inscricao integer, 49 | tempo_gasto time, 50 | CONSTRAINT pk_corrida PRIMARY KEY(id_corrida), 51 | CONSTRAINT fk_corrida_atleta FOREIGN KEY(inscricao) REFERENCES tb_atleta(inscricao) 52 | ); 53 | 54 | /** 55 | *Inclusão dos registros na tabela "tb_atleta" 56 | */ 57 | INSERT INTO tb_atleta VALUES 58 | (2480, 'Mariana Rodrigues'), 59 | (2481, 'Claudia Santos'), 60 | (2482, 'Carlos Rodrigues'), 61 | (2483, 'Rafael Oliveira'), 62 | (2484, 'Juliana Silva'), 63 | (2485, 'Patricia Pereira'), 64 | (2489, 'Ronaldo Gonçalves'), 65 | (2490, 'Cristiano Ferreira'), 66 | (2495, 'Roberto Abravanel'), 67 | (2496, 'Cristina Dias'); 68 | 69 | /** 70 | *Inclusão dos registros na tabela "tb_corrida" 71 | */ 72 | INSERT INTO tb_corrida(grupo, inscricao, tempo_gasto) VALUES 73 | ('B', 2480, '03:57:42'), 74 | ('B', 2481, '00:58:42'), 75 | ('A', 2482, '00:55:32'), 76 | ('A', 2483, '02:58:42'), 77 | ('B', 2484, '01:10:42'), 78 | ('A', 2485, '00:59:42'), 79 | ('C', 2489, '01:42:47'), 80 | ('C', 2490, '02:55:32'), 81 | ('C', 2495, '00:51:32'), 82 | ('C', 2496, '01:42:47'); 83 | 84 | /** 85 | *Inclusão dos registros na tabela "tb_patrocinador" 86 | */ 87 | INSERT INTO tb_patrocinador VALUES 88 | (1, 'Adidas'), 89 | (2, 'Nike'), 90 | (3, 'Mizuno'); 91 | 92 | /** 93 | *Inclusão dos registros na tabela "tb_patrocinador_atleta" 94 | */ 95 | INSERT INTO tb_patrocinador_atleta(patrocinador_id, inscricao) VALUES 96 | (1, 2480), 97 | (2, 2480), 98 | (3, 2480), 99 | (2, 2481), 100 | (1, 2482), 101 | (1, 2483), 102 | (3, 2484), 103 | (2, 2485), 104 | (1, 2489), 105 | (2, 2490), 106 | (3, 2495), 107 | (3, 2496); 108 | 109 | /*Exibe a classificação dos corredores (rank) na corrida*/ 110 | 111 | SELECT 112 | classificacao.grupo, 113 | classificacao.inscricao, 114 | tb_atleta.nome_atleta, 115 | classificacao.posicao, 116 | classificacao.tempo_gasto, 117 | pat_atleta.patrocinador_nome 118 | FROM 119 | ( 120 | SELECT 121 | @posicao:= 122 | CASE 123 | WHEN @grupo<>grupo THEN 1 124 | WHEN CAST(@tempo_gasto AS TIME) = tempo_gasto THEN @posicao 125 | ELSE @posicao + 1 126 | END 127 | AS posicao, 128 | tb_corrida.inscricao, 129 | @grupo := grupo AS grupo, 130 | @tempo_gasto:= CAST(tempo_gasto AS TIME) as tempo_gasto 131 | FROM 132 | (SELECT @posicao := 0, @tempo_gasto := CAST(NULL AS time), @grupo:='') x 133 | CROSS JOIN tb_corrida 134 | ORDER BY grupo, tempo_gasto 135 | ) classificacao 136 | LEFT JOIN tb_atleta ON tb_atleta.inscricao = classificacao.inscricao 137 | LEFT JOIN 138 | ( 139 | select 140 | tb_patrocinador_atleta.inscricao, 141 | GROUP_CONCAT(patrocinador_nome ORDER BY patrocinador_nome) AS patrocinador_nome 142 | FROM tb_patrocinador_atleta 143 | JOIN tb_patrocinador 144 | ON tb_patrocinador.patrocinador_id = tb_patrocinador_atleta.patrocinador_id 145 | GROUP BY tb_patrocinador_atleta.inscricao 146 | ) pat_atleta 147 | ON classificacao.inscricao = pat_atleta.inscricao 148 | ORDER BY classificacao.grupo, tempo_gasto; 149 | -------------------------------------------------------------------------------- /sql_join_exemplo/sql_script_inner_join_exemplo_20181116_0851.sql: -------------------------------------------------------------------------------- 1 | --Criar a tabela "pais" 2 | CREATE TABLE pais 3 | ( 4 | pais_id serial, 5 | pais_nome varchar(50) NOT NULL, 6 | pais_status varchar(1) NOT NULL, 7 | CONSTRAINT pais_pk PRIMARY KEY (pais_id) 8 | ); 9 | 10 | --Criar a tabela "estado" 11 | CREATE TABLE estado 12 | ( 13 | estado_id serial, 14 | estado_nome varchar(50) NOT NULL, 15 | estado_status varchar(1), 16 | pais_id int NOT NULL, 17 | CONSTRAINT estado_pk PRIMARY KEY (estado_id), 18 | CONSTRAINT fk_estado_pais FOREIGN KEY (pais_id) REFERENCES pais(pais_id) 19 | 20 | ); 21 | 22 | --Criar a tabela "cidade" 23 | CREATE TABLE cidade ( 24 | cidade_id serial, 25 | cidade_nome varchar(50) NOT NULL, 26 | cidade_status varchar(1) NOT NULL, 27 | estado_id int NOT NULL, 28 | CONSTRAINT cidade_pk PRIMARY KEY (cidade_id), 29 | CONSTRAINT fk_cidade_estado FOREIGN KEY (estado_id) REFERENCES estado(estado_id) 30 | ); 31 | 32 | --Insere os registros da tabela "pais" 33 | INSERT INTO pais(pais_nome, pais_status) VALUES ('Brasil', 'A'); 34 | INSERT INTO pais(pais_nome, pais_status) VALUES ('Estados Unidos', 'A'); 35 | 36 | --Insere os registros da tabela "estado" 37 | INSERT INTO estado(estado_nome, estado_status, pais_id) VALUES ('São Paulo', 'A', 1); 38 | INSERT INTO estado(estado_nome, estado_status, pais_id) VALUES ('Santa Catarina', 'A', 1); 39 | INSERT INTO estado(estado_nome, estado_status, pais_id) VALUES ('Flórida', 'A', 2); 40 | INSERT INTO estado(estado_nome, estado_status, pais_id) VALUES ('Califórnia', 'A', 2); 41 | 42 | --Insere os registros da tabela "cidade" 43 | 44 | INSERT INTO cidade(cidade_nome, cidade_status, estado_id) VALUES ('Campinas', 'A', 1); 45 | INSERT INTO cidade(cidade_nome, cidade_status, estado_id) VALUES ('Osasco', 'A', 1); 46 | 47 | INSERT INTO cidade(cidade_nome, cidade_status, estado_id) VALUES ('Florianópolis', 'A', 2); 48 | INSERT INTO cidade(cidade_nome, cidade_status, estado_id) VALUES ('Blumenau', 'A', 2); 49 | 50 | INSERT INTO cidade(cidade_nome, cidade_status, estado_id) VALUES ('Miami', 'A', 3); 51 | INSERT INTO cidade(cidade_nome, cidade_status, estado_id) VALUES ('Orlando', 'A', 3); 52 | 53 | INSERT INTO cidade(cidade_nome, cidade_status, estado_id) VALUES ('Los Angeles', 'A', 4); 54 | INSERT INTO cidade(cidade_nome, cidade_status, estado_id) VALUES ('Malibu', 'A', 4); 55 | 56 | --Consulta a tabela "pais" 57 | SELECT * FROM pais; 58 | 59 | pais_id | pais_nome | pais_status 60 | ---------+----------------+------------- 61 | 1 | Brasil | A 62 | 2 | Estados Unidos | A 63 | 64 | 65 | 66 | --Consulta a tabela "estado" 67 | SELECT * FROM estado; 68 | 69 | estado_id | estado_nome | estado_status | pais_id 70 | -----------+----------------+---------------+--------- 71 | 1 | São Paulo | A | 1 72 | 2 | Santa Catarina | A | 1 73 | 3 | Flórida | A | 2 74 | 4 | Califórnia | A | 2 75 | 76 | 77 | 78 | --Consulta a tabela "cidade" 79 | SELECT * FROM cidade; 80 | 81 | cidade_id | cidade_nome | cidade_status | estado_id 82 | -----------+---------------+---------------+----------- 83 | 1 | Campinas | A | 1 84 | 2 | Osasco | A | 1 85 | 3 | Florianópolis | A | 2 86 | 4 | Blumenau | A | 2 87 | 5 | Miami | A | 3 88 | 6 | Orlando | A | 3 89 | 7 | Los Angeles | A | 4 90 | 8 | Malibu | A | 4 91 | 92 | 93 | --Consulta tabelas "pais", "estado" e "cidade" 94 | SELECT 95 | pais.pais_nome, 96 | estado.estado_nome, 97 | cidade.cidade_nome 98 | FROM pais 99 | INNER JOIN estado ON estado.pais_id = pais.pais_id 100 | INNER JOIN cidade ON cidade.estado_id = estado.estado_id 101 | WHERE CIDADE_STATUS = 'A'; 102 | 103 | pais_nome | estado_nome | cidade_nome 104 | ----------------+----------------+--------------- 105 | Brasil | São Paulo | Campinas 106 | Brasil | São Paulo | Osasco 107 | Brasil | Santa Catarina | Florianópolis 108 | Brasil | Santa Catarina | Blumenau 109 | Estados Unidos | Flórida | Miami 110 | Estados Unidos | Flórida | Orlando 111 | Estados Unidos | Califórnia | Los Angeles 112 | Estados Unidos | Califórnia | Malibu 113 | 114 | -------------------------------------------------------------------------------- /postgresql_calcular-subtotal_total_equivalente_WITH_ROLLUP_mysql/postgres_calcular_subtotal_total_atualizacao_31-01-2014.sql: -------------------------------------------------------------------------------- 1 | /** 2 | * IMPORTANTE!!! 3 | * DESCOMENTE A SENTENÇA ABAIXO SOMENTE SE DESEJAR EXCLUIR A TABELA tb_fornecedor 4 | */ 5 | /*DROP TABLE IF EXISTS tb_fornecedor;*/ 6 | 7 | /** 8 | *Cria a tabela tb_fornecedor. 9 | */ 10 | CREATE TABLE tb_fornecedor 11 | ( 12 | segmento character varying(70), 13 | produto character varying(70), 14 | valor numeric(11,2) 15 | ); 16 | 17 | 18 | /** 19 | *Inclui os dados na tabela tb_fornecedor. 20 | */ 21 | INSERT INTO tb_fornecedor VALUES('Papelaria e informática','HD 500 GB', 300.00); 22 | INSERT INTO tb_fornecedor VALUES('Papelaria e informática', 'Tonner', 250.00); 23 | 24 | INSERT INTO tb_fornecedor VALUES('Marcenaria', 'Cadeira', 50.00); 25 | INSERT INTO tb_fornecedor VALUES('Marcenaria', 'Mesa', 600.00); 26 | INSERT INTO tb_fornecedor VALUES('Marcenaria', 'Armário', 900.00); 27 | 28 | INSERT INTO tb_fornecedor VALUES('Serralheria', 'Corrimão', 400.00); 29 | INSERT INTO tb_fornecedor VALUES('Serralheria', 'Portão', 1500.00); 30 | INSERT INTO tb_fornecedor VALUES('Serralheria', 'Grade de proteção para janela', 800.00); 31 | 32 | INSERT INTO tb_fornecedor VALUES('Limpeza e higiêne', 'Detergente', 5.00); 33 | INSERT INTO tb_fornecedor VALUES('Limpeza e higiêne','Desinfetante', 40.00); 34 | INSERT INTO tb_fornecedor VALUES('Limpeza e higiêne', 'Papel toalha', 60.00); 35 | 36 | /** 37 | *Exibe os dados da tabela tb_fornecedor. 38 | */ 39 | SELECT * FROM tb_fornecedor; 40 | 41 | /** 42 | *1º Exemplo - Calcular os subtotais e total para cada segmento. 43 | */ 44 | 45 | --RESOLVENDO COM SUBQUERY 46 | SELECT 47 | segmento, 48 | produto, 49 | valor 50 | FROM 51 | ( 52 | SELECT segmento, produto, SUM(valor) valor 53 | FROM tb_fornecedor 54 | GROUP BY segmento, produto 55 | UNION ALL 56 | SELECT segmento, NULL AS produto, SUM(valor) valor 57 | FROM tb_fornecedor 58 | GROUP BY segmento 59 | UNION ALL 60 | SELECT NULL AS segmento, NULL AS produto, SUM(valor) AS valor 61 | FROM tb_fornecedor 62 | ) CALCULO 63 | ORDER BY segmento, produto; 64 | 65 | 66 | --RESOLVENDO COM WITH 67 | 68 | WITH CALCULO AS 69 | ( 70 | SELECT segmento, produto, SUM(valor) valor 71 | FROM tb_fornecedor 72 | GROUP BY segmento, produto 73 | UNION 74 | SELECT segmento, NULL AS produto, SUM(valor) valor 75 | FROM tb_fornecedor 76 | GROUP BY segmento 77 | UNION 78 | SELECT NULL AS segmento, NULL AS produto, SUM(valor) AS valor 79 | FROM tb_fornecedor 80 | ) 81 | SELECT 82 | segmento, 83 | produto, 84 | valor 85 | FROM calculo 86 | ORDER BY segmento, produto; 87 | 88 | /** 89 | *2º EXEMPLO - Para facilitarmos a interpretação do resultado da consulta, 90 | *vamos indicar os subtotais e o total geral 91 | */ 92 | 93 | --RESOLVENDO COM SUBQUERY 94 | SELECT 95 | COALESCE(segmento, 'TOTAL GERAL') AS segmento, 96 | CASE 97 | WHEN(segmento IS NOT NULL AND produto IS NOT NULL) THEN produto 98 | WHEN(segmento IS NOT NULL AND produto IS NULL) THEN 'SUBTOTAL' || ' - '|| segmento 99 | END AS produto, 100 | valor 101 | FROM 102 | ( 103 | SELECT segmento, produto, SUM(valor) valor 104 | FROM tb_fornecedor 105 | GROUP BY segmento, produto 106 | UNION 107 | SELECT segmento, NULL AS produto, SUM(valor) valor 108 | FROM tb_fornecedor 109 | GROUP BY segmento 110 | UNION 111 | SELECT NULL AS segmento, NULL AS produto, SUM(valor) AS valor 112 | FROM tb_fornecedor 113 | ) CALCULO 114 | ORDER BY 115 | CASE 116 | WHEN(segmento IS NOT NULL) THEN CAST(0 AS INTEGER) 117 | ELSE CAST(1 AS INTEGER) 118 | END, segmento, 119 | CASE 120 | WHEN(produto IS NOT NULL) THEN CAST(0 AS INTEGER) 121 | ELSE CAST(1 AS INTEGER) 122 | END, 123 | produto; 124 | 125 | --RESOLVENDO COM WITH 126 | 127 | WITH CALCULO AS 128 | ( 129 | SELECT segmento, produto, SUM(valor) valor 130 | FROM tb_fornecedor 131 | GROUP BY segmento, produto 132 | UNION 133 | SELECT segmento, NULL AS produto, SUM(valor) valor 134 | FROM tb_fornecedor 135 | GROUP BY segmento 136 | UNION 137 | SELECT NULL AS segmento, NULL AS produto, SUM(valor) AS valor 138 | FROM tb_fornecedor 139 | ) 140 | SELECT 141 | COALESCE(segmento, 'TOTAL GERAL') AS segmento, 142 | CASE 143 | WHEN(segmento IS NOT NULL AND produto IS NOT NULL) THEN produto 144 | WHEN(segmento IS NOT NULL AND produto IS NULL) THEN 'SUBTOTAL' || ' - '|| segmento 145 | END AS produto, 146 | valor 147 | FROM calculo 148 | ORDER BY 149 | CASE 150 | WHEN(segmento IS NOT NULL) THEN CAST(0 AS INTEGER) 151 | ELSE CAST(1 AS INTEGER) 152 | END, 153 | segmento, 154 | CASE 155 | WHEN(produto IS NOT NULL) THEN CAST(0 AS INTEGER) 156 | ELSE CAST(1 AS INTEGER) 157 | END, 158 | produto; 159 | -------------------------------------------------------------------------------- /artigo_postgre_adicionar_coluna_tabela_existente/artigo_postgre_adicionar_coluna_tabela_existente.sql: -------------------------------------------------------------------------------- 1 | /* 2 | *Estes exemplos pertencem ao artigo: Criar uma coluna em uma tabela existente no PostgreSql 3 | *Veja em: https://jquerydicas.blogspot.com/2013/10/criar-uma-coluna-em-uma-tabela.html 4 | */ 5 | 6 | /*Criar a tabela esporte*/ 7 | CREATE TABLE esporte 8 | ( 9 | id serial, 10 | esport_desc varchar(20) 11 | ); 12 | 13 | /*Inserir os dados na tabela esporte*/ 14 | INSERT INTO esporte (esport_desc) VALUES('atletismo'); 15 | INSERT INTO esporte (esport_desc) VALUES('futebol'); 16 | INSERT INTO esporte (esport_desc) VALUES('natacão'); 17 | 18 | /*Selecionar os registros da tabela esporte*/ 19 | SELECT * FROM esporte; 20 | 21 | /* 22 | *1º) Exemplo 23 | *Criar a coluna "disponibilidade" para indicar a modalidade esportiva 24 | */ 25 | ALTER TABLE esporte ADD COLUMN disponibilidade boolean; 26 | 27 | /*Visualizar a coluna que acabamos de criar*/ 28 | SELECT * FROM esporte; 29 | 30 | /*Para atualizarmos a disponibilidade das modalidades esportivas utilizaremos os comandos abaixo:*/ 31 | 32 | /*atletismo não está disponivel*/ 33 | UPDATE esporte SET disponibilidade = false WHERE id = 1; 34 | 35 | /*futebol e natação estão disponíveis*/ 36 | UPDATE esporte SET disponibilidade = true WHERE id IN (2,3); 37 | 38 | /*Visualize a tabela atualizada:*/ 39 | SELECT * FROM esporte; 40 | 41 | /* 42 | *2º) Exemplo 43 | *Há possibilidade de criar uma ou mais colunas em um único comando: 44 | */ 45 | 46 | ALTER TABLE esporte 47 | ADD COLUMN dt_ev_inicio date, 48 | ADD COLUMN dt_ev_fim date; 49 | 50 | /*Para atualizarmos as datas utilizaremos os comandos abaixo:*/ 51 | UPDATE esporte SET dt_ev_inicio = TO_DATE('02/09/2017', 'dd/mm/yyyy'), dt_ev_fim = TO_DATE('25/10/2017', 'dd/mm/yyyy') WHERE id = 1; 52 | UPDATE esporte SET dt_ev_inicio = TO_DATE('02/08/2017', 'dd/mm/yyyy'), dt_ev_fim = TO_DATE('28/08/2017', 'dd/mm/yyyy') WHERE id = 2; 53 | UPDATE esporte SET dt_ev_inicio = TO_DATE('10/08/2017', 'dd/mm/yyyy'), dt_ev_fim = TO_DATE('26/08/2017', 'dd/mm/yyyy') WHERE id = 3; 54 | 55 | /*Visualize a tabela atualizada:*/ 56 | SELECT * FROM esporte; 57 | 58 | /* 59 | 3º) Exemplo 60 | 61 | Criar na tabela "esporte", uma coluna obrigatória chamada "categoria", ou seja, que exige que o dado seja obrigatório (não nulo). 62 | 63 | Antes de criar a coluna devemos verificar se há dados na tabela, para isso vamos utilizar a função "COUNT", esta função conta o número de linhas de uma tabela. 64 | */ 65 | 66 | SELECT COUNT(*) FROM esporte; 67 | 68 | /* 69 | a) Caso não haja dados na tabela 70 | */ 71 | --Descomente o comando para executar. Deixei comentado, pois neste exemplo a tabela "esporte" tem dados 72 | --ALTER TABLE esporte ADD COLUMN categoria varchar(80) NOT NULL; 73 | 74 | /* 75 | b) Caso haja dados na tabela. Primeiramente crie a coluna como não obrigatória 76 | */ 77 | 78 | ALTER TABLE esporte ADD COLUMN categoria varchar(80); 79 | 80 | /* 81 | Atualize os dados da coluna antes de torná-la obrigatória (não nula). 82 | Segue a atualização de dados através do comando UPDATE. 83 | */ 84 | 85 | /*foi atribuído a futebol categoria "coletivo"*/ 86 | UPDATE esporte SET categoria = 'coletivo' WHERE id = 2; 87 | 88 | /*foi atribuído a atletismo e natação a categoria "individual"*/ 89 | UPDATE esporte SET categoria = 'individual' WHERE id IN (1,3); 90 | 91 | /* 92 | Agora que não há dados nulos, vamos tornar a coluna obrigatória. 93 | SINTAXE 94 | 95 | ALTER TABLE nome_da_tabela ALTER COLUMN nome_da_coluna SET NOT NULL; 96 | */ 97 | ALTER TABLE esporte ALTER COLUMN categoria SET NOT NULL; 98 | 99 | /* 100 | 4º) Exemplo 101 | Tornar a coluna "categoria" NÃO obrigatória (opcional). Execute o comando abaixo: 102 | 103 | SINTAXE 104 | 105 | ALTER TABLE nome_da_tabela ALTER COLUMN nome_da_coluna DROP NOT NULL; 106 | */ 107 | 108 | /* 109 | Exemplo: 110 | */ 111 | ALTER TABLE esporte ALTER COLUMN categoria DROP NOT NULL; 112 | 113 | /* 114 | 5º) Exemplo 115 | 116 | Criar uma coluna chamada "modalidade_ativa" do tipo "boolean" com valor "DEFAULT" (padrão) igual a "true". 117 | 118 | SINTAXE 119 | 120 | ALTER TABLE nome_da_tabela ADD COLUMN nome_da_coluna tipo_de_dado DEFAULT valor_padrao; 121 | 122 | Exemplo: 123 | */ 124 | 125 | ALTER TABLE esporte ADD COLUMN modalidade_ativa boolean DEFAULT true; 126 | 127 | /* 128 | 6º) Exemplo 129 | 130 | Criar uma coluna chamada "data_hora_criacao" do tipo "timestamp without time zone" com valor "DEFAULT" igual a "data e hora atual". 131 | 132 | SINTAXE 133 | 134 | ALTER TABLE nome_da_tabela ADD COLUMN nome_da_coluna tipo_de_dado DEFAULT valor_padrao; 135 | */ 136 | 137 | ALTER TABLE esporte ADD COLUMN data_hora_criacao timestamp without time zone DEFAULT current_timestamp; 138 | 139 | /* 140 | 141 | 7º) Exemplo 142 | 143 | Remover o valor DEFAULT de uma coluna: 144 | 145 | SINTAXE 146 | 147 | ALTER TABLE nome_da_tabela ALTER COLUMN nome_da_coluna DROP DEFAULT; 148 | 149 | Exemplos: 150 | */ 151 | 152 | --a) Remover o valor "DEFAULT" da coluna "modalidade_ativa". 153 | 154 | ALTER TABLE esporte ALTER COLUMN modalidade_ativa DROP DEFAULT; 155 | 156 | --b) Remover o valor "DEFAULT" da coluna "data_hora_criacao". 157 | 158 | ALTER TABLE esporte ALTER COLUMN data_hora_criacao DROP DEFAULT; 159 | -------------------------------------------------------------------------------- /artigo_postgre_subtrair_intervalo_de_uma_data/subtrair_intervalo_de_uma_data.sql: -------------------------------------------------------------------------------- 1 | /** 2 | *Descomente o comando abaixo somente se desejar excluir a tabela tb_produtos. 3 | */ 4 | --DROP TABLE IF EXISTS tb_produtos; 5 | 6 | /** 7 | *Descomente o comando abaixo somente se desejar excluir a tabela tb_locacao. 8 | */ 9 | --DROP TABLE IF EXISTS tb_locacao; 10 | 11 | /** 12 | *Descomente o comando abaixo somente se desejar excluir a tabela tb_matriculas. 13 | */ 14 | --DROP TABLE IF EXISTS tb_matriculas; 15 | 16 | /** 17 | *Descomente o comando abaixo somente se desejar excluir a tabela tb_loc_imoveis. 18 | */ 19 | --DROP TABLE IF EXISTS tb_loc_imoveis; 20 | 21 | /** 22 | *1ºExemplo. 23 | */ 24 | 25 | /** 26 | *Cria a tabela tb_produtos. 27 | */ 28 | CREATE TABLE tb_produtos 29 | ( 30 | produto_id serial, 31 | data_vencimento date 32 | ); 33 | 34 | /** 35 | *Inclui os registros na tabela tb_produtos. 36 | */ 37 | INSERT INTO 38 | tb_produtos(produto_id, data_vencimento) 39 | VALUES 40 | (DEFAULT, '2014-04-18'), 41 | (DEFAULT, '2014-05-13'), 42 | (DEFAULT, '2014-06-04'), 43 | (DEFAULT, '2014-09-20'); 44 | 45 | /** 46 | *Seleciona os registros na tabela tb_produtos. 47 | */ 48 | SELECT * FROM tb_produtos; 49 | 50 | /** 51 | *1ª Solução - Exibe a data de recolhimento. 52 | */ 53 | SELECT 54 | produto_id, 55 | data_vencimento, 56 | data_vencimento - 3 AS data_recolhimento 57 | FROM tb_produtos; 58 | 59 | /** 60 | *Exibe a data de recolhimento formatada. 61 | */ 62 | SELECT 63 | produto_id, 64 | to_char (data_vencimento, 'dd/mm/yyyy') AS data_vencimento, 65 | to_char (data_vencimento - 3, 'dd/mm/yyyy') AS data_recolhimento 66 | FROM tb_produtos; 67 | 68 | /** 69 | *2ª Solução - Exibe a data de recolhimento. 70 | */ 71 | SELECT 72 | produto_id, 73 | data_vencimento, 74 | data_vencimento - interval '3 days' AS data_recolhimento 75 | FROM tb_produtos; 76 | 77 | /** 78 | *Exibe a data de recolhimento formatada. 79 | */ 80 | SELECT 81 | produto_id, 82 | to_char (data_vencimento, 'dd/mm/yyyy') AS data_vencimento, 83 | to_char (data_vencimento - interval '3 days', 'dd/mm/yyyy') AS data_recolhimento 84 | FROM tb_produtos; 85 | 86 | /** 87 | *2º Exemplo 88 | */ 89 | 90 | /** 91 | *Cria a tabela tb_locacao. 92 | */ 93 | CREATE TABLE tb_locacao 94 | ( 95 | locatario_id integer, 96 | imovel_id integer, 97 | data_fim_contrato date 98 | ); 99 | 100 | /** 101 | *Inclui os registros na tabela tb_locacao. 102 | */ 103 | INSERT INTO tb_locacao (locatario_id, imovel_id, data_fim_contrato) 104 | VALUES 105 | (1221, 454, '2014-08-12'), 106 | (1421, 842, '2014-09-17'), 107 | (1423, 845, '2014-10-20'); 108 | 109 | /** 110 | *Exibe os registros da tabela tb_locacao. 111 | */ 112 | SELECT * FROM tb_locacao; 113 | 114 | /** 115 | *Exibe a data de oferta de renovação de contrato. 116 | */ 117 | SELECT 118 | locatario_id, 119 | imovel_id, 120 | data_fim_contrato, 121 | data_fim_contrato - interval '3 months' AS oferta_renovacao 122 | FROM tb_locacao; 123 | 124 | /** 125 | *Exibe a data de oferta de renovação de contrato formatada. 126 | */ 127 | SELECT 128 | locatario_id, 129 | imovel_id, 130 | to_char (data_fim_contrato, 'dd/mm/yyyy'), 131 | to_char (data_fim_contrato - interval '3 months', 'dd/mm/yyyy') AS oferta_renovacao 132 | FROM tb_locacao; 133 | 134 | /** 135 | *3º Exemplo 136 | */ 137 | 138 | /** 139 | *Cria a tabela tb_matriculas. 140 | */ 141 | CREATE TABLE tb_matriculas 142 | ( 143 | matricula_id serial, 144 | data_matricula date 145 | ); 146 | 147 | /** 148 | *Inclui os registros na tabela tb_matriculas. 149 | */ 150 | INSERT INTO 151 | tb_matriculas(matricula_id, data_matricula) 152 | VALUES 153 | (DEFAULT, '2014-03-21'), 154 | (DEFAULT, '2014-03-22'), 155 | (DEFAULT, '2014-03-25'), 156 | (DEFAULT, '2014-03-26'), 157 | (DEFAULT, '2014-03-27'), 158 | (DEFAULT, '2014-03-28'), 159 | (DEFAULT, '2014-03-29'), 160 | (DEFAULT, '2014-03-30'), 161 | (DEFAULT, '2014-03-31'), 162 | (DEFAULT, '2014-04-01'); 163 | 164 | /** 165 | *Exibe o dia atual. 166 | */ 167 | SELECT CURRENT_DATE; 168 | 169 | /** 170 | *Exibe os registros da tabela tb_matriculas. 171 | */ 172 | SELECT * FROM tb_matriculas; 173 | 174 | /** 175 | *Exibe a quantidade de alunos matriculados na última semana. 176 | */ 177 | SELECT 178 | COUNT(matricula_id) AS quantidade_alunos 179 | FROM tb_matriculas 180 | WHERE data_matricula > CURRENT_DATE - interval '7 days'; 181 | 182 | 183 | /** 184 | *4º Exemplo 185 | */ 186 | 187 | /*Cria a tabela "tb_loc_imoveis"*/ 188 | CREATE TABLE tb_loc_imoveis 189 | ( 190 | loc_id integer, 191 | tipo_id_loc integer, 192 | periodo_renovacao interval, 193 | data_fim_contrato date 194 | ); 195 | 196 | /*Inseri registros na tabela "tb_loc_imoveis"*/ 197 | INSERT INTO tb_loc_imoveis (loc_id, tipo_id_loc, periodo_renovacao, data_fim_contrato) 198 | VALUES 199 | (1221, 1, '1 month 5 days 3 hours 23 minutes', '2021-03-01'), 200 | (1421, 2, '1 year 1 month', '2021-04-05'), 201 | (1423, 3, '15 days 1 hour', '2021-05-15'), 202 | (1221, 1, '1 month 5 days 3 hours 23 minutes', '2021-08-12'), 203 | (1421, 2, '1 year 1 month', '2021-09-17'), 204 | (1423, 3, '15 days 1 hour', '2021-10-20'); 205 | 206 | 207 | /* 208 | Para calcular as datas de oferta de renovação executamos a consulta abaixo. 209 | Após a execução da consulta, será exibido o resultado na coluna com o alias "oferta_renovacao". 210 | */ 211 | SELECT 212 | loc_id, 213 | tipo_id_loc, 214 | periodo_renovacao, 215 | data_fim_contrato, 216 | data_fim_contrato - periodo_renovacao AS oferta_renovacao 217 | FROM tb_loc_imoveis; 218 | -------------------------------------------------------------------------------- /artigo_mysql_count/mysql_funcao_count.sql: -------------------------------------------------------------------------------- 1 | /** 2 | *DESCOMENTE O COMANDO ABAIXO SOMENTE SE DESEJAR EXCLUIR A TABELA tb_ordem_servico 3 | */ 4 | /*DROP TABLE IF EXISTS tb_ordem_servico;*/ 5 | 6 | /** 7 | *Criar a tabela tb_ordem_servico. 8 | */ 9 | CREATE TABLE tb_ordem_servico 10 | ( 11 | cod_ordem integer, 12 | cod_servico character varying(1), 13 | data_inicial date, 14 | data_final date 15 | ); 16 | 17 | /** 18 | *Incluir os dados na tabela tb_ordem_servico 19 | */ 20 | INSERT INTO tb_ordem_servico(cod_ordem, cod_servico, data_inicial, data_final) 21 | VALUES 22 | (34330, 'A', '2013-11-10', '2013-11-12'), 23 | (34331, 'A', '2013-12-06', '2013-12-08'), 24 | (34332, 'A', '2013-01-05', '2014-01-06'), 25 | (34333, 'A', '2014-01-30', NULL), 26 | (34334, 'B', '2013-11-15', '2013-11-17'), 27 | (34335, 'B', '2013-12-18', '2013-12-19'), 28 | (34336, 'B', '2013-01-05', '2014-01-06'), 29 | (34337, 'B', '2014-01-28', NULL), 30 | (34338, 'C', '2013-11-08', '2013-11-11'), 31 | (34339, 'C', '2013-12-05', '2013-12-08'), 32 | (34340, 'C', '2013-01-15', '2014-01-17'), 33 | (34341, 'C', '2014-01-27', NULL); 34 | 35 | /** 36 | *Exibir os dados da tabela tb_ordem_servico 37 | */ 38 | SELECT * FROM tb_ordem_servico; 39 | 40 | /** 41 | *1º EXEMPLO 42 | */ 43 | 44 | /** 45 | *Exibe a quantidade de registros da tabela tb_ordem_servico 46 | */ 47 | SELECT COUNT(*) FROM tb_ordem_servico; 48 | 49 | /** 50 | *Criação do alias quantidade 51 | */ 52 | SELECT COUNT(*) AS quatidade FROM tb_ordem_servico; 53 | 54 | /** 55 | *2º EXEMPLO 56 | */ 57 | 58 | /** 59 | *Exibir a quantidade de registros onde o código do serviço seja do tipo "A". 60 | */ 61 | SELECT 62 | COUNT(cod_servico) AS quantidade 63 | FROM tb_ordem_servico 64 | WHERE cod_servico = 'A'; 65 | 66 | /** 67 | *3º EXEMPLO 68 | */ 69 | 70 | /** 71 | *Exibir a quantidade de ordens de serviços que já foram finalizadas. 72 | **/ 73 | SELECT 74 | COUNT(data_final) AS quantidade 75 | FROM tb_ordem_servico; 76 | 77 | /** 78 | *4º EXEMPLO 79 | */ 80 | 81 | /** 82 | *Exibir a quantidade de ordens de serviços que não foram finalizadas. 83 | */ 84 | SELECT 85 | COUNT(*) AS quantidade 86 | FROM tb_ordem_servico WHERE data_final IS NULL; 87 | 88 | /** 89 | *5º Exemplo 90 | */ 91 | 92 | /** 93 | *Distribuição por tipo de serviço: 94 | *Quantidade de solicitações para o serviço "A"; 95 | *Quantidade de solicitações para o serviço "B"; 96 | *Quantidade de solicitações para o serviço "C"; 97 | */ 98 | 99 | SELECT 100 | cod_servico, 101 | COUNT(cod_servico) AS quantidade 102 | FROM tb_ordem_servico 103 | GROUP BY cod_servico; 104 | 105 | /** 106 | *6º Exemplo 107 | */ 108 | 109 | /** 110 | *Quantidade de ordens finalizadas por mês e ano (mm/aaaa). 111 | *Quando utilizamos a função COUNT(nome_da_coluna), valores nulos não entram na contagem, 112 | */ 113 | SELECT 114 | CASE WHEN data_final IS NOT NULL 115 | THEN date_format(data_final, '%m/%Y') 116 | END mes_ano, 117 | COUNT(data_final) AS qtd_os 118 | FROM tb_ordem_servico 119 | GROUP BY mes_ano; 120 | 121 | /** 122 | *Quantidade de ordens finalizadas por mês e ano (mm/aaaa). 123 | *Quando utilizamos a função COUNT(*), valores nulos entram na contagem, 124 | */ 125 | SELECT 126 | date_format(data_final, '%m/%Y') AS mes_ano, 127 | COUNT(*) AS qtd_os 128 | FROM tb_ordem_servico 129 | GROUP BY date_format(data_final, '%m/%Y'); 130 | 131 | /** 132 | *Podemos colocar a mensagem "Pendente" para indicar a quantidade de ordens de serviço 133 | *que não possuem data de encerramento. 134 | */ 135 | SELECT 136 | CASE WHEN data_final IS NOT NULL 137 | THEN date_format(data_final, '%m/%Y') 138 | ELSE 'Pendente' 139 | END mes_ano, 140 | COUNT(*) AS qtd_os 141 | FROM tb_ordem_servico 142 | GROUP BY mes_ano; 143 | 144 | /** 145 | *Para não exibir a contagem de valores nulos, utilizamos um filtro no "WHERE": 146 | */ 147 | SELECT 148 | date_format(data_final, '%m/%Y') AS mes_ano, 149 | COUNT(data_final) AS qtd_os 150 | FROM tb_ordem_servico 151 | WHERE data_final IS NOT NULL 152 | GROUP BY mes_ano; 153 | 154 | /** 155 | *Para ordenar por ano/mês em ordem crescente utilize o comando "ORDER BY". 156 | */ 157 | SELECT 158 | date_format(data_final, '%m/%Y') AS mes_ano, 159 | COUNT(*) AS qtd_os_finalizadas 160 | FROM tb_ordem_servico 161 | WHERE data_final IS NOT NULL 162 | GROUP BY date_format(data_final, '%m/%Y') 163 | ORDER BY date_format(data_final, '%Y/%m'); 164 | 165 | /** 166 | *7º Exemplo 167 | */ 168 | 169 | /** 170 | *Quantidade de ordens finalizadas por mês e ano (mm/aaaa) e por tipo de serviço. 171 | */ 172 | SELECT 173 | date_format(data_final, '%m/%Y') AS mes_ano, 174 | cod_servico, 175 | COUNT(*) AS qtd_os 176 | FROM tb_ordem_servico 177 | WHERE data_final IS NOT NULL 178 | GROUP BY mes_ano, cod_servico; 179 | 180 | /** 181 | *Ordenar em crescente o ano/mês e o serviço 182 | */ 183 | SELECT 184 | date_format(data_final, '%m/%Y') AS mes_ano, 185 | cod_servico, 186 | COUNT(*) AS qtd_os_finalizadas 187 | FROM tb_ordem_servico 188 | WHERE data_final IS NOT NULL 189 | GROUP BY date_format(data_final, '%m/%Y'), cod_servico 190 | ORDER BY date_format(data_final, '%Y/%m'), cod_servico; 191 | 192 | 193 | /** 194 | *8º Exemplo 195 | */ 196 | 197 | /** 198 | *Incluir a coluna "cliente" na tabela "tb_ordem_servico". 199 | */ 200 | ALTER TABLE tb_ordem_servico ADD COLUMN cliente character varying(50); 201 | 202 | /** 203 | *Exibir os dados da tabela tb_ordem_servico 204 | */ 205 | SELECT * FROM tb_ordem_servico; 206 | 207 | /** 208 | *Vamos alterar os dados da coluna "cliente" 209 | */ 210 | 211 | UPDATE tb_ordem_servico SET cliente = 'Padaria P' WHERE cod_ordem >=34330 AND cod_ordem <=34333; 212 | UPDATE tb_ordem_servico SET cliente = 'Marcenaria M' WHERE cod_ordem >34333 AND cod_ordem <=34336; 213 | UPDATE tb_ordem_servico SET cliente = 'HOSPITAL H' WHERE cod_ordem >34336; 214 | 215 | /** 216 | *Exibir os dados da tabela tb_ordem_servico após a atualização 217 | */ 218 | SELECT * FROM tb_ordem_servico; 219 | 220 | /** 221 | *Exibir quantas empresas fizeram solicitação de ordem de serviço. 222 | *Se observarmos a coluna "cliente" observamos que 3 empresas 223 | *fizeram solicitação a "Padaria P", a "Marcenaria M" e o "HOSPITAL H". 224 | */ 225 | SELECT COUNT(DISTINCT(cliente)) FROM tb_ordem_servico; 226 | -------------------------------------------------------------------------------- /artigo_mysql_diferenca_entre_datas/artigo_mysql_diferenca_entre_datas.sql: -------------------------------------------------------------------------------- 1 | /* 2 | *Mysql - diferença entre datas 3 | *Veja o artigo em: http://jquerydicas.blogspot.com.br/2013/11/mysql-diferenca-entre-datas.html 4 | */ 5 | 6 | /* 7 | *CRIAR A TABELA tb_locacao 8 | */ 9 | CREATE TABLE tb_locacao 10 | ( 11 | imovel_id int NOT NULL AUTO_INCREMENT, 12 | data_oferta date not null, 13 | data_locacao date null, 14 | PRIMARY KEY (imovel_id) 15 | ); 16 | 17 | /* 18 | *INCLUIR REGISTROS NA TABELA tb_locacao 19 | */ 20 | INSERT INTO tb_locacao (data_oferta, data_locacao) VALUES('2013-08-01', '2013-08-17'); 21 | INSERT INTO tb_locacao (data_oferta, data_locacao) VALUES('2013-08-03', '2013-08-23'); 22 | INSERT INTO tb_locacao (data_oferta, data_locacao) VALUES('2013-08-20', '2013-09-05'); 23 | INSERT INTO tb_locacao (data_oferta, data_locacao) VALUES('2013-08-22', '2013-09-14'); 24 | INSERT INTO tb_locacao (data_oferta, data_locacao) VALUES('2013-09-10', '2013-10-05'); 25 | INSERT INTO tb_locacao (data_oferta, data_locacao) VALUES('2013-09-20', '2013-10-31'); 26 | 27 | 28 | /* 29 | *1º Exemplo 30 | */ 31 | 32 | /* 33 | *Para calcularmos a diferença em dias executamos a sentença abaixo: 34 | */ 35 | SELECT 36 | imovel_id, 37 | data_oferta, 38 | data_locacao, 39 | /*Calculo da diferença entre a data da locação e a data de oferta*/ 40 | DATEDIFF (data_locacao, data_oferta) AS quantidade_dias 41 | FROM tb_locacao; 42 | 43 | /* 44 | *Observação: caso seja necessário, incluir o primeiro dia, na contagem dos dias, utilize a sentença a seguir: 45 | */ 46 | SELECT 47 | imovel_id, 48 | data_oferta, 49 | data_locacao, 50 | DATEDIFF (data_locacao, data_oferta) AS quantidade_dias, 51 | /*Calculo da diferença entre a data da locação e a data de oferta, levando em consideração o primeiro dia*/ 52 | ABS(DATEDIFF (data_locacao, data_oferta)) + 1 AS quantidade_dias_primeiro_dia 53 | FROM tb_locacao; 54 | 55 | /* 56 | *CRIAR A TABELA tb_cadastro 57 | */ 58 | CREATE TABLE tb_cadastro 59 | ( 60 | cliente_id int NOT NULL AUTO_INCREMENT, 61 | data_cadastro date not null, 62 | PRIMARY KEY (cliente_id) 63 | ); 64 | 65 | /* 66 | *INCLUIR REGISTROS NA TABELA tb_cadastro 67 | */ 68 | INSERT INTO tb_cadastro (data_cadastro) VALUES('2013-06-13'); 69 | INSERT INTO tb_cadastro (data_cadastro) VALUES('2013-07-15'); 70 | INSERT INTO tb_cadastro (data_cadastro) VALUES('2013-08-13'); 71 | INSERT INTO tb_cadastro (data_cadastro) VALUES('2013-10-20'); 72 | INSERT INTO tb_cadastro (data_cadastro) VALUES('2013-11-25'); 73 | 74 | /* 75 | *2º Exemplo 76 | */ 77 | 78 | /* 79 | *Verificar clientes que estejam cadatrados a mais de 90 dias, 80 | *considerando a data de hoje 81 | */ 82 | 83 | SELECT 84 | cliente_id, 85 | data_cadastro, 86 | /*calcula a diferença em dias completos*/ 87 | DATEDIFF(CURDATE(), data_cadastro) AS quantidade_dias 88 | FROM tb_cadastro 89 | /*filtra somente os clientes que são cadastrados há mais que 90 dias*/ 90 | WHERE DATEDIFF(CURDATE(), data_cadastro) > 90; 91 | 92 | 93 | /* 94 | *CRIAR A TABELA tb_equipamento 95 | */ 96 | CREATE TABLE tb_equipamento 97 | ( 98 | equipamento_id int NOT NULL AUTO_INCREMENT, 99 | data_inicio datetime not null, 100 | data_encerramento datetime null, 101 | PRIMARY KEY (equipamento_id) 102 | ); 103 | 104 | /* 105 | *INCLUIR REGISTROS NA TABELA tb_equipamento 106 | */ 107 | INSERT INTO tb_equipamento (data_inicio, data_encerramento) VALUES('2009-05-13 15:30:22', '2014-01-16 15:30:20'); 108 | INSERT INTO tb_equipamento (data_inicio, data_encerramento) VALUES('2010-08-14 16:30:22', '2014-02-15 09:32:54'); 109 | INSERT INTO tb_equipamento (data_inicio, data_encerramento) VALUES('2011-07-15 17:40:22', '2014-03-02 10:54:22'); 110 | INSERT INTO tb_equipamento (data_inicio, data_encerramento) VALUES('2012-04-16 18:42:22', '2014-02-28 16:20:35'); 111 | INSERT INTO tb_equipamento (data_inicio, data_encerramento) VALUES('2013-02-05 19:47:22', '2014-03-06 10:21:35'); 112 | 113 | 114 | /* 115 | *3º Exemplo 116 | */ 117 | 118 | /* 119 | *Calcular o periodo de utilização de equipamentos, em anos. 120 | */ 121 | 122 | SELECT 123 | equipamento_id, 124 | data_inicio, 125 | data_encerramento, 126 | /*calcula a diferença em anos completos*/ 127 | TIMESTAMPDIFF(YEAR , data_inicio, data_encerramento) AS periodo_anos 128 | FROM tb_equipamento; 129 | 130 | /* 131 | *4º Exemplo 132 | */ 133 | 134 | /* 135 | *Calcular o período dos equipamentos em anos, meses, dias, horas, minutos e segundos. 136 | */ 137 | 138 | SELECT 139 | data_inicio, 140 | data_encerramento, 141 | /** 142 | *Calcular a diferença em anos. 143 | */ 144 | TIMESTAMPDIFF(YEAR, data_inicio, data_encerramento) AS anos , 145 | /** 146 | *Calcular a diferença em meses. 147 | *Não vão ser contados os meses que já entraram na contagem dos anos completos. 148 | */ 149 | TIMESTAMPDIFF 150 | ( 151 | MONTH, 152 | data_inicio + INTERVAL TIMESTAMPDIFF(YEAR, data_inicio, data_encerramento) YEAR , 153 | data_encerramento 154 | ) AS meses, 155 | /** 156 | *Calcular a diferença em dias. 157 | *Não vão ser contados os dias que já entraram na contagem dos meses completos. 158 | */ 159 | TIMESTAMPDIFF 160 | ( 161 | DAY, 162 | data_inicio + INTERVAL TIMESTAMPDIFF(MONTH, data_inicio, data_encerramento) MONTH, 163 | data_encerramento 164 | ) AS dias , 165 | /** 166 | *Calcular a diferença em horas. 167 | *Não vão ser contadas as horas que já entraram na contagem dos dias completos. 168 | */ 169 | TIMESTAMPDIFF 170 | ( 171 | HOUR, 172 | data_inicio + INTERVAL TIMESTAMPDIFF(DAY, data_inicio, data_encerramento) DAY, 173 | data_encerramento 174 | ) AS horas, 175 | /** 176 | *Calcular a diferença em minutos. 177 | *Não vão ser contados os minutos que já entraram na contagem das horas completas. 178 | */ 179 | TIMESTAMPDIFF 180 | ( 181 | MINUTE, 182 | data_inicio + INTERVAL TIMESTAMPDIFF(HOUR, data_inicio, data_encerramento) HOUR, 183 | data_encerramento 184 | ) AS minutos, 185 | /** 186 | *Calcular a diferença em segundos. 187 | *Não vão ser contados os segundo que já entraram na contagem dos minutos completos. 188 | */ 189 | TIMESTAMPDIFF 190 | ( 191 | SECOND, 192 | data_inicio + INTERVAL TIMESTAMPDIFF(MINUTE, data_inicio, data_encerramento) MINUTE, 193 | data_encerramento 194 | ) AS segundos 195 | FROM tb_equipamento; 196 | -------------------------------------------------------------------------------- /postgresql/exemplo_trigger/pg_example_trigger_20191227.sql: -------------------------------------------------------------------------------- 1 | /* 2 | Objetivo deste script: exemplo de criação de uma trigger no postgresql. 3 | 4 | A cada inclusão, alteração ou exclusão de um registro na tabela "tb_clientes" 5 | será gerado um registro de log na tabela "tb_hist_operacao" 6 | */ 7 | 8 | /* 9 | Exclui a tabela tb_clientes, caso existir. 10 | Importante!!! Descomente este comando somente se quiser excluir a tabela "tb_clientes". 11 | */ 12 | --DROP TABLE IF EXISTS tb_clientes; 13 | 14 | 15 | /* 16 | Cria a tabela de clientes, chamada "tb_clientes". 17 | */ 18 | CREATE TABLE tb_clientes 19 | ( 20 | id integer, 21 | name varchar(255), 22 | CONSTRAINT pk_id PRIMARY KEY(id) 23 | ); 24 | 25 | /* 26 | Exclui a tabela "tb_hist_operacao", caso existir. 27 | Importante!!! Descomente este comando somente se quiser excluir a tabela "tb_hist_operacao". 28 | */ 29 | --DROP TABLE IF EXISTS tb_hist_operacao; 30 | 31 | 32 | /*Cria a tabela de historico de operacao, chamada tb_hist_operacao*/ 33 | CREATE TABLE tb_hist_operacao 34 | ( 35 | operacao varchar(100), 36 | data_hora_criacao timestamp without time zone, 37 | id_cliente int, 38 | nome_antigo varchar(255), 39 | nome_novo varchar(255) 40 | ); 41 | 42 | 43 | /* 44 | Exclui a função fn_historico() 45 | Importante!!! Descomente este comando somente se quiser excluir a função fn_historico() 46 | */ 47 | --DROP FUNCTION IF EXISTS fn_historico(); 48 | 49 | 50 | /* 51 | Cria a função "fn_historico". 52 | Está função será utilizada pela TRIGGER. No POSTGRESQL devemos criar primeiro uma função antes de criar a TRIGGER. 53 | Repare que o retorno da função "fn_historico()" é uma trigger. 54 | A trigger executará esta função. 55 | Esta função inclui registros de log na tabela "tb_hist_operacao". 56 | */ 57 | 58 | --Criação da função fn_historico() 59 | CREATE OR REPLACE FUNCTION fn_historico() 60 | --Retorna uma trigger 61 | RETURNS trigger AS 62 | $BODY$ 63 | BEGIN 64 | /*A variável "TG_OP" é uma variável especial que armazena o valor 65 | "INSERT" para inclusão 66 | "UPDATE" para alteração 67 | "DELETE" para deleção 68 | */ 69 | IF (TG_OP ='INSERT') THEN 70 | INSERT INTO tb_hist_operacao(operacao, data_hora_criacao, id_cliente, nome_novo) VALUES(TG_OP, NOW(), NEW.id, NEW.NAME); 71 | RETURN NEW; 72 | ELSIF (TG_OP ='UPDATE') THEN 73 | INSERT INTO tb_hist_operacao(operacao, data_hora_criacao, id_cliente, nome_antigo, nome_novo) 74 | VALUES(TG_OP, NOW(), OLD.id, OLD.NAME, NEW.name); 75 | RETURN NEW; 76 | ELSIF (TG_OP ='DELETE') THEN 77 | INSERT INTO tb_hist_operacao(operacao, data_hora_criacao, id_cliente, nome_antigo) VALUES(TG_OP, NOW(), OLD.id, OLD.name); 78 | RETURN OLD; 79 | END IF; 80 | END; 81 | $BODY$ 82 | LANGUAGE 'plpgsql'; 83 | 84 | /* 85 | Exclui a trigger "tr_historico". 86 | Importante!!! Descomente este comando somente se quiser excluir a trigger "tr_historico". 87 | */ 88 | --DROP TRIGGER IF EXISTS tr_historico ON tb_clientes; 89 | 90 | /* 91 | Cria a trigger "tr_historico" que executa a função fn_historico() depois da inclusão, alteração ou exclusão. 92 | um registro na tabela "tb_clientes". 93 | */ 94 | 95 | --Cria a trigger "tr_historico". 96 | CREATE TRIGGER tr_historico 97 | --Será executada uma função depois de cada insert, update ou delete na tabela "tb_clientes" 98 | AFTER INSERT OR UPDATE OR DELETE ON tb_clientes 99 | --Para cada registro 100 | FOR EACH ROW 101 | --Executará a função fn_historico() 102 | EXECUTE PROCEDURE fn_historico(); 103 | 104 | /* 105 | Deleta registros da tabela "tb_clientes". 106 | Importante!!! Descomente este comando somente se quiser excluir os registros da tabela "tb_clientes". 107 | */ 108 | --DELETE FROM tb_clientes; 109 | 110 | /* 111 | Deleta os registros da tabela de historico, chamada "tb_hist_operacao". 112 | Importante!!! Descomente este comando somente se quiser excluir os registros da tabela "tb_hist_operacao". 113 | */ 114 | --DELETE FROM tb_hist_operacao; 115 | 116 | 117 | /* 118 | Insere os registros na tabela tb_clientes. 119 | */ 120 | INSERT INTO tb_clientes(id, name) VALUES 121 | (1,'Paulo Silva'), 122 | (2,'Ana Oliveira'), 123 | (3,'Kelly Costa'); 124 | 125 | /* 126 | Após a inclusão, a tabela "tb_clientes" possui três registros. 127 | id | name 128 | ----+-------------- 129 | 1 | Paulo Silva 130 | 2 | Ana Oliveira 131 | 3 | Kelly Costa 132 | (3 registros) 133 | 134 | 135 | A tabela "tb_hist_operacao" possui três registros - indicando que três registros foram inseridos. 136 | através do comando insert 137 | 138 | operacao 139 | ---------- 140 | INSERT 141 | INSERT 142 | INSERT 143 | (3 registros) 144 | */ 145 | 146 | /*Atualiza o registro na tabela "tb_clientes" com id = 2.*/ 147 | UPDATE tb_clientes SET name = 'Ana Oliveira Santos' WHERE id = 2; 148 | 149 | /* 150 | Após a atualização do registro da tabela "tb_clientes" o nome que possui id igual a 2 foi atualizado de 151 | "Ana Oliveira" para "Ana Oliveira Santos". 152 | 153 | id | name 154 | ----+--------------------- 155 | 2 | Ana Oliveira Santos 156 | 157 | 158 | A tabela "tb_hist_operacao" possui um novo registro - indicando que um registro foi atualizado através do comando update. 159 | 160 | operacao 161 | ---------- 162 | INSERT 163 | INSERT 164 | INSERT 165 | UPDATE 166 | (4 registros) 167 | */ 168 | 169 | 170 | 171 | /* 172 | Deleta um registro na tabela tb_clientes que possui id igual a 3 173 | */ 174 | 175 | /* 176 | Importante!!! Descomente este comando apenas se quiser excluir o registro 177 | com id igual a 3 da tabela "tb_clientes" 178 | */ 179 | --DELETE FROM tb_clientes WHERE id = 3; 180 | 181 | /* 182 | Após a exclusão do registro a tabela "tb_clientes" possui 2 registros. 183 | 184 | id | name 185 | ----+-------------- 186 | 1 | Paulo Silva 187 | 2 | Ana Oliveira 188 | (2 registros) 189 | 190 | A tabela "tb_hist_operacao" possui um novo registro - indicando que um registro foi excluído através do comando "delete". 191 | 192 | operacao 193 | ---------- 194 | INSERT 195 | INSERT 196 | INSERT 197 | UPDATE 198 | DELETE 199 | (5 registros) 200 | */ 201 | 202 | /*Seleciona os registros da tabela "tb_clientes"*/ 203 | SELECT * FROM tb_clientes; 204 | 205 | /*Seleciona os registros com as operações da tabela "tb_hist_operacao"*/ 206 | SELECT operacao, data_hora_criacao, id_cliente, nome_antigo , nome_novo FROM tb_hist_operacao; 207 | -------------------------------------------------------------------------------- /artigo_mysql_sum_soma/tb_fornecedor_codificacao_utf8.sql: -------------------------------------------------------------------------------- 1 | /** 2 | * IMPORTANTE!!! 3 | * DESCOMENTE A SENTENÇA ABAIXO SOMENTE SE DESEJAR EXCLUIR A TABELA tb_fornecedor 4 | */ 5 | /*DROP TABLE IF EXISTS tb_fornecedor;*/ 6 | 7 | 8 | /** 9 | *Cria a tabela tb_fornecedor. 10 | */ 11 | CREATE TABLE tb_fornecedor 12 | ( 13 | produto character varying(70), 14 | segmento character varying(70), 15 | data date, 16 | valor numeric 17 | ); 18 | 19 | 20 | /** 21 | *Inclui os dados na tabela tb_fornecedor. 22 | */ 23 | INSERT INTO tb_fornecedor VALUES('DVD', 'Papelaria e informática', '2013-09-12', 2.00); 24 | INSERT INTO tb_fornecedor VALUES('HD 500 GB', 'Papelaria e informática', '2013-10-20', 300.00); 25 | INSERT INTO tb_fornecedor VALUES('Tonner', 'Papelaria e informática', '2013-11-01', 250.00); 26 | INSERT INTO tb_fornecedor VALUES('Cadeira', 'Marcenaria', '2013-09-19', 50.00); 27 | INSERT INTO tb_fornecedor VALUES('Mesa', 'Marcenaria', '2013-10-21', 600.00); 28 | INSERT INTO tb_fornecedor VALUES('Armário', 'Marcenaria', '2013-11-02', 900.00); 29 | INSERT INTO tb_fornecedor VALUES('Corrimão', 'Serralheria', '2013-09-12', 400.00); 30 | INSERT INTO tb_fornecedor VALUES('Portão', 'Serralheria', '2013-10-22', 1500.00); 31 | INSERT INTO tb_fornecedor VALUES('Grade de proteção para janela', 'Serralheria', '2013-11-03', 800.00); 32 | INSERT INTO tb_fornecedor VALUES('Detergente', 'Limpeza e higiêne', '2013-09-20', 5.00); 33 | INSERT INTO tb_fornecedor VALUES('Desinfetante', 'Limpeza e higiêne', '2013-11-23', 40.00); 34 | INSERT INTO tb_fornecedor VALUES('Papel toalha', 'Limpeza e higiêne', '2013-11-04', 60.00); 35 | 36 | /** 37 | *Exibe os dados da tabela tb_fornecedor. 38 | */ 39 | SELECT produto, valor, segmento, data FROM tb_fornecedor; 40 | 41 | 42 | /*1º Exemplo*/ 43 | 44 | /*calcular o valor total das despesas*/ 45 | SELECT SUM(valor) FROM tb_fornecedor; 46 | 47 | /*calcular o valor total das despesas e exibir o nome da coluna como total (alias)*/ 48 | SELECT SUM(valor) AS total FROM tb_fornecedor; 49 | 50 | 51 | /*2º Exemplo*/ 52 | 53 | /* calcular o valor total das despesas por seguimento */ 54 | 55 | SELECT segmento, SUM(valor) AS total 56 | FROM tb_fornecedor 57 | GROUP BY segmento; 58 | 59 | /* calcular o valor total das despesas por seguimento em ordem crescente */ 60 | SELECT 61 | segmento, 62 | SUM(valor) AS total 63 | FROM tb_fornecedor 64 | GROUP BY segmento 65 | ORDER BY total; 66 | 67 | /* calcular o valor total das despesas por seguimento em ordem decrescente */ 68 | SELECT 69 | segmento, 70 | SUM(valor) AS total 71 | FROM tb_fornecedor 72 | GROUP BY segmento 73 | ORDER BY total DESC; 74 | 75 | 76 | /*3º Exemplo*/ 77 | 78 | /*Cria a coluna quantidade*/ 79 | ALTER TABLE tb_fornecedor ADD COLUMN quantidade SMALLINT UNSIGNED AFTER produto; 80 | 81 | /*Atualiza os valores da coluna quantidade*/ 82 | 83 | UPDATE tb_fornecedor SET quantidade = 10 WHERE produto = 'DVD' ; 84 | UPDATE tb_fornecedor SET quantidade = 2 WHERE produto = 'HD 500 GB'; 85 | UPDATE tb_fornecedor SET quantidade = 2 WHERE produto = 'Tonner'; 86 | UPDATE tb_fornecedor SET quantidade = 3 WHERE produto = 'Cadeira'; 87 | UPDATE tb_fornecedor SET quantidade = 1 WHERE produto = 'Mesa'; 88 | UPDATE tb_fornecedor SET quantidade = 1 WHERE produto = 'Armário'; 89 | UPDATE tb_fornecedor SET quantidade = 1 WHERE produto = 'Corrimão'; 90 | UPDATE tb_fornecedor SET quantidade = 1 WHERE produto = 'Portão'; 91 | UPDATE tb_fornecedor SET quantidade = 2 WHERE produto = 'Grade de proteção para janela'; 92 | UPDATE tb_fornecedor SET quantidade = 3 WHERE produto = 'Detergente'; 93 | UPDATE tb_fornecedor SET quantidade = 5 WHERE produto = 'Desinfetante'; 94 | UPDATE tb_fornecedor SET quantidade = 2 WHERE produto = 'Papel toalha'; 95 | 96 | 97 | /*Exibe os registros após a criação da coluna quantidade*/ 98 | SELECT * FROM tb_fornecedor; 99 | 100 | 101 | /*Calcula as despesas por segmento, mas agora considerando a quantidade de produtos.*/ 102 | SELECT 103 | segmento, 104 | SUM(quantidade * valor) AS total 105 | FROM tb_fornecedor 106 | GROUP BY segmento 107 | ORDER BY total; 108 | 109 | /*4º Exemplo*/ 110 | 111 | /*Exemplo da utilização de extract*/ 112 | SELECT 113 | data, 114 | extract(month from data) AS mes, 115 | extract(year from data) AS ano 116 | FROM tb_fornecedor; 117 | 118 | /*Calcula o total das despesas por mês*/ 119 | SELECT 120 | extract(month from data) AS mes, 121 | SUM(quantidade * valor) AS total 122 | FROM tb_fornecedor 123 | WHERE extract(year from data) = 2013 124 | GROUP BY mes 125 | ORDER BY mes; 126 | 127 | 128 | /*Configura localmente a variável de sistema para português - BR*/ 129 | SET LOCAL lc_time_names='pt_BR'; 130 | 131 | 132 | /*Calcular o total das despesas por mês(extenso)*/ 133 | 134 | SELECT 135 | /*Formata a data em português devido a configuração da variável de sistema do mysql chamada "lc_time_names". Em caso de dúvida veja o artigo de formatação de data*/ 136 | date_format(data, '%M/%Y') AS mes, 137 | SUM(quantidade * valor) AS total 138 | FROM tb_fornecedor 139 | WHERE extract(year FROM data) = 2013 140 | GROUP BY mes 141 | /*Orderna pela ordem numérica do mês (...9,10, 11)* observe o "m" do date_format em minúsculo*/ 142 | ORDER BY date_format(data, '%m/%Y') ; 143 | 144 | 145 | /*5º Exemplo*/ 146 | 147 | /*Calcula o total das despesas por mês e por segmento.*/ 148 | SELECT 149 | extract(month FROM data) AS mes, 150 | segmento, 151 | SUM(quantidade * valor) AS total 152 | FROM tb_fornecedor 153 | WHERE extract(year FROM data) = 2013 154 | GROUP BY mes, segmento 155 | ORDER BY mes, segmento; 156 | 157 | 158 | /*Calcula o total das despesas por mês(extenso) e por segmento.*/ 159 | SELECT 160 | /*Formata a data em português devido a configuração da variável de sistema do mysql chamada "lc_time_names". Em caso de dúvida veja o artigo de formatação de data*/ 161 | date_format(data, '%M/%Y') AS mes, 162 | segmento, 163 | SUM(quantidade * valor) AS total 164 | FROM tb_fornecedor 165 | WHERE extract(year FROM data) = 2013 166 | GROUP BY mes, segmento 167 | /* 168 | Orderna pela ordem numérica do mês (...9,10, 11)* observe o "m"do date_format 169 | em minúsculo 170 | */ 171 | ORDER BY date_format(data, '%m/%Y'), segmento; 172 | 173 | 174 | /*6º Exemplo*/ 175 | /* 176 | Seleciona quais os meses em que as despesas ultrapassaram R$2000, ou seja, 177 | foram maior que R$2000? 178 | */ 179 | 180 | SELECT 181 | /*Formata a data em português devido a configuração da variável de sistema do mysql chamada "lc_time_names". Em caso de dúvida veja o artigo de formatação de data*/ 182 | date_format(data, '%M/%Y') AS mes, 183 | SUM(quantidade * valor) AS total 184 | FROM tb_fornecedor 185 | WHERE extract(year FROM data) = 2013 186 | GROUP BY mes 187 | HAVING SUM(quantidade * valor) > 2000 188 | /*Orderna pela ordem numérica do mês (...9,10, 11)* observe o "m" do date_format em minúsculo*/ 189 | ORDER BY date_format(data, '%m/%Y'); 190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 | 198 | 199 | 200 | 201 | 202 | -------------------------------------------------------------------------------- /artigo_postgre_somar_dias_uteis/adiciona_dias_uteis.sql: -------------------------------------------------------------------------------- 1 | /** 2 | *Esta função acrescenta dias úteis a uma data 3 | * 4 | *Ela faz cinco verificações: 5 | * -Verifica se o dia é sabado ou domingo. 6 | * 7 | * -Verifica se o dia é feriado federal: os feriados federais foram cadastrados 8 | * na tabela "tab_feriado_federal". 9 | * 10 | * -Verifica se o dia é feriado estadual: os feriados estaduais foram cadastrados 11 | * na tabela "tab_feriado_estadual". 12 | * 13 | * -Verifica se o dia é feriado municipal. 14 | * A data dos feriado municipais devem ser cadastradas na tabela "tab_feriado_municipal". 15 | * Como são muitos feriados munícipais eu cadastrei somente os feriados munícipais para 16 | * as cidades de "São Paulo" e "Porto Alegre". 17 | * Cadestre novos feriados munícipais conforme a sua necessidade. 18 | * 19 | * -Verifica se o dia é feriado de pascoa, carnaval, pascoa, corpos Corpus Christi. 20 | * Estes feriados não tem dia fixo. 21 | * Esta função utiliza uma outra função chamada feriados_moveis(integer) para fazer a verificacão 22 | * destes feriados. 23 | */ 24 | /* 25 | Como utilizar: 26 | 27 | SELECT adiciona_dias_uteis('data', quantidade_de_dias_uteis, codigo_da_cidade); 28 | 29 | O parâmetro data deve ser passado no formato aaaa-mm-dd. 30 | 31 | Veja os exemplos a seguir 32 | 33 | -Verifica a adição de dias úteis para a cidade de São Paulo. 34 | -O resultado da adição de 6 dias úteis, a partir de 04/07/2014 é 15/07/2014. 35 | pois não foram contados sábados, domingos e o feriado estadual "Revolução Constitucionalista", 36 | 37 | SELECT adiciona_dias_uteis('2014-07-04', 6, 1); 38 | 39 | -Verifica a adição de dias úteis para a cidade de Porto Alegre 40 | -O resultado da adição de 6 dias úteis, a partir 04/07/2014 é 14/07/2014, 41 | pois não foram contados sábados, domingos. 42 | 43 | SELECT adiciona_dias_uteis('2014-07-04', 6, 2); 44 | 45 | -Verifica a adição de dias úteis para a cidade de São Paulo. 46 | -O resultado da adição de 10 dias úteis, a partir de 17/03/2014 é 31/03/2014, 47 | pois não foram contados sábados, domingos. 48 | 49 | SELECT adiciona_dias_uteis('2014-03-17', 10, 1); 50 | 51 | -Verifica a adição de dias úteis para a cidade de Porto Alegre 52 | -O resultado da adição de 10 dias úteis, a partir de 17/03/2014 é 01/04/2014, 53 | pois não foram contados sábados, domingos e o feriado municipal de "Nossa Senhora dos Navegantes". 54 | 55 | SELECT adiciona_dias_uteis('2014-03-17', 10, 2); 56 | 57 | -Caso o código da cidade seja nulo, ocorrerá um erro. 58 | -Será exibida a seguinte mensagem de erro: 59 | O código da cidade deve ser preenchido. 60 | 61 | SELECT adiciona_dias_uteis('2014-12-20', 10, NULL); 62 | 63 | -Caso o código da cidade, não esteja cadatrado na tabela tab_cidades, ocorrerá um erro. 64 | -Será exibida a seguinte mensagem de erro: 65 | Não existe código para esta cidade. 66 | Verifique o código correto na tabela tab_cidades. 67 | Caso não exista, você deve incluí-lo. 68 | 69 | SELECT adiciona_dias_uteis('2014-12-20', 10, 56); 70 | */ 71 | 72 | CREATE OR REPLACE FUNCTION adiciona_dias_uteis 73 | ( 74 | var_data date, 75 | dias integer, 76 | var_cidade_id integer 77 | ) 78 | RETURNS date AS 79 | $BODY$ 80 | 81 | DECLARE 82 | intervalo interval := '1 day'; 83 | contador integer = 0; 84 | verifica_cidade boolean; 85 | BEGIN 86 | 87 | SELECT INTO verifica_cidade 88 | EXISTS 89 | ( 90 | SELECT cidade_nome FROM tab_cidades WHERE cidade_id = var_cidade_id 91 | ); 92 | /** 93 | *Verifica se foi passado o parâmetro com a identificação da cidade. 94 | */ 95 | IF(var_cidade_id IS NULL ) THEN 96 | RAISE EXCEPTION 'Preencha o código da cidade.'; 97 | /** 98 | *Verifica se a cidade esta cadastrada na tabela tab_cidades. 99 | */ 100 | ELSIF(verifica_cidade = FALSE) THEN 101 | RAISE EXCEPTION 102 | ' 103 | Não existe código para esta cidade. 104 | Verifique o código correto na tabela tab_cidades. 105 | Caso não exista, você deve incluí-lo. 106 | '; 107 | END IF; 108 | 109 | WHILE (contador < dias) dias LOOP 110 | 111 | /** 112 | *Acrescenta o intervalo de um dia a data 113 | */ 114 | var_data := var_data + intervalo; 115 | 116 | /** 117 | *Verifica se a data é sábado ou domingo. 118 | *Caso seja reinicia o loop através do comando "CONTINUE". 119 | *Caso contrário executará a próxima verificação, ou seja verificará se o dia é feriado federal 120 | */ 121 | IF ((EXTRACT(DOW FROM var_data) = 0) OR (EXTRACT(DOW FROM var_data) = 6)) THEN 122 | CONTINUE; 123 | END IF; 124 | 125 | /** 126 | *Verifica se a data é feriado federal. 127 | *Caso seja reinicia o loop através do comando "CONTINUE". 128 | *Caso contrário executará a próxima verificação, ou seja verificará se o dia é feriado religioso 129 | */ 130 | IF 131 | ( 132 | EXISTS 133 | ( 134 | SELECT feriado_federal FROM tab_feriado_federal 135 | WHERE to_char(feriado_federal, 'mm-dd') = to_char(var_data, 'mm-dd') 136 | ) = TRUE 137 | ) THEN 138 | CONTINUE; 139 | END IF; 140 | 141 | 142 | /** 143 | *Verifica se o feriado é pascoa, carnaval, sexta-feira santa e corpos Corpus Christi. 144 | *Caso seja reinicia o loop através do comando "CONTINUE". 145 | *Caso contrário executará a próxima instrução. 146 | */ 147 | IF 148 | ( 149 | EXISTS 150 | ( 151 | SELECT data FROM feriados_moveis(EXTRACT(YEAR FROM var_data) :: integer) 152 | WHERE data= var_data 153 | ) = TRUE 154 | ) THEN 155 | CONTINUE; 156 | END IF; 157 | 158 | 159 | /** 160 | *Verifica feriado estadual. 161 | */ 162 | IF( 163 | EXISTS 164 | ( 165 | SELECT feriado_estadual 166 | FROM tab_feriado_estadual 167 | JOIN tab_cidades 168 | ON tab_feriado_estadual.sigla_estado = tab_cidades.sigla_estado 169 | WHERE cidade_id = var_cidade_id AND 170 | to_char(feriado_estadual, 'mm-dd') = to_char(var_data, 'mm-dd') 171 | ) = TRUE 172 | ) THEN 173 | CONTINUE; 174 | END IF; 175 | 176 | /** 177 | *Verifica feriado municipal 178 | */ 179 | IF( 180 | EXISTS 181 | ( 182 | SELECT feriado_municipal 183 | FROM tab_feriado_municipal 184 | WHERE cidade_id = var_cidade_id AND 185 | to_char(feriado_municipal, 'mm-dd') = to_char(var_data, 'mm-dd') 186 | ) = TRUE 187 | ) THEN 188 | CONTINUE; 189 | END IF; 190 | 191 | /** 192 | *Acrescenta um dia útil ao contador. 193 | */ 194 | contador := contador + 1; 195 | 196 | /** 197 | *Exibe os valores das variaveis, durante o loop. 198 | *Caso queira verificar os valores descomente os comandos "RAISE NOTICE" 199 | */ 200 | 201 | 202 | --RAISE NOTICE 'var_data:%', var_data; 203 | --RAISE NOTICE 'contador: %', contador; 204 | --RAISE NOTICE 'DOW dia da semana valor numerico:%', EXTRACT(DOW FROM var_data); 205 | --RAISE NOTICE ''; 206 | 207 | 208 | END LOOP; 209 | RETURN var_data; 210 | END 211 | $BODY$ 212 | LANGUAGE plpgsql STABLE 213 | COST 100; 214 | ALTER FUNCTION data(character varying, integer) 215 | OWNER TO postgres; 216 | -------------------------------------------------------------------------------- /artigo_postgre_funcao_count/postgre_funcao_count.sql: -------------------------------------------------------------------------------- 1 | /** 2 | *DESCOMENTE O COMANDO ABAIXO SOMENTE SE DESEJAR EXCLUIR A TABELA tb_ordem_servicov 3 | */ 4 | --DROP TABLE IF EXISTS tb_ordem_servico; 5 | 6 | /** 7 | *Criar a tabela tb_ordem_servico. 8 | */ 9 | CREATE TABLE tb_ordem_servico 10 | ( 11 | cod_ordem integer, 12 | cod_servico character varying(1), 13 | data_inicial date, 14 | data_final date 15 | ); 16 | 17 | /** 18 | *Incluir os dados na tabela tb_ordem_servico 19 | */ 20 | INSERT INTO tb_ordem_servico(cod_ordem, cod_servico, data_inicial, data_final) 21 | VALUES 22 | (34330, 'A', '2013-11-10', '2013-11-12'), 23 | (34331, 'A', '2013-12-06', '2013-12-08'), 24 | (34332, 'A', '2013-01-05', '2014-01-06'), 25 | (34333, 'A', '2014-01-30', NULL), 26 | (34334, 'B', '2013-11-15', '2013-11-17'), 27 | (34335, 'B', '2013-12-18', '2013-12-19'), 28 | (34336, 'B', '2013-01-05', '2014-01-06'), 29 | (34337, 'B', '2014-01-28', NULL), 30 | (34338, 'C', '2013-11-08', '2013-11-11'), 31 | (34339, 'C', '2013-12-05', '2013-12-08'), 32 | (34340, 'C', '2013-01-15', '2014-01-17'), 33 | (34341, 'C', '2014-01-27', NULL); 34 | 35 | /** 36 | *Exibir os dados da tabela tb_ordem_servico 37 | */ 38 | SELECT * FROM tb_ordem_servico; 39 | 40 | /** 41 | *1º EXEMPLO 42 | */ 43 | 44 | /** 45 | *Exibe a quantidade de registros da tabela tb_ordem_servico 46 | */ 47 | SELECT COUNT(*) FROM tb_ordem_servico; 48 | 49 | /** 50 | *Criação do alias quantidade 51 | */ 52 | SELECT COUNT(*) AS quatidade FROM tb_ordem_servico; 53 | 54 | /** 55 | *2º EXEMPLO 56 | */ 57 | 58 | /** 59 | *Exibir a quantidade de registros onde o código do serviço seja do tipo "A". 60 | */ 61 | SELECT 62 | COUNT(cod_servico) AS quantidade 63 | FROM tb_ordem_servico 64 | WHERE cod_servico = 'A'; 65 | 66 | /** 67 | *3º EXEMPLO 68 | */ 69 | 70 | /** 71 | *Exibir a quantidade de ordens de serviços que já foram finalizadas. 72 | **/ 73 | SELECT 74 | COUNT(data_final) AS quantidade 75 | FROM tb_ordem_servico; 76 | 77 | /** 78 | *4º EXEMPLO 79 | */ 80 | 81 | /** 82 | *Exibir a quantidade de ordens de serviços que não foram finalizadas. 83 | */ 84 | SELECT 85 | COUNT(*) AS quantidade 86 | FROM tb_ordem_servico WHERE data_final IS NULL; 87 | 88 | /** 89 | *5º Exemplo 90 | */ 91 | 92 | /** 93 | *Distribuição por tipo de serviço: 94 | *Quantidade de solicitações para o serviço "A"; 95 | *Quantidade de solicitações para o serviço "B"; 96 | *Quantidade de solicitações para o serviço "C"; 97 | */ 98 | 99 | SELECT 100 | cod_servico, 101 | COUNT(cod_servico) AS quantidade 102 | FROM tb_ordem_servico 103 | GROUP BY cod_servico; 104 | 105 | /** 106 | *Ordenar o serviço por ordem alfabética 107 | */ 108 | SELECT 109 | cod_servico, 110 | COUNT(cod_servico) AS quantidade 111 | FROM tb_ordem_servico 112 | GROUP BY cod_servico 113 | ORDER BY cod_servico; 114 | 115 | /** 116 | *6º Exemplo 117 | */ 118 | 119 | /** 120 | *Quantidade de ordens finalizadas por mês e ano (mm/aaaa). 121 | *Quando utilizamos a função COUNT(nome_da_coluna), valores nulos não entram na contagem, 122 | */ 123 | SELECT 124 | CASE WHEN data_final IS NOT NULL 125 | THEN to_char(data_final, 'MM/YYYY') 126 | END mes_ano, 127 | COUNT(data_final) AS qtd_os 128 | FROM tb_ordem_servico 129 | GROUP BY mes_ano; 130 | 131 | /** 132 | *Quantidade de ordens finalizadas por mês e ano (mm/aaaa). 133 | *Quando utilizamos a função COUNT(*), valores nulos entram na contagem, 134 | */ 135 | SELECT 136 | to_char(data_final, 'MM/YYYY') AS mes_ano, 137 | COUNT(*) AS qtd_os 138 | FROM tb_ordem_servico 139 | GROUP BY to_char(data_final, 'MM/YYYY'); 140 | 141 | /** 142 | *Podemos colocar a mensagem "Pendente" para indicar a quantidade de ordens de serviço 143 | *que não possuem data de encerramento. 144 | */ 145 | SELECT 146 | CASE WHEN data_final IS NOT NULL 147 | THEN to_char(data_final, 'MM/YYYY') 148 | ELSE 'Pendente' 149 | END mes_ano, 150 | COUNT(*) AS qtd_os 151 | FROM tb_ordem_servico 152 | GROUP BY mes_ano; 153 | 154 | /** 155 | *Para não exibir a contagem de valores nulos, utilizamos um filtro no "WHERE": 156 | */ 157 | SELECT 158 | to_char(data_final, 'MM/YYYY') AS mes_ano, 159 | COUNT(data_final) AS qtd_os 160 | FROM tb_ordem_servico 161 | WHERE data_final IS NOT NULL 162 | GROUP BY mes_ano; 163 | 164 | /** 165 | *Para ordenar por ano e mês em ordem crescente utilize o comando "ORDER BY". 166 | */ 167 | SELECT 168 | to_char(data_final, 'YYYYMM') AS ordem_data, 169 | to_char(data_final, 'MM/YYYY') AS mes_ano, 170 | COUNT(*) AS qtd_os_finalizadas 171 | FROM tb_ordem_servico 172 | WHERE data_final IS NOT NULL 173 | GROUP BY to_char(data_final, 'MM/YYYY'), to_char(data_final, 'YYYYMM') 174 | ORDER BY to_char(data_final, 'YYYYMM'); 175 | 176 | /** 177 | *Para não exibir a coluna "ordem_data" você pode montar uma subquery. 178 | */ 179 | SELECT mes_ano, qtd_os_finalizadas 180 | FROM 181 | ( 182 | SELECT 183 | to_char(data_final, 'YYYYMM') AS ordem_data, 184 | to_char(data_final, 'MM/YYYY') AS mes_ano, 185 | COUNT(*) AS qtd_os_finalizadas 186 | FROM tb_ordem_servico 187 | WHERE data_final IS NOT NULL 188 | GROUP BY to_char(data_final, 'MM/YYYY'), to_char(data_final, 'YYYYMM') 189 | ORDER BY to_char(data_final, 'YYYYMM') 190 | ) Q 191 | ORDER BY ordem_data; 192 | 193 | /** 194 | *7º Exemplo 195 | */ 196 | 197 | /** 198 | *Quantidade de ordens finalizadas por mês e ano (mm/aaaa) e por tipo de serviço. 199 | */ 200 | SELECT 201 | to_char(data_final, 'MM/YYYY') AS mes_ano, 202 | cod_servico, 203 | COUNT(*) AS qtd_os 204 | FROM tb_ordem_servico 205 | WHERE data_final IS NOT NULL 206 | GROUP BY mes_ano, cod_servico; 207 | 208 | /** 209 | *Ordenar em crescente o ano/mês e o serviço 210 | */ 211 | SELECT 212 | to_char(data_final, 'YYYYMM') AS ordem_data, 213 | to_char(data_final, 'MM/YYYY') AS mes_ano, 214 | cod_servico, 215 | COUNT(*) AS qtd_os_finalizadas 216 | FROM tb_ordem_servico 217 | WHERE data_final IS NOT NULL 218 | GROUP BY to_char(data_final, 'MM/YYYY'), to_char(data_final, 'YYYYMM') , cod_servico 219 | ORDER BY to_char(data_final, 'YYYYMM'), cod_servico; 220 | 221 | /** 222 | *Para não exibir a coluna "ordem_data" você pode montar uma subquery. 223 | */ 224 | SELECT mes_ano, cod_servico, qtd_os_finalizadas 225 | FROM 226 | ( 227 | SELECT 228 | to_char(data_final, 'YYYYMM') AS ordem_data, 229 | to_char(data_final, 'MM/YYYY') AS mes_ano, 230 | cod_servico, 231 | COUNT(*) AS qtd_os_finalizadas 232 | FROM tb_ordem_servico 233 | WHERE data_final IS NOT NULL 234 | GROUP BY to_char(data_final, 'MM/YYYY'), to_char(data_final, 'YYYYMM') , cod_servico 235 | ORDER BY to_char(data_final, 'YYYYMM') , cod_servico 236 | ) Q 237 | ORDER BY ordem_data, cod_servico; 238 | 239 | /** 240 | *8º Exemplo 241 | */ 242 | 243 | /** 244 | *Incluir a coluna "cliente" na tabela "tb_ordem_servico". 245 | */ 246 | ALTER TABLE tb_ordem_servico ADD COLUMN cliente character varying(50); 247 | 248 | /** 249 | *Exibir os dados da tabela tb_ordem_servico 250 | */ 251 | SELECT * FROM tb_ordem_servico; 252 | 253 | /** 254 | *Vamos alterar os dados da coluna "cliente" 255 | */ 256 | 257 | UPDATE tb_ordem_servico SET cliente = 'Padaria P' WHERE cod_ordem >=34330 AND cod_ordem <=34333; 258 | UPDATE tb_ordem_servico SET cliente = 'Marcenaria M' WHERE cod_ordem >34333 AND cod_ordem <=34336; 259 | UPDATE tb_ordem_servico SET cliente = 'HOSPITAL H' WHERE cod_ordem >34336; 260 | 261 | /** 262 | *Exibir os dados da tabela tb_ordem_servico após a atualização 263 | */ 264 | SELECT * FROM tb_ordem_servico; 265 | 266 | /** 267 | *Exibir quantas empresas fizeram solicitação de ordem de serviço. 268 | *Se observarmos a coluna "cliente" observamos que 3 empresas 269 | *fizeram solicitação a "Padaria P", a "Marcenaria M" e o "HOSPITAL H". 270 | */ 271 | SELECT COUNT(DISTINCT(cliente)) FROM tb_ordem_servico; -------------------------------------------------------------------------------- /artigo_postgre_sql_avg_media/exemplos_postgre_media.sql: -------------------------------------------------------------------------------- 1 | /** 2 | *Início do 1º exemplo 3 | */ 4 | 5 | /*Calcula a média da coluna valor*/ 6 | 7 | SELECT AVG(valor) FROM tb_fornecedor; 8 | 9 | /*Calcula a média da coluna valor, e exibe o nome da coluna como média (alias).*/ 10 | 11 | SELECT AVG(valor) AS media FROM tb_fornecedor; 12 | 13 | /** 14 | *Fim do 1º exemplo 15 | */ 16 | 17 | 18 | /** 19 | *Início do 2º exemplo 20 | */ 21 | 22 | /*Cálculo da média por segmento*/ 23 | 24 | SELECT segmento, AVG(valor) AS media 25 | FROM tb_fornecedor 26 | GROUP BY segmento; 27 | 28 | /*Cálcula da média por segmento, e ordenar a média em ordem crescente, ou seja, do valor menor para o maior*/ 29 | 30 | SELECT 31 | segmento, 32 | AVG(valor) AS media 33 | FROM tb_fornecedor 34 | GROUP BY segmento 35 | ORDER BY media; 36 | 37 | /*Cálcula da média por segmento, e ordenar a média em ordem decrescente, ou seja, do valor maior para o menor*/ 38 | 39 | SELECT 40 | segmento, 41 | AVG(valor) AS media 42 | FROM tb_fornecedor 43 | GROUP BY segmento 44 | ORDER BY media DESC; 45 | 46 | /** 47 | *Fim do 2º exemplo 48 | */ 49 | 50 | 51 | /** 52 | *Início do 3º exemplo 53 | */ 54 | 55 | /*Para executarmos o 3º exemplo vamos acrescentar a coluna quantidade a tabela tb_fornecedor*/ 56 | 57 | /*Adicionamos a coluna quantidade.*/ 58 | 59 | ALTER TABLE tb_fornecedor ADD COLUMN quantidade integer; 60 | 61 | /*Atualizamos os dados da coluna quantidade.*/ 62 | 63 | UPDATE tb_fornecedor SET quantidade = 10 WHERE produto = 'DVD'; 64 | UPDATE tb_fornecedor SET quantidade = 2 WHERE produto = 'HD 500 GB'; 65 | UPDATE tb_fornecedor SET quantidade = 2 WHERE produto = 'Tonner'; 66 | UPDATE tb_fornecedor SET quantidade = 3 WHERE produto = 'Cadeira'; 67 | UPDATE tb_fornecedor SET quantidade = 1 WHERE produto = 'Mesa'; 68 | UPDATE tb_fornecedor SET quantidade = 1 WHERE produto = 'Armário'; 69 | UPDATE tb_fornecedor SET quantidade = 1 WHERE produto = 'Corrimão'; 70 | UPDATE tb_fornecedor SET quantidade = 1 WHERE produto = 'Portão'; 71 | UPDATE tb_fornecedor SET quantidade = 2 WHERE produto = 'Grade de proteção para janela'; 72 | UPDATE tb_fornecedor SET quantidade = 3 WHERE produto = 'Detergente'; 73 | UPDATE tb_fornecedor SET quantidade = 5 WHERE produto = 'Desinfetante'; 74 | UPDATE tb_fornecedor SET quantidade = 2 WHERE produto = 'Papel toalha'; 75 | 76 | 77 | /*Após a atualização, podemos verificar as alterações na tabela.*/ 78 | 79 | SELECT * FROM tb_fornecedor; 80 | 81 | /*Calculo das médias por segmento levando em consideração a quantidade*/ 82 | 83 | SELECT 84 | segmento, 85 | AVG(quantidade * valor) AS media 86 | FROM tb_fornecedor 87 | GROUP BY segmento 88 | ORDER BY media; 89 | 90 | /** 91 | *Fim do 3º exemplo 92 | */ 93 | 94 | 95 | 96 | /** 97 | *Início do 4º exemplo 98 | */ 99 | 100 | /* 101 | Para extrair o mês e o ano de uma data podemos utilizar as funções "extract" ou "date_part". 102 | As duas funções são equivalentes no postgresql. 103 | */ 104 | 105 | SELECT 106 | data, 107 | date_part('month', data) AS mes, 108 | date_part('year', data) AS ano 109 | FROM tb_fornecedor; 110 | 111 | SELECT 112 | data, 113 | date_part('month', data) AS mes, 114 | date_part('year', data) AS ano 115 | FROM tb_fornecedor; 116 | 117 | /*Calculo da média das despesas para os os meses 9, 10, 11 de 2013, utilizando extract*/ 118 | 119 | SELECT 120 | extract(month from data) AS mes, 121 | AVG(quantidade * valor) AS media 122 | FROM tb_fornecedor 123 | WHERE extract(year from data) = 2013 124 | GROUP BY mes 125 | ORDER BY mes; 126 | 127 | /*Calculo da média das despesas para os os meses 9, 10, 11 de 2013, utilizando date_part*/ 128 | SELECT 129 | date_part('month', data) AS mes, 130 | AVG(quantidade * valor) AS media 131 | FROM tb_fornecedor 132 | WHERE date_part('year', data) = 2013 133 | GROUP BY mes 134 | ORDER BY mes; 135 | 136 | 137 | /*Calculo da média das despesas por mês. 138 | Exibição dos meses por extenso: "setembro / 2013", "outubro / 2013" e "novembro / 2013". 139 | Utilizando extract. 140 | */ 141 | 142 | SELECT 143 | extract(month FROM data) AS mes_num, 144 | /*Formata a data em português devido ao prefixo TM. Em caso de dúvida veja o artigo de formatação de data*/ 145 | to_char(data, 'TMMonth "/" YYYY') AS mes, 146 | AVG(quantidade * valor) AS media 147 | FROM tb_fornecedor 148 | WHERE extract(year FROM data) = 2013 149 | GROUP BY mes_num, mes 150 | ORDER BY mes_num; 151 | 152 | /*Calculo da média das despesas por mês. 153 | Exibição dos meses por extenso: "setembro / 2013", "outubro / 2013" e "novembro / 2013". 154 | Utilizando date_part. 155 | */ 156 | 157 | SELECT 158 | date_part('month', data) AS mes_num, 159 | /*Formata a data em português devido ao prefixo TM. Em caso de dúvida veja o artigo de formatação de data*/ 160 | to_char(data, 'TMMonth "/" YYYY') AS mes, 161 | AVG (quantidade * valor) AS media 162 | FROM tb_fornecedor 163 | WHERE date_part('year', data) = 2013 164 | GROUP BY mes_num, mes 165 | ORDER BY mes_num; 166 | 167 | /** 168 | *Fim do 4º exemplo 169 | */ 170 | 171 | /** 172 | *Início do 5º exemplo 173 | */ 174 | 175 | /*Calculo da média das despesas por mês e segmento, utilizando extract*/ 176 | 177 | SELECT 178 | extract(month FROM data) AS mes, 179 | segmento, 180 | AVG(quantidade * valor) AS media 181 | FROM tb_fornecedor 182 | WHERE extract(year FROM data) = 2013 183 | GROUP BY mes, segmento 184 | ORDER BY mes, segmento; 185 | 186 | /*Calculo da média das despesas por mês e segmento, utilizando date_part*/ 187 | 188 | SELECT 189 | date_part('month', data) AS mes, 190 | segmento, 191 | AVG(quantidade * valor) AS media 192 | FROM tb_fornecedor 193 | WHERE date_part('year', data) = 2013 194 | GROUP BY mes, segmento 195 | ORDER BY mes, segmento; 196 | 197 | 198 | /*Calculo da média das despesas por mês(extenso) e segmento, utilizando extract*/ 199 | 200 | SELECT 201 | extract(month FROM data) AS mes_num, 202 | /*Formata a data em português devido ao prefixo TM. Em caso de dúvida veja o artigo de formatação de data*/ 203 | to_char(data, 'TMMonth "/" YYYY') AS mes, 204 | segmento, 205 | AVG(quantidade * valor) AS media 206 | FROM tb_fornecedor 207 | WHERE extract(year FROM data) = 2013 208 | GROUP BY mes_num, mes, segmento 209 | ORDER BY mes_num, segmento; 210 | 211 | /*Calculo da média das despesas por mês(extenso) e segmento, utilizando date_part*/ 212 | 213 | SELECT 214 | date_part('month', data) AS mes_num, 215 | /*Formata a data em português devido ao prefixo TM. Em caso de dúvida veja o artigo de formatação de data*/ 216 | to_char(data, 'TMMonth "/" YYYY') AS mes, 217 | segmento, 218 | AVG(quantidade * valor) AS media 219 | FROM tb_fornecedor 220 | WHERE date_part('year', data) = 2013 221 | GROUP BY mes_num, mes, segmento 222 | ORDER BY mes_num, segmento; 223 | 224 | /** 225 | *Fim do 5º exemplo 226 | */ 227 | 228 | 229 | /** 230 | *Início do 6º exemplo 231 | */ 232 | 233 | /*meses em que as despesas ultrapassaram R$ 600,00, utilizando extract*/ 234 | 235 | SELECT 236 | extract(month FROM data) AS mes_num, 237 | /*Formata a data em português devido ao prefixo TM. Em caso de dúvida veja o artigo de formatação de data*/ 238 | to_char(data, 'TMMonth "/" YYYY') AS mes, 239 | AVG(quantidade * valor) AS media 240 | FROM tb_fornecedor 241 | WHERE extract(year FROM data) = 2013 242 | GROUP BY mes_num, mes 243 | HAVING AVG(quantidade * valor) > 600 244 | ORDER BY mes_num; 245 | 246 | 247 | /*meses em que as despesas ultrapassaram R$ 600,00, utilizando date_part*/ 248 | 249 | SELECT 250 | date_part('month', data) AS mes_num, 251 | /*Formata a data em português devido ao prefixo TM. Em caso de dúvida veja o artigo de formatação de data*/ 252 | to_char(data, 'TMMonth "/" YYYY') AS mes, 253 | AVG(quantidade * valor) AS media 254 | FROM tb_fornecedor 255 | WHERE date_part('year', data) = 2013 256 | GROUP BY mes_num, mes 257 | HAVING AVG(quantidade * valor) > 600 258 | ORDER BY mes_num; 259 | 260 | 261 | /** 262 | *Fim do 6º exemplo 263 | */ -------------------------------------------------------------------------------- /artigo_postgre_adicionar_intervalo_data_hora/postgresql_adicionar_intervalo_data_hora.sql: -------------------------------------------------------------------------------- 1 | /** 2 | *Atenção!!! Descomente o comando abaixo somente se deseja excluir a tabela tb_exame_paciente. 3 | */ 4 | --DROP TABLE IF EXISTS tb_exame_paciente; 5 | 6 | /** 7 | *Atenção!!! Descomente o comando abaixo somente se deseja excluir a tabela tb_equipamentos. 8 | */ 9 | --DROP TABLE IF EXISTS tb_equipamentos; 10 | 11 | /** 12 | *Atenção!!! Descomente o comando abaixo somente se deseja excluir a tabela tb_turma. 13 | */ 14 | --DROP TABLE IF EXISTS tb_turma; 15 | 16 | /** 17 | *Atenção!!! Descomente o comando abaixo somente se deseja excluir a tabela tb_locacao. 18 | */ 19 | --DROP TABLE IF EXISTS tb_locacao; 20 | 21 | /** 22 | *Atenção!!! Descomente o comando abaixo somente se deseja excluir a tabela tb_pedido. 23 | */ 24 | --DROP TABLE IF EXISTS tb_pedido; 25 | 26 | /** 27 | *Atenção!!! Descomente o comando abaixo somente se deseja excluir a tabela tb_loc_auto. 28 | */ 29 | --DROP TABLE IF EXISTS tb_loc_auto; 30 | 31 | 32 | --Inicio do 1º exemplo 33 | /** 34 | *Cria a tabela "tb_exame_paciente". Esta tabela armazena os exames dos pacientes. 35 | */ 36 | CREATE TABLE tb_exame_paciente 37 | ( 38 | paciente_codigo integer, 39 | exame_codigo integer, 40 | exame_data date 41 | ); 42 | 43 | /** 44 | *Inclui os registros na tabela "tb_exame_paciente". 45 | */ 46 | INSERT INTO tb_exame_paciente (paciente_codigo, exame_codigo, exame_data) 47 | VALUES 48 | (1346, 124, '2014-03-16'), 49 | (1517, 248, '2014-03-17'), 50 | (1732, 426, '2014-03-15'); 51 | 52 | /** 53 | *1ª solução - Exibir as datas de entrega do exame. 54 | */ 55 | SELECT 56 | paciente_codigo, 57 | exame_codigo, 58 | exame_data, 59 | exame_data + 3 AS exame_entrega 60 | FROM tb_exame_paciente; 61 | 62 | /** 63 | *1ª solução - com as datas formatadas. 64 | */ 65 | SELECT 66 | paciente_codigo, 67 | exame_codigo, 68 | to_char (exame_data, 'dd/mm/yyyy') AS exame_data, 69 | to_char (exame_data + 3, 'dd/mm/yyyy') AS exame_entrega 70 | FROM tb_exame_paciente; 71 | 72 | /** 73 | *2ª solução - Exibir as datas de entrega do exame. 74 | */ 75 | SELECT 76 | paciente_codigo, 77 | exame_codigo, 78 | exame_data, 79 | exame_data + interval '3 days' AS exame_entrega 80 | FROM tb_exame_paciente; 81 | 82 | /** 83 | *2ª solução - com as datas formatadas. 84 | */ 85 | SELECT 86 | paciente_codigo, 87 | exame_codigo, 88 | to_char(exame_data, 'dd/mm/yyyy') AS exame_data, 89 | to_char(exame_data + interval '3 days' ,'dd/mm/yyyy') AS exame_entrega 90 | FROM tb_exame_paciente; 91 | 92 | --Fim do 1º exemplo 93 | 94 | --Inicio do 2º exemplo 95 | /** 96 | *Cria a tabela "tb_equipamentos". Esta tabela armazena os equipamentos de uma fábrica. 97 | */ 98 | CREATE TABLE tb_equipamentos 99 | ( 100 | equipamento_id serial, 101 | data_inicio date 102 | ); 103 | 104 | /** 105 | *Insere os registros na tabela "tb_equipamentos" 106 | */ 107 | INSERT INTO tb_equipamentos(equipamento_id, data_inicio) 108 | VALUES 109 | (DEFAULT, '2014-01-05'), 110 | (DEFAULT, '2014-02-24'), 111 | (DEFAULT, '2014-09-19'); 112 | 113 | /** 114 | *Exibe as datas de manutenção dos equipamentos. 115 | */ 116 | SELECT 117 | equipamento_id, 118 | data_inicio, 119 | data_inicio + interval '3 months' AS pri_manutencao, 120 | data_inicio + interval '6 months' AS seg_manutencao 121 | FROM tb_equipamentos; 122 | 123 | /** 124 | *Exibe as datas de manutenção dos equipamentos formatadas. 125 | */ 126 | SELECT 127 | equipamento_id, 128 | to_char(data_inicio, 'dd/mm/yyyy') AS data_inicio, 129 | to_char(data_inicio + interval '3 months', 'dd/mm/yyyy') AS pri_manutencao, 130 | to_char(data_inicio + interval '6 months', 'dd/mm/yyyy') AS seg_manutencao 131 | FROM tb_equipamentos; 132 | --Fim do 2º exemplo 133 | 134 | --Inicio do 3º exemplo 135 | 136 | /** 137 | *Cria a tabela tb_turma. Armazena turmas. 138 | */ 139 | CREATE TABLE tb_turma 140 | ( 141 | turma_id serial, 142 | curso_id integer, 143 | data_inicio date 144 | ); 145 | 146 | /** 147 | *Insere os registros na tabela tb_turmas. 148 | */ 149 | INSERT INTO tb_turma (turma_id, curso_id, data_inicio) 150 | VALUES 151 | (DEFAULT, 5421, '2014-03-24'), 152 | (DEFAULT, 1243, '2014-04-09'), 153 | (DEFAULT, 6423, '2014-05-27'); 154 | 155 | 156 | /** 157 | *Exibe as datas do 1º e 2º teste. 158 | */ 159 | SELECT 160 | turma_id, 161 | curso_id, 162 | data_inicio, 163 | data_inicio + interval '1 year' AS pri_teste, 164 | data_inicio + interval '2 years' AS seg_teste 165 | FROM tb_turma; 166 | 167 | /** 168 | *Exibe as datas do 1º e 2º teste formatadas. 169 | */ 170 | SELECT 171 | turma_id, 172 | curso_id, 173 | to_char(data_inicio, 'dd/mm/yyyy') AS data_inicio, 174 | to_char(data_inicio + interval '1 year', 'dd/mm/yyyy') AS pri_teste, 175 | to_char(data_inicio + interval '2 years', 'dd/mm/yyyy') AS seg_teste 176 | FROM tb_turma; 177 | 178 | --Fim do 3º exemplo 179 | 180 | --Inicio do 4º exemplo 181 | 182 | /** 183 | *Criação da tabela "tb_locacao". Armazena os registros de locação. 184 | */ 185 | CREATE TABLE tb_locacao 186 | ( 187 | imovel_id serial, 188 | cliente_id integer, 189 | data_inicio_locacao date 190 | ); 191 | 192 | /** 193 | *Insere os registros na tabela "tb_locacao". 194 | */ 195 | INSERT INTO tb_locacao(imovel_id, cliente_id, data_inicio_locacao) 196 | VALUES 197 | (DEFAULT, 7154 ,'2014-03-19'), 198 | (DEFAULT, 6432 ,'2013-12-23'), 199 | (DEFAULT, 1431 ,'2013-10-25'); 200 | 201 | /** 202 | *Exibe as datas de encerramento dos contratos de locação. 203 | */ 204 | SELECT 205 | imovel_id, 206 | cliente_id, 207 | data_inicio_locacao, 208 | data_inicio_locacao + interval '2 years 5 months' AS data_fim_locacao 209 | FROM tb_locacao; 210 | 211 | /** 212 | *Exibe as datas do exemplo formatadas. 213 | */ 214 | SELECT 215 | imovel_id, 216 | cliente_id, 217 | to_char (data_inicio_locacao, 'dd/mm/yyyy'), 218 | to_char (data_inicio_locacao + interval '2 year 5 months' , 'dd/mm/yyyy') AS data_fim_locacao 219 | FROM tb_locacao; 220 | --Fim do do 4º exemplo 221 | 222 | --Inicio do 5º exemplo 223 | 224 | /** 225 | *Cria a tabela "tb_pedido". Esta tabela armazena os pedidos dos clientes. 226 | */ 227 | CREATE TABLE tb_pedido 228 | ( 229 | pedido_codigo serial, 230 | pedido_data timestamp 231 | ); 232 | 233 | /** 234 | *Insere os registros na tabela "tb_pedido". 235 | */ 236 | INSERT INTO tb_pedido(pedido_codigo, pedido_data) 237 | VALUES 238 | (DEFAULT, '2014-03-17 13:24:12'), 239 | (DEFAULT, '2014-03-17 19:30:15'), 240 | (DEFAULT, '2014-03-17 23:45:42'), 241 | (DEFAULT, '2014-03-17 23:59:30'); 242 | 243 | /** 244 | *Exibe as datas de entrega dos pedidos. 245 | */ 246 | SELECT 247 | pedido_codigo, 248 | pedido_data, 249 | pedido_data + interval '40 min'AS data_entrega 250 | FROM tb_pedido; 251 | 252 | SELECT 253 | pedido_codigo, 254 | pedido_data, 255 | pedido_data + interval '40 minutes' AS data_entrega 256 | FROM tb_pedido; 257 | 258 | /** 259 | *Exibe as datas de entrega dos pedidos formatadas. 260 | */ 261 | SELECT 262 | pedido_codigo, 263 | to_char(pedido_data, 'dd/mm/yyyy hh24:mi:ss') AS pedido_data, 264 | to_char(pedido_data + interval '40 minutes' , 'dd/mm/yyyy hh24:mi:ss') AS data_entrega 265 | FROM tb_pedido; 266 | 267 | --Fim do 5º exemplo 268 | 269 | --Inicio do 6º exemplo 270 | 271 | /*Comando para criar a tabela "tb_loc_auto"*/ 272 | CREATE TABLE tb_loc_auto 273 | ( 274 | id serial, 275 | data_inicio timestamp, 276 | periodo interval, 277 | CONSTRAINT pk_auto_id PRIMARY KEY(id) 278 | ); 279 | 280 | /* 281 | Comando para inserir múltiplos registros na tabela "tb_loc_auto". 282 | */ 283 | INSERT INTO tb_loc_auto (data_inicio, periodo) 284 | VALUES 285 | ('2020-02-13 13:24:12', '2 years'), 286 | ('2020-03-14 19:30:15', '2 months'), 287 | ('2020-03-15 23:45:42', '2 days'), 288 | ('2020-03-16 23:59:30', '2 hours'), 289 | ('2020-03-17 23:59:30', '2 minutes'), 290 | ('2020-03-18 23:59:30', '2 seconds'), 291 | ('2020-03-19 23:59:30', '1 years 6 months 2 days 2 hours 2 minutes 2 seconds'); 292 | 293 | /* 294 | Exibe as devoluções dos veículos na coluna "data_devolucao" 295 | */ 296 | SELECT 297 | id, 298 | data_inicio, 299 | periodo, 300 | data_inicio + periodo AS data_devolucao 301 | FROM tb_loc_auto; 302 | 303 | --Fim do 6º exemplo 304 | -------------------------------------------------------------------------------- /postgresql_funcao_para_renomear_multiplas_colunas_20200907_1543.sql: -------------------------------------------------------------------------------- 1 | --Descomente o comando DROP apenas se quiser excluir a tabela "esporte" 2 | --DROP TABLE IF EXISTS esporte; 3 | 4 | --Descomente o comando DROP apenas se quiser excluir a tabela "esporte" no schema "scm_teste" 5 | --DROP TABLE IF EXISTS scm_teste.esporte; 6 | 7 | --Exclui o schema "scm_teste" 8 | --DROP SCHEMA IF EXISTS scm_teste; 9 | 10 | --Cria a tabela "esporte" 11 | CREATE TABLE esporte 12 | ( 13 | id integer, 14 | modalidade_desc character varying(50), 15 | observacao text 16 | ); 17 | 18 | --Visualiza a tabela "esporte" 19 | SELECT * FROM esporte; 20 | 21 | --Cria o schema "scm_teste" 22 | CREATE SCHEMA scm_teste; 23 | 24 | --Cria a tabela "esporte" no schema "scm_teste" 25 | CREATE TABLE scm_teste.esporte 26 | ( 27 | id integer, 28 | modalidade_desc character varying(50), 29 | observacao text 30 | ); 31 | 32 | --Visualiza a tabela "esporte" do schema "scm_teste" 33 | SELECT * FROM scm_teste.esporte; 34 | 35 | --Cria a função "fnc_renomear_multiplas_colunas" 36 | CREATE OR REPLACE FUNCTION fnc_renomear_multiplas_colunas 37 | ( 38 | --Parâmetro que armazena o nome da tabela 39 | nome_da_tabela character varying, 40 | 41 | /* 42 | Parâmetro do tipo array. Este é um array multidimensional. 43 | No primeiro parâmetro deve ser passado o nome atual da coluna. 44 | No segundo parâmetro deve ser passado o novo nome da coluna. 45 | */ 46 | nome_colunas character varying[], 47 | 48 | /* 49 | Parametro que armazena o schema. 50 | Caso não seja usado nenhum parametro, 51 | será utilizado o schema padrão do postgresql "public". 52 | */ 53 | schm character varying DEFAULT 'public' 54 | ) 55 | 56 | RETURNS character varying 57 | LANGUAGE 'plpgsql' 58 | 59 | COST 100 60 | VOLATILE 61 | 62 | AS $BODY$ 63 | DECLARE 64 | /*string que armazena o comando que renomeia a(s) coluna(s). "ALTER TABLE...RENAME...TO"*/ 65 | str_renomeia_coluna text; 66 | 67 | /*armazena o retorno da execução, se as colunas foram renomeadas com sucesso ou não*/ 68 | msg character varying; 69 | 70 | /*armazena o retorno da verificação de existência da tabela*/ 71 | verifica_tabela boolean; 72 | BEGIN 73 | 74 | /*Verifica se a tabela existe*/ 75 | SELECT 76 | EXISTS 77 | ( 78 | SELECT table_name 79 | FROM information_schema.tables 80 | WHERE 81 | table_name = quote_ident(nome_da_tabela) AND table_schema = quote_ident(schm) 82 | ) INTO verifica_tabela; 83 | 84 | --Comentario para debug 85 | --RAISE NOTICE 'verifica_tabela %', verifica_tabela; 86 | 87 | /* 88 | Se a tabela não existir, 89 | interrompe a execução e retorna uma mensagem de erro. 90 | */ 91 | IF(verifica_tabela = false) THEN 92 | msg := FORMAT('Tabela %s não existe. ', nome_da_tabela); 93 | RETURN msg; 94 | END IF; 95 | 96 | /* 97 | Loop, que gera o comando que renomeia as colunas 98 | e atribui a variavel "str_renomeia_coluna" 99 | 100 | array_lower(nome_colunas, 1) => Neste exemplo, o valor é 1 => obtem o índice do primeiro elemento do array nome_colunas => array['id','cod'] 101 | array_upper(nome_colunas, 1) => Neste exemplo, o valor é 3 => obtem o índice do último elemento do array nome_colunas => array['observacao', 'obs'] 102 | */ 103 | 104 | --FOR - Faz o loop de 1 a até n elementos. Neste caso fará o loop de 1 a 3, pois o array nome_colunas possui 3 elementos 105 | FOR i IN array_lower(nome_colunas, 1) .. array_upper(nome_colunas, 1) LOOP 106 | 107 | /* 108 | A variável "str_renomeia_coluna" armazena o comando que renomeará as colunas. Exemplo: 109 | ALTER TABLE public.esporte RENAME id TO cod; 110 | ALTER TABLE public.esporte RENAME modalidade_desc TO modalidade_descricao; 111 | ALTER TABLE public.esporte RENAME observacao TO obs; 112 | */ 113 | 114 | str_renomeia_coluna := 115 | CONCAT 116 | ( 117 | str_renomeia_coluna , 118 | FORMAT 119 | ( 120 | 'ALTER TABLE %s.%s RENAME %s TO %s; ', 121 | schm, 122 | nome_da_tabela, 123 | quote_ident(nome_colunas[i][1]), 124 | quote_ident(nome_colunas[i][2]) 125 | ) 126 | ); 127 | 128 | /* 129 | O elemento nome_colunas[i][1] armazena o nome atual da coluna. 130 | O elemento nome_colunas[i][2] armazena o novo nome da coluna. 131 | */ 132 | 133 | 134 | END LOOP; 135 | 136 | --Comentario para debug 137 | --RAISE NOTICE '%', str_renomeia_coluna; 138 | 139 | BEGIN 140 | 141 | --Executa o comando que renomeia as coluna(s). 142 | EXECUTE str_renomeia_coluna; 143 | 144 | /* 145 | Caso haja algum erro na execução do comando 146 | que renomeia a(s) coluna(s) retorna uma 147 | mensagem com erro. 148 | */ 149 | EXCEPTION 150 | WHEN OTHERS THEN 151 | msg := FORMAT('Não foi possível renomear as colunas.Erro: %s. Código do erro: %s. ', SQLERRM, SQLSTATE); 152 | RETURN msg; 153 | END; 154 | 155 | /* 156 | Caso não haja nenhum erro retorna uma mensagem 157 | que o comando foi executado com sucesso 158 | */ 159 | msg := FORMAT('COLUNA(S) ALTERADA COM SUCESSO'); 160 | RETURN msg; 161 | END 162 | $BODY$; 163 | 164 | /* 165 | Segue abaixo 6 exemplos para executar esta função: 166 | */ 167 | 168 | 169 | /* 170 | 1º Exemplo 171 | Executa a função: fnc_renomear_multiplas_colunas 172 | Observação: 3º parâmetro não é obrigatório (neste caso 'public') 173 | */ 174 | SELECT fnc_renomear_multiplas_colunas 175 | ( 176 | 'esporte', 177 | array 178 | [ 179 | array['id','cod'], 180 | array['modalidade_desc', 'modalidade_descricao'], 181 | array['observacao', 'obs'] 182 | ] 183 | ::varchar[][], 184 | 'public' 185 | ); 186 | 187 | --Visualiza a tabela "esporte" 188 | SELECT * FROM esporte; 189 | 190 | /* 191 | 2º Exemplo 192 | Executa a função: fnc_renomear_multiplas_colunas 193 | Observação: 3º parâmetro não foi declarado pois não é obrigatório. 194 | Quando não declarado o schema será considerado public. 195 | 196 | Descomente para executar 197 | */ 198 | 199 | /* 200 | SELECT fnc_renomear_multiplas_colunas 201 | ( 202 | 'esporte', 203 | array 204 | [ 205 | array['id','cod'], 206 | array['modalidade_desc', 'modalidade_descricao'], 207 | array['observacao', 'obs'] 208 | ] 209 | ::varchar[][] 210 | ); 211 | 212 | 213 | --Visualiza a tabela "esporte" 214 | SELECT * FROM esporte; 215 | */ 216 | 217 | 218 | /* 219 | 3º Exemplo 220 | Executa a função: fnc_renomear_multiplas_colunas 221 | Observação: neste caso serão renomeadas colunas 222 | do schema 'scm_teste'. 223 | */ 224 | SELECT fnc_renomear_multiplas_colunas 225 | ( 226 | 'esporte', 227 | array 228 | [ 229 | array['id','cod'], 230 | array['modalidade_desc', 'modalidade_descricao'], 231 | array['observacao', 'obs'] 232 | ] 233 | ::varchar[][], 234 | 'scm_teste' 235 | ); 236 | 237 | --Visualiza a tabela "esporte" do schema "scm_teste" 238 | SELECT * FROM scm_teste.esporte; 239 | 240 | 241 | /* 242 | 4º Exemplo 243 | Executa a função: fnc_renomear_multiplas_colunas 244 | Será retornado um erro pois a tabela 'esportey' não existe. 245 | 246 | Descomente para executar 247 | */ 248 | 249 | /* 250 | SELECT fnc_renomear_multiplas_colunas 251 | ( 252 | 'esportey', 253 | array 254 | [ 255 | array['id','cod'], 256 | array['modalidade_desc', 'modalidade_descricao'], 257 | array['observacao', 'obs'] 258 | ] 259 | ::varchar[][] 260 | ); 261 | */ 262 | 263 | /* 264 | 5º Exemplo 265 | Executa a função: fnc_renomear_multiplas_colunas 266 | Será retornado um erro pois a coluna 'modalidade_descx' não existe. 267 | 268 | Descomente para executar 269 | */ 270 | 271 | /* 272 | SELECT fnc_renomear_multiplas_colunas 273 | ( 274 | 'esporte', 275 | array 276 | [ 277 | array['id','cod'], 278 | array['modalidade_descx', 'modalidade_descricao'], 279 | array['observacao', 'obs'] 280 | ] 281 | ::varchar[][] 282 | ); 283 | */ 284 | 285 | /* 286 | 6º Exemplo 287 | Executa a função: fnc_renomear_multiplas_colunas 288 | Observação: o array é declarado utilizando chaves. 289 | 290 | Descomente para executar 291 | */ 292 | /* 293 | SELECT fnc_renomear_multiplas_colunas 294 | ( 295 | 'esporte', 296 | '{ 297 | {id,cod}, 298 | {modalidade_desc, modalidade_descricao}, 299 | {observacao, obs} 300 | }' 301 | ::varchar[][] 302 | ); 303 | */ 304 | --------------------------------------------------------------------------------