DML
Linguagem de Manipulação de Dados (ou DML, de Data Manipulation Language) é uma família de linguagens de computador utilizadas para a recuperação, inclusão, remoção e modificação de informações em bancos de dados. Pode ser procedural, que especifica como os dados devem ser obtidos do banco; pode também ser declarativa (não procedural), em que os usuários não necessitam especificar o caminho de acesso, isto é, como os dados serão obtidos. O padrão SQL é não procedural. DMLs foram utilizadas inicialmente apenas por programas de computador, porém (com o surgimento da SQL) também têm sido utilizadas por pessoas.
INSERT
- É utilizado o comando INSERT para inserir linhas nas tabelas:
INSERT INTO clima VALUES ('São Francisco', 46, 50, 0.25, '1994-11-27');
- Reparem que todos os tipos de dado possuem formato de entrada de dados bastante óbvios
- As constantes, que não são valores numéricos simples, geralmente devem estar entre apóstrofos ('), como no exemplo acima
- O tipo date é, na verdade, muito flexível em relação aos dados que aceita
- O tipo point requer um par de coordenadas como entrada, como mostrado abaixo:
INSERT INTO cidades VALUES ('São Francisco', '(-194.0, 53.0)');
- A sintaxe usada até agora requer que seja lembrada a ordem das colunas. Uma sintaxe alternativa permite declarar as colunas explicitamente:
INSERT INTO clima (cidade, temp_min, temp_max, prcp, data)
VALUES ('São Francisco', 43, 57, 0.0, '1994-11-29');
- Se for desejado, pode-se declarar as colunas em uma ordem diferente, ou mesmo, omitir algumas colunas. Por exemplo, se a precipitação não for conhecida:
INSERT INTO clima (data, cidade, temp_max, temp_min)
VALUES ('1994-11-29', 'Hayward', 54, 37);
- Muitos desenvolvedores consideram que declarar explicitamente as colunas é melhor que confiar na ordem implícita.

SELECT
- Para trazer os dados de uma tabela, a tabela deve ser consultada
- Para esta finalidade é utilizado o comando SELECT do SQL. Este comando é dividido em:
- lista de seleção (a parte que especifica as colunas a serem trazidas)
- lista de tabelas (a parte que especifica as tabelas de onde os dados vão ser trazidos)
- uma qualificação opcional (a parte onde são especificadas as restrições)

- Por exemplo, para trazer todas as linhas da tabela clima digite:
SELECT * FROM clima;
Aqui o * é uma forma abreviada de "todas as colunas".
SELECT cidade, temp_min, temp_max, prcp, data FROM clima;
A saída deve ser:
cidade | temp_min | temp_max | prcp | data ----------------+----------+----------+------+------------ São Francisco | 46 | 50 | 0.25 | 1994-11-27 São Francisco | 43 | 57 | 0 | 1994-11-29 Hayward | 37 | 54 | | 1994-11-29 (3 linhas)
Na lista de seleção podem ser especificadas expressões, e não apenas referências a colunas. Por exemplo, pode ser escrito
SELECT cidade, (temp_max+temp_min)/2 AS temp_media, data FROM clima;
cidade | temp_media | data ----------------+------------+------------ São Francisco | 48 | 1994-11-27 São Francisco | 50 | 1994-11-29 Hayward | 45 | 1994-11-29 (3 linhas)
Perceba que a cláusula AS foi utilizada para mudar o nome da coluna de saída (a cláusula AS é opcional).
A consulta pode ser "qualificada", adicionando a cláusula WHERE para especificar as linhas desejadas. A cláusula WHERE contém expressões booleanas (valor verdade), e somente são retornadas as linhas para as quais o resultado da expressão booleana for verdade. São permitidos os operadores booleanos usuais (AND, OR e NOT) na qualificação. Por exemplo, o comando abaixo mostra o clima de São Francisco nos dias de chuva:
SELECT * FROM clima WHERE cidade = 'São Francisco' AND prcp > 0.0;
Resultado:
cidade | temp_min | temp_max | prcp | data
----------------+----------+----------+------+------------
São Francisco | 46 | 50 | 0.25 | 1994-11-27
(1 linha)
Pode ser solicitado que os resultados da consulta sejam retornados em uma determinada ordem:
SELECT * FROM clima
ORDER BY cidade;
cidade | temp_min | temp_max | prcp | data
----------------+----------+----------+------+------------
Hayward | 37 | 54 | | 1994-11-29
São Francisco | 43 | 57 | 0 | 1994-11-29
São Francisco | 46 | 50 | 0.25 | 1994-11-27
Neste exemplo a ordem de classificação não está totalmente especificada e, portanto, as linhas de São Francisco podem retornar em qualquer ordem. Mas sempre seriam obtidos os resultados mostrados acima se fosse executado:
SELECT * FROM clima ORDER BY cidade, temp_min;
Pode ser solicitado que as linhas duplicadas sejam removidas do resultado da consulta:
SELECT DISTINCT cidade FROM clima; cidade --------------- Hayward São Francisco (2 linhas)
Novamente, neste exemplo a ordem das linhas pode variar. Pode-se garantir resultados consistentes utilizando DISTINCT e ORDER BY juntos:
SELECT DISTINCT cidade FROM clima ORDER BY cidade;

Até agora as consultas somente acessaram uma tabela de cada vez. As consultas podem acessar várias tabelas de uma vez, ou acessar a mesma tabela de uma maneira que várias linhas da tabela sejam processadas ao mesmo tempo. A consulta que acessa várias linhas da mesma tabela, ou de tabelas diferentes, de uma vez, é chamada de consulta de junção. Como exemplo, suponha que se queira listar todas as linhas de clima junto com a localização da cidade associada. Para fazer isto, é necessário comparar a coluna cidade de cada linha da tabela clima com a coluna nome de todas as linhas da tabela cidades, e selecionar os pares de linha onde estes valores são correspondentes.
Nota: Este é apenas um modelo conceitual, a junção geralmente é realizada de uma maneira mais eficiente que realmente comparar cada par de linhas possível, mas isto não é visível para o usuário.
Esta operação pode ser efetuada por meio da seguinte consulta:
SELECT *
FROM clima, cidades
WHERE cidade = nome;
cidade | temp_min | temp_max | prcp | data | nome | localizacao
----------------+----------+----------+------+------------+---------------+-------------
São Francisco | 46 | 50 | 0.25 | 1994-11-27 | São Francisco | (-194,53)
São Francisco | 43 | 57 | 0 | 1994-11-29 | São Francisco | (-194,53)
(2 linhas)
Duas coisas devem ser observadas no conjunto de resultados produzido:
Não existe nenhuma linha de resultado para a cidade Hayward. Isto acontece porque não existe entrada correspondente na tabela cidades para Hayward, e a junção ignora as linhas da tabela clima sem correspondência. Veremos em breve como isto pode ser corrigido.
Existem duas colunas contendo o nome da cidade, o que está correto porque a lista de colunas das tabelas clima e cidades estão concatenadas. Na prática isto não é desejado, sendo preferível, portanto, escrever a lista das colunas de saída explicitamente em vez de utilizar o *:
Exercício A
- 01. Abra seu SGBD
- 02. Crie a tabela Climas
- 03. Insira dados coletados na Web sobre as seguintes cidades
- Belo Horizonte
- Cuiabá
- Curitiba
- Fortaleza
- Uberlândia
- 04. Crie a tabela Cidades com os seguintes campos:
- Nome(Str) , Habitantes (Int) , NomeEstado (Str), Aniversário (Date) , Area (Km2) (Float)
- 05. Insira dados na tabela acima
- 06. Crie os índices nome e Aniversário
- 07. Altere o nome do Campo Habitantes para NroHabitantes
- 08. Crie a tabela Eventos com os seguintes campos:
- NomeEvento (Str) , Data (Date) , Horário (Int), Local (Str), Preço (Float)
- 09. Insira dados de eventos quaisquer para as cidades
- 10. Gere um relatório mostrando os dados da Cidade
- 11. Gere um relatório mostrando apenas Nome, Estado e Area das Cidades
- 12. Gere um relatório mostrando Nome, NomeEstado e Area das Cidades em ordem alfabética de Nome
- 13. Gere um relatório mostrando Nome, NomeEstado e Area das Cidades em ordem descendente de Nome
- 14. Gere um relatório com as cidades que possuem eventos (Sem duplicidade)
- 15. Gere uma view com as cidades de Minas Gerais
- 16. Gere uma view com todos os dados de Cidades (Nome e Data Fundação) com seus eventos
- 17. Exclua a cidade de Curitiba
- 18. Recupere a tabela com a cidade de Curitiba
- 19. Inclua a tabela Estados com os seguintes campos:
- UF (Int), NomeEstado (Str), Regiao (Str)
- 20. Insira 2 estados da região sudeste na tabela Estados
- 21. Gere uma view que mostre os novos dados apenas da Região Sudeste
- 22. Inclua os demais estados do Brasil
- 23. Mostre novamente os dados da view Estados
Exercício B
- Desenvolver uma seleção de registros com mais de duas tabelas envolvidas.
- A. Crie a estrutura de 3 tabelas
- B. Insira dados quaisquer em cada uma delas
- C. Mostre o Select * from Tabela em cada uma delas
- D. Feito isso, escreva o comando que permite gerar o resultados sobre as 3 ou mais tabelas ao mesmo tempo.
- E. Mostre o resultado.
- Use a visão abaixo:


- Mostrar Isbn, Titulo do Livro e Nome da Editora
- SELECT Livro.isbn, Livro.titulo, Editora.Nome
- FROM Livro
- INNER JOIN Editora
- ON Livro.Editora = Editora.CodEditora
- Mostrar Isbn, Titulo do Livro, Nome da Area e Nome da Editora
- SELECT Livro.isbn, Livro.titulo, Editora.Nome, Area.Area
- FROM Livro
- INNER JOIN Editora, Area
- ON Livro.Editora = Editora.CodEditora and Livro.Area = Area.CodArea
- Mostrar Isbn, Titulo do Livro, Nome da Area, Nome e CodBairro da Editora
- SELECT Livro.isbn, Livro.titulo, Editora.Nome, Area.Area, Cep.CodBairro
- FROM Livro
- INNER JOIN Editora, Area, Cep
- ON Livro.Editora = Editora.CodEditora and Livro.Area = Area.CodArea and Editora.Cep = Cep.Cep
- Usando "LEFT JOIN" - Vítor e Marcelo
- 1° query:
- Select livro.isbn, livro.titulo, editora.nome
- from livro
- left join editora
- on livro.editora = editora.codeditora;
- 2° query:
- Select livro.isbn, livro.titulo, editora.nome, area.area
- from livro
- left join editora
- on livro.editora = editora.codeditora left join area on livro.area = aera.cdoarea;
- 3° query:
- Select livro.isbn, livro.titulo, editora.nome, area.area, cep.codbairro
- from livro
- left join editora
- on livro.editora = editora.codeditora left join area on livro.area = aera.cdoarea left join cep on editora.cep = cep.cep;
- 1° query:
Exercício C
- Desenvolver uma seleção de registros com mais de duas tabelas envolvidas.
- A. Crie a estrutura de 3 tabelas
- B. Insira dados quaisquer em cada uma delas
- C. Mostre o Select * from Tabela em cada uma delas
- D. Feito isso, escreva o comando que permite gerar o resultados sobre as 3 tabelas ao mesmo tempo.
- E. Mostre o resultado.
- Use a segunda visão acima.
Arquivo:BDA - SQL - Planilha de Dados.pdf
Exercício D
- Avalie e entenda a diferença entre os dois Selects abaixo:
W3Schools Usando Innerjoin
- Mostrar Nome do Empregado, Nro do Pedido e Nome do Cliente
- SELECT Employees.FirstName, Employees.LastName, Orders.OrderID, Orders.CustomerID, Customers .CustomerName
- FROM Employees
- Inner join Orders, Customers
- where Employees.EmployeeID = Orders.EmployeeID and Orders.CustomerID = Customers .CustomerID
W3Schools Usando Lef tJoin
- SELECT Employees.FirstName, Employees.LastName, Orders.OrderID, Orders.CustomerID, Customers .CustomerName
- FROM Employees
- left join Orders, Customers
- where Employees.EmployeeID = Orders.EmployeeID and Orders.CustomerID = Customers .CustomerID
- O left join seleciona todos os dados da primeira tabela, independente se houver ou não um dado correspondente nas outras.
- Por exemplo, se existir um empregado na tabela Employees que não estiver na tabela Orders, ele será mostrado com o left join, mas não será mostrado com o inner join.
W3Schools Usando CREATE VIEW
- CREATE VIEW Orders_Customers AS SELECT * FROM Orders,Customers WHERE Orders.CustomerID = Customers.CustomerID;
- SELECT Employees.FirstName, Employees.LastName, Orders_Customers.OrderID, Orders_Customers.CustomerID, Orders_Customers.CustomerName
- FROM Employees, Orders_Customers
- WHERE Employees.EmployeeID = Orders_Customers.EmployeeID