+ All Categories
Home > Documents > PostgreSQL Prático

PostgreSQL Prático

Date post: 09-Mar-2016
Category:
Upload: alexandre-junior
View: 394 times
Download: 2 times
Share this document with a friend
Description:
Guia com todos os comandos do postgresql.

of 123

Transcript
  • PostgreSQL Prtico

  • Contedo

    1 PostgreSQL Prtico/Introduo 11.1 1 - Introduo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1

    2 PostgreSQL Prtico/Instalao 42.1 2 - Instalao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4

    3 PostgreSQL Prtico/Instalao/No Linux 53.1 Pr-requisitos para instalao do PostgreSQL num UNIX . . . . . . . . . . . . . . . . . . . . . . 53.2 Instalao no Linux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5

    4 PostgreSQL Prtico/Instalao/No Windows 84.1 2 Instalao no Windows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8

    5 PostgreSQL Prtico/DDL 95.1 3 - DDL (Data Denition Language) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9

    6 PostgreSQL Prtico/DDL/Criao e Excluso de Bancos, Esquemas, Tabelas, Views, Constraints, etc 10

    7 PostgreSQL Prtico/DDL/Alteraes nos objetos dos bancos 16

    8 PostgreSQL Prtico/DDL/ndices, Tipos de Dados e Integridade Referencial 18

    9 PostgreSQL Prtico/DML 229.1 4 - DML (Data Manipulation Language) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22

    10 PostgreSQL Prtico/DML/Consultas 2310.1 DML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2310.2 Consultas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2310.3 Trabalhando corretamente com select . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26

    11 PostgreSQL Prtico/DML/Consultas Join 2711.1 4.2 - Junes de Tabelas ou Consultas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2711.2 INNER JOIN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2811.3 Operao JOIN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2911.4 LEFT OUTER JOIN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2911.5 RIGHT OUTER JOIN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29

    i

  • ii CONTEDO

    12 PostgreSQL Prtico/DML/Sub Consultas 3112.1 4.3 Sub consultas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31

    13 PostgreSQL Prtico/Funes Internas 3313.1 5 - Funes Internas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33

    14 PostgreSQL Prtico/Funes Internas/Strings 3414.1 5.1 Funes de Strings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34

    15 PostgreSQL Prtico/Funes Internas/Matemticas 3615.1 5.2 Funes Matemticas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3615.2 NULL ou no NULL, eis a questo! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37

    16 PostgreSQL Prtico/Funes Internas/Agrupamento 3816.1 5.3 Funes de Agrupamento (Agregao) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38

    17 PostgreSQL Prtico/Funes Internas/Data e Hora 3917.1 5.4 Funes de Data/Hora . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39

    18 PostgreSQL Prtico/Funes Internas/Formatao de Tipos de Dados 4118.1 5.5 - Formatao de Tipos de Dados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41

    19 PostgreSQL Prtico/Funes Internas/Converso de Tipos 4219.1 5.6 - Converso Explcita de Tipos (CAST) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42

    20 PostgreSQL Prtico/Funes Denidas pelo Usurio e Triggers 4420.1 6 - Funes Denidas pelo Usurio e Triggers . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44

    21 PostgreSQL Prtico/Funes Denidas pelo Usurio e Triggers/SQL 4521.1 6 - Funes no PostgreSQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45

    22 PostgreSQL Prtico/Funes Denidas pelo Usurio e Triggers/PlpgSQL 4722.1 6.2 - Funes em Pl/pgSQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47

    23 PostgreSQL Prtico/Funes Denidas pelo Usurio e Triggers/Triggers 4923.1 6.3 - Triggers (Gatilhos) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49

    24 PostgreSQL Prtico/DCL 5124.1 7 - DCL (Data Control Language) - Administrao . . . . . . . . . . . . . . . . . . . . . . . . . 51

    25 PostgreSQL Prtico/DCL/Administrao de usurios, grupos e privilgios 5225.1 7.1 - Usurios, grupos e privilgios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52

    26 PostgreSQL Prtico/Transaes 5426.1 8 Transaes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54

    27 PostgreSQL Prtico/Administrao 56

  • CONTEDO iii

    27.1 9 - Administrao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56

    28 PostgreSQL Prtico/Administrao/Backup e Restore 5728.1 9.1 - Backup e Restore . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57

    29 PostgreSQL Prtico/Administrao/Importar e Exportar 6029.1 9.2 - Importar e Exportar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60

    30 PostgreSQL Prtico/Administrao/Converter 6130.1 9.3 - Converter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61

    31 PostgreSQL Prtico/Administrao/Otimizao e Desempenho 6231.1 Otimizao e Desempenho . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6231.2 How to optimize PostgreSQL database size . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6231.3 Uma tima fonte de consulta . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6231.4 VACUUM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6231.5 ANALYZE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6231.6 Recomendao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6231.7 Dicas de Desempenho . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6331.8 Separando bancos e Logs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6331.9 Plano de Consulta . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6331.10Reincio do ID de Transaes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6431.11Alerta . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64

    32 PostgreSQL Prtico/Replicao 6532.1 10 - Replicao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6532.2 Cluster != Replicao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66

    33 PostgreSQL Prtico/Conguraes 6733.1 11 - Conguraes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67

    34 PostgreSQL Prtico/Conguraes/Congurar acessos 6834.1 11.1 - pg_hba.conf . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68

    35 PostgreSQL Prtico/Conguraes/Conguraes Diversas 7135.1 11.2 - postgresql.conf . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71

    36 PostgreSQL Prtico/Metadados 7336.1 12 - Metadados (Catlogo) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73

    37 PostgreSQL Prtico/Conectividade 7937.1 13 - Conectividade . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79

    38 PostgreSQL Prtico/Ferramentas 8138.1 14 - Ferramentas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81

  • iv CONTEDO

    39 PostgreSQL Prtico/Ferramentas/psql 8239.1 14.1 - psql . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82

    40 PostgreSQL Prtico/Ferramentas/phpPgAdmin 8440.1 14.2 - phpPgAdmin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84

    41 PostgreSQL Prtico/Ferramentas/PgAdmin 8541.1 14.3 PgAdmin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85

    42 PostgreSQL Prtico/Ferramentas/EMS PostgreSQL 8642.1 14.4 - EMS PostgreSQL Manager . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86

    43 PostgreSQL Prtico/Ferramentas/Azzurry Clay 8843.1 14.5 - Azzurry Clay (modelagem) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88

    44 PostgreSQL Prtico/Ferramentas/dbVisualizer 8944.1 14.6 DbVisualizer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89

    45 PostgreSQL Prtico/Ferramentas/OpenOce Base 9045.1 14.7 Openoce2 Base . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90

    46 PostgreSQL Prtico/Apndices 9146.1 15 - Apndices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91

    47 PostgreSQL Prtico/Apndices/Planejamento e Projeto de Bancos de Dados 9247.1 15.1 Planejamento e Projeto de Bancos de Dados . . . . . . . . . . . . . . . . . . . . . . . . . 92

    48 PostgreSQL Prtico/Apndices/Implementao de Banco de Dados com o PostgreSQL 9548.1 15.2 Implementao de Banco de Dados com o PostgreSQL - Modelo Fsico . . . . . . . . . . . 95

    49 PostgreSQL Prtico/Apndices/Integridade Referencial - PostgreSQL 9849.1 15.3 - Integridade Referencial - Postgresql . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98

    50 PostgreSQL Prtico/Apndices/Dicas Prticas de uso do SQL 10050.1 15.4 - Dicas Prticas de uso do SQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100

    51 PostgreSQL Prtico/Apndices/Dicas sobre Desempenho e Otimizaes do PostgreSQL 10551.1 15.5 Dicas sobre Desempenho e Otimizaes do PostgreSQL . . . . . . . . . . . . . . . . . . . 105

    52 PostgreSQL Prtico/Exerccios 10952.1 16 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109

    53 PostgreSQL Prtico/Referncias 11253.1 17 - Referncias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11253.2 Fontes, contribuidores e licenas de texto e imagem . . . . . . . . . . . . . . . . . . . . . . . . . 115

    53.2.1 Texto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11553.2.2 Imagens . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117

  • CONTEDO v

    53.2.3 Licena . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117

  • Captulo 1

    PostgreSQL Prtico/Introduo

    1.1 1 - Introduo

    Histria dos SGDBsAnos 60 - utilizados sistemas gerenciadores de arquivos(ISAM e VSAM), usados at hoje.Anos 70 - Gerenciadores de Bancos de dados de rede.Desapareceram nos anos 90.Anos 80 - SGBDRs (Oracle, DB2, SQLServer)Anos 90 - SGBDOR (Oracle, DB2, PostgreSQL e Infor-mix)Anos 90 - SGBDOO (Cach)SGBD = Composto por programas de gerenciamento, ar-mazenamento e acesso aos dados, com a nalidade detornar gil e eciente a manipulao dos dados.Dicionrio de dados - metadados, dados sobre os dados,ou seja, informaes sobre a estrutura dos bancos de da-dos (nomes de tabelas, de campos, tipos de dados, etc).DBA - Database Administrator, com as funes de: - De-nir e modicar esquemas, estruturas de armazenamentoe mtodos de acesso - Liberar privilgios de acesso - Es-pecicao de restrio de integridadeSimplicando temos (no PostgreSQL), em termos deestrutura:- O SGBD formado por bancos de dados, tablespaces,usurios e alguns programas auxiliares;- Um banco de dados formado pelos esquemas e lingua-gens;- Um esquema formado por funes de agrupamento,funes do usurio, triggers, procedures, sequncias, ta-belas e views; - Tabelas so formadas por campos, cons-traints, ndices e triggers.- Em termos de dados uma tabela formada por registrose campos.Segundo a Wikipedia (http://pt.wikipedia.org): ... Aapresentao dos dados pode ser semelhante de umaplanilha eletrnica, porm os sistemas de gesto de bancode dados possuem caractersticas especiais para o arma-zenamento, classicao e recuperao dos dados.

    Os bancos de dados so utilizados em muitas aplicaes,abrangendo praticamente todo o campo dos programasde computador. Os bancos de dados so o mtodo dearmazenamento preferencial para aplicaes multiusu-rio, nas quais necessrio haver coordenao entre v-rios usurios. Entretanto, so convenientes tambm paraindivduos, e muitos programas de correio eletrnico eorganizadores pessoais baseiam-se em tecnologias padro-nizadas de bancos de dados.Em Maro, 2004, AMR Research (como citado em umartigo da CNET News.com listado na seco de Refe-rncias) previu que aplicaes de banco de dados de c-digo aberto seriam amplamente aceitas em 2006.Esquemas so subdivises de bancos de dados, cujafuno permitir um melhor nvel de organizao.Projetos de mesma categoria, que precisem acessar unsaos outros devem car em um mesmo banco, podendo -car em esquemas separados. Tabelas so subdivisesde um esquema, nelas realmente cam armazenados osdados de um banco. Uma tabela parece realmente comuma tabela em papel, tipo planilha, com linhas e colu-nas. Cada linha representa um registro de banco de da-dos e cada cruzamento de coluna com linha representaum campo de tabela.Tipo de Dados de um campo restringe o conjunto de valo-res (domnio) que pode ser atribudo ao campo e atribuisemntica aos dados armazenados. Um campo do tiponumrico no aceita dados do tipo texto ou similar.Citao da Introduo do documento sobre otimizao doPostgreSQLPOSTGRESQL um SGBD objeto-relational (SGB-DOR) desenvolvido via Internet por um grupo de desen-volvedores espalhados pelo globo. uma alternativa decdigo fonte-aberta para SGBDs comerciais comoOraclee Informix.O POSTGRESQL foi desenvolvido originalmente naUniversidade de Califrnia em Berkeley. Em 1996, umgrupo comeou o desenvolvimento do SGBD na Inter-net. Eles usam e-mail para compartilhar idias e ser-vidores de arquivos para compartilhar cdigo. POST-GRESQL agora comparvel SGBDs comerciais emtermos de caractersticas, desempenho e conana. Hoje

    1

  • 2 CAPTULO 1. POSTGRESQL PRTICO/INTRODUO

    tem transaes, views, procedimentos armazenados, econstranints de integridade referencial. Apia um n-mero grande de interfaces de programao, comoODBC,Java (JDBC), TCL/TK, PHP, Perl e Python, entre ou-tros. POSTGRESQL continua avanando a um tremendopasso, graas a um grupo talentoso de desenvolvedoresvia Internet. (Bruce Momjian - 16th January 2003)Projeto POSTGRES (1986-1994): Partiu do projeto doSGBD Ingres de Berkeley. Projetista: Michael Stonebra-ker.Em 1995 dois estudantes de Berkeley (Jolly Chen e An-drew Yu) adicionam suporte a SQL. Seu novo nome:Postgres95. Foi totalmente reescrito em C e tam-bm adotou a SQL. Foi originalmente patrocinado peloDARPA, ARO, NSF e ESL Inc.Em 1996: Disponibilizado na Internet sob o nome dePostgreSQL.O PostgreSQL aniversariou no dia 08/07/2006, quandocompletou 10 anos (08/07/1996). Seu dcimo anivers-rio foi comemorado nos dias 08 e 09 de julho prximo,em Toronto, Canad, com algumas conferncias sobre omesmo. Atualmente est na verso 8.1.4 (14/09/2006).Para saber mais sobre a histria do PostgreSQL vi-site o site ocial em: http://www.postgresql.org/docs/current/interactive/history.htmlOu em portugus em: http://pgdocptbr.sourceforge.net/pg80/history.htmlCaractersticas: O PostgreSQL suporta grande parte do SQL ANSI, in-clusive do SQL 2003, alm de oferecer outros recursosimportantes, como: Comandos complexos Chaves estrangeiras (Foreign Key) Gatilhos (Triggers) Vises (views) Integridade de Transaes Controle de Simultaneidade Multiverso (MVCC) Suporta mltiplas transaes online concorrentes entreusurios. Suporte a Rules (sistema de regras que reescreve dire-tivas SQL) Criao de tabelas temporrias (CREATE TEMP TA-BLE nome(listadecampos tipos);)Traz tambm opes de extenso pelo usurio para: Tipos de dados Funes Operadores Funes de Agregao (Agrupamento)

    Mtodos de ndice Linguagens Procedurais (Stored Procedures)LicenaSua licena BSD, portanto pode ser utilizado, modi-cado e distribudo por qualquer pessoa ou empresa paraqualquer nalidade, sem encargo, em quaisquer dos sis-temas operacionais suportados.Algumas Empresas que Utilizam PostgreSQLBASF (PDF format)FujitsuAppleRedHatSunPervasiveMohawk SoftwareProximityRadio ParadiseShannon Medical CenterSpiros Louis StadiumThe Dravis Group OSS ReportVanten Inc.SRARamblerNetezzaVA SoftwareTravel PostNational Weather ServiceAplicaes Corporativas de Alto Volume: Uma Solu-o com o PostgreSQLA utilizao da dupla PostgreSQL+Linux nas empresascresce rapidamente e um exemplo de como produtosOpen Source podem ajudar empresas a racionalizar oscustos de TI. Uma das caractersticas do PostgreSQL asua capacidade de lidar com um grande volume de dados.Existem aplicaes em produo com tabelas possuindomais de 100 milhes de linhas. No Brasil, existem casosde sucesso de empresas lidando com bases com dezenasde milhes de registros gerenciadas pelo PostgreSQL.Uma das maiores implantaes de PostgreSQL no Brasil na Atrium Telecom, empresa de telefonia corporativade So Paulo. O PostgreSQL utilizado como banco dedados do sistema de billing e tem uma base de dados demais de 100GB e efetua 1 milho de transaes dirias.As maiores tabelas do sistema contam com mais de 70milhes de linhas.A utilizao do banco de dados PostgreSQL cadavez mais ampla nas empresas que buscam um ser-

  • 1.1. 1 - INTRODUO 3

    vidor de banco de dados altamente sosticado, comalta performance, estvel e capacitado para lidar comgrandes volumes de dados. O fato de ser um pro-duto Open Source, sem custos de licena para nenhumuso, torna o PostgreSQL uma alternativa extremamenteatraente para empresas que buscam um custo total depropriedade (TCO) menor para os ativos de TI. Cita-o de: http://www.dib.com.br/dib%20cd/LC2003/P%C3%A1ginas/LC2003_Conf.htmlMetr de So Paulo e DATAPREV tambm utilizam oPostgreSQL.

  • Captulo 2

    PostgreSQL Prtico/Instalao

    2.1 2 - Instalao1. No Linux2. No Windows

    4

  • Captulo 3

    PostgreSQL Prtico/Instalao/No Linux

    O PostgreSQL roda em uma conta de usurio, chamadade postgres. Esta conta no a mesma dos utilizadoresdas bases de dados: os usurios da base de dados devemser criados pelo prprio PostgreSQL.

    3.1 Pr-requisitos para instalaodo PostgreSQL num UNIX

    make do GNU (gmake ou make)compilador C, preferido GCC mais recentegzipbiblioteca readline (para psql)gettext (para NLS)kerberos, openssl e pam (opcional, para autenticao)

    3.2 Instalao no LinuxVrias distribuies j contam com binrios para ins-talao do PostgreSQL (Ubuntu, Debian, Slackware,RedHat, Fedora, etc).Em uma instalao padro do Ubuntu veja o que precisapara instalar os fontes:Antes de instalar:sudo apt-get install build-essential libreadline5-devzlib1g-dev gettextE use make ao invs de gmake.Faa o download de http://www.postgresql.org/ftp/source/e descompacte (gosto de descompactar em /usr/local/srce instalar no diretrio default, que /usr/local/pgsql).Instalar pelos binrios da distribuio tem as vantagensde j instalar e congurar praticamente tudo automati-camente, mas instalar dos fontes d um maior controlesobre as conguraes (voc sabe que tudo car no/usr/local/pgsql) e temos a possibilidade de instalar sem-pre a ltima verso. Reita sobre a melhor opo para

    voc.Idealmente mude para o superusurio logo aqui../congure make make install groupadd postgresuseradd -g postgres -d /usr/local/pgsql postgres mk-dir /usr/local/pgsql/data chown postgres:postgres/usr/local/pgsql/data passwd postgres su - postgres/usr/local/pgsql/bin/initdb -D /usr/local/pgsql/data/usr/local/pgsql/bin/postmaster -D /usr/local/pgsql/data>logle 2>&1 & /usr/local/pgsql/bin/pg_ctl -D/usr/local/pgsql/data start /usr/local/pgsql/bin/createdbtest /usr/local/pgsql/bin/psql testCopiar o script de inicializao linux para o /etc/init.d(Nos Debians):De /usr/local/src/postgresql-8.1.4/contrib/start-script/linux para /etc/init.d/postgresqlDar permisso de execuo: chmod u+x/etc/init.d/postgresqlSe no Ubuntu ou outro Debian:sudo gedit /etc/prole (e adicione a linha):PATH=/usr/local/pgsql/bin:$PATHDepois execute:source /etc/proleAgora o postgres est no path.Ps Instalao (sh, bash, ksh e zsh):LD_LIBRARY_PATH=/usr/local/pgsql/lib exportLD_LIBRARY_PATHOu no ~/.bash_prole do usurio postgres

    initdb inicializa o cluster, cria os scripts de con-gurao default.

    postmaster inicia o processo do servidor respon-svel por escutar por pedidos de conexo.

    Para suporte aos locales do Brasil usar:/usr/local/pgsql/bin/initdb --locale=pt_BR -D/usr/local/pgsql/dataA instalao via fontes (sources) em algumas distribui-es muito enxutas, voltadas para para desktop, pode no

    5

  • 6 CAPTULO 3. POSTGRESQL PRTICO/INSTALAO/NO LINUX

    funcionar da primeira vez, pois faltaro algumas biblio-tecas, compiladores, etc.Aps a instalao est criado o agrupamento principal(cluster main) de bancos de dados do PostgreSQL.Caso no se tenha conana nos usurios locais reco-mendvel utilizar a opo -W, --pwprompt ou pwle doinitdb, que atribuir uma senha ao superusurio.No arquivo pg_hba.conf utilizar autenticao tipo md5,password ou cript, antes de iniciar o servidor pela pri-meira vez.Quando o programa que inicia o servidor (postmaster)est em execuo, criado um PID e armazenado dentrodo arquivo postmaster.pid, dentro do subdiretrio data.Ele impede quemais de um processo postmaster seja exe-cutado usando o mesmo cluster e diretrio de dados.Baixar PostgreSQL via Anonymous CVS:Baixar CVS de - http://www.nongnu.org/cvs/Instalar e Logar com qualquer senha:cvs -d :pserver:[email protected]:/projects/cvsroot login Baixar fontes:cvs -z3 -d :pserver:[email protected]:/projects/cvsroot co -P pgsql Isto ir instalar o Post-greSQL num subdiretrio pgsql do diretrio atual.Atualizar a ltima instalao via CVS:Acesse o diretrio pgsql e execute - cvs -z3 update -d -PIsto ir baixar somente as alteraes ocorridas aps a l-tima instalao.Tambm podemos criar um arquivo .cvsrc no home dousurio com as duas linhas:cvs -z3update -d -PAtualizao do PostgreSQL entre VersesCaso voc tenha uma verso que no seja 8.1.x e estejaquerendo instalar a 8.1.4, ento precisa fazer um backupdos seus dados e restaurar logo aps a instalao comosugerido em seguida. Ser assumido que sua instalaofoi em:/usr/local/pgsql e seus dados no sub diretrio data. Casocontrrio faa os devidos ajustes.1 Ateno para que seus bancos no estejam recebendoatualizao durante o backup. Se preciso proba acessono pg_hba.conf.2 Efetuando backup:pg_dumpall > bancos.sql .Para preservar os OIDs use aopo -o no pg_dumpall.3 Pare o servidorpg_ctl stop ou outro comandoCaso queira instalar a nova verso no mesmo diretrio da

    anteriormv /usr/local/pgsql /usr/local/pgsql.oldEnto instale a nova verso, crie o diretrio de dados eeinicie o novo servidor./usr/local/pgsql/bin/initdb -D /usr/local/pgsql/data/usr/local/pgsql/bin/postmaster -D /usr/local/pgsql/dataFinalmente, restore seus dados usando o novo servidorcom:/usr/local/pgsql/bin/psql -d postgres -f bancos.sqlPara mais detalhes sobre os procedimentos de instalao,veja itens 14.5 e 14.6 do manual.Plataformas SuportadasAtualmente o PostgreSQL suporta muitas plataformas,entre elas o Windows, Linux, FreeBSD, NetBSD,OpenBSD, Mac OS e diversos outros. Plataformas su-portadas e as no suportadas na seo 14.7 do manualocial.No PostgreSQL o processo postmaster escuta por cone-xes dos clientes.Existem mais dois processos tambm iniciados, amboscom nome postgres. Eles cuidam da gravao dos logs outabelas e da manuteno das estatsticas.Para cada conexo com uma aplicao cliente criadoum novo processo com o mesmo nome do usurio da co-nexo. Por isso importante que cada aplicativo tenhaseu usurio e se tenha um maior controle.Os arquivos de congurao (postgresql.conf,pg_hba.conf e pg_ident.conf) a partir da verso 8podem car em diretrio diferente do PGDATA.Sugesto de PadroNomes de bancos no pluralNomes de tabelas no singularExemplo:banco clientestabela - clienteCriar Novo ClusterCaso sinta necessidade pode criar outros clusters, espe-cialmente indicado para grupos de tabelas com muitoacesso.O comando para criar um novo cluster na verso atual(8.1.3) do PostgreSQL :

    banco=# \h create tablespace

    Comando: CREATE TABLESPACE

    Descrio: dene uma nova tablespace

    Sintaxe:

  • 3.2. INSTALAO NO LINUX 7

    CREATE TABLESPACE nome_tablespace [ OWNERusurio ] LOCATION 'diretrio'

    Exemplo:

    CREATE TABLESPACE ncluster OWNER usurioLOCATION '/usr/local/pgsql/nc'; CREATE TABLES-PACE ncluster [OWNER postgres] LOCATION'c:\\ncluster';O diretrio deve estar vazio e pertencer ao usurio.Criando um banco no novo cluster:CREATE DATABASE bdcluster TABLESPACE =ncluster;Obs: Podem existir numa mesma mquina vrios agrupa-mentos de bancos de dados (cluster) gerenciados por ummesmo ou por diferentes postmasters.Se usando tablespace o gerenciamento ser de ummesmopostmaster, se inicializados por outro initdb ser por ou-tro.Setar o Tablespace default:SET default_tablespace = tablespace1;Listar os Tablespaces existentes:\db SELECT spcname FROM pg_tablespace;Detalhes extras no item 14.5 do manual ocial.Somente Caso de ter que repetir os procedimentos use:make distcleane repita a sequncia acima.

  • Captulo 4

    PostgreSQL Prtico/Instalao/NoWindows

    4.1 2 Instalao no Windows

    Instalao no Windows XPLembrar que: Precisa instalar em sistema de arquivosNTFS e no instala no XP Start Edition (onde falta su-porte a redes).- Fazer download do site ocial (www.postgresql.org)(hoje postgresql-8.2.zip)- Executar o arquivo postgresql-8.1.msi- Selecionar idioma e Start. Depois em Prximo.- Na tela Informaes de Instalao existem muitas in-formaes importantes:- Sugere a leitura da FAQ- Fala das licenas dos diversos softwares a serem insta-lados- As verses 95, 98 e Me doWindows no so suportadaspelo PostgreSQL- Usar obrigatoriamente em sistema de arquivos NTFS- Instalar como servio (mesmo que deixe como manual)- O PostgreSQL no executa com usurio que tenha pri-vilgios de administrador- Os drivers jdbc esto no subdiretrio \jdbc, que deveser adicionada ao CLASSPATH- Na Tela Opes de Instalao marque:- Suporte para idioma nativo (importante para ter as men-sagens em pt_BR)- E outros que considere importantes e clique emPrximo- Na tela Congurao do Servio":- Poder optar por instalar como servio ou no. Comoservio mais prtico. Clique em Prximo (ele criaruma senha)- Obs.: Caso j tenha instalado o PostgreSQL antes nestamquina dever remover o usurio postgres antes decontinuar:

    - Painel de controle - Ferramentas administrativas - Ge-renciamento do computador - Usurios e grupos locais -Usurios. Remova o postgres- Agora clique em Prximo e Sim- Na tela Inicializar o agrupamento de bancos de dados":- Caso precise acessar sua mquina de outra remota mar-que Endereos- Em Locale selecione Portugus Brasil- Em Codicao selecione LATIN1- Entre com uma senha e repita. Altere o usurio se for ocaso e Prximo.- Na tela Habilitar Linguagens Procedurais deixe mar-cada PL/pgsql (caso pretenda utilizar) e Prximo- Na tela Habilitar Mdulos Contrib marque os deseja-dos e Prximo- Na tela Habilitar PostGIS em templae1 marque so-mente se precisar que todos os bancos tragam o PostGISe Prximo e Prximo novamente.- Aps instalar, na tela Instalao concludarecomenda-se que voc se cadastrar na lista pgsql-announce, que envia informaes semanais sobre novasverses e correes de erros. Basta clicar no boto, fazero cadastro e Concluir.

    8

  • Captulo 5

    PostgreSQL Prtico/DDL

    5.1 3 - DDL (Data Denition Lan-guage)

    1. Criao e Excluso de Bancos, Esquemas, Tabelas,Views, Constraints, etc

    2. Alteraes nos objetos dos bancos

    3. ndices, Tipos de Dados e Integridade Referencial

    9

  • Captulo 6

    PostgreSQL Prtico/DDL/Criao eExcluso de Bancos, Esquemas, Tabelas,Views, Constraints, etc

    DDL o conjunto de comandos SQL responsveis peladenio dos dados, ou seja, pela criao de bancos, es-quemas, tabelas, campos, tipos de dados, constraints, etc.3.1 - Criao e excluso de bancos, esquemas, tabelas,views, etcObs.: Nomes de objetos e campos no podem usar hfen(-). Alternativamente usar sublinhado (_).campo-1 Invlidocampo_1 VlidoNomes de IdenticadoresUtiliza-se por conveno as palavras chaves do SQL emmaisculas e os identicadores dos objetos que criamosem minsculas.Identicadores digitados em maisculas sero gravadosem minsculas, a no ser que venham entre aspas .Revises da Linguagem SQLSQL 1989SQL 1992SQL 1999SQL 2003Divises da SQLDML Linguagem de Manipulao de DadosDDL Linguagem de Denio de DadosDCL Linguagem de Controle de Dados (autorizaode dados e licena de usurios para controlar quem temacesso aos dados).DQL Linguagem de Consulta de Dados (Tem apenasum comando: SELECT).Criar Bancobanco=# \h create databaseComando: CREATE DATABASE

    Descrio: cria um novo banco de dadosSintaxe:CREATE DATABASE nome[ [ WITH ] [ OWNER [=] dono_bd ] [ TEMPLATE [=]modelo ] [ ENCODING [=] codicao ] [ TABLES-PACE [=] tablespace ] ] [ CONNECTION LIMIT [=]limite_con ] ]CREATE DATABASE nomebanco;Excluindo Um BancoDROP DATABASE nomebanco;Listar os bancos existentes:\l - - No psqlpsql -l (no prompt)SELECT datname FROM pg_database;Quando se cria um novo banco de dados sem indicar omodelo, o que de fato estamos fazendo clonar o bancode dados template1.Criar um banco para outro usurio:CREATE DATABASE nomebanco OWNER nomeuser;createdb -O nomeusuario nomebancoObs.: requer ser superusurio para poder criar banco paraoutro usurio.Criar Tabelapostgres=# \h create tableComando: CREATE TABLEDescrio: dene uma nova tabelaSintaxe:CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY |TEMP } ] TABLE nome_tabela ( [{ nome_coluna tipo_dado [ DEFAULT expres-so_padro ] [ restrio_coluna [ ... ] ] | restrio_tabela

    10

  • 11

    | LIKE tabela_pai [ { INCLUDING | EXCLUDING }DEFAULTS ] } [, ... ]] )[ INHERITS ( tabela_pai [, ... ] ) ][ WITH OIDS | WITHOUT OIDS ][ ON COMMIT { PRESERVE ROWS | DELETEROWS | DROP } ][ TABLESPACE tablespace ]onde restrio_coluna :[ CONSTRAINT nome_restrio ]{ NOT NULL |NULL | UNIQUE [ USING INDEX TABLESPACE ta-blespace ] | PRIMARY KEY [ USING INDEX TA-BLESPACE tablespace ] | CHECK (expresso) | REFE-RENCES tabela_ref [ ( coluna_ref ) ] [ MATCH FULL| MATCH PARTIAL | MATCH SIMPLE ] [ ON DE-LETE ao ] [ ON UPDATE ao ] }[DEFERRABLE |NOTDEFERRABLE ] [ INITIALLYDEFERRED | INITIALLY IMMEDIATE ]e restrio_tabela :[ CONSTRAINT nome_restrio ]{ UNIQUE ( nome_coluna [, ... ] ) [ USING INDEXTABLESPACE tablespace ] |PRIMARY KEY ( nome_coluna [, ... ] ) [ USING IN-DEX TABLESPACE tablespace ] | CHECK ( expresso) | FOREIGN KEY ( nome_coluna [, ... ] ) REFEREN-CES tabela_ref [ ( coluna_ref [, ... ] ) ] [ MATCHFULL | MATCH PARTIAL | MATCH SIMPLE ] [ ONDELETE ao ] [ ON UPDATE ao ] }[DEFERRABLE |NOTDEFERRABLE ] [ INITIALLYDEFERRED | INITIALLY IMMEDIATE ]Obs.: Ateno: nesta verso (8.1.3) WITH OID opcio-nal. As tabelas so criadas sem OID.\d visualizar tabelas e outros objetos\d nometabela visualizar estrutura da tabelaCREATE TABLE tabela (campo1 integer,campo2 text);Excluindo TabelaDROP TABLE primeira_tabela;Valor Default (padro) Para CamposAo denir um valor default para um campo, ao ser ca-dastrado o registro e este campo no for informado, ovalor default assumido. Caso no seja declarado expli-citamente um valor default, o valor nulo (NULL) ser ovalor default.

    CREATE TABLE produtos (produto_no integer, descricao text, preco numeric DE-FAULT 9.99);Constraints (Restries)CHECKAo criar uma tabela podemos prever que o banco exijaque o valor de um campo satisfaa uma expressoCREATE TABLE produtos (produto_no integer, descricao text, preco numericCHECK (preco > 0));Dando nome restrio check. Isso ajuda a tornar maisamigveis as mensagens de erro e a poder referenciar deuma consulta.CREATE TABLE produtos (produto_no integer, descricao text, preco numericCONSTRAINT preco_positivo CHECK (preco > 0));CREATE TABLE produtos (produto_no integer, descricao text, desconto numericCHECK (desconto > 0 AND desconto < 0.10), preco nu-meric CONSTRAINT preco_positivo CHECK (preco >0), check (preco > desconto));Constraint NOT NULLObrigar o preenchimento de um campo. Ideal para cam-pos importantes que no devem car sem preenchimento.Mas devemos ter emmente que at um espao em brancoatende a esta restrio.CREATE TABLE produtos (cod_prod integer NOT NULL CHECK (cod_prod > 0),nome text NOT NULL, preco numeric NOT NULL);Obs importante: nulos no so checados. UNIQUE noaceita valores repetidos, mas aceita vrios nulos (j queestes no so checados). Cuidado com NULLs.Unique ConstraintObrigar valores exclusivos para cada campo em todos osregistrosCREATE TABLE produtos (cod_prod integer UNIQUE, nome text, preco numeric);CREATE TABLE produtos (cod_prod integer, nome text, preco numeric, UNIQUE(cod_prod)

  • 12CAPTULO6. POSTGRESQLPRTICO/DDL/CRIAOEEXCLUSODEBANCOS, ESQUEMAS, TABELAS, VIEWS, CONSTRAINTS, ETC

    );CREATE TABLE exemplo (

    a integer,b integer,c integer,UNIQUE (a, c)

    );CREATE TABLE produtos (

    cod_prod integer CONSTRAINT unq_cod_prod UNI-QUE,nome text,preco numeric

    );Evitando duplicao com nulos:create table teste(id serial not null,parent integer null,component integer not null);postgres=# create unique index naoduplic on teste usingbtree (component) where (parent is null);Chaves Primrias (Primary Key)A chave primria de uma tabela formada internamentepela combinao das constraints UNIQUE e NOTNULL. Uma tabela pode ter no mximo uma chaveprimria. A teoria de bancos de dados relacional dita quetoda tabela deve ter uma chave primria. O PostgreSQLno obriga que uma tabela tenha chave primria, mas recomendvel, a no ser que esteja criando uma tabelapara importar de outra que contenha registros duplicadospara tratamento futuro ou algo parecido ou apenas paratestes.CREATE TABLE produtos (

    cod_prod integer UNIQUE NOT NULL,nome text,preco numeric

    );CREATE TABLE produtos (

    cod_prod integer PRIMARY KEY,nome text,preco numeric

    );Composta (formada por mais de um campo)CREATE TABLE exemplo (

    a integer,

    b integer,c integer,PRIMARY KEY (a, c)

    );Chave Estrangeira (Foreign Key)Criadas com o objetivo de relacionar duas tabelas,mantendo a integridade referencial entre ambas. Espe-cica que o valor da coluna (ou grupo de colunas) devecorresponder a algum valor existente em um registroda outra tabela. Normalmente queremos que na tabelaestrangeira existam somente registros que tenham umregistro relacionado na tabela principal. Como tambmcontrola a remoo de registros na tabela principal quetenha registros relacionados na estrangeira.Tabela principal

    CREATE TABLE produtos (

    cod_prod integer PRIMARY KEY,nome text,preco numeric

    );Tabela referenciadaCREATE TABLE pedidos (

    cod_pedido integer PRIMARY KEY,cod_prod integer,quantidade integer,CONSTRAINT pedidos_fk FOREIGN KEY(cod_prod) REFERENCES produtos (cod_prod)

    );CREATE TABLE t0 (

    a integer PRIMARY KEY,b integer,c integer,FOREIGN KEY (b, c) REFERENCES outra_tabela - -a coluna de destino ser a PK

    );CREATE TABLE t1 (

    a integer PRIMARY KEY,b integer,c integer,FOREIGN KEY (b, c) REFERENCES outra_tabela(c1, c2)

    );

  • 13

    Obs.: O nmero de colunas e tipo na restrio devem sersemelhantes ao nmero e tipo das colunas referenciadas.Simulando ENUM no PostgreSQL

    Para simular a constraint enum do MySQL, podemosusar a constraint check.Dica do site PostgreSQL & PHP Tutorials.

    CREATE TABLE pessoa(codigo int null primary key,cor_favorita varchar(255) not null,check (cor_favorita IN ('vermelha', 'verde', 'azul')));

    INSERT INTO pessoa (codigo, cor_favorita) values (1,'vermelha'); -- OKINSERT INTO pessoa (codigo, cor_favorita) values (1,'amarela'); -- Erro, amarelo no constaHeranaPodemos criar uma tabela que herda todos os campos deoutra tabela existente.CREATE TABLE cidades (

    nome text,populacao oat,altitude int -- (em ps)

    );CREATE TABLE capitais (

    estado char(2)

    ) INHERITS (cidades);capitais assim passa a ter tambm todos os campos databela cidades.Segundo uma entrevista (vide DBFree Magazine No. 2)com a equipe de desenvolvimento do PostgreSQL, eviteutilizar herana de tabelas.Esquemas (Schema)\dn visualizar esquemasUm banco de dados pode conter vrios esquemas e den-tro de cada um desses podemos criar vrias tabelas. Aoinvs de criar vrios bancos de dados, criamos um e cri-amos esquemas dentro desse. Isso permite uma maiorexibilidade, pois uma nica conexo ao banco permiteacessar todos os esquemas e suas tabelas. Portanto deve-mos planejar bem para saber quantos bancos precisare-mos, quantos esquemas em cada banco e quantas tabelasem cada esquema.Cada banco ao ser criado traz um esquema public, que onde cam todas as tabelas, caso no seja criado outroesquema. Este esquema public no padro ANSI. Casose pretenda ao portvel devemos excluir este esquema pu-blic e criar outros. Por default todos os usurios criadostem privilgio CREATE e USAGE para o esquema pu-

    blic.Criando Um EsquemaCREATE SCHEMA nomeesquema;Excluindo Um EsquemaDROP SCHEMA nomeesquema;Aqui, quando o esquema tem tabelas em seu interior, no possvel apagar dessa forma, temos que utilizar:DROP SCHEMA nomeesquema CASCADE;Que apaga o esquema e todas as suas tabelas, portantomuito cuidado.Obs.: O padro SQL exige que se especiqueRESTRICT(default no PostgreSQL) OU CASCADE, mas nenhumSGBD segue esta recomendao.Obs.: recomendado ser explcito quanto aos campos aserem retornados, ao invs de usar * para todos, entrarcom os nomes de todos os campos. Assim ca mais claro.Alm do mais a consulta ter um melhor desempenho.Acessando Tabelas Em EsquemasSELECT * FROM nomeesquema.nometabela;Privilgios Em Esquemas

    \dp visualizar permissesREVOKE CREATE ON SCHEMA public FROM PU-BLIC; - - Remove o privilgio CREATE de todos osusurios.Obtendo Informaes sobre os Esquemas:\dn\df current_schema*SELECT current_schema();SELECT current_schemas(true);SELECT current_schemas(false);Vises (views)\dp visualizar views e outros objetosQue so VIEWS?So uma maneira simples de executar e exibir dados se-lecionados de consultas complexas em bancos. Em queelas so teis? Elas economizam grande quantidade dedigitao e esforo e apresentam somente os dados quedesejamos.Criando Uma ViewCREATE VIEW recent_shipmentsAS SELECT count(*) AS num_shipped,max(ship_date), title FROM shipments JOIN editionsUSING (isbn) NATURAL JOIN books AS b (book_id)GROUP BY b.title ORDER BY num_shipped DESC;Usando Uma ViewSELECT * FROM recent_shipments;SELECT * FROM recent_shipments

  • 14CAPTULO6. POSTGRESQLPRTICO/DDL/CRIAOEEXCLUSODEBANCOS, ESQUEMAS, TABELAS, VIEWS, CONSTRAINTS, ETC

    ORDER BY max DESC LIMIT 3;Destruindo Uma ViewDROP VIEW nomeview;Criar as Tabelas que serviro de BaseCREATE TABLE client (clientid SERIAL NOT NULL PRIMARY KEY,clientname VARCHAR(255));CREATE TABLE clientcontact (contactid SERIAL NOT NULL PRIMARY KEY,clientid int CONSTRAINT client_contact_check REFE-RENCES client(clientid),name VARCHAR(255),phone VARCHAR(255),fax VARCHAR(255),emailaddress VARCHAR(255));CREATE VIEW client_contact_list ASSELECT client.clientid, clientname, name, emailaddressFROM client, clientcontactWHERE client.clientid = clientcontact.clientid;Estando no psql e digitando \d podemos visualizar tam-bm as views.O nome da viso deve ser distinto do nome de qualqueroutra viso, tabela, seqncia ou ndice no mesmo es-quema. A viso no materializada sicamente. Em vezdisso, a consulta executada toda vez que a viso re-ferenciada em uma consulta. Fazer livre uso de vises um aspecto chave de um bom projeto de banco de dadosSQL.As vises podem ser utilizadas em praticamente todos oslugares onde uma tabela real pode ser utilizada. Cons-truir vises baseadas em vises no raro. Atualmente,as vises so somente para leitura: o sistema no permiteinsero, atualizao ou excluso em uma viso. poss-vel obter o efeito de uma viso atualizvel criando regrasque reescrevem as inseres, etc. na viso como aesapropriadas em outras tabelas. Para obter informaesadicionais consulte o comando CREATE RULE.CREATE VIEW vista AS SELECT 'Hello World'; ruim por dois motivos: o nome padro da coluna ?co-lumn?, e o tipo de dado padro da coluna unknown. Sefor desejado um literal cadeia de caracteres no resultadoda viso deve ser utilizado algo como CREATE VIEWvista AS SELECT text 'Hello World' AS hello;Veja captulo 4 do Livro Pratical PostgreSQLSupondo que uma consulta seja de particular interessepara uma aplicao, mas que no se deseja digitar esta

    consulta toda vez que for necessria, ento possvel criaruma view baseada na consulta, atribuindo um nome aesta consulta pelo qual ser possvel referenci-la comose fosse uma tabela comum.CREATE VIEW minha_view ASSELECT cidade, temp_min, temp_max, prcp, data, loca-lizacao FROM clima, cidades WHERE cidade = nome;SELECT * FROM minha_visao;Fazer livre uso de vises um aspecto chave de um bomprojeto de banco de dados SQL. As vises permitem en-capsular, atrs de interfaces que no mudam, os detalhesda estrutura das tabelas, que podemmudar na medida emque as aplicaes evoluem.As vises podem ser utilizadas em praticamente todos oslugares onde uma tabela real pode ser utilizada. Construirvises baseadas em vises no raro.RULESO comando CREATE RULE cria uma regra aplicada tabela ou viso especicada.Uma regra faz com que comandos adicionais sejam exe-cutados quando um determinado comando executadoem uma determinada tabela. importante perceber que a regra , na realidade, ummecanismo de transformao de comando, ou umamacrode comando. possvel criar a iluso de uma viso atualizvel de-nindo regras ON INSERT, ON UPDATE e ON DE-LETE, ou qualquer subconjunto destas que seja sucientepara as nalidades desejadas, para substituir as aes deatualizao na viso por atualizaes apropriadas em ou-tras tabelas.Existe algo a ser lembrado quando se tenta utilizar regrascondicionais para atualizao de vises: obrigatrio ha-ver uma regra incondicional INSTEAD para cada aoque se deseja permitir na viso. Se a regra for condici-onal, ou no for INSTEAD, ento o sistema continuara rejeitar as tentativas de realizar a ao de atualizao,porque acha que poder acabar tentando realizar a aosobre a tabela ctcia da viso em alguns casos.banco=# \h create ruleComando: CREATE RULEDescrio: dene uma nova regra de reescritaSintaxe:CREATE [ OR REPLACE ] RULE nome AS ON eventoTO tabela [ WHERE condio ] DO [ ALSO | INSTEAD] { NOTHING | comando | ( comando ; comando ... ) }O comando CREATE RULE cria uma regra aplicada tabela ou viso especicada.eventoEvento um entre SELECT, INSERT, UPDATE e DE-

  • 15

    LETE.condioQualquer expresso condicional SQL (retornando boo-lean). A expresso condicional no pode fazer refernciaa nenhuma tabela, exceto NEW e OLD, e no pode con-ter funes de agregao.INSTEADINSTEAD indica que os comandos devem ser executadosem vez dos (instead of) comandos originais.ALSOALSO indica que os comandos devem ser executados adi-cionalmente aos comandos originais. Se no for especi-cado nem ALSO nem INSTEAD, ALSO o padro.comandoO comando ou comandos que compem a ao da regra.Os comandos vlidos so SELECT, INSERT, UPDATE,DELETE e NOTIFY.Dentro da condio e do comando, os nomes especiais detabela NEW e OLD podem ser usados para fazer refern-cia aos valores na tabela referenciada. O NEW vlidonas regras ON INSERT e ON UPDATE, para fazer refe-rncia nova linha sendo inserida ou atualizada. O OLD vlido nas regras ON UPDATE e ON DELETE, parafazer referncia linha existente sendo atualizada ou ex-cluda.Obs.: necessrio possuir o privilgio RULE na tabelapara poder denir uma regra para a mesma.Exemplos:CREATE RULEme_notique AS ONUPDATE TO da-tas DO ALSO NOTIFY datas;CREATE RULE r1 AS ON INSERT TO TBL1 DO(INSERT INTO TBL2 VALUES (new.i); NOTIFYTBL2);CREATE RULE "_RETURN AS ON SELECT TOmi-nha_viso DO INSTEADSELECT * FROM minha_tabela; -- Ao invs de seleci-onar da viso seleciona da tabela.Banco de dados modelo intocadoExiste um modelo de banco de dados que sempre se pre-serva original, que o template0. O template template1pode incorporar objetos e acaba algumas vezes candoinvivel seu uso como modelo. Quando isso acontece po-demos substitui-lo com uma cpia do template0.Criando banco de dados baseado em outro modeloCREATE DATABSASE nomebanco TEMPLATE tem-plate0;createdb -T template0 nomebancoRecriando o template1

    \c testespostgres=# UPDATE pg_database SET datistem-plate=false WHERE datname='template1';testes=# DROP DATABASE template1;testes=# CREATE DATABASE template1 TEMPLATEtemplate0 ENCODING 'latin1';testes=# \c template1template1=# VACUUM FULL FREEZE;template1=# VACUUM FULL;template1=# UPDATE pg_database SET datistem-plate=true WHERE datname='template1';Agora temos um template1 original e limpo.

  • Captulo 7

    PostgreSQL Prtico/DDL/Alteraes nosobjetos dos bancos

    3.2 - Alteraes nos objetos dos bancosAdicionar campo, remover campo, adicionar constraint,remover constraint, alterar valor default, alterar nome decampo, alterar nome de tabela, alterar tipo de dado decampo (>=8.0).Adicionar Um CampoALTER TABLE tabela ADD COLUMN campo tipo;ALTER TABLE produtos ADD COLUMN descricaotext;Remover CampoALTER TABLE tabela DROP COLUMN campo;ALTER TABLE produtos DROP COLUMN descricao;ALTER TABLE produtos DROP COLUMN descricaoCASCADE; -- Cuidado com CASCADEAdicionar ConstraintALTER TABLE tabela ADD CONSTRAINT nome;ALTER TABLE produtos ADD COLUMN descricaotext CHECK (descricao );ALTER TABLE produtos ADD CHECK (nome );ALTER TABLE produtos ADD CONSTRAINT uni-que_cod_prod UNIQUE (cod_prod);ALTER TABLE produtos ADD FOREIGN KEY(cod_produtos) REFERENCES grupo_produtos;ALTER TABLE produtos ADD CONSTRAINT ven-das_fk FOREIGNKEY (cod_produtos) REFERENCESprodutos (codigo);Remover ConstraintALTER TABLE tabela DROP CONSTRAINT nome;ALTER TABLE produtos DROP CONSTRAINT pro-dutos_pk;ALTERAR VALOR DEFAULT DE CAMPO:Mudar Tipo de Dados de Campo (S >=8.0):ALTER TABLE tabela ALTER COLUMN campo

    TYPE tipo;ALTER TABLE produtos ALTER COLUMN precoTYPE numeric(10,2);ALTER TABLE produtos ALTER COLUMN dataTYPE DATE USING CAST (data AS DATE);Mudar Nome De CampoALTER TABLE tabela RENAME COLUMNcampo_atual TO campo_novo;ALTER TABLE produtos RENAME COLUMNcod_prod TO cod_produto;Setar/Remover Valor Default de CampoALTER TABLE tabela ALTER COLUMN campo SETDEFAULT valor;ALTER TABLE produtos ALTER COLUMN cod_prodSET DEFAULT 0;ALTER TABLE produtos ALTER COLUMN precoSET DEFAULT 7.77;ALTER TABLE tabela ALTER COLUMN campoDROP DEFAULT;ALTER TABLE produtos ALTER COLUMN precoDROP DEFAULT;Adicionar/Remover NOT NULLALTER TABLE produtos ALTER COLUMN cod_prodSET NOT NULL;ALTER TABLE produtos ALTER COLUMN cod_prodDROP NOT NULL;Renomear TabelaALTER TABLE tabela RENAME TO nomenovo;ALTER TABLE produtos RENAME TO equipamentos;Adicionar Constraint (Restrio)ALTER TABLE produtos ADD CONSTRAINT produ-tos_pk PRIMARY KEY (codigo);ALTER TABLE vendas ADD CONSTRAINT ven-das_fk FOREIGNKEY (codigo) REFERENCES produ-

    16

  • 17

    tos(codigo_produto);ALTER TABLE vendas ADD CONSTRAINT ven-das_fk FOREIGNKEY (codigo) REFERENCES produ-tos; -- Neste caso usa a chave primria da tabela produtosRemover Constraint (Restrio) ALTER TABLE produ-tos DROP CONSTRAINT produtos_pk;ALTER TABLE vendas DROP CONSTRAINT ven-das_fk;

  • Captulo 8

    PostgreSQL Prtico/DDL/ndices, Tiposde Dados e Integridade Referencial

    3.3 - ndices, Tipos de Dados e Integridade Referencial importante conhecer bem o mximo de recursos exis-tentes no banco, especialmente aqueles relacionados snossas necessidades. Assim trabalhamos com mais eci-ncia e criamos bancos mais leves e com mais potencial.Os tipos de dados so fatores de desempenho.Exemplo:Se um campo tipo inteiro ir precisar de valores at 100 enunca mudar esta faixa. No devemos usar este campocom o tipo INT8, quando o INT2 atende e sobra.De forma semelhante escolher todos os demais camposda tabela com bom senso. Mais Detalhes no Captulo 8do Manual:http://pgdocptbr.sourceforge.net/pg80/datatype.htmlndicesOs ndices so recursos do SGBD paramelhorar o desem-penho de consultas. Mas como o uso de ndices tambmtem um preo importante planejar bem e conhecer asparticularidades antes de adicionar um ndice.Cada vez que um registro inserido ou atualizado a tabelade ndices tambm atualizada.Quando criamos consultas SQL, que pesquisam tabe-las com muitos registros e esta consulta usa a clusulaWHERE, ento os campos que fazem parte da clusulaWHERE so bastante indicados para ndice, para quemelhore o desempenho da consulta.Os ndices so uma forma de melhorar o desempenhode bancos de dados. Ao invs de procurar de forma se-quencial, o servidor procura pelo ndice, como se faz umabusca em ndices de livros e vai-se diretamente pginaprocurada.O ndice passado para cada registro adicionado ou re-movido. difcil criar regras genricas para determinar que ndi-ces devem ser denidos. Muita experincia por parte doadministrador e muita vericao experimental neces-sria na maioria dos casos.

    Criar um ndice:CREATE INDEX nomeindice ON tabela (campo);Regra geral para nome de ndice:idx_nometabela_nomecampoObs.: ndices no importantes ou no utilizados devemser removidos.Remover ndice:DROP INDEX nomeindice;Criar um ndice nico:CREATE UNIQUE INDEX nomeindice ON tabela(campo);Obs.: Somente os ndices tipo B-tree podem ser do tipoUnique.Criar um ndice com vrias colunas:CREATE INDEX idx_clientes_ps ON clientes (codigo,nome);Boa indicao para consultas com WHERE...AND. Aousar OR o ndice no ser utilizado pelo PostgreSQL:SELECT nome FROM clientes WHERE codigo = 12AND nome = 'Joo';Usar ndices com vrias colunas commoderao. ndicescom mais de 3 colunas tem grandes possibilidades de noserem utilizados internamente.Tipos de ndicesO PostgreSQL suporta atualmente quatro tipos de ndi-ces: B-tree (rvore B), R-tree (rvore R), Hash e GiST.B-tree -> o tipo padro (assume quando no indicamos).So ndices que podem tratar consultas de igualdade e defaixa, em dados que podem ser classicados.Indicado para consultas com os operadores: . Tambm pode ser utilizado com LIKE, ILIKE, ~ e ~*.R-tree -> tipo mais adequado a dados espaciais. Ade-quado para consultas com os operadores: , @, ~=, &&.

    18

  • 19

    Hash ->indicados para consultas com comparaes deigualdade simples. desencorajado seu uso. Em seu lu-gar recomenda-se o B-tree. GiST ->Criando ndices de tipos diferentes:CREATE INDEX nome ON tabela USING tipo(campo);tipo: BTREE, RTREE, HASH, GISTObs.: Somente os tipos B-tree e GiST suportam ndicescom vrias colunas. ndices com mais de um campo so-mente ser utilizado se as clusulas com os campos inde-xados forem ligados por AND. Um ndice com mais de 3campos dicilmente ser utilizado.ndice ParcialCriado apenas sobre um subconjunto dos registros deuma tabela, denido numa expresso durante a criaodo ndice parcial. um recurso para melhorar o desem-penho dos ndices, j que atualiza somente parte dos re-gistros.Obs.: na maioria dos casos a vantagem de um ndice par-cial sobre um ndice integral no muita.Exemplos:Examinando a Utilizao dos ndicesA vericao de uso de ndices deve ser feita com os co-mandos EXPLAIN e ANALYZE, sendo que o comandoANALYZE sempre deve ser executado antes. O co-mando ANALYZE coleta estatsticas sobre a distribuiodos valores na tabela. Devem ser utilizados dados reais eo conjunto de dados de teste nunca deve ser pequeno.Atentar para usar ndices nos campos das Clusulas- FOREIGN KEY- ORDER BY- WHERE- ON- GROUP BY- HAVINGExemplos prtico da vantagem do ndice- Uma tabela contendo os CEPs do Brasil, com 633.401registros.Esta tabela sem nenhum ndice executa a consulta abaixo:\timingSELECT * FROM cep_tabela WHERE cep =60420440;Em 7691 ms- Ps adicionar um ndice:ALTER TABLE cep_tabela ADD CONSTRAINTcep_pk PRIMARY KEY (cep);A mesma consulta anterior agora gasta apenas 10 ms.

    Isso num AMD Duron 1300, 128MB de RAM).ndice FuncionalCREATE INDEX nomeindice ON tabela (lower (nome-campo));timo artigo no iMastershttp://www.imasters.com.br/artigo.php?cn=1897&cc=23http://www.imasters.com.br/artigo.php?cn=1922&cc=23http://www.imasters.com.br/artigo.php?cn=1959&cc=23Vide manual ocial, captulo 11 para detalhes.BoleanosRepresentaes:'t', 'true', 'y', 'yes e '1'FALSERepresentaes:'f', 'false', 'n', 'no', '0'Apenas um dos dois estados. O terceiro estado, desco-nhecido, representado pelo NULL.Exemplo de consulta com boolean:CREATE TABLE teste1 (a boolean, b text);INSERT INTO teste1 VALUES (TRUE, 'sic est');INSERT INTO teste1 VALUES (FALSE, 'non est');SELECT * FROM teste1;Retorno:a | b---+---------t | sic est f | non estAlerta: a entrada pode ser: 1/0, t/f, true/false,TRUE/FALSE, mas o retorno ser semp re t/f.Obs.: Para campos tipo data que permitam NULL, de-vemos prever isso na consulta SQL e passar NULL semdelimitadores e valores no NULL com delimitadores.Obs2: Evite o tipo MONEY que est em obsolescncia.Em seu lugar use NUMERIC. Prera INT (INTEGER)em lugar de INT4, pois os primeiros so padro SQL. Emgeral evitar os nomes INT2, INT4 e INT8, que no sopadro. O INT8 ou bigint no padro SQL. Em ndicesutilize somente INT, evitando smallint e bigint, que nuncasero utilizados.Tipos SQL Padrobit, bit varying, boolean, char, character varying, charac-ter, varchar, date, double precision, integer, interval, nu-meric, decimal, real, smallint, time (com ou sem zonahorria), timezone (com ou sem zona horria).

  • 20 CAPTULO 8. POSTGRESQL PRTICO/DDL/NDICES, TIPOS DE DADOS E INTEGRIDADE REFERENCIAL

    O tipo NUMERIC pode realizar clculos exatos. Reco-mendado para quantias monetrias e outras quantidadesonde a exatido seja importante. Isso paga o preo dequeda de desempenho comparado aos inteiros e utuan-tes.Pensando em portabilidade evita usar NUMERIC(12) eusar NUMERIC (12,0).Alerta: A comparao de igualdade de dois valores deponto utuante pode funcionar conforme o esperado ouno.O PostgreSQL trabalha com datas do calendrio Juliano.Trabalha com a faixa de meio dia de Janeiro de 4713 AC(ano bisexto, domingo de lua nova) at uma data bem dis-tante no futuro. Leva em conta que o ano tem 365,2425dias.SERIALNo PostgreSQL um campo criado do tipo SERIAL internamente uma seqncia, inteiro positivo.Os principais SGBDs utilizam alguma variao destetipo de dados (auto-incremento). Serial o tipo auto-incremento do PostgreSQL. Quando criamos um campodo tipo SERIAL ao inserir um novo registro na tabelacom o comando INSERT omitimos o campo tipo SE-RIAL, pois ele ser inserido automaticamente pelo Post-greSQL.CREATE TABLE serial_teste (codigo SERIAL, nomeVARCHAR(45));INSERT INTO serial_teste (nome) VALUES ('RibamarFS');Obs.: A regra nomear uma seqncia se-rial_teste_codigo_seq,ou seja,tabela_campo_seq.select * from serial_teste_codigo_seq;Esta consulta acima retorna muitas informaes impor-tantes sobre a seqncia criada: nome, valor inicial, in-cremento, valor nal, maior e menor valor alm de outrasinformaes.Veja que foi omitido o campo cdigo mas o PostgreSQLir atribuir para o mesmo o valor do prximo registro decdigo. Por default o primeiro valor de um serial 1,mas se precisarmos comear com um valor diferente vejaa soluo abaixo:Setando o Valor Inicial do SerialALTER SEQUENCE tabela_campo_seq RESTARTWITH 1000;CHAR corresponde a CHAR(1).VARCHAR corresponde a uma cadeia de tamanho semlimites.Diferena de DesempenhoInternamente o PostgreSQL armazena em tabelas separa-

    dos os valores longos, para no interferirem no acesso dosvalores curtos da coluna. O maior valor permitido parauma cadeia de caracteres de 1GB. Para valores maio-res usar TEXT ou VARCHAR sem especicar compri-mento.Tipos de Dados ArrayPodemos ter campos com tipos de dados que no so sim-ples, mas arrays.CREATE TABLE salario (nome text, apgamento integer[], agendamento text[][]);CREATE TABLE tictactoe (quadrado integer[3][3]);Entrando os valores:'{{1,2,3},{4,5,6},{7,8,9}}'INSERT INTO sal_empVALUES ('Bill', '{10000, 10000, 10000, 10000}','{{"meeting, lunch"}, {"meeting"}}');ERROR: multidimensional arrays must have array ex-pressions with matching dimensionsPrecisa ter a mesma quantidade de elementos.INSERT INTO sal_empVALUES ('Bill', '{10000, 10000, 10000, 10000}','{{"meeting, lunch"}, {"training, presentation"}}');INSERT INTO sal_empVALUES ('Carol', '{20000, 25000, 25000, 25000}','{{"breakfast, consulting"}, {"meeting, lunch"}}');SELECT * FROM sal_emp;name | pay_by_quarter | schedule+---------------------------+-------------------------------------------Bill | {10000,10000,10000,10000} | {{me-eting,lunch},{training,presentation}} Carol| {20000,25000,25000,25000} | {{break-fast,consulting},{meeting,lunch}}(2 rows)O construtor ARRAY tambm pode ser usado:INSERT INTO sal_empVALUES ('Bill', ARRAY[10000, 10000, 10000,10000], ARRAY[['meeting', 'lunch'], ['training', 'presen-tation']]);INSERT INTO sal_empVALUES ('Carol', ARRAY[20000, 25000, 25000,25000], ARRAY[['breakfast', 'consulting'], ['meeting','lunch']]);

  • 21

    Acessando:SELECT name FROM sal_emp WHEREpay_by_quarter[1] pay_by_quarter[2];SELECT pay_by_quarter[3] FROM sal_emp;Faixa de valores- inferior:superior:SELECT schedule[1:2][1:1] FROM sal_emp WHEREname = 'Bill';SELECT array_dims(ARRAY[1,2] || 3);SELECT array_prepend(1, ARRAY[2,3]);SELECT array_cat(ARRAY[1,2], ARRAY[3,4]);SELECT 1 || ARRAY[2,3] AS array;SELECT ARRAY[1,2] || ARRAY3,4 AS array;SELECT f1[1][2][3] AS e1, f1[1][1][5] AS e2FROM (SELECT '[1:1][2:1][3:5]={{{1,2,3},{4,5,6}}}'::int[]AS f1) AS ss;

  • Captulo 9

    PostgreSQL Prtico/DML

    9.1 4 - DML (Data ManipulationLanguage)

    1. Consultas (select, insert, update e delete)

    2. Consultas Join3. Sub Consultas

    22

  • Captulo 10

    PostgreSQL Prtico/DML/Consultas

    10.1 DML o conjunto de comandos SQL responsveis pela mani-pulao dos dados: inserir, consultar, atualizar e excluir.

    10.2 ConsultasAtente para que suas consultas sejam:- simples e claras- contenham somente campos estritamente necessrios- sejam otimizadas para o desempenho mximoSQL (Structure Query Language) - uma linguagem de-clarativa, onde voc diz ao computador o que deseja fazere deixa a mquina decidir a forma correta de chegar aoresultado.Para o primeiro contato com o PostgreSQL e para ter cer-teza de que o mesmo est corretamente instalado e con-gurado, podemos digitar na linha de comando do sistemaoperacional (como usurio do postgresql):psql --versionpsql -lO psql o programa de gerenciamento e uso do Post-greSQL pelo usurio local.Com ele podemos fazer praticamente tudo que se podefazer com o PG.Alguns programas esto disponveis na linha de comandodo sistema operacional, permitindo criar e excluir ban-cos, criar e excluir usurios, entre outros. Os programasa disponveis dependem da verso instalada, do sistemaoperacional e da forma que foi instalado.Quem instala atravs dos fontes (sources) tem um sub-diretrio chamado contrib, onde esto os demais progra-mas desenvolvidos pela comunidade de programadoresdo PG. Neste caso para instalar um destes programas exe-cute make; make install estando no respectivo diretrio.Um exemplo o pgbench.Os comandos via linha de comandos do SO, normalmenteterminam com db e so formados com apenas uma pa-

    lavra, createdb, por exemplo. J de dentro do psql, elesnormalmente so formados por duas palavras, como porexemplo,CREATE DATABASE.Os comandos a seguir sero executados na linha de co-mando do SO. Supondo que o super-usurio seja post-gres.Forma mais geral de uso:nome_comando opo -U nomeuserCriar um banco de dados:createdb controle_estoque -U postgresVisualizar o banco criado:psql -l -U postgresExcluir o banco criado:dropdb controle_estoque -U postgresAjuda sobre os comandos:nome_comando --helpAcessar o banco criado atravs do terminal interativo degerenciamento do PostgreSQL (psql):psql controle_estoque -U postgresD:\Arquivos de programas\PostgreSQL\8.1\bin>psqlcontrole_estoque -U postgresBem vindo ao psql 8.1.3, o terminal iterativo do Post-greSQL.Digite: \copyright para mostrar termos de distribuio\h para ajuda com comandos SQL \? para ajuda com co-mandos do psql \g ou terminar com ponto-e-vrgula paraexecutar a consulta \q para saircontrole_estoque=#Este o prompt do psql. Veja que j nos recebe comboas vindas e com dicas de como podemos a qualquermomento receber ajuda. Especialmente atente para oscomandos:\h - para receber ajuda sobre comandos SQL. \h comando- ajuda sobre um comando\? - ajuda sobre os comandos de operao do terminal

    23

  • 24 CAPTULO 10. POSTGRESQL PRTICO/DML/CONSULTAS

    psql

    - o comando para indicar ao PG que execute nossaseqncia de comandos

    \q - para sair do psqlObs.: Aceita quebras de linha para uma seqncia de co-mandos.Mesmo que possamos utilizar ferramentas grcas ouWeb para gerenciar o PG, altamente recomendado quenos familiarizemos com a sintaxe dos comandos para en-tender como os comandos so executados internamentee ter maior domnio sobre o PG. Depois dessa fase, osque resistem aos encantos do psql :) podem usar uma dascitadas ferramentas.Vamos executar alguns comandos do psql e algumas pe-quenas consultas para carmos mais vontade.\l -- lista bancos, donos e codicao\d -- descreve tabela, ndice, seqncia ou view (viso)\du -- lista usurios e permisses\dg -- lista grupos\dp -- lista privilgios de acesso tabelas, views (vises)e sequnciaspsql controle_estoque -U postgrescontrole_estoque=# SELECT version();version PostgreSQL 8.1.3 on i686-pc-mingw32, compi-led by GCC gcc.exe (GCC) 3.4.2 (mingw-special)Para distinguir convencionou-se que as palavras chave doSQL sejam escritas em maisculas, mas podem ser escri-tas em minsculas sem problema para o interpretador decomandos.SELECT 25*4;SELECT current_date;4.1 - Consultas Bsicas em SQLSELECT selecionar registros de tabelasbanco=# \h select -- da ajuda via psqlComando: SELECTDescrio: recupera (retorna) registros de uma tabela ouviso (view)Sintaxe:SELECT [ ALL | DISTINCT [ ON ( expresso [, ...] ) ]]* | expresso [ AS nome_sada ] [, ...] [ FROM item_de [,...] ] [ WHERE condio ] [ GROUP BY expresso [, ...]] [ HAVING condio [, ...] ] [ { UNION | INTERSECT| EXCEPT } [ ALL ] select ] [ ORDER BY expresso [ASC | DESC | USING operador ] [, ...] ] [ LIMIT {contador | ALL } ] [ OFFSET incio ] [ FOR { UPDATE| SHARE } [ OF nome_tabela [, ...] ] [ NOWAIT ] ]

    ASC o defaultItem_de pode ser um dos:[ ONLY ] nome_tabela [ * ] [ [ AS ] alias [ ( alias_coluna[, ...] ) ] ] ( select ) [ AS ] alias [ ( alias_coluna [,...] ) ] nome_funo ( [ argumento [, ...] ] ) [ AS] alias [ ( alias_coluna [, ...] | denio_coluna [, ...] )] nome_funo ( [ argumento [, ...] ] ) AS ( deni-o_coluna [, ...] ) item_de [ NATURAL ] tipo_junoitem_de [ ON condio_juno | USING ( coluna_juno[, ...] ) ]Sintaxe resumida:SELECT * FROM tabela; -- retorna todos os registros databela com todos os camposA lista_de_campos o retorno da consulta.Exemplos:1) SELECT siape AS Matricula do Servidor FROMpessoal;2) SELECT pessoal.siape, pessoal.senha, loca-coes.lotacaoFROM pessoal, lotacoes WHERE pessoal.siape = lota-coes.siape ORDER BY lotacoes.lotacao;DISTINCT Escrita logo aps SELECT desconsidera osregistros duplicados, retornando apenas registros exclusi-vos.SELECT DISTINCT email FROM clientes;ALL o contrrio deDISTINCT e o padro, retornandotodos os registros, duplicados ou no.Ao fazer uma consulta, um registro ser considerado iguala outro se pelo menos um campo for diferente. E os todosos valores NULL sero considerados iguais.CLUSULA WHERE - Filtra o retorno de consultas.Operadores aceitos: =, >, =, 18;SELECT nome FROM clientes WHERE idade < 21;SELECT nome FROM clientes WHERE idade >= 18;SELECT nome FROM clientes WHERE idade

  • 10.2. CONSULTAS 25

    SELECT nome FROM clientes WHERE idade >18 21OR idade < 21; -- entre 18 e 21SELECT nome FROM clientes WHERE idade >= 18AND UPPER(estado) = 'CE';SELECT nome FROM clientes WHERE idade NOTBETWEEN 18 AND 21;SELECT * FROM datas WHERE EXISTS(SELECT *FROM datas2 WHERE datas.data = datas2.data);SELECT nome FROM clientes WHERE estado ISNULL;SELECT nome FROM clientes WHERE estado IS NOTNULL;SELECT nome FROMclientesWHERE estado IN ('CE','RN');GROUPBY -Geralmente utilizada com funes de agru-pamento (de agregao), como tambm com HAVING.Agrupa o resultado dos dados por um ou mais campos deuma tabela. Utilizado para agrupar registros (linhas) databela que compartilham os mesmos valores em todas ascolunas (campos) da lista.Exemplos:SELECT SUM(horas) FROM empregados; -- Traz asoma das horas de todos os empregadosSELECT empregado, SUM(horas) FROM empregadosGROUP BY empregado; -- Traz a soma das horas decada empregado. Veja que empregado deve aparecerem GROUP BY, j que os campos de retorno diferen-tes do usado na funo de agrupamento devem vir noGROUP BY.Dica: Quando se utiliza uma funo de agrupamento numcampo da lista do SELECT, os demais campos da listadevero ser agrupados. Exemplo:SELECT codigo, nome, count(valor) FROM vendasGROUP BY codigo, nome.Exemplo:SELECT c.nome, COUNT(p.quant) AS quantosFROM clientes c, pedidos pWHERE c.codigo = p.cod_clienteGROUP BY (p.cod_cliente);HAVING - Filtra o retorno de GROUP BY. No altera oresultado,apenas ltra.Exemplo:SELECT cliente, SUM(quant) AS totalFROM pedidos GROUP BY clienteHAVING total > 50; -- ou HAVING SUM(quant) > 50;ORDER BY - Ordena o resultado da consulta por umou mais campos em ordem ascendente (ASC, default) oudescendente (DESC).

    Exemplos:ORDER BY cliente; -- pelo cliente e ascendenteORDER BY cliente DESC; -- descendenteORDER BY cliente, quantidade; -- pelo cliente e sub or-denado pela quantidadeORDER BY cliente DESC, quant ASC;No exemplo ordenando por dois campos:SELECT * FROM pedidos ORDER BY cliente, quanti-dade; A sada caria algo como:Antnio 1Antnio 2Joo - 1Pedro - 1Pedro - 2INSERT Inserir registros em tabelas.banco=# \h insertComando: INSERTDescrio: insere novos registros em uma tabelaSintaxe:INSERT INTO tabela [ ( lista_de_campos ) ]{ DEFAULT VALUES | VALUES ( { expresso | DE-FAULT } [, ...] ) | consulta }DEFAULT - Se ao criar a tabela denirmos campos comvalor default, ao inserir registros e omitir o valor para es-tes campos, o servidor os cadastrar com o valor default.Exemplo (forma completa):Na tabela o campo idade tem valor default 18.INSERT INTO clientes (codigo, nome, idade) VALUES(1, Ribamar FS);Neste exemplo ser cadastrado para a idade o valor 18.Forma Abreviada:INSERT INTO clientes VALUES (1, Ribamar FS);No recomendada, por no ser clara nem adequada paratrabalho em grupo. Caso utilizemos esta forma somosobrigados a inserir os campos na ordem original em queesto na tabela.Inserindo com SubConsulta:INSERT INTO clientes (codigo, nome, idade) VALUES(SELECT fnome, dade FROM funcionarios WHEREcli = 'S');SELECT rstname, lastname, city, state INTO newfriendFROM friend;UPDATE - Atualizar registros de tabelasbanco=# \h update

  • 26 CAPTULO 10. POSTGRESQL PRTICO/DML/CONSULTAS

    Comando: UPDATEDescrio: atualiza registros de uma tabelaSintaxe:UPDATE [ ONLY ] tabela SET coluna = { expresso |DEFAULT } [, ...][ FROM lista_de ] [ WHERE condio ]Exemplos:UPDATE clientes SET idade = idade + 1; -- Todos osregistros de clientes sero atualizadosUPDATE pedidos SET quant = quant + 3WHERE cliente IN (SELECT codigo FROM clientesWHERE idade > 18);DELETE - Remover registros de tabelasbanco=# \h deleteComando: DELETEDescrio: apaga registros de uma tabelaSintaxe:DELETE FROM [ ONLY ] tabela[ USING lista_util ] [ WHERE condio ]Exemplos:DELETE FROM pedidos; -- Cuidado, excluir todos osregistros da tabela pedidosDELETE FROM pedidos WHERE (codigo IS NULL); -- Remove sem conrmao nem com opo de desfazer.

    10.3 Trabalhando corretamentecom select

    Bom artigo do DeCo no PHPAvancadohttp://www.phpavancado.net/node/165

  • Captulo 11

    PostgreSQL Prtico/DML/Consultas Join

    11.1 4.2 - Junes de Tabelas ouConsultas

    As junes SQL so utilizadas quando precisamos sele-cionar dados de duas ou mais tabelas.Existem as junes com estilo non-ANSI ou theta (junocom WHERE).E as junes ANSI join (com JOIN). As junes ANSIpodem ser de dois tipos, as INNER JOINS e as OUTERJOINS. A padro a INNER JOIN. INNER JOIN podeser escrito com apenas JOIN.Exemplo ANSI:SELECT p.siape, p.senha, l.lotacao FROM pessoal pCROSS JOIN lotacoes l;Tipos de JunesINNER JOIN - Onde todos os registros que satisfazem condio sero retornados.Exemplo:SELECT p.siape, p.nome, l.lotacao FROM pessoal p IN-NER JOIN lotacoes l ON p.siape = l.siape ORDER BYp.siape;Exemplo no estilo theta:SELECT p.siape, p.nome, l.lotacao FROM pessoal p, lo-tacoes l WHERE p.siape = l.siape ORDER BY p.siape;OUTER JOIN que se divide em LEFT OUTER JOIN eRIGHT OUTER JOINLEFT OUTER JOIN ou simplesmente LEFT JOIN - So-mente os registros da tabela da esquerda (left) sero re-tornados, tendo ou no registros relacionados na tabelada direita.Primeiro, realizada uma juno interna. Depois, paracada linha de T1 que no satisfaz a condio de junocom nenhuma linha de T2, adicionada uma linha jun-tada com valores nulos nas colunas de T2. Portanto, a ta-bela juntada possui, incondicionalmente, no mnimo umalinha para cada linha de T1.A tabela esquerda do operador de juno exibir cadaum dos seus registros, enquanto que a da direita exibir

    somente seus registros que tenham correspondentes aosda tabela da esquerda.Para os registros da direita que no tenham correspon-dentes na esquerda sero colocados valores NULL.Exemplo (voltar todos somente de pessoal):SELECT p.siape, p.nome, l.lotacao FROM pessoal pLEFT JOIN lotacoes l ON p.siape = l.siape ORDER BYp.siape;Veja que pessoal ca esquerda em FROM pessoal pLEFT JOIN lotacoes l.RIGHT OUTER JOINInverso do LEFT, este retorna todos os registros somenteda tabela da direita (right). Primeiro, realizada umajuno interna. Depois, para cada linha de T2 que nosatisfaz a condio de juno com nenhuma linha de T1, adicionada uma linha juntada com valores nulos nas co-lunas de T1. o oposto da juno esquerda: a tabela re-sultante possui, incondicionalmente, uma linha para cadalinha de T2.Exemplo (retornar somente os registros de lotacoes):SELECT p.siape, p.nome, l.lotacao FROM pessoal pRIGHT JOIN lotacoes l ON p.siape = l.siape ORDERBY p.nome;FULL OUTER JOINPrimeiro, realizada uma juno interna. Depois, paracada linha de T1 que no satisfaz a condio de junocom nenhuma linha de T2, adicionada uma linha jun-tada com valores nulos nas colunas de T2. Tambm, paracada linha de T2 que no satisfaz a condio de junocom nenhuma linha de T1, adicionada uma linha jun-tada com valores nulos nas colunas de T1.E tambm as:CROSS JOIN e SELF JOIN (para si mesmo).Vide item 7.2.1.1 do manualocial para mais detalhes eexemplos.LIMITLIMIT (limite) juntamente com OFFSET (desloca-mento) permite dizer quantas linhas desejamos retornar

    27

  • 28 CAPTULO 11. POSTGRESQL PRTICO/DML/CONSULTAS JOIN

    da consulta. Podemos retornar desde apenas uma at to-das.Sintaxe:SELECT lista_de_campos FROM expresso [LIMIT {nmero | ALL }] [OFFSET inicio]LIMIT ALL mesmo que imitir LIMIT.OFFSET inicio orienta para que a consulta retorne so-mente a partir de inicio.OFFSET 0 mesmo que omitir OFFSET.LIMIT 50 OFFSET 11 Dever trazer 50 registros do11 at o 60, caso existam.Obs.: Quando se utiliza LIMIT importante utilizar aclusula ORDER BY para estabelecer uma ordem nicapara as linhas do resultado. Caso contrrio, ser retor-nado um subconjunto imprevisvel de linhas da consulta;pode-se desejar obter da dcima a vigsima linha, mas dadcima a vigsima de qual ordem? A ordem desconhe-cida a no ser que seja especicado ORDER BY. Isto uma conseqncia inerente ao fato do SQL no prometerretornar os resultados de uma consulta em qualquer or-dem especca, a no ser que ORDER BY seja utilizadopara impor esta ordem.Exemplos:SELECT id, name FROM products ORDER BY nameLIMIT 20 OFFSET 1;Ir retornar os registros do 1 at o 20.SELECT * FROM news_m LIMIT $inicio,$n_resultadosO comando SELECT * FROM news_m LIMIT$n_resultados OFFSET $inicioir pesquisar as noticias da tabela news_m comeandodo resultado "$inicio e ir listar "$n_resultados.Exemplo: SELECT * FROM news_m LIMIT 3 OFF-SET 2 ir exibir 3 notcias a partir da 2a. notcia da ta-bela, ou seja, ir exibir as notcias 2, 3 e 4 da nossa tabelanews_m.

    11.2 INNER JOINDenio e exemplos no site db.apache.org e muitas ou-tras boas informaes sobre SQL:http://db.apache.org/derby/docs/dev/pt_BR/ref/rrefsqlj35034.htmlINNER JOIN (juno interna) umaOperao JOIN quepermite especicar uma clusula de juno explcita.SintaxeExpressoTabela [ INNER ] JOIN ExpressoTabela {ON ExpressoBooleana }A clusula de juno pode ser especicada utilizando ON

    com uma expresso booleana. O escopo das expressesna clusula ON inclui as tabelas correntes, e as tabelasnos blocos de consulta externos ao SELECT corrente. Noexemplo a seguir, a clusula ON faz referncia s tabelascorrentes:SELECT * FROM SAMP.EMPREGADOS IN-NER JOIN SAMP.EQUIPES ON EMPREGA-DOS.SAL?RIO < EQUIPES.SAL?RIO;A clusula ON pode fazer referncia a tabelas que noesto sendo juntadas, e no obrigada a fazer referncia anenhuma das tabelas sendo juntadas (embora tipicamenteo faa).-- Juno das tabelas ATIV_EMP e EMPREGADOS-- selecionar todas as colunas da tabela ATIV_EMPe -- adicionar o sobrenome do empregado (L-TIMO_NOME) da tabela -- EMPREGADOS a todasas linhas do resultado SELECT SAMP.ATIV_EMP.*,LTIMO_NOME FROM SAMP.ATIV_EMP JOINSAMP.EMPREGADO ON ATIV_EMP.NUM_EMP= EMPREGADOS.NUM_EMP; -- Juntar as tabelasEMPREGADOS e DEPARTAMENTOS, -- selecionaro nmero do empregado (NUM_EMP), -- o sobrenomedo empregado (LTIMO_NOME), -- o nmero dodepartamento (DEP_TRAB na tabela EMPREGADOSe -- NUM_DEP na tabela DEPARTAMENTOS) -- e onome do departamento (NOME_DEP) -- de todos osempregados nascidos (DATA_NASC) antes de 1930.SELECTNUM_EMP, LTIMO_NOME, DEP_TRAB,NOME_DEP FROM SAMP.EMPREGADOS JOINSAMP.DEPARTAMENTOS ON DEP_TRAB =NUM_DEP AND YEAR(DATA_NASC) < 1930; --Outro exemplo de gerar novos valores de dado, -- utili-zando uma consulta que seleciona da clusula VALUES-- (que uma forma alternativa de FULLSELECT). SE-LECT * FROM (VALUES (3, 4), (1, 5), (2, 6)) AS TA-BELA1_VALORES(C1, C2) JOIN (VALUES (3, 2), (1,2),(0, 3)) AS TABELA2_VALORES(C1, C2) ON TA-BELA1_VALORES.C1 = TABELA2_VALORES.C1;O que resulta em:C1 |C2 |C1 |2 ----------------------------------------------- 3 |4 |3 |2 1 |5 |1 |2 -- Listar todos os departa-mentos, juntamente com o -- nmero do empregadoe o ltimo nome do gerente SELECT NUM_DEP,NOME_DEP, NUM_EMP, LTIMO_NOME FROMDEPARTAMENTOS INNER JOIN EMPREGADOSON NUM_GER = NUM_EMP; -- Listar todos os n-meros do empregado e ltimo nome, juntamente --com o nmero do empregado e ltimo nome de seusgerentes SELECT E.NUM_EMP, E.LTIMO_NOME,M.NUM_EMP, M.LTIMO_NOME FROM EMPRE-GADOS E INNER JOIN DEPARTAMENTOS IN-NER JOIN EMPREGADOS M ON NUM_GER =M.NUM_EMP ON E.DEP_TRAB = NUM_DEP;

  • 11.5. RIGHT OUTER JOIN 29

    11.3 Operao JOINAs operaes de juno (JOIN), que esto entre as Ex-pressesTabela possveis na ClusulaFROM, realizamjunes entre duas tabelas (Tambm pode ser realizada ajuno entre duas tabelas utilizando um teste de igualdadeexplcito na clusula WHERE, como WHERE t1.col1 =t2.col2.) SintaxeOperao de junoAs operaes de juno so:

    INNER JOIN: Especica a juno entre duas tabe-las com uma clusula de juno explcita. ConsulteINNER JOIN.

    LEFT OUTER JOIN: Especica a juno entreduas tabelas com uma clusula de juno explcita,preservando as linhas sem correspondncia da pri-meira tabela. Consulte LEFT OUTER JOIN.

    RIGHT OUTER JOIN: Especica a juno entreduas tabelas com uma clusula de juno explcita,preservando as linhas sem correspondncia da se-gunda tabela. Consulte RIGHT OUTER JOIN.

    Em todos os casos podem ser especicadas restries adi-cionais para uma oumais tabelas sendo juntadas nas clu-sulas de juno externa, ou na Clusula WHERE

    11.4 LEFT OUTER JOINLEFT OUTER JOIN uma Operao JOIN que permiteespecicar a clusula de juno. Preserva as linhas semcorrespondncia da primeira tabela (esquerda), juntando-as com uma linha nula na forma da segunda tabela (di-reita).SintaxeExpressoTabela LEFT [ OUTER ] JOIN ExpressoTa-bela { ON ExpressoBooleana }O escopo das expresses na clusula ON inclui as tabelascorrentes, e as tabelas nos blocos de consulta externos aoSELECT corrente. A clusula ON pode fazer refernciaa tabelas que no esto sendo juntadas, e no obrigadaa fazer referncia a nenhuma das tabelas sendo juntadas(embora tipicamente o faa).--correspondncia entre cidades e pases SE-LECT CIDADES.PA?S, REGIO FROMPA?SES LEFT OUTER JOIN CIDADES ONID_CIDADE=ID_CIDADE WHERE REGIO ='?sia'; -- uso da sintaxe sinnimo, LEFT JOIN,para obter exatamente -- os mesmos resultadosda exemplo acima SELECT CIDADES.PA?S,REGIO FROM PA?SES LEFT JOIN CIDA-DES ON ID_CIDADE=ID_CIDADE WHERE

    REGIO = '?sia'; -- Juno das tabelas EM-PREGADOS e DEPARTAMENTOS, -- selecionaro nmero do empregado (NUM_EMP), -- o so-brenome do empregado (LTIMO_NOME), -- onmero do departamento (DEP_TRAB na tabelaEMPREGADOS e -- NUM_DEP na tabela DE-PARTAMENTOS) -- e o nome do departamento(NOME_DEP) -- de todos os empregados nascidos(DATA_NASC) antes de 1930 SELECT NUM_EMP,LTIMO_NOME, DEP_TRAB, NOME_DEPFROM SAMP.EMPREGADOS LEFT OUTERJOIN SAMP.DEPARTAMENTOS ON DEP_TRAB= NUM_DEP AND YEAR(DATA_NASC) < 1930;-- Listar todos os departamentos, juntamente como -- nmero do empregado e o ltimo nome do ge-rente, -- incluindo os departamentos sem gerenteSELECT NUM_DEP, NOME_DEP, NUM_EMP,LTIMO_NOME FROM DEPARTAMENTOS LEFTOUTER JOIN EMPREGADOS ON NUM_GER =NUM_EMP;

    11.5 RIGHT OUTER JOINRIGHT OUTER JOIN uma Operao JOIN que per-mite especicar a clusula de juno. Preserva as li-nhas sem correspondncia da segunda tabela (direita),juntando-as com uma linha nula na forma da primeiratabela (esquerda). (A LEFT OUTER JOIN B) equiva-lente a (B RIGHT OUTER JOIN A), com as colunas emuma ordem diferente.SintaxeExpressoTabela RIGHT [ OUTER ] JOIN Expresso-Tabela { ON ExpressoBooleana }O escopo das expresses na clusula ON inclui as tabelascorrentes, e as tabelas nos blocos de consulta externos aoSELECT corrente. A clusula ON pode fazer refernciaa tabelas que no esto sendo juntadas, e no obrigadaa fazer referncia a nenhuma das tabelas sendo juntadas(embora tipicamente o faa).-- obter todos os pases e cidades corresponden-tes, -- incluindo os pases sem nenhuma cidadeSELECT NOME_CIDADE, CIDADES.PA?SFROM CIDADES RIGHT OUTER JOINPA?SES ON CIDADES.COD_ISO_PA?S =PA?SES.COD_ISO_PA?S; -- obter todos pasesda ?frica e as cidades correspondentes, -- incluindoos pases sem cidades SELECT NOME_CIDADE,CIDADES.PA?S FROM CIDADES RIGHT OUTERJOIN PA?SES ON CIDADES.COD_ISO_PA?S= PA?SES.COD_ISO_PA?S; WHEREPA?SES.REGIO = '?frica'; -- uso da sin-taxe sinnimo, RIGHT JOIN, para obter exa-tamente -- os mesmos resultados do exem-plo acima SELECT NOME_CIDADE, CIDA-DES.PA?S FROM CIDADES RIGHT JOIN

  • 30 CAPTULO 11. POSTGRESQL PRTICO/DML/CONSULTAS JOIN

    PA?SES ON CIDADES.COD_ISO_PA?S= PA?SES.COD_ISO_PA?S WHEREPA?SES.REGIO = '?frica'; -- a ExpressoTabelapode ser uma OperaoJuno. Portanto, -- podemhaver vrias operaes de juno na clusula FROM --Listar todos os nmeros e ltimo nome dos empregados,-- juntamente com os nmeros e ltimo nome de seusgerentes SELECT E.NUM_EMP, E.LTIMO_NOME,M.NUM_EMP, M.LTIMO_NOME FROM EMPRE-GADOS E RIGHT OUTER JOIN DEPARTAMEN-TOS RIGHT OUTER JOIN EMPREGADOS M ONNUM_GER = M.NUM_EMP ON E.DEP_TRAB =NUM_DEP;

  • Captulo 12

    PostgreSQL Prtico/DML/Sub Consultas

    12.1 4.3 Sub consultas

    So consultas dentro de consultas.Subconsulta escalar um comando SELECT comum, en-tre parnteses, que retorna exatamente um registro, comum campo.SELECT nome, (SELECT MAX(preco) FROM pro-dutos WHERE codigo=1) AS maior preo FROMprodutos; SELECT * FROM tabela1 WHERE ta-bela1.col1 = (SELECT col2 FROM tabela2 WHEREcol2 = valor); SELECT name FROM customer WHEREcustomer_id NOT IN ( SELECT customer_id FROMsalesorder ); SELECT 'test' AS test, id FROM (SELECT* FROM books) AS example_sub_query; SELECTrstname, state, CASEWHEN state = 'PA' THEN 'close'WHEN state = 'NJ' OR state = 'MD' THEN 'far' ELSE'very far' END AS distance FROM friend;

    Expresses de Sub ConsultasEXISTSSELECT campo1 FROM tabela1 WHERE EXISTS(SELECT 1 FROM tabela2 WHERE campo2 = ta-bela1.campo2);Combinando CASE e EXISTSCREATE TEMPORARY TABLE frutas (id SERIALPRIMARY KEY, nome TEXT); INSERT INTO frutasVALUES (DEFAULT, 'banana'); INSERT INTO frutasVALUES (DEFAULT, 'ma');CREATE TEMPORARY TABLE alimentos (id SE-RIAL PRIMARY KEY, nome TEXT); INSERT INTOalimentos VALUES (DEFAULT, 'ma'); INSERTINTO alimentos VALUES (DEFAULT, 'espinafre');SELECT nome, CASEWHENEXISTS (SELECT nomeFROM frutas WHERE nome=a.nome) THEN 'sim'ELSE 'no' END AS fruta FROM alimentos a;INSELECT nome, CASEWHENnome IN (SELECT nomeFROM frutas) THEN 'sim' ELSE 'no' END AS frutaFROM alimentos;

    NOT INANY/SOMESELECT nome, CASE WHEN nome = ANY (SELECTnome FROM frutas) THEN 'sim' ELSE 'no' END ASfruta FROM alimentos;CASE WHENEXEMPLO1create table amigos( codigo serial primary key, nomechar(45), idade int );insert into amigos (nome, idade) values ('Joo Brito', 25);insert into amigos (nome, idade) values ('Roberto', 35);insert into amigos (nome, idade) values ('Antnio', 15);insert into amigos (nome, idade) values ('Francisco Quei-roz', 23); insert into amigos (nome, idade) values ('Ber-nardo dos Santos, 21); insert into amigos (nome, idade)values ('Francisca Pinto', 22); insert into amigos (nome,idade) values ('Natanael', 55);select nome, idade, case when idade >= 21 then 'Adulto'else 'Menor' end as status from amigos order by nome;-- CASE WHEN cria uma coluna apenas para exibioEXEMPLO2create table amigos( codigo serial primary key, nomechar(45), estado char(2) );insert into amigos (nome, estado) values ('Joo Brito','CE'); insert into amigos (nome, estado) values ('Ro-berto', 'MA'); insert into amigos (nome, estado) values('Antnio', 'CE'); insert into amigos (nome, estado) va-lues ('FranciscoQueiroz', 'PB'); insert into amigos (nome,estado) values ('Bernardo dos Santos, 'MA'); insert intoamigos (nome, estado) values ('Francisca Pinto', 'SP'); in-sert into amigos (nome, estado) values ('Natanael', 'SP');select nome, estado, case when estado = 'PB' then 'Fe-chado' when estado = 'CE' or estado = 'SP' then 'Funci-onando' when estado = 'MA' then 'Funcionando a todovapor' else 'Menor' end as status from amigos order bynome;Mostrar cada nota junto com a menor nota, a maior nota,e a mdia de todas as notas.SELECT nota, (SELECT MIN(nota) FROM notas) AS

    31

  • 32 CAPTULO 12. POSTGRESQL PRTICO/DML/SUB CONSULTAS

    menor, (SELECT MAX(nota) FROM notas) AS maior,(ROUND(SELECT AVG(nota) FROM notas)) AS me-dia FROM notas;

  • Captulo 13

    PostgreSQL Prtico/Funes Internas

    13.1 5 - Funes Internas1. Strings2. Matemticas

    3. Agrupamento (Agregao)4. Data e Hora

    5. Formatao de Tipos de Dados6. Converso de Tipos (CAST)

    33

  • Captulo 14

    PostgreSQL Prtico/FunesInternas/Strings

    14.1 5.1 Funes de Strings

    Concatenao de Strings - dois || (pipes)SELECT 'ae' || 'io' || 'u' AS vogais; --vogais -------- aeiouSELECT CHR(67)||CHR(65)||CHR(84) AS Dog"; --Dog CATQuantidade de Caracteres de Stringchar_length - retorna o nmero de caracteresSELECT CHAR_LENGTH('UNIFOR'); - -Retorna 6Ou SELECT LENGTH('Database'); - - Retorna 8Converter para minsculasSELECT LOWER('UNIFOR');Converter para maisculasSELECT UPPER('universidade');Posio de caractereSELECT POSITION ('@' IN '[email protected]'); --Retorna 7Ou SELECT STRPOS('Ribamar' ,'mar'); - - Retorna 5SubstringSUBSTRING(string [FROM inteiro] [FOR inteiro])SELECT SUBSTRING ('Ribamar FS' FROM 9 FOR10); - - Retorna FSSUBSTRING(string FROM padro);SELECT SUBSTRING ('PostgreSQL' FROM '.......'); - -Retorna PostgreSELECT SUBSTRING ('PostgreSQL' FROM '...$'); - -Retorna SQLPrimeiros ....... e ltimos ...$OuSUBSTR ( 'string', inicio, quantidade);SELECT SUBSTR ('Ribamar', 4, 3); - - Retorna marSubstituir todos os caracteres semelhantes

    SELECT TRANSLATE(string, velho, novo);SELECT TRANSLATE('Brasil', 'il', 'o'); - - RetornaBrasoSELECT TRANSLATE('Brasileiro', 'eiro', 'eira');Remover Espaos de StringsSELECT TRIM(' SQL - PADRO ');Calcular MD5 de StringSELECT MD5('ribafs); - - Retorna53cd5b2af18063bea8ddc804b21341d1Repetir uma string n vezesSELECT REPEAT('SQL-', 3); - - Retorna SQL-SQL-SQL-Sobrescrever substring em stringSELECT REPLACE ('Postgresql', 'sql', 'SQL'); - - Re-torna PostgreSQLDividir Cadeia de Caracteres com DelimitadorSELECT SPLIT_PART( 'PostgreSQL', 'gre', 2); - -Retorna SQLSELECT SPLIT_PART( 'PostgreSQL', 'gre', 1); - -Retorna Post

    Iniciais MaisculasINITCAP(text) - INITCAP ('ol mundo') - - Ol MundoRemover Espaos em BrancoTRIM ([leading | trailing | both] [characters] from string)-remove caracteres da direita e da esquerda. trim (both 'b'from 'babacatebbbb'); - - abacateRTRIM (string text, chars text) - Remove os caractereschars da direita (default espao)rtrim('removarrrr', 'r') - - removaLTRIM - (string text, chars text) - Remove os caractereschars da esquerdaltrim('abssssremova', 'abs) - - remova

    34

  • 14.1. 5.1 FUNES DE STRINGS 35

    Detalhes no item 9.4 do Manual:http://pgdocptbr.sourceforge.net/pg80/functions-string.htmlLike e %SELECT * FROM FRIENDS WHERE LASTNAMELIKE 'M%';O ILIKE case INsensitive e o LIKE case sensitive.~~ equivale ao LIKE~~* equivale equivale ao ILIKE!~~ equivale ao NOT LIKE !~~* equivale equivale aoNOT ILIKE... LIKE '[4-6]_6%' -- Pegar o primeiro sendo de 4 a 6,-- o segundo qualquer dgito,-- o terceiro sendo 6 e os demais quaisquer% similar a *_ similar a ? (de arquivos no DOS)Correspondncia com um PadroO PostgreSQL disponibiliza trs abordagens distintaspara correspondncia com padro: o operador LIKE tra-dicional do SQL; o operador mais recente SIMILAR TO(adicionado ao SQL:1999); e as expresses regulares noestilo POSIX. Alm disso, tambm est disponvel a fun-o de correspondncia com padro substring, que utilizaexpresses regulares tanto no estilo SIMILAR TO quantono estilo POSIX.SELECT substring('XY1234Z', 'Y*([0-9]{1,3})'); - -Resultado: 123SELECT substring('XY1234Z', 'Y*?([0-9]{1,3})'); - -Resultado: 1SIMILAR TOO operador SIMILAR TO retorna verdade ou falso con-forme o padro corresponda ou no cadeia de caracteresfornecida. Este operador muito semelhante ao LIKE,exceto por interpretar o padro utilizando a denio deexpresso regular do padro SQL.'abc' SIMILAR TO 'abc' verdade'abc' SIMILAR TO 'a' falso'abc' SIMILAR TO '%(b|d)%' verdade'abc' SIMILAR TO '(b|c)%' falsoSELECT 'abc' SIMILAR TO '%(b|d)%'; -- Procura b oud em 'abc' e no caso retorna TRUEREGEXPSELECT 'abc' ~ '.*ab.*';~ distingue a de A~* no distingue a de A !~ distingue expresses distinguea de A !~* distingue expresses no distingue a de A

    'abc' ~ 'abc' -- TRUE'abc' ~ '^a' -- TRUE'abc' ~ '(b|j)' -- TRUE'abc' ~ '^(b|c)' -- FALSE

  • Captulo 15

    PostgreSQL Prtico/FunesInternas/Matemticas

    15.1 5.2 Funes Matemticas

    Operadores Matemticos+, -, *, /, % (mdulo, resto de diviso de inteiros), ^(po-tncia), !(fatorial), @(valor absoluto)| / - rais quadrada ( | / 25.0 = 5) | | / - raiz cbica ( | | / 27.0= 3)Algumas funes MatemticasABS(x) - valor absoluto de xCEIL(numeric) - arredonda para o prximo inteiro supe-riorDEGREES(valor) - converte valor de radianos para grausFLOOR(numeric) - arredonda para o prximo inteiro in-feriorMOD(x,y) - resto da diviso de x por yPI() - constante PI (3,1415...)POWER(x,y) - x elevado a yRADIANS(valor) - converte valor de graus para radianosRANDOM() - valor aleatrio entre 0 e 1ROUND(numeric) - arredonda para o inteiro mais pr-ximoROUND(v, d) - arredonda v com d casas decimaisSIGN(numeric) - retorna o sinal da entrada, como1 ou+1SQRT(X) - Raiz quadrada de XTRUNC (numeric) - trunca para o nenhuma casa decimalTRUNC (v numeric, s int) - trunca para s casas decimaisOperadores Lgicos:AND, OR e NOT. TRUE, FALSE e NULLOperadores de Comparao:, =, =, ou !=a BETWEEN x AND y

    a NOT BETWEEN x AND yexpresso IS NULLexpresso IS NOT NULLexpresso IS TRUEexpresso IS NOT TRUEexpresso IS FALSEexpresso IS NOT FALSEexpresso IS UNKNOWNexpresso IS NOT UNKNOWNOPERADOR NULLEm SQL NULL para valores inexistentes. Regra geral:NULL se propaga, o que signica que com quem NULLse combina o resultado ser um NULL. NULL no zero,no string vazia nem string de comprimento zero.Um exemplo: num cadastro de alunos, para o aluno queainda no se conhece a nota, no correto usar zero parasua nota, mas sim NULL. No se pode efetuar clculosde expresses onde um dos elementos NULL.COMPARANDO NULLsNOT NULL com NULL -- UnknownNULL com NULL -- UnknownCONVERSO DE/PARA NULLNULLIF() e COALESCE()NULLIF(valor1, valor2)NULLIF Retorna NULL se, e somente se, valor1 e va-lor2 forem iguais, caso contrrio retorna valor1.Algo como:if (valor1 == valor2){then NULLelse valor1;Retorna valor1 somente quando valor1 == valor2.COALESCE retorna o primeiro de seus argumentosque no for NULL. S retorna NULL quando todos os

    36

  • 15.2. NULL OU NO NULL, EIS A QUESTO! 37

    seus argumentos forem NULL.Uso: mudar o valor padro cujo valor seja NULL.create table nulos(nulo int, nulo2 int, nulo3 int);insert into nulos values (1,null,null);select coalesce(nulo, nulo2, nulo3) from nulos; - - Retorna1, valor do campo nulo;select coalesce(nulo2, nulo3) from nulos; - - RetornaNULL, pois ambos so


Recommended