1.264 Aula 7 Introdução ao SQL
Linguagem Estruturada de Consulta (SQL) Aula 7 SELECT, INSERT, DELETE, UPDATE Junções Aula 8 Subconsultas Visões (tabelas virtuais) Índices Transações Segurança Desempenho
SQL A linguagem estruturada de consulta (SQL) é utilizada para: Definição de dados: tabelas e visões (tabelas virtuais) Recuperação de dados: pelo usuário (consultas ad hoc ) ou programa Manipulação de dados: o usuário ou programa pode adicionar, excluir ou alterar os dados Controle de acesso Compartilhamento de dados: pelos usuários concorrentes Integridade de dados: pela definição de restrições de integridadeessas características são combinadas para obter Não é uma linguagem completa como Java, Visual Basic ou C++ A SQL é uma sublinguagem com cerca de 30 comandos Normalmente incorporada em outra linguagem ou ferramenta para acesso a bancos de dados A SQL tem várias inconsistências; NULLs são problemáticos Portável entre sistemas operacionais e entre fornecedores (parcial)
Aspectos variáveis entre as implementações de SQL Códigos de erro Tipos de dados suportados (data/hora, moeda, variações de strings ) Tabelas do sistema, sobre a estrutura do próprio banco de dados SQL interativa Interface de programação: nenhum fornecedor segue o padrão SQL dinâmica, utilizada em geradores de relatórios e ferramentas de consulta Variações definidas pelo implementador dentro do padrão Inicialização, abertura e conexão do banco de dados.
Tipos dos comandos básicos de SQL Tipos básicos SELECT INSERT UPDATE DELETE SELECT é o mais importante e complexo. Utilizado para: Recuperação de dados (em formulários, relatórios, consultas e programas) Como parte do INSERT, para produzir novas linhas Como parte do UPDATE, para atualizar linhas Como parte do DELETE, para remover linhas
SQL SELECT O comando SELECT é construído com cláusulas para obter colunas e linhas de uma ou mais tabelas e visões. As cláusulas devem estar nessa ordem: SELECT colunas FROM tabela ou visão INTO nova tabela WHERE linhas específicas ou uma junção são(é) criada(s) GROUP BY condições de agrupamento (colunas) HAVING propriedade do grupo (linhas específicas) ORDER BY critério de ordenação
Exemplos de tabelas
Exemplo de esquema
Consultas em SQL: SELECT Listar os representantes de vendas SELECT Name, Sales, Quota FROM SalesReps; Localizar o valor de cada representante acima ou abaixo da quota SELECT Name, Sales, Quota, (Sales-Quota) FROM SalesReps; Localizar os folgados SELECT Name, Sales, Quota, (Sales-Quota) FROM SalesReps WHERE Sales < Quota;É possível listar o cliente somente uma vez?
Consultas em SQL: cálculo, inserção, exclusão, atualização Calcular Valor Médio de Vendas SELECT AVG(Amt) FROM Orders; Calcular o valor médio das vendas a um Cliente SELECT AVG(Amt) FROM Orders WHERE Cust = 211; Incluir um escritório INSERT INTO Offices (OfficeNbr, City, Region, Target, Sales) VALUES ( 55, Dallas, West, 200000, 0); Excluir um cliente DELETE FROM Customers WHERE Company = Connor Co ; Aumentar um limite de crédito SET CreditLimit = 75000 WHERE Company = Amaratunga Enterprises ;
SELECT: * e duplicidades Seleção de todas as colunas (campos) SELECT * FROM Offices; Linhas duplicadas: a consulta obterá duas instâncias de West SELECT Region FROM Offices; Eliminação de duplicidades: (Os assistentes do MS Access utilizam a palavra-chave não-padrão DISTINCTROW, a qual é diferente de DISTINCT, quando houver junções)
NULLs Os valores NULL são avaliados como NOT TRUE em todos os casos. Inserir NewRep com quota NULL (em branco ou vazia) As duas consultas a seguir não fornecem todos os representantes de vendas: SELECT Name FROM SalesReps WHERE Sales > Quota; SELECT Name FROM SalesReps WHERE Sales <= Quota; Um novo representante com quota NULL não aparecerá em nenhuma lista Verificar NULLs com: SELECT Name FROM SalesReps WHERE Quota IS NULL;
Operadores de SELECT WHERE Disc*Amt > 50000; (Orders) WHERE Quota BETWEEN 50000 AND 100000; (SalesReps) A faixa inclui os valores extremos (>=50000 e <=100000) WHERE State IN ( CO, UT, TX ); (Offices) WHERE RepNbr IS NOT NULL; (SalesReps) WHERE Phone NOT LIKE 21% ; (Offices) O padrão SQL tem somente dois caracteres curinga % qualquer string com zero ou mais caracteres (* no Access) _ qualquer caractere isolado (? no Access) A maior parte dos bancos de dados têm caracteres curinga diferentes. O MS Access tem:? (qualquer caractere isolado) * (qualquer número de caracteres) # (qualquer dígito isolado) [lista] qualquer caractere isolado na lista [!lista]
SELECT: COUNT, GROUP BY Número de peças do fornecedor A SELECT COUNT(*) FROM Parts WHERE Vendor = A ; Resultado: 4 Número de peças de cada fornecedor SELECT Vendor, COUNT(*) AS PartsCount FROM Part GROUP BY Vendor; Resultado:
Exercícios Qual é o limite médio de crédito dos clientes cujo limite de crédito é menor que $1.000.000? Quantos escritórios de vendas estão na região Oeste (West)? Aumente em 30% o preço das escavadoras (bulldozers) em todos os pedidos. Exclua todos os representantes de vendas com quota NULA (NULL).
Exercícios Qual é o limite médio de crédito dos clientes cujo limite de crédito é menor que $1.000.000? SELECT AVG(CreditLimit) FROM Customers WHERE CreditLimit < 1000000; Quantos escritórios de vendas estão na região Oeste (West)? SELECT Count(*) FROM Offices WHERE Region= West ; Aumente em 30% o preço das escavadoras (bulldozers) em todos os pedidos. UPDATE Orders SET Amt= Amt*1.3 WHERE Prod= Bulldozer ; Exclua todos os representantes de vendas com quota NULA (NULL). DELETE FROM SalesReps WHERE Quota is NULL;
Junções O modelo relacional permite o agrupamento de dados de tabelas separadas em novos e não-previstos relacionamentos. Os relacionamentos tornam-se explícitos quando os dados são manipulados: ao consultar o banco de dados e não durante sua criação. Isso é crítico; esse recurso permite a extensão dos bancos de dados. O FAA nunca imaginou que seus dados seriam utilizados em 1.264 juntamente com os dados da transportadora DOT, uma tabela de CEPs e algumas novas tabelas de pedidos. Isso é reutilização! Você pode unir dados a partir de quaisquer colunas nas tabelas, desde que os tipos dos dados sejam iguais e a operação faça sentido. Esses dados não precisam ser chaves, apesar de normalmente o serem. Boas junções A coluna de junção normalmente é a coluna de chave: primária ou estrangeira As colunas de junção devem ter tipos de dados compatíveis NULLs nunca participam de junções
Junções Listar todos os pedidos, mostrando número do pedido e quantidade, além do nome e limite de crédito do cliente A tabela Orders contém o número do pedido e a quantidade, mas não contém os nomes dos clientes e seus limites de crédito A tabela Customers contém os nomes dos clientes e sues limites de crédito, mas não contém informações do pedido SELECT OrderNbr, Amt, Company, CreditLimit FROM Customers, Orders WHERE Cust=CustNbr; (SQL Padrão) SELECT OrderNbr, Amt, Company, CreditLimit FROM Customers INNER JOIN Orders ON Customers.CustNbr=Orders.Cust; (Access)
Junção com 3 tabelas Listar os pedidos acima de $25.000, incluindo o nome do vendedor que obteve o pedido e o nome do cliente que colocou o pedido. SELECT OrderNbr, Amt, Company, Name FROM Orders, Customers, SalesReps WHERE Cust = CustNbr AND CustRep = RepNbr AND Amt >= 25000; (SQL Padrão);
Notas sobre junção Sintaxe do MS Access para o exemplo anterior: SELECT OrderNbr, Amt, Company, Name FROM SalesReps INNER JOIN (Customers INNER JOIN Orders ON Customers).CustNbr = Orders.Cust) ON SalesReps.RepNbr = Customers.CustRep WHERE Amt >= 25000; Isso é complicado; utilizaremos a ferramenta de consulta do MS Access para construir SQL Utilize * com cuidado em junções Ele fornece todas as colunas de todas as tabelas sendo unidas. Se um campo tiver o mesmo nome nas tabelas sendo unidas, qualifique esse nome: Use tabela1.nome_do_campo, tabela2.nome_do_campo Customers.CustNbr, Orders.Amt, etc.
Auto-junções Queremos listar os analistas e seus gerentes O gerente poderia ser uma chave estrangeira na tabela de gerentes, mas ele deve ser uma chave estrangeira na própria tabela de funcionários nesse caso Tentativa 1 SELECT Name, Name FROM Employee, Employee WHERE Mgr = EmpNbr; (SQL padrão) Vai falhar, pois referencia duas vezes a tabela Employee A remoção da 2a. referência também vai falhar; a consulta busca as linhas nas quais a pessoa é seu próprio gerente, o que não desejamos.
Auto-junções Tentativa 2: Suponha a existência de 2 cópias da tabela Employee, uma chamada Emp e a outra Mgr: SELECT Emp.Name, Mgr.Name FROM Emp, Mgr WHERE Emp.Mgr = Mgr.EmpNbr; (SQL padrão); O SQL essencialmente nos permite fazer isso por meio de sinônimos (aliases). Válido: SELECT Emp.Name, Mgr.Name FROM Employee Emp, Employee Mgr WHERE Emp.Mgr = Mgr.EmpNbr; (SQL padrão); SELECT Emp.Name, Mgr.Name FROM Employee AS Emp INNER JOIN Employee AS Mgr ON Emp.Mgr = Mgr.EmpNbr; (Access); Na realidade, precisamos utilizar somente 1 sinônimo (alias) (Mgr)
Exercícios Liste os nomes dos clientes cujo limite de crédito é maior que a quota de seus representantes de vendas. Liste também o limite de crédito e a quota. Liste o nome e telefone de cada representante
Exercícios Liste os nomes dos clientes cujo limite de crédito é maior que a quota de seus representantes de vendas. Liste também o limite de crédito e a quota. SELECT CreditLimit, Quota, Company FROM SalesReps INNER JOIN Customers ON SalesReps.RepNbr = Customers.CustRep WHERE CreditLimit>Quota; Liste o nome e telefone de cada representante SELECT Name, Phone FROM Offices INNER JOIN SalesReps ON Offices.OfficeNbr = SalesReps.RepOffice;