PostgreSQL - Guia rápido
PostgreSQL é um poderoso sistema de banco de dados objeto-relacional de código aberto. Ele tem mais de 15 anos de fase de desenvolvimento ativo e uma arquitetura comprovada que lhe valeu uma forte reputação de confiabilidade, integridade de dados e correção.
Este tutorial fornecerá um início rápido com o PostgreSQL e deixará você confortável com a programação do PostgreSQL.
O que é PostgreSQL?
PostgreSQL (pronunciado como post-gress-Q-L) é um sistema de gerenciamento de banco de dados relacional de código aberto (DBMS) desenvolvido por uma equipe mundial de voluntários. O PostgreSQL não é controlado por nenhuma empresa ou outra entidade privada e o código-fonte está disponível gratuitamente.
Uma breve história do PostgreSQL
PostgreSQL, originalmente chamado Postgres, foi criado na UCB por um professor de ciência da computação chamado Michael Stonebraker. Stonebraker fundou o Postgres em 1986 como um projeto subsequente ao seu antecessor, Ingres, agora propriedade da Computer Associates.
1977-1985 - Foi desenvolvido um projeto denominado INGRES.
Prova de conceito para bancos de dados relacionais
Fundou a empresa Ingres em 1980
Comprado pela Computer Associates em 1994
1986-1994 - POSTGRES
Desenvolvimento dos conceitos no INGRES com foco na orientação a objetos e na linguagem de consulta - Quel
A base de código do INGRES não foi usada como base para o POSTGRES
Comercializado como Illustra (comprado por Informix, comprado pela IBM)
1994-1995 - Postgres95
Suporte para SQL foi adicionado em 1994
Lançado como Postgres95 em 1995
Relançado como PostgreSQL 6.0 em 1996
Estabelecimento da Equipe de Desenvolvimento Global PostgreSQL
Principais recursos do PostgreSQL
PostgreSQL é executado em todos os principais sistemas operacionais, incluindo Linux, UNIX (AIX, BSD, HP-UX, SGI IRIX, Mac OS X, Solaris, Tru64) e Windows. Ele suporta texto, imagens, sons e vídeo e inclui interfaces de programação para C / C ++, Java, Perl, Python, Ruby, Tcl e Open Database Connectivity (ODBC).
PostgreSQL suporta uma grande parte do padrão SQL e oferece muitos recursos modernos, incluindo o seguinte -
- Consultas SQL complexas
- SQL Sub-selects
- Chaves estrangeiras
- Trigger
- Views
- Transactions
- Controle de simultaneidade multiversão (MVCC)
- Replicação de streaming (a partir de 9.0)
- Hot Standby (a partir de 9.0)
Você pode verificar a documentação oficial do PostgreSQL para entender os recursos mencionados acima. O PostgreSQL pode ser estendido pelo usuário de várias maneiras. Por exemplo, adicionando novo -
- Tipos de dados
- Functions
- Operators
- Funções agregadas
- Métodos de índice
Suporte para linguagens procedurais
PostgreSQL suporta quatro linguagens procedurais padrão, o que permite aos usuários escrever seu próprio código em qualquer uma das linguagens e pode ser executado pelo servidor de banco de dados PostgreSQL. Essas linguagens procedurais são - PL / pgSQL, PL / Tcl, PL / Perl e PL / Python. Além disso, outras linguagens procedurais não padronizadas como PL / PHP, PL / V8, PL / Ruby, PL / Java, etc., também são suportadas.
Para começar a entender os fundamentos do PostgreSQL, primeiro vamos instalar o PostgreSQL. Este capítulo explica como instalar o PostgreSQL nas plataformas Linux, Windows e Mac OS.
Instalando PostgreSQL no Linux / Unix
Siga as etapas fornecidas para instalar o PostgreSQL em sua máquina Linux. Certifique-se de estar conectado comoroot antes de prosseguir para a instalação.
Escolha o número da versão do PostgreSQL que deseja e, o mais exatamente possível, a plataforma que você deseja do EnterpriseDB
Eu baixei postgresql-9.2.4-1-linux-x64.runpara minha máquina CentOS-6 de 64 bits. Agora, vamos executá-lo da seguinte maneira -
[root@host]# chmod +x postgresql-9.2.4-1-linux-x64.run
[root@host]# ./postgresql-9.2.4-1-linux-x64.run
------------------------------------------------------------------------
Welcome to the PostgreSQL Setup Wizard.
------------------------------------------------------------------------
Please specify the directory where PostgreSQL will be installed.
Installation Directory [/opt/PostgreSQL/9.2]:
Depois de iniciar o instalador, ele faz algumas perguntas básicas como localização da instalação, senha do usuário que usará o banco de dados, número da porta, etc. Portanto, mantenha todos em seus valores padrão, exceto senha, que você pode fornecer senha conforme sua escolha. Ele instalará o PostgreSQL em sua máquina Linux e exibirá a seguinte mensagem -
Please wait while Setup installs PostgreSQL on your computer.
Installing
0% ______________ 50% ______________ 100%
#########################################
-----------------------------------------------------------------------
Setup has finished installing PostgreSQL on your computer.
Siga as seguintes etapas de pós-instalação para criar seu banco de dados -
[root@host]# su - postgres
Password:
bash-4.1$ createdb testdb bash-4.1$ psql testdb
psql (8.4.13, server 9.2.4)
test=#
Você pode iniciar / reiniciar o servidor postgres caso ele não esteja sendo executado usando o seguinte comando -
[root@host]# service postgresql restart
Stopping postgresql service: [ OK ]
Starting postgresql service: [ OK ]
Se sua instalação foi correta, você terá o prompt do PotsgreSQL test=# como mostrado acima.
Instalação do PostgreSQL no Windows
Siga as etapas fornecidas para instalar o PostgreSQL em sua máquina Windows. Certifique-se de ter desativado o antivírus de terceiros durante a instalação.
Escolha o número da versão do PostgreSQL que deseja e, o mais exatamente possível, a plataforma que você deseja do EnterpriseDB
Eu baixei postgresql-9.2.4-1-windows.exe para meu PC com Windows executando no modo de 32 bits, então vamos executar postgresql-9.2.4-1-windows.execomo administrador para instalar o PostgreSQL. Selecione o local onde deseja instalá-lo. Por padrão, ele é instalado na pasta Arquivos de programas.
A próxima etapa do processo de instalação seria selecionar o diretório onde seus dados seriam armazenados. Por padrão, ele é armazenado no diretório "dados".
Em seguida, a configuração pede uma senha, para que você possa usar sua senha favorita.
O próximo passo; mantenha a porta como padrão.
Na próxima etapa, quando perguntado por "Locale", selecionei "English, United States".
Demora um pouco para instalar o PostgreSQL em seu sistema. Após a conclusão do processo de instalação, você obterá a seguinte tela. Desmarque a caixa de seleção e clique no botão Concluir.
Após a conclusão do processo de instalação, você pode acessar o pgAdmin III, StackBuilder e o shell PostgreSQL a partir do menu do programa em PostgreSQL 9.2.
Instalação do PostgreSQL no Mac
Siga as etapas fornecidas para instalar o PostgreSQL em sua máquina Mac. Certifique-se de estar conectado comoadministrator antes de prosseguir para a instalação.
Escolha o número da versão mais recente do PostgreSQL para Mac OS disponível em EnterpriseDB
Eu baixei postgresql-9.2.4-1-osx.dmgpara meu Mac OS rodando com OS X versão 10.8.3. Agora, vamos abrir a imagem dmg no Finder e apenas clicar duas vezes nela, o que lhe dará o instalador do PostgreSQL na janela seguinte -
Em seguida, clique no postgres-9.2.4-1-osxícone, que dará uma mensagem de aviso. Aceite o aviso e prossiga para a instalação posterior. Ele solicitará a senha do administrador, conforme mostrado na janela a seguir -
Digite a senha, prossiga com a instalação e, após esta etapa, reinicie sua máquina Mac. Se você não vir a janela a seguir, reinicie a instalação.
Depois de iniciar o instalador, ele faz algumas perguntas básicas como localização da instalação, senha do usuário que usará o banco de dados, número da porta etc. Portanto, mantenha todos eles em seus valores padrão, exceto a senha, que você pode fornecer conforme sua escolha. Ele instalará o PostgreSQL em sua máquina Mac na pasta de aplicativos que você pode verificar -
Agora, você pode iniciar qualquer programa para começar. Vamos começar com o SQL Shell. Ao iniciar o SQL Shell, basta usar todos os valores padrão exibidos, exceto inserir sua senha, que você selecionou no momento da instalação. Se tudo correr bem, então você estará dentro do banco de dados postgres e umpostgress# prompt será exibido como mostrado abaixo -
Parabéns!!! Agora você tem seu ambiente pronto para iniciar a programação de banco de dados PostgreSQL.
Este capítulo fornece uma lista dos comandos SQL do PostgreSQL, seguidos pelas regras de sintaxe precisas para cada um desses comandos. Este conjunto de comandos é obtido da ferramenta de linha de comando psql. Agora que você instalou o Postgres, abra o psql como -
Program Files → PostgreSQL 9.2 → SQL Shell(psql).
Usando o psql, você pode gerar uma lista completa de comandos usando o comando \ help. Para a sintaxe de um comando específico, use o seguinte comando -
postgres-# \help <command_name>
A instrução SQL
Uma instrução SQL é composta de tokens onde cada token pode representar uma palavra-chave, identificador, identificador entre aspas, constante ou símbolo de caractere especial. A tabela fornecida a seguir usa uma instrução SELECT simples para ilustrar uma instrução SQL básica, mas completa, e seus componentes.
SELECIONE | id, nome | DE | estados | |
---|---|---|---|---|
Tipo de Token | Palavra-chave | Identificadores | Palavra-chave | Identificador |
Descrição | Comando | Colunas de id e nome | Cláusula | Nome da tabela |
Comandos PostgreSQL SQL
ABORTAR
Aborte a transação atual.
ABORT [ WORK | TRANSACTION ]
ALTER AGGREGATE
Altere a definição de uma função agregada.
ALTER AGGREGATE name ( type ) RENAME TO new_name
ALTER AGGREGATE name ( type ) OWNER TO new_owner
ALTER CONVERSION
Altere a definição de uma conversão.
ALTER CONVERSION name RENAME TO new_name
ALTER CONVERSION name OWNER TO new_owner
ALTER DATABASE
Altere um parâmetro específico do banco de dados.
ALTER DATABASE name SET parameter { TO | = } { value | DEFAULT }
ALTER DATABASE name RESET parameter
ALTER DATABASE name RENAME TO new_name
ALTER DATABASE name OWNER TO new_owner
ALTER DOMAIN
Altere a definição de um parâmetro específico do domínio.
ALTER DOMAIN name { SET DEFAULT expression | DROP DEFAULT }
ALTER DOMAIN name { SET | DROP } NOT NULL
ALTER DOMAIN name ADD domain_constraint
ALTER DOMAIN name DROP CONSTRAINT constraint_name [ RESTRICT | CASCADE ]
ALTER DOMAIN name OWNER TO new_owner
ALTER FUNCTION
Altere a definição de uma função.
ALTER FUNCTION name ( [ type [, ...] ] ) RENAME TO new_name
ALTER FUNCTION name ( [ type [, ...] ] ) OWNER TO new_owner
ALTER GROUP
Altere um grupo de usuários.
ALTER GROUP groupname ADD USER username [, ... ]
ALTER GROUP groupname DROP USER username [, ... ]
ALTER GROUP groupname RENAME TO new_name
ALTER INDEX
Altere a definição de um índice.
ALTER INDEX name OWNER TO new_owner
ALTER INDEX name SET TABLESPACE indexspace_name
ALTER INDEX name RENAME TO new_name
ALTER LANGUAGE
Altere a definição de uma linguagem procedural.
ALTER LANGUAGE name RENAME TO new_name
ALTER OPERATOR
Altere a definição de um operador.
ALTER OPERATOR name ( { lefttype | NONE }, { righttype | NONE } )
OWNER TO new_owner
ALTER OPERATOR CLASS
Altere a definição de uma classe de operadores.
ALTER OPERATOR CLASS name USING index_method RENAME TO new_name
ALTER OPERATOR CLASS name USING index_method OWNER TO new_owner
ALTER SCHEMA
Altere a definição de um esquema.
ALTER SCHEMA name RENAME TO new_name
ALTER SCHEMA name OWNER TO new_owner
ALTER SEQUENCE
Altere a definição de um gerador de sequência.
ALTER SEQUENCE name [ INCREMENT [ BY ] increment ]
[ MINVALUE minvalue | NO MINVALUE ]
[ MAXVALUE maxvalue | NO MAXVALUE ]
[ RESTART [ WITH ] start ] [ CACHE cache ] [ [ NO ] CYCLE ]
ALTERAR A TABELA
Altere a definição de uma mesa.
ALTER TABLE [ ONLY ] name [ * ]
action [, ... ]
ALTER TABLE [ ONLY ] name [ * ]
RENAME [ COLUMN ] column TO new_column
ALTER TABLE name
RENAME TO new_name
Onde a ação é uma das seguintes linhas -
ADD [ COLUMN ] column_type [ column_constraint [ ... ] ]
DROP [ COLUMN ] column [ RESTRICT | CASCADE ]
ALTER [ COLUMN ] column TYPE type [ USING expression ]
ALTER [ COLUMN ] column SET DEFAULT expression
ALTER [ COLUMN ] column DROP DEFAULT
ALTER [ COLUMN ] column { SET | DROP } NOT NULL
ALTER [ COLUMN ] column SET STATISTICS integer
ALTER [ COLUMN ] column SET STORAGE { PLAIN | EXTERNAL | EXTENDED | MAIN }
ADD table_constraint
DROP CONSTRAINT constraint_name [ RESTRICT | CASCADE ]
CLUSTER ON index_name
SET WITHOUT CLUSTER
SET WITHOUT OIDS
OWNER TO new_owner
SET TABLESPACE tablespace_name
ALTER TABLESPACE
Altere a definição de um espaço de tabela.
ALTER TABLESPACE name RENAME TO new_name
ALTER TABLESPACE name OWNER TO new_owner
ALTER TRIGGER
Altere a definição de um gatilho.
ALTER TRIGGER name ON table RENAME TO new_name
ALTER TYPE
Altere a definição de um tipo.
ALTER TYPE name OWNER TO new_owner
ALTER USER
Altere uma conta de usuário do banco de dados.
ALTER USER name [ [ WITH ] option [ ... ] ]
ALTER USER name RENAME TO new_name
ALTER USER name SET parameter { TO | = } { value | DEFAULT }
ALTER USER name RESET parameter
Onde a opção pode ser -
[ ENCRYPTED | UNENCRYPTED ] PASSWORD 'password'
| CREATEDB | NOCREATEDB
| CREATEUSER | NOCREATEUSER
| VALID UNTIL 'abstime'
ANALISAR
Colete estatísticas sobre um banco de dados.
ANALYZE [ VERBOSE ] [ table [ (column [, ...] ) ] ]
INÍCIO
Inicie um bloco de transação.
BEGIN [ WORK | TRANSACTION ] [ transaction_mode [, ...] ]
Onde transaction_mode é um de -
ISOLATION LEVEL {
SERIALIZABLE | REPEATABLE READ | READ COMMITTED
| READ UNCOMMITTED
}
READ WRITE | READ ONLY
CHECKPOINT
Força um ponto de verificação do log de transações.
CHECKPOINT
FECHAR
Feche um cursor.
CLOSE name
GRUPO
Agrupe uma tabela de acordo com um índice.
CLUSTER index_name ON table_name
CLUSTER table_name
CLUSTER
COMENTE
Defina ou altere o comentário de um objeto.
COMMENT ON {
TABLE object_name |
COLUMN table_name.column_name |
AGGREGATE agg_name (agg_type) |
CAST (source_type AS target_type) |
CONSTRAINT constraint_name ON table_name |
CONVERSION object_name |
DATABASE object_name |
DOMAIN object_name |
FUNCTION func_name (arg1_type, arg2_type, ...) |
INDEX object_name |
LARGE OBJECT large_object_oid |
OPERATOR op (left_operand_type, right_operand_type) |
OPERATOR CLASS object_name USING index_method |
[ PROCEDURAL ] LANGUAGE object_name |
RULE rule_name ON table_name |
SCHEMA object_name |
SEQUENCE object_name |
TRIGGER trigger_name ON table_name |
TYPE object_name |
VIEW object_name
}
IS 'text'
COMPROMETE
Confirme a transação atual.
COMMIT [ WORK | TRANSACTION ]
CÓPIA DE
Copie dados entre um arquivo e uma tabela.
COPY table_name [ ( column [, ...] ) ]
FROM { 'filename' | STDIN }
[ WITH ]
[ BINARY ]
[ OIDS ]
[ DELIMITER [ AS ] 'delimiter' ]
[ NULL [ AS ] 'null string' ]
[ CSV [ QUOTE [ AS ] 'quote' ]
[ ESCAPE [ AS ] 'escape' ]
[ FORCE NOT NULL column [, ...] ]
COPY table_name [ ( column [, ...] ) ]
TO { 'filename' | STDOUT }
[ [ WITH ]
[ BINARY ]
[ OIDS ]
[ DELIMITER [ AS ] 'delimiter' ]
[ NULL [ AS ] 'null string' ]
[ CSV [ QUOTE [ AS ] 'quote' ]
[ ESCAPE [ AS ] 'escape' ]
[ FORCE QUOTE column [, ...] ]
CRIAR AGREGADO
Defina uma nova função de agregação.
CREATE AGGREGATE name (
BASETYPE = input_data_type,
SFUNC = sfunc,
STYPE = state_data_type
[, FINALFUNC = ffunc ]
[, INITCOND = initial_condition ]
)
CRIAR CAST
Defina um novo elenco.
CREATE CAST (source_type AS target_type)
WITH FUNCTION func_name (arg_types)
[ AS ASSIGNMENT | AS IMPLICIT ]
CREATE CAST (source_type AS target_type)
WITHOUT FUNCTION
[ AS ASSIGNMENT | AS IMPLICIT ]
CRIAR CONSTRAINT TRIGGER
Defina um novo gatilho de restrição.
CREATE CONSTRAINT TRIGGER name
AFTER events ON
table_name constraint attributes
FOR EACH ROW EXECUTE PROCEDURE func_name ( args )
CRIAR CONVERSÃO
Defina uma nova conversão.
CREATE [DEFAULT] CONVERSION name
FOR source_encoding TO dest_encoding FROM func_name
CRIAR BASE DE DADOS
Crie um novo banco de dados.
CREATE DATABASE name
[ [ WITH ] [ OWNER [=] db_owner ]
[ TEMPLATE [=] template ]
[ ENCODING [=] encoding ]
[ TABLESPACE [=] tablespace ]
]
CRIAR DOMÍNIO
Defina um novo domínio.
CREATE DOMAIN name [AS] data_type
[ DEFAULT expression ]
[ constraint [ ... ] ]
Onde a restrição é -
[ CONSTRAINT constraint_name ]
{ NOT NULL | NULL | CHECK (expression) }
CRIAR FUNÇÃO
Defina uma nova função.
CREATE [ OR REPLACE ] FUNCTION name ( [ [ arg_name ] arg_type [, ...] ] )
RETURNS ret_type
{ LANGUAGE lang_name
| IMMUTABLE | STABLE | VOLATILE
| CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT
| [ EXTERNAL ] SECURITY INVOKER | [ EXTERNAL ] SECURITY DEFINER
| AS 'definition'
| AS 'obj_file', 'link_symbol'
} ...
[ WITH ( attribute [, ...] ) ]
CRIAR GRUPO
Defina um novo grupo de usuários.
CREATE GROUP name [ [ WITH ] option [ ... ] ]
Where option can be:
SYSID gid
| USER username [, ...]
CRIAR ÍNDICE
Defina um novo índice.
CREATE [ UNIQUE ] INDEX name ON table [ USING method ]
( { column | ( expression ) } [ opclass ] [, ...] )
[ TABLESPACE tablespace ]
[ WHERE predicate ]
CRIAR IDIOMA
Defina uma nova linguagem procedural.
CREATE [ TRUSTED ] [ PROCEDURAL ] LANGUAGE name
HANDLER call_handler [ VALIDATOR val_function ]
CRIAR OPERADOR
Defina um novo operador.
CREATE OPERATOR name (
PROCEDURE = func_name
[, LEFTARG = left_type ] [, RIGHTARG = right_type ]
[, COMMUTATOR = com_op ] [, NEGATOR = neg_op ]
[, RESTRICT = res_proc ] [, JOIN = join_proc ]
[, HASHES ] [, MERGES ]
[, SORT1 = left_sort_op ] [, SORT2 = right_sort_op ]
[, LTCMP = less_than_op ] [, GTCMP = greater_than_op ]
)
CRIAR AULA DE OPERADOR
Defina uma nova classe de operador.
CREATE OPERATOR CLASS name [ DEFAULT ] FOR TYPE data_type
USING index_method AS
{ OPERATOR strategy_number operator_name [ ( op_type, op_type ) ] [ RECHECK ]
| FUNCTION support_number func_name ( argument_type [, ...] )
| STORAGE storage_type
} [, ... ]
CRIAR REGRA
Defina uma nova regra de reescrita.
CREATE [ OR REPLACE ] RULE name AS ON event
TO table [ WHERE condition ]
DO [ ALSO | INSTEAD ] { NOTHING | command | ( command ; command ... ) }
CRIAR ESQUEMA
Defina um novo esquema.
CREATE SCHEMA schema_name
[ AUTHORIZATION username ] [ schema_element [ ... ] ]
CREATE SCHEMA AUTHORIZATION username
[ schema_element [ ... ] ]
CRIAR SEQUÊNCIA
Defina um novo gerador de sequência.
CREATE [ TEMPORARY | TEMP ] SEQUENCE name
[ INCREMENT [ BY ] increment ]
[ MINVALUE minvalue | NO MINVALUE ]
[ MAXVALUE maxvalue | NO MAXVALUE ]
[ START [ WITH ] start ] [ CACHE cache ] [ [ NO ] CYCLE ]
CRIAR A TABELA
Defina uma nova tabela.
CREATE [ [ GLOBAL | LOCAL ] {
TEMPORARY | TEMP } ] TABLE table_name ( {
column_name data_type [ DEFAULT default_expr ] [ column_constraint [ ... ] ]
| table_constraint
| LIKE parent_table [ { INCLUDING | EXCLUDING } DEFAULTS ]
} [, ... ]
)
[ INHERITS ( parent_table [, ... ] ) ]
[ WITH OIDS | WITHOUT OIDS ]
[ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ]
[ TABLESPACE tablespace ]
Onde column_constraint é -
[ CONSTRAINT constraint_name ] {
NOT NULL |
NULL |
UNIQUE [ USING INDEX TABLESPACE tablespace ] |
PRIMARY KEY [ USING INDEX TABLESPACE tablespace ] |
CHECK (expression) |
REFERENCES ref_table [ ( ref_column ) ]
[ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ]
[ ON DELETE action ] [ ON UPDATE action ]
}
[ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]
E table_constraint é -
[ CONSTRAINT constraint_name ]
{ UNIQUE ( column_name [, ... ] ) [ USING INDEX TABLESPACE tablespace ] |
PRIMARY KEY ( column_name [, ... ] ) [ USING INDEX TABLESPACE tablespace ] |
CHECK ( expression ) |
FOREIGN KEY ( column_name [, ... ] )
REFERENCES ref_table [ ( ref_column [, ... ] ) ]
[ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ]
[ ON DELETE action ] [ ON UPDATE action ] }
[ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]
CRIAR TABELA COMO
Defina uma nova tabela a partir dos resultados de uma consulta.
CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } ] TABLE table_name
[ (column_name [, ...] ) ] [ [ WITH | WITHOUT ] OIDS ]
AS query
CRIAR TABLESPACE
Defina um novo espaço de tabela.
CREATE TABLESPACE tablespace_name [ OWNER username ] LOCATION 'directory'
CRIAR TRIGGER
Defina um novo gatilho.
CREATE TRIGGER name { BEFORE | AFTER } { event [ OR ... ] }
ON table [ FOR [ EACH ] { ROW | STATEMENT } ]
EXECUTE PROCEDURE func_name ( arguments )
CRIAR TIPO
Defina um novo tipo de dados.
CREATE TYPE name AS
( attribute_name data_type [, ... ] )
CREATE TYPE name (
INPUT = input_function,
OUTPUT = output_function
[, RECEIVE = receive_function ]
[, SEND = send_function ]
[, ANALYZE = analyze_function ]
[, INTERNALLENGTH = { internal_length | VARIABLE } ]
[, PASSEDBYVALUE ]
[, ALIGNMENT = alignment ]
[, STORAGE = storage ]
[, DEFAULT = default ]
[, ELEMENT = element ]
[, DELIMITER = delimiter ]
)
CRIAR USUÁRIO
Defina uma nova conta de usuário do banco de dados.
CREATE USER name [ [ WITH ] option [ ... ] ]
Onde a opção pode ser -
SYSID uid
| [ ENCRYPTED | UNENCRYPTED ] PASSWORD 'password'
| CREATEDB | NOCREATEDB
| CREATEUSER | NOCREATEUSER
| IN GROUP group_name [, ...]
| VALID UNTIL 'abs_time'
CRIAR VISUALIZAÇÃO
Defina uma nova visão.
CREATE [ OR REPLACE ] VIEW name [ ( column_name [, ...] ) ] AS query
DEALOCAR
Desalocar uma declaração preparada.
DEALLOCATE [ PREPARE ] plan_name
DECLARAR
Defina um cursor.
DECLARE name [ BINARY ] [ INSENSITIVE ] [ [ NO ] SCROLL ]
CURSOR [ { WITH | WITHOUT } HOLD ] FOR query
[ FOR { READ ONLY | UPDATE [ OF column [, ...] ] } ]
EXCLUIR
Exclua linhas de uma tabela.
DELETE FROM [ ONLY ] table [ WHERE condition ]
DROP AGGREGATE
Remova uma função agregada.
DROP AGGREGATE name ( type ) [ CASCADE | RESTRICT ]
DROP CAST
Remova um gesso.
DROP CAST (source_type AS target_type) [ CASCADE | RESTRICT ]
DROP CONVERSION
Remova uma conversão.
DROP CONVERSION name [ CASCADE | RESTRICT ]
DROP DATABASE
Remova um banco de dados.
DROP DATABASE name
DROP DOMAIN
Remova um domínio.
DROP DOMAIN name [, ...] [ CASCADE | RESTRICT ]
FUNÇÃO DROP
Remova uma função.
DROP FUNCTION name ( [ type [, ...] ] ) [ CASCADE | RESTRICT ]
DROP GROUP
Remova um grupo de usuários.
DROP GROUP name
DROP INDEX
Remova um índice.
DROP INDEX name [, ...] [ CASCADE | RESTRICT ]
DROP LANGUAGE
Remova uma linguagem procedural.
DROP [ PROCEDURAL ] LANGUAGE name [ CASCADE | RESTRICT ]
OPERADOR DE SOLDA
Remova um operador.
DROP OPERATOR name ( { left_type | NONE }, { right_type | NONE } )
[ CASCADE | RESTRICT ]
DROP OPERATOR CLASS
Remova uma classe de operadores.
DROP OPERATOR CLASS name USING index_method [ CASCADE | RESTRICT ]
REGRA DE DROP
Remova uma regra de reescrita.
DROP RULE name ON relation [ CASCADE | RESTRICT ]
ESQUEMA DROP
Remova um esquema.
DROP SCHEMA name [, ...] [ CASCADE | RESTRICT ]
DROP SEQUENCE
Remova uma sequência.
DROP SEQUENCE name [, ...] [ CASCADE | RESTRICT ]
DROP TABLE
Remova uma mesa.
DROP TABLE name [, ...] [ CASCADE | RESTRICT ]
DROP TABLESPACE
Remova um espaço de tabela.
DROP TABLESPACE tablespace_name
DROP TRIGGER
Remova um gatilho.
DROP TRIGGER name ON table [ CASCADE | RESTRICT ]
DROP TYPE
Remova um tipo de dados.
DROP TYPE name [, ...] [ CASCADE | RESTRICT ]
DROP USER
Remova uma conta de usuário do banco de dados.
DROP USER name
DROP VIEW
Remova uma vista.
DROP VIEW name [, ...] [ CASCADE | RESTRICT ]
FIM
Confirme a transação atual.
END [ WORK | TRANSACTION ]
EXECUTAR
Execute uma declaração preparada.
EXECUTE plan_name [ (parameter [, ...] ) ]
EXPLICAR
Mostre o plano de execução de uma declaração.
EXPLAIN [ ANALYZE ] [ VERBOSE ] statement
BUSCAR
Recupere linhas de uma consulta usando um cursor.
FETCH [ direction { FROM | IN } ] cursor_name
Onde a direção pode ser vazia ou uma de -
NEXT
PRIOR
FIRST
LAST
ABSOLUTE count
RELATIVE count
count
ALL
FORWARD
FORWARD count
FORWARD ALL
BACKWARD
BACKWARD count
BACKWARD ALL
CONCEDER
Defina os privilégios de acesso.
GRANT { { SELECT | INSERT | UPDATE | DELETE | RULE | REFERENCES | TRIGGER }
[,...] | ALL [ PRIVILEGES ] }
ON [ TABLE ] table_name [, ...]
TO { username | GROUP group_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]
GRANT { { CREATE | TEMPORARY | TEMP } [,...] | ALL [ PRIVILEGES ] }
ON DATABASE db_name [, ...]
TO { username | GROUP group_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]
GRANT { CREATE | ALL [ PRIVILEGES ] }
ON TABLESPACE tablespace_name [, ...]
TO { username | GROUP group_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]
GRANT { EXECUTE | ALL [ PRIVILEGES ] }
ON FUNCTION func_name ([type, ...]) [, ...]
TO { username | GROUP group_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]
GRANT { USAGE | ALL [ PRIVILEGES ] }
ON LANGUAGE lang_name [, ...]
TO { username | GROUP group_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]
GRANT { { CREATE | USAGE } [,...] | ALL [ PRIVILEGES ] }
ON SCHEMA schema_name [, ...]
TO { username | GROUP group_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]
INSERIR
Crie novas linhas em uma tabela.
INSERT INTO table [ ( column [, ...] ) ]
{ DEFAULT VALUES | VALUES ( { expression | DEFAULT } [, ...] ) | query }
OUÇO
Ouça uma notificação.
LISTEN name
CARGA
Carregue ou recarregue um arquivo de biblioteca compartilhada.
LOAD 'filename'
LOCK
Tranque uma mesa.
LOCK [ TABLE ] name [, ...] [ IN lock_mode MODE ] [ NOWAIT ]
Onde lock_mode é um de -
ACCESS SHARE | ROW SHARE | ROW EXCLUSIVE | SHARE UPDATE EXCLUSIVE
| SHARE | SHARE ROW EXCLUSIVE | EXCLUSIVE | ACCESS EXCLUSIVE
MOVER
Posicione um cursor.
MOVE [ direction { FROM | IN } ] cursor_name
NOTIFICAR
Gere uma notificação.
NOTIFY name
PREPARAR
Prepare uma declaração para execução.
PREPARE plan_name [ (data_type [, ...] ) ] AS statement
REINDEX
Recompile índices.
REINDEX { DATABASE | TABLE | INDEX } name [ FORCE ]
RELEASE SAVEPOINT
Destrua um ponto de salvamento previamente definido.
RELEASE [ SAVEPOINT ] savepoint_name
REDEFINIR
Restaure o valor de um parâmetro de tempo de execução para o valor padrão.
RESET name
RESET ALL
REVOGAR
Remova os privilégios de acesso.
REVOKE [ GRANT OPTION FOR ]
{ { SELECT | INSERT | UPDATE | DELETE | RULE | REFERENCES | TRIGGER }
[,...] | ALL [ PRIVILEGES ] }
ON [ TABLE ] table_name [, ...]
FROM { username | GROUP group_name | PUBLIC } [, ...]
[ CASCADE | RESTRICT ]
REVOKE [ GRANT OPTION FOR ]
{ { CREATE | TEMPORARY | TEMP } [,...] | ALL [ PRIVILEGES ] }
ON DATABASE db_name [, ...]
FROM { username | GROUP group_name | PUBLIC } [, ...]
[ CASCADE | RESTRICT ]
REVOKE [ GRANT OPTION FOR ]
{ CREATE | ALL [ PRIVILEGES ] }
ON TABLESPACE tablespace_name [, ...]
FROM { username | GROUP group_name | PUBLIC } [, ...]
[ CASCADE | RESTRICT ]
REVOKE [ GRANT OPTION FOR ]
{ EXECUTE | ALL [ PRIVILEGES ] }
ON FUNCTION func_name ([type, ...]) [, ...]
FROM { username | GROUP group_name | PUBLIC } [, ...]
[ CASCADE | RESTRICT ]
REVOKE [ GRANT OPTION FOR ]
{ USAGE | ALL [ PRIVILEGES ] }
ON LANGUAGE lang_name [, ...]
FROM { username | GROUP group_name | PUBLIC } [, ...]
[ CASCADE | RESTRICT ]
REVOKE [ GRANT OPTION FOR ]
{ { CREATE | USAGE } [,...] | ALL [ PRIVILEGES ] }
ON SCHEMA schema_name [, ...]
FROM { username | GROUP group_name | PUBLIC } [, ...]
[ CASCADE | RESTRICT ]
ROLLBACK
Aborte a transação atual.
ROLLBACK [ WORK | TRANSACTION ]
ROLLBACK TO SAVEPOINT
Reverta para um ponto de salvamento.
ROLLBACK [ WORK | TRANSACTION ] TO [ SAVEPOINT ] savepoint_name
SALVAR PONTO
Defina um novo ponto de salvamento na transação atual.
SAVEPOINT savepoint_name
SELECIONE
Recupere linhas de uma tabela ou exibição.
SELECT [ ALL | DISTINCT [ ON ( expression [, ...] ) ] ]
* | expression [ AS output_name ] [, ...]
[ FROM from_item [, ...] ]
[ WHERE condition ]
[ GROUP BY expression [, ...] ]
[ HAVING condition [, ...] ]
[ { UNION | INTERSECT | EXCEPT } [ ALL ] select ]
[ ORDER BY expression [ ASC | DESC | USING operator ] [, ...] ]
[ LIMIT { count | ALL } ]
[ OFFSET start ]
[ FOR UPDATE [ OF table_name [, ...] ] ]
from_item
[ ONLY ] table_name [ * ] [ [ AS ] alias [ ( column_alias [, ...] ) ] ]
( select ) [ AS ] alias [ ( column_alias [, ...] ) ]
function_name ( [ argument [, ...] ] )
[ AS ] alias [ ( column_alias [, ...] | column_definition [, ...] ) ]
function_name ( [ argument [, ...] ] ) AS ( column_definition [, ...] )
from_item [ NATURAL ] join_type from_item
[ ON join_condition | USING ( join_column [, ...] ) ]
SELECIONE EM
Defina uma nova tabela a partir dos resultados de uma consulta.
SELECT [ ALL | DISTINCT [ ON ( expression [, ...] ) ] ]
* | expression [ AS output_name ] [, ...]
INTO [ TEMPORARY | TEMP ] [ TABLE ] new_table
[ FROM from_item [, ...] ]
[ WHERE condition ]
[ GROUP BY expression [, ...] ]
[ HAVING condition [, ...] ]
[ { UNION | INTERSECT | EXCEPT } [ ALL ] select ]
[ ORDER BY expression [ ASC | DESC | USING operator ] [, ...] ]
[ LIMIT { count | ALL } ]
[ OFFSET start ]
[ FOR UPDATE [ OF table_name [, ...] ] ]
CONJUNTO
Altere um parâmetro de tempo de execução.
SET [ SESSION | LOCAL ] name { TO | = } { value | 'value' | DEFAULT }
SET [ SESSION | LOCAL ] TIME ZONE { time_zone | LOCAL | DEFAULT }
DEFINIR RESTRIÇÕES
Defina os modos de verificação de restrição para a transação atual.
SET CONSTRAINTS { ALL | name [, ...] } { DEFERRED | IMMEDIATE }
DEFINIR AUTORIZAÇÃO DE SESSÃO
Defina o identificador do usuário da sessão e o identificador do usuário atual da sessão atual.
SET [ SESSION | LOCAL ] SESSION AUTHORIZATION username
SET [ SESSION | LOCAL ] SESSION AUTHORIZATION DEFAULT
RESET SESSION AUTHORIZATION
DEFINIR A TRANSAÇÃO
Defina as características da transação atual.
SET TRANSACTION transaction_mode [, ...]
SET SESSION CHARACTERISTICS AS TRANSACTION transaction_mode [, ...]
Onde transaction_mode é um de -
ISOLATION LEVEL { SERIALIZABLE | REPEATABLE READ | READ COMMITTED
| READ UNCOMMITTED }
READ WRITE | READ ONLY
EXPOSIÇÃO
Mostra o valor de um parâmetro de tempo de execução.
SHOW name
SHOW ALL
INICIAR TRANSAÇÃO
Inicie um bloco de transação.
START TRANSACTION [ transaction_mode [, ...] ]
Onde transaction_mode é um de -
ISOLATION LEVEL { SERIALIZABLE | REPEATABLE READ | READ COMMITTED
| READ UNCOMMITTED }
READ WRITE | READ ONLY
TRUNCAR
Esvazie uma mesa.
TRUNCATE [ TABLE ] name
UNLISTEN
Pare de ouvir uma notificação.
UNLISTEN { name | * }
ATUALIZAR
Atualize as linhas de uma tabela.
UPDATE [ ONLY ] table SET column = { expression | DEFAULT } [, ...]
[ FROM from_list ]
[ WHERE condition ]
VÁCUO
Colete o lixo e, opcionalmente, analise um banco de dados.
VACUUM [ FULL ] [ FREEZE ] [ VERBOSE ] [ table ]
VACUUM [ FULL ] [ FREEZE ] [ VERBOSE ] ANALYZE [ table [ (column [, ...] ) ] ]
Neste capítulo, discutiremos sobre os tipos de dados usados no PostgreSQL. Ao criar a tabela, para cada coluna, você especifica um tipo de dados, ou seja, que tipo de dados deseja armazenar nos campos da tabela.
Isso permite vários benefícios -
Consistency - As operações em colunas do mesmo tipo de dados fornecem resultados consistentes e geralmente são as mais rápidas.
Validation - O uso adequado de tipos de dados implica validação de formato de dados e rejeição de dados fora do escopo do tipo de dados.
Compactness - Como uma coluna pode armazenar um único tipo de valor, ele é armazenado de forma compacta.
Performance- O uso adequado de tipos de dados fornece o armazenamento de dados mais eficiente. Os valores armazenados podem ser processados rapidamente, o que melhora o desempenho.
PostgreSQL oferece suporte a um amplo conjunto de tipos de dados. Além disso, os usuários podem criar seus próprios tipos de dados personalizados usando o comando CREATE TYPE SQL. Existem diferentes categorias de tipos de dados no PostgreSQL. Eles são discutidos abaixo.
Tipos Numéricos
Os tipos numéricos consistem em números inteiros de dois, quatro e oito bytes, números de ponto flutuante de quatro e oito bytes e decimais de precisão selecionável. A tabela a seguir lista os tipos disponíveis.
Nome | Tamanho de Armazenamento | Descrição | Alcance |
---|---|---|---|
smallint | 2 bytes | inteiro de pequeno alcance | -32768 a +32767 |
inteiro | 4 bytes | escolha típica para inteiro | -2147483648 a +2147483647 |
bigint | 8 bytes | inteiro de grande alcance | -9223372036854775808 a 9223372036854775807 |
decimal | variável | precisão especificada pelo usuário, exata | até 131072 dígitos antes da vírgula decimal; até 16383 dígitos após o ponto decimal |
numérico | variável | precisão especificada pelo usuário, exata | até 131072 dígitos antes da vírgula decimal; até 16383 dígitos após o ponto decimal |
real | 4 bytes | precisão variável, inexata | Precisão de 6 dígitos decimais |
dupla precisão | 8 bytes | precisão variável, inexata | Precisão de 15 dígitos decimais |
pequeno | 2 bytes | pequeno inteiro de incremento automático | 1 a 32767 |
serial | 4 bytes | número inteiro autoincrementado | 1 a 2147483647 |
grande série | 8 bytes | grande número inteiro de incremento automático | 1 a 9223372036854775807 |
Tipos monetários
O tipo de dinheiro armazena uma quantia em moeda com uma precisão fracionária fixa. Os valores dos tipos de dados numéricos, int e bigint podem ser convertidos em dinheiro . O uso de números de ponto flutuante não é recomendado para lidar com dinheiro devido ao potencial de erros de arredondamento.
Nome | Tamanho de Armazenamento | Descrição | Alcance |
---|---|---|---|
dinheiro | 8 bytes | quantidade de moeda | -92233720368547758,08 a +92233720368547758,07 |
Tipos de personagem
A tabela abaixo lista os tipos de caracteres de uso geral disponíveis no PostgreSQL.
S. No. | Nome e Descrição |
---|---|
1 | character varying(n), varchar(n) comprimento variável com limite |
2 | character(n), char(n) comprimento fixo, preenchido em branco |
3 | text comprimento ilimitado variável |
Tipos de dados binários
O tipo de dados bytea permite o armazenamento de strings binárias como na tabela abaixo.
Nome | Tamanho de Armazenamento | Descrição |
---|---|---|
tchau | 1 ou 4 bytes mais a string binária real | string binária de comprimento variável |
Tipos de data / hora
O PostgreSQL suporta um conjunto completo de tipos de data e hora SQL, conforme mostrado na tabela abaixo. As datas são contadas de acordo com o calendário gregoriano. Aqui, todos os tipos têm resolução de1 microsecond / 14 digits exceto date tipo, cuja resolução é day.
Nome | Tamanho de Armazenamento | Descrição | Baixo valor | Valor alto |
---|---|---|---|---|
carimbo de data / hora [(p)] [sem fuso horário] | 8 bytes | data e hora (sem fuso horário) | 4713 AC | 294276 DC |
TIMESTAMPTZ | 8 bytes | data e hora, com fuso horário | 4713 AC | 294276 DC |
encontro | 4 bytes | data (sem hora do dia) | 4713 AC | 5874897 DC |
hora [(p)] [sem fuso horário] | 8 bytes | hora do dia (sem data) | 00:00:00 | 24:00:00 |
hora [(p)] com fuso horário | 12 bytes | somente horas do dia, com fuso horário | 00: 00: 00 + 1459 | 24: 00-1459 |
intervalo [campos] [(p)] | 12 bytes | intervalo de tempo | -178000000 anos | 178000000 anos |
Tipo Booleano
PostgreSQL fornece o tipo Booleano SQL padrão. O tipo de dados booleano pode ter os estados verdadeiro , falso e um terceiro estado, desconhecido , que é representado pelo valor nulo SQL.
Nome | Tamanho de Armazenamento | Descrição |
---|---|---|
boleano | 1 byte | estado de verdadeiro ou falso |
Tipo Enumerado
Tipos enumerados (enum) são tipos de dados que compreendem um conjunto de valores estáticos e ordenados. Eles são equivalentes aos tipos de enum suportados em várias linguagens de programação.
Ao contrário de outros tipos, os tipos enumerados precisam ser criados usando o comando CREATE TYPE. Esse tipo é usado para armazenar um conjunto de valores estáticos e ordenados. Por exemplo, direções de bússola, ou seja, NORTE, SUL, EAST e OESTE ou dias da semana como mostrado abaixo -
CREATE TYPE week AS ENUM ('Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun');
Enumerado, uma vez criado, pode ser usado como qualquer outro tipo.
Tipo Geométrico
Os tipos de dados geométricos representam objetos espaciais bidimensionais. O tipo mais fundamental, o ponto, forma a base de todos os outros tipos.
Nome | Tamanho de Armazenamento | Representação | Descrição |
---|---|---|---|
ponto | 16 bytes | Aponte em um avião | (x, y) |
linha | 32 bytes | Linha infinita (não totalmente implementada) | ((x1, y1), (x2, y2)) |
lseg | 32 bytes | Segmento de linha finita | ((x1, y1), (x2, y2)) |
caixa | 32 bytes | Caixa Retangular | ((x1, y1), (x2, y2)) |
caminho | 16 + 16n bytes | Caminho fechado (semelhante ao polígono) | ((x1, y1), ...) |
caminho | 16 + 16n bytes | Caminho aberto | [(x1, y1), ...] |
polígono | 40 + 16n | Polígono (semelhante ao caminho fechado) | ((x1, y1), ...) |
círculo | 24 bytes | Círculo | <(x, y), r> (ponto central e raio) |
Tipo de endereço de rede
PostgreSQL oferece tipos de dados para armazenar endereços IPv4, IPv6 e MAC. É melhor usar esses tipos em vez de tipos de texto simples para armazenar endereços de rede, porque esses tipos oferecem verificação de erro de entrada e operadores e funções especializados.
Nome | Tamanho de Armazenamento | Descrição |
---|---|---|
cidr | 7 ou 19 bytes | Redes IPv4 e IPv6 |
inet | 7 ou 19 bytes | Hosts e redes IPv4 e IPv6 |
macaddr | 6 bytes | Endereços MAC |
Tipo de seqüência de bits
Os tipos de sequência de bits são usados para armazenar máscaras de bits. Eles são 0 ou 1. Existem dois tipos de bits SQL:bit(n) e bit varying(n), onde n é um número inteiro positivo.
Tipo de pesquisa de texto
Esse tipo oferece suporte à pesquisa de texto completo, que é a atividade de pesquisar uma coleção de documentos em linguagem natural para localizar aqueles que melhor correspondem a uma consulta. Existem dois tipos de dados para isso -
S. No. | Nome e Descrição |
---|---|
1 | tsvector Esta é uma lista classificada de palavras distintas que foram normalizadas para mesclar diferentes variantes da mesma palavra, chamadas de "lexemas". |
2 | tsquery Isso armazena lexemas que devem ser pesquisados e os combina respeitando os operadores booleanos & (AND), | (Ou e ! (NÃO). Os parênteses podem ser usados para forçar o agrupamento dos operadores. |
Tipo UUID
Um UUID (Universally Unique Identifiers) é escrito como uma sequência de dígitos hexadecimais minúsculos, em vários grupos separados por hifens, especificamente um grupo de oito dígitos, seguido por três grupos de quatro dígitos, seguido por um grupo de 12 dígitos, para um total de 32 dígitos que representam os 128 bits.
Um exemplo de UUID é - 550e8400-e29b-41d4-a716-446655440000
Tipo XML
O tipo de dados XML pode ser usado para armazenar dados XML. Para armazenar dados XML, primeiro você deve criar valores XML usando a função xmlparse da seguinte forma -
XMLPARSE (DOCUMENT '<?xml version="1.0"?>
<tutorial>
<title>PostgreSQL Tutorial </title>
<topics>...</topics>
</tutorial>')
XMLPARSE (CONTENT 'xyz<foo>bar</foo><bar>foo</bar>')
Tipo JSON
O tipo de dados json pode ser usado para armazenar dados JSON (JavaScript Object Notation). Esses dados também podem ser armazenados como texto , mas o tipo de dados json tem a vantagem de verificar se cada valor armazenado é um valor JSON válido. Também estão disponíveis funções de suporte relacionadas, que podem ser usadas diretamente para lidar com o tipo de dados JSON da seguinte maneira.
Exemplo | Resultado de exemplo |
---|---|
array_to_json ('{{1,5}, {99,100}}' :: int []) | [[1,5], [99,100]] |
row_to_json (linha (1, 'foo')) | {"f1": 1, "f2": "foo"} |
Tipo de Matriz
O PostgreSQL oferece a oportunidade de definir uma coluna de uma tabela como um array multidimensional de comprimento variável. Matrizes de qualquer tipo de base, tipo enum ou tipo composto integrado ou definido pelo usuário podem ser criadas.
Declaração de Matrizes
O tipo de matriz pode ser declarado como
CREATE TABLE monthly_savings (
name text,
saving_per_quarter integer[],
scheme text[][]
);
ou usando a palavra-chave "ARRAY" como
CREATE TABLE monthly_savings (
name text,
saving_per_quarter integer ARRAY[4],
scheme text[][]
);
Inserindo valores
Os valores da matriz podem ser inseridos como uma constante literal, colocando os valores dos elementos entre chaves e separando-os por vírgulas. Um exemplo é mostrado abaixo -
INSERT INTO monthly_savings
VALUES (‘Manisha’,
‘{20000, 14600, 23500, 13250}’,
‘{{“FD”, “MF”}, {“FD”, “Property”}}’);
Acessando matrizes
Um exemplo para acessar Arrays é mostrado abaixo. O comando dado abaixo selecionará as pessoas cujas economias são maiores no segundo trimestre do que no quarto trimestre.
SELECT name FROM monhly_savings WHERE saving_per_quarter[2] > saving_per_quarter[4];
Modificação de matrizes
Um exemplo de modificação de matrizes é mostrado abaixo.
UPDATE monthly_savings SET saving_per_quarter = '{25000,25000,27000,27000}'
WHERE name = 'Manisha';
ou usando a sintaxe de expressão ARRAY -
UPDATE monthly_savings SET saving_per_quarter = ARRAY[25000,25000,27000,27000]
WHERE name = 'Manisha';
Pesquisando matrizes
Um exemplo de pesquisa de matrizes é mostrado abaixo.
SELECT * FROM monthly_savings WHERE saving_per_quarter[1] = 10000 OR
saving_per_quarter[2] = 10000 OR
saving_per_quarter[3] = 10000 OR
saving_per_quarter[4] = 10000;
Se o tamanho da matriz for conhecido, o método de pesquisa fornecido acima pode ser usado. Caso contrário, o exemplo a seguir mostra como pesquisar quando o tamanho não é conhecido.
SELECT * FROM monthly_savings WHERE 10000 = ANY (saving_per_quarter);
Tipos Compostos
Este tipo representa uma lista de nomes de campos e seus tipos de dados, ou seja, estrutura de uma linha ou registro de uma tabela.
Declaração de tipos compostos
O exemplo a seguir mostra como declarar um tipo composto
CREATE TYPE inventory_item AS (
name text,
supplier_id integer,
price numeric
);
Este tipo de dados pode ser usado nas tabelas de criação conforme abaixo -
CREATE TABLE on_hand (
item inventory_item,
count integer
);
Entrada de valor composto
Os valores compostos podem ser inseridos como uma constante literal, colocando os valores dos campos entre parênteses e separando-os por vírgulas. Um exemplo é mostrado abaixo -
INSERT INTO on_hand VALUES (ROW('fuzzy dice', 42, 1.99), 1000);
Isso é válido para o inventário_item definido acima. A palavra-chave ROW é opcional, desde que você tenha mais de um campo na expressão.
Acessando Tipos Compostos
Para acessar um campo de uma coluna composta, use um ponto seguido do nome do campo, da mesma forma que selecionar um campo em um nome de tabela. Por exemplo, para selecionar alguns subcampos de nossa tabela de exemplo on_hand, a consulta seria como mostrado abaixo -
SELECT (item).name FROM on_hand WHERE (item).price > 9.99;
Você também pode usar o nome da tabela (por exemplo, em uma consulta multi-tabelas), como este -
SELECT (on_hand.item).name FROM on_hand WHERE (on_hand.item).price > 9.99;
Tipos de intervalo
Os tipos de intervalo representam tipos de dados que usam um intervalo de dados. O tipo de intervalo pode ser intervalos discretos (por exemplo, todos os valores inteiros de 1 a 10) ou intervalos contínuos (por exemplo, qualquer ponto no tempo entre 10h00 e 11h00).
Os tipos de intervalos integrados disponíveis incluem os seguintes intervalos -
int4range - Intervalo de inteiro
int8range - Alcance de bigint
numrange - Variação numérica
tsrange - Intervalo de carimbo de data / hora sem fuso horário
tstzrange - Intervalo de carimbo de data / hora com fuso horário
daterange - Intervalo de data
Os tipos de intervalos personalizados podem ser criados para disponibilizar novos tipos de intervalos, como intervalos de endereços IP usando o tipo inet como base, ou intervalos flutuantes usando o tipo de dados flutuante como base.
Os tipos de intervalo oferecem suporte a limites de intervalo inclusivos e exclusivos usando os caracteres [] e (), respectivamente. Por exemplo, '[4,9)' representa todos os inteiros começando de e incluindo 4 até, mas não incluindo 9.
Tipos de identificador de objeto
Os identificadores de objeto (OIDs) são usados internamente pelo PostgreSQL como chaves primárias para várias tabelas do sistema. Se WITH OIDS for especificado ou a variável de configuração default_with_oids estiver habilitada, somente então, em tais casos, OIDs serão adicionados às tabelas criadas pelo usuário. A tabela a seguir lista vários tipos de alias. Os tipos de alias OID não têm operações próprias, exceto para rotinas de entrada e saída especializadas.
Nome | Referências | Descrição | Exemplo de valor |
---|---|---|---|
oid | qualquer | identificador numérico de objeto | 564182 |
regproc | pg_proc | nome da função | soma |
procedimento normativo | pg_proc | função com tipos de argumento | soma (int4) |
regoper | pg_operator | nome do operador | + |
regoperador | pg_operator | operador com tipos de argumento | * (inteiro, inteiro) ou - (NENHUM, inteiro) |
regclass | pg_class | nome da relação | pg_type |
regtype | pg_type | nome do tipo de dados | inteiro |
regconfig | pg_ts_config | configuração de pesquisa de texto | Inglês |
regdictionary | pg_ts_dict | dicionário de pesquisa de texto | simples |
Pseudo tipos
O sistema de tipos do PostgreSQL contém várias entradas de propósito especial que são chamadas coletivamente de pseudo-tipos. Um pseudo-tipo não pode ser usado como um tipo de dados de coluna, mas pode ser usado para declarar o argumento de uma função ou tipo de resultado.
A tabela abaixo lista os pseudo-tipos existentes.
S. No. | Nome e Descrição |
---|---|
1 | any Indica que uma função aceita qualquer tipo de dado de entrada. |
2 | anyelement Indica que uma função aceita qualquer tipo de dados. |
3 | anyarray Indica que uma função aceita qualquer tipo de dados de matriz. |
4 | anynonarray Indica que uma função aceita qualquer tipo de dados que não seja de matriz. |
5 | anyenum Indica que uma função aceita qualquer tipo de dados enum. |
6 | anyrange Indica que uma função aceita qualquer tipo de dado de intervalo. |
7 | cstring Indica que uma função aceita ou retorna uma string C terminada em nulo. |
8 | internal Indica que uma função aceita ou retorna um tipo de dados interno do servidor. |
9 | language_handler Um manipulador de chamada de linguagem procedural é declarado para retornar language_handler. |
10 | fdw_handler Um manipulador de wrapper de dados externos é declarado para retornar fdw_handler. |
11 | record Identifica uma função que retorna um tipo de linha não especificado. |
12 | trigger Uma função de gatilho é declarada para retornar o gatilho. |
13 | void Indica que uma função não retorna nenhum valor. |
Este capítulo discute como criar um novo banco de dados em seu PostgreSQL. PostgreSQL fornece duas maneiras de criar um novo banco de dados -
- Usando CREATE DATABASE, um comando SQL.
- Usando createdb um executável de linha de comando.
Usando CREATE DATABASE
Este comando criará um banco de dados a partir do prompt do shell PostgreSQL, mas você deve ter o privilégio apropriado para criar um banco de dados. Por padrão, o novo banco de dados será criado clonando o modelo de banco de dados do sistema padrão1 .
Sintaxe
A sintaxe básica da instrução CREATE DATABASE é a seguinte -
CREATE DATABASE dbname;
onde dbname é o nome de um banco de dados a ser criado.
Exemplo
A seguir está um exemplo simples, que criará testdb em seu esquema PostgreSQL
postgres=# CREATE DATABASE testdb;
postgres-#
Usando o comando createdb
O executável de linha de comando do PostgreSQL createdb é um invólucro do comando SQL CREATE DATABASE . A única diferença entre este comando e o comando SQL CREATE DATABASE é que o primeiro pode ser executado diretamente a partir da linha de comando e permite que um comentário seja adicionado ao banco de dados, tudo em um comando.
Sintaxe
A sintaxe para createdb é mostrada abaixo -
createdb [option...] [dbname [description]]
Parâmetros
A tabela abaixo lista os parâmetros com suas descrições.
S. No. | Parâmetro e Descrição |
---|---|
1 | dbname O nome de um banco de dados a ser criado. |
2 | description Especifica um comentário a ser associado ao banco de dados recém-criado. |
3 | options argumentos de linha de comando, que o createdb aceita. |
Opções
A tabela a seguir lista os argumentos de linha de comando que createdb aceita -
S. No. | Opção e descrição |
---|---|
1 | -D tablespace Especifica o espaço de tabela padrão para o banco de dados. |
2 | -e Faça eco dos comandos que o createdb gera e envia para o servidor. |
3 | -E encoding Especifica o esquema de codificação de caracteres a ser usado neste banco de dados. |
4 | -l locale Especifica o local a ser usado neste banco de dados. |
5 | -T template Especifica o banco de dados de modelo a partir do qual construir este banco de dados. |
6 | --help Mostre ajuda sobre os argumentos da linha de comando do createdb e saia. |
7 | -h host Especifica o nome do host da máquina na qual o servidor está sendo executado. |
8 | -p port Especifica a porta TCP ou a extensão do arquivo de soquete do domínio Unix local no qual o servidor está escutando as conexões. |
9 | -U username Nome de usuário com o qual se conectar. |
10 | -w Nunca emita um prompt de senha. |
11 | -W Força createdb a solicitar uma senha antes de conectar-se a um banco de dados. |
Abra o prompt de comando e vá para o diretório onde o PostgreSQL está instalado. Vá para o diretório bin e execute o seguinte comando para criar um banco de dados.
createdb -h localhost -p 5432 -U postgres testdb
password ******
O comando fornecido acima irá solicitar a senha do usuário administrador do PostgreSQL, que é postgres, por padrão. Portanto, forneça uma senha e prossiga para criar seu novo banco de dados
Depois que um banco de dados é criado usando um dos métodos mencionados acima, você pode verificá-lo na lista de bancos de dados usando \l, ou seja, barra invertida el comando da seguinte forma -
postgres-# \l
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
-----------+----------+----------+---------+-------+-----------------------
postgres | postgres | UTF8 | C | C |
template0 | postgres | UTF8 | C | C | =c/postgres +
| | | | | postgres=CTc/postgres
template1 | postgres | UTF8 | C | C | =c/postgres +
| | | | | postgres=CTc/postgres
testdb | postgres | UTF8 | C | C |
(4 rows)
postgres-#
Este capítulo explica vários métodos de acesso ao banco de dados. Suponha que já criamos um banco de dados em nosso capítulo anterior. Você pode selecionar o banco de dados usando um dos seguintes métodos -
- Prompt de banco de dados SQL
- Prompt de comando do sistema operacional
Prompt de banco de dados SQL
Suponha que você já tenha iniciado seu cliente PostgreSQL e tenha acessado o seguinte prompt SQL -
postgres=#
Você pode verificar a lista de banco de dados disponível usando \l, ou seja, barra invertida el comando da seguinte forma -
postgres-# \l
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
-----------+----------+----------+---------+-------+-----------------------
postgres | postgres | UTF8 | C | C |
template0 | postgres | UTF8 | C | C | =c/postgres +
| | | | | postgres=CTc/postgres
template1 | postgres | UTF8 | C | C | =c/postgres +
| | | | | postgres=CTc/postgres
testdb | postgres | UTF8 | C | C |
(4 rows)
postgres-#
Agora, digite o seguinte comando para conectar / selecionar um banco de dados desejado; aqui, vamos nos conectar ao banco de dados testdb .
postgres=# \c testdb;
psql (9.2.4)
Type "help" for help.
You are now connected to database "testdb" as user "postgres".
testdb=#
Prompt de comando do sistema operacional
Você pode selecionar seu banco de dados no próprio prompt de comando no momento em que efetuar login em seu banco de dados. A seguir está um exemplo simples -
psql -h localhost -p 5432 -U postgress testdb
Password for user postgress: ****
psql (9.2.4)
Type "help" for help.
You are now connected to database "testdb" as user "postgres".
testdb=#
Agora você está logado no PostgreSQL testdb e pronto para executar seus comandos dentro do testdb. Para sair do banco de dados, você pode usar o comando \ q.
Neste capítulo, discutiremos como excluir o banco de dados no PostgreSQL. Existem duas opções para excluir um banco de dados -
- Usando DROP DATABASE, um comando SQL.
- Usando dropdb um executável de linha de comando.
Tenha cuidado antes de usar esta operação porque a exclusão de um banco de dados existente resultaria na perda de todas as informações armazenadas no banco de dados.
Usando DROP DATABASE
Este comando elimina um banco de dados. Ele remove as entradas do catálogo para o banco de dados e exclui o diretório que contém os dados. Ele só pode ser executado pelo proprietário do banco de dados. Este comando não pode ser executado enquanto você ou qualquer outra pessoa estiver conectada ao banco de dados de destino (conecte-se ao postgres ou qualquer outro banco de dados para emitir este comando).
Sintaxe
A sintaxe para DROP DATABASE é fornecida abaixo -
DROP DATABASE [ IF EXISTS ] name
Parâmetros
A tabela lista os parâmetros com suas descrições.
S. No. | Parâmetro e Descrição |
---|---|
1 | IF EXISTS Não lance um erro se o banco de dados não existir. Um aviso é emitido neste caso. |
2 | name O nome do banco de dados a ser removido. |
Não podemos descartar um banco de dados que tenha conexões abertas, incluindo nossa própria conexão do psql ou pgAdmin III . Devemos mudar para outro banco de dados ou template1 se quisermos deletar o banco de dados ao qual estamos conectados. Portanto, pode ser mais conveniente usar o programa dropdb , que é um wrapper para esse comando.
Exemplo
A seguir está um exemplo simples, que excluirá testdb do seu esquema PostgreSQL -
postgres=# DROP DATABASE testdb;
postgres-#
Usando o comando dropdb
Executável de linha de comando PostgresSQL dropdbé um wrapper de linha de comando em torno do comando SQL DROP DATABASE . Não há diferença efetiva entre eliminar bancos de dados por meio desse utilitário e por meio de outros métodos de acesso ao servidor. dropdb destrói um banco de dados PostgreSQL existente. O usuário que executa este comando deve ser um superusuário do banco de dados ou o proprietário do banco de dados.
Sintaxe
A sintaxe para dropdb é mostrada abaixo -
dropdb [option...] dbname
Parâmetros
A tabela a seguir lista os parâmetros com suas descrições
S. No. | Parâmetro e Descrição |
---|---|
1 | dbname O nome de um banco de dados a ser excluído. |
2 | option argumentos de linha de comando, que o dropdb aceita. |
Opções
A tabela a seguir lista os argumentos de linha de comando que o dropdb aceita -
S. No. | Opção e descrição |
---|---|
1 | -e Mostra os comandos que estão sendo enviados ao servidor. |
2 | -i Emite um prompt de verificação antes de fazer algo destrutivo. |
3 | -V Imprima a versão do dropdb e saia. |
4 | --if-exists Não lance um erro se o banco de dados não existir. Um aviso é emitido neste caso. |
5 | --help Mostre ajuda sobre os argumentos de linha de comando do dropdb e saia. |
6 | -h host Especifica o nome do host da máquina na qual o servidor está sendo executado. |
7 | -p port Especifica a porta TCP ou a extensão do arquivo de soquete de domínio UNIX local no qual o servidor está atendendo as conexões. |
8 | -U username Nome de usuário com o qual se conectar. |
9 | -w Nunca emita um prompt de senha. |
10 | -W Força o dropdb a solicitar uma senha antes de se conectar a um banco de dados. |
11 | --maintenance-db=dbname Especifica o nome do banco de dados ao qual se conectar para eliminar o banco de dados de destino. |
Exemplo
O exemplo a seguir demonstra a exclusão de um banco de dados do prompt de comando do sistema operacional -
dropdb -h localhost -p 5432 -U postgress testdb
Password for user postgress: ****
O comando acima elimina o banco de dados testdb. Aqui, eu usei opostgres (encontrado em pg_roles de template1) nome de usuário para eliminar o banco de dados.
A instrução CREATE TABLE do PostgreSQL é usada para criar uma nova tabela em qualquer banco de dados fornecido.
Sintaxe
A sintaxe básica da instrução CREATE TABLE é a seguinte -
CREATE TABLE table_name(
column1 datatype,
column2 datatype,
column3 datatype,
.....
columnN datatype,
PRIMARY KEY( one or more columns )
);
CREATE TABLE é uma palavra-chave que diz ao sistema de banco de dados para criar uma nova tabela. O nome ou identificador exclusivo da tabela segue a instrução CREATE TABLE. Inicialmente, a tabela vazia no banco de dados atual pertence ao usuário que está emitindo o comando.
A seguir, entre colchetes, vem a lista, definindo cada coluna da tabela e que tipo de tipo de dado é. A sintaxe ficará clara com um exemplo fornecido a seguir.
Exemplos
A seguir está um exemplo, que cria uma tabela COMPANY com ID como chave primária e NOT NULL são as restrições que mostram que esses campos não podem ser NULL ao criar registros nesta tabela -
CREATE TABLE COMPANY(
ID INT PRIMARY KEY NOT NULL,
NAME TEXT NOT NULL,
AGE INT NOT NULL,
ADDRESS CHAR(50),
SALARY REAL
);
Vamos criar mais uma tabela, que usaremos em nossos exercícios nos capítulos subsequentes -
CREATE TABLE DEPARTMENT(
ID INT PRIMARY KEY NOT NULL,
DEPT CHAR(50) NOT NULL,
EMP_ID INT NOT NULL
);
Você pode verificar se a sua tabela foi criada com sucesso usando \d comando, que será usado para listar todas as tabelas em um banco de dados anexado.
testdb-# \d
A instrução PostgreSQL fornecida acima produzirá o seguinte resultado -
List of relations
Schema | Name | Type | Owner
--------+------------+-------+----------
public | company | table | postgres
public | department | table | postgres
(2 rows)
Usar \d tablename para descrever cada tabela conforme mostrado abaixo -
testdb-# \d company
A instrução PostgreSQL fornecida acima produzirá o seguinte resultado -
Table "public.company"
Column | Type | Modifiers
-----------+---------------+-----------
id | integer | not null
name | text | not null
age | integer | not null
address | character(50) |
salary | real |
join_date | date |
Indexes:
"company_pkey" PRIMARY KEY, btree (id)
A instrução PostgreSQL DROP TABLE é usada para remover uma definição de tabela e todos os dados, índices, regras, gatilhos e restrições associados a essa tabela.
Você deve ter cuidado ao usar este comando porque uma vez que uma tabela é excluída, todas as informações disponíveis na tabela também serão perdidas para sempre.
Sintaxe
A sintaxe básica da instrução DROP TABLE é a seguinte -
DROP TABLE table_name;
Exemplo
Havíamos criado as tabelas DEPARTAMENTO e EMPRESA no capítulo anterior. Primeiro, verifique essas tabelas (use\d para listar as tabelas) -
testdb-# \d
Isso produziria o seguinte resultado -
List of relations
Schema | Name | Type | Owner
--------+------------+-------+----------
public | company | table | postgres
public | department | table | postgres
(2 rows)
Isso significa que as tabelas DEPARTAMENTO e EMPRESA estão presentes. Então, vamos soltá-los da seguinte forma -
testdb=# drop table department, company;
Isso produziria o seguinte resultado -
DROP TABLE
testdb=# \d
relations found.
testdb=#
A mensagem retornada DROP TABLE indica que o comando drop foi executado com sucesso.
UMA schemaé uma coleção nomeada de tabelas. Um esquema também pode conter visualizações, índices, sequências, tipos de dados, operadores e funções. Os esquemas são análogos aos diretórios no nível do sistema operacional, exceto que os esquemas não podem ser aninhados. A instrução CREATE SCHEMA do PostgreSQL cria um esquema.
Sintaxe
A sintaxe básica de CREATE SCHEMA é a seguinte -
CREATE SCHEMA name;
Onde nome é o nome do esquema.
Sintaxe para criar uma tabela no esquema
A sintaxe básica para criar uma tabela no esquema é a seguinte -
CREATE TABLE myschema.mytable (
...
);
Exemplo
Vejamos um exemplo para a criação de um esquema. Conecte-se ao banco de dados testdb e crie um esquema meu esquema da seguinte maneira -
testdb=# create schema myschema;
CREATE SCHEMA
A mensagem "CREATE SCHEMA" significa que o esquema foi criado com sucesso.
Agora, vamos criar uma tabela no esquema acima da seguinte maneira -
testdb=# create table myschema.company(
ID INT NOT NULL,
NAME VARCHAR (20) NOT NULL,
AGE INT NOT NULL,
ADDRESS CHAR (25),
SALARY DECIMAL (18, 2),
PRIMARY KEY (ID)
);
Isso criará uma mesa vazia. Você pode verificar a tabela criada com o comando fornecido abaixo -
testdb=# select * from myschema.company;
Isso produziria o seguinte resultado -
id | name | age | address | salary
----+------+-----+---------+--------
(0 rows)
Sintaxe para eliminar o esquema
Para eliminar um esquema se ele estiver vazio (todos os objetos nele foram eliminados), use o comando -
DROP SCHEMA myschema;
Para eliminar um esquema incluindo todos os objetos contidos, use o comando -
DROP SCHEMA myschema CASCADE;
Vantagens de usar um esquema
Ele permite que muitos usuários usem um banco de dados sem interferir uns com os outros.
Ele organiza objetos de banco de dados em grupos lógicos para torná-los mais gerenciáveis.
Os aplicativos de terceiros podem ser colocados em esquemas separados para que não entrem em conflito com os nomes de outros objetos.
O PostgreSQL INSERT INTOinstrução permite inserir novas linhas em uma tabela. Pode-se inserir uma única linha de cada vez ou várias linhas como resultado de uma consulta.
Sintaxe
A sintaxe básica da instrução INSERT INTO é a seguinte -
INSERT INTO TABLE_NAME (column1, column2, column3,...columnN)
VALUES (value1, value2, value3,...valueN);
Aqui, coluna1, coluna2, ... colunaN são os nomes das colunas na tabela na qual você deseja inserir dados.
Os nomes das colunas de destino podem ser listados em qualquer ordem. Os valores fornecidos pela cláusula VALUES ou consulta são associados à lista de colunas explícita ou implícita da esquerda para a direita.
Você pode não precisar especificar o (s) nome (s) da (s) coluna (s) na consulta SQL se estiver adicionando valores para todas as colunas da tabela. No entanto, certifique-se de que a ordem dos valores esteja na mesma ordem das colunas da tabela. A sintaxe SQL INSERT INTO seria a seguinte -
INSERT INTO TABLE_NAME VALUES (value1,value2,value3,...valueN);
Resultado
A tabela a seguir resume as mensagens de saída e seu significado -
S. No. | Mensagem de saída e descrição |
---|---|
1 | INSERT oid 1 Mensagem retornada se apenas uma linha foi inserida. oid é o OID numérico da linha inserida. |
2 | INSERT 0 # Mensagem retornada se mais de uma linha for inserida. # é o número de linhas inseridas. |
Exemplos
Vamos criar a tabela COMPANY em testdb como segue -
CREATE TABLE COMPANY(
ID INT PRIMARY KEY NOT NULL,
NAME TEXT NOT NULL,
AGE INT NOT NULL,
ADDRESS CHAR(50),
SALARY REAL,
JOIN_DATE DATE
);
O exemplo a seguir insere uma linha na tabela COMPANY -
INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY,JOIN_DATE) VALUES (1, 'Paul', 32, 'California', 20000.00,'2001-07-13');
O exemplo a seguir é para inserir uma linha; aqui a coluna de salário é omitida e, portanto, terá o valor padrão -
INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,JOIN_DATE) VALUES (2, 'Allen', 25, 'Texas', '2007-12-13');
O exemplo a seguir usa a cláusula DEFAULT para a coluna JOIN_DATE em vez de especificar um valor -
INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY,JOIN_DATE) VALUES (3, 'Teddy', 23, 'Norway', 20000.00, DEFAULT );
O exemplo a seguir insere várias linhas usando a sintaxe multirow VALUES -
INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY,JOIN_DATE) VALUES (4, 'Mark', 25, 'Rich-Mond ', 65000.00, '2007-12-13' ), (5, 'David', 27, 'Texas', 85000.00, '2007-12-13');
Todas as declarações acima criariam os seguintes registros na tabela COMPANY. O próximo capítulo ensinará como exibir todos esses registros de uma tabela.
ID NAME AGE ADDRESS SALARY JOIN_DATE
---- ---------- ----- ---------- ------- --------
1 Paul 32 California 20000.0 2001-07-13
2 Allen 25 Texas 2007-12-13
3 Teddy 23 Norway 20000.0
4 Mark 25 Rich-Mond 65000.0 2007-12-13
5 David 27 Texas 85000.0 2007-12-13
PostgreSQL SELECTdeclaração é usada para buscar os dados de uma tabela de banco de dados, que retorna dados na forma de tabela de resultados. Essas tabelas de resultados são chamadas de conjuntos de resultados.
Sintaxe
A sintaxe básica da instrução SELECT é a seguinte -
SELECT column1, column2, columnN FROM table_name;
Aqui, coluna1, coluna2 ... são os campos de uma tabela, cujos valores você deseja buscar. Se você deseja buscar todos os campos disponíveis no campo, você pode usar a seguinte sintaxe -
SELECT * FROM table_name;
Exemplo
Considere a tabela COMPANHIA com os registros a seguir -
id | name | age | address | salary
----+-------+-----+-----------+--------
1 | Paul | 32 | California| 20000
2 | Allen | 25 | Texas | 15000
3 | Teddy | 23 | Norway | 20000
4 | Mark | 25 | Rich-Mond | 65000
5 | David | 27 | Texas | 85000
6 | Kim | 22 | South-Hall| 45000
7 | James | 24 | Houston | 10000
(7 rows)
A seguir está um exemplo, que buscaria os campos ID, Nome e Salário dos clientes disponíveis na tabela CLIENTES -
testdb=# SELECT ID, NAME, SALARY FROM COMPANY ;
Isso produziria o seguinte resultado -
id | name | salary
----+-------+--------
1 | Paul | 20000
2 | Allen | 15000
3 | Teddy | 20000
4 | Mark | 65000
5 | David | 85000
6 | Kim | 45000
7 | James | 10000
(7 rows)
Se você deseja buscar todos os campos da tabela CUSTOMERS, use a seguinte consulta -
testdb=# SELECT * FROM COMPANY;
Isso produziria o seguinte resultado -
id | name | age | address | salary
----+-------+-----+-----------+--------
1 | Paul | 32 | California| 20000
2 | Allen | 25 | Texas | 15000
3 | Teddy | 23 | Norway | 20000
4 | Mark | 25 | Rich-Mond | 65000
5 | David | 27 | Texas | 85000
6 | Kim | 22 | South-Hall| 45000
7 | James | 24 | Houston | 10000
(7 rows)
O que é um operador no PostgreSQL?
Um operador é uma palavra reservada ou um caractere usado principalmente na cláusula WHERE de uma instrução PostgreSQL para realizar operação (ões), como comparações e operações aritméticas.
Os operadores são usados para especificar condições em uma instrução PostgreSQL e servir como conjunções para várias condições em uma instrução.
- Operadores aritméticos
- Operadores de comparação
- Operadores lógicos
- Operadores bit a bit
Operadores aritméticos PostgreSQL
Assumir variável a contém 2 e variável b segura 3, então -
Exemplo
Operador | Descrição | Exemplo |
---|---|---|
+ | Adição - adiciona valores em ambos os lados do operador | a + b dará 5 |
- | Subtração - subtrai o operando direito do operando esquerdo | a - b dará -1 |
* | Multiplicação - Multiplica valores em ambos os lados do operador | a * b dará 6 |
/ | Divisão - Divide operando esquerdo pelo operando direito | b / a dará 1 |
% | Módulo - Divide operando esquerdo pelo operando direito e retorna o resto | b% a dará 1 |
^ | Exponenciação - Fornece o valor expoente do operando à direita | a ^ b dará 8 |
| / | raiz quadrada | | / 25.0 dará 5 |
|| / | raiz cúbica | || / 27,0 dará 3 |
! | fatorial | 5! vai dar 120 |
!! | fatorial (operador de prefixo) | !! 5 dará 120 |
Operadores de comparação PostgreSQL
Suponha que a variável a tenha 10 e a variável b tenha 20, então -
Mostrar exemplos
Operador | Descrição | Exemplo |
---|---|---|
= | Verifica se os valores dos dois operandos são iguais ou não, se sim a condição torna-se verdadeira. | (a = b) não é verdade. |
! = | Verifica se os valores de dois operandos são iguais ou não, se os valores não são iguais, a condição se torna verdadeira. | (a! = b) é verdade. |
<> | Verifica se os valores de dois operandos são iguais ou não, se os valores não são iguais, a condição se torna verdadeira. | (a <> b) é verdadeiro. |
> | Verifica se o valor do operando esquerdo é maior que o valor do operando direito, se sim então a condição torna-se verdadeira. | (a> b) não é verdade. |
< | Verifica se o valor do operando esquerdo é menor que o valor do operando direito; se sim, a condição torna-se verdadeira. | (a <b) é verdadeiro. |
> = | Verifica se o valor do operando esquerdo é maior ou igual ao valor do operando direito, se sim a condição torna-se verdadeira. | (a> = b) não é verdade. |
<= | Verifica se o valor do operando esquerdo é menor ou igual ao valor do operando direito; em caso afirmativo, a condição torna-se verdadeira. | (a <= b) é verdadeiro. |
Operadores lógicos PostgreSQL
Aqui está uma lista de todos os operadores lógicos disponíveis no PostgresSQL.
Mostrar exemplos
S. No. | Operador e descrição |
---|---|
1 | AND O operador AND permite a existência de várias condições na cláusula WHERE de uma instrução PostgresSQL. |
2 | NOT O operador NOT inverte o significado do operador lógico com o qual é usado. Por exemplo. NÃO EXISTE, NÃO ENTRE, NÃO ENTRE, etc.This is negate operator. |
3 | OR O operador OR é usado para combinar várias condições na cláusula WHERE de uma instrução PostgresSQL. |
Operadores de string de bits PostgreSQL
O operador bit a bit funciona em bits e executa a operação bit a bit. A tabela de verdade para & e | é o seguinte -
p | q | p & q | p | q |
---|---|---|---|
0 | 0 | 0 | 0 |
0 | 1 | 0 | 1 |
1 | 1 | 1 | 1 |
1 | 0 | 0 | 1 |
Suponha que A = 60; e B = 13; agora em formato binário serão os seguintes -
A = 0011 1100
B = 0000 1101
-----------------
A&B = 0000 1100
A | B = 0011 1101
~ A = 1100 0011
Mostrar exemplos
Os operadores Bitwise suportados pelo PostgreSQL estão listados na tabela a seguir -
Operador | Descrição | Exemplo |
---|---|---|
E | O operador Binário AND copia um bit para o resultado se ele existir em ambos os operandos. | (A e B) dará 12, que é 0000 1100 |
| | O operador binário OR copia um bit se ele existir em qualquer operando. | (A | B) dará 61, que é 0011 1101 |
~ | O operador de complemento binários é unário e tem o efeito de 'inverter' bits. | (~ A) dará -61 que é 1100 0011 na forma de complemento de 2 devido a um número binário com sinal. |
<< | Operador binário de deslocamento à esquerda. O valor dos operandos à esquerda é movido para a esquerda pelo número de bits especificado pelo operando à direita. | Um << 2 dará 240, que é 1111 0000 |
>> | Operador binário de deslocamento à direita. O valor dos operandos à esquerda é movido para a direita pelo número de bits especificado pelo operando à direita. | Um >> 2 dará 15, que é 0000 1111 |
# | XOR bit a bit. | A # B dará 49, que é 0100 1001 |
Uma expressão é uma combinação de um ou mais valores, operadores e funções PostgresSQL que avaliam um valor.
As EXPRESSÕES do PostgreSQL são como fórmulas e são escritas em linguagem de consulta. Você também pode usar para consultar o banco de dados para um conjunto específico de dados.
Sintaxe
Considere a sintaxe básica da instrução SELECT da seguinte maneira -
SELECT column1, column2, columnN
FROM table_name
WHERE [CONDITION | EXPRESSION];
Existem diferentes tipos de expressões PostgreSQL, que são mencionados abaixo -
PostgreSQL - Expressões Booleanas
As expressões booleanas do PostgreSQL buscam os dados com base na correspondência de um único valor. A seguir está a sintaxe -
SELECT column1, column2, columnN
FROM table_name
WHERE SINGLE VALUE MATCHTING EXPRESSION;
Considere a tabela COMPANHIA com os registros a seguir -
testdb# select * from COMPANY;
id | name | age | address | salary
----+-------+-----+-----------+--------
1 | Paul | 32 | California| 20000
2 | Allen | 25 | Texas | 15000
3 | Teddy | 23 | Norway | 20000
4 | Mark | 25 | Rich-Mond | 65000
5 | David | 27 | Texas | 85000
6 | Kim | 22 | South-Hall| 45000
7 | James | 24 | Houston | 10000
(7 rows)
Aqui está um exemplo simples que mostra o uso de Expressões Booleanas PostgreSQL -
testdb=# SELECT * FROM COMPANY WHERE SALARY = 10000;
A instrução PostgreSQL fornecida acima produzirá o seguinte resultado -
id | name | age | address | salary
----+-------+-----+----------+--------
7 | James | 24 | Houston | 10000
(1 row)
PostgreSQL - Expressão Numérica
Essas expressões são usadas para realizar qualquer operação matemática em qualquer consulta. A seguir está a sintaxe -
SELECT numerical_expression as OPERATION_NAME
[FROM table_name WHERE CONDITION] ;
Aqui, numerical_expression é usada para expressão matemática ou qualquer fórmula. A seguir está um exemplo simples que mostra o uso de Expressões Numéricas SQL -
testdb=# SELECT (15 + 6) AS ADDITION ;
A instrução PostgreSQL fornecida acima produzirá o seguinte resultado -
addition
----------
21
(1 row)
Existem várias funções integradas, como avg (), sum (), count () para realizar o que é conhecido como cálculos de dados agregados em uma tabela ou coluna específica da tabela.
testdb=# SELECT COUNT(*) AS "RECORDS" FROM COMPANY;
A instrução PostgreSQL fornecida acima produzirá o seguinte resultado -
RECORDS
---------
7
(1 row)
PostgreSQL - Expressões de data
As expressões de data retornam os valores atuais de data e hora do sistema e essas expressões são usadas em várias manipulações de dados.
testdb=# SELECT CURRENT_TIMESTAMP;
A instrução PostgreSQL fornecida acima produzirá o seguinte resultado -
now
-------------------------------
2013-05-06 14:38:28.078+05:30
(1 row)
A cláusula PostgreSQL WHERE é usada para especificar uma condição ao buscar os dados de uma única tabela ou unir-se a várias tabelas.
Se a condição fornecida for satisfeita, somente então ele retornará um valor específico da tabela. Você pode filtrar as linhas que não deseja incluir no conjunto de resultados usando a cláusula WHERE.
A cláusula WHERE não é apenas usada na instrução SELECT, mas também é usada na instrução UPDATE, DELETE, etc., que examinaremos nos capítulos subsequentes.
Sintaxe
A sintaxe básica da instrução SELECT com a cláusula WHERE é a seguinte -
SELECT column1, column2, columnN
FROM table_name
WHERE [search_condition]
Você pode especificar uma search_condition usando comparação ou operadores lógicos. like>, <, =, LIKE, NOT, etc. Os exemplos a seguir tornariam este conceito claro.
Exemplo
Considere a tabela COMPANHIA com os registros a seguir -
testdb# select * from COMPANY;
id | name | age | address | salary
----+-------+-----+-----------+--------
1 | Paul | 32 | California| 20000
2 | Allen | 25 | Texas | 15000
3 | Teddy | 23 | Norway | 20000
4 | Mark | 25 | Rich-Mond | 65000
5 | David | 27 | Texas | 85000
6 | Kim | 22 | South-Hall| 45000
7 | James | 24 | Houston | 10000
(7 rows)
Aqui estão alguns exemplos simples que mostram o uso de Operadores Lógicos PostgreSQL. A seguir a instrução SELECT listará todos os registros onde AGE é maior ou igual a 25AND salário é maior ou igual a 65.000,00 -
testdb=# SELECT * FROM COMPANY WHERE AGE >= 25 AND SALARY >= 65000;
A instrução PostgreSQL fornecida acima produzirá o seguinte resultado -
id | name | age | address | salary
----+-------+-----+------------+--------
4 | Mark | 25 | Rich-Mond | 65000
5 | David | 27 | Texas | 85000
(2 rows)
A seguinte instrução SELECT lista todos os registros onde AGE é maior ou igual a 25 OR salário é maior ou igual a 65.000,00 -
testdb=# SELECT * FROM COMPANY WHERE AGE >= 25 OR SALARY >= 65000;
A instrução PostgreSQL fornecida acima produzirá o seguinte resultado -
id | name | age | address | salary
----+-------+-----+-------------+--------
1 | Paul | 32 | California | 20000
2 | Allen | 25 | Texas | 15000
4 | Mark | 25 | Rich-Mond | 65000
5 | David | 27 | Texas | 85000
(4 rows)
A seguinte instrução SELECT lista todos os registros onde AGE não é NULL, o que significa todos os registros, porque nenhum dos registros tem AGE igual a NULL -
testdb=# SELECT * FROM COMPANY WHERE AGE IS NOT NULL;
A instrução PostgreSQL fornecida acima produzirá o seguinte resultado -
id | name | age | address | salary
----+-------+-----+------------+--------
1 | Paul | 32 | California | 20000
2 | Allen | 25 | Texas | 15000
3 | Teddy | 23 | Norway | 20000
4 | Mark | 25 | Rich-Mond | 65000
5 | David | 27 | Texas | 85000
6 | Kim | 22 | South-Hall | 45000
7 | James | 24 | Houston | 10000
(7 rows)
A seguinte instrução SELECT lista todos os registros onde NAME começa com 'Pa', não importa o que venha depois de 'Pa'.
testdb=# SELECT * FROM COMPANY WHERE NAME LIKE 'Pa%';
A instrução PostgreSQL fornecida acima produzirá o seguinte resultado -
id | name | age |address | salary
----+------+-----+-----------+--------
1 | Paul | 32 | California| 20000
A seguinte instrução SELECT lista todos os registros onde o valor de AGE é 25 ou 27 -
testdb=# SELECT * FROM COMPANY WHERE AGE IN ( 25, 27 );
A instrução PostgreSQL fornecida acima produzirá o seguinte resultado -
id | name | age | address | salary
----+-------+-----+------------+--------
2 | Allen | 25 | Texas | 15000
4 | Mark | 25 | Rich-Mond | 65000
5 | David | 27 | Texas | 85000
(3 rows)
A seguinte instrução SELECT lista todos os registros em que o valor de AGE não é 25 nem 27 -
testdb=# SELECT * FROM COMPANY WHERE AGE NOT IN ( 25, 27 );
A instrução PostgreSQL fornecida acima produzirá o seguinte resultado -
id | name | age | address | salary
----+-------+-----+------------+--------
1 | Paul | 32 | California | 20000
3 | Teddy | 23 | Norway | 20000
6 | Kim | 22 | South-Hall | 45000
7 | James | 24 | Houston | 10000
(4 rows)
A seguinte instrução SELECT lista todos os registros onde o valor de idade está entre 25 E 27 -
testdb=# SELECT * FROM COMPANY WHERE AGE BETWEEN 25 AND 27;
A instrução PostgreSQL fornecida acima produzirá o seguinte resultado -
id | name | age | address | salary
----+-------+-----+------------+--------
2 | Allen | 25 | Texas | 15000
4 | Mark | 25 | Rich-Mond | 65000
5 | David | 27 | Texas | 85000
(3 rows)
A seguinte instrução SELECT faz uso da subconsulta SQL onde a subconsulta encontra todos os registros com o campo AGE tendo SALARY> 65000 e a cláusula WHERE posterior está sendo usada junto com o operador EXISTS para listar todos os registros onde AGE da consulta externa existe no resultado retornado por subconsulta -
testdb=# SELECT AGE FROM COMPANY
WHERE EXISTS (SELECT AGE FROM COMPANY WHERE SALARY > 65000);
A instrução PostgreSQL fornecida acima produzirá o seguinte resultado -
age
-----
32
25
23
25
27
22
24
(7 rows)
A seguinte instrução SELECT faz uso da subconsulta SQL onde a subconsulta encontra todos os registros com o campo AGE tendo SALARY> 65000 e a cláusula WHERE posterior está sendo usada junto com o operador> para listar todos os registros onde AGE da consulta externa é maior que a idade em o resultado retornado pela subconsulta -
testdb=# SELECT * FROM COMPANY
WHERE AGE > (SELECT AGE FROM COMPANY WHERE SALARY > 65000);
A instrução PostgreSQL fornecida acima produzirá o seguinte resultado -
id | name | age | address | salary
----+------+-----+------------+--------
1 | Paul | 32 | California | 20000
O PostgreSQL AND e ORoperadores são usados para combinar várias condições para restringir os dados selecionados em uma instrução PostgreSQL. Esses dois operadores são chamados de operadores conjuntivos.
Esses operadores fornecem um meio de fazer várias comparações com diferentes operadores na mesma instrução PostgreSQL.
O operador AND
o ANDoperador permite a existência de várias condições na cláusula WHERE de uma instrução PostgreSQL. Ao usar o operador AND, a condição completa será considerada verdadeira quando todas as condições forem verdadeiras. Por exemplo, [condição1] E [condição2] serão verdadeiras apenas quando ambas as condições1 e 2 forem verdadeiras.
Sintaxe
A sintaxe básica do operador AND com a cláusula WHERE é a seguinte -
SELECT column1, column2, columnN
FROM table_name
WHERE [condition1] AND [condition2]...AND [conditionN];
Você pode combinar um número N de condições usando o operador AND. Para que uma ação seja realizada pela instrução PostgreSQL, seja uma transação ou consulta, todas as condições separadas por AND devem ser TRUE.
Exemplo
Considere a tabela COMPANHIA com os registros a seguir -
testdb# select * from COMPANY;
id | name | age | address | salary
----+-------+-----+-----------+--------
1 | Paul | 32 | California| 20000
2 | Allen | 25 | Texas | 15000
3 | Teddy | 23 | Norway | 20000
4 | Mark | 25 | Rich-Mond | 65000
5 | David | 27 | Texas | 85000
6 | Kim | 22 | South-Hall| 45000
7 | James | 24 | Houston | 10000
(7 rows)
A seguinte instrução SELECT lista todos os registros onde AGE é maior ou igual a 25 AND salário é maior ou igual a 65.000,00 -
testdb=# SELECT * FROM COMPANY WHERE AGE >= 25 AND SALARY >= 65000;
A instrução PostgreSQL fornecida acima produzirá o seguinte resultado -
id | name | age | address | salary
----+-------+-----+------------+--------
4 | Mark | 25 | Rich-Mond | 65000
5 | David | 27 | Texas | 85000
(2 rows)
O operador OR
O operador OR também é usado para combinar várias condições na cláusula WHERE de uma instrução PostgreSQL. Ao usar o operador OR, a condição completa será considerada verdadeira quando pelo menos qualquer uma das condições for verdadeira. Por exemplo, [condição1] OU [condição2] será verdadeira se a condição1 ou a condição2 for verdadeira.
Sintaxe
A sintaxe básica do operador OR com a cláusula WHERE é a seguinte -
SELECT column1, column2, columnN
FROM table_name
WHERE [condition1] OR [condition2]...OR [conditionN]
Você pode combinar um número N de condições usando o operador OR. Para que uma ação seja realizada pela instrução PostgreSQL, seja uma transação ou consulta, apenas UMA das condições separadas por OR deve ser TRUE.
Exemplo
Considere a tabela COMPANY , tendo os seguintes registros -
# select * from COMPANY;
id | name | age | address | salary
----+-------+-----+-----------+--------
1 | Paul | 32 | California| 20000
2 | Allen | 25 | Texas | 15000
3 | Teddy | 23 | Norway | 20000
4 | Mark | 25 | Rich-Mond | 65000
5 | David | 27 | Texas | 85000
6 | Kim | 22 | South-Hall| 45000
7 | James | 24 | Houston | 10000
(7 rows)
A seguinte instrução SELECT lista todos os registros onde AGE é maior ou igual a 25 OR salário é maior ou igual a 65.000,00 -
testdb=# SELECT * FROM COMPANY WHERE AGE >= 25 OR SALARY >= 65000;
A instrução PostgreSQL fornecida acima produzirá o seguinte resultado -
id | name | age | address | salary
----+-------+-----+------------+--------
1 | Paul | 32 | California | 20000
2 | Allen | 25 | Texas | 15000
4 | Mark | 25 | Rich-Mond | 65000
5 | David | 27 | Texas | 85000
(4 rows)
O PostgreSQL UPDATEA consulta é usada para modificar os registros existentes em uma tabela. Você pode usar a cláusula WHERE com a consulta UPDATE para atualizar as linhas selecionadas. Caso contrário, todas as linhas seriam atualizadas.
Sintaxe
A sintaxe básica da consulta UPDATE com a cláusula WHERE é a seguinte -
UPDATE table_name
SET column1 = value1, column2 = value2...., columnN = valueN
WHERE [condition];
Você pode combinar um número N de condições usando os operadores AND ou OR.
Exemplo
Considere a tabela EMPRESA , tendo os registros a seguir -
testdb# select * from COMPANY;
id | name | age | address | salary
----+-------+-----+-----------+--------
1 | Paul | 32 | California| 20000
2 | Allen | 25 | Texas | 15000
3 | Teddy | 23 | Norway | 20000
4 | Mark | 25 | Rich-Mond | 65000
5 | David | 27 | Texas | 85000
6 | Kim | 22 | South-Hall| 45000
7 | James | 24 | Houston | 10000
(7 rows)
A seguir está um exemplo, que atualizaria ADDRESS para um cliente, cujo ID é 6 -
testdb=# UPDATE COMPANY SET SALARY = 15000 WHERE ID = 3;
Agora, a tabela COMPANY teria os seguintes registros -
id | name | age | address | salary
----+-------+-----+------------+--------
1 | Paul | 32 | California | 20000
2 | Allen | 25 | Texas | 15000
4 | Mark | 25 | Rich-Mond | 65000
5 | David | 27 | Texas | 85000
6 | Kim | 22 | South-Hall | 45000
7 | James | 24 | Houston | 10000
3 | Teddy | 23 | Norway | 15000
(7 rows)
Se você deseja modificar todos os valores das colunas ADDRESS e SALARY na tabela COMPANY, você não precisa usar a cláusula WHERE e a consulta UPDATE seria a seguinte -
testdb=# UPDATE COMPANY SET ADDRESS = 'Texas', SALARY=20000;
Agora, a tabela COMPANY terá os seguintes registros -
id | name | age | address | salary
----+-------+-----+---------+--------
1 | Paul | 32 | Texas | 20000
2 | Allen | 25 | Texas | 20000
4 | Mark | 25 | Texas | 20000
5 | David | 27 | Texas | 20000
6 | Kim | 22 | Texas | 20000
7 | James | 24 | Texas | 20000
3 | Teddy | 23 | Texas | 20000
(7 rows)
O PostgreSQL DELETEA consulta é usada para excluir os registros existentes de uma tabela. Você pode usar a cláusula WHERE com a consulta DELETE para excluir as linhas selecionadas. Caso contrário, todos os registros seriam excluídos.
Sintaxe
A sintaxe básica da consulta DELETE com a cláusula WHERE é a seguinte -
DELETE FROM table_name
WHERE [condition];
Você pode combinar um número N de condições usando os operadores AND ou OR.
Exemplo
Considere a tabela EMPRESA , tendo os registros a seguir -
# select * from COMPANY;
id | name | age | address | salary
----+-------+-----+-----------+--------
1 | Paul | 32 | California| 20000
2 | Allen | 25 | Texas | 15000
3 | Teddy | 23 | Norway | 20000
4 | Mark | 25 | Rich-Mond | 65000
5 | David | 27 | Texas | 85000
6 | Kim | 22 | South-Hall| 45000
7 | James | 24 | Houston | 10000
(7 rows)
A seguir está um exemplo, que EXCLUIRIA um cliente cujo ID é 7 -
testdb=# DELETE FROM COMPANY WHERE ID = 2;
Agora, a tabela COMPANY terá os seguintes registros -
id | name | age | address | salary
----+-------+-----+-------------+--------
1 | Paul | 32 | California | 20000
3 | Teddy | 23 | Norway | 20000
4 | Mark | 25 | Rich-Mond | 65000
5 | David | 27 | Texas | 85000
6 | Kim | 22 | South-Hall | 45000
7 | James | 24 | Houston | 10000
(6 rows)
Se você deseja DELETE todos os registros da tabela COMPANY, você não precisa usar a cláusula WHERE com consultas DELETE, que seriam as seguintes -
testdb=# DELETE FROM COMPANY;
Agora, a tabela COMPANY não possui nenhum registro porque todos os registros foram excluídos pela instrução DELETE.
O PostgreSQL LIKEoperador é usado para comparar valores de texto com um padrão usando curingas. Se a expressão de pesquisa puder ser correspondida à expressão padrão, o operador LIKE retornará verdadeiro, que é1.
Existem dois curingas usados em conjunto com o operador LIKE -
- O sinal de porcentagem (%)
- O sublinhado (_)
O sinal de porcentagem representa zero, um ou vários números ou caracteres. O sublinhado representa um único número ou caractere. Esses símbolos podem ser usados em combinações.
Se qualquer um desses dois sinais não for usado em conjunto com a cláusula LIKE, então o LIKE atua como o operador igual.
Sintaxe
A sintaxe básica de% e _ é a seguinte -
SELECT FROM table_name
WHERE column LIKE 'XXXX%'
or
SELECT FROM table_name
WHERE column LIKE '%XXXX%'
or
SELECT FROM table_name
WHERE column LIKE 'XXXX_'
or
SELECT FROM table_name
WHERE column LIKE '_XXXX'
or
SELECT FROM table_name
WHERE column LIKE '_XXXX_'
Você pode combinar um número N de condições usando os operadores AND ou OR. Aqui, XXXX pode ser qualquer valor numérico ou string.
Exemplo
Aqui estão alguns exemplos que mostram a parte WHERE com cláusulas LIKE diferentes com os operadores '%' e '_' -
S. No. | Declaração e descrição |
---|---|
1 | WHERE SALARY::text LIKE '200%' Encontra todos os valores que começam com 200 |
2 | WHERE SALARY::text LIKE '%200%' Encontra qualquer valor que tenha 200 em qualquer posição |
3 | WHERE SALARY::text LIKE '_00%' Encontra qualquer valor que tenha 00 na segunda e terceira posições |
4 | WHERE SALARY::text LIKE '2_%_%' Encontra qualquer valor que comece com 2 e tenha pelo menos 3 caracteres de comprimento |
5 | WHERE SALARY::text LIKE '%2' Encontra todos os valores que terminam com 2 |
6 | WHERE SALARY::text LIKE '_2%3' Encontra qualquer valor que tenha 2 na segunda posição e termine com 3 |
7 | WHERE SALARY::text LIKE '2___3' Encontra qualquer valor em um número de cinco dígitos que começa com 2 e termina com 3 |
Postgres LIKE é apenas comparação de strings. Portanto, precisamos converter explicitamente a coluna inteira em string como nos exemplos acima.
Tomemos um exemplo real, considere a tabela COMPANY , tendo os registros a seguir -
# select * from COMPANY;
id | name | age | address | salary
----+-------+-----+-----------+--------
1 | Paul | 32 | California| 20000
2 | Allen | 25 | Texas | 15000
3 | Teddy | 23 | Norway | 20000
4 | Mark | 25 | Rich-Mond | 65000
5 | David | 27 | Texas | 85000
6 | Kim | 22 | South-Hall| 45000
7 | James | 24 | Houston | 10000
(7 rows)
A seguir está um exemplo, que exibiria todos os registros da tabela COMPANY onde AGE começa com 2 -
testdb=# SELECT * FROM COMPANY WHERE AGE::text LIKE '2%';
Isso produziria o seguinte resultado -
id | name | age | address | salary
----+-------+-----+-------------+--------
2 | Allen | 25 | Texas | 15000
3 | Teddy | 23 | Norway | 20000
4 | Mark | 25 | Rich-Mond | 65000
5 | David | 27 | Texas | 85000
6 | Kim | 22 | South-Hall | 45000
7 | James | 24 | Houston | 10000
8 | Paul | 24 | Houston | 20000
(7 rows)
A seguir está um exemplo, que exibiria todos os registros da tabela COMPANY onde ADDRESS terá um hífen (-) dentro do texto -
testdb=# SELECT * FROM COMPANY WHERE ADDRESS LIKE '%-%';
Isso produziria o seguinte resultado -
id | name | age | address | salary
----+------+-----+-------------------------------------------+--------
4 | Mark | 25 | Rich-Mond | 65000
6 | Kim | 22 | South-Hall | 45000
(2 rows)
O PostgreSQL LIMIT A cláusula é usada para limitar a quantidade de dados retornada pela instrução SELECT.
Sintaxe
A sintaxe básica da instrução SELECT com a cláusula LIMIT é a seguinte -
SELECT column1, column2, columnN
FROM table_name
LIMIT [no of rows]
A seguir está a sintaxe da cláusula LIMIT quando ela é usada junto com a cláusula OFFSET -
SELECT column1, column2, columnN
FROM table_name
LIMIT [no of rows] OFFSET [row num]
LIMIT e OFFSET permitem que você recupere apenas uma parte das linhas que são geradas pelo resto da consulta.
Exemplo
Considere a tabela COMPANHIA com os registros a seguir -
# select * from COMPANY;
id | name | age | address | salary
----+-------+-----+-----------+--------
1 | Paul | 32 | California| 20000
2 | Allen | 25 | Texas | 15000
3 | Teddy | 23 | Norway | 20000
4 | Mark | 25 | Rich-Mond | 65000
5 | David | 27 | Texas | 85000
6 | Kim | 22 | South-Hall| 45000
7 | James | 24 | Houston | 10000
(7 rows)
A seguir está um exemplo, que limita a linha na tabela de acordo com o número de linhas que você deseja buscar da tabela -
testdb=# SELECT * FROM COMPANY LIMIT 4;
Isso produziria o seguinte resultado -
id | name | age | address | salary
----+-------+-----+-------------+--------
1 | Paul | 32 | California | 20000
2 | Allen | 25 | Texas | 15000
3 | Teddy | 23 | Norway | 20000
4 | Mark | 25 | Rich-Mond | 65000
(4 rows)
No entanto, em certas situações, pode ser necessário selecionar um conjunto de registros de um deslocamento específico. Aqui está um exemplo que pega três registros a partir da terceira posição -
testdb=# SELECT * FROM COMPANY LIMIT 3 OFFSET 2;
Isso produziria o seguinte resultado -
id | name | age | address | salary
----+-------+-----+-----------+--------
3 | Teddy | 23 | Norway | 20000
4 | Mark | 25 | Rich-Mond | 65000
5 | David | 27 | Texas | 85000
(3 rows)
O PostgreSQL ORDER BY cláusula é usada para classificar os dados em ordem crescente ou decrescente, com base em uma ou mais colunas.
Sintaxe
A sintaxe básica da cláusula ORDER BY é a seguinte -
SELECT column-list
FROM table_name
[WHERE condition]
[ORDER BY column1, column2, .. columnN] [ASC | DESC];
Você pode usar mais de uma coluna na cláusula ORDER BY. Certifique-se de qualquer coluna que você está usando para classificar, essa coluna deve estar disponível na lista de colunas.
Exemplo
Considere a tabela COMPANHIA com os registros a seguir -
testdb# select * from COMPANY;
id | name | age | address | salary
----+-------+-----+-----------+--------
1 | Paul | 32 | California| 20000
2 | Allen | 25 | Texas | 15000
3 | Teddy | 23 | Norway | 20000
4 | Mark | 25 | Rich-Mond | 65000
5 | David | 27 | Texas | 85000
6 | Kim | 22 | South-Hall| 45000
7 | James | 24 | Houston | 10000
(7 rows)
A seguir está um exemplo, que classificaria o resultado em ordem crescente por SALÁRIO -
testdb=# SELECT * FROM COMPANY ORDER BY AGE ASC;
Isso produziria o seguinte resultado -
id | name | age | address | salary
----+-------+-----+------------+--------
6 | Kim | 22 | South-Hall | 45000
3 | Teddy | 23 | Norway | 20000
7 | James | 24 | Houston | 10000
8 | Paul | 24 | Houston | 20000
4 | Mark | 25 | Rich-Mond | 65000
2 | Allen | 25 | Texas | 15000
5 | David | 27 | Texas | 85000
1 | Paul | 32 | California | 20000
9 | James | 44 | Norway | 5000
10 | James | 45 | Texas | 5000
(10 rows)
A seguir está um exemplo, que classificaria o resultado em ordem crescente por NOME e SALÁRIO -
testdb=# SELECT * FROM COMPANY ORDER BY NAME, SALARY ASC;
Isso produziria o seguinte resultado -
id | name | age | address | salary
----+-------+-----+--------------+--------
2 | Allen | 25 | Texas | 15000
5 | David | 27 | Texas | 85000
10 | James | 45 | Texas | 5000
9 | James | 44 | Norway | 5000
7 | James | 24 | Houston | 10000
6 | Kim | 22 | South-Hall | 45000
4 | Mark | 25 | Rich-Mond | 65000
1 | Paul | 32 | California | 20000
8 | Paul | 24 | Houston | 20000
3 | Teddy | 23 | Norway | 20000
(10 rows)
A seguir está um exemplo, que classificaria o resultado em ordem decrescente por NOME -
testdb=# SELECT * FROM COMPANY ORDER BY NAME DESC;
Isso produziria o seguinte resultado -
id | name | age | address | salary
----+-------+-----+------------+--------
3 | Teddy | 23 | Norway | 20000
1 | Paul | 32 | California | 20000
8 | Paul | 24 | Houston | 20000
4 | Mark | 25 | Rich-Mond | 65000
6 | Kim | 22 | South-Hall | 45000
7 | James | 24 | Houston | 10000
9 | James | 44 | Norway | 5000
10 | James | 45 | Texas | 5000
5 | David | 27 | Texas | 85000
2 | Allen | 25 | Texas | 15000
(10 rows)
O PostgreSQL GROUP BYA cláusula é usada em colaboração com a instrução SELECT para agrupar essas linhas em uma tabela que possui dados idênticos. Isso é feito para eliminar a redundância na saída e / ou agregados de computação que se aplicam a esses grupos.
A cláusula GROUP BY segue a cláusula WHERE em uma instrução SELECT e precede a cláusula ORDER BY.
Sintaxe
A sintaxe básica da cláusula GROUP BY é fornecida a seguir. A cláusula GROUP BY deve seguir as condições da cláusula WHERE e deve preceder a cláusula ORDER BY, se uma for usada.
SELECT column-list
FROM table_name
WHERE [ conditions ]
GROUP BY column1, column2....columnN
ORDER BY column1, column2....columnN
Você pode usar mais de uma coluna na cláusula GROUP BY. Certifique-se de qualquer coluna que você está usando para agrupar, essa coluna deve estar disponível na lista de colunas.
Exemplo
Considere a tabela COMPANHIA com os registros a seguir -
# select * from COMPANY;
id | name | age | address | salary
----+-------+-----+-----------+--------
1 | Paul | 32 | California| 20000
2 | Allen | 25 | Texas | 15000
3 | Teddy | 23 | Norway | 20000
4 | Mark | 25 | Rich-Mond | 65000
5 | David | 27 | Texas | 85000
6 | Kim | 22 | South-Hall| 45000
7 | James | 24 | Houston | 10000
(7 rows)
Se você quiser saber o valor total do salário de cada cliente, a consulta GROUP BY seria a seguinte -
testdb=# SELECT NAME, SUM(SALARY) FROM COMPANY GROUP BY NAME;
Isso produziria o seguinte resultado -
name | sum
-------+-------
Teddy | 20000
Paul | 20000
Mark | 65000
David | 85000
Allen | 15000
Kim | 45000
James | 10000
(7 rows)
Agora, vamos criar mais três registros na tabela COMPANY usando as seguintes instruções INSERT -
INSERT INTO COMPANY VALUES (8, 'Paul', 24, 'Houston', 20000.00);
INSERT INTO COMPANY VALUES (9, 'James', 44, 'Norway', 5000.00);
INSERT INTO COMPANY VALUES (10, 'James', 45, 'Texas', 5000.00);
Agora, nossa tabela tem os seguintes registros com nomes duplicados -
id | name | age | address | salary
----+-------+-----+--------------+--------
1 | Paul | 32 | California | 20000
2 | Allen | 25 | Texas | 15000
3 | Teddy | 23 | Norway | 20000
4 | Mark | 25 | Rich-Mond | 65000
5 | David | 27 | Texas | 85000
6 | Kim | 22 | South-Hall | 45000
7 | James | 24 | Houston | 10000
8 | Paul | 24 | Houston | 20000
9 | James | 44 | Norway | 5000
10 | James | 45 | Texas | 5000
(10 rows)
Novamente, vamos usar a mesma instrução para agrupar por todos os registros usando a coluna NAME da seguinte forma -
testdb=# SELECT NAME, SUM(SALARY) FROM COMPANY GROUP BY NAME ORDER BY NAME;
Isso produziria o seguinte resultado -
name | sum
-------+-------
Allen | 15000
David | 85000
James | 20000
Kim | 45000
Mark | 65000
Paul | 40000
Teddy | 20000
(7 rows)
Vamos usar a cláusula ORDER BY junto com a cláusula GROUP BY da seguinte maneira -
testdb=# SELECT NAME, SUM(SALARY)
FROM COMPANY GROUP BY NAME ORDER BY NAME DESC;
Isso produziria o seguinte resultado -
name | sum
-------+-------
Teddy | 20000
Paul | 40000
Mark | 65000
Kim | 45000
James | 20000
David | 85000
Allen | 15000
(7 rows)
No PostgreSQL, a consulta WITH fornece uma maneira de escrever instruções auxiliares para uso em uma consulta maior. Ajuda a dividir consultas complicadas e grandes em formulários mais simples, que são facilmente legíveis. Essas instruções geralmente chamadas de Expressões de Tabela Comuns ou CTEs podem ser consideradas como definições de tabelas temporárias que existem apenas para uma consulta.
A consulta WITH sendo uma consulta CTE, é particularmente útil quando a subconsulta é executada várias vezes. É igualmente útil no lugar de tabelas temporárias. Ele calcula a agregação uma vez e nos permite fazer referência a ela por seu nome (pode ser várias vezes) nas consultas.
A cláusula WITH deve ser definida antes de ser usada na consulta.
Sintaxe
A sintaxe básica da consulta WITH é a seguinte -
WITH
name_for_summary_data AS (
SELECT Statement)
SELECT columns
FROM name_for_summary_data
WHERE conditions <=> (
SELECT column
FROM name_for_summary_data)
[ORDER BY columns]
Onde name_for_summary_data é o nome dado à cláusula WITH. O name_for_summary_data pode ser igual a um nome de tabela existente e terá precedência.
Você pode usar instruções de modificação de dados (INSERT, UPDATE ou DELETE) em WITH. Isso permite que você execute várias operações diferentes na mesma consulta.
Recursivo COM
Exemplo
Considere a tabela COMPANHIA com os registros a seguir -
testdb# select * from COMPANY;
id | name | age | address | salary
----+-------+-----+-----------+--------
1 | Paul | 32 | California| 20000
2 | Allen | 25 | Texas | 15000
3 | Teddy | 23 | Norway | 20000
4 | Mark | 25 | Rich-Mond | 65000
5 | David | 27 | Texas | 85000
6 | Kim | 22 | South-Hall| 45000
7 | James | 24 | Houston | 10000
(7 rows)
Agora, vamos escrever uma consulta usando a cláusula WITH para selecionar os registros da tabela acima, como segue -
With CTE AS
(Select
ID
, NAME
, AGE
, ADDRESS
, SALARY
FROM COMPANY )
Select * From CTE;
A instrução PostgreSQL fornecida acima produzirá o seguinte resultado -
id | name | age | address | salary
----+-------+-----+-----------+--------
1 | Paul | 32 | California| 20000
2 | Allen | 25 | Texas | 15000
3 | Teddy | 23 | Norway | 20000
4 | Mark | 25 | Rich-Mond | 65000
5 | David | 27 | Texas | 85000
6 | Kim | 22 | South-Hall| 45000
7 | James | 24 | Houston | 10000
(7 rows)
Agora, vamos escrever uma consulta usando a palavra-chave RECURSIVE junto com a cláusula WITH, para encontrar a soma dos salários abaixo de 20000, como segue -
WITH RECURSIVE t(n) AS (
VALUES (0)
UNION ALL
SELECT SALARY FROM COMPANY WHERE SALARY < 20000
)
SELECT sum(n) FROM t;
A instrução PostgreSQL fornecida acima produzirá o seguinte resultado -
sum
-------
25000
(1 row)
Vamos escrever uma consulta usando instruções de modificação de dados junto com a cláusula WITH, conforme mostrado abaixo.
Primeiro, crie uma tabela COMPANY1 semelhante à tabela COMPANY. A consulta no exemplo move efetivamente as linhas de COMPANY para COMPANY1. O DELETE em WITH apaga as linhas especificadas de COMPANY, retornando seu conteúdo por meio de sua cláusula RETURNING; e, em seguida, a consulta primária lê essa saída e a insere em COMPANY1 TABLE -
CREATE TABLE COMPANY1(
ID INT PRIMARY KEY NOT NULL,
NAME TEXT NOT NULL,
AGE INT NOT NULL,
ADDRESS CHAR(50),
SALARY REAL
);
WITH moved_rows AS (
DELETE FROM COMPANY
WHERE
SALARY >= 30000
RETURNING *
)
INSERT INTO COMPANY1 (SELECT * FROM moved_rows);
A instrução PostgreSQL fornecida acima produzirá o seguinte resultado -
INSERT 0 3
Agora, os registros nas tabelas COMPANY e COMPANY1 são os seguintes -
testdb=# SELECT * FROM COMPANY;
id | name | age | address | salary
----+-------+-----+------------+--------
1 | Paul | 32 | California | 20000
2 | Allen | 25 | Texas | 15000
3 | Teddy | 23 | Norway | 20000
7 | James | 24 | Houston | 10000
(4 rows)
testdb=# SELECT * FROM COMPANY1;
id | name | age | address | salary
----+-------+-----+-------------+--------
4 | Mark | 25 | Rich-Mond | 65000
5 | David | 27 | Texas | 85000
6 | Kim | 22 | South-Hall | 45000
(3 rows)
A cláusula HAVING nos permite selecionar linhas específicas onde o resultado da função atende a alguma condição.
A cláusula WHERE coloca condições nas colunas selecionadas, enquanto a cláusula HAVING coloca condições nos grupos criados pela cláusula GROUP BY.
Sintaxe
A seguir está a posição da cláusula HAVING em uma consulta SELECT -
SELECT
FROM
WHERE
GROUP BY
HAVING
ORDER BY
A cláusula HAVING deve seguir a cláusula GROUP BY em uma consulta e também deve preceder a cláusula ORDER BY, se usada. A seguir está a sintaxe da instrução SELECT, incluindo a cláusula HAVING -
SELECT column1, column2
FROM table1, table2
WHERE [ conditions ]
GROUP BY column1, column2
HAVING [ conditions ]
ORDER BY column1, column2
Exemplo
Considere a tabela COMPANHIA com os registros a seguir -
# select * from COMPANY;
id | name | age | address | salary
----+-------+-----+-----------+--------
1 | Paul | 32 | California| 20000
2 | Allen | 25 | Texas | 15000
3 | Teddy | 23 | Norway | 20000
4 | Mark | 25 | Rich-Mond | 65000
5 | David | 27 | Texas | 85000
6 | Kim | 22 | South-Hall| 45000
7 | James | 24 | Houston | 10000
(7 rows)
A seguir está um exemplo, que exibiria o registro para o qual a contagem de nomes é menor que 2 -
testdb-# SELECT NAME FROM COMPANY GROUP BY name HAVING count(name) < 2;
Isso produziria o seguinte resultado -
name
-------
Teddy
Paul
Mark
David
Allen
Kim
James
(7 rows)
Agora, vamos criar mais três registros na tabela COMPANY usando as seguintes instruções INSERT -
INSERT INTO COMPANY VALUES (8, 'Paul', 24, 'Houston', 20000.00);
INSERT INTO COMPANY VALUES (9, 'James', 44, 'Norway', 5000.00);
INSERT INTO COMPANY VALUES (10, 'James', 45, 'Texas', 5000.00);
Agora, nossa tabela tem os seguintes registros com nomes duplicados -
id | name | age | address | salary
----+-------+-----+--------------+--------
1 | Paul | 32 | California | 20000
2 | Allen | 25 | Texas | 15000
3 | Teddy | 23 | Norway | 20000
4 | Mark | 25 | Rich-Mond | 65000
5 | David | 27 | Texas | 85000
6 | Kim | 22 | South-Hall | 45000
7 | James | 24 | Houston | 10000
8 | Paul | 24 | Houston | 20000
9 | James | 44 | Norway | 5000
10 | James | 45 | Texas | 5000
(10 rows)
A seguir está o exemplo, que exibiria o registro para o qual a contagem de nomes é maior que 1 -
testdb-# SELECT NAME FROM COMPANY GROUP BY name HAVING count(name) > 1;
Isso produziria o seguinte resultado -
name
-------
Paul
James
(2 rows)
O PostgreSQL DISTINCT A palavra-chave é usada em conjunto com a instrução SELECT para eliminar todos os registros duplicados e buscar apenas registros únicos.
Pode haver uma situação em que você tenha vários registros duplicados em uma tabela. Ao buscar esses registros, faz mais sentido buscar apenas registros únicos em vez de buscar registros duplicados.
Sintaxe
A sintaxe básica da palavra-chave DISTINCT para eliminar registros duplicados é a seguinte -
SELECT DISTINCT column1, column2,.....columnN
FROM table_name
WHERE [condition]
Exemplo
Considere a tabela COMPANHIA com os registros a seguir -
# select * from COMPANY;
id | name | age | address | salary
----+-------+-----+-----------+--------
1 | Paul | 32 | California| 20000
2 | Allen | 25 | Texas | 15000
3 | Teddy | 23 | Norway | 20000
4 | Mark | 25 | Rich-Mond | 65000
5 | David | 27 | Texas | 85000
6 | Kim | 22 | South-Hall| 45000
7 | James | 24 | Houston | 10000
(7 rows)
Vamos adicionar mais dois registros a esta tabela da seguinte maneira -
INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (8, 'Paul', 32, 'California', 20000.00 );
INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (9, 'Allen', 25, 'Texas', 15000.00 );
Agora, os registros na tabela COMPANY seriam -
id | name | age | address | salary
----+-------+-----+------------+--------
1 | Paul | 32 | California | 20000
2 | Allen | 25 | Texas | 15000
3 | Teddy | 23 | Norway | 20000
4 | Mark | 25 | Rich-Mond | 65000
5 | David | 27 | Texas | 85000
6 | Kim | 22 | South-Hall | 45000
7 | James | 24 | Houston | 10000
8 | Paul | 32 | California | 20000
9 | Allen | 25 | Texas | 15000
(9 rows)
Primeiro, vamos ver como a seguinte consulta SELECT retorna registros de salários duplicados -
testdb=# SELECT name FROM COMPANY;
Isso produziria o seguinte resultado -
name
-------
Paul
Allen
Teddy
Mark
David
Kim
James
Paul
Allen
(9 rows)
Agora, vamos usar DISTINCT palavra-chave com a consulta SELECT acima e veja o resultado -
testdb=# SELECT DISTINCT name FROM COMPANY;
Isso produziria o seguinte resultado, onde não temos nenhuma entrada duplicada -
name
-------
Teddy
Paul
Mark
David
Allen
Kim
James
(7 rows)
As restrições são as regras aplicadas às colunas de dados da tabela. Eles são usados para evitar que dados inválidos sejam inseridos no banco de dados. Isso garante a precisão e confiabilidade dos dados no banco de dados.
As restrições podem ser nível de coluna ou nível de tabela. As restrições de nível de coluna são aplicadas apenas a uma coluna, enquanto as restrições de nível de tabela são aplicadas a toda a tabela. Definir um tipo de dados para uma coluna é uma restrição em si. Por exemplo, uma coluna do tipo DATE restringe a coluna a datas válidas.
A seguir estão as restrições comumente usadas disponíveis no PostgreSQL.
NOT NULL Constraint - Garante que uma coluna não possa ter valor NULL.
UNIQUE Constraint - Garante que todos os valores em uma coluna sejam diferentes.
PRIMARY Key - Identifica exclusivamente cada linha / registro em uma tabela de banco de dados.
FOREIGN Key - Restringe os dados com base nas colunas de outras tabelas.
CHECK Constraint - A restrição CHECK garante que todos os valores em uma coluna satisfaçam certas condições.
EXCLUSION Constraint - A restrição EXCLUDE garante que, se quaisquer duas linhas forem comparadas na (s) coluna (s) ou expressão (ões) especificada (s) usando o (s) operador (es) especificado (s), nem todas essas comparações retornarão TRUE.
Restrição NOT NULL
Por padrão, uma coluna pode conter valores NULL. Se você não quiser que uma coluna tenha um valor NULL, então você precisa definir tal restrição nesta coluna especificando que NULL agora não é permitido para aquela coluna. Uma restrição NOT NULL é sempre escrita como uma restrição de coluna.
Um NULL não é o mesmo que nenhum dado; em vez disso, representa dados desconhecidos.
Exemplo
Por exemplo, a seguinte instrução PostgreSQL cria uma nova tabela chamada COMPANY1 e adiciona cinco colunas, três das quais, ID e NAME e AGE, especificam para não aceitar valores NULL -
CREATE TABLE COMPANY1(
ID INT PRIMARY KEY NOT NULL,
NAME TEXT NOT NULL,
AGE INT NOT NULL,
ADDRESS CHAR(50),
SALARY REAL
);
Restrição única
A restrição UNIQUE impede que dois registros tenham valores idênticos em uma coluna específica. Na tabela COMPANY, por exemplo, você pode querer evitar que duas ou mais pessoas tenham a mesma idade.
Exemplo
Por exemplo, a seguinte instrução PostgreSQL cria uma nova tabela chamada COMPANY3 e adiciona cinco colunas. Aqui, a coluna AGE é definida como UNIQUE, de modo que você não pode ter dois registros com a mesma idade -
CREATE TABLE COMPANY3(
ID INT PRIMARY KEY NOT NULL,
NAME TEXT NOT NULL,
AGE INT NOT NULL UNIQUE,
ADDRESS CHAR(50),
SALARY REAL DEFAULT 50000.00
);
Restrição PRIMARY KEY
A restrição PRIMARY KEY identifica exclusivamente cada registro em uma tabela de banco de dados. Pode haver mais colunas UNIQUE, mas apenas uma chave primária em uma tabela. As chaves primárias são importantes ao projetar as tabelas do banco de dados. As chaves primárias são ids únicos.
Nós os usamos para se referir às linhas da tabela. As chaves primárias se tornam chaves estrangeiras em outras tabelas, ao criar relações entre as tabelas. Devido a uma 'supervisão de codificação de longa data', as chaves primárias podem ser NULL no SQLite. Este não é o caso de outros bancos de dados
Uma chave primária é um campo em uma tabela, que identifica exclusivamente cada linha / registro em uma tabela de banco de dados. As chaves primárias devem conter valores exclusivos. Uma coluna de chave primária não pode ter valores NULL.
Uma tabela pode ter apenas uma chave primária, que pode consistir em um ou vários campos. Quando vários campos são usados como uma chave primária, eles são chamados decomposite key.
Se uma tabela tem uma chave primária definida em qualquer campo (s), então você não pode ter dois registros com o mesmo valor desse campo (s).
Exemplo
Você já viu vários exemplos acima, onde criamos a tabela COMAPNY4 com ID como chave primária -
CREATE TABLE COMPANY4(
ID INT PRIMARY KEY NOT NULL,
NAME TEXT NOT NULL,
AGE INT NOT NULL,
ADDRESS CHAR(50),
SALARY REAL
);
Restrição FOREIGN KEY
Uma restrição de chave estrangeira especifica que os valores em uma coluna (ou grupo de colunas) devem corresponder aos valores que aparecem em alguma linha de outra tabela. Dizemos que isso mantém a integridade referencial entre duas tabelas relacionadas. Elas são chamadas de chaves estrangeiras porque as restrições são estrangeiras; isto é, fora da mesa. As chaves estrangeiras às vezes são chamadas de chave de referência.
Exemplo
Por exemplo, a seguinte instrução PostgreSQL cria uma nova tabela chamada COMPANY5 e adiciona cinco colunas.
CREATE TABLE COMPANY6(
ID INT PRIMARY KEY NOT NULL,
NAME TEXT NOT NULL,
AGE INT NOT NULL,
ADDRESS CHAR(50),
SALARY REAL
);
Por exemplo, a seguinte instrução PostgreSQL cria uma nova tabela chamada DEPARTMENT1, que adiciona três colunas. A coluna EMP_ID é a chave estrangeira e faz referência ao campo ID da tabela COMPANY6.
CREATE TABLE DEPARTMENT1(
ID INT PRIMARY KEY NOT NULL,
DEPT CHAR(50) NOT NULL,
EMP_ID INT references COMPANY6(ID)
);
Restrição CHECK
A restrição CHECK permite que uma condição verifique o valor que está sendo inserido em um registro. Se a condição for avaliada como falsa, o registro viola a restrição e não é inserido na tabela.
Exemplo
Por exemplo, a seguinte instrução PostgreSQL cria uma nova tabela chamada COMPANY5 e adiciona cinco colunas. Aqui, adicionamos um CHEQUE com a coluna SALÁRIO, para que você não possa ter nenhum SALÁRIO como Zero.
CREATE TABLE COMPANY5(
ID INT PRIMARY KEY NOT NULL,
NAME TEXT NOT NULL,
AGE INT NOT NULL,
ADDRESS CHAR(50),
SALARY REAL CHECK(SALARY > 0)
);
Restrição de EXCLUSÃO
As restrições de exclusão garantem que, se quaisquer duas linhas forem comparadas nas colunas ou expressões especificadas usando os operadores especificados, pelo menos uma dessas comparações de operador retornará falso ou nulo.
Exemplo
Por exemplo, a seguinte instrução PostgreSQL cria uma nova tabela chamada COMPANY7 e adiciona cinco colunas. Aqui, adicionamos uma restrição EXCLUDE -
CREATE TABLE COMPANY7(
ID INT PRIMARY KEY NOT NULL,
NAME TEXT,
AGE INT ,
ADDRESS CHAR(50),
SALARY REAL,
EXCLUDE USING gist
(NAME WITH =,
AGE WITH <>)
);
Aqui, USING gist é o tipo de índice a ser construído e usado para aplicação.
Você precisa executar o comando CREATE EXTENSION btree_gist , uma vez por banco de dados. Isso instalará a extensão btree_gist, que define as restrições de exclusão em tipos de dados escalares simples.
Como impusemos que a idade tem que ser a mesma, vamos ver isso inserindo registros na tabela -
INSERT INTO COMPANY7 VALUES(1, 'Paul', 32, 'California', 20000.00 );
INSERT INTO COMPANY7 VALUES(2, 'Paul', 32, 'Texas', 20000.00 );
INSERT INTO COMPANY7 VALUES(3, 'Paul', 42, 'California', 20000.00 );
Para as duas primeiras instruções INSERT, os registros são adicionados à tabela COMPANY7. Para a terceira instrução INSERT, o seguinte erro é exibido -
ERROR: conflicting key value violates exclusion constraint "company7_name_age_excl"
DETAIL: Key (name, age)=(Paul, 42) conflicts with existing key (name, age)=(Paul, 32).
Eliminando restrições
Para remover uma restrição, você precisa saber seu nome. Se o nome for conhecido, é fácil abandoná-lo. Caso contrário, você precisa descobrir o nome gerado pelo sistema. O nome da tabela do comando psql \ d pode ser útil aqui. A sintaxe geral é -
ALTER TABLE table_name DROP CONSTRAINT some_name;
O PostgreSQL Joinscláusula é usada para combinar registros de duas ou mais tabelas em um banco de dados. Um JOIN é um meio de combinar campos de duas tabelas usando valores comuns a cada uma.
Os tipos de junção no PostgreSQL são -
- O CROSS JOIN
- O INNER JOIN
- O LEFT OUTER JOIN
- O DIREITO OUTER JOIN
- O FULL OUTER JOIN
Antes de prosseguirmos, consideremos duas tabelas, EMPRESA e DEPARTAMENTO. Já vimos instruções INSERT para preencher a tabela COMPANY. Então, vamos supor que a lista de registros disponíveis na tabela COMPANY -
id | name | age | address | salary | join_date
----+-------+-----+-----------+--------+-----------
1 | Paul | 32 | California| 20000 | 2001-07-13
3 | Teddy | 23 | Norway | 20000 |
4 | Mark | 25 | Rich-Mond | 65000 | 2007-12-13
5 | David | 27 | Texas | 85000 | 2007-12-13
2 | Allen | 25 | Texas | | 2007-12-13
8 | Paul | 24 | Houston | 20000 | 2005-07-13
9 | James | 44 | Norway | 5000 | 2005-07-13
10 | James | 45 | Texas | 5000 | 2005-07-13
Outra tabela é DEPARTAMENTO, tem a seguinte definição -
CREATE TABLE DEPARTMENT(
ID INT PRIMARY KEY NOT NULL,
DEPT CHAR(50) NOT NULL,
EMP_ID INT NOT NULL
);
Aqui está a lista de instruções INSERT para preencher a tabela DEPARTMENT -
INSERT INTO DEPARTMENT (ID, DEPT, EMP_ID)
VALUES (1, 'IT Billing', 1 );
INSERT INTO DEPARTMENT (ID, DEPT, EMP_ID)
VALUES (2, 'Engineering', 2 );
INSERT INTO DEPARTMENT (ID, DEPT, EMP_ID)
VALUES (3, 'Finance', 7 );
Por fim, temos a seguinte lista de registros disponíveis na tabela DEPARTAMENTO -
id | dept | emp_id
----+-------------+--------
1 | IT Billing | 1
2 | Engineering | 2
3 | Finance | 7
O CROSS JOIN
Um CROSS JOIN corresponde a cada linha da primeira tabela com cada linha da segunda tabela. Se as tabelas de entrada tiverem colunas xey, respectivamente, a tabela resultante terá colunas x + y. Como os CROSS JOINs têm o potencial de gerar tabelas extremamente grandes, deve-se tomar cuidado para usá-los somente quando apropriado.
A seguir está a sintaxe de CROSS JOIN -
SELECT ... FROM table1 CROSS JOIN table2 ...
Com base nas tabelas acima, podemos escrever um CROSS JOIN da seguinte forma -
testdb=# SELECT EMP_ID, NAME, DEPT FROM COMPANY CROSS JOIN DEPARTMENT;
A consulta fornecida acima produzirá o seguinte resultado -
emp_id| name | dept
------|-------|--------------
1 | Paul | IT Billing
1 | Teddy | IT Billing
1 | Mark | IT Billing
1 | David | IT Billing
1 | Allen | IT Billing
1 | Paul | IT Billing
1 | James | IT Billing
1 | James | IT Billing
2 | Paul | Engineering
2 | Teddy | Engineering
2 | Mark | Engineering
2 | David | Engineering
2 | Allen | Engineering
2 | Paul | Engineering
2 | James | Engineering
2 | James | Engineering
7 | Paul | Finance
7 | Teddy | Finance
7 | Mark | Finance
7 | David | Finance
7 | Allen | Finance
7 | Paul | Finance
7 | James | Finance
7 | James | Finance
O INNER JOIN
Um INNER JOIN cria uma nova tabela de resultados combinando valores de coluna de duas tabelas (tabela1 e tabela2) com base no predicado de junção. A consulta compara cada linha da tabela1 com cada linha da tabela2 para encontrar todos os pares de linhas que satisfazem o predicado de junção. Quando o predicado de junção é satisfeito, os valores da coluna para cada par correspondente de linhas de table1 e table2 são combinados em uma linha de resultado.
Um INNER JOIN é o tipo mais comum de junção e é o tipo padrão de junção. Você pode usar a palavra-chave INNER opcionalmente.
A seguir está a sintaxe de INNER JOIN -
SELECT table1.column1, table2.column2...
FROM table1
INNER JOIN table2
ON table1.common_filed = table2.common_field;
Com base nas tabelas acima, podemos escrever um INNER JOIN da seguinte forma -
testdb=# SELECT EMP_ID, NAME, DEPT FROM COMPANY INNER JOIN DEPARTMENT
ON COMPANY.ID = DEPARTMENT.EMP_ID;
A consulta fornecida acima produzirá o seguinte resultado -
emp_id | name | dept
--------+-------+------------
1 | Paul | IT Billing
2 | Allen | Engineering
O LEFT OUTER JOIN
O OUTER JOIN é uma extensão do INNER JOIN. O padrão SQL define três tipos de OUTER JOINs: LEFT, RIGHT e FULL e o PostgreSQL oferece suporte a todos eles.
No caso de LEFT OUTER JOIN, uma junção interna é executada primeiro. Então, para cada linha na tabela T1 que não satisfaz a condição de junção com nenhuma linha na tabela T2, uma linha junta é adicionada com valores nulos nas colunas de T2. Portanto, a tabela associada sempre tem pelo menos uma linha para cada linha em T1.
A seguir está a sintaxe de LEFT OUTER JOIN -
SELECT ... FROM table1 LEFT OUTER JOIN table2 ON conditional_expression ...
Com base nas tabelas acima, podemos escrever uma junção interna da seguinte maneira -
testdb=# SELECT EMP_ID, NAME, DEPT FROM COMPANY LEFT OUTER JOIN DEPARTMENT
ON COMPANY.ID = DEPARTMENT.EMP_ID;
A consulta fornecida acima produzirá o seguinte resultado -
emp_id | name | dept
--------+-------+------------
1 | Paul | IT Billing
2 | Allen | Engineering
| James |
| David |
| Paul |
| Mark |
| Teddy |
| James |
O DIREITO OUTER JOIN
Primeiro, uma junção interna é executada. Então, para cada linha na tabela T2 que não satisfaça a condição de junção com nenhuma linha na tabela T1, uma linha junta é adicionada com valores nulos nas colunas de T1. Este é o inverso de uma junção à esquerda; a tabela de resultados sempre terá uma linha para cada linha em T2.
A seguir está a sintaxe de RIGHT OUTER JOIN -
SELECT ... FROM table1 RIGHT OUTER JOIN table2 ON conditional_expression ...
Com base nas tabelas acima, podemos escrever uma junção interna da seguinte maneira -
testdb=# SELECT EMP_ID, NAME, DEPT FROM COMPANY RIGHT OUTER JOIN DEPARTMENT
ON COMPANY.ID = DEPARTMENT.EMP_ID;
A consulta fornecida acima produzirá o seguinte resultado -
emp_id | name | dept
--------+-------+--------
1 | Paul | IT Billing
2 | Allen | Engineering
7 | | Finance
O FULL OUTER JOIN
Primeiro, uma junção interna é executada. Então, para cada linha na tabela T1 que não satisfaz a condição de junção com nenhuma linha na tabela T2, uma linha junta é adicionada com valores nulos nas colunas de T2. Além disso, para cada linha de T2 que não satisfaz a condição de junção com nenhuma linha de T1, é adicionada uma linha juntada com valores nulos nas colunas de T1.
A seguir está a sintaxe de FULL OUTER JOIN -
SELECT ... FROM table1 FULL OUTER JOIN table2 ON conditional_expression ...
Com base nas tabelas acima, podemos escrever uma junção interna da seguinte maneira -
testdb=# SELECT EMP_ID, NAME, DEPT FROM COMPANY FULL OUTER JOIN DEPARTMENT
ON COMPANY.ID = DEPARTMENT.EMP_ID;
A consulta fornecida acima produzirá o seguinte resultado -
emp_id | name | dept
--------+-------+---------------
1 | Paul | IT Billing
2 | Allen | Engineering
7 | | Finance
| James |
| David |
| Paul |
| Mark |
| Teddy |
| James |
O PostgreSQL UNION cláusula / operador é usado para combinar os resultados de duas ou mais instruções SELECT sem retornar nenhuma linha duplicada.
Para usar UNION, cada SELECT deve ter o mesmo número de colunas selecionadas, o mesmo número de expressões de coluna, o mesmo tipo de dados e tê-los na mesma ordem, mas não precisam ter o mesmo comprimento.
Sintaxe
A sintaxe básica de UNION é o seguinte -
SELECT column1 [, column2 ]
FROM table1 [, table2 ]
[WHERE condition]
UNION
SELECT column1 [, column2 ]
FROM table1 [, table2 ]
[WHERE condition]
Aqui, determinada condição pode ser qualquer expressão com base em seus requisitos.
Exemplo
Considere as duas tabelas a seguir, (a) a tabela COMPANY é a seguinte -
testdb=# SELECT * from COMPANY;
id | name | age | address | salary
----+-------+-----+-----------+--------
1 | Paul | 32 | California| 20000
2 | Allen | 25 | Texas | 15000
3 | Teddy | 23 | Norway | 20000
4 | Mark | 25 | Rich-Mond | 65000
5 | David | 27 | Texas | 85000
6 | Kim | 22 | South-Hall| 45000
7 | James | 24 | Houston | 10000
(7 rows)
(b) Outra tabela é DEPARTAMENTO da seguinte forma -
testdb=# SELECT * from DEPARTMENT;
id | dept | emp_id
----+-------------+--------
1 | IT Billing | 1
2 | Engineering | 2
3 | Finance | 7
4 | Engineering | 3
5 | Finance | 4
6 | Engineering | 5
7 | Finance | 6
(7 rows)
Agora vamos juntar essas duas tabelas usando a instrução SELECT junto com a cláusula UNION da seguinte maneira -
testdb=# SELECT EMP_ID, NAME, DEPT FROM COMPANY INNER JOIN DEPARTMENT
ON COMPANY.ID = DEPARTMENT.EMP_ID
UNION
SELECT EMP_ID, NAME, DEPT FROM COMPANY LEFT OUTER JOIN DEPARTMENT
ON COMPANY.ID = DEPARTMENT.EMP_ID;
Isso produziria o seguinte resultado -
emp_id | name | dept
--------+-------+--------------
5 | David | Engineering
6 | Kim | Finance
2 | Allen | Engineering
3 | Teddy | Engineering
4 | Mark | Finance
1 | Paul | IT Billing
7 | James | Finance
(7 rows)
A cláusula UNION ALL
O operador UNION ALL é usado para combinar os resultados de duas instruções SELECT incluindo linhas duplicadas. As mesmas regras que se aplicam ao UNION também se aplicam ao operador UNION ALL.
Sintaxe
A sintaxe básica de UNION ALL é o seguinte -
SELECT column1 [, column2 ]
FROM table1 [, table2 ]
[WHERE condition]
UNION ALL
SELECT column1 [, column2 ]
FROM table1 [, table2 ]
[WHERE condition]
Aqui, determinada condição pode ser qualquer expressão com base em seus requisitos.
Exemplo
Agora, vamos juntar as duas tabelas mencionadas acima em nossa instrução SELECT da seguinte maneira -
testdb=# SELECT EMP_ID, NAME, DEPT FROM COMPANY INNER JOIN DEPARTMENT
ON COMPANY.ID = DEPARTMENT.EMP_ID
UNION ALL
SELECT EMP_ID, NAME, DEPT FROM COMPANY LEFT OUTER JOIN DEPARTMENT
ON COMPANY.ID = DEPARTMENT.EMP_ID;
Isso produziria o seguinte resultado -
emp_id | name | dept
--------+-------+--------------
1 | Paul | IT Billing
2 | Allen | Engineering
7 | James | Finance
3 | Teddy | Engineering
4 | Mark | Finance
5 | David | Engineering
6 | Kim | Finance
1 | Paul | IT Billing
2 | Allen | Engineering
7 | James | Finance
3 | Teddy | Engineering
4 | Mark | Finance
5 | David | Engineering
6 | Kim | Finance
(14 rows)
O PostgreSQL NULLé o termo usado para representar um valor ausente. Um valor NULL em uma tabela é um valor em um campo que parece estar em branco.
Um campo com valor NULL é um campo sem valor. É muito importante entender que um valor NULL é diferente de um valor zero ou de um campo que contém espaços.
Sintaxe
A sintaxe básica de uso NULL ao criar uma tabela é o seguinte -
CREATE TABLE COMPANY(
ID INT PRIMARY KEY NOT NULL,
NAME TEXT NOT NULL,
AGE INT NOT NULL,
ADDRESS CHAR(50),
SALARY REAL
);
Aqui, NOT NULLsignifica que a coluna deve sempre aceitar um valor explícito do tipo de dados fornecido. Existem duas colunas onde não usamos NOT NULL. Portanto, isso significa que essas colunas podem ser NULL.
Um campo com valor NULL é aquele que foi deixado em branco durante a criação do registro.
Exemplo
O valor NULL pode causar problemas na seleção dos dados, pois ao comparar um valor desconhecido com qualquer outro valor, o resultado é sempre desconhecido e não é incluído no resultado final. Considere a tabela a seguir, EMPRESA com os seguintes registros -
ID NAME AGE ADDRESS SALARY
---------- ---------- ---------- ---------- ----------
1 Paul 32 California 20000.0
2 Allen 25 Texas 15000.0
3 Teddy 23 Norway 20000.0
4 Mark 25 Rich-Mond 65000.0
5 David 27 Texas 85000.0
6 Kim 22 South-Hall 45000.0
7 James 24 Houston 10000.0
Vamos usar a instrução UPDATE para definir alguns valores anuláveis como NULL da seguinte maneira -
testdb=# UPDATE COMPANY SET ADDRESS = NULL, SALARY = NULL where ID IN(6,7);
Agora, a tabela COMPANY deve ter os seguintes registros -
id | name | age | address | salary
----+-------+-----+-------------+--------
1 | Paul | 32 | California | 20000
2 | Allen | 25 | Texas | 15000
3 | Teddy | 23 | Norway | 20000
4 | Mark | 25 | Rich-Mond | 65000
5 | David | 27 | Texas | 85000
6 | Kim | 22 | |
7 | James | 24 | |
(7 rows)
A seguir, vamos ver o uso de IS NOT NULL operador para listar todos os registros onde SALARY não é NULL -
testdb=# SELECT ID, NAME, AGE, ADDRESS, SALARY
FROM COMPANY
WHERE SALARY IS NOT NULL;
A instrução PostgreSQL fornecida acima produzirá o seguinte resultado -
id | name | age | address | salary
----+-------+-----+------------+--------
1 | Paul | 32 | California | 20000
2 | Allen | 25 | Texas | 15000
3 | Teddy | 23 | Norway | 20000
4 | Mark | 25 | Rich-Mond | 65000
5 | David | 27 | Texas | 85000
(5 rows)
A seguir está o uso de IS NULL operador que irá listar todos os registros onde SALARY é NULL -
testdb=# SELECT ID, NAME, AGE, ADDRESS, SALARY
FROM COMPANY
WHERE SALARY IS NULL;
A instrução PostgreSQL fornecida acima produzirá o seguinte resultado -
id | name | age | address | salary
----+-------+-----+---------+--------
6 | Kim | 22 | |
7 | James | 24 | |
(2 rows)
Você pode renomear uma tabela ou coluna temporariamente, dando outro nome, que é conhecido como ALIAS. O uso de apelidos de tabela significa renomear uma tabela em uma instrução PostgreSQL particular. A renomeação é uma mudança temporária e o nome real da tabela não muda no banco de dados.
Os apelidos de coluna são usados para renomear as colunas de uma tabela com o propósito de uma consulta PostgreSQL específica.
Sintaxe
A sintaxe básica de table alias é o seguinte -
SELECT column1, column2....
FROM table_name AS alias_name
WHERE [condition];
A sintaxe básica de column alias é o seguinte -
SELECT column_name AS alias_name
FROM table_name
WHERE [condition];
Exemplo
Considere as duas tabelas a seguir, (a) a tabela COMPANY é a seguinte -
testdb=# select * from COMPANY;
id | name | age | address | salary
----+-------+-----+-----------+--------
1 | Paul | 32 | California| 20000
2 | Allen | 25 | Texas | 15000
3 | Teddy | 23 | Norway | 20000
4 | Mark | 25 | Rich-Mond | 65000
5 | David | 27 | Texas | 85000
6 | Kim | 22 | South-Hall| 45000
7 | James | 24 | Houston | 10000
(7 rows)
(b) Outra tabela é DEPARTAMENTO da seguinte forma -
id | dept | emp_id
----+--------------+--------
1 | IT Billing | 1
2 | Engineering | 2
3 | Finance | 7
4 | Engineering | 3
5 | Finance | 4
6 | Engineering | 5
7 | Finance | 6
(7 rows)
Agora, a seguir está o uso de TABLE ALIAS onde usamos C e D como aliases para as tabelas COMPANY e DEPARTMENT, respectivamente -
testdb=# SELECT C.ID, C.NAME, C.AGE, D.DEPT
FROM COMPANY AS C, DEPARTMENT AS D
WHERE C.ID = D.EMP_ID;
A instrução PostgreSQL fornecida acima produzirá o seguinte resultado -
id | name | age | dept
----+-------+-----+------------
1 | Paul | 32 | IT Billing
2 | Allen | 25 | Engineering
7 | James | 24 | Finance
3 | Teddy | 23 | Engineering
4 | Mark | 25 | Finance
5 | David | 27 | Engineering
6 | Kim | 22 | Finance
(7 rows)
Vamos ver um exemplo para o uso de COLUMN ALIAS onde COMPANY_ID é um alias da coluna ID e COMPANY_NAME é um alias da coluna de nome -
testdb=# SELECT C.ID AS COMPANY_ID, C.NAME AS COMPANY_NAME, C.AGE, D.DEPT
FROM COMPANY AS C, DEPARTMENT AS D
WHERE C.ID = D.EMP_ID;
A instrução PostgreSQL fornecida acima produzirá o seguinte resultado -
company_id | company_name | age | dept
------------+--------------+-----+------------
1 | Paul | 32 | IT Billing
2 | Allen | 25 | Engineering
7 | James | 24 | Finance
3 | Teddy | 23 | Engineering
4 | Mark | 25 | Finance
5 | David | 27 | Engineering
6 | Kim | 22 | Finance
(7 rows)
PostgreSQL Triggers são funções de retorno de chamada de banco de dados, que são executadas / chamadas automaticamente quando ocorre um evento de banco de dados especificado.
A seguir estão alguns pontos importantes sobre os gatilhos do PostgreSQL -
O gatilho PostgreSQL pode ser especificado para disparar
Antes que a operação seja tentada em uma linha (antes que as restrições sejam verificadas e INSERT, UPDATE ou DELETE seja tentada)
Depois que a operação for concluída (depois que as restrições forem verificadas e INSERT, UPDATE ou DELETE for concluído)
Em vez da operação (no caso de inserções, atualizações ou exclusões em uma visualização)
Um gatilho marcado PARA CADA LINHA é chamado uma vez para cada linha que a operação modifica. Em contraste, um gatilho marcado como FOR EACH STATEMENT é executado apenas uma vez para qualquer operação, independentemente de quantas linhas ele modifica.
Tanto a cláusula WHEN quanto as ações de gatilho podem acessar elementos da linha sendo inserida, excluída ou atualizada usando referências do formulário NEW.column-name e OLD.column-name, em que nome-da-coluna é o nome de uma coluna da tabela à qual o acionador está associado.
Se uma cláusula WHEN for fornecida, as instruções do PostgreSQL especificadas serão executadas apenas para linhas para as quais a cláusula WHEN é verdadeira. Se nenhuma cláusula WHEN for fornecida, as instruções PostgreSQL serão executadas para todas as linhas.
Se vários gatilhos do mesmo tipo forem definidos para o mesmo evento, eles serão disparados em ordem alfabética por nome.
As palavras-chave BEFORE, AFTER ou INSTEAD OF determinam quando as ações do gatilho serão executadas em relação à inserção, modificação ou remoção da linha associada.
Os gatilhos são eliminados automaticamente quando a tabela à qual estão associados é eliminada.
A tabela a ser modificada deve existir no mesmo banco de dados que a tabela ou visão à qual o gatilho está anexado e deve-se usar apenas tablename, não database.tablename.
Uma opção CONSTRAINT, quando especificada, cria um gatilho de restrição . É o mesmo que um gatilho normal, exceto que o tempo de disparo do gatilho pode ser ajustado usando SET CONSTRAINTS. Espera-se que os gatilhos de restrição levantem uma exceção quando as restrições que implementam forem violadas.
Sintaxe
A sintaxe básica para criar um trigger é o seguinte -
CREATE TRIGGER trigger_name [BEFORE|AFTER|INSTEAD OF] event_name
ON table_name
[
-- Trigger logic goes here....
];
Aqui, event_namepode ser a operação de banco de dados INSERT, DELETE, UPDATE e TRUNCATE na tabela mencionadatable_name. Você pode opcionalmente especificar FOR EACH ROW após o nome da tabela.
A seguir está a sintaxe de criação de um gatilho em uma operação UPDATE em uma ou mais colunas especificadas de uma tabela da seguinte maneira -
CREATE TRIGGER trigger_name [BEFORE|AFTER] UPDATE OF column_name
ON table_name
[
-- Trigger logic goes here....
];
Exemplo
Vamos considerar um caso em que queremos manter um teste de auditoria para cada registro sendo inserido na tabela COMPANY, que criaremos novamente como segue (Abandone a tabela COMPANY se você já a tiver).
testdb=# CREATE TABLE COMPANY(
ID INT PRIMARY KEY NOT NULL,
NAME TEXT NOT NULL,
AGE INT NOT NULL,
ADDRESS CHAR(50),
SALARY REAL
);
Para manter o teste de auditoria, criaremos uma nova tabela chamada AUDIT onde as mensagens de log serão inseridas sempre que houver uma entrada na tabela COMPANY para um novo registro -
testdb=# CREATE TABLE AUDIT(
EMP_ID INT NOT NULL,
ENTRY_DATE TEXT NOT NULL
);
Aqui, ID é o ID do registro de AUDIT e EMP_ID é o ID, que virá da tabela COMPANY, e DATE manterá a data e hora de quando o registro será criado na tabela COMPANY. Então, agora, vamos criar um gatilho na tabela COMPANY da seguinte forma -
testdb=# CREATE TRIGGER example_trigger AFTER INSERT ON COMPANY
FOR EACH ROW EXECUTE PROCEDURE auditlogfunc();
Onde auditlogfunc () é um PostgreSQL procedure e tem a seguinte definição -
CREATE OR REPLACE FUNCTION auditlogfunc() RETURNS TRIGGER AS $example_table$
BEGIN
INSERT INTO AUDIT(EMP_ID, ENTRY_DATE) VALUES (new.ID, current_timestamp);
RETURN NEW;
END;
$example_table$ LANGUAGE plpgsql;
Agora, vamos começar o trabalho real. Vamos começar inserindo um registro na tabela COMPANY que deve resultar na criação de um registro de log de auditoria na tabela AUDIT. Então, vamos criar um registro na tabela COMPANY da seguinte forma -
testdb=# INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (1, 'Paul', 32, 'California', 20000.00 );
Isso criará um registro na tabela COMPANY, que é a seguinte -
id | name | age | address | salary
----+------+-----+--------------+--------
1 | Paul | 32 | California | 20000
Ao mesmo tempo, um registro será criado na tabela AUDIT. Este registro é o resultado de uma trigger, que criamos na operação INSERT na tabela COMPANY. Da mesma forma, você pode criar seus gatilhos em operações UPDATE e DELETE com base em seus requisitos.
emp_id | entry_date
--------+-------------------------------
1 | 2013-05-05 15:49:59.968+05:30
(1 row)
Listando TRIGGERS
Você pode listar todos os gatilhos no banco de dados atual de pg_trigger tabela da seguinte forma -
testdb=# SELECT * FROM pg_trigger;
A instrução PostgreSQL fornecida acima listará todos os gatilhos.
Se você quiser listar os gatilhos em uma tabela específica, use a cláusula AND com o nome da tabela da seguinte maneira -
testdb=# SELECT tgname FROM pg_trigger, pg_class WHERE tgrelid=pg_class.oid AND relname='company';
A instrução PostgreSQL fornecida acima também listará apenas uma entrada da seguinte forma -
tgname
-----------------
example_trigger
(1 row)
Soltando TRIGGERS
A seguir está o comando DROP, que pode ser usado para descartar um gatilho existente -
testdb=# DROP TRIGGER trigger_name;
Os índices são tabelas de pesquisa especiais que o mecanismo de pesquisa do banco de dados pode usar para acelerar a recuperação de dados. Simplificando, um índice é um ponteiro para dados em uma tabela. Um índice em um banco de dados é muito semelhante a um índice no final de um livro.
Por exemplo, se quiser fazer referência a todas as páginas de um livro que discute um determinado tópico, você deve primeiro consultar o índice, que lista todos os tópicos em ordem alfabética e, em seguida, referir-se a um ou mais números de página específicos.
Um índice ajuda a acelerar consultas SELECT e cláusulas WHERE; no entanto, torna a entrada de dados mais lenta, com instruções UPDATE e INSERT. Os índices podem ser criados ou eliminados sem nenhum efeito nos dados.
A criação de um índice envolve a instrução CREATE INDEX, que permite nomear o índice, especificar a tabela e qual coluna ou colunas indexar e indicar se o índice está em ordem crescente ou decrescente.
Os índices também podem ser exclusivos, semelhantes à restrição UNIQUE, no sentido de que o índice evita entradas duplicadas na coluna ou combinação de colunas nas quais há um índice.
O comando CREATE INDEX
A sintaxe básica de CREATE INDEX é o seguinte -
CREATE INDEX index_name ON table_name;
Tipos de índice
O PostgreSQL fornece vários tipos de índice: B-tree, Hash, GiST, SP-GiST e GIN. Cada tipo de índice usa um algoritmo diferente que é mais adequado para diferentes tipos de consultas. Por padrão, o comando CREATE INDEX cria índices de árvore B, que se ajustam às situações mais comuns.
Índices de coluna única
Um índice de coluna única é aquele criado com base em apenas uma coluna da tabela. A sintaxe básica é a seguinte -
CREATE INDEX index_name
ON table_name (column_name);
Índices de várias colunas
Um índice de várias colunas é definido em mais de uma coluna de uma tabela. A sintaxe básica é a seguinte -
CREATE INDEX index_name
ON table_name (column1_name, column2_name);
Seja para criar um índice de coluna única ou um índice de várias colunas, leve em consideração a (s) coluna (s) que você pode usar com muita frequência na cláusula WHERE de uma consulta como condições de filtro.
Se houver apenas uma coluna usada, um índice de coluna única deve ser a escolha. Se houver duas ou mais colunas que são frequentemente usadas na cláusula WHERE como filtros, o índice de várias colunas seria a melhor escolha.
Índices Únicos
Índices exclusivos são usados não apenas para desempenho, mas também para integridade de dados. Um índice exclusivo não permite que nenhum valor duplicado seja inserido na tabela. A sintaxe básica é a seguinte -
CREATE UNIQUE INDEX index_name
on table_name (column_name);
Índices Parciais
Um índice parcial é um índice construído sobre um subconjunto de uma tabela; o subconjunto é definido por uma expressão condicional (chamada de predicado do índice parcial). O índice contém entradas apenas para as linhas da tabela que satisfazem o predicado. A sintaxe básica é a seguinte -
CREATE INDEX index_name
on table_name (conditional_expression);
Índices implícitos
Índices implícitos são índices criados automaticamente pelo servidor de banco de dados quando um objeto é criado. Os índices são criados automaticamente para restrições de chave primária e restrições exclusivas.
Exemplo
O seguinte é um exemplo em que criaremos um índice na tabela COMPANY para a coluna de salários -
# CREATE INDEX salary_index ON COMPANY (salary);
Agora, vamos listar todos os índices disponíveis na tabela COMPANY usando \d company comando.
# \d company
Isso produzirá o seguinte resultado, onde company_pkey é um índice implícito, que foi criado quando a tabela foi criada.
Table "public.company"
Column | Type | Modifiers
---------+---------------+-----------
id | integer | not null
name | text | not null
age | integer | not null
address | character(50) |
salary | real |
Indexes:
"company_pkey" PRIMARY KEY, btree (id)
"salary_index" btree (salary)
Você pode listar todo o banco de dados de índices usando o \di comando -
O comando DROP INDEX
Um índice pode ser eliminado usando PostgreSQL DROPcomando. Deve-se ter cuidado ao descartar um índice, pois o desempenho pode ser reduzido ou melhorado.
A sintaxe básica é a seguinte -
DROP INDEX index_name;
Você pode usar a seguinte instrução para excluir o índice criado anteriormente -
# DROP INDEX salary_index;
Quando os índices devem ser evitados?
Embora os índices tenham como objetivo aprimorar o desempenho de um banco de dados, há momentos em que eles devem ser evitados. As seguintes diretrizes indicam quando o uso de um índice deve ser reconsiderado -
Os índices não devem ser usados em tabelas pequenas.
Tabelas que possuem operações de inserção ou atualização de lote frequentes e grandes.
Os índices não devem ser usados em colunas que contêm um grande número de valores NULL.
As colunas que são frequentemente manipuladas não devem ser indexadas.
O PostgreSQL ALTER TABLE comando é usado para adicionar, excluir ou modificar colunas em uma tabela existente.
Você também usaria o comando ALTER TABLE para adicionar e eliminar várias restrições em uma tabela existente.
Sintaxe
A sintaxe básica de ALTER TABLE adicionar uma nova coluna em uma tabela existente é o seguinte -
ALTER TABLE table_name ADD column_name datatype;
A sintaxe básica de ALTER TABLE para DROP COLUMN em uma tabela existente é o seguinte -
ALTER TABLE table_name DROP COLUMN column_name;
A sintaxe básica de ALTER TABLE para alterar o DATA TYPE de uma coluna em uma tabela é o seguinte -
ALTER TABLE table_name ALTER COLUMN column_name TYPE datatype;
A sintaxe básica de ALTER TABLE para adicionar um NOT NULL restrição a uma coluna em uma tabela é a seguinte -
ALTER TABLE table_name MODIFY column_name datatype NOT NULL;
A sintaxe básica de ALTER TABLE para ADD UNIQUE CONSTRAINT a uma mesa é o seguinte -
ALTER TABLE table_name
ADD CONSTRAINT MyUniqueConstraint UNIQUE(column1, column2...);
A sintaxe básica de ALTER TABLE para ADD CHECK CONSTRAINT a uma mesa é o seguinte -
ALTER TABLE table_name
ADD CONSTRAINT MyUniqueConstraint CHECK (CONDITION);
A sintaxe básica de ALTER TABLE para ADD PRIMARY KEY restrição a uma tabela é a seguinte -
ALTER TABLE table_name
ADD CONSTRAINT MyPrimaryKey PRIMARY KEY (column1, column2...);
A sintaxe básica de ALTER TABLE para DROP CONSTRAINT de uma mesa é o seguinte -
ALTER TABLE table_name
DROP CONSTRAINT MyUniqueConstraint;
Se você estiver usando MySQL, o código é o seguinte -
ALTER TABLE table_name
DROP INDEX MyUniqueConstraint;
A sintaxe básica de ALTER TABLE para DROP PRIMARY KEY restrição de uma tabela é a seguinte -
ALTER TABLE table_name
DROP CONSTRAINT MyPrimaryKey;
Se você estiver usando MySQL, o código é o seguinte -
ALTER TABLE table_name
DROP PRIMARY KEY;
Exemplo
Considere que nossa tabela COMPANY tem os seguintes registros -
id | name | age | address | salary
----+-------+-----+-----------+--------
1 | Paul | 32 | California| 20000
2 | Allen | 25 | Texas | 15000
3 | Teddy | 23 | Norway | 20000
4 | Mark | 25 | Rich-Mond | 65000
5 | David | 27 | Texas | 85000
6 | Kim | 22 | South-Hall| 45000
7 | James | 24 | Houston | 10000
O seguinte é o exemplo para ADICIONAR uma nova coluna em uma tabela existente -
testdb=# ALTER TABLE COMPANY ADD GENDER char(1);
Agora, a tabela COMPANY foi alterada e o seguinte seria a saída da instrução SELECT -
id | name | age | address | salary | gender
----+-------+-----+-------------+--------+--------
1 | Paul | 32 | California | 20000 |
2 | Allen | 25 | Texas | 15000 |
3 | Teddy | 23 | Norway | 20000 |
4 | Mark | 25 | Rich-Mond | 65000 |
5 | David | 27 | Texas | 85000 |
6 | Kim | 22 | South-Hall | 45000 |
7 | James | 24 | Houston | 10000 |
(7 rows)
A seguir está o exemplo para DROP a coluna de gênero da tabela existente -
testdb=# ALTER TABLE COMPANY DROP GENDER;
Agora, a tabela COMPANY foi alterada e o seguinte seria a saída da instrução SELECT -
id | name | age | address | salary
----+-------+-----+-----------+--------
1 | Paul | 32 | California| 20000
2 | Allen | 25 | Texas | 15000
3 | Teddy | 23 | Norway | 20000
4 | Mark | 25 | Rich-Mond | 65000
5 | David | 27 | Texas | 85000
6 | Kim | 22 | South-Hall| 45000
7 | James | 24 | Houston | 10000
O PostgreSQL TRUNCATE TABLEcomando é usado para excluir dados completos de uma tabela existente. Você também pode usar o comando DROP TABLE para excluir a tabela completa, mas removeria a estrutura completa da tabela do banco de dados e você precisaria recriar esta tabela novamente se desejar armazenar alguns dados.
Ele tem o mesmo efeito de DELETE em cada tabela, mas como não verifica as tabelas de fato, é mais rápido. Além disso, ele recupera espaço em disco imediatamente, em vez de exigir uma operação VACUUM subsequente. Isso é mais útil em grandes tabelas.
Sintaxe
A sintaxe básica de TRUNCATE TABLE é o seguinte -
TRUNCATE TABLE table_name;
Exemplo
Considere que a tabela COMPANY possui os seguintes registros -
id | name | age | address | salary
----+-------+-----+------------+--------
1 | Paul | 32 | California | 20000
2 | Allen | 25 | Texas | 15000
3 | Teddy | 23 | Norway | 20000
4 | Mark | 25 | Rich-Mond | 65000
5 | David | 27 | Texas | 85000
6 | Kim | 22 | South-Hall | 45000
7 | James | 24 | Houston | 10000
(7 rows)
A seguir está o exemplo para truncar -
testdb=# TRUNCATE TABLE COMPANY;
Agora, a tabela COMPANY está truncada e o seguinte seria a saída da instrução SELECT -
testdb=# SELECT * FROM CUSTOMERS;
id | name | age | address | salary
----+------+-----+---------+--------
(0 rows)
As visualizações são pseudotabelas. Ou seja, não são mesas reais; no entanto, aparecem como tabelas comuns para SELECT. Uma visão pode representar um subconjunto de uma tabela real, selecionando certas colunas ou certas linhas de uma tabela comum. Uma visão pode até representar tabelas unidas. Como as visualizações são atribuídas permissões separadas, você pode usá-las para restringir o acesso à tabela para que os usuários vejam apenas linhas ou colunas específicas de uma tabela.
Uma visualização pode conter todas as linhas de uma tabela ou linhas selecionadas de uma ou mais tabelas. Uma visão pode ser criada a partir de uma ou várias tabelas, o que depende da consulta PostgreSQL escrita para criar uma visão.
As visualizações, que são uma espécie de tabelas virtuais, permitem que os usuários façam o seguinte -
Estruture os dados de uma maneira que os usuários ou classes de usuários considerem natural ou intuitiva.
Restrinja o acesso aos dados de forma que um usuário só possa ver dados limitados em vez da tabela completa.
Resuma os dados de várias tabelas, que podem ser usadas para gerar relatórios.
Visto que as visualizações não são tabelas comuns, você pode não ser capaz de executar uma instrução DELETE, INSERT ou UPDATE em uma visualização. No entanto, você pode criar uma RULE para corrigir este problema de usar DELETE, INSERT ou UPDATE em uma visualização.
Criando Vistas
As visualizações do PostgreSQL são criadas usando o CREATE VIEWdeclaração. As visualizações do PostgreSQL podem ser criadas a partir de uma única tabela, várias tabelas ou outra visualização.
A sintaxe básica de CREATE VIEW é a seguinte -
CREATE [TEMP | TEMPORARY] VIEW view_name AS
SELECT column1, column2.....
FROM table_name
WHERE [condition];
Você pode incluir várias tabelas em sua instrução SELECT de maneira muito semelhante à utilizada na consulta SELECT normal do PostgreSQL. Se a palavra-chave opcional TEMP ou TEMPORARY estiver presente, a visualização será criada no espaço temporário. As visualizações temporárias são eliminadas automaticamente no final da sessão atual.
Exemplo
Considere, a tabela COMPANY está tendo os seguintes registros -
id | name | age | address | salary
----+-------+-----+------------+--------
1 | Paul | 32 | California | 20000
2 | Allen | 25 | Texas | 15000
3 | Teddy | 23 | Norway | 20000
4 | Mark | 25 | Rich-Mond | 65000
5 | David | 27 | Texas | 85000
6 | Kim | 22 | South-Hall | 45000
7 | James | 24 | Houston | 10000
Agora, a seguir está um exemplo para criar uma visão da tabela COMPANY. Esta visualização seria usada para ter apenas algumas colunas da tabela COMPANY -
testdb=# CREATE VIEW COMPANY_VIEW AS
SELECT ID, NAME, AGE
FROM COMPANY;
Agora, você pode consultar COMPANY_VIEW de maneira semelhante à de uma tabela real. A seguir está o exemplo -
testdb=# SELECT * FROM COMPANY_VIEW;
Isso produziria o seguinte resultado -
id | name | age
----+-------+-----
1 | Paul | 32
2 | Allen | 25
3 | Teddy | 23
4 | Mark | 25
5 | David | 27
6 | Kim | 22
7 | James | 24
(7 rows)
Queda de visualizações
Para eliminar uma visão, basta usar a instrução DROP VIEW com o view_name. A sintaxe básica de DROP VIEW é a seguinte -
testdb=# DROP VIEW view_name;
O comando a seguir excluirá a visualização COMPANY_VIEW, que criamos na última seção -
testdb=# DROP VIEW COMPANY_VIEW;
Uma transação é uma unidade de trabalho executada em um banco de dados. As transações são unidades ou sequências de trabalho realizadas em uma ordem lógica, seja de forma manual por um usuário ou automaticamente por algum tipo de programa de banco de dados.
Uma transação é a propagação de uma ou mais alterações no banco de dados. Por exemplo, se você estiver criando um registro, atualizando um registro ou excluindo um registro da tabela, você está executando uma transação na tabela. É importante controlar as transações para garantir a integridade dos dados e lidar com os erros do banco de dados.
Praticamente, você agrupará muitas consultas PostgreSQL em um grupo e executará todas elas juntas como parte de uma transação.
Propriedades das transações
As transações têm as quatro propriedades padrão a seguir, geralmente conhecidas pela sigla ACID -
Atomicity- Garante que todas as operações dentro da unidade de trabalho sejam concluídas com sucesso; caso contrário, a transação é abortada no ponto de falha e as operações anteriores são revertidas para seu estado anterior.
Consistency - Garante que o banco de dados mude de estado corretamente após uma transação confirmada com sucesso.
Isolation - Permite que as transações operem de forma independente e transparente entre si.
Durability - Garante que o resultado ou efeito de uma transação confirmada persiste em caso de falha do sistema.
Controle de transações
Os seguintes comandos são usados para controlar transações -
BEGIN TRANSACTION - Para iniciar uma transação.
COMMIT - Para salvar as alterações, como alternativa, você pode usar END TRANSACTION comando.
ROLLBACK - Para reverter as alterações.
Os comandos de controle transacional são usados apenas com os comandos DML INSERT, UPDATE e DELETE. Eles não podem ser usados ao criar tabelas ou eliminá-los porque essas operações são confirmadas automaticamente no banco de dados.
O comando BEGIN TRANSACTION
As transações podem ser iniciadas usando BEGIN TRANSACTION ou simplesmente o comando BEGIN. Essas transações geralmente persistem até que o próximo comando COMMIT ou ROLLBACK seja encontrado. Mas uma transação também ROLLBACK se o banco de dados for fechado ou se ocorrer um erro.
A seguir está a sintaxe simples para iniciar uma transação -
BEGIN;
or
BEGIN TRANSACTION;
O Comando COMMIT
O comando COMMIT é o comando transacional usado para salvar as alterações invocadas por uma transação no banco de dados.
O comando COMMIT salva todas as transações no banco de dados desde o último comando COMMIT ou ROLLBACK.
A sintaxe do comando COMMIT é a seguinte -
COMMIT;
or
END TRANSACTION;
O comando ROLLBACK
O comando ROLLBACK é o comando transacional usado para desfazer transações que ainda não foram salvas no banco de dados.
O comando ROLLBACK só pode ser usado para desfazer transações desde que o último comando COMMIT ou ROLLBACK foi emitido.
A sintaxe do comando ROLLBACK é a seguinte -
ROLLBACK;
Exemplo
Considere que a tabela COMPANY possui os seguintes registros -
id | name | age | address | salary
----+-------+-----+-----------+--------
1 | Paul | 32 | California| 20000
2 | Allen | 25 | Texas | 15000
3 | Teddy | 23 | Norway | 20000
4 | Mark | 25 | Rich-Mond | 65000
5 | David | 27 | Texas | 85000
6 | Kim | 22 | South-Hall| 45000
7 | James | 24 | Houston | 10000
Now, let us start a transaction and delete records from the table having age = 25 and finally we use ROLLBACK command to undo all the changes.
testdb=# BEGIN;
DELETE FROM COMPANY WHERE AGE = 25;
ROLLBACK;
If you will check COMPANY table is still having the following records −
id | name | age | address | salary
----+-------+-----+-----------+--------
1 | Paul | 32 | California| 20000
2 | Allen | 25 | Texas | 15000
3 | Teddy | 23 | Norway | 20000
4 | Mark | 25 | Rich-Mond | 65000
5 | David | 27 | Texas | 85000
6 | Kim | 22 | South-Hall| 45000
7 | James | 24 | Houston | 10000
Now, let us start another transaction and delete records from the table having age = 25 and finally we use COMMIT command to commit all the changes.
testdb=# BEGIN;
DELETE FROM COMPANY WHERE AGE = 25;
COMMIT;
If you will check the COMPANY table, it still has the following records −
id | name | age | address | salary
----+-------+-----+------------+--------
1 | Paul | 32 | California | 20000
3 | Teddy | 23 | Norway | 20000
5 | David | 27 | Texas | 85000
6 | Kim | 22 | South-Hall | 45000
7 | James | 24 | Houston | 10000
(5 rows)
Locks or Exclusive Locks or Write Locks prevent users from modifying a row or an entire table. Rows modified by UPDATE and DELETE are then exclusively locked automatically for the duration of the transaction. This prevents other users from changing the row until the transaction is either committed or rolled back.
The only time when users must wait for other users is when they are trying to modify the same row. If they modify different rows, no waiting is necessary. SELECT queries never have to wait.
The database performs locking automatically. In certain cases, however, locking must be controlled manually. Manual locking can be done by using the LOCK command. It allows specification of a transaction's lock type and scope.
Syntax for LOCK command
The basic syntax for LOCK command is as follows −
LOCK [ TABLE ]
name
IN
lock_mode
name − The name (optionally schema-qualified) of an existing table to lock. If ONLY is specified before the table name, only that table is locked. If ONLY is not specified, the table and all its descendant tables (if any) are locked.
lock_mode − The lock mode specifies which locks this lock conflicts with. If no lock mode is specified, then ACCESS EXCLUSIVE, the most restrictive mode, is used. Possible values are: ACCESS SHARE, ROW SHARE, ROW EXCLUSIVE, SHARE UPDATE EXCLUSIVE, SHARE, SHARE ROW EXCLUSIVE, EXCLUSIVE, ACCESS EXCLUSIVE.
Once obtained, the lock is held for the remainder of the current transaction. There is no UNLOCK TABLE command; locks are always released at the transaction end.
DeadLocks
Deadlocks can occur when two transactions are waiting for each other to finish their operations. While PostgreSQL can detect them and end them with a ROLLBACK, deadlocks can still be inconvenient. To prevent your applications from running into this problem, make sure to design them in such a way that they will lock objects in the same order.
Advisory Locks
PostgreSQL provides means for creating locks that have application-defined meanings. These are called advisory locks. As the system does not enforce their use, it is up to the application to use them correctly. Advisory locks can be useful for locking strategies that are an awkward fit for the MVCC model.
For example, a common use of advisory locks is to emulate pessimistic locking strategies typical of the so-called "flat file" data management systems. While a flag stored in a table could be used for the same purpose, advisory locks are faster, avoid table bloat, and are automatically cleaned up by the server at the end of the session.
Example
Consider the table COMPANY having records as follows −
testdb# select * from COMPANY;
id | name | age | address | salary
----+-------+-----+-----------+--------
1 | Paul | 32 | California| 20000
2 | Allen | 25 | Texas | 15000
3 | Teddy | 23 | Norway | 20000
4 | Mark | 25 | Rich-Mond | 65000
5 | David | 27 | Texas | 85000
6 | Kim | 22 | South-Hall| 45000
7 | James | 24 | Houston | 10000
(7 rows)
The following example locks the COMPANY table within the testdb database in ACCESS EXCLUSIVE mode. The LOCK statement works only in a transaction mode −
testdb=#BEGIN;
LOCK TABLE company1 IN ACCESS EXCLUSIVE MODE;
The above given PostgreSQL statement will produce the following result −
LOCK TABLE
The above message indicates that the table is locked until the transaction ends and to finish the transaction you will have to either rollback or commit the transaction.
A subquery or Inner query or Nested query is a query within another PostgreSQL query and embedded within the WHERE clause.
A subquery is used to return data that will be used in the main query as a condition to further restrict the data to be retrieved.
Subqueries can be used with the SELECT, INSERT, UPDATE and DELETE statements along with the operators like =, <, >, >=, <=, IN, etc.
There are a few rules that subqueries must follow −
Subqueries must be enclosed within parentheses.
A subquery can have only one column in the SELECT clause, unless multiple columns are in the main query for the subquery to compare its selected columns.
An ORDER BY cannot be used in a subquery, although the main query can use an ORDER BY. The GROUP BY can be used to perform the same function as the ORDER BY in a subquery.
Subqueries that return more than one row can only be used with multiple value operators, such as the IN, EXISTS, NOT IN, ANY/SOME, ALL operator.
The BETWEEN operator cannot be used with a subquery; however, the BETWEEN can be used within the subquery.
Subqueries with the SELECT Statement
Subqueries are most frequently used with the SELECT statement. The basic syntax is as follows −
SELECT column_name [, column_name ]
FROM table1 [, table2 ]
WHERE column_name OPERATOR
(SELECT column_name [, column_name ]
FROM table1 [, table2 ]
[WHERE])
Example
Consider the COMPANY table having the following records −
id | name | age | address | salary
----+-------+-----+-----------+--------
1 | Paul | 32 | California| 20000
2 | Allen | 25 | Texas | 15000
3 | Teddy | 23 | Norway | 20000
4 | Mark | 25 | Rich-Mond | 65000
5 | David | 27 | Texas | 85000
6 | Kim | 22 | South-Hall| 45000
7 | James | 24 | Houston | 10000
(7 rows)
Now, let us check the following sub-query with SELECT statement −
testdb=# SELECT *
FROM COMPANY
WHERE ID IN (SELECT ID
FROM COMPANY
WHERE SALARY > 45000) ;
This would produce the following result −
id | name | age | address | salary
----+-------+-----+-------------+--------
4 | Mark | 25 | Rich-Mond | 65000
5 | David | 27 | Texas | 85000
(2 rows)
Subqueries with the INSERT Statement
Subqueries also can be used with INSERT statements. The INSERT statement uses the data returned from the subquery to insert into another table. The selected data in the subquery can be modified with any of the character, date, or number functions.
The basic syntax is as follows −
INSERT INTO table_name [ (column1 [, column2 ]) ]
SELECT [ *|column1 [, column2 ] ]
FROM table1 [, table2 ]
[ WHERE VALUE OPERATOR ]
Example
Consider a table COMPANY_BKP, with similar structure as COMPANY table and can be created using the same CREATE TABLE using COMPANY_BKP as the table name. Now, to copy complete COMPANY table into COMPANY_BKP, following is the syntax −
testdb=# INSERT INTO COMPANY_BKP
SELECT * FROM COMPANY
WHERE ID IN (SELECT ID
FROM COMPANY) ;
Subqueries with the UPDATE Statement
The subquery can be used in conjunction with the UPDATE statement. Either single or multiple columns in a table can be updated when using a subquery with the UPDATE statement.
The basic syntax is as follows −
UPDATE table
SET column_name = new_value
[ WHERE OPERATOR [ VALUE ]
(SELECT COLUMN_NAME
FROM TABLE_NAME)
[ WHERE) ]
Example
Assuming, we have COMPANY_BKP table available, which is backup of the COMPANY table.
The following example updates SALARY by 0.50 times in the COMPANY table for all the customers, whose AGE is greater than or equal to 27 −
testdb=# UPDATE COMPANY
SET SALARY = SALARY * 0.50
WHERE AGE IN (SELECT AGE FROM COMPANY_BKP
WHERE AGE >= 27 );
This would affect two rows and finally the COMPANY table would have the following records −
id | name | age | address | salary
----+-------+-----+-------------+--------
2 | Allen | 25 | Texas | 15000
3 | Teddy | 23 | Norway | 20000
4 | Mark | 25 | Rich-Mond | 65000
6 | Kim | 22 | South-Hall | 45000
7 | James | 24 | Houston | 10000
1 | Paul | 32 | California | 10000
5 | David | 27 | Texas | 42500
(7 rows)
Subqueries with the DELETE Statement
The subquery can be used in conjunction with the DELETE statement like with any other statements mentioned above.
The basic syntax is as follows −
DELETE FROM TABLE_NAME
[ WHERE OPERATOR [ VALUE ]
(SELECT COLUMN_NAME
FROM TABLE_NAME)
[ WHERE) ]
Example
Assuming, we have COMPANY_BKP table available, which is a backup of the COMPANY table.
The following example deletes records from the COMPANY table for all the customers, whose AGE is greater than or equal to 27 −
testdb=# DELETE FROM COMPANY
WHERE AGE IN (SELECT AGE FROM COMPANY_BKP
WHERE AGE > 27 );
This would affect two rows and finally the COMPANY table would have the following records −
id | name | age | address | salary
----+-------+-----+-------------+--------
2 | Allen | 25 | Texas | 15000
3 | Teddy | 23 | Norway | 20000
4 | Mark | 25 | Rich-Mond | 65000
6 | Kim | 22 | South-Hall | 45000
7 | James | 24 | Houston | 10000
5 | David | 27 | Texas | 42500
(6 rows)
PostgreSQL has the data types smallserial, serial and bigserial; these are not true types, but merely a notational convenience for creating unique identifier columns. These are similar to AUTO_INCREMENT property supported by some other databases.
If you wish a serial column to have a unique constraint or be a primary key, it must now be specified, just like any other data type.
The type name serial creates an integer columns. The type name bigserial creates a bigint column. bigserial should be used if you anticipate the use of more than 231 identifiers over the lifetime of the table. The type name smallserial creates a smallint column.
Syntax
The basic usage of SERIAL dataype is as follows −
CREATE TABLE tablename (
colname SERIAL
);
Example
Consider the COMPANY table to be created as follows −
testdb=# CREATE TABLE COMPANY(
ID SERIAL PRIMARY KEY,
NAME TEXT NOT NULL,
AGE INT NOT NULL,
ADDRESS CHAR(50),
SALARY REAL
);
Now, insert the following records into table COMPANY −
INSERT INTO COMPANY (NAME,AGE,ADDRESS,SALARY)
VALUES ( 'Paul', 32, 'California', 20000.00 );
INSERT INTO COMPANY (NAME,AGE,ADDRESS,SALARY)
VALUES ('Allen', 25, 'Texas', 15000.00 );
INSERT INTO COMPANY (NAME,AGE,ADDRESS,SALARY)
VALUES ('Teddy', 23, 'Norway', 20000.00 );
INSERT INTO COMPANY (NAME,AGE,ADDRESS,SALARY)
VALUES ( 'Mark', 25, 'Rich-Mond ', 65000.00 );
INSERT INTO COMPANY (NAME,AGE,ADDRESS,SALARY)
VALUES ( 'David', 27, 'Texas', 85000.00 );
INSERT INTO COMPANY (NAME,AGE,ADDRESS,SALARY)
VALUES ( 'Kim', 22, 'South-Hall', 45000.00 );
INSERT INTO COMPANY (NAME,AGE,ADDRESS,SALARY)
VALUES ( 'James', 24, 'Houston', 10000.00 );
Isso irá inserir sete tuplas na tabela EMPRESA e EMPRESA terá os seguintes registros -
id | name | age | address | salary
----+-------+-----+------------+--------
1 | Paul | 32 | California | 20000
2 | Allen | 25 | Texas | 15000
3 | Teddy | 23 | Norway | 20000
4 | Mark | 25 | Rich-Mond | 65000
5 | David | 27 | Texas | 85000
6 | Kim | 22 | South-Hall | 45000
7 | James | 24 | Houston | 10000
Sempre que um objeto é criado em um banco de dados, um proprietário é atribuído a ele. O proprietário é geralmente aquele que executou a instrução de criação. Para a maioria dos tipos de objetos, o estado inicial é que apenas o proprietário (ou um superusuário) pode modificar ou excluir o objeto. Para permitir que outras funções ou usuários o usem, privilégios ou permissão devem ser concedidos.
Diferentes tipos de privilégios no PostgreSQL são -
- SELECT,
- INSERT,
- UPDATE,
- DELETE,
- TRUNCATE,
- REFERENCES,
- TRIGGER,
- CREATE,
- CONNECT,
- TEMPORARY,
- EXECUTE, e
- USAGE
Dependendo do tipo de objeto (tabela, função, etc.), os privilégios são aplicados ao objeto. Para atribuir privilégios aos usuários, o comando GRANT é usado.
Sintaxe para GRANT
A sintaxe básica para o comando GRANT é a seguinte -
GRANT privilege [, ...]
ON object [, ...]
TO { PUBLIC | GROUP group | username }
privilege - os valores podem ser: SELECT, INSERT, UPDATE, DELETE, RULE, ALL.
object- O nome de um objeto ao qual conceder acesso. Os objetos possíveis são: tabela, visão, sequência
PUBLIC - Um pequeno formulário que representa todos os usuários.
GRUPO group - Um grupo a quem conceder privilégios.
username- O nome de um usuário a quem conceder privilégios. PUBLIC é uma forma abreviada que representa todos os usuários.
Os privilégios podem ser revogados usando o comando REVOKE.
Sintaxe para REVOKE
A sintaxe básica para o comando REVOKE é a seguinte -
REVOKE privilege [, ...]
ON object [, ...]
FROM { PUBLIC | GROUP groupname | username }
privilege - os valores podem ser: SELECT, INSERT, UPDATE, DELETE, RULE, ALL.
object- O nome de um objeto ao qual conceder acesso. Os objetos possíveis são: tabela, visão, sequência
PUBLIC - Um pequeno formulário que representa todos os usuários.
GRUPO group - Um grupo a quem conceder privilégios.
username- O nome de um usuário a quem conceder privilégios. PUBLIC é uma forma abreviada que representa todos os usuários.
Exemplo
Para entender os privilégios, vamos primeiro criar um USUÁRIO da seguinte maneira -
testdb=# CREATE USER manisha WITH PASSWORD 'password';
CREATE ROLE
A mensagem CREATE ROLE indica que o USER "manisha" foi criado.
Considere a tabela COMPANHIA com os registros a seguir -
testdb# select * from COMPANY;
id | name | age | address | salary
----+-------+-----+-----------+--------
1 | Paul | 32 | California| 20000
2 | Allen | 25 | Texas | 15000
3 | Teddy | 23 | Norway | 20000
4 | Mark | 25 | Rich-Mond | 65000
5 | David | 27 | Texas | 85000
6 | Kim | 22 | South-Hall| 45000
7 | James | 24 | Houston | 10000
(7 rows)
Em seguida, vamos conceder todos os privilégios em uma empresa de mesa ao usuário "manisha" da seguinte forma -
testdb=# GRANT ALL ON COMPANY TO manisha;
GRANT
A mensagem GRANT indica que todos os privilégios são atribuídos ao USUÁRIO.
Em seguida, revogemos os privilégios do USUÁRIO "manisha" da seguinte forma -
testdb=# REVOKE ALL ON COMPANY FROM manisha;
REVOKE
A mensagem REVOKE indica que todos os privilégios foram revogados do USUÁRIO.
Você pode até mesmo excluir o usuário da seguinte forma -
testdb=# DROP USER manisha;
DROP ROLE
A mensagem DROP ROLE indica que USER 'Manisha' foi excluído do banco de dados.
Havíamos discutido sobre os tipos de dados Data / Hora no capítulo Tipos de dados . Agora, vamos ver os operadores e funções de data / hora.
A tabela a seguir lista os comportamentos dos operadores aritméticos básicos -
Operador | Exemplo | Resultado |
---|---|---|
+ | data '2001-09-28' + inteiro '7' | data '2001-10-05' |
+ | data '2001-09-28' + intervalo '1 hora' | timestamp '2001-09-28 01:00:00' |
+ | data '2001-09-28' + hora '03: 00 ' | timestamp '2001-09-28 03:00:00' |
+ | intervalo '1 dia' + intervalo '1 hora' | intervalo '1 dia 01:00:00' |
+ | carimbo de data / hora '2001-09-28 01:00' + intervalo '23 horas ' | timestamp '2001-09-29 00:00:00' |
+ | hora '01: 00 '+ intervalo' 3 horas ' | hora '04: 00: 00 ' |
- | - intervalo '23 horas ' | intervalo '-23: 00: 00' |
- | data '2001-10-01' - data '2001-09-28' | inteiro '3' (dias) |
- | data '2001-10-01' - inteiro '7' | data '2001-09-24' |
- | data '2001-09-28' - intervalo '1 hora' | timestamp '2001-09-27 23:00:00' |
- | hora '05: 00 '- hora '03: 00' | intervalo '02: 00: 00 ' |
- | hora '05: 00 '- intervalo' 2 horas ' | hora '03: 00: 00 ' |
- | timestamp '2001-09-28 23:00' - intervalo '23 horas ' | timestamp '2001-09-28 00:00:00' |
- | intervalo '1 dia' - intervalo '1 hora' | intervalo '1 dia -01: 00: 00' |
- | timestamp '2001-09-29 03:00' - timestamp '2001-09-27 12:00' | intervalo '1 dia 15:00:00' |
* | 900 * intervalo '1 segundo' | intervalo '00: 15: 00 ' |
* | 21 * intervalo '1 dia' | intervalo '21 dias ' |
* | precisão dupla '3,5' * intervalo '1 hora' | intervalo '03: 30: 00 ' |
/ | intervalo '1 hora' / precisão dupla '1,5' | intervalo '00: 40: 00 ' |
A seguir está a lista de todas as funções importantes relacionadas à data e hora disponíveis.
S. No. | Descrição da função |
---|---|
1 | ERA() Subtrair argumentos |
2 | DATA / HORA ATUAL () Data e hora atuais |
3 | DATE_PART () Obter subcampo (equivalente a extrair) |
4 | EXTRAIR() Obter subcampo |
5 | ISFINITE () Teste para data, hora e intervalo finitos (não +/- infinito) |
6 | JUSTIFICAR Ajustar intervalo |
AGE (timestamp, timestamp), AGE (timestamp)
S. No. | Descrição da função |
---|---|
1 | AGE(timestamp, timestamp) Quando chamado com a forma TIMESTAMP do segundo argumento, AGE () subtrai argumentos, produzindo um resultado "simbólico" que usa anos e meses e é do tipo INTERVAL. |
2 | AGE(timestamp) Quando chamado apenas com o TIMESTAMP como argumento, AGE () subtrai da data_atual (à meia-noite). |
Exemplo da função AGE (timestamp, timestamp) é -
testdb=# SELECT AGE(timestamp '2001-04-10', timestamp '1957-06-13');
A instrução PostgreSQL fornecida acima produzirá o seguinte resultado -
age
-------------------------
43 years 9 mons 27 days
Exemplo da função AGE (timestamp) é -
testdb=# select age(timestamp '1957-06-13');
A instrução PostgreSQL fornecida acima produzirá o seguinte resultado -
age
--------------------------
55 years 10 mons 22 days
DATA / HORA ATUAL ()
O PostgreSQL fornece várias funções que retornam valores relacionados à data e hora atuais. A seguir estão algumas funções -
S. No. | Descrição da função |
---|---|
1 | CURRENT_DATE Fornece a data atual. |
2 | CURRENT_TIME Entrega valores com fuso horário. |
3 | CURRENT_TIMESTAMP Entrega valores com fuso horário. |
4 | CURRENT_TIME(precision) Opcionalmente, aceita um parâmetro de precisão, que faz com que o resultado seja arredondado para aquela quantidade de dígitos fracionários no campo de segundos. |
5 | CURRENT_TIMESTAMP(precision) Opcionalmente, aceita um parâmetro de precisão, que faz com que o resultado seja arredondado para aquela quantidade de dígitos fracionários no campo de segundos. |
6 | LOCALTIME Entrega valores sem fuso horário. |
7 | LOCALTIMESTAMP Entrega valores sem fuso horário. |
8 | LOCALTIME(precision) Opcionalmente, aceita um parâmetro de precisão, que faz com que o resultado seja arredondado para aquela quantidade de dígitos fracionários no campo de segundos. |
9 | LOCALTIMESTAMP(precision) Opcionalmente, aceita um parâmetro de precisão, que faz com que o resultado seja arredondado para aquela quantidade de dígitos fracionários no campo de segundos. |
Exemplos usando as funções da tabela acima -
testdb=# SELECT CURRENT_TIME;
timetz
--------------------
08:01:34.656+05:30
(1 row)
testdb=# SELECT CURRENT_DATE;
date
------------
2013-05-05
(1 row)
testdb=# SELECT CURRENT_TIMESTAMP;
now
-------------------------------
2013-05-05 08:01:45.375+05:30
(1 row)
testdb=# SELECT CURRENT_TIMESTAMP(2);
timestamptz
------------------------------
2013-05-05 08:01:50.89+05:30
(1 row)
testdb=# SELECT LOCALTIMESTAMP;
timestamp
------------------------
2013-05-05 08:01:55.75
(1 row)
O PostgreSQL também fornece funções que retornam a hora de início da instrução atual, bem como a hora atual atual no instante em que a função é chamada. Essas funções são -
S. No. | Descrição da função |
---|---|
1 | transaction_timestamp() É equivalente a CURRENT_TIMESTAMP, mas é nomeado para refletir claramente o que retorna. |
2 | statement_timestamp() Ele retorna a hora de início da instrução atual. |
3 | clock_timestamp() Ele retorna a hora atual real e, portanto, seu valor muda mesmo dentro de um único comando SQL. |
4 | timeofday() Ele retorna a hora atual real, mas como uma string de texto formatada em vez de um carimbo de data / hora com valor de fuso horário. |
5 | now() É um PostgreSQL tradicional equivalente a transaction_timestamp (). |
DATE_PART (texto, timestamp), DATE_PART (texto, intervalo), DATE_TRUNC (texto, timestamp)
S. No. | Descrição da função |
---|---|
1 | DATE_PART('field', source) Essas funções obtêm os subcampos. O parâmetro de campo precisa ser um valor de string, não um nome. Os nomes de campo válidos são: século, dia, década, dow, doy, epoch, hour, isodow, isoyear, microssegundos, milênio, milissegundos, minuto, mês, trimestre, segundo, fuso horário, fuso-horário_hora, fuso-horário_minuto, semana, ano. |
2 | DATE_TRUNC('field', source) Esta função é conceitualmente semelhante à função trunc para números. source é uma expressão de valor do tipo timestamp ou intervalo. campo seleciona com qual precisão truncar o valor de entrada. O valor de retorno é do tipo timestamp ou intervalo . Os valores válidos para o campo são: microssegundos, milissegundos, segundo, minuto, hora, dia, semana, mês, trimestre, ano, década, século, milênio |
A seguir estão exemplos para funções DATE_PART ( 'campo' , fonte) -
testdb=# SELECT date_part('day', TIMESTAMP '2001-02-16 20:38:40');
date_part
-----------
16
(1 row)
testdb=# SELECT date_part('hour', INTERVAL '4 hours 3 minutes');
date_part
-----------
4
(1 row)
A seguir estão exemplos para funções DATE_TRUNC ( 'campo' , fonte) -
testdb=# SELECT date_trunc('hour', TIMESTAMP '2001-02-16 20:38:40');
date_trunc
---------------------
2001-02-16 20:00:00
(1 row)
testdb=# SELECT date_trunc('year', TIMESTAMP '2001-02-16 20:38:40');
date_trunc
---------------------
2001-01-01 00:00:00
(1 row)
EXTRACT (campo do carimbo de data / hora), EXTRACT (campo do intervalo)
o EXTRACT(field FROM source)função recupera subcampos como ano ou hora de valores de data / hora. A origem deve ser uma expressão de valor do tipo carimbo de data / hora, hora ou intervalo . O campo é um identificador ou string que seleciona qual campo extrair do valor de origem. A função EXTRACT retorna valores do tipo precisão dupla .
A seguir estão nomes de campo válidos (semelhantes aos nomes de campo de função DATE_PART): século, dia, década, dow, doy, época, hora, isodow, isoyear, microssegundos, milênio, milissegundos, minuto, mês, trimestre, segundo, fuso horário, fuso-horário_hour , fuso horário_minuto, semana, ano.
A seguir estão exemplos de funções EXTRACT ( 'campo' , fonte) -
testdb=# SELECT EXTRACT(CENTURY FROM TIMESTAMP '2000-12-16 12:21:13');
date_part
-----------
20
(1 row)
testdb=# SELECT EXTRACT(DAY FROM TIMESTAMP '2001-02-16 20:38:40');
date_part
-----------
16
(1 row)
ISFINITE (data), ISFINITE (carimbo de data / hora), ISFINITE (intervalo)
S. No. | Descrição da função |
---|---|
1 | ISFINITE(date) Testes de data finita. |
2 | ISFINITE(timestamp) Testes para registro de tempo finito. |
3 | ISFINITE(interval) Testes de intervalo finito. |
A seguir estão os exemplos das funções ISFINITE () -
testdb=# SELECT isfinite(date '2001-02-16');
isfinite
----------
t
(1 row)
testdb=# SELECT isfinite(timestamp '2001-02-16 21:28:30');
isfinite
----------
t
(1 row)
testdb=# SELECT isfinite(interval '4 hours');
isfinite
----------
t
(1 row)
JUSTIFY_DAYS (intervalo), JUSTIFY_HOURS (intervalo), JUSTIFY_INTERVAL (intervalo)
S. No. | Descrição da função |
---|---|
1 | JUSTIFY_DAYS(interval) Ajusta o intervalo para que os períodos de 30 dias sejam representados como meses. Devolver ointerval tipo |
2 | JUSTIFY_HOURS(interval) Ajusta o intervalo para que os períodos de 24 horas sejam representados como dias. Devolver ointerval tipo |
3 | JUSTIFY_INTERVAL(interval) Ajusta o intervalo usando JUSTIFY_DAYS e JUSTIFY_HOURS, com ajustes de sinal adicionais. Devolver ointerval tipo |
A seguir estão os exemplos para as funções ISFINITE () -
testdb=# SELECT justify_days(interval '35 days');
justify_days
--------------
1 mon 5 days
(1 row)
testdb=# SELECT justify_hours(interval '27 hours');
justify_hours
----------------
1 day 03:00:00
(1 row)
testdb=# SELECT justify_interval(interval '1 mon -1 hour');
justify_interval
------------------
29 days 23:00:00
(1 row)
PostgreSQL functions, também conhecidos como Procedimentos armazenados, permitem que você execute operações que normalmente levariam várias consultas e viagens de ida e volta em uma única função dentro do banco de dados. As funções permitem a reutilização do banco de dados, pois outros aplicativos podem interagir diretamente com seus procedimentos armazenados, em vez de um código de camada intermediária ou duplicado.
As funções podem ser criadas em uma linguagem de sua escolha, como SQL, PL / pgSQL, C, Python, etc.
Sintaxe
A sintaxe básica para criar uma função é a seguinte -
CREATE [OR REPLACE] FUNCTION function_name (arguments)
RETURNS return_datatype AS $variable_name$
DECLARE
declaration;
[...]
BEGIN
< function_body >
[...]
RETURN { variable_name | value }
END; LANGUAGE plpgsql;
Onde,
function-name especifica o nome da função.
A opção [OU REPLACE] permite modificar uma função existente.
A função deve conter um return declaração.
RETURNcláusula especifica o tipo de dados que você vai retornar da função. oreturn_datatype pode ser um tipo básico, composto ou de domínio, ou pode fazer referência ao tipo de uma coluna da tabela.
function-body contém a parte executável.
A palavra-chave AS é usada para criar uma função autônoma.
plpgsqlé o nome da linguagem na qual a função é implementada. Aqui, usamos esta opção para PostgreSQL, pode ser SQL, C, interno ou o nome de uma linguagem procedural definida pelo usuário. Para compatibilidade com versões anteriores, o nome pode ser colocado entre aspas simples.
Exemplo
O exemplo a seguir ilustra a criação e a chamada de uma função autônoma. Esta função retorna o número total de registros na tabela COMPANY. Usaremos a tabela COMPANY , que contém os seguintes registros -
testdb# select * from COMPANY;
id | name | age | address | salary
----+-------+-----+-----------+--------
1 | Paul | 32 | California| 20000
2 | Allen | 25 | Texas | 15000
3 | Teddy | 23 | Norway | 20000
4 | Mark | 25 | Rich-Mond | 65000
5 | David | 27 | Texas | 85000
6 | Kim | 22 | South-Hall| 45000
7 | James | 24 | Houston | 10000
(7 rows)
A função totalRecords () é a seguinte -
CREATE OR REPLACE FUNCTION totalRecords ()
RETURNS integer AS $total$
declare
total integer;
BEGIN
SELECT count(*) into total FROM COMPANY;
RETURN total;
END;
$total$ LANGUAGE plpgsql;
Quando a consulta acima é executada, o resultado seria -
testdb# CREATE FUNCTION
Agora, vamos executar uma chamada para esta função e verificar os registros na tabela COMPANY
testdb=# select totalRecords();
Quando a consulta acima é executada, o resultado seria -
totalrecords
--------------
7
(1 row)
As funções embutidas do PostgreSQL, também chamadas de funções de agregação, são usadas para executar o processamento em strings ou dados numéricos.
A seguir está a lista de todas as funções internas do PostgreSQL de uso geral -
Função PostgreSQL COUNT - A função de agregação PostgreSQL COUNT é usada para contar o número de linhas em uma tabela de banco de dados.
Função PostgreSQL MAX - A função agregada PostgreSQL MAX permite selecionar o valor mais alto (máximo) para uma determinada coluna.
Função PostgreSQL MIN - A função agregada PostgreSQL MIN permite selecionar o valor mais baixo (mínimo) para uma determinada coluna.
Função PostgreSQL AVG - A função agregada PostgreSQL AVG seleciona o valor médio para determinada coluna da tabela.
Função PostgreSQL SUM - A função agregada PostgreSQL SUM permite selecionar o total para uma coluna numérica.
Funções do PostgreSQL ARRAY - A função de agregação do PostgreSQL ARRAY coloca os valores de entrada, incluindo nulos, concatenados em um array.
Funções numéricas do PostgreSQL - lista completa de funções do PostgreSQL necessárias para manipular números em SQL.
PostgreSQL String Functions - Lista completa de funções PostgreSQL necessárias para manipular strings no PostgreSQL.
Este tutorial vai usar libpqxxbiblioteca, que é a API do cliente C ++ oficial para PostgreSQL. O código-fonte para libpqxx está disponível sob a licença BSD, então você é livre para baixá-lo, passá-lo para outras pessoas, alterá-lo, vendê-lo, incluí-lo em seu próprio código e compartilhar suas alterações com quem quiser.
Instalação
A última versão do libpqxx está disponível para download no link Download Libpqxx . Portanto, baixe a versão mais recente e siga as seguintes etapas -
wget http://pqxx.org/download/software/libpqxx/libpqxx-4.0.tar.gz
tar xvfz libpqxx-4.0.tar.gz
cd libpqxx-4.0
./configure
make
make install
Antes de começar a usar a interface PostgreSQL C / C ++, encontre o pg_hba.conf arquivo no diretório de instalação do PostgreSQL e adicione a seguinte linha -
# IPv4 local connections:
host all all 127.0.0.1/32 md5
Você pode iniciar / reiniciar o servidor postgres caso ele não esteja sendo executado usando o seguinte comando -
[root@host]# service postgresql restart
Stopping postgresql service: [ OK ]
Starting postgresql service: [ OK ]
APIs de interface C / C ++
A seguir estão rotinas de interface importantes que podem ser suficientes para trabalhar com o banco de dados PostgreSQL de seu programa C / C ++. Se você está procurando um aplicativo mais sofisticado, pode consultar a documentação oficial do libpqxx ou usar APIs disponíveis comercialmente.
S. No. | API e descrição |
---|---|
1 | pqxx::connection C( const std::string & dbstring ) Este é um typedef que será usado para conectar ao banco de dados. Aqui, dbstring fornece os parâmetros necessários para se conectar ao banco de dados, por exemplodbname = testdb user = postgres password=pass123 hostaddr=127.0.0.1 port=5432. Se a conexão for configurada com sucesso, ele cria C com o objeto de conexão que fornece várias funções públicas úteis. |
2 | C.is_open() O método is_open () é um método público de objeto de conexão e retorna um valor booleano. Se a conexão estiver ativa, este método retorna verdadeiro, caso contrário, retorna falso. |
3 | C.disconnect() Este método é usado para desconectar uma conexão de banco de dados aberta. |
4 | pqxx::work W( C ) Este é um typedef que será usado para criar um objeto transacional usando a conexão C, que em última análise será usado para executar instruções SQL no modo transacional. Se o objeto de transação for criado com sucesso, ele será atribuído à variável W, que será usada para acessar métodos públicos relacionados ao objeto de transação. |
5 | W.exec(const std::string & sql) Este método público do objeto transacional será usado para executar a instrução SQL. |
6 | W.commit() Este método público do objeto transacional será usado para confirmar a transação. |
7 | W.abort() Este método público do objeto transacional será usado para reverter a transação. |
8 | pqxx::nontransaction N( C ) Este é um typedef que será usado para criar um objeto não transacional usando a conexão C, que por fim será usado para executar instruções SQL no modo não transacional. Se o objeto de transação for criado com sucesso, ele será atribuído à variável N, que será usada para acessar métodos públicos relacionados ao objeto não transacional. |
9 | N.exec(const std::string & sql) Este método público de objeto não transacional será usado para executar a instrução SQL e retorna um objeto de resultado que é na verdade um interpretador que contém todos os registros retornados. |
Conectando-se ao banco de dados
O segmento de código C a seguir mostra como se conectar a um banco de dados existente em execução na máquina local na porta 5432. Aqui, usei barra invertida \ para continuação de linha.
#include <iostream>
#include <pqxx/pqxx>
using namespace std;
using namespace pqxx;
int main(int argc, char* argv[]) {
try {
connection C("dbname = testdb user = postgres password = cohondob \
hostaddr = 127.0.0.1 port = 5432");
if (C.is_open()) {
cout << "Opened database successfully: " << C.dbname() << endl;
} else {
cout << "Can't open database" << endl;
return 1;
}
C.disconnect ();
} catch (const std::exception &e) {
cerr << e.what() << std::endl;
return 1;
}
}
Agora, vamos compilar e executar o programa acima para conectar ao nosso banco de dados testdb, que já está disponível em seu esquema e pode ser acessado usando postgres de usuário e senha pass123 .
Você pode usar o ID do usuário e a senha com base na configuração do banco de dados. Lembre-se de manter o -lpqxx e -lpq na ordem fornecida! Caso contrário, o vinculador reclamará amargamente sobre as funções ausentes com nomes que começam com "PQ".
$g++ test.cpp -lpqxx -lpq $./a.out
Opened database successfully: testdb
Crie uma mesa
O seguinte segmento de código C será usado para criar uma tabela no banco de dados criado anteriormente -
#include <iostream>
#include <pqxx/pqxx>
using namespace std;
using namespace pqxx;
int main(int argc, char* argv[]) {
char * sql;
try {
connection C("dbname = testdb user = postgres password = cohondob \
hostaddr = 127.0.0.1 port = 5432");
if (C.is_open()) {
cout << "Opened database successfully: " << C.dbname() << endl;
} else {
cout << "Can't open database" << endl;
return 1;
}
/* Create SQL statement */
sql = "CREATE TABLE COMPANY(" \
"ID INT PRIMARY KEY NOT NULL," \
"NAME TEXT NOT NULL," \
"AGE INT NOT NULL," \
"ADDRESS CHAR(50)," \
"SALARY REAL );";
/* Create a transactional object. */
work W(C);
/* Execute SQL query */
W.exec( sql );
W.commit();
cout << "Table created successfully" << endl;
C.disconnect ();
} catch (const std::exception &e) {
cerr << e.what() << std::endl;
return 1;
}
return 0;
}
Quando o programa fornecido acima for compilado e executado, ele criará a tabela COMPANY em seu banco de dados testdb e exibirá as seguintes instruções -
Opened database successfully: testdb
Table created successfully
Operação INSERT
O seguinte segmento de código C mostra como podemos criar registros em nossa tabela COMPANY criada no exemplo acima -
#include <iostream>
#include <pqxx/pqxx>
using namespace std;
using namespace pqxx;
int main(int argc, char* argv[]) {
char * sql;
try {
connection C("dbname = testdb user = postgres password = cohondob \
hostaddr = 127.0.0.1 port = 5432");
if (C.is_open()) {
cout << "Opened database successfully: " << C.dbname() << endl;
} else {
cout << "Can't open database" << endl;
return 1;
}
/* Create SQL statement */
sql = "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) " \
"VALUES (1, 'Paul', 32, 'California', 20000.00 ); " \
"INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) " \
"VALUES (2, 'Allen', 25, 'Texas', 15000.00 ); " \
"INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)" \
"VALUES (3, 'Teddy', 23, 'Norway', 20000.00 );" \
"INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)" \
"VALUES (4, 'Mark', 25, 'Rich-Mond ', 65000.00 );";
/* Create a transactional object. */
work W(C);
/* Execute SQL query */
W.exec( sql );
W.commit();
cout << "Records created successfully" << endl;
C.disconnect ();
} catch (const std::exception &e) {
cerr << e.what() << std::endl;
return 1;
}
return 0;
}
Quando o programa fornecido acima for compilado e executado, ele criará determinados registros na tabela COMPANY e exibirá as duas linhas a seguir -
Opened database successfully: testdb
Records created successfully
SELECT Operação
O seguinte segmento de código C mostra como podemos buscar e exibir registros de nossa tabela COMPANY criada no exemplo acima -
#include <iostream>
#include <pqxx/pqxx>
using namespace std;
using namespace pqxx;
int main(int argc, char* argv[]) {
char * sql;
try {
connection C("dbname = testdb user = postgres password = cohondob \
hostaddr = 127.0.0.1 port = 5432");
if (C.is_open()) {
cout << "Opened database successfully: " << C.dbname() << endl;
} else {
cout << "Can't open database" << endl;
return 1;
}
/* Create SQL statement */
sql = "SELECT * from COMPANY";
/* Create a non-transactional object. */
nontransaction N(C);
/* Execute SQL query */
result R( N.exec( sql ));
/* List down all the records */
for (result::const_iterator c = R.begin(); c != R.end(); ++c) {
cout << "ID = " << c[0].as<int>() << endl;
cout << "Name = " << c[1].as<string>() << endl;
cout << "Age = " << c[2].as<int>() << endl;
cout << "Address = " << c[3].as<string>() << endl;
cout << "Salary = " << c[4].as<float>() << endl;
}
cout << "Operation done successfully" << endl;
C.disconnect ();
} catch (const std::exception &e) {
cerr << e.what() << std::endl;
return 1;
}
return 0;
}
Quando o programa fornecido acima for compilado e executado, ele produzirá o seguinte resultado -
Opened database successfully: testdb
ID = 1
Name = Paul
Age = 32
Address = California
Salary = 20000
ID = 2
Name = Allen
Age = 25
Address = Texas
Salary = 15000
ID = 3
Name = Teddy
Age = 23
Address = Norway
Salary = 20000
ID = 4
Name = Mark
Age = 25
Address = Rich-Mond
Salary = 65000
Operation done successfully
Operação ATUALIZAR
O seguinte segmento de código C mostra como podemos usar a instrução UPDATE para atualizar qualquer registro e, em seguida, buscar e exibir os registros atualizados de nossa tabela COMPANY -
#include <iostream>
#include <pqxx/pqxx>
using namespace std;
using namespace pqxx;
int main(int argc, char* argv[]) {
char * sql;
try {
connection C("dbname = testdb user = postgres password = cohondob \
hostaddr = 127.0.0.1 port = 5432");
if (C.is_open()) {
cout << "Opened database successfully: " << C.dbname() << endl;
} else {
cout << "Can't open database" << endl;
return 1;
}
/* Create a transactional object. */
work W(C);
/* Create SQL UPDATE statement */
sql = "UPDATE COMPANY set SALARY = 25000.00 where ID=1";
/* Execute SQL query */
W.exec( sql );
W.commit();
cout << "Records updated successfully" << endl;
/* Create SQL SELECT statement */
sql = "SELECT * from COMPANY";
/* Create a non-transactional object. */
nontransaction N(C);
/* Execute SQL query */
result R( N.exec( sql ));
/* List down all the records */
for (result::const_iterator c = R.begin(); c != R.end(); ++c) {
cout << "ID = " << c[0].as<int>() << endl;
cout << "Name = " << c[1].as<string>() << endl;
cout << "Age = " << c[2].as<int>() << endl;
cout << "Address = " << c[3].as<string>() << endl;
cout << "Salary = " << c[4].as<float>() << endl;
}
cout << "Operation done successfully" << endl;
C.disconnect ();
} catch (const std::exception &e) {
cerr << e.what() << std::endl;
return 1;
}
return 0;
}
Quando o programa fornecido acima for compilado e executado, ele produzirá o seguinte resultado -
Opened database successfully: testdb
Records updated successfully
ID = 2
Name = Allen
Age = 25
Address = Texas
Salary = 15000
ID = 3
Name = Teddy
Age = 23
Address = Norway
Salary = 20000
ID = 4
Name = Mark
Age = 25
Address = Rich-Mond
Salary = 65000
ID = 1
Name = Paul
Age = 32
Address = California
Salary = 25000
Operation done successfully
Operação DELETE
O seguinte segmento de código C mostra como podemos usar a instrução DELETE para excluir qualquer registro e, em seguida, buscar e exibir os registros restantes de nossa tabela COMPANY -
#include <iostream>
#include <pqxx/pqxx>
using namespace std;
using namespace pqxx;
int main(int argc, char* argv[]) {
char * sql;
try {
connection C("dbname = testdb user = postgres password = cohondob \
hostaddr = 127.0.0.1 port = 5432");
if (C.is_open()) {
cout << "Opened database successfully: " << C.dbname() << endl;
} else {
cout << "Can't open database" << endl;
return 1;
}
/* Create a transactional object. */
work W(C);
/* Create SQL DELETE statement */
sql = "DELETE from COMPANY where ID = 2";
/* Execute SQL query */
W.exec( sql );
W.commit();
cout << "Records deleted successfully" << endl;
/* Create SQL SELECT statement */
sql = "SELECT * from COMPANY";
/* Create a non-transactional object. */
nontransaction N(C);
/* Execute SQL query */
result R( N.exec( sql ));
/* List down all the records */
for (result::const_iterator c = R.begin(); c != R.end(); ++c) {
cout << "ID = " << c[0].as<int>() << endl;
cout << "Name = " << c[1].as<string>() << endl;
cout << "Age = " << c[2].as<int>() << endl;
cout << "Address = " << c[3].as<string>() << endl;
cout << "Salary = " << c[4].as<float>() << endl;
}
cout << "Operation done successfully" << endl;
C.disconnect ();
} catch (const std::exception &e) {
cerr << e.what() << std::endl;
return 1;
}
return 0;
}
Quando o programa fornecido acima for compilado e executado, ele produzirá o seguinte resultado -
Opened database successfully: testdb
Records deleted successfully
ID = 3
Name = Teddy
Age = 23
Address = Norway
Salary = 20000
ID = 4
Name = Mark
Age = 25
Address = Rich-Mond
Salary = 65000
ID = 1
Name = Paul
Age = 32
Address = California
Salary = 25000
Operation done successfully
Instalação
Antes de começarmos a usar o PostgreSQL em nossos programas Java, precisamos ter certeza de que temos PostgreSQL JDBC e Java configurados na máquina. Você pode verificar o tutorial Java para instalação do Java em sua máquina. Agora vamos verificar como configurar o driver JDBC PostgreSQL.
Baixe a versão mais recente do postgresql- (VERSION) .jdbc.jar do repositório postgresql-jdbc .
Adicione o arquivo jar baixado postgresql- (VERSION) .jdbc.jar em seu caminho de classe, ou você pode usá-lo junto com a opção -classpath conforme explicado abaixo nos exemplos.
A seção a seguir assume que você tem pouco conhecimento sobre os conceitos Java JDBC. Se você não tiver, sugerimos que você gaste meia hora com o Tutorial JDBC para se familiarizar com os conceitos explicados abaixo.
Conectando-se ao banco de dados
O código Java a seguir mostra como se conectar a um banco de dados existente. Se o banco de dados não existir, ele será criado e, finalmente, um objeto de banco de dados será retornado.
import java.sql.Connection;
import java.sql.DriverManager;
public class PostgreSQLJDBC {
public static void main(String args[]) {
Connection c = null;
try {
Class.forName("org.postgresql.Driver");
c = DriverManager
.getConnection("jdbc:postgresql://localhost:5432/testdb",
"postgres", "123");
} catch (Exception e) {
e.printStackTrace();
System.err.println(e.getClass().getName()+": "+e.getMessage());
System.exit(0);
}
System.out.println("Opened database successfully");
}
}
Antes de compilar e executar o programa acima, encontre pg_hba.conf arquivo no diretório de instalação do PostgreSQL e adicione a seguinte linha -
# IPv4 local connections:
host all all 127.0.0.1/32 md5
Você pode iniciar / reiniciar o servidor postgres caso ele não esteja sendo executado usando o seguinte comando -
[root@host]# service postgresql restart
Stopping postgresql service: [ OK ]
Starting postgresql service: [ OK ]
Agora, vamos compilar e executar o programa acima para conectar com testdb. Aqui, estamos usandopostgres como ID de usuário e 123como senha para acessar o banco de dados. Você pode alterar isso de acordo com a configuração e instalação do banco de dados. Também estamos assumindo a versão atual do driver JDBCpostgresql-9.2-1002.jdbc3.jar está disponível no caminho atual.
C:\JavaPostgresIntegration>javac PostgreSQLJDBC.java
C:\JavaPostgresIntegration>java -cp c:\tools\postgresql-9.2-1002.jdbc3.jar;C:\JavaPostgresIntegration PostgreSQLJDBC
Open database successfully
Crie uma mesa
O seguinte programa Java será usado para criar uma tabela no banco de dados aberto anteriormente. Certifique-se de não ter essa tabela já em seu banco de dados de destino.
import java.sql.*;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
public class PostgreSQLJDBC {
public static void main( String args[] ) {
Connection c = null;
Statement stmt = null;
try {
Class.forName("org.postgresql.Driver");
c = DriverManager
.getConnection("jdbc:postgresql://localhost:5432/testdb",
"manisha", "123");
System.out.println("Opened database successfully");
stmt = c.createStatement();
String sql = "CREATE TABLE COMPANY " +
"(ID INT PRIMARY KEY NOT NULL," +
" NAME TEXT NOT NULL, " +
" AGE INT NOT NULL, " +
" ADDRESS CHAR(50), " +
" SALARY REAL)";
stmt.executeUpdate(sql);
stmt.close();
c.close();
} catch ( Exception e ) {
System.err.println( e.getClass().getName()+": "+ e.getMessage() );
System.exit(0);
}
System.out.println("Table created successfully");
}
}
Quando um programa é compilado e executado, ele criará a tabela COMPANY em testdb banco de dados e exibirá as duas linhas a seguir -
Opened database successfully
Table created successfully
Operação INSERT
O seguinte programa Java mostra como podemos criar registros em nossa tabela COMPANY criada no exemplo acima -
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
public class PostgreSQLJDBC {
public static void main(String args[]) {
Connection c = null;
Statement stmt = null;
try {
Class.forName("org.postgresql.Driver");
c = DriverManager
.getConnection("jdbc:postgresql://localhost:5432/testdb",
"manisha", "123");
c.setAutoCommit(false);
System.out.println("Opened database successfully");
stmt = c.createStatement();
String sql = "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) "
+ "VALUES (1, 'Paul', 32, 'California', 20000.00 );";
stmt.executeUpdate(sql);
sql = "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) "
+ "VALUES (2, 'Allen', 25, 'Texas', 15000.00 );";
stmt.executeUpdate(sql);
sql = "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) "
+ "VALUES (3, 'Teddy', 23, 'Norway', 20000.00 );";
stmt.executeUpdate(sql);
sql = "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) "
+ "VALUES (4, 'Mark', 25, 'Rich-Mond ', 65000.00 );";
stmt.executeUpdate(sql);
stmt.close();
c.commit();
c.close();
} catch (Exception e) {
System.err.println( e.getClass().getName()+": "+ e.getMessage() );
System.exit(0);
}
System.out.println("Records created successfully");
}
}
Quando o programa acima for compilado e executado, ele criará determinados registros na tabela COMPANY e exibirá as duas linhas a seguir -
Opened database successfully
Records created successfully
SELECT Operação
O seguinte programa Java mostra como podemos buscar e exibir registros de nossa tabela COMPANY criada no exemplo acima -
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class PostgreSQLJDBC {
public static void main( String args[] ) {
Connection c = null;
Statement stmt = null;
try {
Class.forName("org.postgresql.Driver");
c = DriverManager
.getConnection("jdbc:postgresql://localhost:5432/testdb",
"manisha", "123");
c.setAutoCommit(false);
System.out.println("Opened database successfully");
stmt = c.createStatement();
ResultSet rs = stmt.executeQuery( "SELECT * FROM COMPANY;" );
while ( rs.next() ) {
int id = rs.getInt("id");
String name = rs.getString("name");
int age = rs.getInt("age");
String address = rs.getString("address");
float salary = rs.getFloat("salary");
System.out.println( "ID = " + id );
System.out.println( "NAME = " + name );
System.out.println( "AGE = " + age );
System.out.println( "ADDRESS = " + address );
System.out.println( "SALARY = " + salary );
System.out.println();
}
rs.close();
stmt.close();
c.close();
} catch ( Exception e ) {
System.err.println( e.getClass().getName()+": "+ e.getMessage() );
System.exit(0);
}
System.out.println("Operation done successfully");
}
}
Quando o programa é compilado e executado, ele produzirá o seguinte resultado -
Opened database successfully
ID = 1
NAME = Paul
AGE = 32
ADDRESS = California
SALARY = 20000.0
ID = 2
NAME = Allen
AGE = 25
ADDRESS = Texas
SALARY = 15000.0
ID = 3
NAME = Teddy
AGE = 23
ADDRESS = Norway
SALARY = 20000.0
ID = 4
NAME = Mark
AGE = 25
ADDRESS = Rich-Mond
SALARY = 65000.0
Operation done successfully
Operação ATUALIZAR
O código Java a seguir mostra como podemos usar a instrução UPDATE para atualizar qualquer registro e, em seguida, buscar e exibir os registros atualizados de nossa tabela COMPANY -
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class PostgreSQLJDBC {
public static void main( String args[] ) {
Connection c = null;
Statement stmt = null;
try {
Class.forName("org.postgresql.Driver");
c = DriverManager
.getConnection("jdbc:postgresql://localhost:5432/testdb",
"manisha", "123");
c.setAutoCommit(false);
System.out.println("Opened database successfully");
stmt = c.createStatement();
String sql = "UPDATE COMPANY set SALARY = 25000.00 where ID=1;";
stmt.executeUpdate(sql);
c.commit();
ResultSet rs = stmt.executeQuery( "SELECT * FROM COMPANY;" );
while ( rs.next() ) {
int id = rs.getInt("id");
String name = rs.getString("name");
int age = rs.getInt("age");
String address = rs.getString("address");
float salary = rs.getFloat("salary");
System.out.println( "ID = " + id );
System.out.println( "NAME = " + name );
System.out.println( "AGE = " + age );
System.out.println( "ADDRESS = " + address );
System.out.println( "SALARY = " + salary );
System.out.println();
}
rs.close();
stmt.close();
c.close();
} catch ( Exception e ) {
System.err.println( e.getClass().getName()+": "+ e.getMessage() );
System.exit(0);
}
System.out.println("Operation done successfully");
}
}
Quando o programa é compilado e executado, ele produzirá o seguinte resultado -
Opened database successfully
ID = 2
NAME = Allen
AGE = 25
ADDRESS = Texas
SALARY = 15000.0
ID = 3
NAME = Teddy
AGE = 23
ADDRESS = Norway
SALARY = 20000.0
ID = 4
NAME = Mark
AGE = 25
ADDRESS = Rich-Mond
SALARY = 65000.0
ID = 1
NAME = Paul
AGE = 32
ADDRESS = California
SALARY = 25000.0
Operation done successfully
Operação DELETE
O código Java a seguir mostra como podemos usar a instrução DELETE para excluir qualquer registro e, em seguida, buscar e exibir os registros restantes de nossa tabela COMPANY -
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class PostgreSQLJDBC6 {
public static void main( String args[] ) {
Connection c = null;
Statement stmt = null;
try {
Class.forName("org.postgresql.Driver");
c = DriverManager
.getConnection("jdbc:postgresql://localhost:5432/testdb",
"manisha", "123");
c.setAutoCommit(false);
System.out.println("Opened database successfully");
stmt = c.createStatement();
String sql = "DELETE from COMPANY where ID = 2;";
stmt.executeUpdate(sql);
c.commit();
ResultSet rs = stmt.executeQuery( "SELECT * FROM COMPANY;" );
while ( rs.next() ) {
int id = rs.getInt("id");
String name = rs.getString("name");
int age = rs.getInt("age");
String address = rs.getString("address");
float salary = rs.getFloat("salary");
System.out.println( "ID = " + id );
System.out.println( "NAME = " + name );
System.out.println( "AGE = " + age );
System.out.println( "ADDRESS = " + address );
System.out.println( "SALARY = " + salary );
System.out.println();
}
rs.close();
stmt.close();
c.close();
} catch ( Exception e ) {
System.err.println( e.getClass().getName()+": "+ e.getMessage() );
System.exit(0);
}
System.out.println("Operation done successfully");
}
}
Quando o programa é compilado e executado, ele produzirá o seguinte resultado -
Opened database successfully
ID = 3
NAME = Teddy
AGE = 23
ADDRESS = Norway
SALARY = 20000.0
ID = 4
NAME = Mark
AGE = 25
ADDRESS = Rich-Mond
SALARY = 65000.0
ID = 1
NAME = Paul
AGE = 32
ADDRESS = California
SALARY = 25000.0
Operation done successfully
Instalação
A extensão PostgreSQL é habilitada por padrão nas últimas versões do PHP 5.3.x. É possível desativá-lo usando--without-pgsqlem tempo de compilação. Ainda assim, você pode usar o comando yum para instalar a interface PHP -PostgreSQL -
yum install php-pgsql
Antes de começar a usar a interface PHP PostgreSQL, encontre o pg_hba.conf arquivo no diretório de instalação do PostgreSQL e adicione a seguinte linha -
# IPv4 local connections:
host all all 127.0.0.1/32 md5
Você pode iniciar / reiniciar o servidor postgres, caso ele não esteja em execução, usando o seguinte comando -
[root@host]# service postgresql restart
Stopping postgresql service: [ OK ]
Starting postgresql service: [ OK ]
Os usuários do Windows devem habilitar php_pgsql.dll para usar esta extensão. Esta DLL está incluída nas distribuições do Windows nas versões mais recentes do PHP 5.3.x
Para obter instruções detalhadas de instalação, consulte nosso tutorial de PHP e seu site oficial.
APIs de interface PHP
A seguir estão rotinas PHP importantes, que podem ser suficientes para trabalhar com o banco de dados PostgreSQL de seu programa PHP. Se você está procurando um aplicativo mais sofisticado, pode consultar a documentação oficial do PHP.
S. No. | API e descrição |
---|---|
1 | resource pg_connect ( string $connection_string [, int $connect_type ] ) Isso abre uma conexão com um banco de dados PostgreSQL especificado por connection_string. Se PGSQL_CONNECT_FORCE_NEW for passado como connect_type, então uma nova conexão é criada no caso de uma segunda chamada para pg_connect (), mesmo se connection_string for idêntica a uma conexão existente. |
2 | bool pg_connection_reset ( resource $connection ) Esta rotina redefine a conexão. É útil para recuperação de erros. Retorna TRUE em caso de sucesso ou FALSE em caso de falha. |
3 | int pg_connection_status ( resource $connection ) Esta rotina retorna o status da conexão especificada. Retorna PGSQL_CONNECTION_OK ou PGSQL_CONNECTION_BAD. |
4 | string pg_dbname ([ resource $connection ] ) Esta rotina retorna o nome do banco de dados do recurso de conexão PostgreSQL fornecido. |
5 | resource pg_prepare ([ resource $connection ], string $stmtname, string $query ) Isso envia uma solicitação para criar uma instrução preparada com os parâmetros fornecidos e aguarda a conclusão. |
6 | resource pg_execute ([ resource $connection ], string $stmtname, array $params ) Essa rotina envia uma solicitação para executar uma instrução preparada com parâmetros fornecidos e espera pelo resultado. |
7 | resource pg_query ([ resource $connection ], string $query ) Esta rotina executa a consulta na conexão de banco de dados especificada. |
8 | array pg_fetch_row ( resource $result [, int $row ] ) Esta rotina busca uma linha de dados do resultado associado ao recurso de resultado especificado. |
9 | array pg_fetch_all ( resource $result ) Esta rotina retorna uma matriz que contém todas as linhas (registros) no recurso de resultado. |
10 | int pg_affected_rows ( resource $result ) Esta rotina retorna o número de linhas afetadas pelas consultas INSERT, UPDATE e DELETE. |
11 | int pg_num_rows ( resource $result ) Esta rotina retorna o número de linhas em um recurso de resultado PostgreSQL, por exemplo, número de linhas retornadas pela instrução SELECT. |
12 | bool pg_close ([ resource $connection ] ) Esta rotina fecha a conexão não persistente com um banco de dados PostgreSQL associado ao recurso de conexão fornecido. |
13 | string pg_last_error ([ resource $connection ] ) Esta rotina retorna a última mensagem de erro para uma determinada conexão. |
14 | string pg_escape_literal ([ resource $connection ], string $data ) Essa rotina escapa de um literal para inserção em um campo de texto. |
15 | string pg_escape_string ([ resource $connection ], string $data ) Essa rotina escapa de uma string para consultar o banco de dados. |
Conectando ao banco de dados
O código PHP a seguir mostra como se conectar a um banco de dados existente em uma máquina local e, finalmente, um objeto de conexão de banco de dados será retornado.
<?php
$host = "host = 127.0.0.1"; $port = "port = 5432";
$dbname = "dbname = testdb"; $credentials = "user = postgres password=pass123";
$db = pg_connect( "$host $port $dbname $credentials" ); if(!$db) {
echo "Error : Unable to open database\n";
} else {
echo "Opened database successfully\n";
}
?>
Agora, vamos executar o programa fornecido acima para abrir nosso banco de dados testdb: se o banco de dados for aberto com sucesso, ele apresentará a seguinte mensagem -
Opened database successfully
Crie uma mesa
O seguinte programa PHP será usado para criar uma tabela em um banco de dados criado anteriormente -
<?php
$host = "host = 127.0.0.1"; $port = "port = 5432";
$dbname = "dbname = testdb"; $credentials = "user = postgres password=pass123";
$db = pg_connect( "$host $port $dbname $credentials" ); if(!$db) {
echo "Error : Unable to open database\n";
} else {
echo "Opened database successfully\n";
}
$sql =<<<EOF CREATE TABLE COMPANY (ID INT PRIMARY KEY NOT NULL, NAME TEXT NOT NULL, AGE INT NOT NULL, ADDRESS CHAR(50), SALARY REAL); EOF; $ret = pg_query($db, $sql);
if(!$ret) { echo pg_last_error($db);
} else {
echo "Table created successfully\n";
}
pg_close($db);
?>
Quando o programa fornecido acima for executado, ele criará a tabela COMPANY em seu testdb e exibirá as seguintes mensagens -
Opened database successfully
Table created successfully
Operação INSERT
O seguinte programa PHP mostra como podemos criar registros em nossa tabela COMPANY criada no exemplo acima -
<?php
$host = "host=127.0.0.1";
$port = "port=5432"; $dbname = "dbname = testdb";
$credentials = "user = postgres password=pass123"; $db = pg_connect( "$host $port $dbname $credentials" );
if(!$db) { echo "Error : Unable to open database\n"; } else { echo "Opened database successfully\n"; } $sql =<<<EOF
INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (1, 'Paul', 32, 'California', 20000.00 );
INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (2, 'Allen', 25, 'Texas', 15000.00 );
INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (3, 'Teddy', 23, 'Norway', 20000.00 );
INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (4, 'Mark', 25, 'Rich-Mond ', 65000.00 );
EOF;
$ret = pg_query($db, $sql); if(!$ret) {
echo pg_last_error($db); } else { echo "Records created successfully\n"; } pg_close($db);
?>
Quando o programa fornecido acima for executado, ele criará os registros fornecidos na tabela COMPANY e exibirá as duas linhas a seguir -
Opened database successfully
Records created successfully
SELECT Operação
O programa PHP a seguir mostra como podemos buscar e exibir registros de nossa tabela COMPANY criada no exemplo acima -
<?php
$host = "host = 127.0.0.1"; $port = "port = 5432";
$dbname = "dbname = testdb"; $credentials = "user = postgres password=pass123";
$db = pg_connect( "$host $port $dbname $credentials" ); if(!$db) {
echo "Error : Unable to open database\n";
} else {
echo "Opened database successfully\n";
}
$sql =<<<EOF SELECT * from COMPANY; EOF; $ret = pg_query($db, $sql);
if(!$ret) { echo pg_last_error($db);
exit;
}
while($row = pg_fetch_row($ret)) {
echo "ID = ". $row[0] . "\n"; echo "NAME = ". $row[1] ."\n";
echo "ADDRESS = ". $row[2] ."\n"; echo "SALARY = ".$row[4] ."\n\n";
}
echo "Operation done successfully\n";
pg_close($db);
?>
Quando o programa fornecido acima é executado, ele produzirá o seguinte resultado. Observe que os campos são retornados na sequência em que foram usados ao criar a tabela.
Opened database successfully
ID = 1
NAME = Paul
ADDRESS = California
SALARY = 20000
ID = 2
NAME = Allen
ADDRESS = Texas
SALARY = 15000
ID = 3
NAME = Teddy
ADDRESS = Norway
SALARY = 20000
ID = 4
NAME = Mark
ADDRESS = Rich-Mond
SALARY = 65000
Operation done successfully
Operação ATUALIZAR
O código PHP a seguir mostra como podemos usar a instrução UPDATE para atualizar qualquer registro e, em seguida, buscar e exibir os registros atualizados de nossa tabela COMPANY -
<?php
$host = "host=127.0.0.1";
$port = "port=5432"; $dbname = "dbname = testdb";
$credentials = "user = postgres password=pass123"; $db = pg_connect( "$host $port $dbname $credentials" );
if(!$db) { echo "Error : Unable to open database\n"; } else { echo "Opened database successfully\n"; } $sql =<<<EOF
UPDATE COMPANY set SALARY = 25000.00 where ID=1;
EOF;
$ret = pg_query($db, $sql); if(!$ret) {
echo pg_last_error($db); exit; } else { echo "Record updated successfully\n"; } $sql =<<<EOF
SELECT * from COMPANY;
EOF;
$ret = pg_query($db, $sql); if(!$ret) {
echo pg_last_error($db); exit; } while($row = pg_fetch_row($ret)) { echo "ID = ". $row[0] . "\n";
echo "NAME = ". $row[1] ."\n"; echo "ADDRESS = ". $row[2] ."\n";
echo "SALARY = ".$row[4] ."\n\n"; } echo "Operation done successfully\n"; pg_close($db);
?>
Quando o programa fornecido acima for executado, ele produzirá o seguinte resultado -
Opened database successfully
Record updated successfully
ID = 2
NAME = Allen
ADDRESS = 25
SALARY = 15000
ID = 3
NAME = Teddy
ADDRESS = 23
SALARY = 20000
ID = 4
NAME = Mark
ADDRESS = 25
SALARY = 65000
ID = 1
NAME = Paul
ADDRESS = 32
SALARY = 25000
Operation done successfully
Operação DELETE
O código PHP a seguir mostra como podemos usar a instrução DELETE para excluir qualquer registro e, em seguida, buscar e exibir os registros restantes de nossa tabela COMPANY -
<?php
$host = "host = 127.0.0.1"; $port = "port = 5432";
$dbname = "dbname = testdb"; $credentials = "user = postgres password=pass123";
$db = pg_connect( "$host $port $dbname $credentials" ); if(!$db) {
echo "Error : Unable to open database\n";
} else {
echo "Opened database successfully\n";
}
$sql =<<<EOF DELETE from COMPANY where ID=2; EOF; $ret = pg_query($db, $sql);
if(!$ret) { echo pg_last_error($db);
exit;
} else {
echo "Record deleted successfully\n";
}
$sql =<<<EOF SELECT * from COMPANY; EOF; $ret = pg_query($db, $sql);
if(!$ret) { echo pg_last_error($db);
exit;
}
while($row = pg_fetch_row($ret)) {
echo "ID = ". $row[0] . "\n"; echo "NAME = ". $row[1] ."\n";
echo "ADDRESS = ". $row[2] ."\n"; echo "SALARY = ".$row[4] ."\n\n";
}
echo "Operation done successfully\n";
pg_close($db);
?>
Quando o programa fornecido acima for executado, ele produzirá o seguinte resultado -
Opened database successfully
Record deleted successfully
ID = 3
NAME = Teddy
ADDRESS = 23
SALARY = 20000
ID = 4
NAME = Mark
ADDRESS = 25
SALARY = 65000
ID = 1
NAME = Paul
ADDRESS = 32
SALARY = 25000
Operation done successfully
Instalação
O PostgreSQL pode ser integrado ao Perl usando o módulo Perl DBI, que é um módulo de acesso ao banco de dados para a linguagem de programação Perl. Ele define um conjunto de métodos, variáveis e convenções que fornecem uma interface de banco de dados padrão.
Aqui estão os passos simples para instalar o módulo DBI em sua máquina Linux / Unix -
$ wget http://search.cpan.org/CPAN/authors/id/T/TI/TIMB/DBI-1.625.tar.gz
$ tar xvfz DBI-1.625.tar.gz $ cd DBI-1.625
$ perl Makefile.PL $ make
$ make install
Se você precisar instalar o driver SQLite para DBI, ele pode ser instalado da seguinte maneira -
$ wget http://search.cpan.org/CPAN/authors/id/T/TU/TURNSTEP/DBD-Pg-2.19.3.tar.gz
$ tar xvfz DBD-Pg-2.19.3.tar.gz $ cd DBD-Pg-2.19.3
$ perl Makefile.PL $ make
$ make install
Antes de começar a usar a interface Perl PostgreSQL, encontre o pg_hba.conf arquivo no diretório de instalação do PostgreSQL e adicione a seguinte linha -
# IPv4 local connections:
host all all 127.0.0.1/32 md5
Você pode iniciar / reiniciar o servidor postgres, caso ele não esteja em execução, usando o seguinte comando -
[root@host]# service postgresql restart
Stopping postgresql service: [ OK ]
Starting postgresql service: [ OK ]
APIs de interface DBI
A seguir estão as importantes rotinas DBI, que podem ser suficientes para trabalhar com o banco de dados SQLite de seu programa Perl. Se você está procurando um aplicativo mais sofisticado, pode consultar a documentação oficial do Perl DBI.
S. No. | API e descrição |
---|---|
1 | DBI→connect($data_source, "userid", "password", \%attr) Estabelece uma conexão de banco de dados, ou sessão, para o $ data_source solicitado. Retorna um objeto de identificador de banco de dados se a conexão for bem-sucedida. A fonte de dados tem o formato: DBI:Pg:dbname=$database;host=127.0.0.1;port=5432 Pg é o nome do driver PostgreSQL e testdb é o nome do banco de dados. |
2 | $dbh→do($sql) Essa rotina prepara e executa uma única instrução SQL. Retorna o número de linhas afetadas ou undef em caso de erro. Um valor de retorno de -1 significa que o número de linhas não é conhecido, não aplicável ou não disponível. Aqui $ dbh é um identificador retornado pela chamada DBI → connect (). |
3 | $dbh→prepare($sql) Essa rotina prepara uma instrução para execução posterior pelo mecanismo de banco de dados e retorna uma referência a um objeto de manipulação de instrução. |
4 | $sth→execute() Essa rotina executa todo o processamento necessário para executar a instrução preparada. Um undef é retornado se ocorrer um erro. Uma execução bem-sucedida sempre retorna verdadeiro, independentemente do número de linhas afetadas. Aqui$sth is a statement handle returned by $dbh → preparar chamada ($ sql). |
5 | $sth→fetchrow_array() Esta rotina busca a próxima linha de dados e a retorna como uma lista contendo os valores do campo. Os campos nulos são retornados como valores undef na lista. |
6 | $DBI::err Isso é equivalente a $ h → err, onde $h is any of the handle types like $dbh, $sth, or $drh. Isso retorna o código de erro do mecanismo de banco de dados nativo do último método de driver chamado. |
7 | $DBI::errstr Isso é equivalente a $ h → errstr, onde $h is any of the handle types like $dbh, $sth, or $drh. Isso retorna a mensagem de erro do mecanismo de banco de dados nativo do último método DBI chamado. |
8 | $dbh->disconnect() Esta rotina fecha uma conexão de banco de dados aberta anteriormente por uma chamada para DBI → connect (). |
Conectando ao banco de dados
O código Perl a seguir mostra como se conectar a um banco de dados existente. Se o banco de dados não existir, ele será criado e, finalmente, um objeto de banco de dados será retornado.
#!/usr/bin/perl
use DBI;
use strict;
my $driver = "Pg";
my $database = "testdb"; my $dsn = "DBI:$driver:dbname = $database;host = 127.0.0.1;port = 5432";
my $userid = "postgres"; my $password = "pass123";
my $dbh = DBI->connect($dsn, $userid, $password, { RaiseError => 1 })
or die $DBI::errstr;
print "Opened database successfully\n";
Agora, vamos executar o programa fornecido acima para abrir nosso banco de dados testdb; se o banco de dados for aberto com sucesso, ele apresentará a seguinte mensagem -
Open database successfully
Crie uma mesa
O seguinte programa Perl será usado para criar uma tabela no banco de dados criado anteriormente -
#!/usr/bin/perl
use DBI;
use strict;
my $driver = "Pg";
my $database = "testdb"; my $dsn = "DBI:$driver:dbname=$database;host=127.0.0.1;port=5432";
my $userid = "postgres"; my $password = "pass123";
my $dbh = DBI->connect($dsn, $userid, $password, { RaiseError => 1 })
or die $DBI::errstr; print "Opened database successfully\n"; my $stmt = qq(CREATE TABLE COMPANY
(ID INT PRIMARY KEY NOT NULL,
NAME TEXT NOT NULL,
AGE INT NOT NULL,
ADDRESS CHAR(50),
SALARY REAL););
my $rv = $dbh->do($stmt); if($rv < 0) {
print $DBI::errstr; } else { print "Table created successfully\n"; } $dbh->disconnect();
Quando o programa fornecido acima for executado, ele criará a tabela COMPANY em seu testdb e exibirá as seguintes mensagens -
Opened database successfully
Table created successfully
Operação INSERT
O seguinte programa Perl mostra como podemos criar registros em nossa tabela COMPANY criada no exemplo acima -
#!/usr/bin/perl
use DBI;
use strict;
my $driver = "Pg"; my $database = "testdb";
my $dsn = "DBI:$driver:dbname = $database;host = 127.0.0.1;port = 5432"; my $userid = "postgres";
my $password = "pass123"; my $dbh = DBI->connect($dsn, $userid, $password, { RaiseError => 1 }) or die $DBI::errstr;
print "Opened database successfully\n";
my $stmt = qq(INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) VALUES (1, 'Paul', 32, 'California', 20000.00 )); my $rv = $dbh->do($stmt) or die $DBI::errstr; $stmt = qq(INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (2, 'Allen', 25, 'Texas', 15000.00 ));
$rv = $dbh->do($stmt) or die $DBI::errstr;
$stmt = qq(INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) VALUES (3, 'Teddy', 23, 'Norway', 20000.00 )); $rv = $dbh->do($stmt) or die $DBI::errstr; $stmt = qq(INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (4, 'Mark', 25, 'Rich-Mond ', 65000.00 ););
$rv = $dbh->do($stmt) or die $DBI::errstr;
print "Records created successfully\n";
$dbh->disconnect();
Quando o programa fornecido acima for executado, ele criará determinados registros na tabela COMPANY e exibirá as duas linhas a seguir -
Opened database successfully
Records created successfully
SELECT Operação
O seguinte programa Perl mostra como podemos buscar e exibir registros de nossa tabela COMPANY criada no exemplo acima -
#!/usr/bin/perl
use DBI;
use strict;
my $driver = "Pg";
my $database = "testdb"; my $dsn = "DBI:$driver:dbname = $database;host = 127.0.0.1;port = 5432";
my $userid = "postgres"; my $password = "pass123";
my $dbh = DBI->connect($dsn, $userid, $password, { RaiseError => 1 })
or die $DBI::errstr; print "Opened database successfully\n"; my $stmt = qq(SELECT id, name, address, salary from COMPANY;);
my $sth = $dbh->prepare( $stmt ); my $rv = $sth->execute() or die $DBI::errstr;
if($rv < 0) { print $DBI::errstr;
}
while(my @row = $sth->fetchrow_array()) { print "ID = ". $row[0] . "\n";
print "NAME = ". $row[1] ."\n"; print "ADDRESS = ". $row[2] ."\n";
print "SALARY = ". $row[3] ."\n\n"; } print "Operation done successfully\n"; $dbh->disconnect();
Quando o programa fornecido acima for executado, ele produzirá o seguinte resultado -
Opened database successfully
ID = 1
NAME = Paul
ADDRESS = California
SALARY = 20000
ID = 2
NAME = Allen
ADDRESS = Texas
SALARY = 15000
ID = 3
NAME = Teddy
ADDRESS = Norway
SALARY = 20000
ID = 4
NAME = Mark
ADDRESS = Rich-Mond
SALARY = 65000
Operation done successfully
Operação ATUALIZAR
O seguinte código Perl mostra como podemos usar a instrução UPDATE para atualizar qualquer registro e, em seguida, buscar e exibir os registros atualizados de nossa tabela COMPANY -
#!/usr/bin/perl
use DBI;
use strict;
my $driver = "Pg"; my $database = "testdb";
my $dsn = "DBI:$driver:dbname = $database;host = 127.0.0.1;port = 5432"; my $userid = "postgres";
my $password = "pass123"; my $dbh = DBI->connect($dsn, $userid, $password, { RaiseError => 1 }) or die $DBI::errstr;
print "Opened database successfully\n";
my $stmt = qq(UPDATE COMPANY set SALARY = 25000.00 where ID=1;); my $rv = $dbh->do($stmt) or die $DBI::errstr; if( $rv < 0 ) {
print $DBI::errstr; }else{ print "Total number of rows updated : $rv\n";
}
$stmt = qq(SELECT id, name, address, salary from COMPANY;); my $sth = $dbh->prepare( $stmt );
$rv = $sth->execute() or die $DBI::errstr; if($rv < 0) {
print $DBI::errstr; } while(my @row = $sth->fetchrow_array()) {
print "ID = ". $row[0] . "\n"; print "NAME = ". $row[1] ."\n";
print "ADDRESS = ". $row[2] ."\n"; print "SALARY = ". $row[3] ."\n\n";
}
print "Operation done successfully\n";
$dbh->disconnect();
Quando o programa fornecido acima for executado, ele produzirá o seguinte resultado -
Opened database successfully
Total number of rows updated : 1
ID = 1
NAME = Paul
ADDRESS = California
SALARY = 25000
ID = 2
NAME = Allen
ADDRESS = Texas
SALARY = 15000
ID = 3
NAME = Teddy
ADDRESS = Norway
SALARY = 20000
ID = 4
NAME = Mark
ADDRESS = Rich-Mond
SALARY = 65000
Operation done successfully
Operação DELETE
O seguinte código Perl mostra como podemos usar a instrução DELETE para excluir qualquer registro e, em seguida, buscar e exibir os registros restantes de nossa tabela COMPANY -
#!/usr/bin/perl
use DBI;
use strict;
my $driver = "Pg";
my $database = "testdb"; my $dsn = "DBI:$driver:dbname = $database;host = 127.0.0.1;port = 5432";
my $userid = "postgres"; my $password = "pass123";
my $dbh = DBI->connect($dsn, $userid, $password, { RaiseError => 1 })
or die $DBI::errstr; print "Opened database successfully\n"; my $stmt = qq(DELETE from COMPANY where ID=2;);
my $rv = $dbh->do($stmt) or die $DBI::errstr;
if( $rv < 0 ) { print $DBI::errstr;
} else{
print "Total number of rows deleted : $rv\n"; } $stmt = qq(SELECT id, name, address, salary from COMPANY;);
my $sth = $dbh->prepare( $stmt ); $rv = $sth->execute() or die $DBI::errstr;
if($rv < 0) { print $DBI::errstr;
}
while(my @row = $sth->fetchrow_array()) { print "ID = ". $row[0] . "\n";
print "NAME = ". $row[1] ."\n"; print "ADDRESS = ". $row[2] ."\n";
print "SALARY = ". $row[3] ."\n\n"; } print "Operation done successfully\n"; $dbh->disconnect();
Quando o programa fornecido acima for executado, ele produzirá o seguinte resultado -
Opened database successfully
Total number of rows deleted : 1
ID = 1
NAME = Paul
ADDRESS = California
SALARY = 25000
ID = 3
NAME = Teddy
ADDRESS = Norway
SALARY = 20000
ID = 4
NAME = Mark
ADDRESS = Rich-Mond
SALARY = 65000
Operation done successfully
Instalação
O PostgreSQL pode ser integrado ao Python usando o módulo psycopg2. sycopg2 é um adaptador de banco de dados PostgreSQL para a linguagem de programação Python. psycopg2 foi escrito com o objetivo de ser muito pequeno, rápido e estável como uma rocha. Você não precisa instalar este módulo separadamente porque ele é enviado, por padrão, junto com o Python versão 2.5.x em diante.
Se você não o tiver instalado em sua máquina, você pode usar o comando yum para instalá-lo da seguinte maneira -
$yum install python-psycopg2
Para usar o módulo psycopg2, você deve primeiro criar um objeto Connection que representa o banco de dados e, em seguida, opcionalmente, pode criar um objeto cursor que o ajudará a executar todas as instruções SQL.
APIs de módulo Python psycopg2
A seguir estão as rotinas do módulo psycopg2 importantes, que podem ser suficientes para trabalhar com o banco de dados PostgreSQL do seu programa Python. Se você está procurando um aplicativo mais sofisticado, pode consultar a documentação oficial do módulo Python psycopg2.
S. No. | API e descrição |
---|---|
1 | psycopg2.connect(database="testdb", user="postgres", password="cohondob", host="127.0.0.1", port="5432") Esta API abre uma conexão com o banco de dados PostgreSQL. Se o banco de dados for aberto com sucesso, ele retorna um objeto de conexão. |
2 | connection.cursor() Esta rotina cria um cursor que será usado em toda a sua programação de banco de dados com Python. |
3 | cursor.execute(sql [, optional parameters]) Esta rotina executa uma instrução SQL. A instrução SQL pode ser parametrizada (ou seja, marcadores de posição em vez de literais SQL). O módulo psycopg2 suporta placeholder usando o sinal% s Por exemplo: cursor.execute ("inserir valores de pessoas (% s,% s)", (quem, idade)) |
4 | cursor.executemany(sql, seq_of_parameters) Esta rotina executa um comando SQL em todas as sequências de parâmetros ou mapeamentos encontrados na sequência sql. |
5 | cursor.callproc(procname[, parameters]) Esta rotina executa um procedimento de banco de dados armazenado com o nome fornecido. A seqüência de parâmetros deve conter uma entrada para cada argumento que o procedimento espera. |
6 | cursor.rowcount Este atributo somente leitura que retorna o número total de linhas do banco de dados que foram modificadas, inseridas ou excluídas pelo último execute * (). |
7 | connection.commit() Este método confirma a transação atual. Se você não chamar este método, tudo o que você fez desde a última chamada para commit () não será visível em outras conexões de banco de dados. |
8 | connection.rollback() Este método reverte quaisquer mudanças no banco de dados desde a última chamada para commit (). |
9 | connection.close() Este método fecha a conexão com o banco de dados. Observe que isso não chama commit () automaticamente. Se você apenas fechar a conexão com o banco de dados sem chamar commit () primeiro, suas alterações serão perdidas! |
10 | cursor.fetchone() Este método busca a próxima linha de um conjunto de resultados de consulta, retornando uma única sequência, ou None quando não há mais dados disponíveis. |
11 | cursor.fetchmany([size=cursor.arraysize]) Essa rotina busca o próximo conjunto de linhas de um resultado de consulta, retornando uma lista. Uma lista vazia é retornada quando não há mais linhas disponíveis. O método tenta buscar quantas linhas forem indicadas pelo parâmetro de tamanho. |
12 | cursor.fetchall() Esta rotina busca todas as linhas (restantes) de um resultado de consulta, retornando uma lista. Uma lista vazia é retornada quando nenhuma linha está disponível. |
Conectando ao banco de dados
O código Python a seguir mostra como se conectar a um banco de dados existente. Se o banco de dados não existir, ele será criado e, finalmente, um objeto de banco de dados será retornado.
#!/usr/bin/python
import psycopg2
conn = psycopg2.connect(database="testdb", user = "postgres", password = "pass123", host = "127.0.0.1", port = "5432")
print "Opened database successfully"
Aqui, você também pode fornecer banco de dados testdb como nome e se o banco de dados for aberto com sucesso, então apresentará a seguinte mensagem -
Open database successfully
Crie uma mesa
O seguinte programa Python será usado para criar uma tabela no banco de dados criado anteriormente -
#!/usr/bin/python
import psycopg2
conn = psycopg2.connect(database = "testdb", user = "postgres", password = "pass123", host = "127.0.0.1", port = "5432")
print "Opened database successfully"
cur = conn.cursor()
cur.execute('''CREATE TABLE COMPANY
(ID INT PRIMARY KEY NOT NULL,
NAME TEXT NOT NULL,
AGE INT NOT NULL,
ADDRESS CHAR(50),
SALARY REAL);''')
print "Table created successfully"
conn.commit()
conn.close()
Quando o programa fornecido acima for executado, ele criará a tabela COMPANY em seu test.db e exibirá as seguintes mensagens -
Opened database successfully
Table created successfully
Operação INSERT
O programa Python a seguir mostra como podemos criar registros em nossa tabela COMPANY criada no exemplo acima -
#!/usr/bin/python
import psycopg2
conn = psycopg2.connect(database = "testdb", user = "postgres", password = "pass123", host = "127.0.0.1", port = "5432")
print "Opened database successfully"
cur = conn.cursor()
cur.execute("INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) \
VALUES (1, 'Paul', 32, 'California', 20000.00 )");
cur.execute("INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) \
VALUES (2, 'Allen', 25, 'Texas', 15000.00 )");
cur.execute("INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) \
VALUES (3, 'Teddy', 23, 'Norway', 20000.00 )");
cur.execute("INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) \
VALUES (4, 'Mark', 25, 'Rich-Mond ', 65000.00 )");
conn.commit()
print "Records created successfully";
conn.close()
Quando o programa fornecido acima for executado, ele criará determinados registros na tabela COMPANY e exibirá as duas linhas a seguir -
Opened database successfully
Records created successfully
SELECT Operação
O seguinte programa Python mostra como podemos buscar e exibir registros de nossa tabela COMPANY criada no exemplo acima -
#!/usr/bin/python
import psycopg2
conn = psycopg2.connect(database = "testdb", user = "postgres", password = "pass123", host = "127.0.0.1", port = "5432")
print "Opened database successfully"
cur = conn.cursor()
cur.execute("SELECT id, name, address, salary from COMPANY")
rows = cur.fetchall()
for row in rows:
print "ID = ", row[0]
print "NAME = ", row[1]
print "ADDRESS = ", row[2]
print "SALARY = ", row[3], "\n"
print "Operation done successfully";
conn.close()
Quando o programa fornecido acima for executado, ele produzirá o seguinte resultado -
Opened database successfully
ID = 1
NAME = Paul
ADDRESS = California
SALARY = 20000.0
ID = 2
NAME = Allen
ADDRESS = Texas
SALARY = 15000.0
ID = 3
NAME = Teddy
ADDRESS = Norway
SALARY = 20000.0
ID = 4
NAME = Mark
ADDRESS = Rich-Mond
SALARY = 65000.0
Operation done successfully
Operação ATUALIZAR
O código Python a seguir mostra como podemos usar a instrução UPDATE para atualizar qualquer registro e, em seguida, buscar e exibir os registros atualizados de nossa tabela COMPANY -
#!/usr/bin/python
import psycopg2
conn = psycopg2.connect(database = "testdb", user = "postgres", password = "pass123", host = "127.0.0.1", port = "5432")
print "Opened database successfully"
cur = conn.cursor()
cur.execute("UPDATE COMPANY set SALARY = 25000.00 where ID = 1")
conn.commit()
print "Total number of rows updated :", cur.rowcount
cur.execute("SELECT id, name, address, salary from COMPANY")
rows = cur.fetchall()
for row in rows:
print "ID = ", row[0]
print "NAME = ", row[1]
print "ADDRESS = ", row[2]
print "SALARY = ", row[3], "\n"
print "Operation done successfully";
conn.close()
Quando o programa fornecido acima for executado, ele produzirá o seguinte resultado -
Opened database successfully
Total number of rows updated : 1
ID = 1
NAME = Paul
ADDRESS = California
SALARY = 25000.0
ID = 2
NAME = Allen
ADDRESS = Texas
SALARY = 15000.0
ID = 3
NAME = Teddy
ADDRESS = Norway
SALARY = 20000.0
ID = 4
NAME = Mark
ADDRESS = Rich-Mond
SALARY = 65000.0
Operation done successfully
Operação DELETE
O código Python a seguir mostra como podemos usar a instrução DELETE para excluir qualquer registro e, em seguida, buscar e exibir os registros restantes de nossa tabela COMPANY -
#!/usr/bin/python
import psycopg2
conn = psycopg2.connect(database = "testdb", user = "postgres", password = "pass123", host = "127.0.0.1", port = "5432")
print "Opened database successfully"
cur = conn.cursor()
cur.execute("DELETE from COMPANY where ID=2;")
conn.commit()
print "Total number of rows deleted :", cur.rowcount
cur.execute("SELECT id, name, address, salary from COMPANY")
rows = cur.fetchall()
for row in rows:
print "ID = ", row[0]
print "NAME = ", row[1]
print "ADDRESS = ", row[2]
print "SALARY = ", row[3], "\n"
print "Operation done successfully";
conn.close()
Quando o programa fornecido acima for executado, ele produzirá o seguinte resultado -
Opened database successfully
Total number of rows deleted : 1
ID = 1
NAME = Paul
ADDRESS = California
SALARY = 20000.0
ID = 3
NAME = Teddy
ADDRESS = Norway
SALARY = 20000.0
ID = 4
NAME = Mark
ADDRESS = Rich-Mond
SALARY = 65000.0
Operation done successfully