Rápida revisão do Modelo Relacional Conceito de relação Tuplas e atributos
Rápida revisão do Modelo Relacional Regras de integridade Entidade: Deve existir uma chave primária com valor único e não-nulo. Referencial (chave estrangeira): O valor da chave estrangeira deve existir no domínio de valores da chave primária referenciada. Pode conter valores nulos.
Rápida revisão do Modelo Relacional Álgebra relacional Seleção Obs.: alguns autores usam o termo restrição. Retorna uma relação contendo tuplas a partir de uma condição.
Rápida revisão do Modelo Relacional Álgebra relacional Projeção Retorna uma relação contendo sub-tuplas a partir da remoção dos atributos da relação original. Ou simplesmente: retorna as colunas selecionadas da relação original.
Rápida revisão do Modelo Relacional Álgebra relacional Produto Retorna uma relação contendo todas as combinações possíveis de tuplas. Também conhecido como produto cartesiano.
Rápida revisão do Modelo Relacional Álgebra relacional Intersecção Retorna uma relação contendo todas as tuplas em comum de duas relações.
Rápida revisão do Modelo Relacional Álgebra relacional União Retorna uma relação contendo todas as tuplas que aparecem em duas relações.
Rápida revisão do Modelo Relacional Álgebra relacional Diferença Retorna uma relação contendo todas as tuplas que aparecem na primeira relação e que não estão presentes na segunda relação.
Rápida revisão do Modelo Relacional Álgebra relacional Junção natural Retorna uma relação contendo todas as possíveis tuplas a partir de uma combinação de duas tuplas (uma de cada relação). Cada tupla que participa da combinação possui um valor em comum. Obs.: as operações de produto e intersecção são casos especiais de junção.
Rápida revisão de SQL Data Definition Language (DDL) CREATE ALTER DROP Comando Descrição Cria uma nova tabela no banco de dados. Modifica a estrutura de um objeto no banco de dados (ex.: tabela, atributos, etc.). Remove uma tabela do banco de dados.
Rápida revisão de SQL Data Manipulation Language (DML) SELECT INSERT UPDATE DELETE Comando Descrição Seleciona registros de uma ou mais tabelas. Insere um registro na tabela. Atualiza um ou mais registros na tabela. Remove um ou mais registros na tabela. http://slides.jarley.com/bd/bd-06-introducao-sqlparte-i.pdf
Preparando o ambiente para o tutorial Certifique-se que o MySQL Server 5.7 esteja instalado em sua máquina. Entre no MySQL Workbench e escolha a instância do MYSQL instalado. Através do MySQL Workbench, vamos carregar as tabelas do tutorial. Navegue no menu File -> Open SQL Script. Escolha o arquivo aula.sql, na pasta descompactada em sua máquina. Observe o script carregado na área de trabalho.
Preparando o ambiente para o tutorial
Preparando o ambiente para o tutorial Execute o script carregado, clicando no ícone com um raio. Observe se não ocorreu nenhum erro de execução. Do lado direito, clique com o botão em cima do esquema sys e escolha a opção Refresh All. Observe se o novo esquema aula e sua tabelas foram criadas corretamente.
Explorando os dados Expanda o esquema aula, clique com o botão direito na tabela customers e escolha a opção Select Rows Limit 1000. Observe o resultado e repita o procedimento para a tabela orders.
Explorando os dados Modifique a consulta na aba customers para obter todos os clientes com salário maior que 5000: SELECT * FROM CUSTOMERS WHERE SALARY > 5000; Para executar a consulta, basta clicar no ícone com um raio. Obs. 1: Se o script possui mais de uma linha, todas serão executadas. Obs. 2: Para executar apenas uma linha do script, selecione a linha e clique no botão de execução.
Explorando os dados
Explorando os dados Execute algumas consultas para relembrar o uso do SELECT: SELECT * FROM CUSTOMERS WHERE SALARY = 2000; SELECT * FROM CUSTOMERS WHERE SALARY!= 2000; SELECT * FROM CUSTOMERS WHERE SALARY <> 2000; SELECT * FROM CUSTOMERS WHERE SALARY >= 6500; SELECT * FROM CUSTOMERS WHERE AGE >= 25 AND SALARY >= 6500;
Explorando os dados Execute algumas consultas para relembrar o uso do SELECT: SELECT * FROM CUSTOMERS WHERE AGE >= 25 OR SALARY >= 6500; SELECT * FROM CUSTOMERS WHERE AGE IS NOT NULL; SELECT * FROM CUSTOMERS WHERE NAME LIKE 'Ma%'; SELECT * FROM CUSTOMERS WHERE AGE IN ( 25, 27 ); SELECT * FROM CUSTOMERS WHERE AGE BETWEEN 25 AND 27;
Explorando os dados Execute algumas consultas para relembrar o uso do SELECT: SELECT AGE FROM CUSTOMERS WHERE EXISTS (SELECT AGE FROM CUSTOMERS WHERE SALARY > 6500); SELECT * FROM CUSTOMERS WHERE AGE > ALL (SELECT AGE FROM CUSTOMERS WHERE SALARY > 6500); SELECT * FROM CUSTOMERS WHERE AGE > ANY (SELECT AGE FROM CUSTOMERS WHERE SALARY > 6500);
Explorando os dados Execute algumas consultas para relembrar o uso do SELECT: SELECT COUNT(*) FROM CUSTOMERS; SELECT CURRENT_TIMESTAMP; SELECT ID, NAME, SALARY FROM CUSTOMERS WHERE NAME = 'Maria'; SELECT ID, NAME, SALARY FROM CUSTOMERS WHERE SALARY LIKE '200%'; SELECT TOP 3 * FROM CUSTOMERS; SELECT * FROM CUSTOMERS LIMIT 3;
Operações de agregação Cláusula ORDER BY Ordena os registros em ordem crescente ou decrescente, baseado em uma ou mais colunas. No caso de mais uma coluna, a ordem define o processo de ordenação. Em alguns SGBDs, o default é a ordem ascendente. Exemplo: SELECT * FROM CUSTOMERS ORDER BY NAME, SALARY;
Operações de agregação Cláusula ORDER BY
Operações de agregação Cláusula ORDER BY Ordenando na ordem decrescente SELECT * FROM CUSTOMERS ORDER BY NAME DESC;
Operações de agregação Cláusula GROUP BY Agrupa dados idênticos, de acordo com as colunas selecionadas. Podem ser usadas com funções de agregação (ex.: SUM, AVG, MAX, MIX, etc.) Exemplo: SELECT NAME, SUM(SALARY) FROM CUSTOMERS GROUP BY NAME;
Operações de agregação Cláusula GROUP BY Pode ser usada em conjunto com a cláusula ORDER BY Exemplo: SELECT NAME, SUM(SALARY) FROM CUSTOMERS GROUP BY NAME ORDER BY SALARY DESC;
Operações de agregação Cláusula HAVING Especifica condições de filtro em um agrupamento previamente existente. A cláusula WHERE aplica condições em colunas selecionadas. A cláusula HAVING aplica condições em grupos criados pelo GROUP BY. Exemplo: SELECT ID, NAME, AGE, SALARY FROM CUSTOMERS GROUP BY NAME HAVING SALARY >= 2000;
Operações de agregação Cláusula HAVING
Operações de agregação Cláusula DISTINCT Elimina todos os registros duplicados, retornando apenas uma tupla para cada conjunto em duplicidade. Exemplo: SELECT DISTINCT SALARY FROM CUSTOMERS ORDER BY SALARY;
Operações de Junção Chaves estrangeiras Através das chaves estrangeiras será possível combinar duas ou mais tabelas em uma única relação. Observe a tabela Orders. Veja que o atributo CUSTOMER_ID possui o mesmo domínio que o atributo ID de Customers. Vamos alterar a tabela Orders para definir a chave estrangeira: ALTER TABLE ORDERS ADD FOREIGN KEY (Customer_ID) REFERENCES CUSTOMERS (ID);
Operações de Junção Chaves estrangeiras Observe a tabela Orders
Operações de Junção Chaves estrangeiras Observando as tabelas, é possível executar a consulta abaixo? DELETE FROM CUSTOMERS WHERE ID = 3;
Operações de Junção Combina registros de duas ou mais tabelas através de atributos com valores iguais. Para manter a integridade referencial, recomenda-se usar sempre as chaves (primária e estrangeira) das tabelas que participam da junção. Podemos combinar duas tabelas usando apenas a cláusula WHERE: SELECT ID, NAME, AGE, AMOUNT FROM CUSTOMERS, ORDERS WHERE CUSTOMERS.ID = ORDERS.CUSTOMER_ID;
Operações de Junção
Operações de Junção INNER JOIN LEFT JOIN RIGHT JOIN FULL JOIN SELF JOIN CARTESIAN JOIN
Operações de Junção INNER JOIN Cria uma nova tabela combinando os valores das colunas, de acordo com o predicado da cláusula. A consulta compara cada linha da Tabela1 com cada linha da Tabela2 para encontrar todos os pares que atendem ao predicado. Exemplo: SELECT ID, NAME, AMOUNT, DATE FROM CUSTOMERS INNER JOIN ORDERS ON CUSTOMERS.ID = ORDERS.CUSTOMER_ID;
Operações de Junção INNER JOIN
Operações de Junção LEFT JOIN Retorna todas as linhas da tabela à esquerda da junção, mesmo se não existir uma ou mais linhas na tabela à direita que atenda ao predicado. Se a tabela à direita não possuir linhas combinando, os seus atributos na tabela resultante serão preenchidos com NULL. Exemplo: SELECT ID, NAME, AMOUNT, DATE FROM CUSTOMERS LEFT JOIN ORDERS ON CUSTOMERS.ID = ORDERS.CUSTOMER_ID;
Operações de Junção LEFT JOIN
Operações de Junção RIGHT JOIN Retorna todas as linhas da tabela à direita da junção, mesmo se não existir uma ou mais linhas na tabela à esquerda que atenda ao predicado. Se a tabela à esquerda não possuir linhas combinando, os seus atributos na tabela resultante serão preenchidos com NULL. Exemplo: SELECT ID, NAME, AMOUNT, DATE FROM CUSTOMERS RIGHT JOIN ORDERS ON CUSTOMERS.ID = ORDERS.CUSTOMER_ID;
Operações de Junção RIGHT JOIN
Operações de Junção FULL JOIN Retorna a combinação dos resultados das junções à esquerda e à direita. A tabela resultante contém os registros de ambas as tabelas. Os atributos das linhas que não possuem combinação são preenchidos com NULL. ATENÇÃO: O MySQL não suporta o FULL JOIN! Como resolver? Usando a cláusula UNION ALL. União das junções à esquerda e à direita.
Operações de Junção FULL JOIN Exemplo do UNION ALL: SELECT ID, NAME, AMOUNT, DATE FROM CUSTOMERS LEFT JOIN ORDERS ON CUSTOMERS.ID = ORDERS.CUSTOMER_ID UNION ALL SELECT ID, NAME, AMOUNT, DATE FROM CUSTOMERS RIGHT JOIN ORDERS ON CUSTOMERS.ID = ORDERS.CUSTOMER_ID;
Operações de Junção FULL JOIN
Operações de Junção SELF JOIN Retorna a combinação de uma tabela com ela mesma. Usamos a cláusula WHERE para fazer o SELF JOIN no MySQL. Exemplo: SELECT a.id, b.name, a.salary FROM CUSTOMERS a, CUSTOMERS b WHERE a.salary < b.salary;
Operações de Junção SELF JOIN
Operações de Junção CARTESIAN JOIN Também chamado de CROSS JOIN. Retorna o produto cartesiano de todos os registros das duas tabelas. É uma operação muito pesada para grandes bases de dados! Exemplo: SELECT ID, NAME, AMOUNT, DATE FROM CUSTOMERS, ORDERS;
Operações de Junção CARTESIAN JOIN
Operação de União Cláusula UNION Usado para combinar os resultados de dois ou mais comandos SELECT. Não retorna registros duplicados. Alguns cuidados no uso do UNION: O número de colunas selecionadas em cada SELECT deverá ser o mesmo; Deverá ter o mesmo número de expressões das colunas (AVG, SUM, etc.) Deverá ter o mesmo tipo nas tuplas retornadas; A ordem de seleção das colunas deverá ser a mesma em cada SELECT.
Operação de União Cláusula UNION Exemplo: SELECT ID, NAME, AMOUNT, DATE FROM CUSTOMERS LEFT JOIN ORDERS ON CUSTOMERS.ID = ORDERS.CUSTOMER_ID UNION SELECT ID, NAME, AMOUNT, DATE FROM CUSTOMERS RIGHT JOIN ORDERS ON CUSTOMERS.ID = ORDERS.CUSTOMER_ID;
Operação de União Cláusula UNION
Consultas internas O SQL permite vários níveis de aninhamento de consultas. As consultas internas podem ser combinadas com as cláusulas SELECT, INSERT, UPDATE e DELETE, através de um operador lógico ou relacional.
Consultas internas Algumas regras de uso: As consultas internas são encapsuladas entre parênteses e são executadas a partir do seu nível mais interno. A consulta interna deverá ter apenas uma coluna selecionada na cláusula SELECT; A cláusula ORDER BY não é permitida em uma consulta interna; Se a consulta interna retornar mais de um registro, o resultado deverá ser tratado por cláusulas que recebem conjuntos de linhas (ex.: operador IN).
Consultas internas Exemplo: SELECT * FROM CUSTOMERS WHERE ID IN (SELECT ID FROM CUSTOMERS WHERE SALARY > 4500) ;
Consultas internas
Tutorial avançado de SQL com MySQL Ver Parte II do livro Learning MySQL. Fazer todos os exemplos e exercícios dos capítulos 4 a 9.