Bases de Dados DML Data Manipulation Language Parte 1
DML Data Manipulation Language Diz respeito à manipulação dos dados. É utilizada para: Inserir dados numa tabela(tuplos) Remover dados de uma tabela(tuplos) Alterar dados numa tabela (campo a campo) Seleccionar dados de uma tabela (tuplos ou campos)
INSERT Serve para inserir registos (tuplos) numa tabela e a sua sintaxe (simplificada) é a seguinte: INSERT INTO <tabela> (<coluna1>,...,<colunan>) VALUES (<valor1>,..., <valorn>);
DELETE Serve para remover dados de uma tabela e a sua sintaxe(mais uma vez simplificada) é a seguinte: DELETE [FROM] [schema.] <tabela> WHERE (<condicao>);
UPDATE Serve para actualizar, ou seja, modificar dados de determinados campos de um registo (ou vários) de uma tabela. A sua sintaxe simplificada é a seguinte: UPDATE [schema.]<tabela > SET <expressao1> = <novo_valor1>,..., <expressaon> = <novo_valorn> [WHERE <condicao>];
Comando DESC: Sintaxe: DESC <tabela>; Exemplo do comando DESC: DESC aluno;
SELECT Para podermos ver os dados contidos nas tabelas utilizamos o comando SELECT: SELECT [DISTINCT] * <atributos [pseudonimos]> FROM <tabelas [nomes simbolicos]> [WHERE <condições>] [ORDER BY <atributos [ordem]>] [GROUP BY <atributos>] [HAVING <condições>];
SELECT Que atributos? A forma mais simples de obter todos os dados de uma tabela é: Todas as colunas SELECT * FROM <tabela>; Quando não pretendemos ver todas as colunas podemos usar o select da seguinte forma: SELECT <atributo1>,..., <atributon> FROM <tabela>;
Exercício 1 Visualizar toda a informação da tabela aluno. SELECT * FROM aluno;
Exercício 2 Quais os nomes e datas de nascimento dos alunos? SELECT nome_aluno, data_nsc_aluno FROM aluno;
SELECT Pseudónimos Ao fazermos SELECT sobre uma tabela, as colunas que obtemos como resultado têm o mesmo nome que lhes foi dado quando foram criadas; Podemos usar pseudónimos para formatar os nomes das colunas de resultado: SELECT <atributo1> [ pseudonimo1 ],..., <atributon> [ pseudonimon ] FROM <tabela>; As só são necessárias quando o pseudónimo é constituído por mais do que uma palavra e tem espaços pelo meio!
Exercício 3 Quais os nomes e datas de nascimento dos alunos? Mostre o resultado com o nome das colunas alteradas. SELECT nome_aluno Nome, data_nsc_aluno Data de Nascimento FROM aluno;
Funções de Linha I - Operações Matemáticas ABS(x) - valor absoluto de x CEIL(x) - menor inteiro superior a x EXP(x) exponencial de x FLOOR(x) - maior inteiro inferior a x LOG(x) logaritmo de x +,-,*,/... - operações aritméticas básicas SQRT(x) - raíz quadrada de x POWER(x,y) - potência de x por y ROUND(x) arredondamento de x TRUNC(x) - truncar um valor decimal de x
Funções de Linha I (Cont.) Como utilizar? Qual o desconto para o IRS de cada categoria? SELECT nome_categoria "Categoria", vencimento*0.35 IRS FROM categoria; SELECT POWER(2,3) FROM dual; Exemplo de obtenção simples de uma potência de 2 usando a tabela dummy
Exercício 4 Mostrar o vencimento anual de cada categoria (12 meses). DESC categoria; SELECT nome_categoria Categoria, vencimento*12 Vencimento Anual FROM categoria;
Valores Constantes: Literais e Concatenação Podemos adicionar ao resultado que vamos visualizar uma coluna com um valor pré definido; Este valor pertence APENAS à visualização, a tabela não sofre qualquer alteração.
Literais e Concatenação (Cont.) Valor Constante Concatenação com SELECT 'O aluno:' Aluno, num_aluno ' - ' nome_aluno "Numero - Nome", 'e do curso', cod_curso Curso FROM aluno; Pseudónimo ou alias para dar nome à coluna
Exercício 5 Mostrar as localidades onde os alunos habitam. SELECT local_aluno FROM aluno;
Eliminar linhas repetidas Numa tabela não há registos repetidos pois são tornados únicos pela sua chave; Mas alguns dos campos podem ter valores iguais em registos diferentes; Ao fazer SELECT sobre esses campos eliminamos a visualização de linhas repetidas usando a cláusula DISTINCT. SELECT DISTINCT <atributos> FROM <tabelas>; Note-se no entanto que não estamos a efectuar qualquer alteração sobre a tabela, estamos APENAS a definir como pretendemos visualizar os dados!
Exemplo Eliminar Linhas Repetidas SELECT local_aluno FROM aluno; SELECT DISTINCT local_aluno FROM aluno; <-- Versus -->
Exercício 6 Mostrar as localidades onde habitam e o sexo dos alunos, sem repetições. SELECT DISTINCT local_aluno, sexo_aluno FROM aluno;
Ordenar os resultados Podemos ainda apresentar os tuplos(registos) de uma tabela por uma ordem estipulada por nós: SELECT [DISTINCT] <atributos> FROM <tabelas> ORDER BY <atributos [ASC DESC]>; ASCendente ou DESCendente Vamos ordenar! Atributos pelos quais queremos ordenar (pela ordem que nos interessa)
Exemplos - Ordenar SELECT nome_aluno, data_nsc_aluno FROM aluno ORDER BY nome_aluno; SELECT nome_aluno, data_nsc_aluno, sexo_aluno FROM aluno ORDER BY sexo_aluno ASC, data_nsc_aluno DESC;
Exercício 7 Visualizar os nomes e datas de nascimento dos alunos ordenados por número de aluno (decrescente). SELECT nome_aluno, data_nsc_aluno FROM aluno ORDER BY num_aluno DESC;
Exercício 8 Visualizar os alunos por ordem de sexo (crescente) e nome (decrescente), mas utilizando respectivamente os pseudónimos S e Nome do Aluno. SELECT sexo_aluno S, nome_aluno Nome do Aluno FROM aluno ORDER BY S, Nome do Aluno DESC; SELECT sexo_aluno S, nome_aluno Nome do Aluno FROM aluno ORDER BY 1, 2 DESC;
Restrições na utilização de DISTINCT e ORDER BY Quando se utiliza as duas cláusulas na mesma query, os atributos referenciados pelo ORDER BY devem fazer parte da lista de selecção: SELECT DISTINCT nome_aluno FROM aluno ORDER BY num_aluno; Como seria de esperar, este exemplo dá erro!
A cláusula WHERE Esta cláusula utiliza-se quando pretendemos fazer pesquisas (SELECT s) com base em condições/restrições lógicas: SELECT [DISTINCT] <atributos> FROM <tabela> [WHERE <condições>] [ORDER BY <atributos [ASC DESC]>];
Exemplo - WHERE Mostrar apenas as alunas: SELECT * FROM aluno WHERE sexo_aluno = 'F';
Outros Operadores SQL BETWEEN... AND especificar uma gama de valores IN (lista) especificar um conjunto de valores LIKE especificar semelhança entre cadeias de caracteres. Podem ainda ser utilizados os símbolos: % qualquer cadeia de caracteres (vazia ou não) - um só caracter qualquer IS NULL AND Conjunção Lógica OR Disjunção Lógica Todos estes operadores podem ser precedidos pelo operador NOT (ex: NOT IN, NOT LIKE, etc)
Exemplos: Usar antes TO_DATE( 01-Jan-1976, dd-mm-yyyy ) e TO_DATE( 01-Jan-1977, dd-mm-yyyy ) SELECT... FROM...
Funções de linha II - Formatação de Dados UPPER(c) - converter para maiúsculas LOWER(c) - converter para minúsculas LENGTH(c) - comprimento da cadeia de caracteres RTRIM - eliminar espaços SUBSTR(str,p0,p1) - obter substring... Entre outras!
Exemplo Formatação Dados SELECT UPPER(local_aluno) FROM aluno;
Exercício 9 Visualizar apenas os alunos que nasceram entre 1978 e 1981. SELECT * FROM aluno WHERE data_nsc_aluno >= 78.01.01 AND data_nsc_aluno <= 81.12.31 ;
Exercício 10 Qual o resultado da expressão: SELECT * FROM aluno WHERE 3=3; O mesmo que a expressão SELECT * FROM aluno; pois a condição 3=3 é sempre verdade.
Exercício 11 Mostrar os alunos que nasceram entre 1975 e 1979 e sejam dos cursos 1, 2 ou 4. SELECT * FROM aluno WHERE data_nsc_aluno BETWEEN 75.01.01 AND 79.12.31 AND curso_aluno in (1, 2, 4);
Exercício 12 Visualizar todos os alunos cujo o nome começa por J. SELECT * FROM aluno WHERE UPPER(nome_aluno) LIKE J% ;
Exercício 13 Visualizar os alunos cujo o último nome tenha apenas 5 letras. SELECT * FROM aluno WHERE nome_aluno LIKE % ;
Exercício 14 Visualizar todos os alunos que não têm a morada preenchida. SELECT * FROM aluno WHERE local_aluno IS NULL;
Exercício 15 Mostrar o vencimento mensal dos professores adjuntos (ou equiparados). Nota: não se sabe como foram introduzidos os nomes das categorias, i.e., em maiúsculas ou minúsculas SELECT nome_categoria, vencimento FROM categoria WHERE LOWER(nome_categoria) like %adjunto% ;
Exercício 16 Seleccionar os alunos que nasceram em Janeiro. SELECT * FROM aluno WHERE data_nsc_aluno like %.01.% ;
Conversões entre tipos de dados TO_CHAR(d, [, fmt [, NLSPARAMS ]]) SELECT TO_CHAR(sysdate, Month DD, YYYY ) Hoje FROM dual; TO_DATE(c, [, fmt [, NLSPARAMS ]]) SELECT TO_DATE( 9/1/2004, MM/DD/YYYY ) Hoje FROM dual; Entre outras!
Operações Sobre Datas Add_months(d,n) Months_between(d,d) SELECT add_months(sysdate,6) FROM dual; Quantos meses se passaram entre 12 de Dezembro de 1982 e 3 de Julho de 1999? Sysdate é uma pseudo-coluna que produz a data e hora actuais. Pode ser usada como qualquer outra coluna. É habitual seleccionar sysdate sobre a tabela dual do utilizador sys: Select sysdate from sys.dual; SELECT months_between(to_date( 12-Dec-1982, dd-mm-yyyy ), TO_DATE( 03-Jul-1983, dd-mm-yyyy )) FROM dual;
Exercício 17 Usar o comando de SELECT para visualizar a data actual SELECT sysdate FROM sys.dual; SELECT DISTINCT sysdate FROM aluno; SELECT sysdate FROM aluno;
Exercício 18 Seleccionar os alunos que nasceram em 1 de Janeiro de 1965. SELECT * FROM aluno WHERE data_nsc_aluno = to_date('1 Janeiro 1965', 'dd month yyyy', 'NLS_DATE_LANGUAGE = Portuguese');
Referências e Links Úteis An Introduction to Database Systems C. J. Date Addison Wesley The Practical SQL Handbook Judith S. Bowman et al Addison Wesley Sintaxe de todos os comandos SQL para Oracle http://www.ss64.com/ora/ Tutorial Resumido de comandos Oracle http://www.engin.umich.edu/caen/technotes/oracletut.pdf