You are on page 1of 192

Curso de Sistemas de Informao Banco de Dados II

Disciplina: Banco de Dados II Aula 1: Reviso SQL Bsico Turma: 6 Prof. Silvio Bendini

1
Prof. Silvio Bendini Banco de Dados II Aula 1

Introduo SQL

Bom aprendizado a todos! Prof. Silvio


2
Prof. Silvio Bendini Banco de Dados II Aula 1

Sistemas de arquivos e bancos de dados relacionais


O acesso informaes em sistemas de processamento de dados que no utilizam Sistemas Gerenciadores de Bancos de Dados (SGBDs) feito pelo acesso sequencial a um ou mais arquivos. Cabe ao desenvolvedor criar mecanismos de recuperao da informao. Com a utilizao de um SGBD, porm, o acesso fica diferente: pede-se as informaes ao gerenciador de banco de dados e elas so devolvidas por ele.

3
Prof. Silvio Bendini Banco de Dados II Aula 1

Sistemas de arquivos e bancos de dados relacionais


O processo pode ser comparado a uma compra em uma loja de departamentos e uma compra em uma loja de autopeas, que normalmente funcionam por processos diferentes. No primeiro caso, o cliente dirige-se loja, procura por todas as sees, encontra o produto desejado e efetua a compra. No segundo, o cliente pede ao balconista o item desejado que lhe faz a entrega do mesmo. No caso da compra em loja de departamentos, o trabalho todo do cliente, sendo este responsvel inclusive pelas especificaes necessrias (fazer a escolha certa). J na loja de autopeas, o balconista assume toda a responsabilidade pela entrega da mercadoria desejada.

4
Prof. Silvio Bendini Banco de Dados II Aula 1

A Linguagem SQL
SQL - Structured Query Language, ou Linguagem de Consulta Estruturada, uma linguagem de pesquisa declarativa para banco de dados relacional (base de dados relacional). Muitas das caractersticas originais do SQL foram inspiradas na lgebra relacional. O SQL foi desenvolvido originalmente no incio dos anos 70 nos laboratrios da IBM em San Jose, dentro do projeto System R, que tinha por objetivo demonstrar a viabilidade da implementao do modelo relacional proposto por E. F. Codd. O nome original da linguagem era SEQUEL, acrnimo para "Structured English Query Language" (Linguagem de Consulta Estruturada em Ingls), vindo da o fato de at hoje a sigla em ingls ser comumente pronunciada "squel" ao invs de "ski-l", letra a letra.

5
Prof. Silvio Bendini Banco de Dados II Aula 1

A Linguagem SQL
No entanto, em portugus, a pronncia mais corrente a letra a letra: "esse-qu-ele". A linguagem SQL um grande padro de banco de dados. Isto decorre da sua simplicidade e facilidade de uso. Ela se diferencia de outras linguagens de consulta a banco de dados no sentido em que uma consulta SQL especifica a forma do resultado e no o caminho para chegar a ele. Ela um linguagem declarativa em oposio a outras linguagens procedurais. Isto reduz o ciclo de aprendizado daqueles que se iniciam na linguagem.
6
Prof. Silvio Bendini Banco de Dados II Aula 1

A Linguagem SQL
Embora o SQL tenha sido originalmente criado pela IBM, rapidamente surgiram vrios dialetos desenvolvidos por outros desenvolvedores. Essa expanso levou necessidade de criao e adaptao de um padro para a linguagem. Esta tarefa foi realizada pela American National Standards Institute (ANSI) em 1986 e ISO em 1987. O SQL foi revisto em 1992 e a esta verso foi dado o nome de SQL-92. Foi revisto novamente em 1999 e 2003 para se tornar SQL:1999 (SQL3) e SQL:2003, respectivamente. Novas caractersticas, como utilizao de java, framework SQL, dados espaciais e data mining foram includas nas verses SQL:2008 e SQL:2011.

7
Prof. Silvio Bendini Banco de Dados II Aula 1

A Linguagem SQL
O SQL:1999 usa expresses regulares de emparelhamento, queries recursivas e gatilhos (triggers). Tambm foi feita uma adio controversa de tipos noescalados e algumas caractersticas de orientao a objeto. O SQL:2003 introduz caractersticas relacionadas ao XML, sequencias padronizadas e colunas com valores de auto incremento (inclusive colunas-identidade). O SQL, embora padronizado pela ANSI e ISO, possui muitas variaes e extenses produzidas pelos diferentes fabricantes de sistemas gerenciadores de bases de dados. Tipicamente a linguagem pode ser migrada de plataforma para plataforma sem mudanas estruturais importantes.

8
Prof. Silvio Bendini Banco de Dados II Aula 1

A Linguagem SQL
Outra aproximao permitir para cdigo de idioma procedural ser embutido e interagir com o banco de dados. Por exemplo, o Oracle e outros SGBDs incluem Java na base de dados, enquanto o PostgreSQL permite que funes sejam escritas em Perl, TCL ou C, entre outras linguagens.

9
Prof. Silvio Bendini Banco de Dados II Aula 1

SQL Estrutura Lxica


As entradas do SQL so constitudas por uma sequencia de comandos. Um comando composto por uma sequencia de palavraschave (tokens), terminadas por um ponto-e-vrgula ( ; ). A validade dos comandos depende da sintaxe empregada. Uma palavra-chave pode ser simplesmente uma palavra, um identificador, um sinal, uma constante ou um caracter especial. Essas palavras-chave so separadas normalmente por espaos em branco, como por exemplo um espao simples, uma tabulao (tab) ou simplesmente uma nova linha.
10
Prof. Silvio Bendini Banco de Dados II Aula 1

SQL Estrutura Lxica


O exemplo abaixo uma entrada SQL vlida (sintaticamente falando):
SELECT * FROM MY_TABLE; UPDATE MY_TABLE SET A = 5; UPDATE MY_TABLE SET A = 5; INSERT INTO MY_TABLE VALUES (3, 'hi there'); Esta uma sequencia de trs comandos, um por linha. A diviso dos comandos no precisa acontecer por linha. O que importa o ponto-e-virgula (;) indicando o fim do comando. Os comandos podem tambm ser dividos em mais de uma linha. Comentrios podem estar entre as linhas ou entre os comandos, desde que devidamente identificados (-- ou /* */).

11
Prof. Silvio Bendini Banco de Dados II Aula 1

SQL Estrutura Lxica Identificadores e Palavras-Chave


SELECT, UPDATE, INSERT, DELETE, entre outras clusulas, so conhecidas como palavras-chave. Possuem um significado fixo na linguagem SQL. J o nome de uma tabela, como MY_TABLE, um exemplo de identificador. Identificadores identificam nomes de tabelas, colunas e outros objetos de banco de dados, dependendo do comando em que eles so usados. No entanto, s vezes, eles so chamados apenas como nomes.

12
Prof. Silvio Bendini Banco de Dados II Aula 1

SQL Estrutura Lxica Identificadores e Palavras-Chave


Palavras-chave e identificadores tem a mesma estrutura lxica. Essas palavras chaves e identificadores precisam sempre comear por uma letra (a-z) ou underline (_). Caracteres subsequentes podem letras, underscores, dgitos (0-9) ou sinal monetrio ($). O tamanho mximo para nomes de objetos variam entre as diversas distribuies de SGBD. Por padro, considere um tamanho mximo de nome com 63 caracteres.
13
Prof. Silvio Bendini Banco de Dados II Aula 1

SQL Estrutura Lxica Identificadores e Palavras-Chave


Palavras-chave e identificadores unquoted (sem estarem entre aspas duplas ) so case insensitive. Ou seja, no importa a forma como so referenciados. UPDATE MY_TABLE SET A = 5; equivalente a: uPDaTE my_TablE SeT a = 5; Uma conveno geralmente utilizada escrever palavraschave e identificadores em MAISCULO e nomes em minsculo. Exemplo: UPDATE my_table SET a = 5;
14
Prof. Silvio Bendini Banco de Dados II Aula 1

SQL Estrutura Lxica Identificadores e Palavras-Chave


Existe um segundo tipo de identificador, conhecido como identificador delimitado ou identificador quoted. Ele formado quando uma sequencia de caracteres esto entre aspas duplas ( ). Um identificador delimitado sempre um identificador, e nunca uma palavra-chave. Portanto, select pode ser usado para fazer referncia a uma tabela ou coluna chamada select, enquanto select sem aspas sempre uma palavra-chave, ocasionando, por isso, um erro do analisador quando usado onde um nome de tabela ou de coluna for esperado. O exemplo acima pode ser reescrito utilizando identificadores entre as como mostrado abaixo: UPDATE minha_tabela SET a = 5;

15
Prof. Silvio Bendini Banco de Dados II Aula 1

SQL Estrutura Lxica Identificadores e Palavras-Chave


Identificadores entre aspas podem conter qualquer caractere que no seja a prpria aspas (para incluir uma aspas, devem ser escritas duas aspas). Esta funcionalidade permite criar nomes de tabelas e de colunas que no seriam possveis de outra forma, como os contendo espaos ou e comercial (&). O limite de comprimento ainda se aplica. Colocar um identificador entre aspas torna diferente as letras maisculas e minsculas, enquanto as letras dos nomes entre aspas so sempre convertidas em minsculas. Por exemplo, os identificadores FOO, foo e foo so considerados o mesmo identificador, mas Fooe FOO so diferentes dos trs primeiros e entre si.

16
Prof. Silvio Bendini Banco de Dados II Aula 1

SQL Estrutura Lxica Identificadores e Palavras-Chave


A transformao das letras dos nomes que no esto entre aspas em minsculas incompatvel com o padro SQL, que especifica a transformao em maisculas das letras dos nomes que no esto entre aspas. Portanto, foo deveria ser equivalente a FOO, e no a foo, de acordo com o padro. Se for desejado desenvolver aplicativos portveis, aconselhase colocar o nome sempre entre aspas, ou nunca entre aspas.

17
Prof. Silvio Bendini Banco de Dados II Aula 1

SQL Estrutura Lxica - Constantes


A quantidade de constantes disponveis est ligada diretamente ao SGBD em utilizao. De maneira genrica, as constantes podem ser do tipo cadeia de caracteres (exemplo: abc), cadeias de bits (exemplo: 0x02FA) e numricas (exemplo: 123). As constantes tambm podem ser especificadas com tipo explcito, o que permite uma representao mais precisa e um tratamento mais eficiente por parte do sistema.

18
Prof. Silvio Bendini Banco de Dados II Aula 1

SQL Estrutura Lxica - Constantes do tipo cadeia de caracteres


Uma constante cadeia de caracteres (string constant) no SQL uma sequencia arbitrria de caracteres cercada por aspas simples () ou apstrofos como, por exemplo: Esta uma cadeia de caracteres A forma de escrever um apstrofo (ou aspas simples) dentro de uma constante cadeia de caracteres, em conformidade com o padro SQL, inserindo duas aspas simples adjacentes, como, por exemplo: Copo d Agua Em alguns SGBDs tambm possvel se utilizar a contrabarra (\), ou barra invertida como caractere escape para colocar aspas simples dentro da cadeia de caracteres, como exemplo: Copo d\ Agua

19
Prof. Silvio Bendini Banco de Dados II Aula 1

SQL Estrutura Lxica - Constantes do tipo cadeia de caracteres


Curiosidade: Duas constantes cadeia de caracteres separadas apenas por espao em branco com pelo menos um caractere de novalinha so concatenadas e tratadas efetivamente como se a cadeia de caracteres tivesse sido escrita em uma constante. Exemplo: SELECT foo bar; Equivale a SELECT foobar; Mas SELECT foo bar; No uma sintaxe vlida para o padro SQL.

20
Prof. Silvio Bendini Banco de Dados II Aula 1

SQL Estrutura Lxica - Constantes cadeia de caracteres ocupando mais de uma linha
Este exemplo tem por finalidade mostrar a utilizao de uma constante cadeia de caracteres ocupando mais de uma linha para inserir dados em uma tabela. No Oracle e no DB2 h necessidade do operador de concatenao ||, enquanto no SQL Server h necessidade do operador de concatenao +. S no houve necessidade do operador de concatenao no PostgreSQL. Em todos os exemplos a tabela acao foi definida como uma tabela temporria, utilizando a sintaxe especfica do gerenciador de banco de dados.
21
Prof. Silvio Bendini Banco de Dados II Aula 1

SQL Estrutura Lxica - Constantes cadeia de caracteres ocupando mais de uma linha
PostgreSQL:
CREATE TEMPORARY TABLE acao (cod_acao int, nome_acao text); INSERT INTO acao (cod_acao, nome_acao) VALUES (1, um nome de acao muito longo); SELECT * FROM acao; cod_acao | nome_acao --------------------------------------------1 | um nome de acao muito longo

22
Prof. Silvio Bendini Banco de Dados II Aula 1

SQL Estrutura Lxica - Constantes cadeia de caracteres ocupando mais de uma linha
SQL SERVER 2000:
CREATE TABLE acao (cod_acao int, nome_acao text); INSERT INTO acao (cod_acao, nome_acao) VALUES (1, um nome + de acao + muito longo); SELECT * FROM acao; cod_acao | nome_acao --------------------------------------------1 | um nome de acao muito longo

23
Prof. Silvio Bendini Banco de Dados II Aula 1

SQL Estrutura Lxica - Constantes cadeia de caracteres ocupando mais de uma linha
ORACLE 10g:
CREATE GLOBAL TEMPORARY TABLE acao (cod_acao int, nome_acao varchar2(32)); INSERT INTO acao (cod_acao, nome_acao) VALUES (1, um nome || de acao || muito longo); SELECT * FROM acao; cod_acao | nome_acao --------------------------------------------1 | um nome de acao muito longo

24
Prof. Silvio Bendini Banco de Dados II Aula 1

SQL Estrutura Lxica - Constantes cadeia de caracteres ocupando mais de uma linha
DB2 9.7:
DECLARE GLOBAL TEMPORARY TABLE acao (cod_acao int, nome_acao varchar(32)) ON COMMIT PRESERVE ROWS; INSERT INTO SESSION.acao (cod_acao, nome_acao) VALUES (1, um nome || de acao || muito longo); SELECT * FROM SESSION.acao; cod_acao | nome_acao --------------------------------------------1 | um nome de acao muito longo

25
Prof. Silvio Bendini Banco de Dados II Aula 1

SQL Estrutura Lxica Constantes do tipo cadeia de bits


Uma constante do tipo cadeia de bits se parece com uma constante do tipo cadeia de caracteres contendo a letra B (maiscula ou minscula) imediatamente antes do apstrofo de abertura (sem espaos separadores) como, por exemplo, B'1001'. Os nicos caracteres permitidos dentro de uma constante do tipo cadeia de bits so 0 e 1. Como forma alternativa, constantes do tipo cadeia de bits podem ser especificadas usando a notao hexadecimal, colocando a letra X (maiscula ou minscula) no incio como, por exemplo, X'1FF'. Esta notao equivale a uma constante do tipo cadeia de bits contendo quatro dgitos binrios para cada dgito hexadecimal. As duas formas de constantes do tipo cadeia de bits podem ocupar mais de uma linha, da mesma forma que uma constante do tipo cadeia de caracteres. A delimitao por cifro no pode ser utilizada para o tipo cadeia de bits.

26
Prof. Silvio Bendini Banco de Dados II Aula 1

SQL Estrutura Lxica Constantes numricas


So aceitas constantes numricas nas seguintes formas gerais: dgitos dgitos.[dgitos][e[+-]dgitos] [dgitos].dgitos[e[+-]dgitos] dgitos e[+-]dgitos onde dgitos so um ou mais dgitos decimais (0 a 9). Deve haver pelo menos um dgito antes ou depois do ponto decimal, se este for usado. Deve haver pelo menos um dgito aps a marca de expoente (e), caso esteja presente. No podem existir espaos ou outros caracteres incorporados constante. Deve ser observado que os sinais menos e mais que antecedem a constante no so, na verdade, considerados parte da constante, e sim um operador aplicado constante.

27
Prof. Silvio Bendini Banco de Dados II Aula 1

SQL Estrutura Lxica Constantes numricas


Abaixo so mostrados alguns exemplos de constantes numricas vlidas: 42 3.5 4. .001 5e2 1.925e-3 Uma constante numrica no contendo o ponto decimal nem o expoente presumida, inicialmente, como sendo do tipo integer, se o seu valor for apropriado para o tipo integer (32 bits); seno presumida como sendo do tipo bigint, se o seu valor for apropriado para o tipo bigint (64 bits); caso contrrio, assumida como sendo do tipo numeric. As constantes que contm pontos decimais e/ou expoentes so sempre presumidas inicialmente como sendo do tipo numeric.

28
Prof. Silvio Bendini Banco de Dados II Aula 1

SQL Estrutura Lxica Constantes numricas


O tipo de dado atribudo inicialmente para a constante numrica apenas o ponto de partida para os algoritmos de resoluo de tipo. Na maioria dos casos, a constante automaticamente convertida no tipo mais apropriado conforme o contexto. Quando for necessrio, pode-se impor que o valor numrico seja interpretado como sendo de um tipo de dado especfico, definindo a converso a ser aplicada. Por exemplo, pode-se impor que o valor numrico seja tratado como sendo do tipo real (float4) escrevendo: REAL '1.23' -- estilo cadeia de caracteres 1.23::REAL -- estilo PostgreSQL (histrico) Na verdade estes so apenas casos especiais da notao geral de converso mostrada a seguir.

29
Prof. Silvio Bendini Banco de Dados II Aula 1

SQL Estrutura Lxica Constantes de outros tipos


Pode ser declarada uma constante de tipo arbitrrio utilizando uma das seguintes notaes:
tipo 'cadeia de caracteres' 'cadeia de caracteres'::tipo CAST ( 'cadeia de caracteres' AS tipo )

um

O texto da constante cadeia de caracteres passado para a rotina de converso da entrada para o tipo chamado tipo. O resultado uma constante do tipo indicado. A converso explcita de tipo pode ser omitida caso no haja ambiguidade com relao ao tipo que a constante deva ter (por exemplo, quando atribuda diretamente para uma coluna de uma tabela), neste caso convertida automaticamente.

30
Prof. Silvio Bendini Banco de Dados II Aula 1

SQL Estrutura Lxica Constantes de outros tipos


A constante cadeia de caracteres pode ser escrita utilizando tanto a notao regular do padro SQL quanto a delimitao por cifro. Tambm possvel especificar a converso de tipo utilizando a sintaxe semelhante chamada de funo
nome_do_tipo ( 'cadeia de caracteres' )

mas nem todos os nomes de tipo podem ser usados desta forma; As sintaxes ::, CAST() e chamada de funo tambm podem ser utilizadas para especificar a converso de tipo em tempo de execuo para expresses arbitrrias. Porm, a forma tipo 'cadeia de caracteres' somente pode ser utilizada para especificar o tipo de uma constante literal. Outra restrio com relao sintaxe tipo 'cadeia de caracteres', que no funciona em tipo matriz (arrays); deve ser usado :: ou CAST() para especificar o tipo de uma constante matriz.

31
Prof. Silvio Bendini Banco de Dados II Aula 1

SQL Estrutura Lxica Operadores


Um nome de operador uma sequncia com at NAMEDATALEN-1 (por padro 63) caracteres da seguinte lista:
+ - * / < > = ~ ! @ # % ^ & | ` ?

Entretanto, existem algumas poucas restries para os nomes de operadores: No podem ocorrer as sequncias -- e /* em nenhuma posio no nome do operador, porque so consideradas incio de comentrio. Um nome de operador com vrios caracteres no pode terminar por + ou por -, a no ser que o nome tambm contenha ao menos um dos seguintes caracteres:
~ ! @ # % ^ & | ` ?

Por exemplo, @- um nome de operador permitido, mas *- no . Esta restrio permite ao SGBD analisar comandos em conformidade com o padro SQL sem requerer espaos entre os smbolos.

32
Prof. Silvio Bendini Banco de Dados II Aula 1

SQL Estrutura Lxica Operadores


Ao trabalhar com nomes de operadores fora do padro SQL, normalmente necessrio separar operadores adjacentes por espao para evitar ambiguidade. Por exemplo, se for definido um operador unrio-esquerdo chamado @, no poder ser escrito X*@Y; dever ser escrito X* @Y, para garantir que o SGBD leia dois nomes de operadores e no apenas um.

33
Prof. Silvio Bendini Banco de Dados II Aula 1

SQL Estrutura Lxica Caracteres especiais


Alguns caracteres no alfanumricos possuem significado especial diferente de ser um operador. Os detalhes da utilizao podem ser encontrados nos locais onde a sintaxe do respectivo elemento descrita. Esta seo se destina apenas a informar a existncia e fazer um resumo das finalidades destes caracteres. O caractere cifro ($) seguido por dgitos utilizado para representar parmetros posicionais no corpo da definio de uma funo ou declarao preparada. Em outros contextos, o caractere cifro pode ser parte de um identificador ou de uma constante cadeia de caracteres delimitada por cifro.

34
Prof. Silvio Bendini Banco de Dados II Aula 1

SQL Estrutura Lxica Caracteres especiais


Os parnteses (()) possuem seu significado usual de agrupar expresses e impor a precedncia. Em alguns casos, os parnteses so requeridos como parte da sintaxe fixada para um determinado comando SQL. Os colchetes ([]) so utilizados para selecionar elementos da matriz. As vrgulas (,) so utilizadas em algumas construes sintticas para separar elementos da lista. O ponto-e-vrgula (;) termina um comando SQL, no podendo aparecer em nenhum lugar dentro do comando, exceto dentro de constante cadeia ou identificador entre aspas.
35
Prof. Silvio Bendini Banco de Dados II Aula 1

SQL Estrutura Lxica Caracteres especiais


Os dois-pontos (:) so utilizados para selecionar "fatias" de matrizes. Em certos dialetos do SQL, como a linguagem SQL incorporada, os dois-pontos so utilizados como prefixo dos nomes das variveis. O asterisco (*) utilizado em alguns contextos para denotar todos os campos da linha de uma tabela ou de um valor composto. Tambm possui um significado especial quando utilizado como argumento da funo de agregao COUNT. O ponto (.) utilizado nas constantes numricas, e para separar os nomes de esquemas, tabelas e colunas.

36
Prof. Silvio Bendini Banco de Dados II Aula 1

SQL Estrutura Lxica Comentrios


Um comentrio uma sequncia arbitrria de caracteres comeando por dois hfens e prosseguindo at o fim da linha como, por exemplo:

-- Este um comentrio em conformidade com o padro SQL-92


Como alternativa, podem ser utilizados blocos de comentrios no estilo C:

/* comentrio de vrias linhas * com aninhamento: /* bloco de comentrio aninhado */ */


onde o comentrio comea por /* e se estende at encontrar a ocorrncia correspondente de */. Estes blocos de comentrios podem estar aninhados, conforme especificado no padro SQL, mas diferentemente da linguagem C, permitindo transformar em comentrio grandes blocos de cdigo contendo blocos de comentrios. Os comentrios so removidos do fluxo de entrada antes de prosseguir com a anlise sinttica, sendo substitudos por espao em branco.

37
Prof. Silvio Bendini Banco de Dados II Aula 1

SQL Estrutura Lxica Precedncia lxica


A tabela a seguir mostra a precedncia e a associatividade dos operadores no SQL. A maioria dos operadores possui a mesma precedncia e associatividade esquerda. A precedncia e a associatividade dos operadores est codificada no analisador, podendo ocasionar um comportamento contra-intuitivo; Por exemplo, os operadores booleanos < e > possuem uma precedncia diferente dos operadores booleanos <= e >=. Tambm, em alguns casos necessrio adicionar parnteses ao utilizar uma combinao de operadores unrios e binrios.
38
Prof. Silvio Bendini Banco de Dados II Aula 1

SQL Estrutura Lxica Precedncia lxica


Por exemplo: SELECT 5 ! - 6; Ser analisado como: SELECT 5 ! (- 6); porque o analisador no possui a menor idia at ser tarde demais que o ! definido como operador unrio-direito (postfix), e no um operador binrio colocado entre os operandos (infix). Neste caso, para obter o comportamento desejado deve ser escrito: SELECT (5 !) - 6; Este o preo a ser pago pela extensibilidade.

39
Prof. Silvio Bendini Banco de Dados II Aula 1

SQL Estrutura Lxica Precedncia dos operadores (decrescente)


Operador/Elemento . :: [] ^ */% +IS ISNULL NOTNULL (qualquer outro) IN BETWEEN OVERLAPS LIKE ILIKE SIMILAR <> = NOT AND OR direita direita esquerda esquerda Associatividade esquerda esquerda esquerda direita esquerda esquerda esquerda Descrio separador de nome de tabela/coluna converso de tipo estilo SQL seleo de elemento de matriz menos unrio exponenciao multiplicao, diviso, mdulo adio, subtrao IS TRUE, IS FALSE, IS UNKNOWN, IS NULL teste de nulo teste de no nulo os demais operadores nativos e os definidos pelo usurio membro de um conjunto contido em um intervalo sobreposio de intervalo de tempo correspondncia de padro em cadeia de caracteres menor que, maior que igualdade, atribuio negao lgica conjuno lgica disjuno lgica

esquerda

40
Prof. Silvio Bendini Banco de Dados II Aula 1

SQL Estrutura Lxica Precedncia dos operadores (decrescente)


Deve ser observado que as regras de precedncia dos operadores tambm se aplicam aos operadores definidos pelos usurios que possuem os mesmos nomes dos operadores nativos mencionados acima. Por exemplo, se for definido pelo usurio um operador "+" para algum tipo de dado personalizado, este ter a mesma precedncia do operador "+"nativo, no importando o que faa.

41
Prof. Silvio Bendini Banco de Dados II Aula 1

SQL Expresses de Valor


As expresses de valor so utilizadas em diversos contextos, como na lista de seleo do comando SELECT, como novos valores das colunas nos comandos INSERT e UPDATE, e na condio de procura em vrios comandos. Algumas vezes o resultado de uma expresso de valor chamado de escalar, para distingui-lo do resultado de uma expresso de tabela (que uma tabela). As expresses de valor so, portanto, chamadas tambm de expresses escalares (ou mesmo simplesmente de expresses). A sintaxe da expresso permite o clculo de valores a partir de partes primitivas utilizando operaes aritmticas, lgicas, de conjunto e outras.

42
Prof. Silvio Bendini Banco de Dados II Aula 1

SQL Expresses de Valor


A expresso de valor uma das seguintes: Um valor constante ou literal. Uma referncia a coluna. Uma referncia a parmetro posicional, no corpo da definio de funo ou de comando preparado. Uma expresso de ndice. Uma expresso de seleo de campo. Uma chamada de operador. Uma chamada de funo. Uma expresso de agregao. Uma converso de tipo. Uma subconsulta escalar. Um construtor de matriz. Um construtor de linha. Outra expresso de valor entre parnteses, til para agrupar subexpresses e mudar precedncias.

43
Prof. Silvio Bendini Banco de Dados II Aula 1

SQL Expresses de Valor


Em acrscimo a esta lista, existem diversas construes que podem ser classificadas como uma expresso, mas que no seguem qualquer regra geral de sintaxe. Possuem, normalmente, a semntica de uma funo ou de um operador. Um exemplo a clusula IS NULL.

44
Prof. Silvio Bendini Banco de Dados II Aula 1

SQL Referncias a coluna


Uma coluna pode ser referenciada usando a forma: correlao.nome_da_coluna onde correlao o nome de uma tabela (possivelmente qualificado pelo nome do esquema), ou um alias para a tabela definido por meio da clusula FROM, ou uma das palavras chave NEW ou OLD (NEW e OLD somente podem aparecer nas regras de reescrita, enquanto os outros nomes de correlao podem ser usados em qualquer declarao SQL). O nome da correlao e o ponto separador podem ser omitidos, se o nome da coluna for nico entre todas as tabelas utilizadas no comando corrente
45
Prof. Silvio Bendini Banco de Dados II Aula 1

SQL Parmetros posicionais


utilizada uma referncia a um parmetro posicional para indicar um valor fornecido externamente para um comando SQL. Os parmetros so utilizados nas definies de funes SQL e em comandos preparados. Algumas bibliotecas cliente tambm suportam a especificao de valores de dados separado da cadeia do comando SQL e, nestes casos, os parmetros so utilizados para fazer referncia a valores de dados fora de linha. A forma de fazer referncia a um parmetro : $nmero
46
Prof. Silvio Bendini Banco de Dados II Aula 1

SQL Parmetros posicionais


Por exemplo, considere a definio da funo dept como sendo
CREATE FUNCTION dept(text) RETURNS dept AS $$ SELECT * FROM dept WHERE nome = $1 $$ LANGUAGE SQL;

Neste caso, $1 ser substitudo pelo primeiro argumento da funo quando esta for chamada.

47
Prof. Silvio Bendini Banco de Dados II Aula 1

SQL ndices
Se uma expresso produzir um valor do tipo matriz, ento um elemento especfico do valor matricial pode ser extrado escrevendo: expresso[ndice] e vrios elementos adjacentes (uma "fatia da matriz") pode ser extrada escrevendo: expresso[ndice_inferior:ndice_superior] (Neste caso, os colchetes [ ] devem aparecer literalmente). Cada ndice por si s uma expresso, que deve produzir um valor inteiro.
48
Prof. Silvio Bendini Banco de Dados II Aula 1

SQL ndices
Geralmente a expresso matricial deve estar entre parnteses, mas os parnteses podem ser omitidos quando a expresso a ser indexada apenas a referncia a uma coluna ou um parmetro posicional. Podem ser concatenados vrios ndices quando a matriz original for multidimensional. Por exemplo:
minha_tabela.matriz_coluna[4] minha_tabela.matriz_duas_dim[17][34] $1[10:42] (funcao_matriz(a,b))[42]

No ltimo exemplo os parnteses so requeridos.

49
Prof. Silvio Bendini Banco de Dados II Aula 1

SQL Escolha de campo


Se uma expresso produzir um valor do tipo composto (tipo linha), ento pode-se extrair um campo especfico da linha escrevendo: expresso.nome_do_campo Geralmente a expresso de linha deve estar entre parnteses, mas os parnteses podem ser omitidos quando a expresso de seleo for apenas uma referncia a tabela ou um parmetro posicional. Por exemplo:
minha_tabela.minha_coluna $1.alguma_coluna (funcao_de_linha(a,b)).col3

(Portanto, uma referncia a coluna qualificada , na verdade, apenas um caso especial da sintaxe de seleo de campo).

50
Prof. Silvio Bendini Banco de Dados II Aula 1

SQL Chamada de operador


Existem trs sintaxes possveis para chamada de operador: expresso operador expresso (operador binrio-intermedirio) operador expresso (operador unrio-esquerdo) expresso operador (operador unrio-direito) onde o smbolo operador segue as regras de sintaxe vistas anteriormente para operadores, ou uma das palavras chave AND, OR ou NOT, ou um nome de operador qualificado na forma: OPERATOR(esquema.nome_do_operador) Quais so os operadores existentes, e se so unrios ou binrios, depende de quais operadores foram definidos pelo sistema e pelo usurio.

51
Prof. Silvio Bendini Banco de Dados II Aula 1

SQL Chamada de funo


A sintaxe para chamada de funo o nome da funo (possivelmente qualificado pelo nome do esquema), seguido por sua lista de argumentos entre parnteses: funo ([expresso [, expresso ... ]] ) Por exemplo, a funo abaixo calcula a raiz quadrada de 2: sqrt(2) A lista completa das funes nativas ser vista mais adiante. Podem ser adicionadas outras funes pelo usurio.

52
Prof. Silvio Bendini Banco de Dados II Aula 1

SQL Funes de agregao


Uma expresso de agregao representa a aplicao de uma funo de agregao nas linhas selecionadas pela consulta. Uma funo de agregao reduz vrios valores de entrada a um nico valor de sada, tal como a soma ou a mdia dos valores entrados. A sintaxe da expresso de agregao uma das seguintes: nome_da_agregao (expresso) nome_da_agregao (ALL expresso) nome_da_agregao (DISTINCT expresso) nome_da_agregao ( * ) onde nome_da_agregao uma agregao definida anteriormente (possivelmente qualificado pelo nome do esquema), e expresso qualquer expresso de valor que no contenha uma expresso de agregao.

53
Prof. Silvio Bendini Banco de Dados II Aula 1

SQL Funes de agregao


A primeira forma de expresso de agregao chama a funo de agregao para todas as linhas de entrada onde a expresso fornecida produz um valor no nulo (na verdade, deciso da funo de agregao ignorar ou no os valores nulos porm, todas as funes padro o fazem). A segunda forma idntica primeira, porque ALL o padro. A terceira forma chama a funo de agregao para todos os valores distintos no nulos da expresso, encontrados nas linhas de entrada. A ltima forma chama a funo de agregao uma vez para cada linha de entrada independentemente do valor ser nulo ou no; como nenhum valor especfico de entrada especificado, geralmente til apenas para a funo de agregao count(). Por exemplo, count(*) retorna o nmero total de linhas de entrada; count(f1) retorna o nmero de linhas de entrada onde f1 no nulo; count(distinct f1) retorna o nmero de valores distintos no nulos de f1. Podem ser adicionadas pelo usurio outras funes de agregao.

54
Prof. Silvio Bendini Banco de Dados II Aula 1

SQL Funes de agregao


Uma expresso de agregao pode aparecer apenas na lista de resultados ou na clusula HAVING do comando SELECT. Seu uso proibido nas outras clusulas, tal como WHERE, porque estas clusulas so avaliadas logicamente antes dos resultados das agregaes estarem formados. Quando uma expresso de agregao aparece em uma subconsulta, normalmente a agregao avaliada a partir das linhas da subconsulta. Porm ocorre uma exceo quando o argumento da agregao contm apenas variveis do nvel externo: a agregao ento pertence ao nvel externo mais prximo, sendo avaliada a partir das linhas desta consulta. A expresso de agregao como um todo , ento, uma referncia externa para a subconsulta onde aparece, agindo como uma constante em qualquer avaliao da subconsulta. A restrio de aparecer apenas na lista de resultados ou na clusula HAVING se aplica com respeito ao nvel da consulta que a agregao pertence.

55
Prof. Silvio Bendini Banco de Dados II Aula 1

SQL Converses de tipo


Uma converso de tipo (type cast) especifica a converso de um tipo de dado em outro. O PostgreSQL aceita duas sintaxes equivalentes para converso de tipo: CAST ( expresso AS tipo ) expresso::tipo A sintaxe CAST est em conformidade com o padro SQL; a sintaxe :: uma utilizao histrica do PostgreSQL. Quando a converso aplicada a uma expresso de valor de tipo conhecido, representa uma converso em tempo de execuo. A converso ser bem sucedida apenas se estiver disponvel uma operao de converso de tipo adequada. Deve ser observado que isto sutilmente diferente da utilizao de converso com constantes. Uma converso aplicada a um literal cadeia de caracteres sem adornos representa a atribuio inicial do tipo ao valor constante literal e, portanto, ser bem-sucedida para qualquer tipo (se o contedo do literal cadeia de caracteres possuir uma sintaxe vlida para servir de entrada para o tipo de dado).

56
Prof. Silvio Bendini Banco de Dados II Aula 1

SQL Converses de tipo


Geralmente a converso explcita de tipo pode ser omitida quando no h ambiguidade em relao ao tipo que a expresso de valor deve produzir (por exemplo, quando atribuda a uma coluna de tabela); o sistema aplica automaticamente a converso de tipo nestes casos. Entretanto, a converso automtica de tipo feita apenas para as converses marcadas nos catlogos do sistema como "OK para aplicar implicitamente". As outras converses devem ser chamadas por meio da sintaxe de converso explcita. Esta restrio tem por finalidade impedir que aconteam converses surpreendentes aplicadas em silncio. Tambm possvel especificar uma converso de tipo utilizando a sintaxe na forma de funo: nome_do_tipo ( expresso )

57
Prof. Silvio Bendini Banco de Dados II Aula 1

SQL Converses de tipo


Entretanto, somente funciona para os tipos cujos nomes tambm so vlidos como nome de funo. Por exemplo, double precision no pode ser utilizado desta maneira, mas a forma equivalente float8 pode. Tambm, os nomes interval, time e timestamp somente podem ser utilizados desta maneira se estiverem entre aspas, devido a conflitos sintticos. Portanto, o uso da sintaxe de converso na forma de funo pode ocasionar inconsistncias, devendo ser evitada em novos aplicativos. (A sintaxe tipo chamada de funo , de fato, apenas uma chamada de funo. Quando utilizada uma das duas sintaxes padro de converso para fazer converso em tempo de execuo, internamente chama a funo registrada para realizar esta converso. Por conveno, estas funes de converso possuem o mesmo nome de seu tipo de dado de sada e, portanto, a "sintaxe tipo funo" no nada mais do que a chamada direta funo de converso subjacente. Como bvio, isto no algo que um aplicativo portvel possa depender).

58
Prof. Silvio Bendini Banco de Dados II Aula 1

SQL Subconsultas escalares


Uma subconsulta escalar um comando SELECT comum, entre parnteses, que retorna exatamente uma linha com uma coluna. O comando SELECT executado e o nico valor retornado utilizado na expresso de valor envoltria. errado utilizar uma consulta que retorne mais de uma linha ou mais de uma coluna como subconsulta escalar (porm, se durante uma determinada execuo a subconsulta no retornar nenhuma linha, no acontece nenhum erro: o resultado escalar assumido como nulo). A subconsulta pode fazer referncia a variveis da consulta envoltria, as quais atuam como constantes durante a avaliao da subconsulta.

59
Prof. Silvio Bendini Banco de Dados II Aula 1

SQL Subconsultas escalares


Por exemplo, a consulta abaixo retorna a maior populao de cidade de cada estado: SELECT nome, (SELECT max(populacao) FROM cidades WHERE cidades.estado = estados.nome) FROM estados;

60
Prof. Silvio Bendini Banco de Dados II Aula 1

SQL Construtores de matriz


Um construtor de matriz uma expresso que constri um valor matriz a partir dos valores de seus elementos membros. Um construtor de matriz simples composto pela palavra chave ARRAY, um abre colchetes [, uma ou mais expresses (separadas por vrgula) para os valores dos elementos da matriz e, finalmente, um fecha colchetes ]. Por exemplo:
SELECT ARRAY[1,2,3+4]; array --------{1,2,7} (1 linha)

O tipo de dado do elemento da matriz o tipo comum das expresses membro, determinado utilizando as mesmas regras das construes UNION e CASE.

61
Prof. Silvio Bendini Banco de Dados II Aula 1

SQL Construtores de matriz


Os valores matriz multidimensional podem ser construdos aninhando construtores de matriz. Nos construtores internos, a palavra chave ARRAY pode ser omitida. Por exemplo, estes dois comandos produzem o mesmo resultado:
SELECT ARRAY[ARRAY[1,2], ARRAY[3,4]]; array --------------{{1,2},{3,4}} SELECT ARRAY[[1,2],[3,4]]; array --------------{{1,2},{3,4}}

62
Prof. Silvio Bendini Banco de Dados II Aula 1

SQL Construtores de matriz


Uma vez que as matrizes multidimensionais devem ser retangulares, os construtores internos no mesmo nvel devem produzir submatrizes com dimenses idnticas. Os elementos construtores de matriz multidimensional podem ser qualquer coisa que produza uma matriz do tipo apropriado, e no apenas uma construo sub-ARRAY. Por exemplo:
CREATE TABLE arr(f1 int[], f2 int[]); INSERT INTO arr VALUES (ARRAY[[1,2],[3,4]], ARRAY[[5,6],[7,8]]); SELECT ARRAY[f1, f2, '{{9,10},{11,12}}'::int[]] FROM arr; array -----------------------------------------------{{{1,2},{3,4}},{{5,6},{7,8}},{{9,10},{11,12}}} ( 1 linha)

63
Prof. Silvio Bendini Banco de Dados II Aula 1

SQL Construtores de matriz


Tambm possvel construir uma matriz a partir do resultado de uma subconsulta. Nesta forma, o construtor de matriz escrito com a palavra chave ARRAY seguida por uma subconsulta entre parnteses, e no entre colchetes. Por exemplo:
SELECT ARRAY(SELECT 'bytea%'); oid FROM pg_proc WHERE proname LIKE

?column? -----------------------------------------------------------{2011,1954,1948,1952,1951,1244,1950,2005,1949,1953,2006,31} (1 linha)

64
Prof. Silvio Bendini Banco de Dados II Aula 1

SQL Construtores de matriz


A subconsulta deve retornar uma nica coluna. A matriz unidimensional produzida ter um elemento para cada linha no resultado da subconsulta, com o tipo do elemento correspondendo ao da coluna de sada da subconsulta. O ndice de um valor da matriz construdo com ARRAY sempre comea por um.

65
Prof. Silvio Bendini Banco de Dados II Aula 1

SQL Regras para avaliao de expresso


Quando for essencial obrigar a ordem de avaliao, pode ser utilizada uma construo CASE. Por exemplo, esta uma forma no confivel para tentar evitar uma diviso por zero na clusula WHERE: SELECT ... WHERE x <> 0 AND y/x > 1.5; Mas esta forma segura: SELECT ... WHERE CASE WHEN x <> 0 THEN y/x > 1.5 ELSE false END; A construo CASE utilizada desta forma impede as tentativas de otimizao devendo, portanto, ser utilizada apenas quando for necessrio (Neste exemplo em particular, sem dvida seria melhor evitar o problema escrevendo y > 1.5*x).

66
Prof. Silvio Bendini Banco de Dados II Aula 1

DDL Data Definition Language


Definio de dados: Esta parte do SQL mostra como criar as estruturas de banco de dados que armazenam os dados. Nos bancos de dados relacionais os dados so armazenados em tabelas, por isso a maior parte deste captulo dedica-se a explicar como as tabelas so criadas e modificadas, e as funcionalidades disponveis para controlar que dados podem ser armazenados nas tabelas. Em seguida mostrado como as tabelas podem ser organizadas em esquemas.
67
Prof. Silvio Bendini Banco de Dados II Aula 1

Noes bsicas de tabelas


Uma tabela em um banco de dados relacional muito semelhante a uma tabela no papel: formada por linhas e colunas. O nmero e a ordem das colunas so fixos, e cada coluna possui um nome. O nmero de linhas varivel, refletindo a quantidade de dados armazenados em um determinado instante. O padro SQL no d nenhuma garantia sobre a ordem das linhas na tabela. Quando a tabela lida, as linhas aparecem em uma ordem aleatria, a no ser que a classificao seja requisitada explicitamente. Alm disso, o SQL no atribui identificadores nicos para as linhas e, portanto, possvel existirem vrias linhas totalmente idnticas na tabela. Isto uma consequncia do modelo matemtico subjacente ao SQL, mas geralmente no desejvel.

68
Prof. Silvio Bendini Banco de Dados II Aula 1

Noes bsicas de tabelas


Cada coluna possui um tipo de dado. O tipo de dado restringe o conjunto de valores que podem ser atribudos coluna e atribui semntica aos dados armazenados na coluna, de forma que estes possam ser processados. Por exemplo, uma coluna declarada como sendo de um tipo numrico no aceita cadeias de caracteres com texto arbitrrio, e os dados armazenados nesta coluna podem ser utilizados para efetuar clculos matemticos. Ao contrrio, uma coluna declarada como sendo do tipo cadeia de caracteres aceita praticamente qualquer espcie de dado, mas no pode ser usada para efetuar clculos matemticos, embora possam ser efetuadas outras operaes, como a concatenao de cadeias de caracteres.

69
Prof. Silvio Bendini Banco de Dados II Aula 1

Noes bsicas de tabelas


Os SGBDs, em geral, possuem um extenso conjunto de tipos de dado nativos, adequados para muitos aplicativos. Os usurios tambm podem definir seus prprios tipos de dado. A maioria dos tipos de dado nativos possui nome e semntica bvia, portanto uma explicao detalhada ser postergada. Alguns dos tipos de dado mais utilizados so o integer para nmeros inteiros, numeric para nmeros possivelmente fracionrios, text ou char para cadeias de caracteres, date para datas, time para valores da hora do dia, e timestamp para valores contendo tanto data quanto hora.
70
Prof. Silvio Bendini Banco de Dados II Aula 1

Noes bsicas de tabelas


Para criar uma tabela utiliza-se o comando CREATE TABLE. Neste comando so especificados, ao menos, o nome da nova tabela, os nomes das colunas, e o tipo de dado de cada coluna. Por exemplo: CREATE TABLE minha_primeira_tabela ( primeira_coluna text, segunda_coluna integer );
71
Prof. Silvio Bendini Banco de Dados II Aula 1

Noes bsicas de tabelas


Este comando cria a tabela chamada minha_primeira_tabela contendo duas colunas. A primeira coluna chama-se primeira_coluna, e possui o tipo de dado text; A segunda coluna chama-se segunda_coluna, e possui o tipo de dado integer. O nome da tabela e das colunas obedecem a sintaxe para identificadores que ser explicada mais a frente. Normalmente os nomes dos tipos tambm so identificadores, mas existem algumas excees. Deve ser observado que a lista de colunas envolta por parnteses, e os elementos da lista so separados por vrgula.

72
Prof. Silvio Bendini Banco de Dados II Aula 1

Noes bsicas de tabelas


Obviamente, o exemplo anterior muito artificial. Normalmente so dados nomes para as tabelas e para as colunas condizentes com as informaes armazenadas. Sendo assim, vejamos um exemplo mais prximo da realidade: CREATE TABLE produtos ( cod_prod integer, nome text, preco numeric ); (O tipo numeric pode armazenar a parte fracionria, comum em valores monetrios)
73
Prof. Silvio Bendini Banco de Dados II Aula 1

Noes bsicas de tabelas


Dica: Quando so criadas muitas tabelas inter-relacionadas, aconselhvel escolher um padro de nomes consistente para as tabelas e colunas. Por exemplo, existe a possibilidade de utilizar nomes de tabelas no singular ou no plural, e cada uma destas possibilidades defendida por um terico ou por outro. Existe um limite de quantas colunas uma tabela pode conter. Dependendo dos tipos das colunas, pode ser entre 250 e 1600, dependendo ainda do SGBD utilizado. Entretanto, definir uma tabela com esta quantidade de colunas muito raro e, geralmente, torna o projeto questionvel.

74
Prof. Silvio Bendini Banco de Dados II Aula 1

Noes bsicas de tabelas


Se uma tabela no for mais necessria, poder ser removida utilizando o comando DROP TABLE. Por exemplo: DROP TABLE minha_primeira_tabela; DROP TABLE produtos; Tentar remover uma tabela no existente um erro. Entretanto, comum os arquivos de script SQL tentarem remover a tabela incondicionalmente antes de cri-la, ignorando a mensagem de erro. Utilizando as ferramentas mostradas at este ponto possvel criar tabelas totalmente funcionais.

75
Prof. Silvio Bendini Banco de Dados II Aula 1

DDL Valor Padro


Pode ser atribudo um valor padro a uma coluna. Quando criada uma nova linha, e no especificado nenhum valor para algumas de suas colunas, estas colunas so preenchidas com o valor padro de cada uma delas. Alm disso, um comando de manipulao de dados pode requerer explicitamente que a coluna receba o seu valor padro, sem saber qual este. Se no for declarado explicitamente nenhum valor padro, o valor nulo ser o valor padro. Isto geralmente faz sentido, porque o valor nulo pode ser considerado como representando um dado desconhecido.
76
Prof. Silvio Bendini Banco de Dados II Aula 1

DDL Valor Padro


Na definio da tabela, o valor padro posicionado aps o tipo de dado da coluna. Por exemplo: CREATE TABLE produtos ( cod_prod integer PRIMARY KEY, nome text, preco numeric DEFAULT 9.99 );
77
Prof. Silvio Bendini Banco de Dados II Aula 1

DDL Valor Padro


O valor padro pode ser uma expresso, avaliada sempre que for inserido o valor padro (e no quando a tabela criada). Um exemplo comum uma coluna do tipo timestamp com o valor padro now(), para que receba a data e hora de insero da linha. Outro exemplo comum a gerao de um "nmero serial" para cada linha, tambm conhecido como campo autonumerao ou auto-incremento. CREATE TABLE produtos ( cod_prod integer PRIMARY KEY AUTO_INCREMENT); CREATE TABLE produtos ( cod_prod integer DEFAULT nextval('produtos_cod_prod_seq'), ... );
78
Prof. Silvio Bendini Banco de Dados II Aula 1

DDL Restries
Os tipos de dado so uma forma de limitar os dados que podem ser armazenados na tabela. Entretanto, para muitos aplicativos a restrio obtida no possui o refinamento necessrio. Por exemplo, uma coluna contendo preos de produtos provavelmente s pode aceitar valores positivos, mas no existe nenhum tipo de dado que aceite apenas nmeros positivos. Um outro problema que pode ser necessrio restringir os dados de uma coluna com relao a outras colunas ou linhas. Por exemplo, em uma tabela contendo informaes sobre produtos deve haver apenas uma linha para cada cdigo de produto. Para esta finalidade, a linguagem SQL permite definir restries em colunas e tabelas. As restries permitem o nvel de controle sobre os dados da tabela que for desejado. Se o usurio tentar armazenar dados em uma coluna da tabela violando a restrio, ocorrer um erro. Isto se aplica at quando o erro originado pela definio do valor padro.

79
Prof. Silvio Bendini Banco de Dados II Aula 1

DDL Restries de verificao


Uma restrio de verificao o tipo mais genrico de restrio. Permite especificar que os valores de uma determinada coluna devem estar de acordo com uma expresso booleana (valor-verdade). Por exemplo, para permitir apenas preos com valores positivos utiliza-se: CREATE TABLE produtos ( cod_prod integer, nome text, preco numeric CHECK (preco > 0) );

80
Prof. Silvio Bendini Banco de Dados II Aula 1

DDL Restries de verificao


Como pode ser observado, a definio da restrio vem aps o tipo de dado, assim como a definio do valor padro. O valor padro e a restrio podem estar em qualquer ordem. A restrio de verificao formada pela palavra chave CHECK seguida por uma expresso entre parnteses. A expresso da restrio de verificao deve envolver a coluna sendo restringida, seno no far muito sentido. Tambm pode ser atribudo um nome individual para a restrio. Isto torna mais clara a mensagem de erro, e permite fazer referncia restrio quando se desejar alter-la.
81
Prof. Silvio Bendini Banco de Dados II Aula 1

DDL Restries de verificao


A sintaxe :
CREATE TABLE produtos ( cod_prod integer, nome text, preco numeric CONSTRAINT CHECK (preco > 0) );

chk_preco_positivo

Portanto, para especificar o nome da restrio deve ser utilizada a palavra chave CONSTRAINT, seguida por um identificador, seguido por sua vez pela definio da restrio (Se no for escolhido o nome da restrio desta maneira, o sistema escolher um nome para a restrio).

82
Prof. Silvio Bendini Banco de Dados II Aula 1

DDL Restries de verificao


Uma restrio de verificao tambm pode referenciar vrias colunas. Supondo que sero armazenados o preo normal e o preo com desconto, e que se deseje garantir que o preo com desconto seja menor que o preo normal: CREATE TABLE produtos ( cod_prod integer, nome text, preco numeric CHECK (preco > 0), preco_com_desconto numeric CHECK (preco_com_desconto > 0), CHECK (preco > preco_com_desconto) );

83
Prof. Silvio Bendini Banco de Dados II Aula 1

DDL Restries de verificao


As duas primeiras formas de restrio j devem ser familiares. A terceira utiliza uma nova sintaxe, e no est anexada a uma coluna em particular. Em vez disso, aparece como um item parte na lista de colunas separadas por vrgula. As definies das colunas e as definies destas restries podem estar em qualquer ordem. Dizemos que as duas primeiras restries so restries de coluna, enquanto a terceira uma restrio de tabela, porque est escrita separado das definies de colunas. As restries de coluna tambm podem ser escritas como restries de tabela, enquanto o contrrio nem sempre possvel, porque supostamente a restrio de coluna somente faz referncia coluna em que est anexada.

84
Prof. Silvio Bendini Banco de Dados II Aula 1

DDL Restries de verificao


O exemplo anterior tambm pode ser escrito do seguinte modo: CREATE TABLE produtos ( cod_prod integer, nome text, preco numeric, CHECK (preco > 0), preco_com_desconto numeric, CHECK (preco_com_desconto > 0), CHECK (preco > preco_com_desconto) );

85
Prof. Silvio Bendini Banco de Dados II Aula 1

DDL Restries de verificao


Ou ainda: CREATE TABLE produtos ( cod_prod integer, nome text, preco numeric CHECK (preco > 0), preco_com_desconto numeric, CHECK (preco_com_desconto > 0 AND preco > preco_com_desconto) ); Questo de gosto.
86
Prof. Silvio Bendini Banco de Dados II Aula 1

DDL Restries de verificao


Podem ser atribudos nomes para as restries de tabela da mesma maneira que para as restries de coluna: CREATE TABLE produtos ( cod_prod integer, nome text, preco numeric, CHECK (preco > 0), preco_com_desconto numeric, CHECK (preco_com_desconto > 0), CONSTRAINT chk_desconto_valido CHECK (preco > preco_com_desconto) );

87
Prof. Silvio Bendini Banco de Dados II Aula 1

DDL Restries de verificao


Deve ser observado que a restrio de verificao est satisfeita se o resultado da expresso de verificao for verdade ou o valor nulo. Como a maioria das expresses retorna o valor nulo quando um dos operandos nulo, estas expresses no impedem a presena de valores nulos nas colunas com restrio. Para garantir que a coluna no contm o valor nulo, deve ser utilizada a restrio de no nulo descrita a seguir.

88
Prof. Silvio Bendini Banco de Dados II Aula 1

DDL Restries de no-nulo


Uma restrio de no-nulo simplesmente especifica que uma coluna no pode assumir o valor nulo. Um exemplo da sintaxe: CREATE TABLE produtos ( cod_prod integer NOT NULL, nome text NOT NULL, preco numeric ); A restrio de no-nulo sempre escrita como restrio de coluna. A restrio de no-nulo funcionalmente equivalente a criar uma restrio de verificao CHECK (nome_da_coluna IS NOT NULL. A desvantagem que no pode ser dado um nome explcito para uma restrio de no nulo criada deste modo.

89
Prof. Silvio Bendini Banco de Dados II Aula 1

DDL Restries de no-nulo


Obviamente, uma coluna pode possuir mais de uma restrio, bastando apenas escrever uma restrio em seguida da outra: CREATE TABLE produtos ( cod_prod integer NOT NULL, nome text NOT NULL, preco numeric NOT NULL CHECK (preco > 0) ); A ordem das restries no importa, porque no determina, necessariamente, a ordem de verificao das restries.

90
Prof. Silvio Bendini Banco de Dados II Aula 1

DDL Restries de no-nulo


A restrio NOT NULL possui uma inversa: a restrio NULL. Isto no significa que a coluna deva ser nula, o que com certeza no tem utilidade. Em vez disto simplesmente definido o comportamento padro dizendo que a coluna pode ser nula. A restrio NULL no definida no padro SQL, no devendo ser utilizada em aplicativos portveis. Porm, alguns usurios gostam porque torna fcil inverter a restrio no script de comandos.

91
Prof. Silvio Bendini Banco de Dados II Aula 1

DDL Restries de no-nulo


Por exemplo, possvel comear com: CREATE TABLE produtos ( cod_prod integer NULL, nome text NULL, preco numeric NULL ); e depois colocar a palavra chave NOT onde se desejar. Dica: Na maioria dos projetos de banco de dados, a maioria das colunas deve ser especificada como no-nula.

92
Prof. Silvio Bendini Banco de Dados II Aula 1

DDL Restries de unicidade


A restrio de unicidade garante que os dados contidos na coluna, ou no grupo de colunas, nico em relao a todas as outras linhas da tabela. A sintaxe : CREATE TABLE produtos ( cod_prod integer UNIQUE, nome text, preco numeric );
93

quando escrita como restrio de coluna


Prof. Silvio Bendini Banco de Dados II Aula 1

DDL Restries de unicidade


Quando escrita como restrio de tabela: CREATE TABLE produtos ( cod_prod integer, nome text, preco numeric, UNIQUE (cod_prod) );
94
Prof. Silvio Bendini Banco de Dados II Aula 1

DDL Restries de unicidade


Se uma restrio de unicidade fizer referncia a um grupo de colunas, as colunas devero ser listadas separadas por vrgula:

CREATE TABLE exemplo ( a integer, b integer, c integer, UNIQUE (a, c) );


Isto especifica que a combinao dos valores das colunas indicadas deve ser nico para toda a tabela, embora no seja necessrio que cada uma das colunas seja nica (o que geralmente no ).
95
Prof. Silvio Bendini Banco de Dados II Aula 1

DDL Restries de unicidade


Tambm possvel atribuir nomes s restries de unicidade: CREATE TABLE produtos ( cod_prod integer unq_cod_prod UNIQUE, nome text, preco numeric );

CONSTRAINT

96
Prof. Silvio Bendini Banco de Dados II Aula 1

DDL Restries de unicidade


De um modo geral, uma restrio de unicidade violada quando existem duas ou mais linhas na tabela onde os valores de todas as colunas includas na restrio so iguais. Entretanto, os valores nulos no so considerados iguais nesta comparao. Isto significa que, mesmo na presena da restrio de unicidade, possvel armazenar um nmero ilimitado de linhas que contenham o valor nulo em pelo menos uma das colunas da restrio. Este comportamento est em conformidade com o padro SQL, mas nem todos os SGBDS seguem esta regra. Portanto, seja cauteloso ao desenvolver aplicativos onde se pretenda haver portabilidade.

97
Prof. Silvio Bendini Banco de Dados II Aula 1

DDL Chaves primrias


Tecnicamente a restrio de chave primria simplesmente a combinao da restrio de unicidade com a restrio de nonulo. Portanto, as duas definies de tabela abaixo aceitam os mesmos dados: CREATE TABLE produtos ( cod_prod integer UNIQUE NOT NULL, nome text, preco numeric ); CREATE TABLE produtos ( cod_prod integer PRIMARY KEY, nome text, preco numeric );

98
Prof. Silvio Bendini Banco de Dados II Aula 1

DDL Chaves primrias


As chaves primrias tambm podem restringir mais de uma coluna; a sintaxe semelhante da restrio de unicidade: CREATE TABLE exemplo ( a integer, b integer, c integer, PRIMARY KEY (a, c) );
99
Prof. Silvio Bendini Banco de Dados II Aula 1

DDL Chaves primrias


A chave primria indica que a coluna, ou grupo de colunas, pode ser utilizada como identificador nico das linhas da tabela (Isto uma consequncia direta da definio da chave primria. Deve ser observado que a restrio de unicidade no fornece, por si s, um identificador nico, porque no exclui os valores nulos). A chave primria til tanto para fins de documentao quanto para os aplicativos cliente. Por exemplo, um aplicativo contendo uma Interface de Usurio Grfica (GUI), que permite modificar os valores das linhas, provavelmente necessita conhecer a chave primria da tabela para poder identificar as linhas de forma nica. Uma tabela pode ter no mximo uma chave primria (embora possa ter muitas restries de unicidade e de no-nulo). A teoria de banco de dados relacional dita que toda tabela deve ter uma chave primria. Esta regra no imposta pelo SQL, mas normalmente melhor segui-la.

100
Prof. Silvio Bendini Banco de Dados II Aula 1

DDL Chaves estrangeiras


A restrio de chave estrangeira especifica que o valor da coluna (ou grupo de colunas) deve corresponder a algum valor existente em uma linha de outra tabela. Diz-se que a chave estrangeira mantm a integridade referencial entre duas tabelas relacionadas. Supondo que j temos a tabela de produtos utilizada diversas vezes anteriormente: CREATE TABLE produtos ( cod_prod integer PRIMARY KEY, nome text, preco numeric );

101
Prof. Silvio Bendini Banco de Dados II Aula 1

DDL Chaves estrangeiras


Agora vamos assumir a existncia de uma tabela armazenando os pedidos destes produtos. Desejamos garantir que a tabela de pedidos contenha somente pedidos de produtos que realmente existem. Para isso definida uma restrio de chave estrangeira na tabela de pedidos fazendo referncia tabela de produtos: CREATE TABLE pedidos ( cod_pedido integer PRIMARY KEY, cod_prod integer REFERENCES produtos (cod_prod), quantidade integer );

102
Prof. Silvio Bendini Banco de Dados II Aula 1

DDL Chaves estrangeiras


Isto torna impossvel criar um pedido com cod_prod no existente na tabela de produtos. Nesta situao dito que a tabela de pedidos a tabela que faz referncia, e a tabela de produtos a tabela referenciada. Da mesma forma existem colunas fazendo referncia e sendo referenciadas. O comando acima pode ser abreviado escrevendo
CREATE TABLE pedidos ( cod_pedido integer PRIMARY KEY, cod_prod integer REFERENCES produtos, quantidade integer );

porque, na ausncia da lista de colunas, a chave primria da tabela referenciada usada como a coluna referenciada.

103
Prof. Silvio Bendini Banco de Dados II Aula 1

DDL Chaves estrangeiras


A chave estrangeira tambm pode restringir e referenciar um grupo de colunas. Como usual, necessrio ser escrito na forma de restrio de tabela. Abaixo est mostrado um exemplo artificial da sintaxe:
CREATE TABLE t1 ( a integer PRIMARY KEY, b integer, c integer, FOREIGN KEY (b, c) REFERENCES outra_tabela (c1, c2) );

Obviamente, o nmero e tipo das colunas na restrio devem corresponder ao nmero e tipo das colunas referenciadas. Pode ser atribudo um nome restrio de chave estrangeira da forma habitual.

104
Prof. Silvio Bendini Banco de Dados II Aula 1

DDL Chaves estrangeiras


Uma tabela pode conter mais de uma restrio de chave estrangeira, o que utilizado para implementar relacionamentos muitos-para-muitos entre tabelas. Digamos que existam as tabelas de produtos e de pedidos, e desejamos permitir que um pedido posa conter vrios produtos (o que no permitido na estrutura anterior). Podemos, ento, utilizar a seguinte estrutura de tabela:
CREATE TABLE produtos ( cod_prod integer PRIMARY KEY, nome text, preco numeric ); CREATE TABLE pedidos ( cod_pedido integer PRIMARY KEY, endereco_entrega text, ... ); CREATE TABLE itens_pedidos ( cod_prod integer REFERENCES produtos, cod_pedido integer REFERENCES pedidos, quantidade integer, PRIMARY KEY (cod_prod, cod_pedido) );

105
Prof. Silvio Bendini Banco de Dados II Aula 1

DDL Chaves estrangeiras


Deve ser observado, tambm, que a chave primria est sobreposta s chaves estrangeiras na ltima tabela. Sabemos que a chave estrangeira no permite a criao de pedidos no relacionados com algum produto. Porm, o que acontece se um produto for removido aps a criao de um pedido fazendo referncia a este produto? A linguagem SQL permite tratar esta situao tambm. Intuitivamente temos algumas opes: No permitir a excluso de um produto referenciado Excluir o pedido tambm Algo mais?
106
Prof. Silvio Bendini Banco de Dados II Aula 1

DDL Chaves estrangeiras


Para ilustrar esta situao, vamos implementar a seguinte poltica no exemplo de relacionamento muitos-para-muitos acima: Quando se desejar remover um produto referenciado por um pedido (atravs de itens_pedidos), isto no ser permitido. Se um pedido for removido, os itens do pedido tambm sero removidos.
CREATE TABLE produtos ( cod_prod integer PRIMARY KEY, nome text, preco numeric ); CREATE TABLE pedidos ( cod_pedido integer PRIMARY KEY, endereco_entrega text, ... ); CREATE TABLE itens_pedidos ( cod_prod integer REFERENCES produtos ON DELETE RESTRICT, cod_pedido integer REFERENCES pedidos ON DELETE CASCADE, quantidade integer, PRIMARY KEY (cod_prod, cod_pedido) );

107
Prof. Silvio Bendini Banco de Dados II Aula 1

DDL Chaves estrangeiras


As duas opes mais comuns so restringir, ou excluir em cascata. RESTRICT no permite excluir a linha referenciada. NO ACTION significa que, se as linhas referenciadas ainda existirem quando a restrio for verificada, ser gerado um erro; este o comportamento padro se nada for especificado (A diferena essencial entre estas duas opes que NO ACTION permite postergar a verificao para mais tarde na transao, enquanto RESTRICT no permite). CASCADE especifica que, quando a linha referenciada excluda, as linhas que fazem referncia tambm devem ser excludas automaticamente.

108
Prof. Silvio Bendini Banco de Dados II Aula 1

DDL Chaves estrangeiras


Existem outras duas opes: SET NULL e SET DEFAULT. Estas opes fazem com que as colunas que fazem referncia sejam definidas como nulo ou com o valor padro, respectivamente, quando a linha referenciada excluda. Deve ser observado que isto no evita a observncia das restries. Por exemplo, se uma ao especificar SET DEFAULT, mas o valor padro no satisfizer a chave estrangeira, a operao no ser bem-sucedida. Semelhante a ON DELETE existe tambm ON UPDATE, chamada quando uma coluna referenciada alterada (atualizada). As aes possveis so as mesmas.

109
Prof. Silvio Bendini Banco de Dados II Aula 1

DDL Chaves estrangeiras


Para terminar, devemos mencionar que a chave estrangeira deve referenciar colunas de uma chave primria ou de uma restrio de unicidade. Se a chave estrangeira fizer referncia a uma restrio de unicidade, existem algumas possibilidades adicionais sobre como os valores nulos sero correspondidos. Esta parte est explicada na documentao de referncia para CREATE TABLE.

110
Prof. Silvio Bendini Banco de Dados II Aula 1

DDL Modificao de tabelas


Quando percebemos, aps a tabela ser criada, que foi cometido um erro ou que os requisitos do aplicativo mudaram, possvel remover a tabela e cri-la novamente. Porm, esta opo no conveniente quando existem dados na tabela, ou se a tabela referenciada por outros objetos do banco de dados (por exemplo, uma restrio de chave estrangeira); Por isso, a SQL disponibiliza um conjunto de comandos para realizar modificaes em tabelas existentes. Deve ser observado que esta operao conceitualmente distinta da alterao (atualizao) dos dados contidos na tabela, aqui o interesse est em mudar a definio, ou estrutura, da tabela.

111
Prof. Silvio Bendini Banco de Dados II Aula 1

DDL Modificao de tabelas


possvel: Adicionar coluna; Remover coluna; Adicionar restrio; Remover restrio; Mudar valor padro; Mudar tipo de dado de coluna; Mudar nome de coluna; Mudar nome de tabela. Todas estas atividades so realizadas utilizando o comando ALTER TABLE.
112
Prof. Silvio Bendini Banco de Dados II Aula 1

DDL Adicionar coluna


Para adicionar uma coluna, utiliza-se:
ALTER TABLE produtos ADD COLUMN descricao text;

Inicialmente a nova coluna preenchida com o valor padro especificado, ou nulo se a clusula DEFAULT no for especificada. Tambm podem ser definidas, ao mesmo tempo, restries para a coluna utilizando a sintaxe habitual:
ALTER TABLE produtos ADD CHECK (descricao <> ''); COLUMN descricao text

113
Prof. Silvio Bendini Banco de Dados II Aula 1

DDL Adicionar coluna


Na verdade, todas as opes que podem ser aplicadas descrio da coluna no comando CREATE TABLE podem ser utilizadas aqui. Entretanto, tenha em mente que o valor padro deve satisfazer as restries especificadas, ou o ADD no ser bemsucedido. Como alternativa, as restries podem ser adicionadas posteriormente, aps a nova coluna ter sido preenchida com dados adequados.

114
Prof. Silvio Bendini Banco de Dados II Aula 1

DDL Remover coluna


Para remover uma coluna, utiliza-se:
ALTER TABLE produtos DROP COLUMN descricao;

Os dados presentes na coluna desaparecem. As restries de tabela que envolvem a coluna tambm so removidas. Entretanto, se a coluna for referenciada por uma restrio de chave estrangeira de outra tabela, o SGBD no ir remover esta restrio em silncio. Pode ser autorizada a remoo de tudo que depende da coluna adicionando CASCADE:
ALTER TABLE CASCADE; produtos DROP COLUMN descricao 115
Prof. Silvio Bendini Banco de Dados II Aula 1

DDL Adicionar restrio


utilizada a sintaxe de restrio de tabela para adicionar uma restrio. Por exemplo:
ALTER TABLE produtos ADD CHECK (nome <> ''); ALTER TABLE produtos ADD CONSTRAINT unq_cod_prod UNIQUE (cod_prod); ALTER TABLE produtos ADD FOREIGN KEY (fk_grupo_produtos) REFERENCES grupo_produtos;

116
Prof. Silvio Bendini Banco de Dados II Aula 1

DDL Adicionar restrio


Para adicionar a restrio de no nulo, que no pode ser escrita na forma de restrio de tabela, deve ser utilizada a sintaxe:
ALTER TABLE produtos ALTER COLUMN cod_prod SET NOT NULL;

A restrio ser verificada imediatamente, portanto os dados da tabela devem satisfazer a restrio para esta poder ser adicionada.

117
Prof. Silvio Bendini Banco de Dados II Aula 1

DDL Remover restrio


Para remover uma restrio necessrio conhecer seu nome. Se foi atribudo um nome restrio fica fcil, caso contrrio ser necessrio descobrir o nome gerado que sistema atribuiu restrio. O comando para inspecionar os detalhes das tabelas (como describe nome_tabela, por exemplo), depende do SGBD utilizado. O comando utilizado para remover restrio :
ALTER TABLE produtos nome_da_restrio; DROP CONSTRAINT

(Caso esteja lidando com um nome de restrio gerado, como $2, no se esquea de colocar entre aspas para torn-lo um identificador vlido).

118
Prof. Silvio Bendini Banco de Dados II Aula 1

DDL Remover restrio


Da mesma forma que para remover uma coluna, necessrio adicionar CASCADE se for desejado remover uma restrio que outro objeto dependa. Um exemplo a restrio de chave estrangeira, que depende da restrio de unicidade ou de chave primria nas colunas referenciadas. Esta sintaxe serve igualmente para todos os tipos de restrio, exceto no-nulo. Para remover uma restrio de no-nulo, utiliza-se:
ALTER TABLE produtos ALTER COLUMN cod_prod DROP NOT NULL;

(Lembre-se que as restries de no-nulo no possuem nome)

119
Prof. Silvio Bendini Banco de Dados II Aula 1

DDL Mudar valor padro da coluna


Para definir um novo valor padro para a coluna, utiliza-se:
ALTER TABLE produtos DEFAULT 7.77; ALTER COLUMN preco SET

Deve ser observado que este comando no afeta nenhuma coluna existente na tabela, apenas muda o valor padro para os prximos comandos INSERT. Para remover o valor padro para a coluna, utiliza-se:
ALTER TABLE DEFAULT; produtos ALTER COLUMN preco DROP

Efetivamente o mesmo que definir o valor nulo como sendo o valor padro. Como consequncia, no errado remover um valor padro que no tenha sido definido, porque implicitamente o valor nulo o valor padro.

120
Prof. Silvio Bendini Banco de Dados II Aula 1

DDL Mudar o tipo de dado da coluna


Para converter a coluna em um tipo de dado diferente, utiliza-se:
ALTER TABLE numeric(10,2); produtos ALTER COLUMN preco TYPE

Este comando somente ser bem-sucedido se todas as entradas existentes na coluna puderem ser convertidas para o novo tipo atravs de uma converso implcita. Se for necessria uma converso mais complexa, poder ser adicionada a clusula USING especificando como calcular os novos valores a partir dos antigos. O SGBD tenta converter o valor padro da coluna (se houver) para o novo tipo, assim bem como todas as restries que envolvem a coluna. Mas estas converses podem falhar, ou podem produzir resultados surpreendentes. Geralmente melhor remover todas as restries da coluna antes de alterar o seu tipo, e depois adicionar novamente estas restries modificadas de forma apropriada.

121
Prof. Silvio Bendini Banco de Dados II Aula 1

DDL Mudar nome de coluna


Para mudar o nome de uma coluna, utiliza-se:
ALTER TABLE produtos cod_produto; RENAME COLUMN cod_prod TO

122
Prof. Silvio Bendini Banco de Dados II Aula 1

DDL Mudar nome de tabela


Para mudar o nome de uma tabela, utiliza-se:
ALTER TABLE produtos RENAME TO equipamentos;

123
Prof. Silvio Bendini Banco de Dados II Aula 1

DDL Outros objetos de banco de dados


As tabelas so os objetos centrais da estrutura de um banco de dados relacional, porque armazenam os dados, mas no so os nicos objetos que existem no banco de dados. Podem ser criados vrios objetos de outros tipos, para tornar o uso e o gerenciamento dos dados mais eficiente, ou mais conveniente. Estes outros objetos no so mostrados neste captulo, mas so listados abaixo para que se tome conhecimento do que possvel criar. Vises Funes e operadores Tipos de dado e domnios Gatilhos e regras de reescrita

124
Prof. Silvio Bendini Banco de Dados II Aula 1

DDL Acompanhando as dependncias


Ao se criar uma estrutura de banco de dados complexa, envolvendo muitas tabelas com restries de chave estrangeira, vises, gatilhos, funes, etc., cria-se, implicitamente, uma rede de dependncias entre os objetos. Por exemplo, uma tabela com uma restrio de chave estrangeira depende da tabela referenciada. Para garantir a integridade de toda a estrutura do banco de dados, o SGBD no permite remover um objeto quando h objetos que dependem do mesmo.

125
Prof. Silvio Bendini Banco de Dados II Aula 1

DDL Acompanhando as dependncias


Por exemplo, tentar remover a tabela produtos, onde a tabela pedidos depende dela, produz uma mensagem de erro como esta:
DROP TABLE produtos; NOTA: a restrio pedidos_cod_prod_fkey na tabela pedidos depende da tabela produtos ERRO: no foi possvel remover a tabela produtos porque outros objetos dependem da mesma DICA: Use DROP ... CASCADE para remover os objetos dependentes tambm.

126
Prof. Silvio Bendini Banco de Dados II Aula 1

DDL Acompanhando as dependncias


A mensagem de erro mostra uma dica til: Se no tem importncia remover todos os objetos dependentes, ento poder ser executado
DROP TABLE produtos CASCADE;

e todos os objetos dependentes sero removidos. Neste caso no ser removida a tabela pedidos, ser removida apenas a restrio de chave estrangeira (caso se deseje verificar o que DROP ... CASCADE far, deve ser executado o comando DROP sem o CASCADE, e lidas as NOTAs, ou NOTICE em ingls).
127
Prof. Silvio Bendini Banco de Dados II Aula 1

DDL Acompanhando as dependncias


Todos os comandos de remoo do SQL permitem especificar CASCADE. Obviamente, a natureza das dependncias possveis varia conforme o tipo do objeto. Pode ser escrito RESTRICT em vez de CASCADE, para obter o comportamento padro que impedir a remoo do objeto quando existem objetos que dependem do mesmo. Nota: De acordo com o padro SQL obrigatrio especificar RESTRICT ou CASCADE. Nenhum banco de dados obriga seguir esta regra, mas tornar RESTRICT ou CASCADE o comportamento padro varia entre sistemas.
128
Prof. Silvio Bendini Banco de Dados II Aula 1

DML Data Manipulation Language


A DML Data Manipulation Language a parte do SQL responsvel pela manipulao dos dados em tabelas. A partir desta seo iremos aprender como manipular dados em tabelas, atravs da insero, atualizao e excluso.

129
Prof. Silvio Bendini Banco de Dados II Aula 1

DML Insero de dados


A tabela recm-criada no contm dados. A primeira ao a ser realizada para o banco de dados ter utilidade inserir dados. Conceitualmente, os dados so inseridos uma linha de cada vez. claro que possvel inserir mais de uma linha, mas no existe maneira de inserir menos de uma linha por vez ( claro!). Mesmo que se conhea apenas o valor de algumas colunas, deve ser criada uma linha completa.
130
Prof. Silvio Bendini Banco de Dados II Aula 1

DML Insero de dados


Para criar uma linha utilizado o comando INSERT. Este comando requer o nome da tabela e um valor para cada coluna da tabela. Por exemplo, considere a tabela produtos criada anteriormente:
CREATE TABLE produtos text, preco numeric ); ( cod_prod integer, nome

Um exemplo de comando para inserir uma linha :


INSERT INTO produtos VALUES (1, 'Queijo', 9.99);

131
Prof. Silvio Bendini Banco de Dados II Aula 1

DML Insero de dados


Os valores dos dados so colocados na mesma ordem que as colunas se encontram na tabela, separados por vrgula. Geralmente os valores dos dados so literais (constantes), mas tambm so permitidas expresses escalares. A sintaxe mostrada acima tem como desvantagem ser necessrio conhecer a ordem das colunas da tabela. Para evitar isto, as colunas podem ser relacionadas explicitamente. Por exemplo, os dois comandos mostrados abaixo possuem o mesmo efeito do comando mostrado acima:
INSERT INTO produtos (cod_prod, nome, preco) VALUES (1, 'Queijo', 9.99); INSERT INTO produtos (nome, preco, cod_prod) VALUES ('Queijo', 9.99, 1); 132
Prof. Silvio Bendini Banco de Dados II Aula 1

DML Insero de dados


Muitos usurios consideram boa prtica escrever sempre os nomes das colunas. Se no forem conhecidos os valores de todas as colunas, as colunas com valor desconhecido podem ser omitidas. Neste caso, estas colunas so preenchidas com seu respectivo valor padro. Por exemplo:
INSERT INTO produtos (cod_prod, nome) VALUES (1, 'Queijo'); INSERT INTO produtos VALUES (1, 'Queijo');

133
Prof. Silvio Bendini Banco de Dados II Aula 1

DML Atualizao de dados


A modificao dos dados armazenados no banco de dados referida como atualizao. Pode ser atualizada uma linha, todas as linhas, ou um subconjunto das linhas da tabela. Uma coluna pode ser atualizada separadamente; as outras colunas no so afetadas. Para realizar uma atualizao so necessrias trs informaes: O nome da tabela e da coluna a ser atualizada; O novo valor para a coluna; Quais linhas sero atualizadas.
134
Prof. Silvio Bendini Banco de Dados II Aula 1

DML Atualizao de dados


Lembre-se que foi dito anteriormente que o SQL, de uma maneira geral, no fornece um identificador nico para as linhas. Portanto, no necessariamente possvel especificar diretamente a linha a ser atualizada. Em vez disso, devem ser especificadas as condies que a linha deve atender para ser atualizada. Somente havendo uma chave primria na tabela (no importando se foi declarada ou no), possvel enderear uma linha especfica com confiana, escolhendo uma condio correspondendo chave primria. Ferramentas grficas de acesso a banco de dados dependem da chave primria para poderem atualizar as linhas individualmente.

135
Prof. Silvio Bendini Banco de Dados II Aula 1

DML Atualizao de dados


Por exemplo, o comando mostrado abaixo atualiza todos os produtos com preo igual a 5, mudando estes preos para 10:
UPDATE produtos SET preco = 10 WHERE preco = 5;

Este comando pode atualizar nenhuma, uma, ou muitas linhas. No errado tentar uma atualizao que no corresponda a nenhuma linha. Vejamos este comando em detalhe: Primeiro aparece a palavra chave UPDATE seguida pelo nome da tabela. Como usual, o nome da tabela pode ser qualificado pelo esquema, seno procurado no caminho. Depois aparece a palavra chave SET, seguida pelo nome da coluna, por um sinal de igual, e pelo novo valor da coluna. O novo valor da coluna pode ser qualquer expresso escalar, e no apenas uma constante.

136
Prof. Silvio Bendini Banco de Dados II Aula 1

DML Atualizao de dados


Por exemplo, se for desejado aumentar o preo de todos os produtos em 10% pode ser utilizado:
UPDATE produtos SET preco = preco * 1.10;

Como pode ser visto, a expresso para obter o novo valor pode fazer referncia ao valor antigo. Tambm foi deixada de fora a clusula WHERE. Quando esta clusula omitida, significa que todas as linhas da tabela sero atualizadas e, quando est presente, somente as linhas que atendem condio desta clusula sero atualizadas. Deve ser observado que o sinal de igual na clusula SET uma atribuio, enquanto o sinal de igual na clusula WHERE uma comparao, mas isto no cria uma ambiguidade. Obviamente, a condio da clusula WHERE no necessariamente um teste de igualdade, esto disponveis vrios outros operadores, mas a expresso deve produzir um resultado booleano.

137
Prof. Silvio Bendini Banco de Dados II Aula 1

DML Atualizao de dados


Tambm pode ser atualizada mais de uma coluna pelo comando UPDATE, colocando mais de uma atribuio na clusula SET. Por exemplo:
UPDATE minha_tabela SET a = 5, b = 3, c = 1 WHERE a > 0;

138
Prof. Silvio Bendini Banco de Dados II Aula 1

DML Excluso de dados


At aqui foi mostrado como adicionar dados a tabelas, e como modificar estes dados. Est faltando mostrar como remover os dados que no so mais necessrios. Assim como s possvel adicionar dados para toda uma linha, uma linha tambm s pode ser removida por inteiro da tabela. Na seo anterior foi explicado que o SQL no fornece uma maneira para enderear diretamente uma determinada linha. Portanto, a remoo das linhas s pode ser feita especificando as condies que as linhas a serem removidas devem atender. Havendo uma chave primria na tabela, ento possvel especificar exatamente a linha. Mas tambm pode ser removido um grupo de linhas atendendo a uma determinada condio, ou podem ser removidas todas as linhas da tabela de uma s vez.

139
Prof. Silvio Bendini Banco de Dados II Aula 1

DML Excluso de dados


utilizado o comando DELETE para remover linhas; a sintaxe deste comando muito semelhante a do comando UPDATE. Por exemplo, para remover todas as linhas da tabela produtos possuindo preo igual a 10:
DELETE FROM produtos WHERE preco = 10;

Se for escrito simplesmente


DELETE FROM produtos;

ento todas as linhas da tabela sero excludas! Cuidado! Isso pode salvar (ou acabar...) com a sua vida profissional...

140
Prof. Silvio Bendini Banco de Dados II Aula 1

Consultas
Os captulos anteriores explicaram como criar tabelas, como preench-las com dados, e como manipular estes dados. Agora, finalmente, mostrado como trazer estes dados para fora do banco de dados.

141
Prof. Silvio Bendini Banco de Dados II Aula 1

Consultas Viso Geral


O processo de trazer, ou o comando para trazer os dados armazenados no banco de dados, chamado de consulta. No SQL, o comando SELECT utilizado para especificar consultas. A sintaxe geral do comando SELECT :
SELECT lista_de_seleo FROM [especificao_da_ordenao] expresso_de_tabela

As prximas sees descrevem em detalhes a lista de seleo, a expresso de tabela, e a especificao da ordenao. O tipo mais simples de consulta possui a forma:
SELECT * FROM tabela1; 142
Prof. Silvio Bendini Banco de Dados II Aula 1

Consultas Viso Geral


Supondo existir uma tabela chamada tabela1, este comando traz todas as linhas e todas as colunas da tabela1. A forma de trazer depende do aplicativo cliente. Por exemplo, o aplicativo psql (PostgreSQL) exibe uma tabela ASCII formatada na tela, enquanto as bibliotecas cliente disponibilizam funes para extrair valores individuais do resultado da consulta. A especificao da lista de seleo * significa todas as colunas que a expresso de tabela possa fornecer. A lista de seleo tambm pode selecionar um subconjunto das colunas disponveis, ou efetuar clculos utilizando as colunas.

143
Prof. Silvio Bendini Banco de Dados II Aula 1

Consultas Viso Geral


Por exemplo, se a tabela1 possuir colunas chamadas a, b e c (e talvez outras), poder ser feita a seguinte consulta:
SELECT a, b + c FROM tabela1;

(Supondo que b e c possuem um tipo de dado numrico). FROM tabela1 um tipo particularmente simples de expresso de tabela: l apenas uma nica tabela. De uma forma geral, as expresses de tabela podem ser construes complexas contendo tabelas base, junes e subconsultas.

144
Prof. Silvio Bendini Banco de Dados II Aula 1

Consultas Viso Geral


Mas a expresso de tabela pode ser totalmente omitida, quando se deseja utilizar o comando SELECT como uma calculadora:
SELECT 3 * 4;

mais til quando as expresses da lista de seleo retornam resultados variveis. Por exemplo, uma funo pode ser chamada deste modo:
SELECT random();

145
Prof. Silvio Bendini Banco de Dados II Aula 1

Consultas Expresses de tabela


Uma expresso de tabela computa uma tabela. A expresso de tabela contm a clusula FROM seguida, opcionalmente, pelas clusulas WHERE, GROUP BY e HAVING. As expresses de tabela triviais fazem, simplesmente, referncia as to faladas tabelas em disco, chamadas de tabelas base, mas podem ser utilizadas expresses mais complexas para modificar ou combinar tabelas base de vrias maneiras. As clusulas opcionais WHERE, GROUP BY e HAVING, da expresso de tabela, especificam um processo de transformaes sucessivas realizadas na tabela produzida pela clusula FROM. Todas estas transformaes produzem uma tabela virtual que fornece as linhas passadas para a lista de seleo, para ento serem computadas as linhas de sada da consulta.

146
Prof. Silvio Bendini Banco de Dados II Aula 1

Consultas Expresses de tabela Clusula FROM


A clusula FROM deriva uma tabela a partir de uma ou mais tabelas especificadas na lista, separada por vrgulas, de referncias a tabela.
FROM referncia_a_tabela [, referncia_a_tabela [, ...]]

Uma referncia a tabela pode ser um nome de tabela (possivelmente qualificado pelo esquema) ou uma tabela derivada, como uma subconsulta, uma juno de tabelas ou, ainda, uma combinao complexa destas. Se for listada mais de uma referncia a tabela na clusula FROM, feita uma juno cruzada (cross-join) para formar a tabela virtual intermediria que poder, ento, estar sujeita s transformaes das clusulas WHERE, GROUP BY e HAVING, gerando o resultado final de toda a expresso de tabela. Quando uma referncia a tabela especifica uma tabela ancestral em uma hierarquia de herana de tabelas, a referncia a tabela no produz linhas apenas desta tabela, mas inclui as linhas de todas as tabelas descendentes, a no ser que a palavra chave ONLY preceda o nome da tabela. Entretanto, esta referncia produz apenas as colunas existentes na tabela especificada so ignoradas todas as colunas adicionadas s tabelas descendentes.

147
Prof. Silvio Bendini Banco de Dados II Aula 1

Consultas Alias de tabela e coluna


Pode ser dado um nome temporrio s tabelas, e s referncias a tabela complexas, para ser usado nas referncias tabela derivada no restante do comando. Isto chamado de alias (apelido) de tabela. Para criar um alias de tabela, escreve-se:
FROM referncia_a_tabela AS alias OU FROM referncia_a_tabela alias

A palavra chave AS opcional. O alias pode ser qualquer identificador.


148
Prof. Silvio Bendini Banco de Dados II Aula 1

Consultas Alias de tabela e coluna


Uma utilizao tpica de alias de tabela para atribuir identificadores curtos a nomes de tabelas longos, para manter a clusula de juno legvel. Por exemplo:
SELECT * FROM um_nome_muito_comprido u outro_nome_muito_comprido o ON u.id = o.num; JOIN

O alias se torna o novo nome da referncia tabela na consulta corrente no mais possvel fazer referncia tabela pelo seu nome original.

149
Prof. Silvio Bendini Banco de Dados II Aula 1

Consultas Alias de tabela e coluna


Portanto,
SELECT * FROM minha_tabela.a > 5; minha_tabela AS m WHERE

no uma sintaxe SQL vlida. O que acontece de verdade que uma referncia a tabela implcita adicionada clusula FROM. Portanto, a consulta processada como se tivesse sido escrita assim:
SELECT * FROM minha_tabela AS m, minha_tabela AS minha_tabela WHERE minha_tabela.a > 5;

resultando em uma juno cruzada, que geralmente no o que se deseja.

150
Prof. Silvio Bendini Banco de Dados II Aula 1

Consultas Alias de tabela e coluna


Os aliases de tabela servem principalmente como uma notao conveniente, mas sua utilizao necessria para fazer a juno de uma tabela consigo mesma. Por exemplo:
SELECT * FROM minha_tabela minha_tabela AS b ... AS a CROSS JOIN

Alm disso, um alis requerido se a referncia a tabela for uma subconsulta. Os parnteses so utilizados para resolver ambiguidades.

151
Prof. Silvio Bendini Banco de Dados II Aula 1

Consultas Alias de tabela e coluna


A declarao abaixo atribui o alis b ao resultado da juno, diferentemente do exemplo anterior:
SELECT * FROM (minha_tabela minha_tabela) AS b ... AS a CROSS JOIN

Uma outra forma de alis de tabela especifica nomes temporrios para as colunas da tabela, assim como para a mesma:
FROM referncia_a_tabela [AS] alias ( coluna1 [, coluna2 [, ...]] )

Se for especificado um nmero de aliases de coluna menor que o nmero de colunas da tabela, as demais colunas no tero o nome mudado. Esta sintaxe especialmente til em autojunes e subconsultas.

152
Prof. Silvio Bendini Banco de Dados II Aula 1

Consultas Alias de tabela e coluna


Quando um alis aplicado sada da clusula JOIN, utilizando qualquer uma destas formas, o alis esconde o nome original dentro do JOIN. Por exemplo:
SELECT a.* FROM minha_tabela AS a JOIN sua_tabela AS b ON ...

um comando SQL vlido, mas:


SELECT a.* FROM (minha_tabela AS a JOIN sua_tabela AS b ON ...) AS c

no vlido: o alis de tabela a no visvel fora do alis c.

153
Prof. Silvio Bendini Banco de Dados II Aula 1

Consultas Subconsultas
Subconsultas especificando uma tabela derivada devem estar entre parnteses, e devem ter um nome de alis de tabela atribudo. Por exemplo:
FROM (SELECT * FROM tabela1) AS nome_alias

Este exemplo equivale a FROM tabela1 AS nome_alias. Casos mais interessantes, que no podem ser reduzidos a junes simples, ocorrem quando a subconsulta envolve agrupamento ou agregao.
154
Prof. Silvio Bendini Banco de Dados II Aula 1

Consultas Clusula WHERE


A sintaxe da clusula WHERE :
WHERE condio_de_pesquisa

onde a condio_de_pesquisa qualquer expresso de valor que retorne um valor do tipo boolean. Aps o processamento da clusula FROM ter sido feito, cada linha da tabela virtual derivada verificada com relao condio de pesquisa. Se o resultado da condio for verdade, a linha mantida na tabela de sada, seno (ou seja, se o resultado for falso ou nulo) a linha desprezada. Normalmente a condio de pesquisa faz referncia a pelo menos uma coluna da tabela gerada pela clusula FROM; embora isto no seja requerido, se no for assim a clusula WHERE no ter utilidade.

155
Prof. Silvio Bendini Banco de Dados II Aula 1

Consultas Clusula WHERE


Nota: A condio de juno de uma juno interna pode ser escrita tanto na clusula WHERE quanto na clusula JOIN. Por exemplo, estas duas expresses de tabela so equivalentes:
FROM a, b WHERE a.id = b.id AND b.val > 5

E
FROM a INNER JOIN b ON (a.id = b.id) WHERE b.val > 5 OU TALVEZ AT MESMO FROM a NATURAL JOIN b WHERE b.val > 5

156
Prof. Silvio Bendini Banco de Dados II Aula 1

Consultas Clusula WHERE


Qual destas formas deve ser utilizada principalmente uma questo de estilo. A sintaxe do JOIN na clusula FROM provavelmente no muito portvel para outros sistemas gerenciadores de banco de dados SQL. Para as junes externas no existe escolha em nenhum caso: devem ser feitas na clusula FROM. A clusula ON/USING da juno externa no equivalente condio WHERE, porque determina a adio de linhas (para as linhas de entrada sem correspondncia) assim como a remoo de linhas do resultado final.
157
Prof. Silvio Bendini Banco de Dados II Aula 1

Consultas Clusula WHERE


Abaixo esto mostrados alguns exemplos de clusulas WHERE:
SELECT ... FROM fdt WHERE c1 > 5 SELECT ... FROM fdt WHERE c1 IN (1, 2, 3) SELECT ... FROM fdt WHERE c1 IN (SELECT c1 FROM t2) SELECT ... FROM fdt WHERE c1 IN (SELECT c3 FROM t2 WHERE c2 = fdt.c1 + 10) SELECT ... FROM fdt WHERE c1 BETWEEN (SELECT c3 FROM t2 WHERE c2 = fdt.c1 + 10) AND 100 SELECT ... FROM fdt WHERE EXISTS (SELECT c1 FROM t2 WHERE c2 > fdt.c1)

158
Prof. Silvio Bendini Banco de Dados II Aula 1

Consultas Clusula WHERE


Sendo que fdt a tabela derivada da clusula FROM.
As linhas que no aderem condio de pesquisa da clusula WHERE so eliminadas de fdt. Deve ser observada a utilizao de subconsultas escalares como expresses de valor. Assim como qualquer outra consulta, as subconsultas podem utilizar expresses de tabela complexas. Deve ser observado, tambm, como fdt referenciada nas subconsultas. A qualificao de c1 como fdt.c1 somente ser necessria se c1 tambm for o nome de uma coluna na tabela de entrada derivada da subconsulta. Entretanto, a qualificao do nome da coluna torna mais clara a consulta, mesmo quando no necessria. Este exemplo mostra como o escopo do nome da coluna de uma consulta externa se estende s suas consultas internas.

159
Prof. Silvio Bendini Banco de Dados II Aula 1

Consultas Clusulas GROUP BY e HAVING


Aps passar pelo filtro WHERE, a tabela de entrada derivada pode estar sujeita ao agrupamento, utilizando a clusula GROUP BY, e eliminao de grupos de linhas, utilizando a clusula HAVING.
SELECT lista_de_seleo FROM ... [WHERE ...] GROUP BY referncia_a_coluna_de_agrupamento referncia_a_coluna_de_agrupamento]...

[,

160
Prof. Silvio Bendini Banco de Dados II Aula 1

Consultas Clusulas GROUP BY e HAVING


A clusula GROUP BY utilizada para agrupar linhas da tabela que compartilham os mesmos valores em todas as colunas da lista. Em que ordem as colunas so listadas no faz diferena. O efeito combinar cada conjunto de linhas que compartilham valores comuns em uma linha de grupo que representa todas as linhas do grupo. Isto feito para eliminar redundncia na sada, e/ou para calcular agregaes aplicveis a estes grupos.

161
Prof. Silvio Bendini Banco de Dados II Aula 1

Consultas Clusulas GROUP BY e HAVING


Por exemplo:
=> SELECT * FROM teste1; x | y ---+--a | 3 c | 2 b | 5 a | 1 (4 linhas) => SELECT x FROM teste1 GROUP BY x; x --a b c (3 linhas)

162
Prof. Silvio Bendini Banco de Dados II Aula 1

Consultas Clusulas GROUP BY e HAVING


Na segunda consulta no poderia ser escrito SELECT * FROM teste1 GROUP BY x, porque no existe um valor nico da coluna y que poderia ser associado com cada grupo. As colunas agrupadas podem ser referenciadas na lista de seleo, desde que possuam um valor nico em cada grupo.

163
Prof. Silvio Bendini Banco de Dados II Aula 1

Consultas Clusulas GROUP BY e HAVING


De modo geral, se uma tabela for agrupada as colunas que no so usadas nos agrupamentos no podem ser referenciadas, exceto nas expresses de agregao. Um exemplo de expresso de agregao :
=> SELECT x, sum(y) FROM teste1 GROUP BY x; x | sum ---+----a | 4 b | 5 c | 2 (3 linhas)

Aqui sum() a funo de agregao que calcula um valor nico para o grupo todo.

164
Prof. Silvio Bendini Banco de Dados II Aula 1

Consultas Clusulas GROUP BY e HAVING


Dica: Um agrupamento sem expresso de agregao computa, efetivamente, o conjunto de valores distintas na coluna. Tambm poderia ser obtido por meio da clusula DISTINCT Abaixo est mostrado um outro exemplo: clculo do total das vendas de cada produto (e no o total das vendas de todos os produtos).
SELECT cod_prod, p.nome, (sum(v.unidades) * p.preco) AS vendas FROM produtos p LEFT JOIN vendas v USING (cod_prod) GROUP BY cod_prod, p.nome, p.preco; 165
Prof. Silvio Bendini Banco de Dados II Aula 1

Consultas Clusulas GROUP BY e HAVING


Neste exemplo, as colunas cod_prod, p.nome e p.preco devem estar na clusula GROUP BY, porque so referenciadas na lista de seleo da consulta (dependendo da forma exata como a tabela produtos for definida, as colunas nome e preo podem ser totalmente dependentes da coluna cod_prod, tornando os agrupamentos adicionais teoricamente desnecessrios, mas isto ainda no est implementado). A coluna v.unidades no precisa estar na lista do GROUP BY, porque usada apenas na expresso de agregao (sum(...)), que representa as vendas do produto. Para cada produto, a consulta retorna uma linha sumarizando todas as vendas do produto.

166
Prof. Silvio Bendini Banco de Dados II Aula 1

Consultas Clusulas GROUP BY e HAVING


No SQL estrito, a clusula GROUP BY somente pode agrupar pelas colunas da tabela de origem. O agrupamento por expresses de valor, em vez de nomes simples de colunas, tambm permitido. Se uma tabela for agrupada utilizando a clusula GROUP BY, mas houver interesse em alguns grupos apenas, pode ser utilizada a clusula HAVING, de forma parecida com a clusula WHERE, para eliminar grupos da tabela agrupada. A sintaxe :
SELECT lista_de_seleo FROM ... [WHERE ...] GROUP BY ... HAVING expresso_booleana 167
Prof. Silvio Bendini Banco de Dados II Aula 1

Consultas Clusulas GROUP BY e HAVING


As expresses na clusula HAVING podem fazer referncia tanto a expresses agrupadas quanto a no agrupadas (as quais necessariamente envolvem uma funo de agregao). Exemplo:
=> SELECT x, sum(y) FROM teste1 GROUP BY x HAVING sum(y) > 3; x | sum ---+----a | 4 b | 5 (2 linhas) => SELECT x, sum(y) FROM teste1 GROUP BY x HAVING x < 'c'; x | sum ---+----a | 4 b | 5 (2 linhas)

168
Prof. Silvio Bendini Banco de Dados II Aula 1

Consultas Clusulas GROUP BY e HAVING


Agora vamos fazer um exemplo mais prximo da realidade:
SELECT cod_prod, p.nome, (sum(v.unidades) * (p.preco - p.custo)) AS lucro FROM produtos p LEFT JOIN vendas v USING (cod_prod) WHERE v.data > CURRENT_DATE - INTERVAL '4 weeks' GROUP BY cod_prod, p.nome, p.preco, p.custo HAVING sum(p.preco * v.unidades) > 5000;

No exemplo acima, a clusula WHERE est selecionando linhas por uma coluna que no agrupada (a expresso somente verdadeira para as vendas feitas nas quatro ltimas semanas, enquanto a clusula HAVING restringe a sada aos grupos com um total de vendas brutas acima de 5000. Deve ser observado que as expresses de agregao no precisam ser necessariamente as mesmas em todas as partes da consulta.

169
Prof. Silvio Bendini Banco de Dados II Aula 1

Utilizao de HAVING sem GROUP BY no SELECT


O exemplo abaixo mostra a utilizao da clusula HAVING sem a clusula GROUP BY no comando SELECT. criada a tabela produtos e so inseridas cinco linhas. Quando a clusula HAVING exige a presena de mais de cinco linhas na tabela, a consulta no retorna nenhuma linha.

170
Prof. Silvio Bendini Banco de Dados II Aula 1

Utilizao de HAVING sem GROUP BY no SELECT


=> create global temporary table produtos(codigo int, valor float); => insert into produtos values (1, 102); => insert into produtos values (2, 104); => insert into produtos values (3, 202); => insert into produtos values (4, 203); => insert into produtos values (5, 204); => select avg(valor) from produtos; avg ----163 (1 linha) => select avg(valor) from produtos having count(*)>=5; avg ----163 (1 linha) => select avg(valor) from produtos having count(*)=5; avg ----163 (1 linha) => select avg(valor) from produtos having count(*)>5; avg ----(0 linhas)

171
Prof. Silvio Bendini Banco de Dados II Aula 1

Utilizao da expresso CASE para agrupar valores


A expresso CASE pode fazer parte da lista de agrupamento. Este exemplo usa a expresso CASE para agrupar as notas dos alunos em conceitos, e calcular a nota mnima, mxima e mdia, alm da quantidade de notas, correspondente a cada conceito. A seguir est mostrado o script utilizado:

172
Prof. Silvio Bendini Banco de Dados II Aula 1

Utilizao da expresso CASE para agrupar valores


CREATE TABLE notas ( nota decimal(4,2) CONSTRAINT chknota CHECK (nota BETWEEN 0.00 AND 10.00)); INSERT INTO notas VALUES(10);INSERT INTO notas VALUES(9.2); INSERT INTO notas VALUES(9.0);INSERT INTO notas VALUES(8.3); INSERT INTO notas VALUES(7.7);INSERT INTO notas VALUES(7.4); INSERT INTO notas VALUES(6.4);INSERT INTO notas VALUES(5.8); INSERT INTO notas VALUES(5.1);INSERT INTO notas VALUES(5.0); INSERT INTO notas VALUES(0); SELECT CASE WHEN nota < 3 THEN 'E' WHEN nota < 5 THEN 'D' WHEN nota < 7 THEN 'C' WHEN nota < 9 THEN 'B' ELSE 'A' END AS conceito, COUNT(*) AS quantidade, MIN(nota) AS menor, MAX(nota) AS maior, AVG(nota) AS media FROM notas GROUP BY CASE WHEN nota < 3 THEN 'E' WHEN nota < 5 THEN 'D' WHEN nota < 7 THEN 'C' WHEN nota < 9 THEN 'B' ELSE 'A' END ORDER BY conceito;

173
Prof. Silvio Bendini Banco de Dados II Aula 1

Utilizao da expresso CASE para agrupar valores


A seguir esto mostrados os resultados obtidos:
conceito | quantidade | menor | maior | media ----------+------------+-------+-------+-----------------------A | 3 | 9.00 | 10.00 | 9.4000000000000000 B | 3 | 7.40 | 8.30 | 7.8000000000000000 C | 4 | 5.00 | 6.40 | 5.5750000000000000 E | 1 | 0.00 | 0.00 | 0.00000000000000000000 (4 linhas)

174
Prof. Silvio Bendini Banco de Dados II Aula 1

Utilizao da expresso CASE em chamada de funo


A expresso CASE pode ser usada como argumento de chamada de funo. Este exemplo usa a expresso CASE como argumento da funo COUNT, passando o valor 1 quando a nota corresponde ao conceito, e nulo quando no corresponde. Desta forma, a funo COUNT conta a quantidade de notas presentes em cada conceito, uma vez que os valores nulos no so contados. Os dados so os mesmos do exemplo anterior. A seguir est mostrada a consulta utilizada:
175
Prof. Silvio Bendini Banco de Dados II Aula 1

Utilizao da expresso CASE em chamada de funo


SELECT COUNT(CASE NULL END) AS A, COUNT(CASE NULL END) AS B, COUNT(CASE NULL END) AS C, COUNT(CASE NULL END) AS D, COUNT(CASE NULL END) AS E FROM notas; WHEN nota BETWEEN 9.00 AND 10.00 THEN 1 ELSE WHEN nota BETWEEN 7.00 AND WHEN nota BETWEEN 5.00 AND WHEN nota BETWEEN 3.00 AND WHEN nota BETWEEN 0.00 AND 8.99 THEN 1 ELSE 6.99 THEN 1 ELSE 4.99 THEN 1 ELSE 2.99 THEN 1 ELSE

176
Prof. Silvio Bendini Banco de Dados II Aula 1

Utilizao da expresso CASE em chamada de funo


A seguir esto mostrados os resultados obtidos:
a | b | c | d | e ---+---+---+---+--3 | 3 | 4 | 0 | 1 (1 linha)

Desta forma, foi mostrado em uma linha o mesmo resultado da coluna quantidade do exemplo anterior.

177
Prof. Silvio Bendini Banco de Dados II Aula 1

Combinao de informao agrupada e no agrupada


Os comandos SELECT que retornam apenas uma linha podem ser utilizados para combinar informaes agrupadas com informaes no agrupadas na mesma consulta. Neste exemplo cada nota mostrada junto com a menor nota, a maior nota, e a mdia de todas as notas. Os dados so os mesmos dos dois exemplos anteriores. Abaixo est mostrada a consulta utilizada:
SELECT nota, (SELECT MIN(nota) FROM notas) AS menor, (SELECT MAX(nota) FROM notas) AS maior, (SELECT AVG(nota) FROM notas) AS media FROM notas;

178
Prof. Silvio Bendini Banco de Dados II Aula 1

Combinao de informao agrupada e no agrupada


A seguir esto mostrados os resultados obtidos:
nota | menor | maior | media -------+-------+-------+-------------------10.00 | 0.00 | 10.00 | 6.7181818181818182 9.20 | 0.00 | 10.00 | 6.7181818181818182 9.00 | 0.00 | 10.00 | 6.7181818181818182 8.30 | 0.00 | 10.00 | 6.7181818181818182 7.70 | 0.00 | 10.00 | 6.7181818181818182 7.40 | 0.00 | 10.00 | 6.7181818181818182 6.40 | 0.00 | 10.00 | 6.7181818181818182 5.80 | 0.00 | 10.00 | 6.7181818181818182 5.10 | 0.00 | 10.00 | 6.7181818181818182 5.00 | 0.00 | 10.00 | 6.7181818181818182 0.00 | 0.00 | 10.00 | 6.7181818181818182 (11 linhas)

179
Prof. Silvio Bendini Banco de Dados II Aula 1

Consultas Listas de Seleo


Conforme foi mostrado na seo anterior, a expresso de tabela do comando SELECT constri uma tabela virtual intermediria, possivelmente por meio da combinao de tabelas, vises, eliminao de linhas, agrupamento, etc. Esta tabela finalmente passada adiante para ser processada pela lista de seleo. A lista de seleo determina quais colunas da tabela intermediria vo realmente para a sada.

180
Prof. Silvio Bendini Banco de Dados II Aula 1

Itens da Lista de Seleo


O tipo mais simples de lista de seleo o *, que emite todas as colunas produzidas pela expresso de tabela. De outra forma, a lista de seleo uma lista separada por vrgulas de expresses de valor. Por exemplo, esta pode ser uma lista de nomes de colunas:
SELECT a, b, c FROM ...

Os nomes das colunas a, b e c podem ser os nomes verdadeiros das colunas das tabelas referenciadas na clusula FROM, ou aliases dados a estas colunas. O espao de nomes disponvel na lista de seleo o mesmo da clusula WHERE, a no ser que seja utilizado agrupamento e, neste caso, passa a ser o mesmo da clusula HAVING.

181
Prof. Silvio Bendini Banco de Dados II Aula 1

Itens da Lista de Seleo


Quando mais de uma tabela possui uma coluna com o mesmo nome, o nome da tabela deve ser fornecido tambm, como em:
SELECT tbl1.a, tbl2.a, tbl1.b FROM ...

Ao se trabalhar com vrias tabelas, tambm pode ser til solicitar todas as colunas de uma determinada tabela:
SELECT tbl1.*, tbl2.a FROM ...

Se for utilizada uma expresso de valor arbitrria na lista de seleo, esta expresso adiciona, conceitualmente, uma nova coluna virtual tabela retornada. A expresso de valor avaliada uma vez para cada linha do resultado, com os valores da linha substitudos nas referncias a coluna. Porm, as expresses da lista de seleo no precisam referenciar nenhuma coluna da expresso de tabela da clusula FROM; podem ser, inclusive, expresses aritmticas constantes, por exemplo.

182
Prof. Silvio Bendini Banco de Dados II Aula 1

Rtulos de coluna
Podem ser atribudos nomes para as entradas da lista de seleo para processamento posterior. Neste caso, "processamento posterior" uma especificao opcional de classificao e o aplicativo cliente (por exemplo, os ttulos das colunas para exibio). Por exemplo:
SELECT a AS valor, b + c AS soma FROM ...

Se nenhum nome de coluna de sada for especificado utilizando AS, o sistema atribui um nome padro.
183
Prof. Silvio Bendini Banco de Dados II Aula 1

Rtulos de coluna
Para referncias a colunas simples, o nome da coluna referenciada. Para chamadas de funo, o nome da funo. Para expresses complexas o sistema gera um nome genrico. Nota: Aqui, o nome dado coluna de sada diferente do nome dado na clusula FROM. Na verdade, este processo permite mudar o nome da mesma coluna duas vezes, mas o nome escolhido na lista de seleo o passado adiante.

184
Prof. Silvio Bendini Banco de Dados II Aula 1

Distinct
Aps a lista de seleo ser processada, a tabela resultante pode opcionalmente estar sujeita remoo das linhas duplicadas. A palavra chave DISTINCT deve ser escrita logo aps o SELECT para especificar esta funcionalidade:
SELECT DISTINCT lista_de_seleo ...

(Em vez de DISTINCT pode ser utilizada a palavra ALL para especificar o comportamento padro de manter todas as linhas)
185
Prof. Silvio Bendini Banco de Dados II Aula 1

Distinct
Como bvio, duas linhas so consideradas distintas quando tm pelo menos uma coluna diferente. Os valores nulos so considerados iguais nesta comparao. Como alternativa, uma expresso arbitrria pode determinar quais linhas devem ser consideradas distintas:
SELECT DISTINCT ON lista_de_seleo ... (expresso [, expresso ...])

Neste caso, expresso uma expresso de valor arbitrria avaliada para todas as linhas.
186
Prof. Silvio Bendini Banco de Dados II Aula 1

Distinct
Um conjunto de linhas para as quais todas as expresses so iguais so consideradas duplicadas, e somente a primeira linha do conjunto mantida na sada. Deve ser observado que a "primeira linha" de um conjunto imprevisvel, a no ser que a consulta seja ordenada por um nmero suficiente de colunas para garantir a ordem nica das linhas que chegam no filtro DISTINCT (o processamento de DISTINCT ON ocorre aps a ordenao do ORDER BY). A clusula DISTINCT ON no faz parte do padro SQL, sendo algumas vezes considerada um estilo ruim devido natureza potencialmente indeterminada de seus resultados. Utilizando-se adequadamente GROUP BY e subconsultas no FROM esta construo pode ser evitada, mas geralmente a alternativa mais fcil.

187
Prof. Silvio Bendini Banco de Dados II Aula 1

Ordenao de linhas
Aps a consulta ter produzido a tabela de sada (aps a lista de seleo ter sido processada) esta tabela pode, opcionalmente, ser ordenada. Se nenhuma ordenao for especificada, as linhas retornam em uma ordem aleatria. Neste caso, a ordem real depende dos tipos de plano de varredura e de juno e da ordem no disco, mas no se deve confiar nisto. Uma ordem de sada especfica somente pode ser garantida se a etapa de ordenao for especificada explicitamente.
188
Prof. Silvio Bendini Banco de Dados II Aula 1

Ordenao de linhas
A clusula ORDER BY especifica a ordem de classificao:
SELECT lista_de_seleo FROM expresso_de_tabela ORDER BY coluna1 [ASC | DESC] [, coluna2 [ASC | DESC] ...]

onde coluna1, etc., fazem referncia s colunas da lista de seleo. Pode ser tanto o nome de sada da coluna quanto o nmero da coluna.

189
Prof. Silvio Bendini Banco de Dados II Aula 1

Ordenao de linhas
Alguns exemplos:
SELECT a, b FROM tabela1 ORDER BY a; SELECT a + b AS soma, c FROM tabela1 ORDER BY soma; SELECT a, sum(b) FROM tabela1 GROUP BY a ORDER BY 1;

Como extenso ao padro SQL, tambm permite ordenar por expresses arbitrrias:
SELECT a, b FROM tabela1 ORDER BY a + b;

Tambm permitido fazer referncia a nomes de colunas da clusula FROM que no esto presentes na lista de seleo:
SELECT a FROM tabela1 ORDER BY b; 190
Prof. Silvio Bendini Banco de Dados II Aula 1

Ordenao de linhas
Cada especificao de coluna pode ser seguida pela palavra opcional ASC ou DESC, para definir a direo de ordenao como ascendente ou descendente. A ordem ASC o padro. A ordenao ascendente coloca os valores menores na frente, sendo que "menor" definido nos termos do operador <. De forma semelhante, a ordenao descendente determinada pelo operador >. Se for especificada a ordenao por mais de uma coluna, as ltimas entradas so utilizadas para ordenar as linhas iguais sob a ordem imposta pelas colunas de ordenao anteriores.
191
Prof. Silvio Bendini Banco de Dados II Aula 1

Introduo SQL
Lembrem-se que o intuito deste material no o de esgotar o assunto SQL. A pesquisa constante, testes, medies e readequao fazem parte da implementao de instrues eficientes e que atendam os requisitos de negcio. Continuem estudando e pesquisando sempre. Prof. Silvio

192
Prof. Silvio Bendini Banco de Dados II Aula 1

You might also like