Anda di halaman 1dari 12

Introdução a Linguagem SQL

Por Gilberto Hiragi

Introdução a Linguagem SQL

SQL (Structured Query Language)

A linguagem SQL é do tipo declarativa, diferentemente de Java, por exemplo, que é


imperativa, nesta linguagem o desenvolvedor não diz como as operações devem ser feitas, ele
informa à linguagem o que ele quer e o mecanismo interno da linguagem decidirá qual a melhor
forma de fazer o que foi pedido.

Este tutorial tem o objetivo de introduzir a linguagem SQL mostrando os comandos


mínimos e básicos para manipulação de banco de dados que trabalhe com o padrão ANSI.
Inicialmente iremos trabalhar com comandos da linguagem DDL(Data Definition Language) e
depois alguns comandos da DML (Data Manipulation Language).

Antes de iniciar o trabalho é importante lembrar que a nossa ênfase esta sobre o banco
MySQL.

DDL

Os comandos classificados deste tipo servem para alimentar os metadados do banco de


dados. Eles explicitam como serão os dados, seus tipos e tamanhos, além das restrições de
chaves. São os comandos executados antes de começar a real alimentação do banco de dados.

Create database <banco>

Cria um novo esquema, dentro de um esquema podemos armazenar tabelas, por


exemplo, relacionadas a um determinado sistema de informação. Lembrem-se que esquema é
uma divisão lógica dentro de um mesmo servidor, portanto um servidor pode conter mais de uma
base de dados.

Exemplo(s):

CREATE DATABASE MeuBanco

Drop database <banco>

Elimina um esquema do SGBD (Sistema Gerenciador de Banco de Dados), este comando


deve ser executado com cuidado, já que irá eliminar também todas as tabelas existentes no
esquema. É um comando dificilmente executado depois que temos um banco em produção.

Por Gilberto Hiragi


Página 1 de 12
Introdução a Linguagem SQL
Por Gilberto Hiragi

Exemplo(s):

DROP DATABASE MeuBanco

Use database <banco>

Troca o esquema atual, ou seja, seta o esquema passado como parâmetro como default.
Na prática isso quer dizer que os comandos subseqüentes irão ser executados sobre o banco
escolhido.

Exemplo(s):

USE MeuBanco

Create table <tabela>(


<campo1 tipo1> [,
<campo2 tipo2> , ... ],
[<restrições>]
)

Cria uma nova tabela, ou seja, a estrutura da mesma, descrevendo os campos que
comporão os registros desta tabela. A tabela será criada dentro do esquema que estiver setado
como esquema default. Aqui dizemos como as entidades serão abstraídas para o banco, quais os
tipos de cada atributo e podemos informar sobre as restrições de chave.

Alguns tipos de campo utilizados são:

Tipo Contém Exemplo


varchar String: “ABCD” Varchar(50), Varchar(10)
decimal double: 12.1, 15.5 Decimal(8), Decimal (10,2)
integer int: 4, 107 Integer, Integer(4)
Date Date: 2006-08-25 Date
boolean boolean: true ou false boolean

Também podemos introduzir restrições ao uso da tabela e seus campos:

• Para definir campos obrigatórios usamos após o tipo do campo a expressão “NOT NULL”,
se quiser definir explicitamente que o campo pode ser nulo coloque após o tipo do campo
“NULL”, que é o qualificador default.

• Para definir uma chave primária usamos ao final da definição dos campos a expressão
“PRIMARY KEY (<campo1> [, <campo2>, ...])”, a melhor forma e mais documentada cria
uma constrainf restrição nomeada para melhor gerenciar.

Por Gilberto Hiragi


Página 2 de 12
Introdução a Linguagem SQL
Por Gilberto Hiragi

• Para definir uma chave estrangeira usamos ao final da definição dos campos a expressão
“FOREIGN KEY (<campotabela>) REFERENCES <tabelaorigem (<campo>)>”, da mesma
forma que na chave primária é melhor criar uma constraint nomeada.

• Para definir uma chave única usamos ao final da definição dos campos a expressão
“UNIQUE KEY (<campotabela>, [<campotabela2, ...>])”, da mesma forma que na chave
primária é melhor criar uma constraint nomeada.

• Podemos também definir um campo onde o valor da chave seja criado automaticamente,
neste caso o campo deverá ser numérico, por exemplo, do tipo “integer”, também
devemos colocar a expressão “AUTO_INCREMENT” após o tipo do campo.

• Podemos criar uma restrição conforme uma expressão booleana qualquer, usando
inclusive as funções disponíveis no SGBD, usamos a clausula “CHECK” para criar a
restrição por expressão booleana.

Exemplo(s):

CREATE TABLE TiposProduto(


Id_TipoProd INTEGER AUTO_INCREMENT,
Descricao VARCHAR(50) NOT NULL,
CONSTRAINT pkTiposProduto PRIMARY KEY(idTipoProd),
CONSTRAINT ckDescricao CHECK (len(descricao)>3)
)

CREATE TABLE Produtos(


Id_Prod INTEGER AUTO_INCREMENT,
Cd_TipoProd INTEGER NOT NULL,
descricao VARCHAR(50) NOT NULL,
dt_Validade DATE NOT NULL,
preco DECIMAL(10,2) NOT NULL,
CONSTRAINT pkProdutos PRIMARY KEY(idProd),
CONSTRAINT fkTiposProduto_Produto FOREIGN
KEY(cd_TipoProd)
REFERENCES Tiposproduto(id_TipoProd),
CONSTRAINT ckDescricao CHECK (len(descricao)>2),
CONSTRAINT ckPreco CHECK (preco>0)
)

Por Gilberto Hiragi


Página 3 de 12
Introdução a Linguagem SQL
Por Gilberto Hiragi

Drop table <tabela>

Elimina a tabela com nome especificado, esta tabela deve estar no esquema atualmente
em uso. Este comando deve ser usado com critério visto que além da estrutura da tabela também
são eliminados os registros da tabela (dados).

Exemplo(s):

DROP TABLE MinhaTabela

Alter table <tabela> <[add campo tipo | drop campo>

Altera a estrutura de uma tabela, adicionando ou removendo campos, adicionando ou


removendo restrições (constraint). Para adicionar usamos a clausula “add”, já para eliminar um
usamos a clausula “DROP”.

Exemplo(s):

ALTER TABLE Produtos ADD estoqueMinimo INTEGER

ALTER TABLE Produtos DROP dt_validade

ALTER TABLE Produtos ADD CONSTRAINT ckEstoqueMinimo CHECK


(estoqueMinimo>0)

Rename table <tabela> to <novo_nome_tabela>

Altera o nome de uma tabela.

Exemplo(s):

RENAME TABLE TiposProduto TO tipos_produto

DML

Passaremos agora a explorar quatro comandos que manipulam dados armazenados no


SGBD. Os comandos a seguir atuam sobre os dados do banco de dados, ou seja, sobre as linhas
(registros) que estão armazenados sob a estrutura das tabelas. Estes são os comandos
normalmente encontrados em aplicações que interagem com o SGBD.

Os quatro comandos são: INSERTO, SELECT, UPDATE e DELETE.

Por Gilberto Hiragi


Página 4 de 12
Introdução a Linguagem SQL
Por Gilberto Hiragi

Para os exemplos a seguir considere as seguintes tabelas com mais alguns campos:

CREATE TABLE TiposProduto(


Id_TipoProd INTEGER AUTO_INCREMENT,
Descricao VARCHAR(50) NOT NULL,
CONSTRAINT pkTiposProduto PRIMARY KEY(idTipoProd),
CONSTRAINT ckDescricao CHECK (len(descricao)>3)
)

CREATE TABLE Produtos(


Id_Prod INTEGER AUTO_INCREMENT,
cd_TipoProd INTEGER NOT NULL,
descricao VARCHAR(50) NOT NULL,
valorUnit DECIMAL(8,2) NULL,
qtdEstoque INTEGER NULL,
dt_Validade DATE NOT NULL,
preco DECIMAL(10,2) NOT NULL,
CONSTRAINT pkProdutos PRIMARY KEY(idProd),
CONSTRAINT fkTiposProduto_Produto FOREIGN
KEY(cd_TipoProd)
REFERENCES Tiposproduto(id_TipoProd),
CONSTRAINT ckDescricao CHECK (len(descricao)>2),
CONSTRAINT ckPreco CHECK (preco>0)
)

Insert into <tabela> (campo-1, ..., campo-n) values (valor-1, ..., valor-n)

Insere dados em uma tabela. Inserir dados em uma tabela significa incluir uma linha na
tabela, veja que para isso ocorrer os dados inseridos devem respeitar as regras que foram
definidas na estrutura da tabela. Não se pode esquecer que é necessário sempre definir a
estrutura da tabela, assim como suas restrições que guiarão os comandos DDL.

Exemplo(s):

INSERT INTO TiposProduto (descricao) VALUES ('Hortaliças')

INSERT INTO TiposProduto (descricao) VALUES ('Condimentos')

INSERT INTO TiposProduto (descricao) VALUES


('Eletrodomesticos')

INSERT INTO TiposProduto (descricao) VALUES


('Informática'), ('Cereais'), ('Massas')

Por Gilberto Hiragi


Página 5 de 12
Introdução a Linguagem SQL
Por Gilberto Hiragi

INSERT INTO Produtos (cdTipoProd, descricao, valorUnit, qtdEstoque, dt_Validade, preco)


VALUES (1,'Alface',0.60, 100, '0000-00-00',1.00)

INSERT INTO Produtos (cdTipoProd, descricao, valorUnit, qtdEstoque, dt_Validade, preco)


VALUES (1,'Couve',0.80, 80, '0000-00-00',1.25)

INSERT INTO Produtos (cdTipoProd, descricao, valorUnit, qtdEstoque, dt_Validade, preco)


VALUES (2,'Sal',1.00, 200, '0000-00-00',1.69)

INSERT INTO Produtos (cdTipoProd, descricao, valorUnit, qtdEstoque, dt_Validade, preco)


VALUES (3,'TV 14 Pol',249.99, 50, '2010-02-01',315.99)

INSERT INTO Produtos (cdTipoProd, descricao, valorUnit, qtdEstoque, dt_Validade, preco)


VALUES (3,'TV 21 Pol Tela Plana',411.00, 60, '2010-02-01',599.99)

INSERT INTO Produtos (cdTipoProd, descricao, valorUnit, qtdEstoque, dt_Validade, preco)


VALUES (3,'TV 29 Pol Tela Plana',700.00, 80, '2010-02-01',999.99)

INSERT INTO Produtos (cdTipoProd, descricao, valorUnit, qtdEstoque, dt_Validade, preco)


VALUES (4,'Monitor LCD 15 Pol',389.50, 5, '2009-02-01',612.99);

Select <campo-1, ..., campo-n>


from <tabela-1, ..., tabela-n>
where <expressão-lógica>
group by <campo-1, ..., campo-n>
order by <campo-1, ..., campo-n>

Permite seleção de registros de uma ou mais tabelas. Este comando é bastante poderoso,
pois permite seleções filtradas, seleções consolidadas e seleções com relacionamento de mais de
uma tabela. Os Selects podem diminuir bastante o trabalho de um desenvolvedor.

Exemplo(s):

Listar as descrições de todos os produtos:


SELECT descricao FROM Produtos

Listar todos os campos e todos os registros da tabela produtos:


SELECT * FROM Produtos

Listar todos os campos da tabela produtos que tiverem estoque baixo (<10):
SELECT * FROM Produtos WHERE qtdEstoque<10

Por Gilberto Hiragi


Página 6 de 12
Introdução a Linguagem SQL
Por Gilberto Hiragi

Listar todos os campos da tabela que tiverem valor unitário maior que 0.50 e menor que 1.00:
SELECT * FROM Produtos WHERE valorUnit>0.50 AND
valorUnit<1.00

Listar todos os campos de tipos de produto ordenados pela descrição:


SELECT * FROM TiposProduto ORDER BY descricao

Listar todos os campos de produtos ordenados da maior quantidade em estoque para menor:
SELECT * FROM Produtos ORDER BY qtdEstoque DESC

Listar a descrição tanto de tipos de produtos, quanto de produtos, fazendo a relação correta entre
os dois:
SELECT a.descricao, b.descricao
ROM TiposProduto as a, Produtos as b
WHERE a.id_TipoProd=b.cd_TipoProd

O mesmo da seleção anterior acrescentando o campo valor_unit e informado que será ordenado
por ele:
SELECT a.descricao, b.descricao, valorUnit
FROM TiposProduto as a, Produtos as b
WHERE a.id_TipoProd=b.cd_TipoProd
ORDER BY valorUnit

Listar a quantidade de registros da tabela de produtos:


SELECT COUNT(id_Prod) as NumReg FROM Produtos

Listar as descrições dos tipos de produtos e a quantidade de produtos associada ao tipo:


SELECT a.descricao, COUNT(idProd) as NumProd
FROM TiposProduto a, Produtos b
WHERE a.id_TipoProd=b.cd_TipoProd
GROUP BY a.descricao

Listar o maior valor unitário:


SELECT MAX(valorUnit) as maiorValorUnit
FROM Produtos

Listar o menor valor unitário:


SELECT MIN(valorUnit) as menorValorUnit
FROM Produtos

Listar a média do valor unitário dos produtos:


SELECT AVG(valorUnit) as mediaValorUnit
FROM Produtos

Listar todos os produtos que custam entre 100 e 500:


SELECT * FROM Produtos
WHERE valorUnit BETWEEN 100 AND 500

Por Gilberto Hiragi


Página 7 de 12
Introdução a Linguagem SQL
Por Gilberto Hiragi

Listar todos os campos de todos os produtos por ordem do que tem maior valor armazenado
SELECT *, (valorUnit*qtdEstoque) as total
FROM Produtos
ORDER BY total DESC

Listar todos os produtos que tenham na descrição a substring “TV”:


SELECT *
FROM Produtos
WHERE descricao like '%TV%'

Listar todos os produtos que sejam do tipo 1 e que também estejam com estoque baixo, menos de
10 unidades:
SELECT * FROM Produtos WHERE cd_TipoProd=1 and
qtdEstoque<10

Listar o total de unidades que existe de cada tipo de produto:


SELECT a.descricao, SUM(qtdEstoque) as totalEstoque
FROM TiposProduto a, Produtos b
WHERE a.id_TipoProd=b.cd_TipoProd
GROUP BY a.descricao

Listar todos os tipos de produto que não tem produto associado a ele:
SELECT * FROM TiposProduto
WHERE id_TipoProd NOT IN
(SELECT DISTINCT cd_TipoProd FROM Produtos)

Listar todos os tipos de produtos que tem produto(s) associado(s) a ele:


SELECT * FROM TiposProduto
WHERE id_TipoProd IN
(SELECT DISTINCT cd_TipoProd FROM Produtos)

Update <tabela> set campo-1=valor-1, ... campo-n=valor-n where <expressão-lógica>

Modifica dados de uma tabela. O desenvolvedor deve especificar quais campos e valores
devem ser alterados, assim como fornecer uma condição capaz de individualizar o conjunto de
registros que devem ser afetados, o uso de Update sem Where pode ser desastroso, já que
modifica todos os registros da tabela. O Update irá fazer uma varredura na tabela procurando
pelas linhas que satisfazem a condição lógica. Nas linhas verdadeiras serão aplicadas às
alterações.

Exemplo(s):

UPDATE TiposProduto SET descricao=’HortiFrutiGrajeiros’


WHERE id_TipoProd=1

Por Gilberto Hiragi


Página 8 de 12
Introdução a Linguagem SQL
Por Gilberto Hiragi

UPDATE Produtos SET qtdEstoque=qtd_Estoque-1 WHERE


id_prod=1

UPDATE Produtos SET valor_unit=valor_unit*1.05

Delete from <tabela> where <expressão-lógica>

Elimina registros de uma tabela. A chave esta na expressão lógica que permitirá filtrar
qual conjunto de registros devem ser apagados, mais uma vez é desastroso usar o delete sem a
clausula where bem definida. Note que o comando delete não possui lista de campos, já que
sempre é uma linha inteira que será excluída. Note que é possível executar o comando delete e
este não apagar nenhuma linha, neste caso o teste booleano para todas as linhas foi falso.

Exemplo(s):

DELETE FROM Produtos WHERE id_prod=5

DELETE FROM Produtos WHERE qtd_estoque=0

EXERCÍCIO PRÁTICO

Exemplo com migração de dados de uma tabela não normalizada para um esquema apropriado:

Tabela não normalizada:

CREATE TABLE Catalogos(


IdCat INT AUTO_INCREMENT,
nomeForn VARCHAR(50) NOT NULL,
nomeProd VARCHAR(50) NOT NULL,
preco DECIMAL(8,2) NOT NULL,
telefone VARCHAR(20) NOT NULL,
CONSTRAINT pk_cat PRIMARY KEY (idCat)
)

Inserção de dados na tabela não normalizada com defeitos:

INSERT INTO Catalogos(nomeforn, nomeProd, preco, telefone) VALUES


('AC Metais', 'Janela 1.2 x 2m', 234, '(61)33456521'),
('AC-Metais', 'Porta 0.8 x 2.1m', 180, '61-3345-6521'),
('Beabá Materiais', 'Porta 80 x 210cm', 178, '61-3348-6620'),
('Beabá Materiais', 'janela 150 x 200cm', 256, '61-3348-6620'),

Por Gilberto Hiragi


Página 9 de 12
Introdução a Linguagem SQL
Por Gilberto Hiragi

('Beabá Materiais', 'Tinta Acrilica 20lt', 78, '61-3348-6620')

Tarefas:

1) Preparação dos dados

Nesta etapa devemos analisar os dados, procurar por imperfeições de digitação e deixar o
mais padronizado possível, o uso de SELECTs de vários tipos e UPDATE são os principais
nesta fase.

1.1) A empresa se chama “AC Metais”:

UPDATE Catalogos SET nomeForn='AC Metais' WHERE nomeForn like '%Metais%'

1.2) Vamos padronizar todas as medidas para metro nos produtos:

UPDATE Catalogos SET nomeProd='Porta 0.8 x 2.1m' WHERE idCat=3

UPDATE Catalogos SET nomeProd='Janela 1.5 x 2m' WHERE idCat=4;

1.3) Padronizar os telefones para 99-9999-9999:

UPDATE Catalogos SET telefone='61-3345-6521' WHERE idCat=1

2) Desenhar um modelo normalizado:

3) Criar a nova estrutura que conterá os dados da origem desnormalizada:

CREATE TABLE Forn(


idForn INT AUTO_INCREMENT,
nomeForn VARCHAR(50) NOT NULL,

Por Gilberto Hiragi


Página 10 de 12
Introdução a Linguagem SQL
Por Gilberto Hiragi

telefone VARCHAR(20) NOT NULL,


CONSTRAINT pk_forn PRIMARY KEY (idForn)
)

CREATE TABLE prod(


idprod INT AUTO_INCREMENT,
nomeProd VARCHAR(50) NOT NULL,
CONSTRAINT pk_prod PRIMARY KEY (idProd)
)

CREATE TABLE Cat(


idForn INT NOT NULL,
idprod INT NOT NULL,
preco DECIMAl(8,2) NOT NULL,
CONSTRAINT pk_cat PRIMARY KEY (idForn, idProd),
CONSTRAINT fk_forn_cat FOREIGN KEY (idForn) REFERENCES Forn(idForn),
CONSTRAINT fk_prod_cat FOREIGN KEY (idprod) REFERENCES prod(idProd)
)

• Note que a ordem de criação é importante, já que na definição das chaves estrangeiras
fazemos referência a tabela mãe.

4) Migrar os dados da origem para a nova estrutura:

4.1) Migrar dados de fornecedor:

INSERT INTO Forn(nomeForn, telefone)


SELECT distinct nomeForn, telefone FROM Catalogos

4.2) Migrar dados de produtos:

INSERT INTO Prod(nomeProd)


SELECT distinct nomeProd FROM Catalogos

4.3) Migrar dados de catalogo, puxar as chaves da nova estrutura criada:

INSERT INTO Cat (idForn, idProd, preco)


SELECT Forn.idForn, Prod.idProd, preco
FROM Forn, Prod, Catalogos
WHERE Forn.nomeForn=Catalogos.nomeForn AND
Prod.nomeProd=Catalogos.nomeProd

5) Verificar se os dados foram migrados com sucesso:

Por Gilberto Hiragi


Página 11 de 12
Introdução a Linguagem SQL
Por Gilberto Hiragi

SELECT * FROM Forn

SELECT * FROM Prod

SELECT * FROM Cat

SELECT nomeForn, nomeProd, preco, telefone


FROM Cat, Forn, Prod
WHERE Cat.idForn=Forn.idForn AND Cat.idProd=Prod.idProd

• Notem que normalizamos para minimizar os erros na entrada de dados


• Também veja que depois desnormalizamos, através de consultas com JOIN, para mostrar
da forma como o usuário espera. A diferença é que esta desnormalização é apenas rotina
interna do banco, os dados continuam armazenados de forma organizada.

Por Gilberto Hiragi


Página 12 de 12

Anda mungkin juga menyukai