Linguagem de Consulta Estruturada (SQL) Conceitos sobre a versão ANSI da SQL, a sublinguagem de definição de dados (DDL) e a sublinguagem de manipulação de dados (DML) Prof. Flavio Augusto C. Correia 1
Conceitos sobre a versão ANSI da SQL Norma ANSI criada em 1986 (revista em 1989 e 1992). A linguagem SQL tem duas vertentes: DDL (Data Definition Language) e DML (Data Manipulation Language). Na vertente DDL o SQL possui um conjunto de comandos para criação e alteração de tabelas, chaves estrangeiras, regras de integridade referencial e views. A vertente DML é uma implementação da Álgebra Relacional, e.g., permite efectuar interrogações a uma base de dados, bem como alterar, anular ou inserir registos em tabelas. Prof. Flavio Augusto C. Correia 2
Create Table Criar a estrutura de uma tabela(arquivo) definido as colunas (campos) e as chaves primárias e estrangeiras existentes. Sintaxe: Create Table <nome-tabela> (<nome-coluna> <tipo-do-dado> [Not Null]) Primary Key (nome-coluna-chave) Foreign Key (nome-coluna-chave-estrangeira) References (nome-tabela-pai) On Delete [Restrict] [Cascade] [Set Null] Onde: nome-tabela - Representa o nome da tabela que será criada. nome-coluna - Representa o nome da coluna que será criada. A definição das colunas de uma tabela é feita relacionando-as uma após a outra. tipo-do-dado - Cláusula que define o tipo e tamanho dos campos definidos para a tabela. Os tipos de dados mais comuns serão definidos mais à frente. Not Null - Exige o preenchimento do campo, ou seja, no momento da inclusão é obrigatório que possua um conteúdo. Prof. Flavio Augusto C. Correia 3
Create Table Primary Key (nome-coluna-chave) - Definir para o banco de dados a coluna que será a chave primária da tabela. Caso ela tenha mais de um coluna como chave, elas deverão ser relacionadas entre os parênteses. Foreign Key (nome-coluna-chave-estrangeira) References (nome-tabela-pai) - Definir para o banco de dados as colunas que são chaves estrangeiras, ou seja, os campos que são chaves primárias de outras tabelas. Na opção References deve ser especificado a tabela na qual a coluna é a chave primária. On Delete / On Update - Esta opção especifica os procedimentos que devem ser feitos pelo SGBD quando houver uma exclusão de um registro ou atualização do campo de referência na tabela pai quando existe um registro correspondente nas tabelas filhas. As opções disponíveis são: 1) Restrict - Opção default. Esta opção não permite a exclusão na tabela pai de um registro cuja chave primária exista em alguma tabela filha. 2) Cascade - Esta opção realiza a exclusão em todas as tabelas filhas que possua o valor da chave que será excluída na tabela pai. 3) Set Null - Esta opção atribui o valor NULO nas colunas das tabelas filhas que contenha o valor da chave que será excluída na tabela pai. Prof. Flavio Augusto C. Correia 4
Create Table - Exemplo create table Dept ( DepNume integer not null, DepNome char(20) not null, DepLoca char(20) not null, DepOrca integer, primary key (DepNume) ); create table Emp ( EmpNume integer not null, EmpNome char(30) not null, EmpGere integer, EmpServ char(20), DepNume integer not null, EmpAdmi date not null, EmpSala integer, EmpComi integer, primary key (EmpNume), foreign key (DepNume) references Dept on delete restrict on update cascade ); Prof. Flavio Augusto C. Correia 5
Alter Table Alterar a estrutura de uma tabela acrescentando, alterando, retirando e alterando nomes, formatos das colunas e a integridade referencial definidas em uma determinada tabela. Sintaxe: Alter Table <nome-tabela> Drop <nome-coluna> Add <nome-coluna> <tipo-do-dado> [Not Null] Rename <nome-coluna> <novo-nome-coluna> Rename Table <novo-nome-tabela> Modify <nome-coluna> <tipo-do-dado> [Null] [Not Null] Add Primary key <nome-coluna> Drop primary Key <nome-coluna> Add Foreign Key (nome-coluna-chave-estrangeira) References (nome-tabela-pai) On Delete [Restrict] [Cascade] [Set Null] Drop Foreign Key (nome-coluna-chave-estrangeira) References (nome-tabela-pai) Prof. Flavio Augusto C. Correia 6
onde: Alter Table nome-tabela - Representa o nome da tabela que será atualizada. nome-coluna - Representa o nome da coluna que será criada. tipo-do-dado - Cláusula que define o tipo e tamanho dos campos definidos para a tabela. Drop <nome-coluna> - Realiza a retirada da coluna especificada na estrutura da tabela. Add <nome-coluna> <tipo-do-dado> - Realiza a inclusão da coluna especificada na estrutura da tabela. Na coluna correspondente a este campo nos registros já existentes será preenchido o valor Null (Nulo). A definição Not Null e semelhante à do comando Create Table. Rename <nome-coluna> <novo-nome-coluna> - Realiza a troca do nome da coluna especificada. Rename Table <novo-nome-tabela> - Realiza a troca do nome da tabela especificada. Modify <nome-coluna> <tipo-do-dado> - Permite a alteração na característica da coluna especificada. Prof. Flavio Augusto C. Correia 7
Drop Table Deletar a estrutura e os dados existentes em uma tabela. Após a execução deste comando estarão deletados todos dados, estrutura e índices de acessos que estejam a ela associados. Sintaxe: Drop Table <nome-tabela> onde: nome-tabela - Representa o nome da tabela que será deletada. Prof. Flavio Augusto C. Correia 8
Tipos de dados Texto Char [(n)] (equivalente a Varchar (n)) Long Varchar - infinitos caracteres Text eq. a Long Varchar mas admite NULL Boleano Bit [0, 1] Data Date Time TimeStamp (data e hora) Número Tinyint [0 255] Smallint [-+ 32,767] ou UNSIGNED [0-65535] Integer [-+ 2,147,483,6479] Double [ grande] Decimal (inteiros[, decimais]) Prof. Flavio Augusto C. Correia 9
Valores nulos A SQL admite o conceito de valor de dado nulo. Na realidade qualquer coluna pode conter valores nulos, a menos que a definição da mesma na instrução CRATE TABLE especifique claramente NOT NULL. Nulo é um valor especial, usado para representar valor desconhecido ou valor nãoaplicável. Não é a mesma coisa que espaços vazios ou zero. Por exemplo, um registro de expedição pode conter um valor QTY nulo ( sabemos que a expedição existe, mas desconhecemos a quantidade expedida); ou então, um registro de fornecedor conteria um valor STATUS nulo (talvez STATUS não se aplique a fornecedores de San Jose, por alguma razão); Prof. Flavio Augusto C. Correia 10
Exercicio - Notas de Avaliações 1 Disciplina Sigla Designação Ano Lectivo 1 * 1 1 * 1 * Avaliação Tipo Avaliação Aluno Número Nome Morada 1 * Nota Nota Licenciatura Sigla Designação 1 * 1 * Frequencia Data Disciplina (Sigla, Designacao, Ano Letivo, Sigla_Licenciat) Frequencia (Sigla,Data) Nota (Sigla, Data, NumAluno, Nota) Aluno (Numero, Nome, Morada) Avaliacao(Sigla,Numero,tipoAvaliacao) Licenciatura(Sigla,,Designacao) Prof. Flavio Augusto C. Correia 11
Exercicio - Notas de Avaliações Cliente Codigo Nome 1 1 * Pedido Numero Data 1 * 1 * Produto Codigo descricao Vlr_unitario Unidade Client (Codigo, Nome) Pedido (Numero, Data, Codigo) items(numero, Codigo) Produto (Codigo, descricao, Vlr_unitario, Unidade) Prof. Flavio Augusto C. Correia 12
Insert Into Permite a inserção de informações em uma tabela. O número de valores informados sempre deve ser o mesmo que o número de atributos informados. Sintaxe: Insert Into <tabela> (<atributo>, <atributo>) Values (<valor>, <valor>) Exemplo: Cliente Código Nome Paula Marcia Carlos / inserir um cliente na tabela de cliente / Insert Into cliente (codigo, nome) values ( 04, Pedro ) Prof. Flavio Augusto C. Correia 13
Update Permite a alteração de informações em uma tabela. Sintaxe: Update <tabela> Set <atributo> = <valor> Exemplo: Cliente Pedido Código nome Numero dt_entrega codigo Paula 100 10//20 Marcia 200 15//20 Carlos 300 17//20 / alterar o nome do cliente / Update cliente Set nome = Anderson / alterar o nome do cliente cujo código seja igual a / Update cliente Set nome = Jaqueline Where codigo = / alterar o nome do cliente cuja dt_entrega seja igual a 10//20 / Update cliente Set nome = Carla From pedido Where cliente.codigo = pedido.codigo and pedido.dt_entrega = 10//20 Prof. Flavio Augusto C. Correia 14
Permite a exclusão de registros em uma tabela. Sintaxe: Delete From <tabela> Delete Exemplo: Cliente Pedido Código nome Paula Marcia Carlos Numero 100 200 300 dt_entrega 10//20 15//20 17//20 codigo / exclui todos os clientes da tabela / Delete From cliente / exclui todos os clientes da tabela cujo nome seja igual a Paula / Delete From cliente Where nome = Paula / exclui todos os cliente cuja dt_entrega seja igual a 15//20 / Delete From cliente, pedido Where cliente.codigo = pedido.codigo and pedido.dt_entrega = 10//20 Prof. Flavio Augusto C. Correia 15
Select Selecionar informações armazenadas em uma ou mais tabelas. Sintaxe: Select <atributos> From <tabela> Exemplo: Produto descricao Queijo Chocolate unidade Kg Bar vlr_unitario 0,97 0,87 /listar todos os produtos da tabela produto/ / listar todos os produtos da tabela produto / Select descrição, unidade, vlr_unitário Select * Prof. Flavio Augusto C. Correia 16
Comparações na cláusula Where Operadores Relacionais = igual <> diferente < menor > maior <= menor ou igual >= maior ou igual Operadores Lógicos And e Or ou Not não Operadores Aritiméticos + soma - subtração * multiplic. / divisão ^ exponenc. Sintaxe: Select <atributo> From <tabela> Where <atributo> <operador> <valor> / listar todos os produtos da tabela produto cuja unidade seja igual a Kg / Select descrição, unidade, vlr_unitário Where unidade = Kg Prof. Flavio Augusto C. Correia 17
Comparações na cláusula Where Produto descricao Queijo Chocolate unidade Kg Bar vlr_unitario 0,97 0,87 / listar todos os produtos da tabela produto cujo vlr_unitário seja maior do que 0,90/ Select * Where vlr_unitário > 0,90 / listar todos os produtos da tabela produto cujo vlr_unitário seja menor do que 0,90 ou descricao seja igual a queijo / Select * Where vlr_unitário < 0,90 or descricao = queijo Prof. Flavio Augusto C. Correia 18
Between e Not Between Pesquisa um determinado atributo que esteja entre um intervalo de valores. Sintaxe: Select <atributo> From <tabela> Where <atributo> [between] [not between] <valor 1> and <valor 2> Exemplo: / listar todos os produtos da tabela produto cujo vlr_unitário esteja entre 0,00 e 1,00 / Select descrição, unidade, vlr_unitário Where vlr_unitário between 0,00 and 1,00 / listar todos os produtos da tabela produto cujo vlr_unitário não esteja entre 0,70 e 1,50 / Select descrição, unidade, vlr_unitário Where vlr_unitário not between 0,70 and 1,50 Prof. Flavio Augusto C. Correia 19
Like e Not Like Pesquisa um determinado atributo que seja do tipo CHAR e têm praticamente o mesmo funcionamento dos operadores = e <>. O operador LIKE ainda possui um símbolo de % (percentual), que permite a busca a partir de um pedaço de uma palavra. Sintaxe: Select <atributo> From <tabela> Where <atributo> [like] [not like] <valor 1> Exemplo: Produto Código Descricao Queijo Chocolate / listar todos os produtos da tabela produto cujo código seja como / Select codigo, descricao Where codigo like Prof. Flavio Augusto C. Correia 20
Like e Not Like Código Descricao Queijo Chocolate / listar todos os produtos da tabela produto cujo código não seja como / Select codigo, descricao Where codigo not like / listar todos os produtos da tabela produto cuja descricao seja como Qu / Select codigo, descricao Where descricao like ( Qu% ) / listar todos os produtos da tabela produto cuja descricao contenha os caracteres Qu / Select codigo, descricao Where descricao like ( %Qu% ) Prof. Flavio Augusto C. Correia 21
In e Not In Pesquisa um determinado atributo que seja contido ou não contidos no conjunto de valores. Estes operadores minimizam o uso dos operadores =, <>, AND e OR. Sintaxe: Select <atributo> From <tabela> Where <atributo> [in] [not in] <valor 1> Exemplo: Produto Código Descricao Queijo Chocolate / listar todos os produtos da tabela produto cujo código esteja em / Select codigo, descricao Where codigo in ( ) Prof. Flavio Augusto C. Correia 22
In e Not In Código Descricao Queijo Chocolate / listar todos os produtos da tabela produto cujo código esteja em e / Select codigo, descricao Where codigo in (, ) / listar todos os produtos da tabela produto cujo código não esteja em e / Select codigo, descricao Where codigo not in (, ) Prof. Flavio Augusto C. Correia 23
Sintaxe: Is Null e Is Not Null Select <atributo> From <tabela> Where <atributo> [is null] [is not null] Exemplo: Produto Código descricao Queijo Chocolate / listar todos os produtos da tabela produto cuja descricao seja nula / Select codigo, descricao Where descricao is null / listar todos os produtos da tabela produto cuja descricao não seja nula / Select codigo, descricao Where descricao is not null Prof. Flavio Augusto C. Correia 24
Ordenando os dados selecionados Order by Caracteriza a ordem de aparição da informação ASC ascendente ou DESC descendente, quando nenhuma das duas opções é informada a prioridade é do ASC. Sintaxe: Select <atributo> From <tabela> Order by <atributo> [ASC] [DESC] Exemplo: Produto codigo descricao Queijo Minas Chocolate Queijo Prato / listar todos os produtos da tabela produto ordenados por descricao ascendente / Select codigo, descricao Order by descricao / listar todos os produtos da tabela produto ordenado por descricao descendente e código ascendente/ Select codigo, descricao Order by descricao desc, codigo asc Prof. Flavio Augusto C. Correia 25
Realizando cálculos com campos selecionados Com o SQL podemos criar um campo que não pertença à tabela, e que seja fruto do cálculo sobre alguns campos da tabela. Exemplo: Produto Código descricao Queijo Minas valor 2,00 Chocolate 1,50 Queijo Prato 2,10 / calcular o valor dos produtos com um acréscimo de 5% / Select descricao, valor * 1,05 / calcular o valor dos produtos com um acréscimo de 5% e subtrair menos 1,00 / Select descricao, ((valor * 1,05) 1,00) Prof. Flavio Augusto C. Correia 26
Utilizando funções sobre conjuntos (Max e Min) Retorna o maior e o menor valor de um atributo dentro de toda a tabela. Sintaxe: Select Max(<atributo>) Select Min(<atributo>) Exemplo: Código Descrição Queijo Minas Valor 2,00 Produto Chocolate Queijo Prato 1,50 2,10 / selecionar o maior valor da tabela produto / Select Max(valor) / selecionar o menor valor da tabela produto / Select Min(valor) / selecionar o maior e o menor valor da tabela produto / Select Max(valor), Min(valor) Prof. Flavio Augusto C. Correia 27
Contando os registros - Count Retorna a quantidade de registros de uma tabela. Sintaxe: Select Count(<atributo>) From <tabela> Exemplo: Produto Código Descricao Queijo Minas Valor 2,00 Chocolate 1,50 Queijo Prato 2,10 / selecionar quantos registros possui a tabela produto / Select count(*) Prof. Flavio Augusto C. Correia 28
Utilizando a cláusula Distinct Normalmente, vários registros dentro de uma tabela podem conter os mesmos valores, com exceção da chave primária. Com isso, muitas consultas podem trazer informações erradas. A cláusula DISTINCT, aplicada em uma consulta, foi criada para não permitir que certas redundâncias, obviamente necessárias, causem problemas. Sintaxe: Select distinct <atributo> From <tabela> Exemplo: Produto Código Descricao Queijo Chocolate Queijo Valor 2,00 1,50 2,10 / selecionar a descricao da tabela produto / Select distinct descricao / selecionar o código e a descricao da tabela produto / Select distinct codigo, descricao Prof. Flavio Augusto C. Correia 29
Agrupando informações selecionadas Group by É possível organizar a seleção de dados em grupos determinados. O atributo especificado no GROUP BY deve estar explicito na linha do comando SELECT. Sintaxe: Select <atributo> From <tabela> Group by <atributo> Exemplo: Produto Código Descricao Queijo Valor 2,00 Chocolate 1,50 Queijo 2,10 / selecionar a descricao da tabela produto / Select descricao Group by descricao / selecionar quantas vezes aparece o conteúdo queijo / Select descricao, count(*) Group by descricao Prof. Flavio Augusto C. Correia 30
Agrupando de forma condicional - Having Determina uma condição. Sintaxe: Select <atributo> From <tabela> Group by <atributo> Having <operador> <valor> Exemplo: Produto Código Descricao Queijo Valor 2,00 Chocolate 1,50 Queijo 2,10 / selecionar a descricao da tabela produto com mais de uma ocorrencia/ Select descricao, count(*) Group by descricao Having count(*) > 1 Prof. Flavio Augusto C. Correia 31
Recuperando dados de várias tabelas Join = Para que possamos trabalhar com informações de tabelas distintas é necessário usar a junção. Sintaxe: Select <tabela 1>.<atributo>, <tabela 2>.<atributo> From <tabela 1>, <tabela 2> Where <tabela 1>.<atributo> = <tabela 2>.<atributo> devem ser usada as chaves na junção Exemplo: Cliente Pedido Código Nome Numero dt_entrega codigo Paula 100 10//20 Márcia 200 15//20 Carlos 300 17//20 / selecionar o nome do cliente e o numero de seus pedidos / Select cliente.nome, pedido.numero From cliente, pedido Where cliente.codigo = pedido.codigo / selecionar o código e nome do cliente e o numero e dt_entrega de seus pedidos / Select cliente.código, cliente.nome, pedido.numero, pedido.dt_entrega From cliente, pedido Where cliente.codigo = pedido.codigo Prof. Flavio Augusto C. Correia 32
Utilizando consultas encadeadas (Subqueries) É a utilização de uma consulta dentro de outra consulta, mas também pode ser aplicado com outros comandos SQL como: INSERT, DELETE e UPDATE. Sintaxe: Select <atributo> From <tabela> Where <atributo> <condição> ( Exemplo: Cliente Código Nome Paula Márcia Carlos Select <atributo> From <tabela> ) Numero 100 200 300 Pedido dt_entrega 10//20 15//20 17//20 / selecionar o nome do cliente cujo codigo esteja contido na tabela de pedido / Select nome From cliente Where codigo in ( Select codigo From pedido ) codigo / selecionar o nome do cliente cujo codigo não esteja contido na tabela de pedido / Select nome From cliente Where codigo not exists ( Select codigo From pedido ) Prof. Flavio Augusto C. Correia 33
Views As Views não são mais do que comandos SELECT armazenados. São por vezes denominadas tabelas temporárias. Note-se que o resultado de uma execução de uma view (os registos que ela devolve) depende dos registos armazenados no momento nas tabelas de suporte à view. As views podem ser utilizadas dentro de comandos SELECT. Cliente Pedido Código Nome Numero dt_entrega codigo Paula 100 10//20 Márcia 200 15//20 Carlos 300 17//20 CREATE VIEW Clientes AS Select cliente.nome, pedido.numero From cliente, pedido Where cliente.codigo = pedido.codigo As views não podem conter a cláusula ORDER BY e apenas permitem a inserção, remoção e alteração de registos caso não contenham as cláusulas GROUP BY e UNION. Prof. Flavio Augusto C. Correia 34
Comando para criar um índice tabela: Indices CREATE [UNIQUE] INDEX nome índice ON nome tabela (nome coluna [ASC DESC]) Cliente Código Nome Paula Márcia Carlos create unique index Index_codigo on clientes ( Codigo ASC, Nome ASC ); Prof. Flavio Augusto C. Correia 35