SQL - Conceitos e Principais
Comandos
Rafael Pagliosa
Sistemas de Informação
Banco de Dados II
Linguagem de Manipulação de Dados - DML
● A categoria de Manipulação de Dados tem quatro
comandos:
1. INSERT
○ Insere tuplas nas tabelas;
2. UPDATE
○ Atualiza dados de tuplas existentes;
3. DELETE
○ Elimina tuplas com base no critério de busca;
4. SELECT
○ Realiza consultas nos dados existentes;
Comandos DML - INSERT
● Sintaxe:
○ Formato 1: Insere uma tupla de cada vez.
INSERT INTO <Tabela> [( <Atributo>, ... )]
VALUES ( expression | DEFAULT, ... );
○ Formato 2: Insere múltiplas tuplas a partir de uma tabela.
INSERT INTO <Tabela> [( <Atributo>, ... )]
<Comando SELECT>;
Comandos DML - INSERT
● Sintaxe:
○ Formato 1: Insere uma tupla de cada vez.
INSERT INTO CIDADE VALUES (3, 'Florianópolis', 'SC');
INSERT INTO FUNCIONARIO (CD_FUNC, NM_FUNC, SALARIO, CD_DEP, CD_CIDADE)
VALUES (22, 'Nhonho', 3000, 2, 1);
○ Formato 2: Insere múltiplas tuplas a partir de uma tabela.
INSERT INTO FUNCIONARIOS_DE_CURITIBA (CD_FUNC, NM_FUNC, SALARIO, CD_DEP)
SELECT CD_FUNC, NM_FUNC, SALARIO, CD_DEP FROM FUNCIONARIO WHERE CD_CIDADE = 2;
Comandos DML - UPDATE
● Sintaxe:
UPDATE <tabela>
SET <Atributo> = <expressão>,
... [WHERE <Condição>]
;
● <expressão> = <Atributo>|<constante>|<expr>|NULL
○ Onde <expr> é qualquer comando SELECT que resulte em apenas uma tupla e uma
coluna.
Comandos DML - UPDATE - Exemplos
● Aplicar aumento de 5% para todos os funcionários:
○ UPDATE FUNCIONARIO SET SALARIO = SALARIO * 1.05;
● Aplicar aumento de 10% para todos os funcionários de Curitiba:
○ UPDATE FUNCIONARIO SET SALARIO = SALARIO * 1.1 WHERE CD_CIDADE = 2;
● Atualizar o número de funcionários de todos os departamentos:
○ UPDATE DEPARTAMENTO D SET NUM_FUNC = (SELECT COUNT(*) FROM FUNCIONARIO F
WHERE F.CD_DEP = D.CD_DEP);
Comandos DML - DELETE
● Sintaxe:
DELETE [FROM] <tabela> [WHERE <Condição>]
;
● Exemplos:
○ Apagar a cidade de Florianópolis:
■ DELETE FROM CIDADE WHERE CD_CIDADE = 3;
○ Apagar todos os registros da tabela Funcionarios_De_Curitiba:
■ DELETE FROM FUNCIONARIOS_DE_CURITIBA;
Comandos DML - SELECT
● Sintaxe:
SELECT [ALL | DISTINCT] <lista de atributos>
FROM <lista de Tabelas> [WHERE
<condições>]
[GROUP BY <lista de atributos> [HAVING
<condição>]]
[ORDER BY <Lista de atributos> [ASC|DESC], ...]
;
● Somente as cláusulas SELECT e FROM são obrigatórias.
Comandos DML - SELECT
● Um comando SELECT precisa indicar pelo menos os atributos que
serão recuperados, de pelo menos uma tabela:
SELECT <lista de atributos>
FROM <tabela>;
● Por exemplo:
SELECT CD_CIDADE, NM_CIDADE
FROM CIDADE;
● Cada atributo da lista é separado por vírgula;
● Nomes dos atributos e tabelas não são sensíveis à caixa da letra
(maiúsculas ou minúsculas).
Comandos DML - SELECT - DISTINCT
● Se a lista de atributos não contiver uma chave, a resposta pode ter
tuplas repetidas:
SELECT NM_FUNC
FROM FUNCIONARIO;
● A eliminação de repetições pode ser solicitada com a diretriz
DISTINCT:
SELECT DISTINCT NM_FUNC
FROM FUNCIONARIO;
Comandos DML - SELECT - alias
● Nomes de atributos e de tabelas podem ter um alias (apelido):
● O alias pode ser colocado entre " " para que se respeite a caixa do texto
ou para usar separadores.
● Dependendo do SGBD, pode ser necessário o uso do AS antes do alias:
SELECT CD_CIDADE AS "Código da Cidade", NM_CIDADE "Nome da Cidade"
FROM CIDADE C;
Comandos DML - SELECT - alias
● Os atributos podem ser qualificados pela tabela a que pertencem.
○ Útil quando se envolvem várias tabelas que podem ter nomes de atributos repetidos.
SELECT CIDADE.CD_CIDADE, CIDADE.NM_CIDADE
FROM CIDADE;
● Sempre que se usa um alias numa tabela, a qualificação deve passar a
ser feita com ele.
SELECT F.CD_FUNC, FUNCIONARIO.NM_FUNC, CD_CIDADE
FROM FUNCIONARIO F;
Comandos DML - SELECT
● Quando se quer obter todos os atributos de uma tabela, usa-se * no lugar
da lista de atributos.
SELECT *
todos os
FROM CIDADE atributos.
SELECT CIDADE.*
todos os atributos da relação
FROM CIDADE CIDADE.
SELECT C.*
todos os atributos da relação
FROM CIDADE C CIDADE.
● Usar * facilita escrever comandos quando se está testando comandos, mas
não é uma boa prática para programação – se a tabela for atualizada
incluindo ou renomeando atributos, um comando programado pode passar
a dar erro.
Comandos DML - SELECT
● A lista de atributos pode conter:
○ O nome de atributos: SELECT NM_CIDADE FROM CIDADE;
○ Operações entre atributos:
SELECT NM_FUNC, SALARIO AS "Salário Bruto", SALARIO * 0.89 AS "Salário Líquido"
FROM FUNCIONARIO;
○ Funções: SELECT UPPER(NM_FUNC) FROM FUNCIONARIO;
○ Expressões CASE;
○ Subselects;
Comandos DML - SELECT - FUNÇÕES
● Existem funções internas para diversos tipos de tratamento:
○ Manipulação de dados.
○ Conversão de tipos.
○ Condicionais.
○ Tratamento de sequências.
● Geralmente, são agrupadas de acordo com o tipo de dados que
recebem.
● Também é possível criar novas funções.
Comandos DML - SELECT - FUNÇÕES
● Funções e operadores de textos.
Função Retorno Descrição Exemplo Resultado
string || string string Concatena strings SELECT 'TESTE ' || '123'; TESTE 123
concat(string[, string]) SELECT CONCAT('TESTE ', '123');
char_length(string) int Número de caracteres na string SELECT CHAR_LENGTH('teste'); 5
length(string) SELECT LENGTH('teste');
lower(string) string Converte a string para minúsculo SELECT LOWER('TESTE'); teste
upper(string) string Converte a string para maiúsculo SELECT UPPER('teste'); TESTE
position(substring in string) int Posição da substring na string SELECT POSITION('sil' in 'brasil'); 4
strpos(string, substring) SELECT STRPOS('brasil', 'sil');
substring(string [from int] [for string Extrai uma porção da string SELECT SUBSTRING('Homer Simpson' Simpso
int]) from 7 for 6);
substr(string, from int, for int) SELECT SUBSTR('Homer Simpson', 7, 6);
Comandos DML - SELECT - FUNÇÕES
● Funções e operadores de String.
Função Retorno Descrição Exemplo Resultado
trim(string) string Remove espaços SELECT TRIM(' Olá Mundo '); Olá Mundo
initcap(string) string Converte primeira letra para maiúsculo SELECT INITCAP('teste'); Teste
left(str string, n int) string Retorna string de tamanho n (à esquerda) SELECT LEFT('Homer Simpson', 5); Homer
right(str string, n int) string Retorna string de tamanho n (à direita) SELECT RIGHT('Homer Simpson', 7); Simpson
repeat(str string, n int) string Repete a string n vezes SELECT REPEAT('Olá ', 3); Olá Olá Olá
replace(str string, de string Substitui de -> para na string SELECT REPLACE('Olá Mundo', 'Olá', Oi Mundo
string, para string) 'Oi');
reverse(string) string Inverte a string SELECT Reverse('Onibus'); subinO
Comandos DML - SELECT - FUNÇÕES
● Funções e operadores de Data/Hora.
Função Retorno Descrição Exemplo Resultado
current_date date Obtém a data atual SELECT CURRENT_DATE; 2020-03-21
current_time time Obtém a hora atual SELECT CURRENT_TIME; 17:23:15.067895-03:00
current_timestamp timestamp Obtém a data e hora atual SELECT CURRENT_TIMESTAMP; 2020-03-21 17:24:02.524562-03
extract(day from double precision Obtém o dia da data/data e SELECT EXTRACT(DAY FROM 21
timestamp/date) hora CURRENT_DATE);
extract(month from double precision Obtém o mês da data/data e SELECT EXTRACT(MONTH FROM 3
timestamp/date) hora CURRENT_DATE);
extract(year from double precision Obtém o ano da data/data e SELECT EXTRACT(YEAR FROM 2020
timestamp/date) hora CURRENT_DATE);
Campos que “extract” pode obter: hour, minute, second, dow, week, doy, decade, century, quarter
hora, minuto, segundo, dia da semana, semana do ano, dia do ano, década, quadrimestre do ano
Comandos DML - SELECT - FUNÇÕES
● Funções e operadores de Data/Hora.
Função Retorno Descrição Exemplo Resultado
date_part('day', timestamp/date) double precision Obtém o dia da data/data e hora SELECT 21
DATE_PART('DAY',
CURRENT_DATE);
date_part('month', double precision Obtém o mês da data/data e hora SELECT 3
timestamp/date) DATE_PART('MONTH',
CURRENT_DATE);
date_part('year', timestamp/date) double precision Obtém o ano da data/data e hora SELECT 2020
DATE_PART('YEAR',
CURRENT_DATE);
Campos que “date_part” pode obter: hour, minute, second, dow, week, doy, decade, century, quarter
hora, minuto, segundo, dia da semana, semana do ano, dia do ano, década, quadrimestre do ano
Comandos DML - SELECT - FUNÇÕES
● Funções matemáticas.
Função Retorno Descrição Exemplo Resultado
abs(numeric) numeric Retorna o valor absoluto SELECT ABS(-12.33); 12.33
round(numeric, casas) numeric Arredonda numeric com n casas SELECT ROUND(12.3355, 2); 12.34
decimais
trunc(numeric) numeric Trunca numeric SELECT TRUNC(12.3355); 12
trunc(numeric, casas) numeric Trunca numeric considerando n SELECT TRUNC(12.3355, 2); 12.33
casas decimais
random numeric Obtém um número aleatório entre SELECT RANDOM(); 0.3811123127
0e1 2203483
Comandos DML - SELECT - FUNÇÕES
● Funções de conversão de dados.
Função Retorno Descrição Exemplo Resultado
cast(valor as tipo) tipo Converte valor para tipo. SELECT CAST('5.33' AS NUMERIC); 5.33
SELECT CAST('A' AS NUMERIC); Error
SELECT CAST('21-12-2018' AS 2018-12-21
DATE);
valor::tipo tipo Converte valor para tipo. SELECT '5.33'::NUMERIC; 5.33
Comandos DML - SELECT - FUNÇÕES
● Funções condicionais.
Função Descrição Exemplo Resultado
coalesce(valor1, valor2) Retorna valor1, se for não nulo, caso contrário, retorna SELECT COALESCE(NULL, 'Teste 2'); Teste 2
valor2 SELECT COALESCE('Teste 1', 'Teste 2'); Teste 1
greatest(valor1, valor2) Retorna o maior valor entre valor1 e valor2 SELECT GREATEST(1, 2); 2
SELECT GREATEST(2, 1);
least(valor1, valor2) Retorna o menor valor entre valor1 e valor2 SELECT LEAST('a', 'b'); a
SELECT LEAST('b', 'a');
Comandos DML - SELECT - CASE
● Sintaxe de uma expressão CASE:
CASE <Expressão>
WHEN <Valor> THEN <resultado> [WHEN...]
[ELSE <resultado>]
END
ou
CASE
WHEN <Condição> THEN <resultado> [WHEN...]
[ELSE <resultado>]
END
Comandos DML - SELECT - CASE
● Por
exemplo: SELECT NM_CIDADE, CASE NM_CIDADE WHEN 'Curitiba' THEN 'Capital'
○ Expressão: ELSE 'Interior'
END AS REGIAO
FROM CIDADE;
○ ou Condição: SELECT NM_FUNC, CASE WHEN SALARIO > 5000 THEN SALARIO - 600
WHEN SALARIO > 3000 THEN SALARIO * 0.89
WHEN SALARIO > 1500 THEN SALARIO * 0.91
ELSE SALARIO * 0.92 END AS "Salário Líquido"
FROM FUNCIONARIO;
● Se não for especificado ELSE, valores que não atendam a nenhuma
condição
WHEN assumem NULL.
Comandos DML - SELECT - WHERE
● Em uma consulta usando o SELECT é possível especificar condições para
que sejam retornados apenas registros específicos.
● Para indicar um operador de condição, é usada a cláusula WHERE, onde
as condições se aplicam ou a operadores de seleção ou a junções
internas:
SELECT <lista de atributos>
FROM <tabela>;
[WHERE
<condições>];
Comandos DML - SELECT - WHERE
● Condições de comparação na Cláusula WHERE:
<condição> = {
<atr> <operator> <val>
| <atr> [NOT] BETWEEN <val1> AND <val2>
| <atr> [NOT] LIKE <val1> [ESCAPE <val2>]
| <atr> IS [NOT] NULL
| <atr> [NOT] IN ( <val1> [, <valn> ] | <subconsulta>)
| [NOT] EXISTS ( <select expr>)
| <atr> {θ {ALL|SOME|ANY} (<subconsulta>)
| <condição> OR <condição>
| <condição> AND <condição>
}
Comandos DML - SELECT - WHERE
● Exemplos:
○ Obter funcionários com salário maior que R$ 2.000,00:
SELECT * FROM FUNCIONARIO WHERE SALARIO > 2000;
○ Obter funcionários com salário entre R$ 1.500,00 e R$ 2.500,00 do departamento
“Escolinha”:
SELECT * FROM FUNCIONARIO
WHERE (SALARIO BETWEEN 1500 AND 2500) AND (CD_DEP = 1);
○ Obter departamentos que possuam a descrição do local:
SELECT * FROM DEPARTAMENTO WHERE DS_LOCAL IS NOT NULL;
○ Obter funcionários cujo nome comece com “Professor”:
SELECT * FROM FUNCIONARIO WHERE LOWER(NM_FUNC) LIKE 'professor%';
Comandos DML - SELECT - ORDER BY
● É possível ordenar os resultados de uma consulta, para isso,
utiliza-se a cláusula ORDER BY.
● Sintaxe:
SELECT <lista de atributos>...
FROM <table expression> …
[ORDER BY <atr1 [ASC | DESC]> [, <atrn [ASC | DESC]>];
● Por padrão, a ordenação é feita em ordem crescente (ASC), mas pode ser
feita em ordem decrescente usando a cláusula DESC.
Comandos DML - SELECT - ORDER BY
● Exemplo:
○ Obter os funcionários em ordem alfabética:
SELECT * FROM FUNCIONARIO ORDER BY NM_FUNC;
○ Obter funcionários ordenados do maior salário para o menor:
SELECT * FROM FUNCIONARIO ORDER BY SALARIO DESC;
○ Obter funcionários ordenados por departamento e do maior salário para o
menor:
SELECT * FROM FUNCIONARIO ORDER BY CD_DEP, SALARIO DESC;
Comandos DML - SELECT - LIMIT e OFFSET
● A cláusula LIMIT permite obter apenas uma parte das tuplas recuperadas pela consulta.
● Sintaxe:
SELECT <lista de atributos>...
FROM <table expression> …
[ORDER BY ... ]
[LIMIT {valor1 | ALL}] [OFFSET valor2];
● Quando LIMIT valor1 é dado, esse é o número máximo de tuplas retornado (pode ser menos se não
houver esse número para retornar);
● Indicar LIMIT ALL é o mesmo que omitir valor1;
● Quando OFFSET valor2 é dado, esse número de tuplas é pulado antes de começar a retornar tuplas;
● É importante usar a cláusula ORDER BY nos comandos que têm a cláusula LIMIT, para que exista uma
ordem única de escolha das tuplas a retornar.
Comandos DML - SELECT - LIMIT e OFFSET
● Exemplo:
○ Obter os cinco funcionários com maior salário:
SELECT *
FROM FUNCIONARIO
ORDER BY SALARIO DESC
LIMIT 5;
○ Obter os cinco funcionários com maior salário, ignorando-se os dois
primeiros:
SELECT *
FROM FUNCIONARIO
ORDER BY SALARIO DESC
LIMIT 5 OFFSET 2;
Comandos DML - Exercício
1. Crie um novo funcionário com o seu nome.
2. Aplique um aumento de R$ 500,00 apenas para o seu funcionário.
3. Selecione apenas o seu funcionário, com o nome em maiúsculo e apenas
a parte inteira do salário.
4. Remova apenas o seu funcionário.
Referências Bibliográficas
● POLA, Ives Renê Venturini. SQL – Conceitos e Principais Comandos.
UTFPR.
● CARNIEL, Fabiano Luiz. Banco de Dados - SQL DDL. UTFPR.
● SILBERSCHATZ, Abraham. Sistema de Bancos de Dados. São Paulo: Makron
Books, 1999.
● ELMASRI, Ramez; NAVATHE, Shamkant B. Sistemas de Banco de Dados.
4ª. Ed. São Paulo: Pearson Addison Wesley, 2005.