You are on page 1of 12

21/10/2010

1
Prof. Rafael Garcia Barbosa
Linguagem SQL
Aula 10
Para criar todos os elementos que compem
os bancos de dados e para permitir a
manipulao de tais elementos, foi
desenvolvida uma linguagem prpria
SQL Structured Query Language
A linguagem SQL um padro que todos os
SGBDs devem seguir
Cada SGBD pode incluir funcionalidades prprias
A ltima atualizao foi em 2003
Introduo
Linguagem SQL
2
21/10/2010
2
A Linguagem SQL possui ainda algumas
subdivises principais:
Data Definition Language (DDL)
Permite a criao de, tabelas, ndices, etc
Data Manipulating Language (DML)
Permite a insero, atualizao e excluso de dados
no BD
Data Query Language (DQL)
Permite a busca de dados no BD
Divises
Linguagem SQL
3
A DDL possui diversos comandos bsicos:
CREATE TABLE
Cria uma nova tabela
ALTER TABLE
Altera uma tabela criada
DROP TABLE
Exclui a tabela
Divises DDL
Linguagem SQL
4
21/10/2010
3
Sintaxe:
Divises DDL CREATE TABLE
Linguagem SQL
5
CREATE TABLE nome-tabela (
nome-coluna tipo-de-dados [not null],
{nome-coluna tipo-de-dados [not null] },
[CONSTRAINT nome-restrio
UNIQUE nome-coluna
| PRIMARY KEY(nome-coluna {, nome-coluna})
| FOREIGN KEY (nome-coluna {, nome-coluna})
REFERENCES nome-tabela (nome-coluna)
[ON DELETE CASCADE | SET NULL | NO ACTION ],
[ON UPDATE CASCADE],
| CHECK (predicado) ]
[repetir CONSTRAINT]
)
Obs: elementos entre colchetes [] so facultativos.
Obs: elementos entre chaves {} indicam repetio.
Obs: o uso da barra | indica que pode-se escolher uma das opes.
Alguns tipos de dados comuns:
Char(n)
String de caracteres de tamanho fixo n
Varchar(n)
String de caracteres de tamanho varivel (mximo n)
Integer
Decimal(p,d)
tipo numrico com p dgitos
dos p dgitos, d dgitos representam casas decimais aps a vrgula
Date
data de calendrio (no MySQL o formato ano-mes-dia)
Timestamp
Data e hora (no MySQL o formato ano-mes-dia hora:min:seg)
Divises DDL CREATE TABLE
6
Linguagem SQL
21/10/2010
4
Exemplo: Criar as tabelas departamento e
empregado especificadas abaixo
Departamento(cod_depart, nome, ender)
Empregado(matr, nome, ender, cpf, salrio, lotao)
Divises DDL CREATE TABLE
7
Linguagem SQL
CREATE TABLE empregado (
matr INTEGER not null,
nome VARCHAR(45) not null,
ender VARCHAR(45),
cpf DECIMAL(11,0) not null,
salario DECIMAL(8,2) not null,
lotacao INTEGER not null,
CONSTRAINT pk_empreg
PRIMARY KEY (matr),
CONSTRAINT fk_empreg_depart
FOREIGN KEY (lotacao) REFERENCES departamento
(cod_depart)
)
CREATE TABLE departamento (
cod_depart INTEGER not null,
nome VARCHAR(20) not null,
ender VARCHAR(45),
CONSTRAINT pk_depart
PRIMARY KEY
(cod_depart)
)
Sintaxe alterao:
Sintaxe remoo:
Divises DDL ALTER/DROP TABLE
8
Linguagem SQL
ALTER TABLE nome-tabela
[ADD nome-coluna tipo de dados]
[DROP nome-coluna ]
[ADD CONSTRAINT nome-restrio]
[DROP CONSTRAINT nome-restrio]
[DROP PRIMARY KEY]
[repetir ADD ou DROP em qualquer ordem]
DROP TABLE nome-tabela
21/10/2010
5
A DML possui trs comandos bsicos:
INSERT
Insere uma tupla na tabela
UPDATE
Atualiza tuplas de uma tabela
DELETE
Remove tuplas de uma tabela
Divises DML
Linguagem SQL
9
Sintaxe:
Exemplo: inserir um novo departamento
Divises DML INSERT
Linguagem SQL
10
INSERT [INTO] nome_tabela [(lista_de_colunas))]
VALUES ( { DEFAULT | NULL | expr }[,...n] )
INSERT INTO departamento VALUES ( 10,Computao, Rua abc )
INSERT INTO departamento (nome, cod_depart) VALUES
(Computao, 10 )
INSERT INTO departamento VALUES ( 10,Computao, null )
Pode especificar dados
na ordem diferente das
colunas
21/10/2010
6
Sintaxe:
Exemplo: alterar o salrio de todos os empregados
Exemplo: alterar o salrio do empregado de matrcula 5
Exemplo: alterar o salrio e o departamento do
empregado de matrcula 5
Divises DML UPDATE
Linguagem SQL
11
UPDATE nome_tabela
SET nome_coluna = {expr | NULL | (subquery) }
{, nome_coluna = {expr | NULL | (subquery) }}
WHERE predicado
UPDATE empregado SET salario = 1000
UPDATE empregado SET salario = 1000, lotacao = 10 WHERE matr = 5
UPDATE empregado SET salario = 1000 WHERE matr = 5
Sintaxe:
Exemplo: excluir todos os departamentos
Exemplo: excluir o departamento de cdigo 10
Divises DML DELETE
Linguagem SQL
12
DELETE FROM nome_tabela
[WHERE predicado]
DELETE FROM departamento
DELETE FROM departamento WHERE cod_depart = 10
21/10/2010
7
Embora possua apenas um comando, a DQL
uma das divises mais importantes, pois
trata da busca por informaes no banco
O comando da DQL o:
SELECT
Seleciona um conjunto de tuplas de uma ou mais
tabelas, de acordo com o que foi passado para o
comando
Divises DQL
Linguagem SQL
13
Sintaxe:
Divises DQL SELECT
14
Linguagem SQL
SELECT [ALL | DISTINCT]
{* | expr [[AS] c_alias] {, expr [[AS] c_alias] }}
FROM
nome-tabela [[AS] qualificador]
{, nome-tabela [[AS] qualificador] }
WHERE
predicado
ALL Retorna todas as tuplas, inclusive repetidas (default)
DISTINCT Retorna apenas tuplas no repetidas
* Retorna todos os atributos (colunas) da(s) tabela(s)
expr Representa um atributo ou
Expresso matemtica envolvendo atributos das tabelas
FROM Produto cartesiano das tabelas
WHERE Predicado de seleo (limita o conjunto obtido)
21/10/2010
8
Exemplo:
Listar todos os dados de todos os empregados
Listar o nome e o salrio de todos os
empregados
Listar o nome e o salrio dos empregados com
salrio maior que 3000
Listar o nome e o salrio dos empregados com
salrio maior que 1000 e menor que 3000
Divises DQL SELECT
15
Linguagem SQL
SELECT * FROM empregado
SELECT nome, salario FROM empregado
SELECT nome, salario FROM empregado WHERE salario > 3000
SELECT nome, salario FROM empregado WHERE salario > 1000 AND salario
< 3000
Pode-se associar um alias para a tabela
Listar o nome e o salrio de todos os
empregados
Pode-se efetuar clculos na seleo e
associar novos alias para o resultado
Listar o nome e o salrio de todos os
empregados, sendo que o salrio apresenta uma
simulao de 15% a mais
Divises DQL SELECT
16
Linguagem SQL
SELECT e.nome, e.salario FROM empregado e
SELECT e.nome, (e.salario+e.salario*0.15) as total FROM empregado e
21/10/2010
9
Pode-se efetuar junes entre tabelas
Neste caso, necessrio lig-las pela chave
estrangeira para que no haja registros indevidos
Ex: listar o nome do empregado com seu
departamento
Divises DQL SELECT
17
Linguagem SQL
SELECT e.nome, d.nome as
depart FROM empregado e,
departamento d
SELECT e.nome, d.nome as
depart FROM empregado e,
departamento d
WHERE d.cod_depart = e.lotacao
A situao do slide anterior acontece porque o
SGBD realiza o produto cartesiano das duas
tabelas
Produto cartesiano: todos os registros
selecionados de uma tabela so combinados
com os da outra tabela
Para evitar que registros invlidos sejam
retornados, necessrio efetuar a juno das
tabelas
Especificar as clusulas de juno no comando
WHERE
Divises DQL SELECT
18
Linguagem SQL
21/10/2010
10
Para efetuar a comparao de strings, costuma-se utiliza o
operador like combinado com os operadores de padro (%
ou _)
Exemplo:
Selecionar os empregados cujo nome comea com Ra
Selecionar os empregados cujo nome comea com Ra, seguido de
uma letra qualquer e depois continua com ael
Selecionar os empregados cujo nome comea com qualquer letra,
depois tem a string afa e finaliza com qualquer substring
Divises DQL SELECT
19
Linguagem SQL
SELECT * FROM empregado WHERE nome LIKE ra%
SELECT * FROM empregado WHERE nome LIKE ra_ael
SELECT * FROM empregado WHERE nome LIKE _afa%
Pode-se aplicar uma ordenao nos registros
retornados utilizando o operador ORDER BY
ao final da clusula
Exemplo:
Selecionar todos os empregados ordenados pelo
nome
Selecionar todos os empregados ordenados em
ordem decrescente de salrio e depois por nome
Divises DQL SELECT
20
Linguagem SQL
SELECT * FROM empregado ORDER BY nome
SELECT * FROM empregado ORDER BY salario DESC, nome
21/10/2010
11
Funes agregadas:
Sintaxe:
No pode ser usada na clusula WHERE!!!
Divises DQL SELECT
21
Linguagem SQL
nome-da-funo (ALL | DISTINCT nome-coluna) | count(*)
sum Retorna o somatrio dos valores de uma coleo
avg Retorna a mdia dos valores de uma coleo
max Retorna o maior valor de uma coleo de valores
min Retorna o menor valor de uma coleo
count Retorna o nmero de elementos de uma coleo
Exemplo:
Encontre o montante da folha de pagamento da
empresa
Encontre a mdia salarial da empresa
Encontrar o nmero de empregados do
departamento computao
Divises DQL SELECT
22
Linguagem SQL
SELECT count(*) FROM empregado e, departamento d
WHERE e.lotacao = d.cod_depart AND d.nome like computao
SELECT avg(salario) FROM empregado
SELECT sum(salario) FROM empregado
21/10/2010
12
Pode-se ainda aplicar funes agregadas a
diferentes conjuntos de tuplas
Funo GROUP BY
Exemplo:
Selecionar o total de empregados por departamento
Obs: todas as colunas que aparecem na clusula
SELECT devem aparecer na clusula GROUP
BY
Divises DQL SELECT
23
Linguagem SQL
SELECT lotao, count(*) as qtde_emp
FROM Empregado
GROUP BY lotao
Crie um banco de dados chamado loja, contendo
as tabelas:
Produto (cdigo, descrio, valor)
Cliente (cpf, nome)
Venda (num_nota, cpf, cdigo_prod, qtde)
Insira valores para cada tabela
Efetue as seguintes consultas:
Buscar a descrio dos produtos j vendidos
Buscar o valor total de vendas cuja quantidade de
produtos da venda foi maior que 10
Buscar o valor total j comprado por cliente
Exerccios
24
Linguagem SQL

You might also like