AULA 04 - Uso do SQL Flashcards

(43 cards)

1
Q

SQL - Definição

A

– Sigla para Structured Query Language (ou Linguagem de Consulta Estruturada).

SQL é basicamente a linguagem padrão para manipulação de bancos de dados relacionais. Por meio dela, um usuário pode executar comandos para inserir, pesquisar, atualizar ou deletar registros em um banco de dados, criar ou excluir tabelas, conceder ou revogar permissões para acessar o banco de dados, entre diversos outros recursos.

– Essa linguagem permite:

  • Crie e modifique estruturas de dados (tabelas, índices);
  • Insira, atualize, remova e recupere dados;
  • Filtre, agrupe e ordene informações;
  • Faça análises exploratórias diretas em grandes volumes de dados.

SQL é uma linguagem declarativa.

– Com o passar do tempo, alguns fornecedores introduziram alguns comandos procedurais e algumas **extensões à linguagem SQL e lançaram com nomes parecidos, tais como: PL/SQL ou Transact-SQL. No entanto, essas extensões são conhecidas como dialetos SQL **e, não, SQL em sua forma original!

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q

Linguagens - Paradigma declarativo x Paradigma procedural

A
  • Linguagem Declarativa

—- Você declara o resultado que deseja obter, e o sistema (neste caso, o banco de dados)** se encarrega de decidir como chegar lá**.

– Uma linguagem declarativa descreve o que fazer;

– a linguagem declarativa não está nem aí para como será feito, ela só quer o resultado.

– A linguagem SQL se trata de uma linguagem declarativa.

Não precisa dizer:

  • como o banco vai buscar os dados,
  • qual algoritmo ele vai usar para filtrar,
  • se vai usar índice ou não…

📌 Isso é responsabilidade do otimizador de consultas do SGBD (Sistema Gerenciador de Banco de Dados).

  • Linguagem Procedural

– Você precisa especificar passo a passo o procedimento a ser executado.

– uma linguagem procedural descreve como fazer.

– a linguagem
procedural
passo a passo** como algo deve ser feito**

– Você precisa dizer como:

  • acessar a lista de servidores,
  • iterar por cada registro,
  • aplicar a condição de idade,
  • coletar os nomes em uma nova lista.

=> Comparativo:

SQL (declarativa) é ideal quando você consulta dados em bancos relacionais — é mais enxuta, eficiente e otimizada para esse tipo de tarefa.

Procedural é usada quando você precisa de controle total sobre a lógica do processo, como criar algoritmos, processar dados em memória, criar laços e condições complexas etc.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q

Tipos de dados pré-definidos pela linguagem SQL

A

– É importante estudar os** tipos de dados pré-definidos pela linguagem SQL**.

– Em uma tabela armazenada em um banco de dados relacional, temos linhas e colunas. Para que uma tabela seja criada, é necessário especificar qual tipo de dados serão armazenados em suas colunas.

– O Padrão ANSI/SQL traz um conjunto de tipos de dados básicos padronizados pela linguagem.

1) Textuais

– Também conhecido como literal, esse tipo de dado é basicamente uma cadeia de caracteres.

– Podem ter um tamanho fixo (Ex: CHAR(n), em que n é o número fixo de caracteres) ou um tamanho variável (Ex: VARCHAR(n), em que **n **é o número máximo de caracteres).

– A modelagem com CHAR(n) obriga o usuário a escrever um texto com exatamente 280 caracteres (nem mais, nem menos).

– O Padrão ANSI/SQL-99 trouxe ainda um tipo de texto chamado CLOB (Character Large Object) capaz de armazenar textos gigantescos, sendo que o tamanho máximo depende da especificidade de cada SGBD.

– Por fim, é interessante lembrar que – **ao inserir um texto diretamente **no banco de dados – ele deve ser colocado entre aspas simples (apóstrofos).

– Ademais, ele é Case Sensitive (diferencia maiúsculas de minúsculas).

Observação importante: os valores do tipo texto inseridos em uma linha do banco de dados são Case Sensitive, mas as palavras-chave que compõem a linguagem, não. Dessa forma, você pode escrever tanto CREATE TABLE quanto create table.

2) Numérico

– Esse tipo de dado inclui números inteiros de diversos tamanhos (Ex: INTEGER, INT ou SMALLINT) e números reais (FLOAT, REAL e DOUBLE PRECISION) – também conhecidos como ponto flutuante.

  • Ponto flutuante é chamado assim porque – em números reais – o ponto varia de posição (Ex: 35.2 ou 0.458). Você pode definir a precisão e a **escala **desses números: a precisão é o número total de dígitos; e a escala é o número de dígitos após oponto decimal.
  • Exemplo: Qual é a escala e a precisão do número 527918.436?
  • => Precisão é o número total de dígitos, logo é 9; e a escala é o número de dígitos após o ponto decimal, logo é 3;
  • => Portanto, esse número poderia estar armazenado em uma coluna do banco de dados como FLOAT(9,3).
  • Se fosse requisitado informar a idade, por exemplo, ela poderia ser armazenada no banco de dados da aplicação como um número inteiro.

3) Binário

– Esse tipo de dado é basicamente uma cadeia de bits. Podem ter um tamanho fixo (Ex: BIT(n), em que **n **é o número fixo de caracteres) ou um tamanho variável (Ex: BIT VARYING(n), em que n é o número máximo de caracteres).

– Há ainda o BLOB (Binary Large Object), capaz de armazenar uma quantidade gigantesca de bits.

  • Exemplo do Twitter: durante a inscrição, é **requisitada uma foto de perfil **para seu novo Twitter.
  • Essa** foto fica armazenada** em um campo de uma tabela que armazena o endereço de um BLOB.
  • Em geral, **todo arquivo que você armazena em um banco de dados **fica em uma coluna desse tipo de dado porque ele é capaz de suportar uma quantidade gigantesca de bits.

-** Um arquivo é basicamente um conjunto de bits** (seja ele uma foto, um documento, um software, um vídeo, entre outros).

4) Booleano

– Esse tipo de dado tem como valores tradicionais **TRUE **(Verdadeiro) ou FALSE (Falso).

– O tipo Booleano utiliza** apenas 1 byte para seu armazenamento, uma vez que o valor falso é representado por 0** (00000000) e o valor verdadeiro é representado por **1 **(00000001).

  • Exemplo: Na inscrição do Twitter, é requisitado informar o seu sexo (Masculino ou Feminino).
  • Você pode** armazenar esse valor** em uma coluna do tipo Boolean e considerar o valor 1 como Masculino e o valor 0 como Feminino.
  • Esse tipo de dado também é muito comum para sinalizar uma linha.

=> Expressões lógicas

– Em expressões lógicas AND, OR e NOT, o **valor booleano TRUE **representa uma condição verdadeira e o **valor booleano FALSE **representa uma condição falsa.

  • Operação AND: o resultado é verdadeiro (TRUE) somente se ambas as expressões forem verdadeiras; caso contrário, o resultado é falso (FALSE). Por exemplo, a expressão “TRUE AND FALSE” resultaria em FALSE, porque apenas uma das condições é verdadeira.
  • Operação OR: o** resultado é verdadeiro** (TRUE) se pelo menos uma das expressões for verdadeira; caso contrário, o resultado é falso (FALSE). Por exemplo, a expressão “TRUE OR FALSE” resultaria em TRUE, porque uma das condições é verdadeira.
  • Operação NOT: esse operador inverte o valor de uma expressão lógica, isto é, se a expressão original é TRUE, a negação será FALSE, e vice-versa. Por exemplo, se tivermos a expressão lógica “NOT A”, onde A é TRUE, o resultado será FALSE.

=> Terceiro valor: NULL

– Vimos os valores booleanos tradicionais (TRUE e FALSE), no entanto o SQL trabalha com a Lógica de Três Valores.

– Além dos dois valores tradicionais, temos um terceiro valor: NULL. Esse valor é utilizado para representar um valor que está faltando, mas que – em geral – pode ter três interpretações diferentes.

  • Valor desconhecido: Trata-se de um valor que existe, mas que não é conhecido. Por exemplo: a data de nascimento de uma pessoa não é conhecida, e por isso é representada por NULL.
  • Valor indisponível: Trata-se de um valor que existe, mas foi propositalmente retido. Por exemplo: uma pessoa tem um telefone residencial, mas não deseja que ele seja listado, por isso ele é retido e representado como NULL.
  • Valor não Aplicável: Trata-se de um atributo indefinido para uma determinada tupla. Por exemplo: um atributo CONJUGE seria NULL para uma pessoa que não fosse casada, pois ele não se aplica a essa pessoa.

– Normalmente, não é possível determinar
qual dos significados é intencionado
; por exemplo, um NULL para o telefone residencial de uma pessoa pode ter qualquer um dos três significados.

– Logo, a SQL não distingue entre os diferentes significados de NULL.

– Em geral, cada valor NULL individual é considerado diferente de qualquer outro valor NULL nos diversos registros do banco de dados.

– Quando um NULL está envolvido em uma operação de comparação, o resultado é UNKNOWN.

UNKNOWN é um valor desconhecido que pode ser **TRUE **ou FALSE.

– Assim, a** SQL** usa uma lógica de três valores com os valores TRUE, FALSE e UNKNOWN em vez da lógica de dois valores (booleana) padrão, com os valores TRUE e FALSE.

– Portanto, é necessário definir os resultados (ou valores verdadeiros) das expressões lógicas de três valores quando os conectivos lógicos AND, OR e NOT forem usados.

– O banco de dados **trata os valores desconhecidos **para garantir a precisão dos resultados.

5) Data

– Esse tipo de dado possui dez posições, e seus componentes são DAY (Dia), MONTH (Mês) e YEAR (Ano) na forma DD-MM-YYYY (Ex: 30/03/2019).

Somente datas válidas devem ser permitidas pela implementação do SQL. Em outras palavras, os meses devem estar entre 1 e 12 e os dias devem estar entre 1 e 31.

– Além disso, os dias devem ser válidos para o mês correspondente – logo, não é possível haver a data 30/02/2020 porque o mês de fevereiro nunca tem 30 dias.

6) Hora

– Esse tipo de dado possui pelo menos oito posições compostas por HOUR (Hora), MINUTE (Minuto) e SECOND (Segundo) na forma HH:MM:SS.

Somente horas válidas devem ser permitidas pela implementação do SQL. Em outras palavras, as horas devem estar entre 0 e 23, os **minutos devem estar entre 0 e 59 **e os segundos também devem estar entre 0 e 59.

7) Outros

– Existem outros tipos de dados que foram acrescentados em versões posteriores do Padrão ANSI/SQL.

  • Entre eles, é importante mencionar o TIMESTAMP, que é basicamente uma junção da Data com Hora – e até Fuso Horário (Ex: 27-09-2008 09:12:47.648302).

– Outro tipo interessante é o INTERVAL, que permite calcular o intervalo entre Datas ou Horas;

DATETIME combina data e hora em um único tipo, com** intervalo de datas**.

– Por fim, é importante conhecer os valores nulos! Um campo com valor NULL é um campo sem valor. Se um campo em uma tabela for opcional, é possível inserir um novo registro ou atualizar um registro sem adicionar um valor a este campo. Em seguida, o campo será salvo com um valor NULL.

Observação: um valor NULL é diferente de um valor zero ou de um campo que contém espaços – um campo com um valor NULL é aquele que foi deixado em branco durante a criação do registro.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q

Sublinguagens SQL

A

SQL é uma linguagem que permite realizar determinadas operações em um banco de dados relacional por meio de um conjunto de comandos.

– Em geral, esses comandos são agrupados basicamente em quatro sublinguagens: DDL, DML, DCL e TCL (Também chamada de DTL - Data Transaction Language).

1) DDL (Data Definition Language

– Data Definition Language é o mesmo que Linguagem de Definição de Dados. Logo, essa linguagem serve para definir dados.

– Isso significa que essa linguagem possui um conjunto de comandos que podem ser utilizados para definir um esquema de banco de dados.

– Um esquema é uma descrição da estrutura de um banco de dados, sendo responsável por descrever tabelas, campos, views, funções, entre outros.

– Dito isso, nós podemos afirmar que a DDL é um subconjunto dos comandos SQL que podem ser utilizados para definir ou descrever um esquema de um banco de dados, permitindo criar ou modificar a estrutura de objetos de uma base de dados relacional.

– Portanto, SQL é uma linguagem com vários comandos e os comandos responsáveis por definir essa estrutura são chamados de DDL.

– A DDL define a estrutura física e lógica do banco de dados. Atua sobre objetos como tabelas, índices, visões (views), esquemas e domínios.

Comandos do DDL:

  • CREATE: Comando utilizado para criar tabelas (e outros objetos) de um banco de dados.
  • DROP: Comando utilizado para deletar uma tabela (e outros objetos) de um banco de dados.
  • TRUNCATE: Comando utilizado para apagar os dados de uma tabela de um banco de dados.
  • ALTER: Comando utilizado para manipular colunas ou restrições de um banco de dados.
  • RENAME: Comando utilizado para renomear uma tabela de um banco de dados.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q

Comandos DDL

CREATE TABLE

A

– Esse comando permite criar uma tabela em um banco de dados.

  • Sintaxe do comando

CREATE TABLE NOME_DA_TABELA (
NOME_COLUNA1 TIPO_DE_DADO RESTRIÇÕES ,
NOME_COLUNA2 TIPO_DE_DADO RESTRIÇÕES ,
NOME_COLUNA3 TIPO_DE_DADO RESTRIÇÕES ,

)

  • Exemplo do comando

CREATE TABLE ALUNO (

NOME VARCHAR(20) NOT NULL ,

CPF INT PRIMARY KEY ,

SEXO CHAR(1) NOT NULL ,

DATA_NASCIMENTO DATE NOT NULL ,

CIDADE VARCHAR(50) NOT NULL ,

VALOR_PAGO INT NOT NULL
);

– A sintaxe do comando indica que é necessário especificar o nome da tabela e – para cada colunaindicar seu nome, tipo de dado e eventuais restrições.

– No exemplo acima, nós criamos uma tabela (ALUNO) que:
- Contém seis colunas (NOME, CPF, SEXO, DATA_NASCIMENTO, CIDADE, VALOR_PAGO).
- Cada coluna possui um tipo (VARCHAR(20), INT, CHAR(1), DATE, VARCHAR(50), INT) e pode armazenar dados apenas desse respectivo tipo.

– Por fim, note que as colunas possuem determinadas restrições.
- Restrições são limitações de uma coluna (Ex: determinada coluna deve ser chave primária; determinada coluna deve ser chave estrangeira; determinada coluna não pode ser nula).
- O resultado do comando é uma tabela com suas respectivas colunas e restrições, mas sem nenhum dado, uma vez que nós apenas criamos a tabela, mas ainda não inserimos nada dentro.

– OBS: É possível criar uma tabela a partir de outra tabela;

  • Sintaxe do comando

CREATE TABLE NOME_TABELA_NOVA AS
SELECT NOME_COLUNA1, NOME_COLUNA2, NOME_COLUNA3, …
FROM NOME_TABELA_ANTIGA
WHERE

  • Exemplo do comando

CREATE TABLE ALUNO_ESCOLA_NOVA AS
SELECT NOME, CPF, SEXO, DATA_NASCIMENTO, CIDADE, VALOR_PAGO
FROM ALUNO_ESCOLA_ANTIGA

– Ao criar uma tabela a partir de outra, os dados contidos na tabela original também são copiados para a nova tabela.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q

Comandos DDL

DROP TABLE

A

– Esse comando é utilizado para excluir uma tabela existente em um banco de dados.

– Deve ser utilizado com extremo cuidado porque ele apagará a tabela junto com todos os seus dados.

  • Sintaxe do comando

DROP TABLE NOME_DA_TABELA;

  • Exemplo do comando

DROP TABLE ALUNO_ESCOLA_NOVA;

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q

Comandos DDL

TRUNCATE TABLE

A

– Esse comando é utilizado para apagar todos os dados de uma tabela, porém sem apagar a tabela em si.

– Em contraste com o comando DROP, aqui a estrutura da tabela permanece inalterada.

  • Sintaxe do comando

TRUNCATE TABLE NOME_DA_TABELA;

  • Exemplo do comando

TRUNCATE TABLE ALUNO_ESCOLA_NOVA;

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
8
Q

Comandos DDL

ALTER TABLE

A

– Esse comando é utilizado para adicionar, deletar ou modificar colunas de uma tabela existente – assim como permite modificar restrições.

– Para adicionar uma coluna, utilizamos a sintaxe:

  • Sintaxe do comando

ALTER TABLE NOME_DA_TABELA
ADD COLUMN NOME_COLUNA TIPO_DE_DADO;

  • Exemplo do comando

ALTER TABLE ALUNO
ADD COLUMN EMAIL VARCHAR(255);

– Vejam que nós adicionamos uma coluna do tipo texto chamada EMAIL capaz de armazenar até 255 caracteres.

– Para excluir uma coluna, utilizamos a sintaxe:

  • Sintaxe do comando

ALTER TABLE NOME_DA_TABELA
DROP COLUMN NOME_COLUNA;

  • Exemplo do comando

ALTER TABLE ALUNO
DROP COLUMN SEXO;

– A coluna SEXO foi excluída do resultado

– Para modificar o tipo de dado uma coluna, utilizamos a sintaxe:

  • Sintaxe do comando (SQL SERVER / MS-ACCESS)

ALTER TABLE NOME_DA_TABELA
ALTER COLUMN NOME_COLUNA TIPODEDADO;

  • Sintaxe do comando (MYSQL / ORACLE PRÉ-10G)

ALTER TABLE NOME_DA_TABELA
MODIFY COLUMN NOME_COLUNA TIPODEDADO;

  • Sintaxe do comando (MYSQL / ORACLE 10G EM DIANTE)

ALTER TABLE NOME_DA_TABELA
MODIFY NOME_COLUNA TIPODEDADO;

– Há três opções de sintaxe diferentes, porque existem pequenas diferenças a depender do SGBD utilizado.

  • Exemplo do comando (SQL Server)

ALTER TABLE ALUNO
ALTER COLUMN CPF VARCHAR(14);

– Notem que alteramos a coluna CPF da tabela ALUNO.
- Nós apenas convertemos o tipo de dado dessa coluna de INT para VARCHAR.

– Por fim, por meio desse comando, é possível também inserir ou excluir restrições de uma coluna.
- Você pode alterar uma coluna para indicar que ela não pode ser nula ou que ela será uma chave estrangeira.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
9
Q
A
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
10
Q

Comandos DDL

RENAME TABLE

A

– Em algumas situações, administradores de banco de dados desejam alterar o nome de uma tabela a fim de dar um nome mais relevante ou por outra razão.

  • Sintaxe do comando

RENAME TABLE NOME_DA_TABELA
TO NOVO_NOME_DA_TABELA;

  • Exemplo do comando

RENAME TABLE ALUNO
TO ALUNO_ESTRATEGIA;

– Alternativamente, também é possível utilizar o comando ALTER TABLE para modificar o nome de uma determinada tabela. Vejamos a sintaxe:

  • Sintaxe do comando

ALTER TABLE NOME_DA_TABELA
RENAME TO NOVO_NOME_DA_TABELA;

  • Exemplo do comando

ALTER TABLE ALUNO
RENAME TO ALUNO_ESTRATEGIA;

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
11
Q

Restrições

A

Restrições (Constraints) são um conjunto de limitações utilizadas para especificar regras para os dados em uma tabela de um banco de dados relacional.

– Elas buscam limitar o tipo de dado que pode ser armazenado, o que garante a precisão e confiabilidade aos dados da tabela. Se houver qualquer violação entre a restrição e a ação de dados, a ação será abortada.

– As restrições evitam que determinadas ações violem a integridade da estrutura dos dados especificada no esquema do banco de dados relacional.

– Elas podem ser no nível de coluna ou no nível de tabela, sendo que as restrições de nível de coluna se aplicam a uma coluna e as restrições de nível de tabela se aplicam a toda tabela.

Principais restrições:

  • Not null: Garante que uma coluna não possa ter um valor nulo.
  • Unique: Garante que todos os valores de uma coluna sejam diferentes entre si.
  • Primary key: Garante que todos os valores de uma coluna sejam diferentes entre si e não nulos.
  • Foreign key: Garante que ações não destruam links/relacionamentos entre as tabelas.
  • Check: Garante que os valores em uma coluna satisfaçam uma condição específica.
  • Default: Define um valor padrão para uma coluna, se nenhum valor for especificado.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
12
Q

Restrições

NOT NULL

A

Por padrão, uma coluna pode conter valores nulos (NULL). Isso significa que – se nada for especificado – não há nenhum problema em existir uma coluna que não contenha nenhum valor.

– Já a restrição NOT NULL força uma coluna a não aceitar valores nulos.

– Em outras palavras, essa restrição obriga que determinada coluna contenha valores. Logo, você não pode inserir um novo registro na tabela (ou atualizar um registro existente) sem adicionar valores a esse campo.

– Existem basicamente duas maneiras de definir uma coluna como NOT NULL.

– A primeira é durante a criação da tabela conforme já vimos anteriormente:

  • Sintaxe do comando

CREATE TABLE NOME_DA_TABELA (
NOME_COLUNA1 TIPODEDADO NOT NULL ,

);

  • Exemplo do comando

CREATE TABLE ALUNO (
NOME VARCHAR(20) NOT NULL ,
CPF INT PRIMARY KEY ,
SEXO CHAR(1) NOT NULL ,
DATA_NASCIMENTO DATE NOT NULL ,
CIDADE VARCHAR(50),
VALOR_PAGO INT
);

– Ao criar uma tabela, nós definimos – para cada coluna – nome, tipo e restrição. Nesse caso, basta definir a coluna como NOT NULL.

– A segunda maneira é por meio do comando ALTER TABLE:

  • Sintaxe do comando (MYSQL / ORACLE 10G EM DIANTE)

ALTER TABLE ALUNO
MODIFY CIDADE VARCHAR(50) NOT NULL;

– Portanto, a tabela ALUNO não permitirá valores nulos para os campos NOME, CPF, SEXO, DATA_NASCIMENTO e CIDADE.
- Logo, sempre que um registro for incluído nessa tabela, apenas o campo VALOR_PAGO poderá ficar em branco porque nenhuma restrição foi definida para ele.
- Todos os outros obrigatoriamente deverão ser preenchidos, caso contrário violarão a restrição especificada e a operação de inserção será abortada.

ATENÇÃO: Uma coluna com valor zero ou uma coluna com espaços em branco NÃO SÃO NULAS.
- Nulo significa ausência de valor, isto é, uma coluna vazia.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
13
Q

Restrições

UNIQUE

A

– Essa restrição garante que todos os valores em uma coluna sejam diferentes.

–Se uma coluna for definida com essa restrição, nenhum registro poderá ter valores iguais nessa coluna.

  • Exemplo do comando (sql server / oracle / ms-access)

CREATE TABLE ALUNO (
NOME VARCHAR(20) NOT NULL ,
CPF INT PRIMARY KEY ,
SEXO CHAR(1) NOT NULL ,
DATA_NASCIMENTO DATE NOT NULL ,
CIDADE VARCHAR(50) ,
MATRICULA INT UNIQUE ,
VALOR_PAGO INT
);

  • Exemplo do comando (mysql)

CREATE TABLE ALUNO (
NOME VARCHAR(20) NOT NULL ,
CPF INT PRIMARY KEY ,
SEXO CHAR(1) NOT NULL ,
DATA_NASCIMENTO DATE NOT NULL ,
CIDADE VARCHAR(50) ,
MATRICULA INT ,
VALOR_PAGO INT
UNIQUE (MATRICULA)
);

– Note que especificamos que a coluna MATRICULA é UNIQUE.
- Logo, em todos os registros da tabela, essa coluna não pode ficar vazia nem ter valores repetidos.

– É possível dar um nome a uma restrição de unicidade.

– Portanto, é possível nomear uma restrição de unicidade ou defini-la para múltiplas colunas simultaneamente. A sintaxe para ambas as situações é a mesma:

  • Sintaxe do comando (mysql / sql server / oracle / ms-access)

– PARA NOMEAR UMA RESTRIÇÃO OU DEFINI-LA PARA MÚLTIPLAS COLUNAS
CREATE TABLE NOME_DA_TABELA (
NOME_COLUNA1 TIPO_DE_DADO PRIMARY KEY ,
NOME_COLUNA2 TIPO_DE_DADO NOT NULL ,
NOME_COLUNA3 TIPO_DE_DADO ,
NOME_COLUNA4 TIPO_DE_DADO NOT NULL ,
NOME_COLUNA5 TIPO_DE_DADO ,
**CONSTRAINT **NOME_DA_RESTRICAO UNIQUE (NOME_COLUNA3, NOME_COLUNA5)

);

– É possível também adicionar uma restrição de unicidade a uma coluna de uma tabela pré-existente por meio da sintaxe apresentada a seguir:

  • Sintaxe do comando (mysql / sql server / oracle / ms-access)

ALTER TABLE NOME_DA_TABELA
ADD UNIQUE (NOME_DA_COLUNA);

O que aconteceria se eu tentasse inserir uma restrição de unicidade a uma coluna que já possua valores repetidos?
- Antes de inserir a restrição, o Sistema Gerenciador de Banco de Dados (SGBD) analisará os dados da coluna para garantir que todos os valores pré-existentes nela são únicos.
- Se ela encontrar algum valor duplicado, retornará um erro e não alterará a tabela com a adição da restrição de unidade.

– Por fim, da mesma forma que é possível adicionar uma restrição de unicidade a uma determinada coluna, é também possível retirá-la por meio da seguinte sintaxe:

  • Sintaxe do comando (mysql)

ALTER TABLE NOME_DA_TABELA
DROP INDEX NOME_DA_RESTRICAO;

  • Sintaxe do comando (sql server / oracle / ms-access)

ALTER TABLE NOME_DA_TABELA
DROP CONSTRAINT NOME_DA_RESTRICAO;

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
14
Q

Restrições

PRIMARY KEY

A

– Essa restrição permite identificar unicamente cada registro de uma tabela, o que fornece uma garantia de exclusividade para uma coluna ou conjunto de colunas.

– A restrição PRIMARY KEY combina as duas restrições analisadas nos tópicos anteriores: PRIMARY KEY = NOT NULL + UNIQUE.

– Em outras palavras, uma coluna que seja definida com a restrição PRIMARY KEY necessariamente não poderá receber valores nulos nem repetidos.

– Uma coluna que possua a restrição UNIQUE
jamais poderá se repetir, mas poderá ser nula;

– Uma coluna que possua a restrição NOT NULL jamais poderá ser nula, mas poderá se repetir;

– Uma coluna que possua a restrição PRIMARY KEY jamais poderá ser nula e jamais poderá se repetir.

– Uma tabela poderá ter apenas uma chave primária composta de **uma coluna **(simples) ou mais colunas (composta).

  • Sintaxe do comando (sql server / oracle / ms-access)

CREATE TABLE NOME_DA_TABELA (
NOME_COLUNA1 TIPO_DE_DADO PRIMARY KEY ,
NOME_COLUNA2 TIPO_DE_DADO RESTRIÇÕES ,
NOME_COLUNA3 TIPO_DE_DADO RESTRIÇÕES ,

);

  • Sintaxe do comando (mysql)

CREATE TABLE NOME_DA_TABELA (
NOME_COLUNA1 TIPO_DE_DADO RESTRIÇÕES ,
NOME_COLUNA2 TIPO_DE_DADO RESTRIÇÕES ,
NOME_COLUNA3 TIPO_DE_DADO RESTRIÇÕES ,

PRIMARY KEY (NOME_COLUNA1)
);

  • Sintaxe do comando (mysql / sql server / oracle / ms-access)

PARA NOMEAR UMA RESTRIÇÃO OU DEFINI-LA PARA MÚLTIPLAS COLUNAS

CREATE TABLE NOME_DA_TABELA (
NOME_COLUNA1 TIPO_DE_DADO RESTRIÇÕES ,
NOME_COLUNA2 TIPO_DE_DADO RESTRIÇÕES ,
NOME_COLUNA3 TIPO_DE_DADO RESTRIÇÕES ,

CONSTRAINT NOME_DA_RESTRICAO PRIMARY KEY (NOME_COLUNA1, NOME_COLUNA2)
);

– É possível também adicionar uma restrição PRIMARY KEY a uma tabela pré-existente. Para tal, utiliza-se a seguinte sintaxe:

  • Sintaxe do comando (MYSQL / sql server / oracle / ms-access)

ALTER TABLE NOME_DA_TABELA
ADD PRIMARY KEY (NOME_COLUNA1);

  • Sintaxe do comando (MYSQL / sql server / oracle / ms-access)

PARA NOMEAR UMA RESTRIÇÃO OU DEFINI-LA PARA MÚLTIPLAS COLUNAS

ALTER TABLE NOME_DA_TABELA
ADD CONSTRAINT NOME_DA_RESTRICAO PRIMARY KEY (NOME_COLUNA1, NOME_COLUNA2);

– Por fim, da mesma forma que é possível adicionar uma restrição PRIMARY KEY a uma determinada coluna, é também possível retirá-la por meio da seguinte sintaxe:

  • Sintaxe do comando (mysql)

ALTER TABLE NOME_DA_TABELA
DROP PRIMARY KEY;

  • Sintaxe do comando (sql server / oracle / ms-access)

ALTER TABLE NOME_DA_TABELA
DROP CONSTRAINT NOME_DA_RESTRICAO;

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
15
Q

Restrições

FOREIGN KEY

A

– As tabelas dentro de um banco de dados relacional precisam se interligar de alguma forma.
- Essa ligação se faz por meio de chaves estrangeiras.
- As chaves estrangeiras são utilizadas para unir duas tabelas, em que a chave estrangeira de uma tabela referencia uma chave candidata de outra tabela (em geral, a chave primária).

– A restrição FOREIGN KEY é utilizada justamente para definir uma ou mais colunas como chaves estrangeiras e prevenir que alguma ação possa destruir essa ligação entre tabelas.

– A tabela com a chave estrangeira é chamada de Tabela Filha, e a tabela com a chave primária é chamada de Tabela Referenciada ou Tabela Pai.

  • Sintaxe do comando (sql server / oracle / ms-access)

CREATE TABLE NOME_DA_TABELA (
NOME_COLUNA1 TIPO_DE_DADO PRIMARY KEY ,
NOME_COLUNA2 TIPO_DE_DADO RESTRIÇÕES ,
NOME_COLUNA3 TIPO_DE_DADO FOREIGN KEY REFERENCES TABELA_REFERENCIADA (CHAVE)
);

  • Sintaxe do comando (MYSQL)

CREATE TABLE NOME_DA_TABELA (
NOME_COLUNA1 TIPO_DE_DADO RESTRIÇÕES ,
NOME_COLUNA2 TIPO_DE_DADO RESTRIÇÕES ,
NOME_COLUNA3 TIPO_DE_DADO RESTRIÇÕES ,
PRIMARY KEY (NOME_COLUNA1) ,
FOREIGN KEY (NOME_COLUNA2) REFERENCES TABELA_REFERENCIADA (CHAVE)
);

  • Sintaxe do comando (MYSQL / sql server / oracle / ms-access)

PARA NOMEAR UMA RESTRIÇÃO OU DEFINI-LA PARA MÚLTIPLAS COLUNAS

CREATE TABLE NOME_DA_TABELA (
NOME_COLUNA1 TIPO_DE_DADO RESTRIÇÕES ,
NOME_COLUNA2 TIPO_DE_DADO RESTRIÇÕES ,
NOME_COLUNA3 TIPO_DE_DADO RESTRIÇÕES ,
CONSTRAINT NOME_DA_RESTRICAO FOREIGN KEY (NOME_COLUNA1)
REFERENCES TABELA_REFERENCIADA (CHAVE)
);

– As sintaxes apresentadas anteriormente atribuímos a restrição FOREIGN KEY a uma coluna da Tabela Filha e definimos à qual coluna ela se refere na Tabela Referenciada.
- É a coluna de uma tabela se referindo à coluna de outra tabela de modo que uma alteração em uma também afeta a outra.

– É possível adicionar essa restrição a uma tabela pré-existente:

  • Sintaxe do comando (MYSQL / sql server / oracle / ms-access)

ALTER TABLE NOME_DA_TABELA
ADD FOREIGN KEY (NOME_COLUNA1) REFERENCES TABELA_REFERENCIADA (CHAVE);

  • Sintaxe do comando (MYSQL / sql server / oracle / ms-access)

PARA NOMEAR UMA RESTRIÇÃO OU DEFINI-LA PARA MÚLTIPLAS COLUNAS

ALTER TABLE NOME_DA_TABELA
ADD CONSTRAINT NOME_DA_RESTRICAO
FOREIGN KEY (NOME_COLUNA1)
REFERENCES TABELA_REFERENCIADA (CHAVE);

– Por fim, da mesma forma que é possível adicionar uma restrição FOREIGN KEY a uma determinada coluna, é também possível retirá-la por meio da seguinte sintaxe:

  • Sintaxe do comando (mysql)

ALTER TABLE NOME_DA_TABELA
DROP FOREIGN KEY;

  • Sintaxe do comando (sql server / oracle / ms-access)

ALTER TABLE NOME_DA_TABELA
DROP CONSTRAINT NOME_DA_RESTRICAO;

Problema: O que aconteceria se eu deletasse um registro da tabela pai?
- Todo registro da tabela filha que referenciasse esse registro deletado da tabela pai teria um valor inválido, porque ela perderia a sua referência.
- Para resolver esse problema podemos utilizar a cláusula ON DELETE CASCADE.
- => Essa cláusula basicamente obriga a exclusão dos registros correspondentes das Tabelas Filhas que referenciam o registro excluído da Tabela Pai.

– Existe também a cláusula ON UPDATE, que permite realizar algumas ações quando há uma alteração na tabela pai: CASCADE, RESTRICT, NO ACTION, SET NULL e SET DEFAULT.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
16
Q

Restrições

CHECK

A

– Essa restrição é utilizada para limitar o intervalo de valores que pode ser inserido em uma coluna.
- É possível defini-la para uma coluna ou para uma tabela.
- Caso seja definida para uma coluna, ela permitirá apenas alguns valores para esta coluna.
- Caso seja definida para uma tabela, ela limitará os valores de certas colunas com base nos valores de outras colunas da linha.

  • Exemplo do comando (sql server / oracle / ms-access)

CREATE TABLE ALUNO (
NOME VARCHAR(20) NOT NULL ,
CPF INT PRIMARY KEY ,
SEXO CHAR(1) NOT NULL ,
CIDADE VARCHAR(50) ,
MATRICULA INT UNIQUE ,
IDADE INT CHECK (IDADE >= 18)
);

  • Exemplo do comando (mysql)

CREATE TABLE ALUNO (
NOME VARCHAR(20) NOT NULL ,
CPF INT PRIMARY KEY ,
SEXO *CHAR(1) *NOT NULL ,
CIDADE VARCHAR(50) ,
MATRICULA INT UNIQUE ,
IDADE INT ,
CHECK (IDADE >= 18)
);

  • Exemplo do comando (mysql / sql server / oracle / ms-access)

PARA NOMEAR UMA RESTRIÇÃO OU DEFINI-LA PARA MÚLTIPLAS COLUNAS

CREATE TABLE ALUNO (
NOME VARCHAR(20) NOT NULL ,
CPF INT PRIMARY KEY ,
SEXO CHAR(1) NOT NULL ,
CIDADE VARCHAR(50) ,
MATRICULA INT UNIQUE ,
IDADE INT ,
CONSTRAINT NOME_DA_RESTRICAO CHECK (IDADE >= 18 AND SEXO = ‘F’)
);

– No último exemplo, temos uma restrição composta, dado que limita a inserção de registros apenas àqueles que tenham IDADE >= 18 e SEXO = ‘F’. Em outras palavras, será permitido o armazenamento de registros apenas de mulheres maiores de idade.

– Também é possível adicioná-la após a criação da tabela, isto é, em uma tabela pré-existente.

  • Sintaxe do comando (mysql / sql server / oracle / ms-access)

ALTER TABLE NOME_DA_TABELA
ADD CHECK (CONDICAO);

  • Sintaxe do comando (mysql / sql server / oracle / ms-access)

PARA NOMEAR UMA RESTRIÇÃO OU DEFINI-LA PARA MÚLTIPLAS COLUNAS

ALTER TABLE NOME_DA_TABELA
ADD CONSTRAINT NOME_DA_RESTRICAO CHECK (CONDICAO1 OPERADOR CONDIÇÃO2 …);

– Da mesma forma que é possível adicionar uma restrição de checagem, é também possível retirá-la por meio da seguinte sintaxe:

  • Sintaxe do comando (mysql)

ALTER TABLE NOME_DA_TABELA
DROP CHECK NOME_DA_RESTRICAO;

  • Sintaxe do comando (sql server / oracle / ms-access)

ALTER TABLE NOME_DA_TABELA
DROP CONSTRAINT NOME_DA_RESTRICAO;

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
17
Q

Restrições

DEFAULT

A

– Essa restrição é utilizada para configurar um valor padrão para uma coluna.

– Esse valor padrão é adicionado em todos os novos registros, caso nenhum outro valor tenha sido especificado.

  • Exemplo do comando (mysql / sql server / oracle / ms-access)

CREATE TABLE ALUNO (
NOME VARCHAR(20) NOT NULL ,
CPF INT PRIMARY KEY ,
SEXO CHAR(1) NOT NULL ,
CIDADE VARCHAR(50) DEFAULT ‘Brasília’ ,
MATRICULA INT UNIQUE ,
);

– No exemplo acima, todo registro que não tenha especificado um valor para a coluna CIDADE será automaticamente preenchido com o valor Brasília pelo próprio sistema.

  • Sintaxe do comando (mysql)

ALTER TABLE NOME_DA_TABELA
ADD NOME_COLUNA SET DEFAULT VALOR;

  • Sintaxe do comando (sql server)

ALTER TABLE NOME_DA_TABELA
ADD CONSTRAINT NOME_DA_RESTRICAO DEFAULT VALOR FOR NOME_COLUNA;

  • Sintaxe do comando (ms-access)

ALTER TABLE NOME_DA_TABELA
ALTER COLUMN NOME_COLUNA SET DEFAULT VALOR;

  • Sintaxe do comando (oracle)

ALTER TABLE NOME_DA_TABELA
MODIFY NOME_COLUNA DEFAULT VALOR;

– Da mesma forma que é possível adicionar um valor padrão, é também possível retirá-lo por meio da seguinte sintaxe:

  • Sintaxe do comando (mysql)

ALTER TABLE NOME_DA_TABELA
ALTER NOME_COLUNA DROP DEFAULT;

  • Sintaxe do comando (sql server / oracle / ms-access)

**ALTER TABLE **NOME_DA_TABELA
ALTER COLUMN NOME_COLUNA DROP DEFAULT;

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
18
Q

DML (Data Manipulation Language)

A

– Data Manipulation Language (em tradução livre, Linguagem de Manipulação de Dados).

– Essa linguagem serve manipular dados.

– Possui um conjunto de comandos que podem ser utilizados para realizar transações em um banco de dados (inserir, excluir, deletar ou consultar):

  • SELECT: Comando utilizado para realizar consultas a dados de uma ou mais tabelas do banco de dados.
  • INSERT: Comando utilizado para inserir um registro em uma tabela do banco de dados.
  • UPDATE: Comando utilizado para mudar valores de dados de registros de uma tabela do banco de dados.
  • DELETE: Comando utilizado para remover registros de uma tabela do banco de dados.
19
Q

Comandos DML

INSERT

A

– Esse comando é utilizado para inserir novos registros em uma tabela do banco de dados.

– Há duas formas de inseri-los: completo ou incompleto.

– Imagine uma tabela cujos registros contenham seis colunas:
- Se você for inserir um registro por completo, isto é, com valores para todas as colunas, não é necessário indicar o nome das colunas;
- Se for inserir dados para apenas algumas colunas, é necessário indicar quais serão essas colunas e na ordem correta.

  • Sintaxe do comando I

INSERÇÃO DE TODOS OS VALORES DISPENSA A ESPECIFICAÇÃO DAS COLUNAS

INSERT INTO NOME_DA_TABELA
VALUES (VALOR_1, VALOR_2, VALOR_3, …)

  • Sintaxe do comando II

INSERÇÃO DE VALORES PARA APENAS ALGUMAS COLUNAS, PRECISA DA ESPECIFICAÇÃO

INSERT INTO NOME_DA_TABELA (NOME_COLUNA1, NOME_COLUNA2, NOME_COLUNA3, …)
VALUES (VALOR_1, VALOR_2, VALOR_3, …)

20
Q

Comandos DML

UPDATE

A

– Esse comando é utilizado para atualizar registros existentes em uma tabela do banco de dados.

– Esse comando é utilizado para atualizar registros existentes em uma tabela do banco de dados.

– Pode-se atualizar todos os registros de uma tabela ou apenas alguns.
- Para atualizar registros específicos, devemos utilizar a cláusula WHERE.
- Essa cláusula será detalhada mais à frente, mas – por enquanto – basta saber que ela permite filtrar dados a partir de um conjunto de condições.

  • Sintaxe do comando

UPDATE NOME_DA_TABELA
SET NOME_DA_COLUNA_1 = VALOR_1, NOME_COLUNA2 = VALOR_2 …
WHERE LISTA_DE_CONDICOES

  • Exemplo do comando

UPDATE ALUNO_ESTRATEGIA
SET NOME = ‘DIOGO’, EMAIL = ‘DIOGO@GMAIL.COM’
WHERE CPF = 44444444444

– Vamos supor que houvesse um erro e o nome de um aluno fosse Diogo em vez de Diego.
- Vejam no exemplo acima que o código apresentado atualiza (UPDATE) a tabela ALUNO_ESTRATEGIA de tal forma que se configure (SET) o valor da coluna NOME para ‘Diogo’ e o valor da coluna EMAIL para ‘diogo@gmail.com’, porém apenas para os registros que tenham 44444444444 como valor de CPF.

21
Q

Comandos DML

DELETE

A

– Esse comando é utilizado para deletar registros existentes em uma tabela do banco de dados.
- Pode-se deletar todos os registros de uma tabela ou apenas alguns.

– Para deletar registros específicos, devemos utilizar a cláusula WHERE.
- Se não for utilizada a cláusula WHERE, o DELETE funcionará como um TRUNCATE. => Irá deletar todos os registros de uma tabela (mas mantém a estrutura).

  • Exemplo: excluir da tabela ALUNO_ESTRATEGIA as linhas/registros cujo** valor da coluna VALOR_PAGO** seja 175.00 ou cujo valor da coluna CIDADE seja RECIFE.
  • Sintaxe do comando

DELETE FROM NOME_DA_TABELA WHERE LISTA_DE_CONDICOES

  • Exemplo do comando

DELETE FROM ALUNO_ESTRATEGIA WHERE VALOR_PAGO = 175.00 OR CIDADE = ‘RECIFE’;

22
Q

Comandos DML

SELECT

A

– Esse comando é utilizado para recuperar informações de um banco de dados.

– ATENÇÃO: não confundir a cláusula SELECT com a operação de seleção da álgebra relacional.

– Na verdade, essas três operações podem ser mapeadas para suas cláusulas correspondentes como SELECT, FROM e WHERE respectivamente.

-Sintaxe do comando

AS CLÁUSULAS SÃO OPCIONAIS

SELECT LISTA_DE_COLUNAS FROM LISTA_DE_TABELAS CLAUSULAS;

  • Exemplo do comando

SELECT * FROM ALUNO_ESTRATEGIA

– Note que foi utilizado o elemento asterisco (*). => significa que queremos recuperar todas as colunas da tabela.

– Comandos e respectiva interpretação:

  • SELECT => selecione
  • Asterisco => todas as colunas
  • FROM => da tabela
  • Exemplo: selecionando colunas específicas

SELECT NOME, DATA_NASCIMENTO FROM ALUNO_ESTRATEGIA;

– Existe uma palavra-chave que pode ser utilizada junto com o comando SELECT que tem a função justamente de eliminar os registros duplicados. Essa palavra-chave se chama DINSTINCT.

  • Sintaxe do comando

AS CLÁUSULAS SÃO OPCIONAIS

SELECT DISTINCT LISTA_DE_COLUNAS FROM LISTA_DE_TABELAS CLAUSULAS;

  • Exemplo de comando

SELECT DISTINCT CIDADE FROM ALUNO_ESTRATEGIA;

– Nesse caso, a partir do acréscimo do DISTINCT, só irá retornar valores não repetidos.

Alias => Trata-se de um recurso utilizado para dar a uma tabela (ou a uma coluna de uma tabela) um nome temporário – como se fosse um apelido.
- Em geral, eles são utilizados para tornar os nomes das colunas mais legíveis.
- Um alias existe apenas para a duração de uma determinada consulta e é criado por meio da palavra-chave AS (que pode ser omitida).

  • Sintaxe do comando

ALIAS PARA O NOME DA TABELA

SELECT NOME_COLUNA FROM NOME_DA_TABELA AS APELIDO CLAUSULAS;

ALIAS PARA O NOME DA COLUNA

SELECT NOME_COLUNA AS APELIDO FROM NOME_DA_TABELA CLAUSULAS;

  • Exemplo do comando

SELECT NOME AS N, DATA_NASCIMENTO AS DN FROM ALUNO_ESTRATEGIA AS AE;

– Em geral, esse recurso é muito útil quando existe mais de uma tabela envolvida em uma consulta; quando funções são utilizadas dentro de uma consulta; quando nomes de colunas são muito grandes ou pouco intuitivos; e quando duas ou mais colunas são combinadas em uma só.

– Uma outra possibilidade é a inserção de constantes em vez de nomes de tabelas. => é possível pedir para a consulta retornar uma constante para cada registro da tabela.

  • Exemplo do comando

SELECT 1 AS RESULTADO FROM ALUNO_ESTRATEGIA;

23
Q

Cláusulas - FROM

A

– As cláusulas SQL são partes específicas de um comando (geralmente SELECT) que indicam o que deve ser buscado, de onde, com quais filtros, ordenações, agrupamentos, etc.

– São como blocos de construção das consultas SQL.

1) FROM

Especifica de onde (quais tabelas) devemos selecionar ou excluir dados – aqui vamos nos focar apenas na seleção de dados.

  • Sintaxe do comando

SELECT LISTA_DE_COLUNAS FROM TABELA1, TABELA2, … CLAUSULAS;

– É possível especificar mais de uma tabela separada por vírgula! Quando isso ocorre,
temos um Produto Cartesiano.

  • Exemplo do comando

SELECT * FROM TABELA_PROFESSOR, TABELA_DISCIPLINA;

– As colunas da tabela resultante é basicamente a união das colunas das tabelas especificadas, uma vez que utilizamos o asterisco.
- Já linhas da tabela resultante é basicamente uma combinação de todas as linhas de uma tabela com todas as linhas de outra.
- Chama-se produto cartesiano justamente porque o resultado é um produto, isto é, o número de linhas de uma tabela (3) vezes o número de linhas de outra tabela (2) retorna uma tabela resultante com 3x2 = 6 linhas.

– Quando fazemos combinações entre tabelas, os apelidos (alias) se tornam extremamente úteis.
- Porque eventualmente podemos fazer o produto de duas ou mais tabelas que possuem atributos com o mesmo nome.

– Exemplo: Imagine o produto cartesiano entre uma tabela chamada PRODUTO e outra tabela chamada EMPRESA.
- Imagine que ambas as tabelas possuem uma coluna chamada CÓDIGO.
- Nesse caso, a tabela resultante teria duas colunas com o mesmo nome.
- Para evitar esse tipo de problema e reduzir a ambiguidade, utilizam-se os alias.
- Nós podemos chamar a tabela PRODUTO de P e a tabela EMPRESA de E.
- Dessa forma, a tabela resultante teria uma coluna P.CODIGO e outra coluna chamada E.CODIGO. E assim não temos mais ambiguidade.

24
Q

Cláusulas

JOIN

A

– Essa cláusula é utilizada para combinar linhas/registros de duas ou mais tabelas, com base em uma coluna em comum entre elas.

– Possui 5 tipos diferentes:

  • INNER JOIN: Retorna registros que possuem valores correspondentes em ambas as tabelas.
  • LEFT JOIN: Retorna todos os registros da tabela da esquerda e seus correspondentes da tabela da direita.
  • RIGHT JOIN: Retorna todos os
    registros da tabela da direita
    e seus correspondentes da tabela da esquerda.
  • FULL OUTER JOIN: Retorna todos os registros quando há uma correspondência na tabela da esquerda ou da direita.
  • SELF JOIN: Trata-se de join comum, mas que relaciona registros de uma tabela com ela mesma.

1) INNER JOIN

– O INNER JOIN (também chamado apenas de JOIN) é uma cláusula que seleciona registros que contenham valores correspondentes em ambas as tabelas.

– O comando permite utilizar INNER JOIN ou apenas JOIN.

  • Sintaxe do comando

SELECT NOME_DAS_COLUNAS
FROM TABELA1
INNER JOIN TABELA2
ON TABELA1.NOME_COLUNA = TABELA2.NOME_COLUNA;

  • Exemplo do comando

SELECT PEDIDOS.ID_PEDIDO, CLIENTES.NOME_CLIENTE
FROM PEDIDOS
INNER JOIN CLIENTES
ON PEDIDOS.ID_CLIENTE = CLIENTES.ID_CLIENTE;

– O comando está nos dizendo para selecionar (SELECT) todas as linhas de ambas as tabelas (FROM PEDIDOS INNER JOIN CLIENTES) desde que exista uma correspondência entre as colunas (ON PEDIDOS.ID_CLIENTE = CLIENTES.ID_CLIENTE) e, após isso, retornar as colunas PEDIDOS.ID_PEDIDO e CLIENTES.NOME_CLIENTE.

– No exemplo, a coluna em comum é
ID_CLIENTE.
- A tabela PEDIDOS possui três valores para essa coluna: [2, 37, 77];
- A tabela CLIENTES também possui três valores para essa coluna: [1, 2, 3].
- Como se trata de um INNER JOIN, a tabela resultante retornará apenas os registros que possuem correspondência em ambas as tabelas.

– Também que é possível fazer um INNER JOIN com mais de duas tabelas, conforme mostra o exemplo seguinte (com três tabelas):

  • Exemplo do comando

SELECT PEDIDOS.ID_PEDIDO, CLIENTES.NOME_CLIENTE, ENTREGADORES.NOME_ENTREGADOR
FROM ((PEDIDOS
INNER JOIN CLIENTES ON PEDIDOS.ID_CLIENTE = CLIENTES.ID_CLIENTE)
INNER JOIN ENTREGADORES ON PEDIDOS.ID_ENTREGADOR = ENTREGADORES.ID_ENTREGADOR);

– As tabelas que compõem um INNER JOIN devem possuir uma coluna em comum.
- Em geral, essas colunas em comum possuem o mesmo nome conforme vimos nos exemplos.
- No entanto, isso não é obrigatório – elas podem ter conteúdos correspondentes, mas nomes distintos.
- De toda forma, caso elas tenham o mesmo nome, é possível utilizar a palavra-chave USING para melhorar a leitura do código e sua compreensão.

  • Sintaxe do comando

SELECT LISTA_DE_COLUNAS
FROM TABELA1
INNER JOIN TABELA2
USING (NOME_COLUNA_COMUM);

  • Exemplo do comando

SELECT PEDIDOS.ID_PEDIDO, CLIENTES.NOME_CLIENTE
FROM PEDIDOS
INNER JOIN CLIENTES
USING (ID_CLIENTE);

2) LEFT JOIN

– O LEFT JOIN (também chamado de LEFT OUTER JOIN) retorna todos os registros da tabela da esquerda, além dos registros correspondentes da tabela da direita.

  • Sintaxe do comando

SELECT NOME_DAS_COLUNAS
FROM TABELA1
LEFT JOIN TABELA2
ON TABELA1.NOME_COLUNA = TABELA2.NOME_COLUNA;

  • Exemplo comando

SELECT PEDIDOS.ID_PEDIDO, CLIENTES.NOME_CLIENTE
FROM PEDIDOS
LEFT JOIN CLIENTES
ON PEDIDOS.ID_CLIENTE = CLIENTES.ID_CLIENTE;

– O comando está nos dizendo para selecionar (SELECT) todas as linhas da tabela da esquerda (FROM PEDIDOS LEFT JOIN), além dos registros da tabela da direita (CLIENTES) desde que exista uma correspondência entre as colunas (ON PEDIDOS.ID_CLIENTE = CLIENTES.ID_CLIENTE) e, após isso, retornar as colunas PEDIDOS.ID_PEDIDO e CLIENTES.NOME_CLIENTE.

3) RIGHT JOIN

– O RIGHT JOIN (também chamado de RIGHT OUTER JOIN) retorna todos os registros da tabela da direita, além dos registros correspondentes da tabela da esquerda.

  • Sintaxe do comando

SELECT NOME_DAS_COLUNAS
FROM TABELA1
RIGHT JOIN TABELA2
ON TABELA1.NOME_COLUNA = TABELA2.NOME_COLUNA;

  • Exemplo do comando

SELECT PEDIDOS.ID_PEDIDO, CLIENTES.NOME_CLIENTE
FROM PEDIDOS
RIGHT JOIN CLIENTES
ON PEDIDOS.ID_CLIENTE = CLIENTES.ID_CLIENTE;

– O comando está nos dizendo para selecionar (SELECT) todas as linhas da tabela da direita (CLIENTES), além dos registros da tabela da esquerda (FROM PEDIDOS RIGHT JOIN) desde que exista uma correspondência entre as colunas (ON PEDIDOS.ID_CLIENTE = CLIENTES.ID_CLIENTE) e, após isso, retornar as colunas PEDIDOS.ID_PEDIDO e CLIENTES.NOME_CLIENTE.

4) FULL JOIN (ou FULL OUTER JOIN)

– O FULL JOIN (também chamado de FULL OUTER JOIN) retorna todos os registros quando há uma correspondência da tabela esquerda com a direita ou da direita com a esquerda.

  • Sintaxe do comando

SELECT NOME_DAS_COLUNAS
FROM TABELA1
FULL OUTER JOIN TABELA2
ON TABELA1.NOME_COLUNA = TABELA2.NOME_COLUNA;

  • Exemplo do comando

SELECT PEDIDOS.ID_PEDIDO, CLIENTES.NOME_CLIENTE
FROM PEDIDOS
FULL OUTER JOIN CLIENTES
ON PEDIDOS.ID_CLIENTE = CLIENTES.ID_CLIENTE;

– O comando está nos dizendo para selecionar (SELECT) todas as linhas da tabela da direita e da esquerda (FROM PEDIDOS FULL OUTER JOIN CLIENTES) desde que exista uma correspondência entre as colunas (ON PEDIDOS.ID_CLIENTE = CLIENTES.ID_CLIENTE) e, após isso, retornar as colunas PEDIDOS.ID_PEDIDO e CLIENTES.NOME_CLIENTE.

5) SELF JOIN

– Por fim, o SELF JOIN é um join comum, mas que relaciona uma tabela consigo mesma. Imaginem um auto-relacionamento, isto é, uma tabela que se relaciona com ela mesma.

  • Exemplo do comando

SELECT C1.NOME_CLIENTE AS CLIENTE_INDICADOR, C2.NOME_CLIENTE AS CLIENTE_INDICADO
FROM CLIENTES C1
JOIN CLIENTES C2
ON C1.ID_CLIENTE = C2.ID_INDICACAO;

25
# Cláusulas WHERE
*WHERE* -- WHERE é uma cláusula responsável por **permitir a filtragem dos registros de uma tabela por meio de uma ou mais condições**. - Sintaxe do comando **SELECT** NOME_COLUNA1, NOME_COLUNA2, ... **FROM** NOME_DA_TABELA1 **WHERE** CONDICAO; - Exemplo do comando **SELECT** * **FROM** ALUNO_ESTRATEGIA **WHERE** CIDADE = ‘BRASÍLIA’; -- Essa cláusula **não é utilizada apenas com o comando SELECT**. - Ela também pode ser utilizada junto com os comandos **UPDATE** e **DELETE**. -- A **condição** é basicamente uma **expressão booleana**, isto é, uma expressão que **retornará um valor TRUE ou FALSE**. -- Existem diversas maneiras de definir uma condição e, para tal, utilizam-se **operadores relacionais e lógicos para comparar valores**: - **=** (IGUAL): **WHERE** NOME **=** ‘DIEGO’; - **>** (MAIOR): **WHERE** VALOR_PAGO **>** 1000.00; - **>=** (MAIOR OU IGUAL): **WHERE** IDADE **>=** 18; - **<** (MENOR): **WHERE** DATA_NASCIMENTO **<** ‘01/01/2000’; - **<=** (MENOR OU IGUAL): **WHERE** VELOCIDADE **<=** 100; - **<>** (DIFERENTE): **WHERE** CIDADE **<>** ‘São Paulo’; => *Operadores AND, OR, NOT, BETWEEN* a) Operadores AND, OR e NOT -- Os dois primeiros são utilizados para **filtrar registros baseado em mais de uma condição** - o AND exibe um registro se **todas as condições separadas por ele forem verdadeiras**; - o OR exibe um registro se **qualquer uma das condições separadas por ele for verdadeira**. - Sintaxe do comando (AND) **SELECT** NOME_COLUNA1, NOME_COLUNA2, ... **FROM** NOME_DA_TABELA1 **WHERE** CONDICAO1 **AND** CONDICAO2 **AND** CONDICAO3 ... ; - Exemplo do comando (AND) **SELECT** * **FROM** ALUNO_ESTRATEGIA **WHERE** CIDADE = ‘SALVADOR’ **AND** VALOR_PAGO >= 200.00 ; -- O resultado **filtrou a tabela original**, retornando **apenas os registros cuja cidade era Salvador** ***E*** cujo **valor pago foi maior ou igual a 250.00**. - Sintaxe do comando (OR) **SELECT** NOME_COLUNA1, NOME_COLUNA2, ... **FROM** NOME_DA_TABELA1 **WHERE** CONDICAO1 **OR** CONDICAO2 **OR** CONDICAO3 ... ; - Exemplo do comando (OR) **SELECT** * **FROM** ALUNO_ESTRATEGIA **WHERE** CIDADE = ‘SALVADOR’ **OR** VALOR_PAGO >= 200.00 ; -- O resultado filtrou a tabela original, **retornando apenas os registros cuja cidade era Salvador** ***OU*** cujo **valor pago foi maior ou igual a 250.00**. -- O NOT é basicamente uma **negação que inverte o significado de um operador lógico**. - Sintaxe do comando **SELECT** NOME_COLUNA1, NOME_COLUNA2, ... **FROM** NOME_DA_TABELA1 **WHERE NOT** CONDICAO1; - Exemplo do comando **SELECT** * **FROM** ALUNO_ESTRATEGIA **WHERE NOT** CIDADE = ‘BRASÍLIA’; -- O resultado filtrou a tabela original, **retornando apenas os registros cuja cidade *NÃO* era Brasília**. b) Operadores BETWEEN, IN, LIKE e IS NULL => O BETWEEN permite **selecionar valores** (números, textos ou datas) **dentro de um determinado intervalo**. -- Os valores dentro do intervalo incluem as extremidades? Sim, esse comando é inclusivo, isto é, os valores inicial e final são incluídos. - Sintaxe do comando **SELECT** NOME_COLUNA1, NOME_COLUNA2, ... **FROM** NOME_DA_TABELA1 **WHERE** NOME_COLUNA1 **BETWEEN** VALOR1 **AND** VALOR2; - Exemplo do comando **SELECT** * **FROM** ALUNO_ESTRATEGIA **WHERE** VALOR_PAGO **BETWEEN** 150.00 **AND** 300.00; => O operador **LIKE** é utilizado em uma cláusula **WHERE** para **pesquisar um padrão especificado em uma coluna por meio da utilização de *caracteres curingas*** (wildcards). -- Trata-se de um caractere utilizado para substituir um ou mais caracteres em uma string (cadeia de caracteres). -- Existem **dois caracteres curingas principais** que são frequentemente utilizados com o operador **LIKE**: sinal de porcentagem (**%**) e sinal de sublinhado (**_**). -- A *porcentagem* **substitui zero**, **um ou mais caracteres** e o *sublinhado* **substitui um único caractere** – ambos podem ser utilizados de forma combinada e com outros operadores. - WHERE NOME LIKE '**A%**': Retorna valores que **comecem com “A”**. - WHERE NOME LIKE '**%A**': Retorna valores que **terminem com “A”**. - WHERE NOME LIKE '**%IO%**': Retorna valores que **possuam “IO” em qualquer posição**. - WHERE NOME LIKE '**_R%**': Retorna valores que possuam um **caractere e depois a letra “R”**. - WHERE NOME LIKE '**%A_**': Retorna valores que **terminem com “A” mais apenas um caractere**. - WHERE NOME LIKE '**A%**': Retorna valores que **comecem com “A” e possuem ao menos 3 caracteres**. - WHERE NOME LIKE '**%A%O**' Retorna valores que **possuam “A” depois “O”** (imediatamente ou não). => Os operadores **IS NULL** e **IS NOT NULL** são utilizados para **avaliar se uma coluna é nula ou não**, visto que operadores relacionais não podem ser utilizados para comparar valores nulos. - Sintaxe do comando (**IS NULL**) **SELECT** NOME_COLUNA1, NOME_COLUNA2, ... **FROM** NOME_DA_TABELA1 **WHERE** NOME_COLUNA1 **IS NULL**; - Sintaxe do comando (**IS NOT NULL**) **SELECT** NOME_COLUNA1, NOME_COLUNA2, ... **FROM** NOME_DA_TABELA1 **WHERE** NOME_COLUNA1 **IS NOT NULL**; => Operador IN -- Esse operador permite **especificar múltiplos valores dentro de uma cláusula WHERE**. Ele também pode ser utilizado como NOT IN. -- Sintaxe do comando **SELECT** NOME_COLUNA1, NOME_COLUNA2, ... **FROM** NOME_DA_TABELA1 **WHERE** NOME_COLUNA1 **IN** (VALOR1, VALOR2,...); - Exemplo Do comando **SELECT** * **FROM** ALUNO_ESTRATEGIA **WHERE** CIDADE **IN** (‘SALVADOR’, ’GOIANIA’); -- Esse comando retorna **todas as colunas** da tabela em que a cidade seja Salvador **OU** Goiânia. Aliás, esse operador é como a **abreviação para várias condições OR**. - Comparativo de comandos **SELECT** * **FROM** ALUNO_ESTRATEGIA **WHERE** CIDADE = ‘SALVADOR’ **OR** CIDADE = ’GOIANIA’; = **SELECT** * **FROM** ALUNO_ESTRATEGIA **WHERE** CIDADE **IN** (‘SALVADOR’, ’GOIANIA’); -- Há outra maneira de utilizar o **operador IN**. => Por meio de** subconsultas**. - Também chamado de subqueries ou de consultas aninhadas, trata-se basicamente de **uma consulta dentro de outra consulta** (pode ser um SELECT, INSERT, UPDATE ou DELETE). -- Elas podem ser de dois tipos: **correlacionadas** ou **não correlacionadas**. - As *subconsultas correlacionadas* são **consultas que dependem** e **fazem referências às colunas de consultas externas a qual estão contidas**; - Já as *consultas não correlacionadas* são **consultas independentes das consultas externas nas quais estão contidas**. => *Operador EXISTS* -- Esse operador **permite testar a existência de qualquer registro em uma subconsulta**. -- Ele **retorna TRUE** se a **subconsulta retornar um ou mais registros**; caso contrário, *retorna FALSE*. - Sintaxe do comando **SELECT** NOME_COLUNA1, NOME_COLUNA2, ... **FROM** NOME_DA_TABELA1 **WHERE EXISTS** (**SELECT** ... **FROM** ... **WHERE** ...); - Exemplo do comando **SELECT** * **FROM** CAPITAIS C **WHERE EXISTS** (**SELECT** CIDADE **FROM** ALUNO_ESTRATEGIA AE **WHERE** AE.CIDADE = C.CAPITAL); -- Esse comando **retorna todos os registros da tabela de CAPITAIS** desde que a **capital exista como uma das cidades** da tabela ALUNO_ESTRATEGIA. -- Esse é um clássico exemplo de **subconsulta correlacionada**. - Ao contrário da subconsulta não correlacionada, essa **não pode ser executada independentemente da consulta externa**, dado que **contém uma ou mais referências a colunas da consulta externa**. - Inclusive, ela *retornará erro caso se tente executá-la de forma independente*.
26
GROUP BY
*GROUP BY* -- A cláusula **GROUP BY** foi **criada e adicionada** à linguagem SQL porque a **cláusula WHERE não podia ser utilizada com funções de agregação**. Como assim, - Imaginem que vocês queiram um *relatório com alguma quantidade, soma, valores máximos, valores mínimos, média*, entre outros. - Para isso, você precisará **utilizar uma função de agregação junto com a cláusula GROUP BY**. - Sintaxe do comando **SELECT** LISTA_DE_COLUNAS, FUNCAO_DE_AGREGACAO(COLUNA) **FROM** NOME_DA_TABELA **WHERE** CONDIÇOES *--OPCIONAL* **GROUP BY** LISTA_DE_COLUNAS; - Exemplo do comando **SELECT** CIDADE, COUNT(CPF) **FROM** ALUNO_ESTRATEGIA **GROUP BY** CIDADE; -- Essa cláusula **buscará registros de uma tabela** que **possuem um valor em comum para um ou mais atributos** e **os agrupará baseado em algum critério de agrupamento** (soma, média, quantidade, etc). -- No caso do comando acima, ele **buscará registros que tenham o mesmo valor para o atributo CIDADE** e **os agrupará pela quantidade** (Brasília tem quatro aparições; São Paulo tem uma aparição; Goiânia tem uma aparição; e Salvador tem duas aparições). -- A seguir, podemos ver outras **funções de agregação** – lembrando que todas elas **podem ser utilizadas com o operador DISTINCT**. - **COUNT()** - *Quantidade*: Essa função conta a quantidade total de dados de um dado campo. - **SUM()** - *Soma*: Essa função soma valores numéricos de um dado campo9. - **AVG()** - *Média*: Essa função calcula a média aritmética simples de um conjunto de valores numéricos. - **MAX()** - *Máximo*: Essa função retorna o maior valor encontrado de um dado campo. - **MIN()** - *Mínimo*: Essa função retorna o menor valor encontrado de um dado campo. -- Observação: Um detalhe que cai sobre a **função SUM()**: - É possível **inserir um valor** de tal modo que, para **cada registro encontrado**, **esse valor seja somado**. Por exemplo: SUM(2) **somará duas unidades para cada registro** encontrado. Logo, se encontrou 3 registros, retornará 2x3 = 6. Além disso, é importante mencionar que SUM(1) = COUNT(*) = COUNT(1). -- Lembrando que as **funções de agregação** podem ser **utilizadas também em outras cláusulas** ***sem necessariamente a presença do GROUP BY***. - Exemplo do comando **SELECT** **MAX**(VALOR_PAGO) **FROM** ALUNO_ESTRATEGIA
27
HAVING
*HAVING* -- A cláusula WHERE filtra linhas de acordo com alguma condição, já a ***cláusula HAVING*** **filtra agrupamentos também de acordo com alguma condição**. -- Dessa forma, podemos concluir que **a cláusula HAVING só pode existir se houver anteriormente uma cláusula GROUP BY**. -- No exemplo a seguir, queremos **filtrar o agrupamento** de modo que **só mostre as linhas cuja função agregada COUNT(CPF) seja maior que 1**. - Sintaxe do comando **SELECT** LISTA_DE_COLUNAS, FUNCAO_DE_AGREGACAO(COLUNA) **FROM** NOME_DA_TABELA **WHERE** CONDIÇOES --OPCIONAL **GROUP BY** LISTA_DE_COLUNAS **HAVING** CONDIÇOES; - Exemplo do comando **SELECT** CIDADE, COUNT(CPF) **FROM** ALUNO_ESTRATEGIA **GROUP BY** CIDADE **HAVING** **COUNT(CPF) > 1**; -- A **coluna utilizada na cláusula HAVING** ***deve necessariamente estar na lista de colunas selecionadas no SELECT*** ou **estar contida dentro de uma função de agregação**. - Dessa forma, se fizermos um SELECT de CIDADE junto de uma função de agregação selecionada, a cláusula HAVING poderá filtrar por CIDADE, pela função de agregação selecionada ou por uma coluna (Ex: VALOR_PAGO) **desde que ela esteja contida dentro de uma função de agregação**. - Exemplo do comando **SELECT** CIDADE, COUNT(CPF) **FROM** ALUNO_ESTRATEGIA **GROUP BY** CIDADE **HAVING** MAX(VALOR_PAGO) > 100; -- Note que VALOR_PAGO **não pode ser utilizado no HAVING porque não consta do SELECT**, mas **como está dentro de uma função de agregação** (MAX), ***sua utilização é permitida***.
28
# DML ORDER BY
*ORDER BY* -- A consulta apresentada no tópico anterior retorna apenas os agrupamentos que satisfizeram a condição estabelecida na sintaxe, ou seja, cidades que possuem mais de um aluno. -- No entanto, eu quero que os **dados sejam apresentados em ordem crescente** e – para tal – **é necessário utilizar** a nossa penúltima cláusula: ***ORDER BY***. - Por meio dela, é possível **ordenar registros/linhas de uma tabela em ordem crescente** (ASC) ou **decrescente** (DESC). - Sintaxe do comando **SELECT** LISTA_DE_COLUNAS, FUNCAO_DE_AGREGACAO(COLUNA) **FROM** NOME_DA_TABELA **WHERE** CONDIÇOES --OPCIONAL **GROUP BY** LISTA_DE_COLUNAS *--OPCIONAL* **HAVING** CONDIÇOES *--OPCIONAL* **ORDER BY** COLUNA1 **ASC | DESC**, COLUNA2 **ASC | DESC**, ...; - Exemplo do comando **SELECT** CIDADE, COUNT(CPF) **FROM** ALUNO_ESTRATEGIA **GROUP BY** CIDADE **HAVING** **COUNT**(CPF) > 1 **ORDER BY **COUNT(CPF) **ASC**; -- A **coluna utilizada** para ordenação na *cláusula ORDER BY* **deve necessariamente estar na lista de colunas do SELECT**, em uma **função de agregação qualquer** ou ainda **em uma coluna definida em uma tabela do FROM**. - Dessa forma, se fizermos um SELECT de NOME e CIDADE, a cláusula ORDER BY poderá ordenar por NOME, por CIDADE ou por **outra coluna** (Ex: VALOR_PAGO) **desde que ela esteja contida dentro de uma função de agregação**. -- *Algumas observações*: 1) Caso **não seja indicado se é ASC ou DESC**, o ***valor default é ASC***. 2) Várias dessas cláusulas são opcionais, logo **é possível utilizar o ORDER BY apenas com SELECT e FROM**. 3) É possível também **representar a coluna responsável pela ordenação** por meio de um **número que indique a ordem da coluna** (Ex: 1 é primeira coluna, 2 é segunda coluna, 3 é terceira coluna, etc). 4) Por fim, é possível **indicar mais de uma coluna para ordenação** (no caso de empates).
29
LIMIT
*LIMIT* -- Essa cláusula é utilizada para **restringir o conjunto de resultados a um número fixo de linhas**. -- É claro que, **se o conjunto de resultados completo tiver menos linhas do que o número limite** que definimos, o banco de dados **retornará menos registros do que o número limite**. -- Essa cláusula **não faz parte do padrão SQL puro**, logo outros dialetos possuem variações: MS-SQL Server chama de **TOP** e o Oracle chama de **ROWNUM**. - Sintaxe do comando **SELECT** LISTA_DE_COLUNAS **FROM** NOME_DA_TABELA **LIMIT** QTD_LINHAS; - Exemplo do comando **SELECT** * **FROM** ALUNO_ESTRATEGIA **LIMIT** 2;
30
UNION
*UNION* -- Por fim, vamos falar de um operador chamado ***UNION***! -- *Não se trata de uma cláusula*, trata-se de um **operador utilizado para combinar os resultados de duas ou mais instruções SELECT**. -- Para que funcione, **cada uma dessas instruções deve conter o mesmo número de colunas**, sendo que as colunas devem ter **tipos de dados semelhantes** – além de ter a **mesma ordem**. - Sintaxe do comando **SELECT** LISTA_DE_COLUNAS **FROM** NOME_DA_TABELA1 ***UNION*** **SELECT** LISTA_DE_COLUNAS **FROM** NOME_DA_TABELA2; -- Esse comando **elimina eventuais linhas duplicadas**. -- Caso se queira **permitir linhas duplicadas**, utiliza-se a instrução ***UNION ALL***: - Sintaxe do comando **SELECT** LISTA_DE_COLUNAS **FROM** NOME_DA_TABELA1 ***UNION ALL*** **SELECT** LISTA_DE_COLUNAS **FROM** NOME_DA_TABELA2; -- O resultado é muito simples: esse comando basicamente **une/junta as linhas das tabelas que compõem a união**. Se tinham 10 linhas em cada tabela, teremos 20 (exceto se houver duplicatas).
31
Resumo de todas Cláusulas SQL e respectivas operações da Álgebra Relacional
✅ RESUMO: Cláusulas SQL × Operações da Álgebra Relacional 1. Seleção de tuplas (linhas) 🔹 Álgebra Relacional: σ (sigma) 🔹 SQL: WHERE ✅ Função: Filtra linhas com base em condições. 🧾 Exemplo: sql Copiar Editar SELECT * FROM empregados WHERE salario > 5000; 2. Projeção de atributos (colunas) 🔹 Álgebra Relacional: π (pi) 🔹 SQL: SELECT (lista de colunas) ✅ Função: Escolhe quais colunas retornar. 🧾 Exemplo: sql Copiar Editar SELECT nome, salario FROM empregados; 3. Renomeação de tabelas ou atributos 🔹 Álgebra Relacional: ρ (rho) 🔹 SQL: AS ✅ Função: Dá alias a tabelas ou colunas. 🧾 Exemplo: sql Copiar Editar SELECT nome AS funcionario FROM empregados AS e; 4. Produto cartesiano 🔹 Álgebra Relacional: R × S 🔹 SQL: FROM tabela1, tabela2 (sem JOIN e sem WHERE) ✅ Função: Combina todas as tuplas de duas relações. ⚠️ Evitado na prática por gerar muitas combinações. 🧾 Exemplo: sql Copiar Editar SELECT * FROM clientes, pedidos; 5. Junção (JOIN) 🔹 Álgebra Relacional: ⨝ (junção) 🔹 SQL: INNER JOIN, LEFT JOIN, etc. ✅ Função: Une duas tabelas com base em uma condição. 🧾 Exemplo: sql Copiar Editar SELECT * FROM clientes c JOIN pedidos p ON c.id = p.cliente_id; 6. União 🔹 Álgebra Relacional: ∪ (união) 🔹 SQL: UNION ✅ Função: Une os resultados de duas queries, eliminando duplicatas. 🧾 Exemplo: sql Copiar Editar SELECT nome FROM alunos_2024 UNION SELECT nome FROM alunos_2025; 7. Diferença 🔹 Álgebra Relacional: − (menos) 🔹 SQL: EXCEPT ou MINUS (dependendo do SGBD) ✅ Função: Retorna os registros de uma query que não estão em outra. 🧾 Exemplo: sql Copiar Editar SELECT nome FROM empregados EXCEPT SELECT nome FROM gerentes; 8. Interseção 🔹 Álgebra Relacional: ∩ (interseção) 🔹 SQL: INTERSECT ✅ Função: Retorna os registros comuns às duas queries. 🧾 Exemplo: sql Copiar Editar SELECT nome FROM projeto_a INTERSECT SELECT nome FROM projeto_b; 9. Agrupamento e agregação 🔹 Álgebra Relacional Estendida: funções como SUM, AVG, COUNT 🔹 SQL: GROUP BY, HAVING, agregações (COUNT, SUM, etc.) ✅ Função: Resume e agrupa dados. 🧾 Exemplo: sql Copiar Editar SELECT departamento, AVG(salario) FROM empregados GROUP BY departamento HAVING AVG(salario) > 5000; 10. Ordenação (não tem equivalente direto em álgebra relacional) 🔹 Álgebra Relacional: – 🔹 SQL: ORDER BY ✅ Função: Ordena os resultados da consulta. 🧾 Exemplo: sql Copiar Editar SELECT nome, salario FROM empregados ORDER BY salario DESC;
32
TCL (Transaction Control Language)
*Transaction Control Language (TCL)* => Comandos TCL -- Agora nós já sabemos como manipular dados de um banco de dados. **Essa manipulação** se dá por meio de **transações**: *modificar*, *inserir*, *remover* e *consultar*. - Uma **transação** deve ser *atômica*, *consistente*, *isolada* e *durável* => Para alcançar esses objetivos, faz-se uso de **comandos capazes de controlar transações** por meio do T**ransaction Control Language** (TCL). -- Comandos TCL - ***COMMIT***: Comando utilizado para **finalizar/confirmar uma transação dentro de um SGBD**. - ***ROLLBACK***: Comando utilizado para **descartar mudanças nos dados desde o último COMMIT ou ROLLBACK**. -- Há ainda os comandos *SAVEPOINT* e SET *TRANSACTION* (raramente abordados em provas).
33
# Comandos TCL COMMIT
*COMMIT* -- Comando utilizado para **salvar ermanentemente uma transação** em um banco de dados. Quando nós **utilizamos transações DML** (Ex: *INSERT*, *UPDATE* ou *DELETE*), as **mudanças feitas por esses comandos não são permanentes**. -- *Até que a sessão se encerre*, as mudanças realizadas por esses comandos **ainda não foram confirmadas**. Utiliza-se o **comando COMMIT** para ***efetivar as mudanças realizadas pelas transações***. -- Vamos supor que você **precise inserir, modificar ou deletar diversos valores** em um banco de dados. - O banco de dados **realiza essas transações** e **as deixa em um estado intermediário**. - No entanto, ele **só altera os dados** de fato **quando se executa o comando COMMIT**. - Esse comando **salva todas as transações** de uma base de dados **desde o último COMMIT** ou **ROLLBACK**. - ***O SGBD saberá, assim, que as transações executadas estão de fato sendo confirmadas***. => OBSERVAÇÃO -- O comando SAVEPOINT na DTL (Data Transaction Language) serve para **criar um ponto de salvamento dentro de uma transação**, permitindo que você **desfaça alterações apenas até esse ponto**, **em vez de reverter toda a transação**.
34
# Comandos TCL ROLLBACK
-- Comando utilizado para **cancelar transações e retornar para o último estado em que foi realizado COMMIT**. -- Se forem *realizadas inserções, modificações ou remoções* em uma base de dados e – por alguma razão – percebermos que essas **transações não são mais necessárias**, pode-se utilizar o **comando ROLLBACK** para ***desfazer as transações*** – serão ***desfeitas transações desde o último COMMIT ou ROLLBACK***.
35
36
DCL (Data Control Language)
*DCL (Data Control Language)* -- Data Control Language é o mesmo que **Linguagem de Controle de Dados** => Logo, essa linguagem serve para controlar dados. -- A linguagem possui um **conjunto de comandos** que podem ser utilizados para lidar com **autorizações de dados e licenças de usuários** para ***controlar quem tem acesso para ver ou manipular dados dentro do banco de dados***. -- O administrador do banco de dados pode **utilizar alguns comandos** que **permitem que determinada área só consulte dados**; **outra área consiga consultar e inserir**; **outra só pode atualizar**; e assim por diante. -- Comandos DCL - *GRANT*: Comando utilizado para **conceder permissão a um usuário em relação a algum objeto**. - *REVOKE*: Comando utilizado para **remover/restringir a capacidade de um usuário de executar operações**.
37
# Comandos DCL GRANT
*GRANT* -- Comando utilizado para **conceder permissões a usuários em relação a objetos**. -- Há **nove funções** permitidas: SELECT, INSERT, UPDATE, DELETE, REFERENCES, USAGE, UNDER, TRIGGER e EXECUTE. - Sintaxe do comando **GRANT** LISTA_DE_PRIVILEGIOS **ON** OBJETO **TO** LISTA_DE_USUARIOS; - Exemplo do comando **GRANT** SELECT **ON** ALUNO_ESTRATEGIA **TO** PROFESSOR; **GRANT** INSERT **ON** ALUNO_ESTRATEGIA **TO** GERENTE; **GRANT** UPDATE **ON** ALUNO_ESTRATEGIA **TO** HEBER; **GRANT** DELETE **ON** ALUNO_ESTRATEGIA **TO** RICARDO; **GRANT** REFERENCES **ON** ALUNO_ESTRATEGIA **TO** DUDU; - Resultado do comando --*TODOS OS COMANDOS GARANTEM ALGUM TIPO DE PERMISSÃO À TABELA ALUNOESTRATEGIA* **SELECT** – PERMITE QUE PROFESSOR CONSULTE DADOS; **INSERT** – PERMITE QUE GERENTE INSIRA DADOS; **UPDATE** – PERMITE QUE HEBER MODIFIQUE DADOS; **DELETE** – PERMITE QUE RICARDO DELETE DADOS; **REFERENCES** – PERMITE QUE DUDU REFERENCIE OUTRA TABELA;
38
# Comandos DCL REVOKE
*REVOKE* -- Comando usado para **revogar permissões a usuários em relação a objetos**. -- Há **nove funções**: SELECT, INSERT, UPDATE, DELETE, REFERENCES, USAGE, UNDER, TRIGGER e EXECUTE. - Sintaxe do comando **REVOKE** LISTA_DE_PRIVILEGIOS **ON** OBJETO **FROM** LISTA_DE_USUARIOS; - Exemplo do comando **REVOKE** SELECT **ON** ALUNO_ESTRATEGIA **FROM** PROFESSOR; **REVOKE** INSERT **ON** ALUNO_ESTRATEGIA **FROM** GERENTE; **REVOKE** UPDATE **ON** ALUNO_ESTRATEGIA **FROM** HEBER; **REVOKE** DELETE **ON** ALUNO_ESTRATEGIA **FROM** RICARDO; **REVOKE** REFERENCES **ON** ALUNO_ESTRATEGIA **FROM** DUDU; - Resultado do comando **SELECT** – REVOGA A PERMISSÃO DE QUE PROFESSOR CONSULTE DADOS; **INSERT** – REVOGA A PERMISSÃO DE QUE GERENTE INSIRA DADOS; **UPDATE** – REVOGA A PERMISSÃO DE QUE HEBER MODIFIQUE DADOS; **DELETE** – REVOGA A PERMISSÃO DE QUE RICARDO DELETE DADOS; **REFERENCES** – REVOGA A PERMISSÃO DE QUE DUDU REFERENCIE OUTRA TABELA;
39
Conceitos avançados - Databases
*Databases* 1) CREATE DATABASE -- Esse comando permite **criar um banco de dados**. - Sintaxe do comando **CREATE DATABASE** NOME_BANCO; - Exemplo do comando **CREATE DATABASE** BANCO_ESTRATEGIA; 2) DROP DATABASE -- Esse comando permite excluir um banco de dados. - Sintaxe do comando **DROP DATABASE** NOME_BANCO; - Exemplo do comando **DROP DATABASE** BANCO_ESTRATEGIA; -- *Duas informações importantes*: - (1) **ao excluir um banco de dados**, **os dados contidos no banco** evidentemente também **serão deletados**, logo essa exclusão** só pode ser realizada por usuários que tenham privilégios de administrador**; - (2) apesar de estarmos estudando em tópicos separados e ao final da aula, **ambos os comandos** de bancos de dados **fazem parte da DDL e precedem todos os outros**, visto que *é necessário criar um banco de dados para poder manipulá-lo.*
40
# Conceitos avançados VIEWS
*Views* -- Uma **visão** (view) é uma **tabela virtual** baseada no **conjunto de resultados de uma instrução SQL**. -- Ela **contém linhas e colunas**, assim como uma tabela real. -- Os **campos em uma visão** são **campos de uma ou mais tabelas reais no banco de dados**. -- Você pode **adicionar instruções e funções a uma visualização** e *apresentar os dados como se fossem provenientes de uma única tabela*. - Sintaxe do comando **CREATE VIEW** [NOME_VIEW] **AS** **SELECT** NOME_COLUNA1, NOME_COLUNA2, ... **FROM** NOME_DA_TABELA **WHERE** CONDICAO; - Exemplo do comando **CREATE VIEW** [BRASILIENSES] **AS** **SELECT** NOME, CIDADE **FROM** ALUNO_ESTRATEGIA **WHERE** CIDADE = ‘BRASÍLIA’; -- No exemplo, **criamos uma view para retornar apenas alunos brasilienses**, logo nós fizemos uma **seleção de NOME e CIDADE** da tabela ALUNO_ESTRATEGIA em que a **cidade seja BRASÍLIA**. -- **Uma vez criada a view**, eu posso **consultá-la diretamente da seguinte forma**: **SELECT * FROM** [BRASILIENSES]. -- Lembrando que **uma visão sempre mostra dados atualizados** – o mecanismo de banco de dados **recria a visualização sempre que um usuário a consulta**. 1) CREATE OR REPLACE VIEW -- Esse comando permite **alterar uma view existente** ou, *caso ela ainda não exista*, **permite criá-la**. - Sintaxe do comando **CREATE OR REPLACE VIEW** [NOME_VIEW] **AS** **SELECT** NOME_COLUNA1, NOME_COLUNA2, ... **FROM** NOME_DA_TABELA **WHERE** CONDICAO; - Exemplo do comando **CREATE OR REPLACE VIEW** [BRASILIENSES] **AS** **SELECT** NOME, E-MAIL, CIDADE, **FROM** ALUNO_ESTRATEGIA **WHERE** CIDADE = “BRASÍLIA”; -- O exemplo acima, **alteramos a view** para que ela **retorne também o e-mail.** 2) DROP VIEW -- A ideia aqui é simplesmente **excluir uma view**. -- Lembrando que a **manipulação de views** faz parte da **DDL**, sendo considerada uma **sublinguagem chamada VDL** (View Definition Language). - Sintaxe do comando **DROP VIEW** [NOME_VIEW]; - Exemplo do comando **DROP VIEW** [BRASILIENSES];
41
# Comandos avançados Triggers
*Triggers* -- Em muitos casos, é conveniente **especificar um tipo de ação a ser tomada** quando **certos eventos ocorrem** e quando **certas condições são satisfeitas**. -- Por exemplo, pode ser útil **especificar uma condição** que, **se violada**, faz que algum **usuário seja informado dela**. Um gerente pode querer ser informado se as despesas de viagem de um funcionário excederem certo limite, recebendo uma mensagem sempre que isso acontecer. -- A ação que o SGBD deve tomar nesse caso é **enviar uma mensagem apropriada a esse usuário**. A condição, portanto, é usada para **monitorar o banco de dados**. -- *Outras ações* podem ser especificadas, como **executar um procedimento armazenado** (Stored Procedure) **específico** ou **disparar outras atualizações**. -- A instrução **CREATE TRIGGER** é utilizada para **implementar essas ações em SQL**. - Sintaxe do comando **CREATE TRIGGER** [NOME_TRIGGER] -- Em seguida, temos que decidir o momento em que a trigger será executada, podendo ser antes, depois ou em vez do evento que as acionou: 1) BEFORE: Executa a trigger **antes de executar o evento que a causou** – pode ser usada em aplicações como a *verificação de violações de restrição*. 2) AFTER: Executa a trigger **depois de executar o evento** – pode ser usada em aplicações como a *manutenção de dados derivados* e *monitoramento de eventos e condições específicas*. 3) INSTEAD OF: Executa a trigger **em vez de executar o evento**, e pode ser utilizada em aplicações como *executar atualizações correspondentes em relações da base* **em resposta a um evento que é uma atualização de uma visão**. - Sintaxe do comando **CREATE TRIGGER** [NOME_TRIGGER] (**BEFORE**|**AFTER**|**INSTEAD OF**) -- Em seguida, precisamos **especificar o evento que acionará a trigger**, podendo ser uma **inserção**, uma **atualização** ou uma **exclusão**: - Sintaxe do comando **CREATE TRIGGER** [NOME_TRIGGER] (**BEFORE**|**AFTER**|**INSTEAD OF**) (**INSERT**|**UPDATE**|**DELETE**) -- Em seguida, precisamos **especificar a tabela na qual a trigger será criada**. Logo, **inserimos o nome da tabela** desejada: - Sintaxe do comando **CREATE TRIGGER** [NOME_TRIGGER] (**BEFORE**|**AFTER**|**INSTEAD OF**) (**INSERT**|**UPDATE**|**DELETE**) **ON** [NOME_TABELA] -- Antes de prosseguir com a sintaxe, precisamos entender que existem **dois tipos de triggers**: *triggers de linha* (row-level triggers) e *triggers de ação* (statement-level triggers). a) As ***triggers de ação*** são **acionadas uma vez para cada evento**, **independentemente do número de linhas afetadas**. - Elas podem ser usadas para **implementar regras de negócios complexas** que n**ão podem ser implementadas com restrições de integridade** ou outras técnicas. b) As ***triggers de linha*** – bem mais comuns – são **acionadas para cada linha afetada pelo evento**, ou seja, se uma **instrução de atualização afetar várias linhas** em uma tabela, a **trigger de linha será acionada uma vez para cada uma das linhas afetadas**. - As triggers de linha podem ser usadas para **implementar regras de validação de dados** ou para **auditar as alterações em cada linha individual**. Para *criar uma trigger de linha*, utilizamos a seguinte **sintaxe**: - Sintaxe do comando **CREATE TRIGGER** [NOME_TRIGGER] (**BEFORE**|**AFTER**|**INSTEAD OF**) (**INSERT**|**UPDATE**|**DELETE**) **ON** [NOME_TABELA] **FOR EACH ROW** -- Em seguida, podemos opcionalmente **especificar uma condição**, que determina se a **ação da regra deve ser executada**: *depois que o evento de disparo tiver ocorrido*, uma** condição opcional pode ser avaliada**. - *Se nenhuma condição for especificada*, a **ação será executada uma vez que o evento ocorra**. - *Se uma condição for especificada*, ela **primeiro é avaliada** e, **somente se for avaliada como verdadeira**, a **ação da regra será executada**. A condição é especificada na **cláusula WHEN** do trigger: - Sintaxe do comando **CREATE TRIGGER** [NOME_TRIGGER] (**BEFORE**|**AFTER**|**INSTEAD OF**) (**INSERT**|**UPDATE**|**DELETE**) **ON** [NOME_TABELA] **FOR EACH ROW** **WHEN** CONDIÇÃO -- Também podemos opcionalmente **declarar variáveis locais** que seriam **utilizadas no código do corpo da trigger**: - Sintaxe do comando **CREATE TRIGGER** [NOME_TRIGGER] (**BEFORE**|**AFTER**|**INSTEAD OF**) (**INSERT**|**UPDATE**|**DELETE**) **ON** [NOME_TABELA] **FOR EACH ROW** **WHEN** CONDIÇÃO **DECLARE** VARIÁVEIS -- Por fim, podemos **inserir o bloco de código que será executado pela trigger**. Para tal, precisamos envolver o bloco entre um **BEGIN** e um **END**: - Sintaxe do comando **CREATE TRIGGER** [NOME_TRIGGER] **(BEFORE|AFTER|INSTEAD OF)** **(INSERT|UPDATE|DELETE)** **ON** [NOME_TABELA] **FOR EACH ROW** **WHEN** CONDIÇÃO **DECLARE** VARIÁVEIS **BEGIN** *-- CÓDIGO* **END**; - Exemplo do comando **CREATE TRIGGER** ATUALIZA_SALDO AFTER **INSERT ON** MOVIMENTOS **FOR EACH** ROW **BEGIN** **UPDATE** CONTAS **SET** SALDO_TOTAL = SALDO_TOTAL + NEW.VALOR **WHERE** CONTA_ID = NEW.CONTA_id; **END**; -- Em resumo, podemos afirmar que as ***triggers*** são basicamente **rotinas**, ou **procedimentos armazenados**, que são **executadas automaticamente em resposta a um determinado evento ocorrido no banco de dados**. -- *Triggers são usadas* para **monitorar**, **auditar** e **controlar** as **operações em tabelas do banco de dados**, bem como para **implementar regras de negócios complexas**. -- Podem ser **definidas para uma tabela** ou **visão** do banco de dados, e são **ativadas automaticamente em resposta a um evento específico**, como *operações de inserção*, *atualização* ou *exclusão*. - **Quando o evento ocorre na tabela**, a trigger é **acionada**, e o **código definido na trigger é executado**. - Triggers podem ser usadas para **atualizar tabelas**, **inserir/atualizar valores em outras colunas** da mesma tabela, **gerar logs de auditoria**, **restringir acesso a dados** ou **validar valores inseridos/atualizados**. -- No entanto, é importante ***ter cuidado ao definir triggers***, pois elas **podem afetar o desempenho do banco de dados** e podem **resultar em loops infinitos** se não forem implementadas corretamente.
42
Stored Procedures
*Stored Procedures* -- Uma ***Stored Procedure*** é um **código pré-preparado** que você pode **salvar**, para que ele possa ser **reutilizado em outras ocasiões repetidamente**. -- Logo, se você possui uma **consulta SQL que utiliza frequentemente**, é possível **salvá-la como uma espécie de procedimento armazenado** e, em seguida, apenas **chamá-lo para que a consulta seja executada**. -- Lembrando que você também **pode passar parâmetros de entrada para um procedimento armazenado**. - Sintaxe do comando **CREATE PROCEDURE** NOME_PROCEDIMENTO @NOME_PARAMETRO1 TIPO, @NOME_PARAMETRO2 TIPO, ... **AS** DECLARACOES_SQL **GO**; - Exemplo do comando **CREATE PROCEDURE** RETORNA_CIDADE_ALUNO **@CIDADE** VARCHAR(20) **AS** **SELECT** NOME, E-MAIL, CIDADE **FROM** ALUNO_ESTRATEGIA **WHERE** CIDADE = @CIDADE **GO**; -- Chamada do comando **EXEC** RETORNA_CIDADE_ALUNO CIDADE = “BRASÍLIA”; -- Note que o resultado foi **idêntico ao da view**. => *Uma view é a mesma coisa que uma stored procedure*? - Não, **uma visão representa uma Tabela Virtual**! Você pode **juntar várias tabelas em uma visão** e utilizá-la para **apresentar os dados como se todos eles viessem de uma única tabela**. - Uma ***Stored Procedure*** utiliza **parâmetros para executar uma atividade** – seja *atualizando e inserindo dados* ou *retornando valores únicos* ou *conjuntos de dados*.
43
Ordens de Procedência
*Ordens de Procedência* -- Vamos analisar a seguinte query: **SELECT** ... **FROM** ... **WHERE** COLUNA **IN** (1,2,3) **OR** COLUNA **IN** (4,5) **AND** ... -- Os operadores **seguem uma ordem de precedência**: 1) Operadores Aritméticos (Ex: +, -, *, /) 2) Operadores de Concatenação (Ex: II) 3) Operadores de Comparação (Ex: =, >, <, >=, <=) 4) IS [NOT] NULL, LIKE, [NOT] IN 5) [NOT] BETWEEN 6) NOT EQUAL TO 7) NOT 8) AND 9) OR