diff --git "a/Faculdade/Implementa\303\247\303\243o-de-Banco-de-Dados/aula10.md" "b/Faculdade/Implementa\303\247\303\243o-de-Banco-de-Dados/aula10.md" new file mode 100644 index 0000000..160ea9d --- /dev/null +++ "b/Faculdade/Implementa\303\247\303\243o-de-Banco-de-Dados/aula10.md" @@ -0,0 +1,374 @@ +# Aula 10 - Linguagem SQL – Outros objetos de banco de dados + +Continuaremos utilizando o banco de dados da empresa para os exemplos. + +## Visões (views) + +A utilização de visões nos permite materializar o esquema externo de um banco de dados. + +Uma visão (view) é uma consulta previamente definida que fica armazenada no dicionário de dados, podendo ser acessada de forma similar a uma tabela. Quando a visão é referenciada em um comando de select, suas linhas e colunas são determinadas dinamicamente, ou seja, a consulta é executada, e o resultado apresentado para o usuário, atuando como um verdadeira tabela virtual. + +Uma visão pode permitir, com restrições, que os dados da tabela sejam manipulados em comandos de insert, update e delete; porém, não armazena estes dados. + +Vejamos a sintaxe do comando de criação de visões: + +```sql +CREATE VIEW nome_view +AS subquery +``` + +Onde: + +| Cláusula | Descrição | +| --------- | ---------------------------------------- | +| Nome_view | É o nome da view. | +| subquery | É o comando select que originará a view. | + +Vejamos a sintaxe do comando de criação de visões: + +```sql +CREATE VIEW EMP_RESUMO AS +SELECT ID, ULT_NOME, CARGO +FROM EMPREGADO +``` + +POSTGRESQL + +![criação de visões no PostgreSQL](/media/Implementação-de-Banco-de-Dados/aula10/Image1.jpeg) + +ORACLE + +![criação de visões no Oracle](/media/Implementação-de-Banco-de-Dados/aula10/Image2.jpeg) + +SQLSERVER + +![criação de visões no SQLServer](/media/Implementação-de-Banco-de-Dados/aula10/Image3.jpeg) + +Agora, podemos utilizar EMP_RESUMO como se fosse uma tabela. A diferença é que ela obtém os dados dinamicamente através da query especificada na própria definição da view. + +### Consultando Visões + +Para recuperarmos dados através da visão, basta executarmos um comando de select no qual o nome da visão fica na cláusula from. Por exemplo: para recuperarmos todas as linhas e colunas da visão EMP_RESUMO, basta darmos o seguintes comandos: + +```sql +SELECT * +FROM EMP_RESUMO +``` + +![Consultando Visões](/media/Implementação-de-Banco-de-Dados/aula10/Image4.jpeg) + +- Ao fazer uma consulta em uma view, podemos usar todos as cláusulas do select, como: where, group by, having order by; + +- Podemos também utilizar os operadores relacionais (in, between, like, is null), os operadores lógicos (and, or not) e as funções de grupo; + +- Podemos fazer junções de uma tabela com uma visão; + +- Podemos fazer subconsultas e utilizar operadores de conjunto; + +- Em resumo, podemos utilizar todos os recursos que podem ser utilizados em comandos a partir de tabelas. + +### Eliminando Visões + +Para eliminar uma visão, basta dar o comando drop view. + +![Eliminando Visões](/media/Implementação-de-Banco-de-Dados/aula10/Image5.jpeg) + +### Tipos de views + +Existem basicamente dois tipos de views: simples e complexos. O tipo simples é composto por apenas um select e utiliza apenas uma tabela; suas colunas são formadas por colunas da tabela original, sem cálculos ou funções. Já a view complexa é aquela em que há um join entre tabelas na subquery. + +- Com uma view simples, será possível executarmos os comandos insert, update e delete (além do select); + +- A manipulação dos dados através de uma view não desabilita as constraints das tabelas às quais os mesmos se referem; + +- Cada coluna definida para views deve ter um nome de coluna válido; + +- Caso seja uma fórmula, deve possuir um alias. + +Veja um exemplo: + +Crie a visão CLI_RESUMO com as colunas ID e nome da tabela cliente. + +![Criando a visão CLI_RESUMO](/media/Implementação-de-Banco-de-Dados/aula10/Image6.jpeg) + +Agora consulte a visão. + +![Consulte a visão](/media/Implementação-de-Banco-de-Dados/aula10/Image7.jpeg) + +Note que a nossa visão é simples, então podemos fazer comandos de insert, update e delete através dela. Podemos então inserir um cliente. Veja o comando: + +```sql +INSERT INTO CLI_RESUMO VALUES (200,'PINGO DE LEITE') +``` + +![Utilizando o comando Insert na visão CLI_RESUMO](/media/Implementação-de-Banco-de-Dados/aula10/Image8.jpeg) + +Se consultarmos a visão, o novo cliente vai aparecer. + +![Consultando a visão](/media/Implementação-de-Banco-de-Dados/aula10/Image9.jpeg) + +E, claro, se consultarmos diretamente a tabela, também aparecerá. + +![Consultarmos a tabela Cliente](/media/Implementação-de-Banco-de-Dados/aula10/Image10.jpeg) + +Note que a coluna Vendedor do novo cliente é nula; isto ocorre devido ao fato de na visão esta coluna não existir. + +Um cuidado que você tem de tomar é que, se for inserir através de uma visão, todas as colunas obrigatórias têm que existir na visão, senão ocorrerá um erro, pois a visão não desabilita as restrições da tabela. + +## Indexando tabelas + +Um índice tem o propósito de acelerar o acesso aos dados de tabelas muito extensas, ou que são frequentemente acessadas via join. + +No Oracle, ao criarmos uma primary key ou unique key, automaticamente é definido um índice único de acesso àquelas chaves. Porém, outras colunas que acessamos constantemente poderão ser indexadas, e para isso, temos que conhecer os comandos de criação e eliminação de índices. + +### Tipos de índices + +1. Único: Garante a unicidade do valor. O índice criado na primary key ou unique key é único; porém, podemos criar restrições de unicidade em outras colunas da tabela; + +2. Não único: Índices criados apenas com o propósito de acelerar a pesquisa, como em chaves estrangeiras (foreign key), nas quais a unicidade não é requerida; + +3. Uma coluna: Apenas uma coluna será indexada; + +4. Colunas compostas ou concatenadas: Até 255 colunas podem ser concatenadas para formar apenas um índice, e não necessitam ser adjacentes. + +### Utilizando índices + +Devemos utilizar índices sempre que: + +1. O meio de acesso tradicional mostrar-se ineficiente, provavelmente pelo tamanho da tabela e um número alto de consultas feitas a ela; + +2. A coluna tiver limites extensos de valores; + +3. A coluna tiver muitos valores nulos; + +4. Duas ou mais colunas são frequentemente acessadas em conjunto numa cláusula where ou condição; + +5. A tabela for muito grande e, na maior parte das queries, for esperada a recuperação de até 4% das linhas. + +Não devemos utilizar índices sempre que: + +1. A tabela for pequena (pode ser armazenada em poucos blocos Oracle); + +2. As colunas não são frequentemente usadas em condições; + +3. A maior parte das queries recupera mais que 4% das linhas da tabela; + +4. A tabela sofre alta taxa de atualização. + +Cuidados com índices: É importante observar que os índices são objetos atualizados pelo SGBD, em todas as operações de insert, update e delete na tabela indexada; Portanto, se por um lado aceleram a pesquisa aos dados através do comando select, por outro lado, quanto mais índice tiver a tabela, maior é o seu tempo de atualização. + +### Criando um índice + +Vejamos a sintaxe do comando a seguir: + +```sql +CREATE INDEX [schema.]nome_indice ON tabela (coluna1 [, coluna2 [,...] ] ) +``` + +Onde: + +| | | +| ----------- | --------------------------------------------------------------------------------------------------- | +| schema | É o schema no qual será gerado o índice. O default é o schema do usuário que está criando o índice. | +| nome_índice | Nome dado ao objeto índice que será criado. | +| tabela | Nome da tabela que será indexada. | +| coluna n | A(s) coluna(s) que irão compor o índice. | + +Veja um exemplo: + +Para criar um índice na coluna Vendedor da tabela Cliente, o comando seria: + +```sql +CREATE INDEX IND_VEND ON CLIENTE(VENDEDOR) +``` + +POSTGRESQL + +![Criar um índice na coluna Vendedor da tabela Cliente no PostgreSQL](/media/Implementação-de-Banco-de-Dados/aula10/Image11.jpeg) + +ORACLE + +![criar um índice na coluna Vendedor da tabela Cliente no Oracle](/media/Implementação-de-Banco-de-Dados/aula10/Image12.jpeg) + +SQLSERVER + +![criar um índice na coluna Vendedor da tabela Cliente no SQLServer](/media/Implementação-de-Banco-de-Dados/aula10/Image13.jpeg) + +### Eliminando um índice + +Os índices podem ser eliminados, mas nunca alterados. Para alterá-los, devemos efetuar a remoção e depois recriá-los. O comando de eliminação de um índice é simples e exige apenas o privilégio drop index. + +Vejamos a sintaxe do comando a seguir: + +```sql +DROP INDEX [schema.]nome_índice +``` + +Onde: + +| | | +| ----------- | ------------------------------------------------------------------------------------------------- | +| Cláusula | Descrição | +| schema | É o schema a quem pertence o índice. O default é o schema do usuário que está removendo o índice. | +| nome_índice | Nome do índice que será removido. | + +Não podemos eliminar os índices criados automaticamente pelas constraints primary key e unique key. Estes são automaticamente removidos quando eliminamos ou desabilitamos as constraints. + +Por exemplo: para eliminar o índice criado na coluna Vendedor, o comando seria: + +```sql +DROP INDEX IND_VEND +``` + +![Eliminando o índice IND_VEND](/media/Implementação-de-Banco-de-Dados/aula10/Image14.jpeg) + +## Um gerador de sequências (sequences) + +Os SGBDs possuem internamente uma máquina geradora de números sequenciais que pode perfeitamente ser usado para produzir números únicos, consecutivos e incrementados conforme determinado. + +A esses números chamamos de sequences, que podem ser utilizados para gerar valores para chaves primárias em tabelas nas quais não existe uma coluna mais apropriada, ou qualquer outra aplicação em que haja a necessidade de números únicos. + +A sintaxe do comando de criação de uma sequence é: + +```sql +CREATE SEQUENCE sequence_name + [INCREMENT BY n ] + [START WITH n] + [MAXVALUE n I NOMAXVALUE] + [MINVALUE n I NOMINVALUE] + [CYCLE I NOCYCLE] + [CACHE l NOCACHE] +``` + +Onde: + +| Cláusula | Descrição | +| ------------ | ---------------------------------------------------------------------------------------------------------------------------------------- | +| INCREMENT BY | Especifica o intervalo entre os números sequenciais. Pode ser positivo ou negativo, e a omissão significa incremento positivo de 1 em 1. | +| START WITH | É o primeiro número da sequência. | +| MAXVALUE | Especifica o valor máximo que a sequence pode alcançar. | +| NOMAXVALUE | É o default. Especifica um valor com precisão de 27 dígitos positivos ou negativos. | +| MINVALUE | Especifica um valor mínimo para a sequence. | +| NOMINVALUE | É o default. Especifica o valor mínimo de 1 para uma sequence ascendente e precisão negativa de 26 dígitos para sequences descendentes. | +| CYCLE | Especifica que, após atingido o valor limite, a sequence recomeçará no minvalue ou maxvalue. | +| NOCYCLE | É o default. Especifica que a sequence não pode gerar mais números após atingir o limite. | +| CACHE | Especifica quantos números a sequence pré-aloca e mantém em memória para acesso mais rápido. | +| NOCACHE | Valores não são pré-alocados em memória. | + +Vamos criar uma sequence chamada Números, que terá um valor inicial de 40, será incrementada de 3 em 3 e um valor máximo de 60. + +O comando seria: + +```sql +CREATE SEQUENCE NUMEROS + INCREMENT BY 3 + START WITH 40 + MAXVALUE 60; +``` + +POSTGRESQL + +![Criar uma sequence no PostgreSQL](/media/Implementação-de-Banco-de-Dados/aula10/Image15.jpeg) + +ORACLE + +![Criar uma sequence no Oracle](/media/Implementação-de-Banco-de-Dados/aula10/Image16.jpeg) + +SQLSERVER + +![Criar uma sequence no SQLServer](/media/Implementação-de-Banco-de-Dados/aula10/Image17.jpeg) + +### Obtendo valores da sequence + +Cada um dos SGBDs que estudamos recupera os valores da sequence de forma diferente. Vejamos cada um. + +**POSTGRESQL** + +Este SGBD utiliza uma função chamada Nextval() , cujo retorno é o valor recuperado da sequence. + +Veja primeiro no comando de Select: + +![Comando de Select com a função Nextval](/media/Implementação-de-Banco-de-Dados/aula10/Image18.jpeg) + +Note que o nome da sequence está entre apóstrofes e que o valor retornado é 40, que é o valor inicial que definimos. Agora vamos utilizar em um insert na tabela departamento. + +![Comando insert na tabela departamento](/media/Implementação-de-Banco-de-Dados/aula10/Image19.jpeg) + +Consultando a tabela, obtemos: + +![Consultando a tabela departamento](/media/Implementação-de-Banco-de-Dados/aula10/Image20.jpeg) + +Observe que foi inserido o valor 43, já que a sequence incrementa de 3 em 3. + +Particularidades de sequences: + +1. Quando um número sequencial é gerado pela sequence, este é incrementado independentemente de a transação ter sido efetivada (commit) ou não (rollback); + +2. Logo, valores podem ser perdidos para o sistema, ou seja, existirá sempre a garantia de unicidade (caso seja nocycle), porém poderá haver intervalos na aplicação; + +3. Temos que ter cuidados com aplicações que manipulam dados fiscais como emissão de notas fiscais. Não devemos numerá-las com sequences; + +4. Da mesma forma que usuários acessam a mesma sequence, estes podem receber valores intercalados, visto que num dado momento a sequence poderá estar atendendo um número para cada um; + +5. Dois usuários jamais conseguirão gerar o mesmo número sobre uma mesma sequence; + +6. Os valores que estão no cache (memória) são perdidos caso o banco de dados sofra uma interrupção anormal. + +### Alterando uma sequence + +Sequences podem ser submetidas a alteração e eliminação tal qual uma tabela, através dos comandos alter sequence e drop sequence. + +Veja a sintaxe do comando: + +```sql +ALTER SEQUENCE [schema.]sequence_name + [INCREMENT BY n ] + [MAXVALUE n I NOMAXVALUE] + [MINVALUE n I NOMINVALUE] +``` + +Controles sobre sequences alteradas: + +- Serão afetados apenas os números a serem gerados; + +- Algumas validações serão feitas como um novo valor maxvalue; não poderá ser definido se menor que o último número gerado; + +- A cláusula start with não poderá ser alterada; neste caso, a sequence deverá ser eliminada e recriada. + +### Eliminando uma sequence + +Para apagarmos uma sequence, utilizamos o comando drop sequence. + +A sintaxe para eliminação de uma sequence: + +```sql +DROP SEQUENCE [schema.]sequence_name; +``` + +Exemplo: + +Drop sequence números. + +![Eliminando a sequence números](/media/Implementação-de-Banco-de-Dados/aula10/Image21.jpeg) + +### Colunas autonumeradas + +Conforme já vimos, as sequences podem ser utilizadas para gerar valores para chaves primárias autonumeradas. No Oracle, este é o único, já que este SGBD não possui o tipo de autonumeração. A seguir, vamos verificá-los no SQLServer e PostgreSQL. + +**POSTGRESQL** + +O tipo autonumerado do PostgreSQL é o serial que deve ser utilizado na PK da tabela. + +Veja o comando de criação de tabela: + +![Criando a tabela PK_AUTONUMERADA](/media/Implementação-de-Banco-de-Dados/aula10/Image22.jpeg) + +Nossa tabela possui duas colunas: a primeira autonumerada e a segunda caracter. + +Veja a inserção de duas linhas: + +![Inserindo duas linhas na tabela](/media/Implementação-de-Banco-de-Dados/aula10/Image23.jpeg) + +Note que na lista de colunas só foi colocada a coluna C2. A C1 terá seu valor preenchido automaticamente, conforme podemos ver na seguinte consulta: + +![Consultando os dados da tabela com o Select](/media/Implementação-de-Banco-de-Dados/aula10/Image24.jpeg) diff --git "a/Faculdade/Implementa\303\247\303\243o-de-Banco-de-Dados/aula3.md" "b/Faculdade/Implementa\303\247\303\243o-de-Banco-de-Dados/aula3.md" new file mode 100644 index 0000000..c760aab --- /dev/null +++ "b/Faculdade/Implementa\303\247\303\243o-de-Banco-de-Dados/aula3.md" @@ -0,0 +1,287 @@ +# Aula 3 - Linguagem SQL - Select - Parte 1 + +## Banco de dados de exemplo + +Um banco de dados denominado ”Empresa” será utilizado para os exemplos desta aula e das próximas. O Banco da empresa possui o seguinte Modelo Lógico: + +![Banco de dados "Empresa"](/media/Implementação-de-Banco-de-Dados/aula3/Image1.png) + +As tabelas possuem os seguintes dados: + +- Região + +- Departamento + +- Empregado + +- Cliente + +Comandos para criação de tabelas: + +```sql +CREATE TABLE REGIAO +(ID_REGIAO NUMERIC(7) PRIMARY KEY, +NOME VARCHAR(40)); + +CREATE TABLE DEPARTAMENTO +( ID NUMERIC(7) PRIMARY KEY, +NOME VARCHAR(40) NOT NULL, +ID_REGIAO NUMERIC(7)REFERENCES REGIAO(ID_REGIAO)); + +CREATE TABLE EMPREGADO +( ID NUMERIC(7) PRIMARY KEY, +ULT_NOME VARCHAR(20) NOT NULL, +PRIM_NOME VARCHAR(20) NOT NULL, +CARGO VARCHAR(30), +SALARIO NUMERIC(7,2), +DT_ADMISSAO DATE, +CPF CHAR(11) UNIQUE, +ID_DEPTO NUMERIC(7) REFERENCES DEPARTAMENTO(ID), +ID_GERENTE NUMERIC(7) REFERENCES EMPREGADO(ID)); + +CREATE TABLE CLIENTE +( ID NUMERIC(7) PRIMARY KEY +NOME VARCHAR(40) NOT NULL, +VENDEDOR NUMERIC(7) REFERENCES EMPREGADO(ID)); +``` + +INSERINDO LINHAS NA TABELAS + +```sql +INSERT INTO REGIAO VALUES (1, 'Norte'); +INSERT INTO REGIAO VALUES (2, 'Sul'); + +INSERT INTO DEPARTAMENTO VALUES (10, 'Administrativo',1); +INSERT INTO DEPARTAMENTO VALUES (20, 'Vendas',1); +INSERT INTO DEPARTAMENTO VALUES (30, 'Compras',2); + +INSERT INTO EMPREGADO VALUES (1, 'Velasques', 'Carmen', 'Presidente',29500, '05/05/2009','34567890125',10, null); +INSERT INTO EMPREGADO VALUES (2, 'Neves', 'Lauro', 'Diretor de Compras',19500, '03/03/2009','23456789012',30,1); +INSERT INTO EMPREGADO VALUES (3, 'Nogueira', 'Ernane','Diretor de Vendas', 18000, '07/04/2010','34567890123',20,1); +INSERT INTO EMPREGADO VALUES (4, 'Queiroz', 'Mark','Gerente de Compras',8000, '11/11/2010','12345432123',30,2); +INSERT INTO EMPREGADO VALUES (5, 'Rodrigues', 'Alberto', 'Vendedor',4000, '10/10/2008', '87965432123', 20,3); +INSERT INTO EMPREGADO VALUES (6, 'Ugarte', 'Marlene', 'Vendedor', 3500,'03/03/2009', '87654345678',20,3); + +INSERT INTO CLIENTE VALUES (110, 'Ponto Quente',5); +INSERT INTO CLIENTE VALUES (120, 'Casa Supimpa',6); +INSERT INTO CLIENTE VALUES (130, 'Coisas e Tralhas',5); +INSERT INTO CLIENTE VALUES (140, 'Casa Desconto',null); +``` + +Os comandos listados acima mostram como o script disponível funciona normalmente no postgreSql e no SqlServer. No ORACLE, deve ser comandado COMMIT após o último insert. + +Tendo esse Banco em mente, é altamente recomendável que você execute os comandos de exemplo no PostGreSql. + +Foi escolhido como base o PostgreSql, por ser um SGBD mais leve e fácil de instalar, porém, se você puder usar o SqlServer ou o Oracle quando houver diferença entre os SGBD’s, será avisado. + +## Consultando dados de uma tabela + +O comando SQL que permite recuperar dados de uma ou mais tabelas é o SELECT. Esse comando nos permite escolher as colunas que retornarão, bem como filtrá-las da tabela. + +O comando de Select é uma implementação prática da teoria dos conjuntos, mais especificamente da Álgebra Relacional. Dessa forma, um único Select pode retornar zero ou várias linhas, de acordo com as restrições colocadas no comando. + +Os componentes básicos do comando são: + +Cláusula **SELECT** + +- Lista as colunas que serão recuperadas; + +- Se utilizarmos o artifício do \* (asterisco) na cláusula SELECT, estaremos definindo que todas as colunas serão recuperadas. + +Cláusula **FROM** + +- Define a tabela que será recuperada. + +Veja a sintaxe abaixo: + +```sql +SELECT nome-col1, nome_col2, nome coln +FROM nome_da_ tabela; +``` + +**OU** + +```sql +SELECT * +FROM nome_da_tabela ; +``` + +**Em que:** + +| Palavra-Chave | Descrição | +| -------------- | ------------------------------------------------------- | +| nome_da_tabela | Nome da tabela que contém os dados a serem recuperados. | +| nome_coln | Nome de uma coluna a ser recuperada. | +| \* (asterisco) | Recupera todas as colunas da tabela. | + +### Retornando uma tabela inteira + +Acesse o SGBD e digite o seguinte comando: `SELECT * FROM EMPREGADO`. + +No comando acima, selecionamos todas as colunas e todas as linhas da tabela EMPREGADO. + +![Selecionando todas as colunas e todas as linhas da tabela Empregado](/media/Implementação-de-Banco-de-Dados/aula3/Image2.jpeg) + +Observe que não há nenhuma ordem ou seleção de linhas ou colunas. + +### Retornando colunas específicas + +Na Álgebra Relacional, vimos que existe a operação de projeção que permite retornar apenas algumas colunas da tabela, mas todas as linhas. O mesmo pode ser obtido em SQL. Para isso basta que se liste as colunas desejadas na cláusula SELECT, separando-as por virgulas. + +**Exemplos:** + +Acesse o SGBD e digite o seguinte comando: `SELECT ID, PRIM_NOME, ULT_NOME FROM EMPREGADO`. + +No comando acima, são selecionadas apenas três colunas e todas as linhas da tabela EMPREGADO. + +![Selecionando as colunas Id, PRIM_NOME e ULT_NOME da tabela Empregado](/media/Implementação-de-Banco-de-Dados/aula3/Image3.jpeg) + +Nesse segundo caso, não são exibidas as colunas CARGO, SALARIO, DT_ADMISSAO, CPF, ID_DEPTO e ID_GERENTE. + +No primeiro comando analisado, um asterisco substitui a lista de colunas desejadas, indicando que todas as colunas devem ser informadas. + +Como seria o comando para exibir todo o NOME e o ID de todos os clientes? + +![Exibindo o NOME e o ID de todos os clientes](/media/Implementação-de-Banco-de-Dados/aula3/Image4.jpeg) + +COMANDO: + +![Comando para exibir o NOME e o ID da tabela Cliente](/media/Implementação-de-Banco-de-Dados/aula3/Image5.jpeg) + +- Quando você utiliza \*, as colunas retornam na ordem em que foram criadas na tabela; + +- Quando você lista as colunas no SELECT, elas retornam na ordem em que as listou; + +- As colunas no SELECT devem estar separadas por vírgula; + +- Não deve existir vírgula antes da cláusula FROM. + +## Escrevendo expressões de concatenação + +No PostGreSql, o operador de concatenação é o ||. Se desejássemos retornar o PRIM_NOME do empregado com o ULT_NOME, o comando seria: + +```sql +SELECT PRIM_NOME || ULT_NOME +FROM EMPREGADO +``` + +![Concatenando o PRIM_NOME com o ULT_NOME da tabela empregado](/media/Implementação-de-Banco-de-Dados/aula3/Image6.jpeg) + +Notou que os nomes estão colados? + +Isso decorre do fato de que, depois do PRIM_NOME ou antes do ULT_NOME, não existe espaço em branco armazenado na coluna. + +Como resolver isso? Basta concatenar as colunas com um espaço em branco entre elas. + +![Concatenando as colunas com um espaço em branco entre elas](/media/Implementação-de-Banco-de-Dados/aula3/Image7.jpeg) + +Como fica isso no Oracle e no Sql Server? + +No Oracle, o operador é o mesmo. + +![Concatenação no Oracle](/media/Implementação-de-Banco-de-Dados/aula3/Image8.jpeg) + +Já no SqlServer, o operador de concatenação é o +. + +![Concatenação no SqlServer](/media/Implementação-de-Banco-de-Dados/aula3/Image9.jpeg) + +**Criando Alias** + +Quando são utilizadas expressões, o cabeçalho da coluna, normalmente, fica sem significado. + +Dependendo do SGBD, ele pode ser a própria expressão, como acontece no ORACLE, pode ser (No column name), como acontece no SQLSERVER, ou pode ser ?Column? + +Como acontece no PostgreSQL. + +Seja como for, seria mais interessante se fosse possível nomear as colunas de forma a manterem o seu significado. Para isso, existem os alias de coluna. + +**PostGreSql** + +![Cabeçalho da coluna no PostgreSQL](/media/Implementação-de-Banco-de-Dados/aula3/Image10.png) + +**SqlServer** + +![Cabeçalho da coluna no SqlServer](/media/Implementação-de-Banco-de-Dados/aula3/Image11.png) + +**Oracle** + +![Cabeçalho da coluna no Oracle](/media/Implementação-de-Banco-de-Dados/aula3/Image12.png) + +Para você criar um alias após a coluna, você deve colocar ‘AS’ e em seguida a palavra - sem espaços em branco e sem caracteres em português - que usará para ser o cabeçalho da coluna. + +Para chamar a concatenação do PRIM_NOME com o ULT_NOME como NOME_COMPLETO, você deve comandar: + +```sql +SELECT PRIM_NOME ||' '|| ULT_NOME AS NOME_completo +FROM EMPREGADO +``` + +**PostGreSql** + +![Coluna NOME_COMPLETO no PostgreSQL](/media/Implementação-de-Banco-de-Dados/aula3/Image13.png) + +**SqlServer** + +![Coluna NOME_COMPLETO no SqlServer](/media/Implementação-de-Banco-de-Dados/aula3/Image14.png) + +**Oracle** + +![Coluna NOME_COMPLETO no Oracle](/media/Implementação-de-Banco-de-Dados/aula3/Image15.png) + +1. Repare que no comando o alias está com NOME em maiúsculo e completo em minúsculo. Analise agora o retorno e note que no PostGreSql o alias fica todo em minúsculo, no Oracle todo em maiúsculo e no SqlServer da forma que você digitou o alias. + +2. O AS nos 3 SGBD é opcional. Se você escrever o comando sem o AS, ele funciona. Teste para ver. + +## Utilizando SELECT sem FROM + +A cláusula SELECT, além de permitir a realização da projeção das colunas da tabela, pode ser utilizada para exibir resultados de operações aritméticas, retorno de funções ou textos. + +Vejamos um exemplo no PostGreSql: + +![Comando Select sem FROM para exibir um texto, operação aritmética e retorno de função](/media/Implementação-de-Banco-de-Dados/aula3/Image16.jpeg) + +Note que: + +- O comando primeiro exibe um texto (ALO), em seguida o resultado de uma operação aritmética (9+5) e finalmente retorna o valor da data da data/hora do sistema (FUNÇÃO NOW()); + +- Não existe cláusula FROM, pois desejamos retornar apenas uma linha com os valores. + +O que aconteceria se fosse acrescentada uma cláusula FROM com um nome de tabela? + +![Acrescentando uma cláusula FROM ao comando anterior](/media/Implementação-de-Banco-de-Dados/aula3/Image17.jpeg) + +Note na figura acima que retornaram 4 linhas todas iguais. Isso acontece porque tanto as expressões como a função NOW() são de linha, ou seja, retornam uma linha para cada linha da tabela da cláusula FROM. Como a tabela CLIENTE possui 4 linhas, o retorno tem essa quantidade de linhas. + +Por isso é omitida a cláusula FROM, já que desejamos apenas uma linha de retorno. + +E o SqlServer, como fica? Muito Similar. A única diferença é que a função que retorna a data/hora se chama GETDATE(). + +![Comando no SqlServer com a função GETDATE](/media/Implementação-de-Banco-de-Dados/aula3/Image18.jpeg) + +Como no PostgreSql, se tiver FROM, retornará uma linha para cada linha da tabela. + +![Comando Select com a cláusula FROM no SqlServer](/media/Implementação-de-Banco-de-Dados/aula3/Image19.jpeg) + +Faltou o Oracle. A função de data do Oracle é SYSDATE. Veja na figura abaixo o retorno do comando + +![Comando Select sem a cláusula FROM no Oracle](/media/Implementação-de-Banco-de-Dados/aula3/Image20.jpeg) + +Note que deu o erro, pois a cláusula From não foi encontrada. Por que isso acontece? Ao contrário do PostGreSql e do SqlServer, no Oracle a cláusula FROM é obrigatória. Como fazemos então para conseguir listar os valores? Colocamos a Cláusula FROM com a tabela DUAL. + +![Utilizando a cláusula FROM com a tabela DUAL no Oracle](/media/Implementação-de-Banco-de-Dados/aula3/Image21.jpeg) + +Observações: + +- Sysdate também pode retornar a hora mas temos que fazer algumas configurações que ultrapassam o nosso escopo aqui. + +- Como vimos antes no SqlServer e no PostgreSql também podemos colocar a cláusula FROM com um nome de tabela, só que retornaram uma linha para cada linha da tabela, mas como a cláusula FROM não é obrigatória não é um problema. + +- No Oracle se colocarmos uma tabela com 4 linhas na FROM retornaram 4 linhas, como a cláusula FROM é obrigatório isto poderia gerar um problema. Para eliminar esta dificuldade existe uma tabela de sistema chamada DUAl que possui uma única linha e que deverá ser colocada na cláusula FROM sempre que se desejar retornar uma única linha com expressões ou funções de linha. + +Se por curiosidade você quiser saber o conteúdo de DUAL, basta comandar: + +![Verificando o conteúdo de DUAL](/media/Implementação-de-Banco-de-Dados/aula3/Image22.jpeg) + +Você verá que a tabela possui uma única coluna chamada DUMMY e uma Linha com o valor X. + +**Importante**: DUAL é uma tabela de sistema em que nenhum usuário pode DROPAR ou INSERIR linhas, tampouco ALTERAR ou ELIMINAR sua única linha. diff --git "a/Faculdade/Implementa\303\247\303\243o-de-Banco-de-Dados/aula4.md" "b/Faculdade/Implementa\303\247\303\243o-de-Banco-de-Dados/aula4.md" new file mode 100644 index 0000000..068c335 --- /dev/null +++ "b/Faculdade/Implementa\303\247\303\243o-de-Banco-de-Dados/aula4.md" @@ -0,0 +1,339 @@ +# Aula 4 - Linguagem SQL - Select - Parte 2 + +Vamos continuar usando o Banco de Dados da Empresa para os exemplos de modelo lógico. + +![Banco de Dados da Empresa](/media/Implementação-de-Banco-de-Dados/aula4/Image1.png) + +As tabelas possuem os seguintes dados: + +Região: + +![Tabela Região](/media/Implementação-de-Banco-de-Dados/aula4/Image2.jpeg) + +Departamento: + +![Tabela Departamento](/media/Implementação-de-Banco-de-Dados/aula4/Image3.jpeg) + +Empregado: + +![Tabela Empregado](/media/Implementação-de-Banco-de-Dados/aula4/Image4.jpeg) + +Cliente: + +![Tabela Cliente](/media/Implementação-de-Banco-de-Dados/aula4/Image5.jpeg) + +## Gerando restrições às consultas + +Até agora, todos os comandos que demos retornaram todas as linhas da tabela. Mas e se você desejar filtrar as tabelas e retornar apenas as linhas que atendam a uma condição? + +Nesse caso, você deve acrescentar a cláusula Where ao comando de Select. + +A cláusula Where estabelece uma condição que a linha deverá obedecer para que faça parte do conjunto resposta da consulta. No caso, apenas retornam as linhas cujo teste da condição dê como resposta verdadeiro. + +Ao selecionar os dados para visualização ou outra necessidade, podemos, além de ordená-los, restringir o espectro de visualização utilizando a cláusula Where. + +![Estabelecendo uma condição com a cláusula Where](/media/Implementação-de-Banco-de-Dados/aula4/Image6.png) + +Repare que, das seis linhas que a tabela possui “empregado com ID de 1 até 6”, somente retornam as três que possuem ID maior que 3 (4,5 e 6). + +Na construção das condições, você pode utilizar os seguintes operadores relacionais: + +- Igual = + +- Diferente <> + +- Menor que < + +- Maior que > + +- Maior ou igual a >= + +- Menor ou igual a <= + +Um cuidado que você deve tomar é com o tipo de dado que está utilizando para filtrar. No caso anterior, era um dado numérico (ID) e bastava escrevê-lo. Mas e se fosse um texto? + +Veja os dados da tabela CLIENTE. + +![Dados da tabela Cliente](/media/Implementação-de-Banco-de-Dados/aula4/Image7.jpeg) + +Você deseja o ID do cliente Ponto Quente, cujo valor é 110. O Comando seria então: + +- SELECT ID + +- FROM CLIENTE + +- WHERE NOME = 'PONTO QUENTE' + +Veja o retorno. + +![Retorno do comando anterior](/media/Implementação-de-Banco-de-Dados/aula4/Image8.jpeg) + +Por que não voltou o ID do cliente, já que existe esse nome na tabela? Veja o mesmo comando no Oracle e no SqlServer. + +![Comando no Oracle e no Sql Server](/media/Implementação-de-Banco-de-Dados/aula4/Image9.jpeg) + +Repare que, no SqlServer, retornou o valor 110 e no Oracle, não. O que está acontecendo? + +Alguns SGBD são case sensitive para os dados, ou seja, fazem diferenciação entre letra maiúscula e letra minúscula. Dessa forma, temos que respeitar isso, ou a consulta poderá não retornar as linhas. + +No caso do nosso banco de dados, o nome do Cliente está com a primeira letra de cada palavra em maiúsculo, portanto, temos que escrever dessa forma no comando. + +- SELECT ID + +- FROM CLIENTE + +- WHERE NOME = 'Ponto Quente' + +![Consulta respeitando a diferenciação entre letra maiúscula e letra minúscula](/media/Implementação-de-Banco-de-Dados/aula4/Image10.jpeg) + +Você pode estar pensando: + +Significa, então, que eu tenho que saber como está escrito no Banco de Dados? E se eu não souber? E se em uma linha estiver tudo maiúsculo e na outra, tudo minúsculo? E se o banco não tiver um padrão? + +Neste caso, você deve padronizar a consulta utilizando uma função que leve o valor existente no banco de dados para maiúsculo ou para minúsculo antes de fazer a comparação. + +Veja os exemplos a seguir. + +![Padronizando a consulta com a função UPPER](/media/Implementação-de-Banco-de-Dados/aula4/Image11.jpeg) + +Repare que: + +- Nos comandos PONTO QUENTE, está em maiúsculo e foi utilizada a função UPPER para levar o conteúdo da coluna NOME para maiúsculo antes da comparação; + +- UPPER atua apenas na comparação, não altera o valor do existente no banco de dados. + +Veja o exemplo abaixo, onde, ao pedirmos para retornar também o nome, ele vem como está no banco de dados. + +![A função UPPER não altera o valor do banco de dados](/media/Implementação-de-Banco-de-Dados/aula4/Image12.png) + +Dois cuidados que você deve tomar ao trabalhar com string: + +- A string deve vir entre apóstrofes ‘PONTO QUENTE‘; + +- Se o SGBD for case sensitive, você deve escrever o comando como os dados que estão no banco ou utilizar uma função para padronizar a forma de comparação. + +## Trabalhando com datas + +Ao trabalhar com datas, devemos colocá-las entre aspas simples, no formato dd/mm/aaaa, onde “dd” é o dia em dois dígitos, “mm” o mês em dois dígitos e “aaaa” é o ano em quatro digitos. + +Mostrar sobrenome e senha dos empregados admitidos em 3/3/2009. + +- SELECT ULT_NOME, DT_ADMISSAO + +- FROM EMPREGADO + +- WHERE DT_ADMISSAO = '3/3/2009'; + +![Trabalhando com datas no PostGreSql, SqlServer e Oracle](/media/Implementação-de-Banco-de-Dados/aula4/Image13.jpeg) + +Teste também os seguintes comandos: + +```sql +SELECT ULT_NOME, DT_ADMISSAO +FROM EMPREGADO +WHERE DT_ADMISSAO = '3/MAR/2009' +``` + +Ou + +```sql +SELECT ULT_NOME, DT_ADMISSAO +FROM EMPREGADO +WHERE DT_ADMISSAO = '3/MARÇO/2009' +``` + +Ou + +```sql +SELECT ULT_NOME, DT_ADMISSAO +FROM EMPREGADO +WHERE DT_ADMISSAO = '3/MAR/09' +``` + +Estes formatos também são aceitos, mas, no PostgreSql, deve-se ter um cuidado: o nome/abreviatura dos meses devem ser em inglês: Março - March / Abr – Apr. Já o Oracle e o SqlServer dão suporte aos nomes em português. + +## Consultando dados com várias condições + +Você pode especificar critérios complexos combinando várias condições de pesquisa. + +A utilização dos operadores lógicos AND e OR permite montar expressões lógicas para filtrar as linhas. Como toda expressão lógica, o operador AND somente retorna Verdadeiro (TRUE) se ambas as condições forem verdadeiras, enquanto o operador OR somente retorna FALSO (FALSE) se as duas condições forem falsas. + +Veja a tabela EMPREGADO. + +![Tabela EMPREGADO](/media/Implementação-de-Banco-de-Dados/aula4/Image14.png) + +Vamos supor que você deseja mostrar os empregados que tenham sido contratados após primeiro de janeiro de 2010 e que tenham salário maior que R$10.000. + +O comando e o resultado estão na figura a seguir. + +![Comando Select utilizando AND](/media/Implementação-de-Banco-de-Dados/aula4/Image15.png) + +Repare que a utilização do AND obriga que as duas condições sejam verdadeiras para que a linha retorne. Se tivéssemos utilizado OR, bastaria uma ser verdadeira para que a linha retornasse. + +![Comando Select utilizando OR](/media/Implementação-de-Banco-de-Dados/aula4/Image16.png) + +## Operadores da linguagem SQL + +A linguagem SQL possui um conjunto próprio de operadores para testar condições. + +Esses operadores são: + +- IN: CONTIDO EM (LISTA) + +- BETWEEN: ENTRE VALORES + +- LIKE: STRING SEMELHANTE + +- IS NULL: Testa valores nulos + +### Operador IN + +O operador **IN** permite comparar o valor da coluna com uma lista de valores e retorna verdadeiro se, em uma determinada linha, o valor da coluna for igual a um dos valores da lista. + +Desejamos listar os empregados que trabalham no departamento 10 ou no departamento 30. Como ficaria o comando? + +```sql +SELECT * +FROM EMPREGADO +WHERE ID_DEPTO IN (10,30) +``` + +Agora, para ver os empregados que NÃO trabalham nestes departamentos, basta acrescentar NOT ao comando: + +```sql +SELECT * +FROM EMPREGADO +WHERE ID_DEPTO NOT IN (10,30) +``` + +### Operador Between + +O operador Between And permite verificar se o valor de um campo está contido em uma faixa de valores. Por exemplo, desejamos retornar o id ult_nome e cargo dos empregados com salários entre R$8.000 e R$19.500 inclusive. + +O comando seria: + +```sql +SELECT * +FROM EMPREGADO +WHERE SALARIO BETWEEN 8000 AND 19500 +``` + +![Resultado do comando Select com o operador Between](/media/Implementação-de-Banco-de-Dados/aula4/Image17.jpeg) + +Repare que retornam os empregados com salários de R$8.000 e de R$19.500. Isso mostra que o Between cria um intervalo fechado, ou seja, os limites fazem parte dos valores aceitáveis. Para fazer a condição inversa, basta utilizarmos Not Between. + +```sql +SELECT * +FROM EMPREGADO +WHERE SALARIO BETWEEN 8000 AND 19500 +``` + +![Resultado do comando Select com o operador Not Between](/media/Implementação-de-Banco-de-Dados/aula4/Image18.png) + +Podemos utilizar Between com Datas. Por exemplo, desejamos os empregados contratados em 2009. O comando seria: + +```sql +SELECT * +FROM EMPREGADO +WHERE DT_ADMISSAO BETWEEN '1/1/2009' AND '31/12/2009' +``` + +![Usando o operador Between com datas](/media/Implementação-de-Banco-de-Dados/aula4/Image19.png) + +### Operador Like + +O operador Like é utilizado para fazer casamento de padrão, ou seja, procurar um conjunto de caracteres que existe em uma string. + +Esta operação de comparação, para poder ser eficiente, necessita do uso de caracteres coringa, que no caso do SQL são dois: + +- % - Curinga para representar uma quantidade arbitrária de caracteres (inclusive nenhum); + +- \_ - Curinga para indicar a existência obrigatória de um caracter naquela posição. + +**Exemplo**: Desejamos saber os dados dos empregados com o ult_nome começado com N. O comando seria: + +```sql +SELECT * +FROM EMPREGADO +WHERE UPPER(ULT_NOME) LIKE 'N%' +``` + +![Resultado da consulta dos empregados com o ult_nome começado com N](/media/Implementação-de-Banco-de-Dados/aula4/Image20.jpeg) + +Observações + +- Repare o uso da função UPPER. Esta função leva a string para maiúsculo antes de fazer a comparação, sendo muito útil para contornar a limitação do Oracle e do Postgresql, por serem Case Sensitive. Uma outra função possível de ser utilizada é lower, que leva o texto todo para minúsculo. + +- No SqlServer, você deve eliminar UPPER, já que ele não é Case Sensitive. + +- Note o % depois do N informando que, após essa letra, pode existir uma quantidade arbitrária de caracteres. + +**Exemplo**: Desejamos saber os dados dos empregados com o ult_nome terminado com S. O comando seria: + +```sql +SELECT * +FROM EMPREGADO +WHERE UPPER(ULT_NOME) LIKE '%S' +``` + +![Resultado da consulta dos empregados com o ult_nome terminado com S](/media/Implementação-de-Banco-de-Dados/aula4/Image21.png) + +E se você quiser retornar os PRIMEIROS NOMES dos empregados que possuem E em qualquer lugar do nome? Como seria o comando? + +![Consultando o prim_nome dos empregados com E em qualquer lugar do nome](/media/Implementação-de-Banco-de-Dados/aula4/Image22.png) + +Repare no retorno. Temos Carmen com E no meio, mas temos também Ernane que possui E no início e no final, pois o % autoriza a ter uma quantidade arbitrária de caracteres, inclusive nenhum. + +Se você desejasse retornar os sobrenomes que possuem E como segunda letra, não adiantaria utilizar %. Para isso temos que informar que OBRIGATORIAMENTE deve existir uma letra antes do E, utilizando nosso outro curinga, o ‘\_’. O comando seria então: + +```sql +SELECT ULT_NOME +FROM EMPREGADO +WHERE UPPER(ULT_NOME) LIKE '_E%' +``` + +![Resultado da consulta dos sobrenomes que possuem E como segunda letra](/media/Implementação-de-Banco-de-Dados/aula4/Image23.png) + +Note que temos que ter um \_ antes do E para informar que o E é a segunda letra e que, após ela, podemos ter uma quantidade qualquer de caracteres. + +Alguns cuidados: + +- O ‘\_’ deve estar colado no ‘E’. Não pode haver espaço entre eles; + +- Você deve colocar um ‘\_’ para cada caractere. Por exemplo, para L na terceira, o comando seria: + +![Consultado os sobrenomes que possuem L como terceira letra](/media/Implementação-de-Banco-de-Dados/aula4/Image24.png) + +Agora, quando você deseja quem não tem R no nome, deve acrescentar o NOT antes do LIKE. + +![Consultando os sobrenomes que não possuem R no nome](/media/Implementação-de-Banco-de-Dados/aula4/Image25.png) + +### ILIKE + +Devido ao fato do PostgreSql ser Case Sensitive, nos comandos utilizamos o UPPER, porém este SGBD possui um operador de LIKE proprietário que permite que façamos o teste sem o uso da função UPPER. É o ILIKE, ou seja, Insensitive-LIKE. + +Quando o utilizamos, não precisamos nos preocupar com maiúsculas ou minúsculas. Veja a figura. + +![Utilizando o Ilike para consultar os sobrenomes que possuem a letra E](/media/Implementação-de-Banco-de-Dados/aula4/Image26.png) + +### Operador IS NULL + +O operador Is Null visa determinar se, no campo, existe valor ou não (o campo é nulo). + +Um valor nulo é um valor que está indisponível, não foi atribuído, é desconhecido ou inaplicável, tornando inviável usar ‘=’ no teste. Como nulo não é valor, mas sim ausência de valor, ele não pode ser igual ou diferente de qualquer outro valor. Considere a tabela CLIENTE. + +![Tabela CLIENTE](/media/Implementação-de-Banco-de-Dados/aula4/Image27.png) + +Se você desejasse retornar todos os dados dos CLIENTES que não são atendidos por um vendedor, o comando seria: + +```sql +SELECT * +FROM CLIENTE +WHERE VENDEDOR IS NULL +``` + +![Retornando todos os dados dos clientes que não são atendidos por um vendedor](/media/Implementação-de-Banco-de-Dados/aula4/Image28.png) + +Caso contrário, se você quisesse os que são atendidos por vendedor, utilizaria IS NOT NULL. + +![Retornar todos os dados dos clientes que são atendidos por um vendedor](/media/Implementação-de-Banco-de-Dados/aula4/Image29.png) diff --git "a/Faculdade/Implementa\303\247\303\243o-de-Banco-de-Dados/aula5.md" "b/Faculdade/Implementa\303\247\303\243o-de-Banco-de-Dados/aula5.md" new file mode 100644 index 0000000..d353025 --- /dev/null +++ "b/Faculdade/Implementa\303\247\303\243o-de-Banco-de-Dados/aula5.md" @@ -0,0 +1,402 @@ +# Aula 5 - LINGUAGEM SQL – Funções de Grupo + +Vamos continuar utilizando o modelo abaixo como exemplo: + +![Tabelas do banco de dados "Empresa"](/media/Implementação-de-Banco-de-Dados/aula5/Image1.png) + +As tabelas possuem os seguintes dados: + +Região: + +![Tabela Região](/media/Implementação-de-Banco-de-Dados/aula5/Image2.png) + +Departamento: + +![Tabela Departamento](/media/Implementação-de-Banco-de-Dados/aula5/Image3.png) + +Empregado: + +![Tabela Empregado](/media/Implementação-de-Banco-de-Dados/aula5/Image4.png) + +Cliente: + +![Tabela Cliente](/media/Implementação-de-Banco-de-Dados/aula5/Image5.png) + +## Eliminando valores duplicados (DISTINCT) + +Observe que na tabela Empregados, RODRIGUES e UGARTE possuem o mesmo cargo. E se desejássemos ver os diferentes cargos? Se comandássemos SELECT CARGO FROM EMPREGADO, teríamos o resultado desejado? + +![Resultado do comando SELECT CARGO FROM EMPREGADO](/media/Implementação-de-Banco-de-Dados/aula5/Image6.png) + +Em termos de dados, até poderíamos dizer que sim, que todos os cargos aparecem no resultado. Mas, em termos de facilidade para o usuário, isso é suficiente? + +Imagine que a tabela tivesse milhares de linhas com dezenas de cargos diferentes. + +O usuário ficaria confuso, pois teria muita dificuldade de isolar todos os cargos existentes ali. Para resolver esse tipo de caso, podemos, no comando, eliminar os valores duplicados, retornando apenas uma vez cada cargo. + +Para tal, devemos acrescentar a cláusula distinct ao comando de Select. Dessa forma o comando seria: + +```sql +SELECT DISTINCT CARGO +FROM EMPREGADO +``` + +![Retornando cargos únicos com Select Distinct](/media/Implementação-de-Banco-de-Dados/aula5/Image7.png) + +Agora conseguimos o resultado que queríamos. Observe agora o seguinte comando: + +```sql +SELECT DISTINCT CARGO, ULT_NOME +FROM EMPREGADO +``` + +![Utilizando o Distinct para filtrar linhas diferentes](/media/Implementação-de-Banco-de-Dados/aula5/Image8.png) + +Note que voltaram os dois vendedores. Por que isso ocorreu se o DISTINCT continua antes do cargo? **O Distinct, na realidade, filtra as linhas diferentes, não os valores da coluna.** Como os dois vendedores possuem nomes diferentes, as linhas são distintas, portanto as duas retornam. + +## Agregando dados + +Até agora todos os comandos que demos retornavam uma linha para cada linha da tabela ou uma linha para cada linha da tabela que atendesse a condição da cláusula Where. Veja os exemplos abaixo. + +![Retornando todas as linhas da tabela e retornando as linhas que atendem a condição da cláusula Where](/media/Implementação-de-Banco-de-Dados/aula5/Image9.jpeg) + +No primeiro comando, retornaram três linhas, o total de linhas da tabela. No segundo comando, duas linhas, o total de linhas que atendem a condição da cláusula Where. + +Observe agora os próximos dois comandos. + +![Retornando o valor total de linhas da tabela e retornando aquantidade de linhas que atendem a condição da cláusula Where](/media/Implementação-de-Banco-de-Dados/aula5/Image10.jpeg) + +Note que, com os dois comandos, retornou apenas uma linha. No primeiro, com valor três (total de linhas da tabela) e no segundo, com valor dois (quantidade de linhas que atendem a cláusula Where). + +O que mudou? Foi acrescentado COUNT na claúsula Select que, como você já deve ter percebido, **contou as linhas que a consulta retornaria e exibiu esse valor**. O que fizemos foi agregar dados, ou seja, **derivamos um dado sumarizado a partir dos dados da tabela**. + +## Funções de grupo + +Uma função de grupo atua em uma instância da tabela, ou seja, no conjunto de suas linhas. + +As funções agregam os dados a partir de todas a linhas da tabela ou de grupos em que as linhas possam ser enquadradas. + +A princípio, a tabela forma um único grupo, e a consulta com função de grupo retornará uma única linha. + +Ao utilizarmos a cláusula GROUP BY, podemos dividir a tabela em grupo, sendo que a consulta, então, retornará uma linha para cada grupo. Na linguagem SQL, possuímos as seguintes funções de grupo: + +### AVG (coluna) + +- Retorna a MÉDIA aritmética dos valores da coluna solicitada; + +- Exemplo: AVG (valor_segurado); + +- Se na coluna existirem nulos, ela os desconsidera no cálculo, + +- Os valores na coluna devem ser numéricos. + +### MAX (coluna) + +- Retorna o MAIOR valor existente na coluna solicitada; + +- Exemplo: MAX (CPF); + +- Se na coluna existirem nulos, ela os desconsidera. + +- Os valores na coluna podem ser numéricos, alfanuméricos ou datas + +### MIN (coluna) + +- Retorna o MENOR valor existente na coluna solicitada; + +- Exemplo: MIN (CPF); + +- Se na coluna existirem nulos, ela os desconsidera; + +- Os valores na coluna podem ser numéricos, alfanuméricos ou datas + +### SUM (coluna) + +- Retorna a soma aritmética dos valores da coluna solicitada; + +- Exemplo: SUM (valor_segurado); + +- Se na coluna existirem nulos, ela os desconsidera no cálculo; + +- Os valores na coluna devem ser numéricos. + +### COUNT (coluna) + +- Retorna o número de valores não nulos da coluna solicitada; + +- Exemplo: COUNT (CPF); + +- Os valores na coluna podem ser numéricos, alfanuméricos ou datas + +### COUNT (\*) + +- Retorna o número de linhas que a consulta retornaria; + +- Exemplo: COUNT (\*); + +- Considera os valores nulos. + +Vejamos alguns exemplos. + +Acesse o PostgreSQL e digite o seguinte comando: `SELECT * FROM EMPREGADO`. + +![Selecionando os dados de todos os empregados](/media/Implementação-de-Banco-de-Dados/aula5/Image11.png) + +Esse comando seleciona dados de todos os empregados. + +Vamos supor que você deseja recuperar apenas o valor médio dos salários e a soma dos salários. Para essa consulta, você comandaria: + +```sql +SELECT AVG(SALARIO), SUM(SALARIO) +FROM EMPREGADO +``` + +![Consultando o valor médio dos salários e a soma dos salários](/media/Implementação-de-Banco-de-Dados/aula5/Image12.png) + +Apesar de já ter sido dito, lembre-se sempre de que as funções AVG e SUM são numéricas, ou seja, exigem que os seus argumentos (colunas que passamos a função; no exemplo, a coluna SALÁRIO) sejam números. + +Agora você deseja listar o maior e o menor valor de salário de um empregado, os sobrenomes que aparecem como último e como primeiro na ordem alfabética crescente e as datas do empregado contratado há mais tempo e há menos tempo. Para isso basta comandar: + +![Resultado da consulta anterior](/media/Implementação-de-Banco-de-Dados/aula5/Image13.png) + +Observe que: + +- Podem ser utilizadas várias funções de grupo em paralelo, na mesma coluna ou em colunas distintas; + +- Quando o argumento da função é alfanumérico (como a coluna ult_nome), o valor que aparece por último na ordem alfabética crescente é o maior e o que aperece primeiro é o menor; + +- Quando o argumento da função é numérico (como a coluna salário), menor e maior se referem à posição dos números no sistema de numeração, respeitado o fato de serem positivos ou negativos; + +- Quando o argumento da função é data (como a coluna dt_admissao), menor e maior se referem à posição da data na linha do tempo, ou seja, a menor aparece primeiro na linha do tempo e a maior aparece por último. + +Mais um exemplo: + +Acesse o PostgreSql e digite o seguinte comando: `SELECT * FROM EMPREGADO`. + +![Resultado do comando SELECT * FROM EMPREGADO](/media/Implementação-de-Banco-de-Dados/aula5/Image14.png) + +Agora você deseja saber a quantidade de empregados e a quantidade de empregados que possuem gerentes. Como seria o comando? + +O comando seria: + +```sql +SELECT COUNT(*), COUNT(ID), COUNT(ID_GERENTE) +FROM EMPREGADO +``` + +E obteríamos um retorno similar ao da figura abaixo. + +![Retornando a quantidade de empregados e a quantidade de empregados que possuem gerentes](/media/Implementação-de-Banco-de-Dados/aula5/Image15.png) + +Observe que: + +- Count(\*) conta a quantidade de linhas retornadas, independentemente de seu conteúdo; + +- Count(coluna) conta a quantidade de linhas não nulas naquela coluna; + +- Se compararmos o resultado de count(id) com count(id_gerente), podemos notar que a primeira expressão retornou o valor 6, total de linhas da tabela já que ID é chave primária, não podendo possuir valor nulo. Já a segunda retornou 5, pois o empregado de ID 1 não possui gerente, de forma que somente cinco linhas possuem valor não nulo nesta coluna. + +Se acrescentar a função de grupo DISTINCT, essa passará a ignorar os valores duplicados, computando cada um deles apenas uma vez. + +Observe a figura abaixo que nos mostra o conteúdo das colunas CARGO e ID_DEPTO na tabela EMPREGADO. + +![Conteúdo das colunas CARGO e ID_DEPTO na tabela EMPREGADO](/media/Implementação-de-Banco-de-Dados/aula5/Image16.png) + +Podemos observar que, na coluna cargo, dentre seis linhas há duas com o valor vendedor, e na coluna id_depto, dentre seis linhas há quatro com o valor 20. + +Se desejássemos listar a quantidade de cargo e quantidade de cargos diferentes a quantidade de departamentos e a quantidade de departamentos diferentes, qual seria o comando? + +O comando seria: + +```sql +SELECT COUNT(CARGO), COUNT(DISTINCT CARGO), +COUNT(ID_DEPTO), COUNT( DISTINCT ID_DEPTO) +FROM EMPREGADO +``` + +Obteríamos um retorno similar ao da figura abaixo. + +![Resultado do comando anterior](/media/Implementação-de-Banco-de-Dados/aula5/Image17.png) + +Observe o seguinte: + +- Quando executamos o comando sem o distinct, (count(cargo) ou count(id_depto), são contadas todas as linhas não nulas; + +- Quando executamos o comando com o distinct, (count(distinct cargo) ou count(distinct id_depto), cada valor discreto existente na coluna é computado apenas uma vez. + +## Criando grupos nas tabelas + +Podemos agrupar os dados de nossa tabela utilizando a cláusula GROUP BY. Sintaxe: + +```sql +SELECT nome da coluna [ , nome da coluna] + FROM nome da tabela + WHERE condição + GROUP BY expressão +``` + +“Expressão” determina a(s) coluna(s) cujo(s) valor(es) vai servir de parâmetro para o agrupamento das linhas. Sobre os grupos criados serão aplicadas as funções de grupo, para gerar a sumarização desejada. + +Por exemplo: se você desejasse saber a quantidade de empregados, a média salarial e o valor da folha salarial de cada departamento da empresa, o comando seria: + +```sql +SELECT COUNT(*), AVG(SALARIO), SUM(SALARIO), ID_DEPTO +FROM EMPREGADO +GROUP BY ID_DEPTO +``` + +Obteríamos um retorno similar ao da figura abaixo. + +![Consultando quantidade de empregados, a média salarial e o valor da folha salarial de cada departamento](/media/Implementação-de-Banco-de-Dados/aula5/Image18.png) + +Observe o seguinte: + +- Na cláusula Group By, você deve colocar a coluna cujos valores serão utilizados para criar os grupos, sendo que pertencem ao mesmo grupo todas as linhas que possuem valores iguais na coluna; + +- Você também deve colocar na cláusula Select a coluna ou colunas utilizadas para criar os grupos, permitindo dessa forma que se saiba a qual grupo pertence o valor gerado pela função de grupo. + +No SELECT, só é permitido colocar COLUNAS que foram utilizadas no GROUP BY ou nas FUNÇÕES DE GRUPO. + +Observe o exemplo da figura abaixo, similar ao comando anterior, com a diferença de que não temos a cláusula GROUP BY, gerando um erro com a presença da coluna id_depto no select. + +![Erro com a presença da coluna id_depto no select](/media/Implementação-de-Banco-de-Dados/aula5/Image19.png) + +A cláusula GROUP BY permite que você crie grupos definidos por mais de uma coluna, ou seja, a agregação não será por uma coluna, mas por um conjunto de colunas. + +Para recuperar a quantidade de empregados que temos em cada cargo em cada departamento, poderíamos dar o comando mostrado na figura a seguir. + +![Consultando a quantidade de empregados em cada cargo e em cada departamento](/media/Implementação-de-Banco-de-Dados/aula5/Image20.png) + +## Filtrando dados agrupados + +Ao utilizar a cláusula GROUP BY, pode-se filtrar a seleção de dados antes deles serem agrupados OU/E após o agrupamento. O momento de realizar essa restrição depende do desejo de eliminar linhas da tabela antes de aplicar as funções de grupo, criando uma condição na cláusula WHERE, ou se o seu intuito é eliminar GRUPOS que não atendam a uma determinada condição, utilizando nesse caso a cláusula HAVING. + +Vejamos alguns exemplos: + +Você deseja filtrar a consulta por dados que existem na tabela. Por exemplo, quer contar a quantidade de empregados, o salário médio e a soma dos salários dos empregados do departamento 20. Nesse caso devemos filtrar os dados antes de agrupá-los utilizando WHERE, já que a filtragem será realizada por um dado que existe na tabela, o ID_DEPTO. + +```sql +SELECT COUNT(*), AVG(SALARIO), SUM(SALARIO) +FROM EMPREGADO +WHERE ID_DEPTO = 20 +``` + +E obteríamos um retorno similar ao da figura. + +![Filtrando os dados dos empregados do departamento 20](/media/Implementação-de-Banco-de-Dados/aula5/Image21.png) + +Em resumo, temos que: + +- Quando se deseja filtrar antes do agrupamento, utiliza-se a cláusula WHERE para eliminar as linhas da tabela que não nos interessa agrupar, de forma similar ao que fazemos no comando select, quando não desejamos que as linhas retornem no resultado da consulta; + +- A condição estabelecida no WHERE, as linhas que não a atendem, no caso do exemplo as linhas que não são do ID_DEPTO 20, não retornam. Dessa forma somente as linhas do departamento 20 estarão no conjunto a ser feito com a agregação de dados; + +- Após a filtragem das linhas da tabela é que os dados são agrupados e as funções aplicadas, retornando, portanto, apenas os valores referentes ao departamento desejado. + +A cláusula HAVING tem função semelhante à cláusula WHERE, mas é aplicada aos resultados das funções de grupo geradas para cada grupo, não nas linhas das tabelas. Em outras palavras, após gerarmos os resultados dos grupos, podemos filtrá-los retornando apenas aqueles que atendam às condições da Cláusula HAVING. + +Considere agora o seguinte comando: + +```sql +SELECT ID_DEPTO, COUNT(*), AVG(SALARIO), SUM(SALARIO) +FROM EMPREGADO +GROUP BY ID_DEPTO +``` + +![Retorno do comando anterior](/media/Implementação-de-Banco-de-Dados/aula5/Image22.png) + +Note que os departamentos 20 e 30 possuem mais de um empregado. Se desejássemos listar os departamentos que possuem mais de um empregado, como seria o comando? + +A primeira ideia que poderíamos ter seria utilizar a cláusula WHERE como no seguinte comando: + +```sql +SELECT COUNT(*), AVG(SALARIO), SUM(SALARIO), ID_DEPTO +FROM EMPREGADO +WHERE COUNT(*) > 1 +GROUP BY ID_DEPTO +``` + +Esse comando gera um erro, conforme podemos ver na figura abaixo: + +![Erro ao utilizar a função Count na clásula Where](/media/Implementação-de-Banco-de-Dados/aula5/Image23.png) + +Não podemos utilizar funções de grupo desta forma na cláusula WHERE, somente em subconsulta, como veremos mais à frente no curso. Além disso, devemos lembrar que, na tabela original, não existe a contagem de linhas e a cláusula WHERE trabalha nos dados existentes na tabela. + +Qual seria o comando então? Veja na figura abaixo. + +![Utilizando corretamente a função Count com a clásula Having](/media/Implementação-de-Banco-de-Dados/aula5/Image24.png) + +Note o uso da cláusula HAVING para criar condições às quais os grupos devem obedecer para poderem retornar. Podemos dizer que a cláusula HAVING é similar à cláusula WHERE somente se aplicada aos dados gerados pelas funções de grupo. + +Observe que você pode apenas usar WHERE para restringir linhas individuais. Para restringir grupos, usa-se a cláusula HAVING. + +Um comando com cláusulas WHERE e HAVING funciona obedecendo aos seguintes passos: + +- Primeiro são selecionadas as linhas da tabela que satisfazem a condição da cláusula WHERE (se não houver, todas a linhas são selecionadas); + +- As linhas são agrupadas; + +- A função de grupo é aplicada ao Grupo; + +- Os grupos que satisfazem a condição do HAVING são exibidos (se não houver, todos os grupos serão exibidos). + +## Ordenando consultas + +Até agora, em todos os comandos que você viu, as linhas retornaram na ordem em que foram produzidas. Porém, muitas vezes, pode ser necessário que elas sejam ordenadas. Para permitir isso, o SQL possui a cláusula ORDER BY. + +O resultado de uma consulta pode ser ordenado pelo valor de uma ou mais colunas, de forma crescente ou decrescente. + +A sintaxe básica do ORDER By é: + +```sql +SELECT { * | nome da coluna [, nome da coluna ...]} + FROM nome da tabela + WHERE condição {AND | OR} condição + ORDER BY nome da coluna [ ASC | DESC ] [, nome da coluna [ ASC | DESC] . ] +``` + +Onde: + +- ASC ordena as linhas de forma ascendente; é a ordenação default. + +- DESC ordena as linhas de forma descendente. + +A cláusula ORDER BY será sempre a última de um comando SQL. + +Vejamos um exemplo: desejamos listar o ID, o sobrenome, a data de admissão, o cargo e o salário de todos os empregados em ordem crescente de salário. + +![Ondenando a consulta com Order By](/media/Implementação-de-Banco-de-Dados/aula5/Image25.png) + +Note que: + +- O resultado da consulta voltou ordenado na forma solicitada. No exemplo, a ordenação definida na cláusula ORDER BY fez com que as linhas retornadas da tabela EMPREGADO sejam ordenadas por SALÁRIO e só então exibidas; + +- O padrão default de ordenação da cláusula ORDER BY é crescente. Dessa forma, o uso de ASC para indicar a ordem crescente (ascendente) é opcional. Se for omitida, a ordenação ascendente será realizada, como foi o caso do exemplo. + +### Ordenação decrescente + +Para a ordenação decrescente, basta utilizarmos a opção DESC (descendente) no lugar de ASC. + +![Ordenação decrescente com Desc](/media/Implementação-de-Banco-de-Dados/aula5/Image26.png) + +### Ordenação múltipla + +Podemos realizar a ordenação por várias colunas na mesma consulta. Podemos ordenar o resultado por cargo e, a partir da primeira ordenação, dentro de cada cargo por salário. Veja o exemplo abaixo. + +![Ordenação múltipla](/media/Implementação-de-Banco-de-Dados/aula5/Image27.png) + +Observe que o resultado é inicialmente ordenado pela CARGO de forma DESCENDENTE (VENDEDOR, PRESIDENTE, ETC.) e ao termos uma CARGO repetido (observe o VENDEDOR) as linhas de mesma CARGO são ordenadas entre si por SALARIO de forma ascendente. + +No comando, usamos o argumento ASC, mas como é forma padrão de ordenação, poderíamos omiti-lo. + +Outra forma de comandarmos a ordenação é pela posição da coluna no resultado. Com isso o comando anterior poderia ser escrito da seguinte forma: + +```sql +SELECT * +FROM VEICULO +ORDER BY 2 ASC, 5 DESC +``` + +Onde os números 4 e 5 referenciam a quarta coluna (CARGO) e a quinta (SALÁRIO), produzindo, dessa forma, o mesmo resultado na consulta. + +![Outra forma de realizar a ordenação](/media/Implementação-de-Banco-de-Dados/aula5/Image28.png) diff --git "a/Faculdade/Implementa\303\247\303\243o-de-Banco-de-Dados/aula6.md" "b/Faculdade/Implementa\303\247\303\243o-de-Banco-de-Dados/aula6.md" new file mode 100644 index 0000000..d160f9b --- /dev/null +++ "b/Faculdade/Implementa\303\247\303\243o-de-Banco-de-Dados/aula6.md" @@ -0,0 +1,188 @@ +# Aula 06 - Linguagem SQL – junção + +Continuaremos usando o banco de dados da empresa para os exemplos. + +## Junções de tabelas + +O banco de dados da EMPRESA possui, na tabela DEPARTAMENTO, os dados dos departamentos e, na tabela REGIÃO, os dados regiões. + +Se você reparar no esquema da tabela DEPARTAMENTO, vai notar a existência de uma chave estrangeira (ID_REGIAO) para a tabela REGIÃO que nos permite saber a região a que o departamento pertence. + +Se você deseja pegar dados dos departamentos e de sua região, por exemplo, vai utilizar a FK ID_REGIAO para ligar as linhas das duas tabelas, fazendo uma junção. + +Lembre-se que, na modelagem lógica, os relacionamentos são mapeados em chaves estrangeiras. Desta forma, fazer junção nada mais é que recuperar os dados das entidades que estão relacionadas nas duas tabelas. + +Tipos de junção: + +- Junção cruzada: retorna o produto cartesiano das duas tabelas, ou seja, a combinação de todas as linhas de uma tabela com todas as linhas de outra tabela. + +- Junção interior: neste tipo, retornam as linhas que estão relacionadas nas duas tabelas. + +- Junção exterior: neste tipo, retornam as linhas relacionadas e as não relacionadas em uma ou duas tabelas. + +Sintaxe da junção: os comandos de junção interior e junção cruzada podem ser escritos de duas formas diferentes, ou seja, em duas sintaxes diferentes. Uma delas é a tradicional, mais antiga e a segunda é a sintaxe ANSI. + +- Tradicional: Na cláusula from, listamos as tabelas com seus nomes separados por vírgula e, no caso da junção interior, na cláusula where deve ser escrita a condição de junção [join condition], que as linhas devem atender para participarem da resposta. + +- ANSI: Na cláusula from, deve ser especificado o tipo de junção que estamos realizando com a condição de junção sem ser estabelecida na subcláusula on. + +Os comandos de junção exterior, na maioria dos SGBDs, serão escritos na sintaxe ANSI. + +## Junção cruzada (cross join) + +Este tipo de junção gera a combinação de todas as linhas de uma tabela com todas as linhas da outra tabela; é o chamado **produto cartesiano**. + +Como a junção cruzada, combinadas todas as linhas das duas tabelas, não existe uma condição de junção. + +Observe o conteúdo das tabelas Departamento e Região: + +![Tabelas Departamento e Região](/media/Implementação-de-Banco-de-Dados/aula6/Image1.png) + +Se você comandar a junção cruzada das duas tabelas, o que irá acontecer? + +A tabela Veículo possui 10 linhas e modelo 5. O resultado final terá então 50 linhas, já que cada uma das linhas da tabela será combinada com todas as linhas de Modelo. + +Na sintaxe tradicional, o comando será: + +```sql +SELECT * +FROM DEPARTAMENTO, REGIÃO +``` + +![Retornando os dados das tabelas Departamento e Região](/media/Implementação-de-Banco-de-Dados/aula6/Image2.png) + +Note que: + +1. Retornam seis linhas. + +2. Se você olhar a última coluna (nome da região primeiro), temos a região Norte, associada a todos os três departamentos, e depois Sul associada a todos os departamentos. + +3. Se existissem mais regiões, o descrito no item 2 se repetiria para todas. + +4. As linhas 1 e 4 são do mesmo departamento, já que é o início de um novo conjunto de linhas ligadas à mesma região. + +5. Não existe condição de junção. + +6. O esquema do retorno, ou seja a ordem das colunas, é a justaposição das colunas da primeira tabela da cláusula from com as da segunda. Se você inverter a ordem na cláusula from, o retorno também será invertido, como mostra a figura a seguir. + +![Invertendo a ordem das colunas na cláusula from](/media/Implementação-de-Banco-de-Dados/aula6/Image3.jpeg) + +Já na sintaxe ANSI, devemos escrever na cláusula from o tipo de junção comandado. + +```sql +SELECT * +FROM DEPARTAMENTO CROSS JOIN REGIAO +``` + +![Usando o Cross Join na cláusula From](/media/Implementação-de-Banco-de-Dados/aula6/Image4.jpeg) + +Observe agora o seguinte comando: + +```sql +SELECT * +FROM EMPREGADO +CROSS JOIN DEPARTAMENTO +CROSS JOIN REGIAO +``` + +![Retorno do comando anterior com o produto cartesiano das três tabelas](/media/Implementação-de-Banco-de-Dados/aula6/Image5.jpeg) + +Ele faz o produto cartesiano das três tabelas, gerando 36 linhas (6 empregados X 3 departamentos X 2 regiões). + +Em qualquer comando de junção, independentemente da sintaxe, podemos determinar as colunas que desejamos, basta listá-las no Select. + +Se você desejasse retornar apenas o nome do departamento e o nome da região, poderia comandar: + +```sql +SELECT NOME, NOME +FROM DEPARTAMENTO CROSS JOIN REGIAO +``` + +Correto? Não; veja o erro do comando: + +![Erro ao tentar retornar apenas o nome do departamento e o nome da região](/media/Implementação-de-Banco-de-Dados/aula6/Image6.jpeg) + +Analise a mensagem de erro. Ela diz que a coluna nome é ambígua. Como assim, ambígua? + +Acontece que tanto a tabela Departamento como a tabela Região têm uma coluna com o título Nome, e o SGBD não sabe qual delas utilizar no comando. A solução é qualificar a coluna, ou seja, colocar o nome da tabela seguido do nome da coluna ligados por um ponto, da seguinte forma: + +![Qualificando a coluna no comando](/media/Implementação-de-Banco-de-Dados/aula6/Image7.jpeg) + +Esta solução, a qualificação como o nome da tabela, pode ser trabalhosa, já que os nomes de tabela podem ter até 40 caracteres. Uma forma para resolvermos isso é apelidarmos as tabelas e usarmos este apelido para qualificarmos as colunas. + +Um apelido (também chamado de alias) de tabela nada mais é que uma ou mais letras colocadas logo depois do nome da tabela na cláusula FROM. + +Observe este comando e reflita: + +![Utilizando um apelido de tabela](/media/Implementação-de-Banco-de-Dados/aula6/Image8.jpeg) + +Atenção: Depois que você cria o apelido, não pode mais utilizar o nome da tabela para qualificar as colunas. + +## Junção interior (inner join) + +Este tipo de junção recupera as linhas relacionadas nas tabelas envolvidas na junção. + +Se você desejasse retornar os dados do departamento e os da região a que o departamento pertence, seria este tipo de junção que deveria comandar. O fato de retornarem as linhas relacionadas apenas acarreta que, se existem departamentos sem região ou região que não tem departamentos, estes não aparecem no resultado. + +O Inner join é também chamado de Equijoin quando a condição de junção utiliza a igualdade, ou seja, quando o valor da coluna de uma tabela (normalmente a chave estrangeira) é igual ao valor da coluna na outra tabela (normalmente a chave primária). + +Essa junção pode ser comandada tanto na sintaxe tradicional como na ANSI. + +### Junção interior – sintaxe tradicional + +```sql +select +from tabela1, tabela2 +where ; +``` + +Condição de junção é uma expressão de comparação entre as colunas das duas tabelas envolvidas, normalmente a chave de primária de uma com a chave estrangeira da outra. + +Na realidade, a sintaxe tradicional pode ser entendida como o produto cartesiano das duas tabelas seguido de uma seleção utilizando a cláusula where. + +Vamos comandar a junção de Departamento e Região. A coluna ID_REGIAO em departamento é uma FK para a tabela Região, que tem como PK a coluna ID_REGIAO. Desta forma, o comando seria: + +```sql +SELECT * +FROM DEPARTAMENTO D, REGIAO R +WHERE D.ID_REGIAO = R.ID_REGIAO +``` + +![Comando de junção das tabelas Departamento e Região com a sintaxe tradicional](/media/Implementação-de-Banco-de-Dados/aula6/Image9.png) + +### Junção interior – sintaxe ANSI + +Na sintaxe ANSI, junções interiores são indicadas com inner join: + +```sql +select +from tabela1 INNER JOIN tabela2 ON +``` + +No caso anterior, o comando seria: + +```sql +SELECT * +FROM DEPARTAMENTO D +INNER JOIN REGIAO R ON D.ID_REGIAO = R.ID_REGIAO +``` + +![Realizando junção interior com a sintaxe ANSI](/media/Implementação-de-Banco-de-Dados/aula6/Image10.jpeg) + +### Junção interior de mais de duas tabelas + +Podemos fazer a junção de mais de duas tabelas. Para isto, basta acrescentarmos uma nova tabela com uma nova cláusula de junção. + +Vejamos um exemplo inicialmente na sintaxe ANSI. A primeira coisa a fazer é identificar quais tabelas podem se juntar. Analise o modelo do banco: + +![Modelo do banco de dados da empresa](/media/Implementação-de-Banco-de-Dados/aula6/Image11.jpeg) + +Temos uma FK de Empregado para Departamento e uma FK de Departamento para Região. Desta forma, temos que comandar a junção de Empregado com Departamento, que gera uma tabela intermediária em memória, e juntar este resultado com Região. + +![Unindo o resultado da junção de Empregado com Departamento com a tabela Região](/media/Implementação-de-Banco-de-Dados/aula6/Image12.jpeg) + +O mesmo comando na sintaxe tradicional seria: + +![Comando de junção na sintaxe tradicional](/media/Implementação-de-Banco-de-Dados/aula6/Image13.jpeg) + +Neste caso, colocamos as tabelas na cláusula from e as condições de junção no where, ligadas por and. diff --git "a/Faculdade/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7.md" "b/Faculdade/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7.md" new file mode 100644 index 0000000..321fdd3 --- /dev/null +++ "b/Faculdade/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7.md" @@ -0,0 +1,388 @@ +# Aula 07 - Linguagem SQL – Subconsulta e Operadores de Conjunto + +Continuaremos usando o banco de dados da empresa para os exemplos. + +## Junção exterior (outer join) + +Este tipo de junção retorna as linhas que estão relacionadas, como no INNER JOIN, e as não relacionadas de uma ou mais tabelas. + +Exemplo: Queremos retornar todos os empregados e os clientes que eles atendem. Este comando seria um comando de junção interior normal, no qual a coluna Vendedor deve ser igualada à coluna ID de empregado. Observe que somente os empregados de ID 5 e 6 atendem algum cliente, portanto apenas eles podem retornar na consulta. + +EMPREGADO + +![Tabela Empregado](/media/Implementação-de-Banco-de-Dados/aula7/Image1.jpeg) + +VENDEDOR = ID + +CLIENTE + +![Tabela Cliente](/media/Implementação-de-Banco-de-Dados/aula7/Image2.jpeg) + +O comando seria então: + +```sql +SELECT C.ID, C.NOME, E.ID, E.ULT_NOME, E. CARGO +FROM EMPREGADO E INNER JOIN CLIENTE C ON C. +VENDEDOR = E. ID +``` + +Que geraria o seguinte resultado: + +![Retornando os empregados e os clientes que eles atendem](/media/Implementação-de-Banco-de-Dados/aula7/Image3.jpeg) + +Note que no resultado voltam apenas os empregados de id 5 e 6, pois estão relacionados como clientes; os demais não aparecem no resultado (id 1, 2, 3 e 4). + +E se desejássemos retornar todos os empregados e para os vendedores os dados dos clientes? + +Comandaríamos então uma junção exterior. Neste caso, substituiríamos a expressão inner por left ou right caso a tabela que desejamos retornar esteja do lado esquerdo ou direito do comando. + +No caso, como empregado está à esquerda, o comando seria: + +```sql +SELECT C.ID, C.NOME, E.ID, E.ULT_NOME, E. CARGO +FROM EMPREGADO E LEFT JOIN CLIENTE C ON C. VENDEDOR = E. ID +``` + +![Retornando todos os empregados e para os vendedores os dados dos clientes](/media/Implementação-de-Banco-de-Dados/aula7/Image4.jpeg) + +Note que as colunas de clientes ficam nulas nas linhas que correspondem aos empregados que não se relacionam com clientes. + +E se o comando fosse de right join, o que aconteceria? + +```sql +SELECT C. ID, C. NOME, E. ID, E. ULT_NOME, E. CARGO +FROM EMPREGADO E RIGHT JOIN CLIENTE C ON C. +VENDEDOR = E. ID +``` + +![Aplicando o comando anterior com right join](/media/Implementação-de-Banco-de-Dados/aula7/Image5.jpeg) + +Retornaríamos todos os clientes e, para os que não se relacionam com vendedores (Casa Desconto), as colunas de empregado seriam nulas. + +Uma terceira forma de fazer a junção exterior é com full join: + +![Fazer a junção exterior com full join](/media/Implementação-de-Banco-de-Dados/aula7/Image6.jpeg) + +O full join retorna todos os relacionados e os não relacionados das duas tabelas, preenchendo com nulo as colunas da outra tabela para as linhas não relacionadas. Ou seja, é um left e um right realizados em conjunto. + +Você pode estar se perguntando: Para que serve isso? Por que eu desejaria retornar os relacionados e os não relacionados? + +Normalmente isso ocorre: + +1. Quando você deseja saber quais elementos de uma tabela não estão relacionados com os da outra tabela. + +2. Quando você precisa fazer uma junção e necessita garantir que retornem todos os elementos de uma determinada tabela. + +Vamos discutir cada um destes casos. + +Determinar os elementos não relacionados: + +Para exemplificar esta situação, vamos incluir mais uma linha na tabela de Região. + +```sql +INSERT INTO REGIAO VALUES (3,'Centro') +``` + +A tabela então ficaria: + +![Incluindo mais uma linha na tabela Região](/media/Implementação-de-Banco-de-Dados/aula7/Image7.jpeg) + +Se olharmos na tabela de Departamentos, veremos que não existe departamento ligado à região Centro (id_regiao = 3). + +![Tabela Departamentos](/media/Implementação-de-Banco-de-Dados/aula7/Image8.jpeg) + +Vamos detalhar a primeira situação: quando você deseja saber quais elementos de uma tabela não estão relacionados com os da outra tabela. Portanto, se você desejasse retornar todos os dados das regiões que não têm departamentos, teria de comandar uma junção exterior. + +Façamos passo a passo: + +1. Fazer a junção exterior: + + Primeiro, temos que determinar como fazer a junção exterior. Para isso, escrevemos o comando retornando todas as colunas das duas tabelas. + +![Retornando todas as colunas das duas tabelas](/media/Implementação-de-Banco-de-Dados/aula7/Image9.jpeg) + +2. Isolar a região não ligada a departamentos: + + Analisando o retorno, podemos notar que a PK da tabela Departamento (coluna ID) ligada à região Centro é nula. Como vimos, isso acontece devido ao fato de a junção exterior acrescentar ao retorno uma linha toda nula nas colunas da tabela de departamento. + + Desta forma, basta filtrar o resultado por esta coluna para isolar a região Centro: + +![Filtramdo o resultado pela coluna id da tabela Departamento para isolar a região Centro](/media/Implementação-de-Banco-de-Dados/aula7/Image10.jpeg) + +3. Retornar apenas os dados da Região + + Se você observar vai notar que estão retornando as colunas de departamento (todas nulas). Para retornarem apenas as da Região, basta fazer a projeção: + +![Retornando apenas as colunas da Região](/media/Implementação-de-Banco-de-Dados/aula7/Image11.jpeg) + +Duas observações importantes: + +Note o uso do alias com o \* no select (R.\*). É uma forma otimizada de pedir para retornar todas as colunas de uma das tabelas, sem ter que listá-las na cláusula. + +O passo a passo mostrado é meramente didático; o comando da última figura funciona e gera o resultado esperado. + +Vejamos agora um exemplo da segunda situação: Quando você precisa fazer uma junção e necessita garantir que retornem todos os elementos de uma determinada tabela. Você deseja retornar o nome da região e o do departamento que fica na região. Para regiões que não têm departamento, retornar o nome da região e o texto “não tem”. + +Conforme vimos no caso anterior, a Região 3, Centro, não está ligada a nenhum departamento, portanto se fizéssemos um inner join, ela não retornaria. + +![O comando com inner join não retorna a região Centro](/media/Implementação-de-Banco-de-Dados/aula7/Image12.jpeg) + +Teremos então que fazer um outer join. Vamos novamente passo a passo: + +1. Fazer a junção exterior: + + Primeiro, temos que determinar como fazer a junção exterior; para isto, escrevemos o comando retornando todas as colunas das duas tabelas: + +![Retornando todas as colunas das duas tabelas](/media/Implementação-de-Banco-de-Dados/aula7/Image13.jpeg) + +2. Projetar as colunas desejadas: + + Como desejamos apenas as colunas Nome da região e Nome do departamento, devemos fazer a sua especificação na cláusula select. + +![Consultando as colunas Nome da região e Nome do departamento com a cláusula Select](/media/Implementação-de-Banco-de-Dados/aula7/Image14.jpeg) + +3. Substituir o nulo no nome do Departamento pela mensagem “Não tem”: + + Para fazer esta substituição, vamos utilizar uma função chamada COALESCE. Se o primeiro valor nos parênteses for nulo, a função o substitui pelo segundo valor: + +![Usando a função COALESCE para fazer a substituição](/media/Implementação-de-Banco-de-Dados/aula7/Image15.jpeg) + +Duas observações importantes: + +Este comando funciona exatamente da mesma forma no Oracle e no SQLServer. + +O passo a passo mostrado é meramente didático; o comando da última figura funciona e gera o resultado esperado. + +Finalmente, você pode estar se perguntando: onde está o outer no comando de junção exterior, já que em todos os comandos que demos ele não aparece, ao contrário da junção interior, na qual sempre escrevemos inner? + +Na realidade, tanto inner como outer são opcionais. Na próxima figura, podemos ver o comando utilizando outer, e na seguinte, o de inner join somente com join. + +![Comando com o outer join](/media/Implementação-de-Banco-de-Dados/aula7/Image16.jpeg) + +![Comando de inner join somente com join](/media/Implementação-de-Banco-de-Dados/aula7/Image17.jpeg) + +Qual seria o comando para mostrarmos uma lista de todos os gerentes, cada um com seus subordinados? + +### Junção exterior – sintaxe tradicional do Oracle + +Ao contrário da sintaxe tradicional de inner join, que é igual em todos os SGBDs, existe no Oracle uma sintaxe de outer join proprietária cuja sintaxe tradicional é: + +```sql +SELECT nome da tabela1.nome da coluna, nome da tabela2.nome da coluna .... +FROM nome da tabela1, nome da tabela2 +WHERE nome da tabela1.nome da coluna (+) = nome da tabela2.nome da coluna +``` + +Onde: (+) é o símbolo do outer join, que pode ser colocado em quaisquer dos lados da cláusula where, mas não em ambos os lados. Este símbolo deve ser colocado seguindo o nome da coluna, que pode não ter correspondente. + +No caso do nosso exemplo, envolvendo clientes e vendedores, no qual desejamos retornar todos os empregados e para os vendedores os dados dos clientes, o comando na sintaxe tradicional seria: + +```sql +SELECT C.ID, C.NOME, E.ID, E.ULT_NOME, E. CARGO +FROM CLIENTE C, EMPREGADO E +WHERE C. VENDEDOR (+) = E.ID +``` + +O resultado pode ser visto na figura e é o equivalente a um right join na sintaxe ANSI. + +![Resultado do comando na sintaxe tradicional](/media/Implementação-de-Banco-de-Dados/aula7/Image18.jpeg) + +O operador de outer join (+) não tem ligação com o lado da tabela na cláusula from. + +Observe na figura o comando invertendo a ordem das tabelas na from e veja que o resultado é o mesmo, equivalendo agora a um left join. + +![Resultado após inverter a ordem das tabelas na from](/media/Implementação-de-Banco-de-Dados/aula7/Image19.jpeg) + +Na sintaxe tradicional do Oracle, não é possível fazer um full join; o comando gera erro: + +![Erro ao dar o comando com full join](/media/Implementação-de-Banco-de-Dados/aula7/Image20.jpeg) + +## Autojunção + +Uma autojunção [self join] é uma junção da tabela com ela mesma. Na tabela Empregado, por exemplo, cada empregado está subordinado a outro. A coluna 'id_gerente' indica o código do gerente do empregado. + +![Tabela Empregado](/media/Implementação-de-Banco-de-Dados/aula7/Image21.jpeg) + +Para mostrarmos uma lista de todos os gerentes, cada um com seus subordinados, podemos comandar na sintaxe tradicional: + +```sql +SELECT G.ID, G.ULT_NOME, G.CARGO, S.ID, S.ULT_NOME, S. CARGO +FROM EMPREGADO G, EMPREGADO S +WHERE S.ID_GERENTE = G.ID +``` + +Nesse caso, é obrigatório usar um apelido de tabela para distinguir as duas "cópias" da tabela que estão sendo relacionadas: 'G', no , representa uma linha da tabela Empregado, enquanto Gerente e 'S' representam outra linha, de um subordinado, que estão sendo comparadas entre si. + +Podemos ver o resultado dessa consulta: + +![Mostrando uma lista de todos os gerentes, cada um com seus subordinados](/media/Implementação-de-Banco-de-Dados/aula7/Image22.jpeg) + +Na sintaxe ANSI, o mesmo comando seria: + +```sql +SELECT G.ID, G._ULT_NOME, G.CARGO, S.ID, S.ULT_NOME, S. CARGO +FROM EMPREGADO G INNER JOIN EMPREGADOS ON S.ID_GERENTE = G.ID +``` + +Obteríamos o mesmo resultado da consulta anterior. + +![Comando anterior aplicado com a sintaxe ANSI](/media/Implementação-de-Banco-de-Dados/aula7/Image23.jpeg) + +Note que na realidade a autojunção não é um tipo de comando de junção; o comando é de inner join; é uma forma de raciocinar para fazer a junção de uma tabela com ela mesma. + +## Junção using + +Existe uma outra terceira forma de se escrever um comando de junção interior, a junção using, mas o que vem a ser isso? + +Repare que, tanto na tabela Departamento quanto na Região, temos uma coluna chamada id_regiao, FK em Departamento e PK em Região, que seria utilizada na cláusula de junção no comando. + +![Tabela Departamento e tabela Região](/media/Implementação-de-Banco-de-Dados/aula7/Image24.jpeg) + +O comando de junção normal seria: + +![Comando de junção normal](/media/Implementação-de-Banco-de-Dados/aula7/Image25.jpeg) + +Quando esta situação ocorre, em vez de comandarmos inner join on, podemos comandar inner join using, pondo entre parênteses a coluna comum às duas tabelas. Veja o comando e seu retorno: + +![Comando com inner join using](/media/Implementação-de-Banco-de-Dados/aula7/Image26.jpeg) + +Compare agora os dois retornos: as linhas que voltam são as mesmas, mas a coluna ID_REGIAO retorna apenas uma vez no using. + +Você pode utilizar using para comandos de outer join. + +![Comando Right join com using](/media/Implementação-de-Banco-de-Dados/aula7/Image27.jpeg) + +A junção using, além do PostgreSQL, funciona no Oracle, mas no SQLServer dá erro. + +![Comparação de uso da junção using no Oracle e mensagem de erro no SQLServer](/media/Implementação-de-Banco-de-Dados/aula7/Image28.jpeg) + +## Natural join + +A junção natural é um tipo de junção que você realiza pelas colunas de mesmo nome de duas tabelas. Embora pareça similar ao using, temos que tomar alguns cuidados. Vamos repetir a junção de Departamento e Região usando natural join: + +![Comando com Natural Join](/media/Implementação-de-Banco-de-Dados/aula7/Image29.jpeg) + +Note que o comando não deu erro, mas não retornaram linhas. O que aconteceu? + +Existem duas colunas de mesmo nome das tabelas (ID_REGIAO e NOME), mas isso não atrapalhou no using, pois especificamos a coluna a ser usada. + +![Tabela Departamento e Tabela Região com duas colunas de mesmo nome](/media/Implementação-de-Banco-de-Dados/aula7/Image30.jpeg) + +Para podermos fazer a junção natural aqui, somente ID_REGIAO poderia ser comum. Vamos então criar uma nova tabela, cópia de Região, mas chamando a coluna nome com NOMEREG: + +![Criando uma tabela cópia de Região e nomeando a coluna como NOMEREG](/media/Implementação-de-Banco-de-Dados/aula7/Image31.jpeg) + +Para a criação da tabela, utilizamos o comando select into from, que tem a seguinte sintaxe: + +```sql +Select +Into +From +``` + +No caso, copiamos as colunas (SELECT) ID_REGIAO e NOME, alterando o nome desta para NOMEREG para dentro (INTO) da tabela CREG a partir (FROM) da tabela Região. Se olharmos agora a estrutura das tabelas Departamento e Região, poderemos notar que existe apenas uma coluna com o mesmo nome entre elas (ID_REGIAO). + +![Tabelas Departamento e Região](/media/Implementação-de-Banco-de-Dados/aula7/Image32.jpeg) + +Agora o comando de natural join poderá ser executado. + +![Executando o comando Natural Join](/media/Implementação-de-Banco-de-Dados/aula7/Image33.jpeg) + +Note que, como aconteceu na junção USING ID_REGIAO, retornou uma única vez. + +Este comando funciona no Oracle e no SQLServer? Vamos ver; primeiro criaremos a tabela CREG nos dois SGBDs. + +O Comando no SQLServer é o mesmo do PostgreSQL, mas no Oracle é diferente: é o comando `create table as Select` o que você deseja copiar. + +![Criando a tabela CREG no SQLServer e no Oracle](/media/Implementação-de-Banco-de-Dados/aula7/Image34.jpeg) + +Vamos comandar agora o natural join nos dois: + +![Comando Natural Join no SQLServer e Oracle](/media/Implementação-de-Banco-de-Dados/aula7/Image35.jpeg) + +No Oracle, o comando funciona, mas no SQLServer dá erro, como acontece com o using. + +## Neoquijoin + +Todos os comandos de junção que demos até agora foram feitos com a utilização do sinal de igual (=) na cláusula de junção. Este tipo de junção é chamado de equijoin, ou seja, junção baseada em igualdade. Mas nós podemos dar comando utilizando outros tipos de comparação. Para podemos exemplificar, vamos criar uma tabela chamada Tipo_Salario, com o seguinte comando: + +```sql +CREATE TABLE TIPO_SALARIO +(TIPO VARCHAR(20) PRIMARY KEY, +LIMITE_INFERIOR INTEGER, +LIMITE_SUPERIOR INTEGER); +``` + +A seguir, vamos inserir três linhas: + +```sql +INSERT INTO TIPO_SALARIO VALUES ('BAIXO',1000,10000); +INSERT INTO TIPO_SALARIO VALUES ('MEDIO',10001,20000); +INSERT INTO TIPO_SALARIO VALUES ('ALTO',20001,50000); +``` + +Ao término dos comandos, a tabela ficará com os seguintes dados: + +![Tabela Tipo_Salario](/media/Implementação-de-Banco-de-Dados/aula7/Image36.jpeg) + +Agora imagine que você deseja recuperar o ID, o sobrenome e o salário do empregado e o seu tipo salarial. Os três primeiros dados estão na tabela de empregados, mas o tipo está na tabela Tipo_Salario. + +Temos então que fazer uma junção, mas como, se não temos uma chave que ligue as tabelas? + +Queiroz, o empregado de ID 4, ganha 8000. Se você comparar este valor com os limites de cada tipo da tabela Tipo_Salario (figura 34), notará que ele tem um salário do tipo baixo, pois está entre o limite inferior e o superior deste tipo. + +![Dados da tabela Empregado](/media/Implementação-de-Banco-de-Dados/aula7/Image37.jpeg) + +A forma de fazer a junção, então, é estabelecer uma cláusula de junção que verifique em qual faixa o salário do empregado se encaixa: + +![Junção verificando em qual faixa o salário do empregado se encaixa](/media/Implementação-de-Banco-de-Dados/aula7/Image38.jpeg) + +Comentário: Este comando funciona exatamente da mesma forma no Oracle e no SQLServer. + +![Comando aplicado no SQLServer e no Oracle](/media/Implementação-de-Banco-de-Dados/aula7/Image39.jpeg) + +Para podermos visualizar melhor estes comandos, vamos inserir mais uma linha na tabela de Veículos que não terá um proprietário. + +![Inserindo mais uma linha na tabela de Veículos](/media/Implementação-de-Banco-de-Dados/aula7/Image40.jpeg) + +Observe que o veículo inserido tem Proprietário nulo, ou seja, não está associado a nenhum proprietário. + +![Veículo inserido com Proprietário nulo](/media/Implementação-de-Banco-de-Dados/aula7/Image41.jpeg) + +Conforme já tínhamos visto, também temos o proprietário MARIANA ROSA, que não está associado a nenhum veículo. Desta forma, ao fazer a junção interior, não retornará nem a Mariana nem o veículo de placa TTZ0156. + +![Associando o Propietário Mariana Rosa ao veículo de placa TTZ0156 com Inner Join](/media/Implementação-de-Banco-de-Dados/aula7/Image42.jpeg) + +Vamos ver agora como fazer a junção exterior. Neste tipo de junção, temos o conceito de lado. Repare no comando: a tabela Proprietário está à esquerda na cláusula from, e a tabela Veículo à direita. + +![Comando aplicado anteriormente](/media/Implementação-de-Banco-de-Dados/aula7/Image43.jpeg) + +Se você quiser retornar todos os proprietários, quando apenas os veículos associados como Proprietário estiverem à esquerda, você deverá comandar um left join. + +![Retorno do comando com Left Join](/media/Implementação-de-Banco-de-Dados/aula7/Image44.jpeg) + +Note que: + +- Retornou uma linha com a Mariana Rosa. + +- Como não existe um veículo para se associar a Mariana, as colunas de Veículo na linha ficam nulas; isto sempre acontece na junção anterior. + +Agora, para voltarem todos os veículos e apenas os proprietários associados, basta trocar left por right. + +![Retorno do comando com o Right Join](/media/Implementação-de-Banco-de-Dados/aula7/Image45.jpeg) + +Agora retornou o veículo TTZ0156, e as colunas de Proprietário na linha são nulas. Para você voltar todas as linhas associadas e as não associadas das duas tabelas, basta escrever full join. + +![Retorno do comando com Full Join](/media/Implementação-de-Banco-de-Dados/aula7/Image46.jpeg) + +As utilidades disso são basicamente duas: + +1. Suponha que você tenha uma tabela de alunos e uma de fotos, e na de fotos exista uma FK para aluno. Se você deseja retornar todos os alunos para os que têm foto, a única forma é comandar uma junção exterior, pois, na interior, retornariam apenas os alunos que têm foto. + +2. Selecionar, por exemplo, o proprietário que não possui veículos. Para obter este resultado, você deve comandar o outer join apropriado (left ou right) e, a seguir, filtrar as linhas cuja chave primária da outra tabela seja nula. + +Veja o comando: + +![Selecionando o proprietário que não possui veículos](/media/Implementação-de-Banco-de-Dados/aula7/Image47.jpeg) + +O comando funciona devido ao fato de uma chave primária nunca poder ser nula, e o nulo, no caso, aparece devido à junção exterior. diff --git "a/Faculdade/Implementa\303\247\303\243o-de-Banco-de-Dados/aula8.md" "b/Faculdade/Implementa\303\247\303\243o-de-Banco-de-Dados/aula8.md" new file mode 100644 index 0000000..bf0444d --- /dev/null +++ "b/Faculdade/Implementa\303\247\303\243o-de-Banco-de-Dados/aula8.md" @@ -0,0 +1,351 @@ +# Aula 08 - Subconsulta e Operadores de Conjunto + +Continuaremos usando o banco de dados da empresa para os exemplos. + +## Subconsultas + +O que são subconsultas? + +São consultas secundárias dentro de outras consultas, utilizadas para gerar valores intermediários necessários para executar a consulta principal. As subconsultas são muito utilizadas em comandos de select. + +Exemplo: +Você deseja recuperar todos os dados dos empregados que trabalham no departamento de vendas. Para isso, necessitaríamos acessar os dados das tabelas Empregado e Departamento. + +```sql +SELECT * +FROM EMPREGADO +WHERE ID_DEPTO = ( SELECT ID FROM DEPARTAMENTO +WHERE UPPER (NOME)= 'VENDAS') +``` + +Observe que existe um comando select (consulta inicial) e um outro comando select dentro deste primeiro (interno). Sua execução gera o resultado desta figura: + +![Resultado da consulta de todos os dados dos empregados que trabalham no departamento de vendas](/media/Implementação-de-Banco-de-Dados/aula8/Image1.jpeg) + +Modo de execução + +Conforme vimos no exemplo anterior, o segundo select é executado primeiramente, gerando a informação que será utilizada pelo select principal. Acompanhe: + +![Resultado do segundo select (interior)](/media/Implementação-de-Banco-de-Dados/aula8/Image2.jpeg) + +O valor retornado (20) é então utilizado para a consulta principal e esta é executada como se tivesse sido escrita como: + +![Utilizando o resultado do select interior na consulta principal](/media/Implementação-de-Banco-de-Dados/aula8/Image3.jpeg) + +### Outro exemplo + +Uma subconsulta pode também ser utilizada para retornar linhas que atendam a condições que não existem diretamente nos dados de uma tabela. + +Por exemplo: desejamos retornar todos os dados dos empregados que ganham mais que o salário médio da empresa. Não existe em nenhuma tabela o valor do salário médio, mas ele pode ser calculado em uma consulta utilizando-se a função AVG: + +![Calculando o valor do salário médio](/media/Implementação-de-Banco-de-Dados/aula8/Image4.jpeg) + +De posse da média, você poderia obter os empregados que atendem a condição. + +![Consultando todos os dados dos empregados que ganham mais que o salário médio](/media/Implementação-de-Banco-de-Dados/aula8/Image5.jpeg) + +O problema desta solução é que você teria emitido dois comandos: + +O primeiro para obter a média. + +```sql +SELECT AVG(SALARIO) +FROM EMPREGADO +``` + +O segundo utilizando o valor gerado pelo primeiro para obter os dados dos empregados. + +```sql +SELECT * +FROM EMPREGADO +WHERE SALARIO > 13750 +``` + +Isso poderia ser feito escrevendo uma subconsulta. + +![Utilizando uma subconsulta como alternativa](/media/Implementação-de-Banco-de-Dados/aula8/Image6.jpeg) + +### Mais um exemplo + +Você deseja retornar o identificador do departamento e o valor salarial médio do departamento cujo salário médio seja maior ou igual ao salário médio da empresa. Veja o seguinte comando, que retorna o ID do departamento e o seu salário médio: + +![Retornando o ID do departamento e o seu salário médio](/media/Implementação-de-Banco-de-Dados/aula8/Image7.jpeg) + +Como você já viu, o salário médio da empresa é 13750; portanto, os departamentos 30 e 10 atendem à condição. Neste caso, a subconsulta deve estar na cláusula having, já que se deseja filtrar os grupos, e não as linhas da tabela. + +![Utilizando a subconsulta na cláusula Having](/media/Implementação-de-Banco-de-Dados/aula8/Image8.jpeg) + +Analise agora o comando a seguir. O que mudou em relação ao anterior? + +![Utilizando a subconsulta na cláusula select](/media/Implementação-de-Banco-de-Dados/aula8/Image9.jpeg) + +Note a subconsulta na cláusula select. Ela é executada uma vez para cada linha que retorna e, no caso, serviu para listar ao lado dos dados do departamento a média de todos os veículos. + +### Retornando mais de uma coluna + +Uma subconsulta pode retornar mais de uma coluna. O maior uso dessa situação é criar uma tabela em memória para ser utilizada, por exemplo, em uma junção. + +Suponha que você deseja retornar o nome do departamento e o valor de sua folha salarial (soma dos salários de seus empregados) para departamentos cuja média salarial seja maior ou igual à média da empresa. + +Obviamente a consulta poderia ser construída realizando primeiro a junção das tabelas Empregado e Departamento e gerando os grupos depois, conforme este comando: + +![Retornando o nome do departamento e o valor de sua folha salarial com inner join](/media/Implementação-de-Banco-de-Dados/aula8/Image10.jpeg) + +Para exemplificar o uso do retorno da tabela em memória, o comando pode ser construído executando primeiro uma subconsulta e, a seguir, utilizando seu retorno como uma tabela com a qual se fará a junção com a tabela Departamento. + +Primeiro, como seria a subconsulta? + +![Comando de subconsulta](/media/Implementação-de-Banco-de-Dados/aula8/Image11.jpeg) + +Esta subconsulta deve ser escrita na cláusula from entre parênteses, atribuir-lhe um apelido e fazer a junção com a tabela Modelo: + +![Escrevendo a subconsulta anterior na cláusula from](/media/Implementação-de-Banco-de-Dados/aula8/Image12.jpeg) + +Observe no comando o seguinte: + +1. A subconsulta da cláusula from foi apelidada de T, e pudemos referenciar suas colunas ID_DEPTO, Folha e Média na consulta exterior. + +2. Temos uma subconsulta aninhada dentro de outra na cláusula from. + +Neste caso, a subconsulta A é interna à B, que por sua vez é interna à PRINCIPAL. A execução ocorre, então, na seguinte ordem: + +- Primeiro é executada a subconsulta A, e seu resultado é passado para a B. + +- A seguir, é executada a subconsulta B e seu resultado é passado à consulta principal. + +- A consulta principal é executada. + +### Subconsultas simples + +São aquelas que retornam apenas uma linha, como acontece, por exemplo, ao se utilizar uma função de grupo sem a cláusula group by, como no caso da subconsulta A que vimos há pouco. + +Neste tipo de subconsulta, podem ser utilizados os seguintes operadores na comparação: + +| Operador | Descrição | +| -------- | -------------- | +| = | Igual a | +| <> | Diferente | +| \> | Maior que | +| < | Menor que | +| \>= | Maior ou igual | +| <= | Menor ou igual | + +### Subconsultas multilinhas + +São aquelas que retornam mais de uma linha, como a subconsulta B do último exemplo. Quando a subconsulta retorna mais de uma linha, temos que utilizar na comparação in ou not in, pois somente estes operadores conseguem lidar com um conjunto de valores. + +Para maior clareza, veja os seguintes exemplos: + +1. A tabela Departamentos tem o seguinte conteúdo: + +![Tabela Departamentos](/media/Implementação-de-Banco-de-Dados/aula8/Image13.jpeg) + +Temos dois departamentos da região 1 e um da região 2. Se todos os IDs, ult_nome e id_depto dos empregados do departamento da região 2 utilizarem subconsulta, o comando será: + +![Consulta utilizando subconsulta](/media/Implementação-de-Banco-de-Dados/aula8/Image14.jpeg) + +Se você quisesse listar os empregados dos departamentos da região 1, o que ocorreria? + +![Erro ao listar os empregados dos departamentos da região 1](/media/Implementação-de-Banco-de-Dados/aula8/Image15.jpeg) + +Ocorreria um erro; a subconsulta no caso retorna dois valores, já que existem dois departamentos da região 1. + +![Consultando os departamentos da região 1](/media/Implementação-de-Banco-de-Dados/aula8/Image16.jpeg) + +Deve ser utilizado, então, o operador in. + +![Utilizando o operador in na subconsulta](/media/Implementação-de-Banco-de-Dados/aula8/Image17.jpeg) + +2. Considere, agora, que você deseja listar todos os dados dos empregados que atendem a algum cliente. + +Logicamente, via uma junção interior isso poderia ser resolvido, mas também poderia ser feito via subconsulta. Para isto, devemos listar os valores dos vendedores da tabela Clientes e, a seguir, ver quais empregados estão nesta lista. + +A subconsulta seria: + +![Consultando os valores dos vendedores da tabela cliente](/media/Implementação-de-Banco-de-Dados/aula8/Image18.jpeg) + +Observe que retorna um vendedor nulo. O comando seria então: + +![Escrevendo a subconsulta anterior utilizando a comparação in](/media/Implementação-de-Banco-de-Dados/aula8/Image19.jpeg) + +Retornaram dois empregados. Como temos seis empregados, isso significa que quatro deles não atendem a clientes. Para encontrá-los, podemos fazer uma junção exterior ou via subconsulta. Substituir o in por not in, ou seja, o empregado cujo código não está na lista. + +![Encontrando os empregados que não atendem a clientes utilizando a comparação not in](/media/Implementação-de-Banco-de-Dados/aula8/Image20.jpeg) + +O que aconteceu? Deveriam voltar quatro empregados, mas não voltou nenhum. Como já destacamos, existe um nulo no retorno da subconsulta. Quando se usa in, não ocorre nenhum problema, mas quando é utilizado not in, a comparação com nulo resulta nulo. + +Lembre-se de que a cláusula where faz com que retornem apenas as linhas cujo resultado do teste seja verdadeiro. Desta forma, nunca permita o retorno de linha nula em uma subconsulta. + +O comando da subconsulta deveria, então, ser: + +![Comando da subconsulta evitando o retorno de linha nula](/media/Implementação-de-Banco-de-Dados/aula8/Image21.jpeg) + +Repare que a linha nula sumiu... O comando a ser executado seria então: + +![Comando de consulta dos empregados que não atendem a nenhum cliente utilizando a subconsulta anterior](/media/Implementação-de-Banco-de-Dados/aula8/Image22.jpeg) + +Esse comando retorna os dados dos empregados que não atendem a nenhum cliente. + +### Subconsultas correlatas + +Nos exemplos feitos até agora, a subconsulta era executada uma vez, e retornavam os valores para serem utilizados pela consulta principal. Essas são chamadas de subconsultas aninhadas. + +Existe outro tipo de subconsulta denominada correlata, que para poder ser executada, necessita de valores da consulta principal. Por isso, deve ser executada uma vez para cada linha da consulta externa. + +Exemplo: Suponha que você deseje saber todos dados dos veículos cujo valor segurado seja menor que o valor segurado médio de seu modelo. Inicialmente, pergunte-se como seria gerado o salário médio de um departamento. + +Para o Departamento 30, o comando seria: + +![Gerando o salário médio do departamento 30](/media/Implementação-de-Banco-de-Dados/aula8/Image23.jpeg) + +Então, para retornarem os dados dos empregados do Departamento 30 cujo salário é menor que a média do departamento, basta comandar: + +![Retornando os dados dos empregados do Departamento 30](/media/Implementação-de-Banco-de-Dados/aula8/Image24.jpeg) + +Para o Departamento 30, está ok, mas e para os outros departamentos? Afinal, cada um tem uma média diferente. + +![Consultando os departamentos e os seus salários médios](/media/Implementação-de-Banco-de-Dados/aula8/Image25.jpeg) + +O necessário para resolver a situação é que: + +1. A subconsulta acesse na consulta principal qual o departamento do empregado cuja linha está sendo processada naquele momento. + +2. Calcule a média do valor para aquele departamento. + +3. Retorne a média para a consulta principal. + +4. A consulta principal compare a média com o salário do empregado da linha que está sendo processada. + +5. Retorne os dados do empregado se o valor segurado for menor que a média. + +Para obter a situação descrita no comando, a subconsulta deve referenciar dados da consulta principal. Para isto, você deve dar um apelido para a tabela da consulta principal e outro para a da subconsulta, e nesta, “chamar” os dados da tabela principal, conforme mostra esta imagem: + +![Comando de consulta utilizando um apelido para a tabela da consulta principal e outro para a da subconsulta](/media/Implementação-de-Banco-de-Dados/aula8/Image26.jpeg) + +Observe no comando que a tabela externa foi apelidada de E a interna de I; no where foi utilizado o valor da externa para filtrar as linhas da subconsulta. + +![Explicação dos apelidos utilizados na consulta](/media/Implementação-de-Banco-de-Dados/aula8/Image27.jpeg) + +## Princípios de subconsulta + +Em resumo, as subconsultas obedecem aos seguintes princípios: + +1. São escritas entre parênteses. + +2. Podem existir várias subconsulta para uma única consulta. + +3. Podem existir subconsultas dentro de subconsultas (subconsultas aninhadas). + +4. Podem retornar uma ou várias colunas. + +5. Podem retornar uma ou várias linhas. + +6. Normalmente são utilizadas nas cláusulas where ou having, podendo, mais raramente, serem utilizadas nas cláusulas from ou select. + +7. Eventualmente podem referenciar colunas da consulta principal (subconsulta correlata). + +8. Não devem retornar linhas nulas. + +## Utilizando operadores de conjunto + +Algumas vezes, é necessário fazer a chamada junção vertical, que nada mais é que retornar em uma mesma coluna dados de mais de uma tabela. Isto pode ser feito utilizando os operadores de conjunto union, intersect e except. + +Toda tabela pode ser considerada um conjunto de valores, e os operadores de conjunto nos permitem realizar as operações de união (union), interseção (intersect) ou diferença (except). + +![Union](/media/Implementação-de-Banco-de-Dados/aula8/Image28.png) + +UNION + +![Intersect](/media/Implementação-de-Banco-de-Dados/aula8/Image29.png) + +INTERSECT + +![Except](/media/Implementação-de-Banco-de-Dados/aula8/Image30.png) + +EXCEPT + +Da mesma forma que fizemos quando utilizamos uma subconsulta na cláusula from, gerando uma tabela, os conjuntos a serem operados são gerados por subconsultas. + +Para que o comando funcione, é necessário que as tabelas geradas sejam compatíveis. Mas o que significam tabelas compatíveis? + +Duas ou mais tabelas são compatíveis para fazer operações de conjunto se tiverem o mesmo esquema, ou seja, o mesmo número de colunas, com o mesmo tipo, na mesma ordem. + +Observe a figura: + +![Tabela Empregados, Tabela Produtos e Tabela Animais](/media/Implementação-de-Banco-de-Dados/aula8/Image31.jpeg) + +As tabelas Empregados e Produtos são compatíveis, já que têm três colunas: a primeira e a segunda numéricas e a terceira alfanumérica. Já a tabela Animais não é compatível com as outras duas, já que, embora também tenha três colunas, sendo duas numéricas e um alfanumérica, elas não se encontram na mesma ordem. + +Por definição, conforme você deve ter aprendido na matemática, as operações de conjunto eliminam valores duplicados. Isto quer dizer que, se duas tabelas tiverem linhas iguais, apenas uma linha irá retornar no resultado. + +Observe a figura: + +![Tabela Empregado e Tabela Acionista](/media/Implementação-de-Banco-de-Dados/aula8/Image32.jpeg) + +Ao comparar a primeira linha da tabela Empregado com cada uma das linhas da tabela Acionista, observa-se que não existe nenhuma linha igual na tabela de Acionista, pois apesar de existir um acionista com o mesmo ID (primeira linha, ID 101), o nome é diferente. Portanto, estas linhas não são iguais. + +O mesmo ocorre em relação à terceira linha de Empregado, pois a segunda linha de acionista tem o mesmo valor para nome (Marco Aurélio), porém com valor de ID diferente. + +Já a segunda linha da tabela Empregado é exatamente igual à última linha de Acionista, já que elas têm o mesmo nome e ID. Caso as duas fizessem parte do conjunto Resposta de uma operação de conjunto, apenas uma delas apareceria no resultado. + +### O Operador Union + +Realiza a operação de união, ou seja, retorna todas as linhas do primeiro conjunto acrescidas de todas as linhas do segundo, eliminando as duplicadas. + +Se quisermos, por exemplo, o ID dos empregados que trabalham nos departamentos 20 ou 30 ou que tenham o cargo de vendedor, como ficaria o comando utilizando operadores de conjunto? + +Observe os dados da tabela: + +![Tabela Empregado](/media/Implementação-de-Banco-de-Dados/aula8/Image33.jpeg) + +Note que os empregados de ID 2 a 6 são dos departamentos 20 ou 30 (destacados em azul) e os de ID 5 e 6 são vendedores (destacados em vermelho). Queremos os que estão em um conjunto ou no outro, portanto os empregados de ID 2, 3,4, 5 e 6. Note ainda que os empregados de ID 5 e 6 aparecem nos dois conjuntos. O comando que resolve o problema é: + +![Retornando os empregados dos departamentos 20 e 30 junto com os empregados que são vendedores](/media/Implementação-de-Banco-de-Dados/aula8/Image34.jpeg) + +Note que: + +- Retornaram os IDs 2,3 e 4, apesar de não serem vendedores. + +- Os empregados de IDs 5 e 6 retornaram apenas uma vez, apesar de estarem nos dois conjuntos. + +Existe uma variação no SQL do comando de união que retorna os duplicados; é o union all. + +![Retornando os empregados duplicados com union all](/media/Implementação-de-Banco-de-Dados/aula8/Image35.jpeg) + +Agora os IDs 5 e 6 aparecem duas vezes. + +Se você desejasse os IDs dos empregados que trabalham nos departamentos 20 ou 30 e que tenham o cargo de vendedor, ou seja, que aparecem nos dois conjuntos, deveria utilizar intersect. + +![Utilizando o intersect para retornar os ids dos empregados que trabalham nos departamentos 20 ou 30 e que tenham o cargo de vendedor](/media/Implementação-de-Banco-de-Dados/aula8/Image36.jpeg) + +Essas duas operações apresentadas (união e interseção) são comutativas, ou seja, tanto faz a primeira subconsulta ser pelo modelo e a segunda pela cor ou o inverso; o resultado será igual. Teste e comprove. + +O mesmo não acontece na diferença (except). Neste caso, se eu inverter a ordem, o resultado mudará. + +Para se retornar os IDs dos empregados que trabalham nos departamentos 20 ou 30 e que não tenham o cargo de vendedor, ou seja, que estão no primeiro conjunto e não estão no segundo, seria necessário comandar: + +![Utilizando o except para retornar os IDs dos empregados que trabalham nos departamentos 20 ou 30 e que não tenham o cargo de vendedor](/media/Implementação-de-Banco-de-Dados/aula8/Image37.jpeg) + +## Coisas do Oracle + +Todos os comandos que vimos até agora, sejam de subconsulta ou operadores de conjunto, funcionam de forma igual no PostgreSQL, SQLServer e Oracle, com exceção do except. No Oracle, o operador de diferença é o minus. + +![O operador de diferença no Oracle](/media/Implementação-de-Banco-de-Dados/aula8/Image38.jpeg) + +Finalmente, uma última observação: nos operadores de conjunto, o order by somente pode aparecer ao final do comando, e não no meio. + +![Erro ao utilizar o order by no meio](/media/Implementação-de-Banco-de-Dados/aula8/Image39.jpeg) + +![Utilizando corretamente o order by no final do comando](/media/Implementação-de-Banco-de-Dados/aula8/Image40.jpeg) + +**Resumo das regras para utilização dos operadores de conjuntos** + +- Os comandos select participantes têm que ter o mesmo número de colunas, ou seja, devem ser compatíveis; + +- As colunas correspondentes têm que ser do mesmo tipo de dado; + +- Linhas duplicadas são automaticamente descartadas; a exceção é o operador union all; + +- A cláusula order by só pode ser utilizada ao final do comando; + +- Os operadores de conjuntos podem ser utilizados em subconsultas. diff --git "a/Faculdade/Implementa\303\247\303\243o-de-Banco-de-Dados/aula9.md" "b/Faculdade/Implementa\303\247\303\243o-de-Banco-de-Dados/aula9.md" new file mode 100644 index 0000000..f018f31 --- /dev/null +++ "b/Faculdade/Implementa\303\247\303\243o-de-Banco-de-Dados/aula9.md" @@ -0,0 +1,185 @@ +# Aula 9 - LINGUAGEM SQL – Transação + +Continuaremos utilizando o Banco de Dados da Empresa para os exemplos. + +## Transação + +Uma transação é uma unidade de execução de programa que acessa e, possivelmente, atualiza vários itens de dados. Uma transação, geralmente, é o resultado da execução de um programa de usuário escrito em uma linguagem de manipulação de dados, e é delimitada da seguinte forma: + +``` +begin transaction +......... +end transacion +``` + +A transação consiste de todas as operações ali executadas, entre o começo e o final da transação. Durante a execução de uma transação, o banco de dados pode passar por estados de inconsistência por vários motivos, como: queda de energia, falha física etc. + +## Propriedades das Transações + +Após uma transação, o banco de dados deve continuar consistente. Para assegurar a integridade dos dados, um sistema de banco de dados deve ter as seguintes propriedades das transações: atomicidade, consistência, isolamento e durabilidade, que são as chamadas propriedades ACID das transações. + +Atomicidade: Indivisibilidade - É a propriedade que garante que todas as operações de uma transação são refletidas corretamente no banco de dados ou nenhuma será. Uma transação é indivisível; + +Consistência: A execução de uma transação isolada (ou seja, sem a execução de outra transação qualquer concorrentemente) preserva a consistência do banco de dados; + +Isolamento: Embora diversas transações possam ser executadas concorrentemente, o SGBD deve garantir que, para todo par de transações Ti, Tj, Ti, o Tj tenha terminado suas operações antes de Ti começar com as suas. Assim, cada transação não toma conhecimento de outras transações concorrentes no sistema. O sistema pode executar um pedaço de Ti parar e executar um pedaço de Tj, mas para as transações elas são únicas no sistema; + +Durabilidade: Depois de a transação completar-se com sucesso, as mudanças que ela faz no banco de dados persistem, até mesmo se houver falha no sistema. + +## Estados da transação + +Quando não ocorre falha alguma na transação, todas as suas operações completam-se com sucesso e ela é efetivada, seus efeitos não podem ser desfeitos ou abortados. De outro modo, se ocorrer algum problema (falha) durante a transação, neste caso a transação será abortada e as operações já realizadas serão desfeitas. + +Para melhor entendermos o funcionamento desse sistema, descrevemos o modelo simples e abstrato de estados das transações. + +Cinco são os estados possíveis de uma transação: + +| Ativa (ou estado inicial) | Em efetivação parcial | Em falha | Abortada | Em efetivação | +| --------------------------------------------------------------------------- | ----------------------------------- | ---------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------- | +| A transação permanece neste estado enquanto está executando suas operações. | Após a execução da última operação. | Após a descoberta de que a execução normal da transação já não pode ser realizada. | Depois que a transação foi desfeita e o banco de dados foi restabelecido ao estado anterior do início da execução da transação. | Após a conclusão da transação com sucesso | + +![Estados da transação](/media/Implementação-de-Banco-de-Dados/aula9/Image1.jpeg) + +### Transações concorrentes + +Os sistemas de processamento de transação de banco de dados normalmente permitem que diversas transações sejam executadas de modo concorrente. Permitir que essas transações concorram na atualização dos dados traz diversas complicações em relação à consistência dos bancos de dados. + +| | | +| ------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Vantagens | Uma transação consiste de diversos passos. Alguns envolvem atividades de E/S; outros, atividade de UCP. Logo, atividades de E/S podem ser feitas em paralelo com o processamento de UCP; assim, o paralelismo entre atividades de E/S e de UCP pode ser explorado para executar diversas transações em paralelo, aumentando o throughput do sistema (um maior número de transações podem ser executadas num determinado tempo); | +| | Reduz o tempo médio de resposta para uma transação se completar após ser submetida, pois as transações curtas não precisam esperar que as longas terminem para serem iniciadas. | +| Desvantagens | Assegurar a consistência de transações exige trabalho adicional. É mais fácil assegurar as propriedades ACID em transações com execução sequencial do que em execuções concorrentes. | + +O fato de a execução das transações gerar dados consistentes não significa que produza o mesmo resultado. A mudança da ordem das transações pode provocar resultados diferentes. A execução sequencial de duas transações sempre produz um resultado consistente. + +Uma execução concorrente pode produzir ou não um resultado consistente. + +### Controle de transações + +O SGBD assegura a consistência dos dados baseado nas transações. As transações dão mais flexibilidade e controle quando da mudança do conteúdo das tabelas e asseguram a consistência dos dados em caso de falhas nos processos do usuário ou no sistema. + +Uma transação consiste de comandos DML (insert, update, delete, commit, rollback) que fazem uma mudança consistente nos dados. Por exemplo: uma transferência de valores entre duas contas bancárias implica no débito em uma conta e no crédito em outra no mesmo montante. Ambas as ações são realizadas ou são anuladas. O crédito não pode ser concretizado sem o correspondente débito. + +Na maioria dos SGBDs, uma transação começa com o comando begin transaction. + +![Comando begin transaction no PostgreSQL e SQLServer](/media/Implementação-de-Banco-de-Dados/aula9/Image2.png) + +Uma exceção é o Oracle, no qual, quando damos qualquer comando, uma transação é aberta automaticamente pelo SGBD. + +![Transação aberta no Oracle](/media/Implementação-de-Banco-de-Dados/aula9/Image3.png) + +Uma transação termina quando aparece um dos seguintes comandos: + +| Commit | Rollback | +| --------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------- | +| Encerra a transação corrente, fazendo que todas as modificações pendentes passem a ser definitivas. | Encerra a transação corrente, desprezando todas as modificações pendentes. | + +Todas as modificações feitas durante a transação são temporárias, até que a transação seja commited, ou seja, concretizada. + +Situação do dado antes do commit ou do rollback: + +- As operações de manipulação de dados primeiramente afetam o buffer do banco de dados; + +- O usuário corrente pode rever os resultados das operações de manipulação de dados usando o comando select; + +- Outros usuários não podem ver os resultados das operações de manipulação de dados do usuário corrente. + +- As linhas afetadas ficam bloqueadas; outros usuários não podem modificar os dados existentes nas linhas afetadas. + +Situação do dado depois do rollback: + +- As mudanças são desfeitas. O conteúdo anterior do dado é restabelecido; + +- Os bloqueios nas linhas afetadas são desfeitos; as linhas ficam disponíveis para que outros usuários possam executar novas alterações. + +- Além do commit e do rollback, alguns SGBDs têm o SAVEPOINT, que serve para criar um ponto intermediário para fazermos o rollback, de forma que não precisemos desfazer a transação toda. + +### PostgreSQL + +PASSO 1: Abrir a transação. + +![Abrindo a transação](/media/Implementação-de-Banco-de-Dados/aula9/Image4.jpeg) + +PASSO 2: Criar a tabela teste com duas colunas. + +![Criando a tabela Teste com duas colunas](/media/Implementação-de-Banco-de-Dados/aula9/Image5.jpeg) + +PASSO 3: Confirmar a criação da tabela. + +![Confirmando a criação da tabela](/media/Implementação-de-Banco-de-Dados/aula9/Image6.jpeg) + +PASSO 4: Inserir uma linha na tabela. + +![Inserindo uma linha na tabela](/media/Implementação-de-Banco-de-Dados/aula9/Image7.jpeg) + +PASSO 5: Confirmar a inclusão. + +![Confirmando a inclusão](/media/Implementação-de-Banco-de-Dados/aula9/Image8.jpeg) + +PASSO 6: Criar um savepoint. + +![Criando um savepoint](/media/Implementação-de-Banco-de-Dados/aula9/Image9.jpeg) + +PASSO 7: Inserir uma segunda linha. + +![Inserindo uma segunda linha](/media/Implementação-de-Banco-de-Dados/aula9/Image10.jpeg) + +PASSO 8: Criar outro savepoint + +![Criando outro savepoint](/media/Implementação-de-Banco-de-Dados/aula9/Image11.jpeg) + +PASSO 9: Inserir uma terceira linha. + +![Inserindo uma terceira linha](/media/Implementação-de-Banco-de-Dados/aula9/Image12.jpeg) + +PASSO 10: Ver o conteúdo da tabela. + +![Vendo o conteúdo da tabela](/media/Implementação-de-Banco-de-Dados/aula9/Image13.jpeg) + +PASSO 11: Fazer rollback para savepoint. + +Foram criados dois pontos de salvamento: + +SAVEPOINT A - Após a inclusão da linha 1 + +SAVEPOINT B - Após a inclusão da linha 2 + +Portanto, se comandar um rollback para o ponto de salvamento B, a inclusão da linha 3 será desfeita. + +Comando: + +![Comando de rollback para o ponto de salvamento B](/media/Implementação-de-Banco-de-Dados/aula9/Image14.jpeg) + +Verificando o resultado: + +![Consultando a tabela após o rollback para o ponto de salvamento B](/media/Implementação-de-Banco-de-Dados/aula9/Image15.jpeg) + +Note que agora somente aparecem as linhas 1 e 2. + +PASSO 12: fazer rollback para savepoint A. + +Comando: + +![Comando de rollback para o ponto de salvamento A](/media/Implementação-de-Banco-de-Dados/aula9/Image16.jpeg) + +Verificando o resultado: + +![Consultando a tabela após o rollback para o ponto de salvamento A](/media/Implementação-de-Banco-de-Dados/aula9/Image17.jpeg) + +Como esperado, agora só existe a linha 1. Será que você consegue voltar ao savepoint B e desta forma ter novamente a linha 2? + +![Comando de rollback para o ponto de salvamento B](/media/Implementação-de-Banco-de-Dados/aula9/Image18.jpeg) + +Não consegue, pois, uma vez realizado o rollback até um savepoint, ele é desmarcado e não fica mais disponível para uso. + +PASSO 13: terminar a transação. + +Uma transação pode terminar com commit ou rollback. Se você der commit, ela será efetivada e depois não adianta dar rollback, pois já fechou, sendo que o contrário também é verdadeiro: se der rollback, não adianta tentar dar commit depois. + +Comando: + +![Comando de rollback para terminar a transação](/media/Implementação-de-Banco-de-Dados/aula9/Image19.jpeg) + +Se você der select na tabela teste agora, dirá que ela não existe; o rollback inclusive cancelou a criação da tabela. + +![Comando select na tabela teste retorna um erro](/media/Implementação-de-Banco-de-Dados/aula9/Image20.jpeg) diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula10/Image1.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula10/Image1.jpeg" new file mode 100644 index 0000000..e83e57b Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula10/Image1.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula10/Image10.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula10/Image10.jpeg" new file mode 100644 index 0000000..eed6cd6 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula10/Image10.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula10/Image11.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula10/Image11.jpeg" new file mode 100644 index 0000000..88e9f95 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula10/Image11.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula10/Image12.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula10/Image12.jpeg" new file mode 100644 index 0000000..ad21dbe Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula10/Image12.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula10/Image13.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula10/Image13.jpeg" new file mode 100644 index 0000000..2b0b03b Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula10/Image13.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula10/Image14.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula10/Image14.jpeg" new file mode 100644 index 0000000..664bd9b Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula10/Image14.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula10/Image15.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula10/Image15.jpeg" new file mode 100644 index 0000000..cb5e9ab Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula10/Image15.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula10/Image16.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula10/Image16.jpeg" new file mode 100644 index 0000000..05727c8 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula10/Image16.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula10/Image17.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula10/Image17.jpeg" new file mode 100644 index 0000000..8377580 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula10/Image17.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula10/Image18.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula10/Image18.jpeg" new file mode 100644 index 0000000..f83b870 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula10/Image18.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula10/Image19.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula10/Image19.jpeg" new file mode 100644 index 0000000..716d7d5 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula10/Image19.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula10/Image2.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula10/Image2.jpeg" new file mode 100644 index 0000000..fc67b79 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula10/Image2.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula10/Image20.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula10/Image20.jpeg" new file mode 100644 index 0000000..cf6a5e6 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula10/Image20.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula10/Image21.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula10/Image21.jpeg" new file mode 100644 index 0000000..a88409c Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula10/Image21.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula10/Image22.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula10/Image22.jpeg" new file mode 100644 index 0000000..8bbef33 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula10/Image22.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula10/Image23.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula10/Image23.jpeg" new file mode 100644 index 0000000..33e2e48 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula10/Image23.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula10/Image24.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula10/Image24.jpeg" new file mode 100644 index 0000000..cf4d998 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula10/Image24.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula10/Image3.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula10/Image3.jpeg" new file mode 100644 index 0000000..eb79de5 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula10/Image3.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula10/Image4.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula10/Image4.jpeg" new file mode 100644 index 0000000..4da3d8d Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula10/Image4.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula10/Image5.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula10/Image5.jpeg" new file mode 100644 index 0000000..a57aa67 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula10/Image5.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula10/Image6.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula10/Image6.jpeg" new file mode 100644 index 0000000..23618ad Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula10/Image6.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula10/Image7.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula10/Image7.jpeg" new file mode 100644 index 0000000..a5ae32a Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula10/Image7.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula10/Image8.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula10/Image8.jpeg" new file mode 100644 index 0000000..81568bb Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula10/Image8.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula10/Image9.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula10/Image9.jpeg" new file mode 100644 index 0000000..89e5692 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula10/Image9.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula3/Image1.png" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula3/Image1.png" new file mode 100644 index 0000000..4be6517 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula3/Image1.png" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula3/Image10.png" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula3/Image10.png" new file mode 100644 index 0000000..5d5efad Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula3/Image10.png" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula3/Image11.png" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula3/Image11.png" new file mode 100644 index 0000000..3855d22 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula3/Image11.png" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula3/Image12.png" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula3/Image12.png" new file mode 100644 index 0000000..478fed3 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula3/Image12.png" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula3/Image13.png" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula3/Image13.png" new file mode 100644 index 0000000..d2d5896 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula3/Image13.png" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula3/Image14.png" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula3/Image14.png" new file mode 100644 index 0000000..d01ea35 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula3/Image14.png" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula3/Image15.png" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula3/Image15.png" new file mode 100644 index 0000000..1a68034 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula3/Image15.png" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula3/Image16.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula3/Image16.jpeg" new file mode 100644 index 0000000..15f2d59 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula3/Image16.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula3/Image17.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula3/Image17.jpeg" new file mode 100644 index 0000000..3f06fd6 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula3/Image17.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula3/Image18.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula3/Image18.jpeg" new file mode 100644 index 0000000..ef5a93d Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula3/Image18.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula3/Image19.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula3/Image19.jpeg" new file mode 100644 index 0000000..cfdc365 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula3/Image19.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula3/Image2.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula3/Image2.jpeg" new file mode 100644 index 0000000..138bb76 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula3/Image2.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula3/Image20.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula3/Image20.jpeg" new file mode 100644 index 0000000..6cd0621 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula3/Image20.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula3/Image21.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula3/Image21.jpeg" new file mode 100644 index 0000000..281a690 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula3/Image21.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula3/Image22.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula3/Image22.jpeg" new file mode 100644 index 0000000..2d76515 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula3/Image22.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula3/Image3.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula3/Image3.jpeg" new file mode 100644 index 0000000..fa5f507 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula3/Image3.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula3/Image4.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula3/Image4.jpeg" new file mode 100644 index 0000000..8a2c562 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula3/Image4.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula3/Image5.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula3/Image5.jpeg" new file mode 100644 index 0000000..0a2ecdf Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula3/Image5.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula3/Image6.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula3/Image6.jpeg" new file mode 100644 index 0000000..10335a4 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula3/Image6.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula3/Image7.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula3/Image7.jpeg" new file mode 100644 index 0000000..9a0663e Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula3/Image7.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula3/Image8.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula3/Image8.jpeg" new file mode 100644 index 0000000..91c6657 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula3/Image8.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula3/Image9.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula3/Image9.jpeg" new file mode 100644 index 0000000..9d4d6c3 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula3/Image9.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula4/Image1.png" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula4/Image1.png" new file mode 100644 index 0000000..fad37f5 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula4/Image1.png" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula4/Image10.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula4/Image10.jpeg" new file mode 100644 index 0000000..2030031 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula4/Image10.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula4/Image11.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula4/Image11.jpeg" new file mode 100644 index 0000000..3a1e536 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula4/Image11.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula4/Image12.png" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula4/Image12.png" new file mode 100644 index 0000000..176e55b Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula4/Image12.png" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula4/Image13.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula4/Image13.jpeg" new file mode 100644 index 0000000..747aeec Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula4/Image13.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula4/Image14.png" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula4/Image14.png" new file mode 100644 index 0000000..df142de Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula4/Image14.png" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula4/Image15.png" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula4/Image15.png" new file mode 100644 index 0000000..627012a Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula4/Image15.png" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula4/Image16.png" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula4/Image16.png" new file mode 100644 index 0000000..1377ab6 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula4/Image16.png" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula4/Image17.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula4/Image17.jpeg" new file mode 100644 index 0000000..d723d82 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula4/Image17.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula4/Image18.png" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula4/Image18.png" new file mode 100644 index 0000000..50f40a4 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula4/Image18.png" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula4/Image19.png" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula4/Image19.png" new file mode 100644 index 0000000..29fe2b4 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula4/Image19.png" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula4/Image2.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula4/Image2.jpeg" new file mode 100644 index 0000000..3b0811e Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula4/Image2.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula4/Image20.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula4/Image20.jpeg" new file mode 100644 index 0000000..d723d82 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula4/Image20.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula4/Image21.png" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula4/Image21.png" new file mode 100644 index 0000000..e92a688 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula4/Image21.png" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula4/Image22.png" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula4/Image22.png" new file mode 100644 index 0000000..d488a17 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula4/Image22.png" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula4/Image23.png" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula4/Image23.png" new file mode 100644 index 0000000..193a640 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula4/Image23.png" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula4/Image24.png" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula4/Image24.png" new file mode 100644 index 0000000..0e808ea Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula4/Image24.png" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula4/Image25.png" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula4/Image25.png" new file mode 100644 index 0000000..22bd4b1 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula4/Image25.png" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula4/Image26.png" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula4/Image26.png" new file mode 100644 index 0000000..c9ed863 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula4/Image26.png" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula4/Image27.png" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula4/Image27.png" new file mode 100644 index 0000000..d192179 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula4/Image27.png" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula4/Image28.png" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula4/Image28.png" new file mode 100644 index 0000000..ccc95f8 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula4/Image28.png" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula4/Image29.png" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula4/Image29.png" new file mode 100644 index 0000000..29f2467 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula4/Image29.png" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula4/Image3.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula4/Image3.jpeg" new file mode 100644 index 0000000..42feb6c Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula4/Image3.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula4/Image4.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula4/Image4.jpeg" new file mode 100644 index 0000000..adfdd44 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula4/Image4.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula4/Image5.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula4/Image5.jpeg" new file mode 100644 index 0000000..f0a7019 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula4/Image5.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula4/Image6.png" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula4/Image6.png" new file mode 100644 index 0000000..3035045 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula4/Image6.png" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula4/Image7.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula4/Image7.jpeg" new file mode 100644 index 0000000..f0a7019 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula4/Image7.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula4/Image8.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula4/Image8.jpeg" new file mode 100644 index 0000000..0192aac Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula4/Image8.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula4/Image9.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula4/Image9.jpeg" new file mode 100644 index 0000000..558f42f Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula4/Image9.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula5/Image1.png" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula5/Image1.png" new file mode 100644 index 0000000..7326b82 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula5/Image1.png" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula5/Image10.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula5/Image10.jpeg" new file mode 100644 index 0000000..9c2b198 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula5/Image10.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula5/Image11.png" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula5/Image11.png" new file mode 100644 index 0000000..df142de Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula5/Image11.png" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula5/Image12.png" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula5/Image12.png" new file mode 100644 index 0000000..ecd1687 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula5/Image12.png" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula5/Image13.png" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula5/Image13.png" new file mode 100644 index 0000000..3615f09 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula5/Image13.png" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula5/Image14.png" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula5/Image14.png" new file mode 100644 index 0000000..df142de Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula5/Image14.png" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula5/Image15.png" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula5/Image15.png" new file mode 100644 index 0000000..679f3c8 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula5/Image15.png" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula5/Image16.png" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula5/Image16.png" new file mode 100644 index 0000000..82579f5 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula5/Image16.png" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula5/Image17.png" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula5/Image17.png" new file mode 100644 index 0000000..695c95b Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula5/Image17.png" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula5/Image18.png" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula5/Image18.png" new file mode 100644 index 0000000..3dc24cf Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula5/Image18.png" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula5/Image19.png" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula5/Image19.png" new file mode 100644 index 0000000..75045aa Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula5/Image19.png" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula5/Image2.png" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula5/Image2.png" new file mode 100644 index 0000000..1754e5b Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula5/Image2.png" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula5/Image20.png" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula5/Image20.png" new file mode 100644 index 0000000..19d7d11 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula5/Image20.png" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula5/Image21.png" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula5/Image21.png" new file mode 100644 index 0000000..5184ad8 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula5/Image21.png" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula5/Image22.png" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula5/Image22.png" new file mode 100644 index 0000000..dd15c9a Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula5/Image22.png" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula5/Image23.png" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula5/Image23.png" new file mode 100644 index 0000000..83e832e Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula5/Image23.png" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula5/Image24.png" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula5/Image24.png" new file mode 100644 index 0000000..9265dc7 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula5/Image24.png" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula5/Image25.png" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula5/Image25.png" new file mode 100644 index 0000000..e31e300 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula5/Image25.png" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula5/Image26.png" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula5/Image26.png" new file mode 100644 index 0000000..6371fe7 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula5/Image26.png" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula5/Image27.png" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula5/Image27.png" new file mode 100644 index 0000000..dc1a81f Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula5/Image27.png" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula5/Image28.png" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula5/Image28.png" new file mode 100644 index 0000000..3d1e87a Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula5/Image28.png" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula5/Image3.png" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula5/Image3.png" new file mode 100644 index 0000000..a38d17b Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula5/Image3.png" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula5/Image4.png" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula5/Image4.png" new file mode 100644 index 0000000..5928219 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula5/Image4.png" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula5/Image5.png" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula5/Image5.png" new file mode 100644 index 0000000..c56c160 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula5/Image5.png" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula5/Image6.png" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula5/Image6.png" new file mode 100644 index 0000000..954d8f8 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula5/Image6.png" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula5/Image7.png" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula5/Image7.png" new file mode 100644 index 0000000..ea6c108 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula5/Image7.png" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula5/Image8.png" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula5/Image8.png" new file mode 100644 index 0000000..31d8519 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula5/Image8.png" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula5/Image9.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula5/Image9.jpeg" new file mode 100644 index 0000000..c307762 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula5/Image9.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula6/Image1.png" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula6/Image1.png" new file mode 100644 index 0000000..a156759 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula6/Image1.png" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula6/Image10.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula6/Image10.jpeg" new file mode 100644 index 0000000..12bea66 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula6/Image10.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula6/Image11.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula6/Image11.jpeg" new file mode 100644 index 0000000..3714f2f Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula6/Image11.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula6/Image12.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula6/Image12.jpeg" new file mode 100644 index 0000000..25cec75 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula6/Image12.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula6/Image13.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula6/Image13.jpeg" new file mode 100644 index 0000000..b0c98d4 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula6/Image13.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula6/Image2.png" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula6/Image2.png" new file mode 100644 index 0000000..b555b76 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula6/Image2.png" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula6/Image3.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula6/Image3.jpeg" new file mode 100644 index 0000000..ecba259 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula6/Image3.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula6/Image4.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula6/Image4.jpeg" new file mode 100644 index 0000000..9e0b176 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula6/Image4.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula6/Image5.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula6/Image5.jpeg" new file mode 100644 index 0000000..591e4f6 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula6/Image5.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula6/Image6.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula6/Image6.jpeg" new file mode 100644 index 0000000..b91ee32 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula6/Image6.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula6/Image7.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula6/Image7.jpeg" new file mode 100644 index 0000000..4716426 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula6/Image7.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula6/Image8.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula6/Image8.jpeg" new file mode 100644 index 0000000..b7017e3 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula6/Image8.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula6/Image9.png" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula6/Image9.png" new file mode 100644 index 0000000..120e28d Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula6/Image9.png" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7/Image1.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7/Image1.jpeg" new file mode 100644 index 0000000..409c454 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7/Image1.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7/Image10.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7/Image10.jpeg" new file mode 100644 index 0000000..465089b Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7/Image10.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7/Image11.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7/Image11.jpeg" new file mode 100644 index 0000000..cec4353 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7/Image11.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7/Image12.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7/Image12.jpeg" new file mode 100644 index 0000000..b7de76e Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7/Image12.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7/Image13.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7/Image13.jpeg" new file mode 100644 index 0000000..5bf1031 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7/Image13.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7/Image14.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7/Image14.jpeg" new file mode 100644 index 0000000..c99de5b Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7/Image14.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7/Image15.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7/Image15.jpeg" new file mode 100644 index 0000000..09aad93 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7/Image15.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7/Image16.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7/Image16.jpeg" new file mode 100644 index 0000000..a14e581 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7/Image16.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7/Image17.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7/Image17.jpeg" new file mode 100644 index 0000000..4e99321 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7/Image17.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7/Image18.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7/Image18.jpeg" new file mode 100644 index 0000000..730a92a Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7/Image18.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7/Image19.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7/Image19.jpeg" new file mode 100644 index 0000000..74a1adc Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7/Image19.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7/Image2.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7/Image2.jpeg" new file mode 100644 index 0000000..5c847bb Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7/Image2.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7/Image20.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7/Image20.jpeg" new file mode 100644 index 0000000..18136d6 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7/Image20.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7/Image21.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7/Image21.jpeg" new file mode 100644 index 0000000..945b3f1 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7/Image21.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7/Image22.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7/Image22.jpeg" new file mode 100644 index 0000000..a0350e3 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7/Image22.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7/Image23.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7/Image23.jpeg" new file mode 100644 index 0000000..92b4d2f Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7/Image23.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7/Image24.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7/Image24.jpeg" new file mode 100644 index 0000000..0fb9dd6 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7/Image24.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7/Image25.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7/Image25.jpeg" new file mode 100644 index 0000000..ab2cdb9 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7/Image25.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7/Image26.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7/Image26.jpeg" new file mode 100644 index 0000000..83bef21 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7/Image26.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7/Image27.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7/Image27.jpeg" new file mode 100644 index 0000000..2c55861 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7/Image27.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7/Image28.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7/Image28.jpeg" new file mode 100644 index 0000000..e5ab7bc Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7/Image28.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7/Image29.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7/Image29.jpeg" new file mode 100644 index 0000000..c488158 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7/Image29.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7/Image3.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7/Image3.jpeg" new file mode 100644 index 0000000..2d78942 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7/Image3.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7/Image30.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7/Image30.jpeg" new file mode 100644 index 0000000..19ab7b0 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7/Image30.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7/Image31.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7/Image31.jpeg" new file mode 100644 index 0000000..578b326 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7/Image31.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7/Image32.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7/Image32.jpeg" new file mode 100644 index 0000000..343e77f Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7/Image32.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7/Image33.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7/Image33.jpeg" new file mode 100644 index 0000000..6a43d95 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7/Image33.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7/Image34.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7/Image34.jpeg" new file mode 100644 index 0000000..f6054cc Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7/Image34.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7/Image35.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7/Image35.jpeg" new file mode 100644 index 0000000..0cc10b0 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7/Image35.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7/Image36.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7/Image36.jpeg" new file mode 100644 index 0000000..58d8481 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7/Image36.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7/Image37.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7/Image37.jpeg" new file mode 100644 index 0000000..6e37c06 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7/Image37.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7/Image38.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7/Image38.jpeg" new file mode 100644 index 0000000..f724381 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7/Image38.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7/Image39.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7/Image39.jpeg" new file mode 100644 index 0000000..3d4257b Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7/Image39.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7/Image4.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7/Image4.jpeg" new file mode 100644 index 0000000..7b66a0a Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7/Image4.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7/Image40.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7/Image40.jpeg" new file mode 100644 index 0000000..62755d2 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7/Image40.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7/Image41.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7/Image41.jpeg" new file mode 100644 index 0000000..2d974da Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7/Image41.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7/Image42.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7/Image42.jpeg" new file mode 100644 index 0000000..398d5b7 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7/Image42.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7/Image43.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7/Image43.jpeg" new file mode 100644 index 0000000..c5d526e Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7/Image43.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7/Image44.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7/Image44.jpeg" new file mode 100644 index 0000000..75c594e Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7/Image44.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7/Image45.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7/Image45.jpeg" new file mode 100644 index 0000000..7419ef6 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7/Image45.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7/Image46.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7/Image46.jpeg" new file mode 100644 index 0000000..37ee6f8 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7/Image46.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7/Image47.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7/Image47.jpeg" new file mode 100644 index 0000000..5e12b05 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7/Image47.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7/Image5.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7/Image5.jpeg" new file mode 100644 index 0000000..a41d0b0 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7/Image5.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7/Image6.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7/Image6.jpeg" new file mode 100644 index 0000000..6ea9bdf Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7/Image6.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7/Image7.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7/Image7.jpeg" new file mode 100644 index 0000000..dcb453f Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7/Image7.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7/Image8.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7/Image8.jpeg" new file mode 100644 index 0000000..4029ad2 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7/Image8.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7/Image9.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7/Image9.jpeg" new file mode 100644 index 0000000..717a60d Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula7/Image9.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula8/Image1.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula8/Image1.jpeg" new file mode 100644 index 0000000..3068400 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula8/Image1.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula8/Image10.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula8/Image10.jpeg" new file mode 100644 index 0000000..9d7bf77 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula8/Image10.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula8/Image11.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula8/Image11.jpeg" new file mode 100644 index 0000000..b196df5 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula8/Image11.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula8/Image12.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula8/Image12.jpeg" new file mode 100644 index 0000000..d2669a6 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula8/Image12.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula8/Image13.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula8/Image13.jpeg" new file mode 100644 index 0000000..eada98c Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula8/Image13.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula8/Image14.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula8/Image14.jpeg" new file mode 100644 index 0000000..f260126 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula8/Image14.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula8/Image15.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula8/Image15.jpeg" new file mode 100644 index 0000000..a655f58 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula8/Image15.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula8/Image16.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula8/Image16.jpeg" new file mode 100644 index 0000000..4d826a3 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula8/Image16.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula8/Image17.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula8/Image17.jpeg" new file mode 100644 index 0000000..2a6b673 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula8/Image17.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula8/Image18.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula8/Image18.jpeg" new file mode 100644 index 0000000..b004256 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula8/Image18.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula8/Image19.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula8/Image19.jpeg" new file mode 100644 index 0000000..0388a56 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula8/Image19.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula8/Image2.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula8/Image2.jpeg" new file mode 100644 index 0000000..36da95e Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula8/Image2.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula8/Image20.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula8/Image20.jpeg" new file mode 100644 index 0000000..ae49807 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula8/Image20.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula8/Image21.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula8/Image21.jpeg" new file mode 100644 index 0000000..adbc04a Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula8/Image21.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula8/Image22.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula8/Image22.jpeg" new file mode 100644 index 0000000..abcff85 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula8/Image22.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula8/Image23.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula8/Image23.jpeg" new file mode 100644 index 0000000..5161761 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula8/Image23.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula8/Image24.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula8/Image24.jpeg" new file mode 100644 index 0000000..0f974c1 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula8/Image24.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula8/Image25.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula8/Image25.jpeg" new file mode 100644 index 0000000..41a039b Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula8/Image25.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula8/Image26.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula8/Image26.jpeg" new file mode 100644 index 0000000..18f96b7 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula8/Image26.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula8/Image27.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula8/Image27.jpeg" new file mode 100644 index 0000000..a4189de Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula8/Image27.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula8/Image28.png" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula8/Image28.png" new file mode 100644 index 0000000..23031cf Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula8/Image28.png" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula8/Image29.png" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula8/Image29.png" new file mode 100644 index 0000000..2ce799a Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula8/Image29.png" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula8/Image3.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula8/Image3.jpeg" new file mode 100644 index 0000000..97eb847 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula8/Image3.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula8/Image30.png" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula8/Image30.png" new file mode 100644 index 0000000..437e7ac Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula8/Image30.png" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula8/Image31.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula8/Image31.jpeg" new file mode 100644 index 0000000..cf69799 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula8/Image31.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula8/Image32.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula8/Image32.jpeg" new file mode 100644 index 0000000..5081e45 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula8/Image32.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula8/Image33.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula8/Image33.jpeg" new file mode 100644 index 0000000..4ca8b6e Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula8/Image33.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula8/Image34.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula8/Image34.jpeg" new file mode 100644 index 0000000..ea9dedc Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula8/Image34.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula8/Image35.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula8/Image35.jpeg" new file mode 100644 index 0000000..c0ee60f Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula8/Image35.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula8/Image36.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula8/Image36.jpeg" new file mode 100644 index 0000000..92629ae Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula8/Image36.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula8/Image37.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula8/Image37.jpeg" new file mode 100644 index 0000000..3b2a85a Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula8/Image37.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula8/Image38.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula8/Image38.jpeg" new file mode 100644 index 0000000..4825e51 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula8/Image38.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula8/Image39.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula8/Image39.jpeg" new file mode 100644 index 0000000..bfe9974 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula8/Image39.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula8/Image4.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula8/Image4.jpeg" new file mode 100644 index 0000000..3fef875 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula8/Image4.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula8/Image40.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula8/Image40.jpeg" new file mode 100644 index 0000000..4dab22a Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula8/Image40.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula8/Image5.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula8/Image5.jpeg" new file mode 100644 index 0000000..c427c00 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula8/Image5.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula8/Image6.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula8/Image6.jpeg" new file mode 100644 index 0000000..bc9a5c1 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula8/Image6.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula8/Image7.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula8/Image7.jpeg" new file mode 100644 index 0000000..1797aed Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula8/Image7.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula8/Image8.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula8/Image8.jpeg" new file mode 100644 index 0000000..60391e0 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula8/Image8.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula8/Image9.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula8/Image9.jpeg" new file mode 100644 index 0000000..0ed2b7f Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula8/Image9.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula9/Image1.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula9/Image1.jpeg" new file mode 100644 index 0000000..bd16503 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula9/Image1.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula9/Image10.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula9/Image10.jpeg" new file mode 100644 index 0000000..afc0ce3 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula9/Image10.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula9/Image11.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula9/Image11.jpeg" new file mode 100644 index 0000000..13dd2b9 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula9/Image11.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula9/Image12.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula9/Image12.jpeg" new file mode 100644 index 0000000..e937c99 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula9/Image12.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula9/Image13.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula9/Image13.jpeg" new file mode 100644 index 0000000..0ca65d4 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula9/Image13.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula9/Image14.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula9/Image14.jpeg" new file mode 100644 index 0000000..133dc23 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula9/Image14.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula9/Image15.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula9/Image15.jpeg" new file mode 100644 index 0000000..eafafdc Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula9/Image15.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula9/Image16.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula9/Image16.jpeg" new file mode 100644 index 0000000..dabb9cc Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula9/Image16.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula9/Image17.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula9/Image17.jpeg" new file mode 100644 index 0000000..cdbcc6a Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula9/Image17.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula9/Image18.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula9/Image18.jpeg" new file mode 100644 index 0000000..7229096 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula9/Image18.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula9/Image19.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula9/Image19.jpeg" new file mode 100644 index 0000000..afcc85a Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula9/Image19.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula9/Image2.png" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula9/Image2.png" new file mode 100644 index 0000000..2f885de Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula9/Image2.png" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula9/Image20.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula9/Image20.jpeg" new file mode 100644 index 0000000..302fc33 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula9/Image20.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula9/Image3.png" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula9/Image3.png" new file mode 100644 index 0000000..fe1e409 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula9/Image3.png" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula9/Image4.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula9/Image4.jpeg" new file mode 100644 index 0000000..8a626ee Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula9/Image4.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula9/Image5.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula9/Image5.jpeg" new file mode 100644 index 0000000..248f289 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula9/Image5.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula9/Image6.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula9/Image6.jpeg" new file mode 100644 index 0000000..b72199e Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula9/Image6.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula9/Image7.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula9/Image7.jpeg" new file mode 100644 index 0000000..aa53312 Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula9/Image7.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula9/Image8.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula9/Image8.jpeg" new file mode 100644 index 0000000..8dfb49e Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula9/Image8.jpeg" differ diff --git "a/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula9/Image9.jpeg" "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula9/Image9.jpeg" new file mode 100644 index 0000000..a5937fc Binary files /dev/null and "b/media/Implementa\303\247\303\243o-de-Banco-de-Dados/aula9/Image9.jpeg" differ