Você está na página 1de 65

MYSQL

Por Uianes

Obra livre
MYSQL
Por Uianes

1 O que é SQL?


SQL é a abreviação de Structured Query Language, ou, em
Português, Linguagem de Consulta Estruturada. É uma linguagem que
permite acessar e manipular uma base de dados. Embora o SQL seja
padronizado pela ANSI/ISO, existem diferentes versões. Em nosso
curso, utilizamos o MySQL. No entanto, programadores ao redor do
mundo podem optar por utilizar MariaDB, PostgreSQL, Oracle, entre
tantas outras opções.

Diferentes linguagens SQL devem permitir quatro instruções


básicas: SELECT, INSERT, UPDATE e DELETE. Apesar de falarmos em
diferentes linguagens, na realidade dos DBAs (Administradores de
Banco de Dados), as diferenças ocorrem somente quando decidem
utilizar um SGBD diferente.

SGBD é o Sistema Gerenciador de Banco de Dados. Por exemplo, o


que chamamos de MySQL é, na realidade, um SGBD que utiliza uma
linguagem baseada em SQL.

Vantagens de utilizar o MySQL:

Tecnologia open-source;
Gratuito;
Rápido;
Relacional.

O que vamos estudar?

As instruções em SQL podem ser classificadas em subconjuntos,


sendo eles:

DQL, DML, DDL, DCL e DTL (ou TCL).

DQL → Data Query Language.

DML → Data Manipulation Language.

DDL → Data Definition Language.


DCL → Data Control Language.

DTL → Data Transaction Language.




DDL: Linguagem de Definição de Dados. É o conjunto de instruções


que permite definir a base de dados. Exemplos: CREATE, DROP,
ALTER, TRUNCATE, COMMENT, RENAME.

DQL: Linguagem de Consulta de Dados. É o conjunto de instruções


que permite consultar os dados armazenados. Exemplo: SELECT.

DML: Linguagem de Manipulação de Dados. É o conjunto de


instruções que permite manipular os dados armazenados. Exemplos:
INSERT, UPDATE, DELETE.

DCL: Linguagem de Controle de Dados. É o conjunto de instruções


que permite gerenciar a segurança do banco de dados. Exemplos:
GRANT, REVOKE.

DTL: Linguagem de Transação Dados. É o conjunto de instruções que


permite gerenciar a transação de dados. Exemplos: BEGIN/SET
TRANSACTION, COMMIT, ROLLBACK, SAVEPOINT.

Em aula, considerando a duração do semestre, geralmente estudamos


os subconjuntos DDL, DQL e DML.

2 Instalação das ferramentas necessárias


Considerando que o foco deste ano é o desenvolvimento de
tecnologias web, iremos utilizar um servidor de Banco de Dados
que permita a integração com o servidor Apache utilizado na
disciplina de Programação II.

Portanto, existem várias opções: Apache XAMPP, EasyPHP e MySQL


Workbench. Atualmente, o software XAMPP suporta a versão 8.0.21
do MySQL (versão atual desde 13 de julho de 2020) e vamos
utilizá-lo para facilitar o desenvolvimento integrado com PHP.

Link para download do XAMPP:


https://www.apachefriends.org/download.html

3 Iniciando o servidor de Banco de Dados


Abra o menu iniciar.

Pesquise por "XAMPP".




Clique em START em "Apache" e "MySQL".




Após clique em "Admin" para ser redirecionado ao phpMyADMIN.




4 Criando a primeira base de dados


Apesar de utilizarmos, no Brasil, o nome "Banco de Dados", é mais
adequado o termo "Base de Dados". Para fins didáticos, vamos
considerar o conceito de "Banco de Dados" como um conjunto de
várias bases de dados, e a "Base de Dados" como o conjunto de
tabelas relacionadas entre si.
Portanto, iniciamos a construção do nosso banco de dados pela
criação da base de dados.

Para criar uma base de dados, utilizamos o comando:

CREATE DATABASE nomeDaBaseDeDados;

Observações: Não podemos utilizar espaços para nomear uma base de


dados. Caso seja necessário separar as palavras no nome, utilize
o caractere "_", assim: nome_da_base_de_dados. Você pode utilizar
acentos e números no nome, mas evite o uso de caracteres
especiais.

Para visualizar todas as bases de dados criadas, utilizamos o


comando:

SHOW DATABASES;

Cuidado! Caso você tenha criado uma Base de Dados que precisa ser
excluída, você pode utilizar o comando:

DROP DATABASE nomeDaBaseDeDados;

Isso excluirá todas as tabelas e dados contidos naquela base de


dados.

Para selecionar uma base de dados e poder criar suas tabelas,


utilizamos o comando:

USE nomeDaBaseDeDados;

5 Criando a primeira tabela


Uma tabela em um "Banco de Dados" é composta por colunas e
linhas. Em termos de "Banco de Dados", chamamos as colunas de
ATRIBUTOS, enquanto as linhas podem ser chamadas de REGISTROS ou
TUPLAS, sendo o segundo nome o mais comum.

Na etapa anterior, durante a diagramação, utilizamos o modelo


relacional para representar a estrutura das tabelas, como
exemplificado na imagem abaixo:


Nesse exemplo, temos os atributos "cliente_id" e "cliente_nome".


As linhas são exemplos de tuplas, representando registros
específicos da tabela. Cada linha (tupla/registro) é um cliente
diferente cadastrado.


Para criar a estrutura da tabela do exemplo apresentado,


utilizamos as seguintes instruções na linguagem SQL:

CREATE TABLE Cliente(

cliente_id INT(4) NOT NULL,

cliente_nome VARCHAR(50) NOT NULL,

PRIMARY KEY(cliente_id)

);

6 Tipos de dados


Cada atributo deve possuir um tipo. Os tipos são textuais,
numéricos ou de data e hora.

Tipos mais comuns para textos:

CHAR(tamanho): Uma sequência de caracteres com tamanho fixo.


Pode receber de 0 até 255 caracteres.
VARCHAR(tamanho): Uma sequência de caracteres com tamanho
variável. Pode receber de 0 até 65535 caracteres.
TEXT(tamanho): Recebe um texto com até 65.535 bytes.
BLOB(tamanho): Recebe uma sequência chamada de BLOB (Binary
Large Objects). Pode receber uma sequência de até 65.535
bytes. Geralmente, os DBAs utilizam o formato BLOB para
salvar arquivos de imagem na base de dados.
LONGTEXT: Recebe um texto com até 4.294.967.295 caracteres.
LONGBLOB: Recebe uma sequência de até 4.294.967.295 bytes.
ENUM(valor1, valor2, valor3, ...): Um objeto que pode ter
apenas um valor escolhido na lista de valores possíveis. Cada
ENUM pode receber até 65.535 valores nesta lista.
SET(valor1, valor2, valor3, ...): Um objeto que pode ter um
ou mais valores escolhidos em uma lista de valores possíveis.
Cada SET pode receber até 64 valores.

Tipos mais comuns para números:

BOOL ou BOOLEAN: Receberá um valor, se o valor for 0, será


considerado como FALSO; se o valor for diferente de 0, será
considerado como VERDADEIRO.
SMALLINT(tamanho): Aceita números inteiros no intervalo de
-32.768 a 32.767. Sem o sinal, os valores aceitos vão de 0 a
65.535.
INT(tamanho) ou INTEGER(tamanho): Receberá um valor inteiro
no intervalo de -2.147.483.648 a 2.147.483.647. Sem o sinal,
os valores aceitos vão de 0 a 4.294.967.295.
BIGINT(tamanho): Receberá um valor inteiro no intervalo de
-9.223.372.036.854.775.808 a 9.223.372.036.854.775.807. Sem o
sinal, os valores aceitos vão de 0 a
18.446.744.073.709.551.615.
DECIMAL: Receberá um valor decimal entre 0 e 9.9.
FLOAT(tamanho): Receberá um valor decimal, sendo que o
tamanho determina até quantos números poderão existir após o
".".

Tipos mais comuns para data e hora:

DATE: Armazena uma data no formato YYYY-MM-DD, ou seja, Ano-


Mês-Dia. Aceita datas entre 1000-01-01 até 9999-12-31.
DATETIME: Combinação de data e hora no formato YYYY-MM-DD
hh:mm:ss. Se adicionar uma cláusula DEFAULT, o valor a ser
registrado é a data e hora do momento em que o SGBD inserir o
valor na base de dados.
TIME: Armazena uma hora no formato hh:mm:ss. Suporta valores
entre '-838:59:59' e '838:59:59'.
YEAR: Armazena um ano em formato de 4 dígitos. Os valores
aceitos estão entre 1901 e 2155. O valor 0000 também é
aceito.

7 Chaves Primária e Estrangeira


A chave primária, chamada de Primary Key, é utilizada para
identificar cada tupla (registro) da tabela. A chave primária
sempre será um valor único e não pode ser nula. Toda tabela deve
ter somente uma chave primária.

Para adicionar uma chave primária na criação de uma tabela,


usamos o seguinte comando:

PRIMARY KEY(nomeAtributo)

Exemplo:

CREATE TABLE Cliente(

cliente_id INT(4) NOT NULL,

cliente_nome VARCHAR(50) NOT NULL,

PRIMARY KEY(cliente_id)

);

Para adicionar uma chave primária em uma tabela já criada, usamos


o seguinte comando:

ALTER TABLE nomeTabela


ADD PRIMARY KEY(nomeAtributo);

Exemplo:

ALTER TABLE Cliente

ADD PRIMARY KEY(cliente_id);

Para remover uma chave primária, usamos o seguinte comando:

ALTER TABLE nomeTabela

DROP PRIMARY KEY;

Exemplo:

ALTER TABLE Cliente

DROP PRIMARY KEY;

A chave estrangeira, chamada de Foreign Key, é utilizada para


estabelecer os relacionamentos entre tabelas, e também impede que
um registro seja excluído caso existam dependências com outras
tabelas. Uma tabela pode receber uma ou mais chaves estrangeiras,
e cada chave estrangeira deve estar associada a uma chave
primária em outra tabela.

Para adicionar uma chave primária na criação de uma tabela,


usamos o seguinte comando:

FOREIGN KEY(nomeAtributo)

REFERENCES nomeOutraTabela(nomeAtributo)

Também é possível que você veja a seguinte sintaxe:

CONSTRAINT FK_NomeFK

FOREIGN KEY(nomeAtributo)

REFERENCES nomeOutraTabela(nomeAtributo)

Exemplo:

Considerando a seguinte modelagem →




CREATE TABLE Cliente(


cliente_id INT(4) NOT NULL,

cliente_nome VARCHAR(50) NOT NULL,

PRIMARY KEY(cliente_id)

);

CREATE TABLE Venda(

venda_id INT(4) NOT NULL,

data_venda DATETIME NOT NULL,

valor_venda FLOAT(2) NOT NULL,

cliente_id INT(4) NOT NULL,

PRIMARY KEY(venda_id),

FOREIGN KEY(cliente_id) REFERENCES Cliente(cliente_id)

);

Para adicionar uma chave estrangeira em uma tabela já criada,


usamos o seguinte comando:

ALTER TABLE nomeTabela

ADD FOREIGN KEY(nomeAtributo)

REFERENCES nomeOutraTabela(nomeAtributo);

Ou:

ALTER TABLE nomeTabela

ADD CONSTRAINT nomeFK

FOREIGN KEY(nomeAtributo)

REFERENCES nomeOutraTabela(nomeAtributo);

Exemplo:

ALTER TABLE Venda

ADD FOREIGN KEY(cliente_id)

REFERENCES Cliente(cliente_id);

Para remover uma chave estrangeira, usamos o seguinte comando:

ALTER TABLE nomeTabela

DROP FOREIGN KEY FK_NomeFK;


Atenção! Essa forma de exclusão somente funciona quando a
declaração de FK utiliza a clausula "CONSTRAINT", conforme
demonstrado anteriormente. Exemplo:

ALTER TABLE Venda

DROP FOREIGN KEY FK_NomeFK;

8 Auto incremento


O auto incremento é uma funcionalidade comum em bancos de dados
que permite que os valores de uma coluna numérica sejam gerados
automaticamente. Geralmente utilizamos essa função em chaves
primárias.

Para adicionar o auto incremento em um atributo:

nomeAtributo TipoNumérico(tamanho) NOT NULL AUTO_INCREMENT

Exemplo:

CREATE TABLE Cliente(

cliente_id INT(4) NOT NULL AUTO_INCREMENT,

cliente_nome VARCHAR(50) NOT NULL,

PRIMARY KEY(cliente_id)

);

Agora o valor da chave primária será definido automaticamente.


Partindo do número 1 e seguindo até o último valor disponível
para aquele campo.

Exemplo (Observe a coluna cliente_id):




Para alterar o valor de início do auto_increment, ou seja, para a


função iniciar com outro valor (diferente de 1), usamos o
seguinte comando:

ALTER TABLE nomeTabela

AUTO_INCREMENT=100;

Neste caso, o auto incremento iniciará com o valor 100.

Cuidado! Ao inserir um valor em uma tabela, nas colunas


(atributos) que possuem a propriedade "auto_increment", NÃO
devemos adicionar um valor manualmente, pois o SGBD fará isso
automaticamente. Esse assunto será melhor abordado nas anotações
sobre o comando INSERT INTO.

9 Declaração de Nulos


Cada atributo pode receber valores nulos, por padrão. Um atributo
nunca deixa de receber um valor; quando um determinado registro
fica "em branco", automaticamente ele será preenchido com o valor
"NULL". A restrição NOT NULL torna uma coluna como obrigatória,
pois ela deverá ser preenchida, não aceitando mais um valor nulo.
Basta adicionar a seguinte restrição ao atributo:

NOT NULL

Caso uma tabela já tenha sido criada, e você deseja adicionar a


restrição em uma coluna existente, basta executar o seguinte
código:

ALTER TABLE nomeTabela

MODIFY COLUMN nomeAtributo tipoAtributo NOT NULL;

10 Valores únicos


Existem momentos em que é necessário que um valor, de determinada
coluna, nunca seja repetido, como uma chave primária, um número
de documento ou um endereço de e-mail, entre outras
possibilidades. A instrução PRIMARY KEY faz isso automaticamente
com a coluna em que é adicionada. Nas demais colunas, é possível
utilizar uma restrição de valor único, chamada de UNIQUE. Para
adicionar essa restrição utilizamos a seguinte sintaxe:

CREATE TABLE nomeTabela(

id INT(4) NOT NULL,

atributo VARCHAR(100) NOT NULL,

PRIMARY KEY(id),

UNIQUE(atributo)

);

Para adicionar a restrição em vários atributos utilizamos a


seguinte sintaxe:
CREATE TABLE nomeTabela(

id INT(4) NOT NULL,

atributo1 VARCHAR(100) NOT NULL,

atributo2 VARCHAR(100) NOT NULL,

PRIMARY KEY(id),

CONSTRAINT uniqueNome UNIQUE(atributo1, atributo2)

);

E para adicionar uma restrição em uma tabela já existe:

ALTER TABLE nomeTabela

ADD UNIQUE(atributo1);

E para adicionar várias restrições em uma tabela já existe:

ALTER TABLE nomeTabela

ADD CONSTRAINT uniqueNome UNIQUE(atributo1, atributo2);

Para apagar a restrição de único é necessário que a restrição


seja declarada através de CONSTRAINT com nome próprio, mesmo que
seja somente para um atributo. Exemplo de criação:

ALTER TABLE nomeTabela

ADD CONSTRAINT uniqueNome UNIQUE(atributo1);

E para apagar:

ALTER TABLE nomeTabela

DROP INDEX uniqueNome;

11 Apagar uma tabela criada


Caso você tenha criado uma tabela e deseja apagá-la, basta
utilizar o seguinte comando:

DROP TABLE nomeTabela;

Cuidado! Esse comando apagará a tabela e também todos os dados


contidos nela.

Vale observar que você pode utilizar a seguinte estrutura para


visualizar todas as tabelas de uma determinada base de dados:

SHOW DATABASES;
USE nomeDataBase;

SHOW TABLES;

Isso mostrará todas as tabelas criadas em uma base de dados.

12 Inserir valores em uma tabela


INSERT INTO, traduzido como INSERIR DENTRO DE, é um dos comandos
básicos em SQL, utilizado para criar novos registros na tabela,
ou seja, gravar novos valores/tuplas/linhas.

Essa instrução pode ser definida de duas formas. A primeira forma


é informando todas as colunas e seus respectivos valores em
seguida.

INSERT INTO nomeTabela (coluna1, coluna2, coluna3, ...)

VALUES (valor1, valor2, valor3, ...);

Outra forma de realizar a mesma ação ocorre assim, mas somente se


você inserir valores em todas as colunas:

INSERT INTO nomeTabela

VALUES (valor1, valor2, valor3, ...);

Exemplo:

CREATE TABLE Cliente(

cliente_id INT(4) NOT NULL AUTO_INCREMENT,

cliente_nome VARCHAR(100) NOT NULL,

cliente_email VARCHAR(100) NOT NULL,

PRIMARY KEY(cliente_id),

UNIQUE(cliente_email)

);

INSERT INTO Cliente (cliente_nome, cliente_email)

VALUES ("Uianes", "uianes.biondo@iffarroupilha.edu.br");

Cuidado! Como a chave primária (cliente_id) recebeu a função


AUTO_INCREMENT repare que na lista de colunas de INSERT INTO não
adicionamos a PK. Mas você pode, desde que não insira um valor
duplicado (ou já registrado).
Caso você executasse o seguinte comando:

INSERT INTO Cliente (cliente_email)

VALUES ("uianes.biondo@iffarroupilha.edu.br");

Apareceria uma mensagem de erro, pois "cliente_nome" foi definido


como NOT NULL, e ao deixar uma coluna de fora da lista do INSERT
INTO, o valor padrão a ser gravado é NULL. Portanto, atributos
que receberam "NOT NULL" não podem ser deixados de fora.

Caso a tabela fosse a seguinte:

CREATE TABLE Cliente(

cliente_id INT(4) NOT NULL AUTO_INCREMENT,

cliente_nome VARCHAR(100),

cliente_email VARCHAR(100) NOT NULL,

PRIMARY KEY(id),

UNIQUE(cliente_email)

);

E o comando a ser executado posteriormente fosse:

INSERT INTO Cliente (cliente_email)

VALUES ("uianes.biondo@iffarroupilha.edu.br");

Neste caso, sim, tudo funcionaria. E os dados cadastrados seriam:

cliente_id→1
cliente_nome → NULL

cliente_email → uianes.biondo@iffarroupilha.edu.br

Outra observação!

Caso o comando acima fosse executado novamente:

INSERT INTO Cliente (cliente_email)

VALUES ("uianes.biondo@iffarroupilha.edu.br");

Um erro apareceria, informando que já existe esse valor


cadastrado na tabela. E o campo "cliente_email" é UNIQUE, ou
seja, não é possível cadastrar um valor duas ou mais vezes.

E como fazer para cadastrar vários usuários de uma só vez? Basta


utilizar a seguinte sintaxe:
INSERT INTO nomeTabela (atributo1, atributo2, ...)

VALUES (cadastro1Valor1, cadastro1Valor2, ...),

(cadastro2Valor1, cadastro2Valor2, ...),

(cadastro3Valor1, cadastro3Valor2, ...);

Separamos os diferentes cadastros através de ",". Porém, o último


cadastrado não pode receber ",", e sim, ";".

Sobre a forma de representar os valores, utilizamos o seguinte


padrão:

Valores textuais serão representados dentro de aspas. Exemplo:


"Nome".

Valores numéricos inteiros serão representados sem aspas.


Exemplo: 10.

Valores numéricos decimais serão representados sem aspas,


utilizando ".". Exemplo: 9.9

Valores de data e hora serão representados por aspas, em seu


respectivo padrão.

Exemplo de data: "2023-07-25".

Exemplo de hora: "01:22:30".

13 Apagar todos os valores inseridos em uma tabela


Caso você tenha criado uma tabela e deseja apagar somente os
valores inseridos nela, sem apagar a própria tabela, basta
utilizar o seguinte comando:

TRUNCATE nomeTabela;

Cuidado! Esse comando apagará TODOS os dados de uma tabela, mas


não sua estrutura, ou seja, a tabela ainda existe, mas vazia.

14 Alterar a estrutura de uma tabela já criada


Em vários momentos anteriormente, foi utilizado um determinado
tipo de comando para alterar a estrutura dos exemplos. A
estrutura que permite modificar uma tabela é o ALTER TABLE. Essa
operação permite realizar 3 funções: adicionar algo na estrutura
da tabela, remover algo na estrutura da tabela ou modificar algo
na estrutura da tabela. Essas 3 funções envolvem as colunas da
tabela e/ou as restrições dela.
ALTER TABLE

→ Para adicionar uma coluna em uma tabela existente:


ALTER TABLE nomeTabela

ADD nomeColuna tipo(tamanho);

Pode ser também: ADD COLUMN nomeColuna tipo(tamanho);

Exemplo:

ALTER TABLE Cliente

ADD CEP_Cliente VARCHAR(9) NOT NULL;

→ Para remover uma coluna em uma tabela existente:


ALTER TABLE nomeTabela

DROP COLUMN nomeColuna;

Exemplo:

ALTER TABLE Cliente

DROP COLUMN CEP_Cliente;

→ Para modificar uma coluna em uma tabela existente:


ALTER TABLE nomeTabela

MODIFY COLUMN nomeColuna tipo(tamanho);

Exemplo:

ALTER TABLE Cliente

ADD cliente_email VARCHAR(200) NOT NULL;

Os demais exemplos de alterações com relação a restrições


(CONSTRAINT) foram demonstrados anteriormente.

15 Restrições (CONSTRAINT)


As restrições definem certos limites para alguns
campos/colunas/atributos. Podemos utilizá-las junto com a
instrução CREATE TABLE ou com ALTER TABLE. Elas estabelecem
regras específicas para os dados da tabela. A sintaxe de uma
restrição é:

CREATE TABLE nomeTabela(


nomeAtributo Tipo(tamanho) CONSTRAINT,

nomeAtributo Tipo(tamanho) CONSTRAINT

);

→ São exemplos de Constraint:


NOT NULL

UNIQUE

PRIMARY KEY

FOREIGN KEY

CHECK

DEFAULT

CREATE INDEX

16 Verificações (CHECK)


Anteriormente, já foi demonstrada a utilização das restrições NOT
NULL, UNIQUE, PRIMARY KEY e FOREIGN KEY. A restrição CHECK
realiza uma verificação para determinados valores, ou seja, o
CHECK limita os valores que determinado atributo pode receber.
Sua sintaxe é a seguinte:

CHECK (condição)

→ Os tipos de operações que podemos realizar em "condição" são:


= Igual a

> Maior que

< Menor que

>= Maior ou igual a

<= Menor ou igual a

<> Diferente de

Ou seja, podemos determinar que determinado atributo somente será


gravado no banco de dados se o valor for maior que, maior ou
igual a, menor que, menor ou igual a, ou diferente de determinado
número, ou data/hora. Podemos utilizar os operadores de igualdade
e diferença para checar textos.

Exemplos de utilização na hora de criar uma tabela:


CREATE TABLE Aluno(

aluno_id INT(4) NOT NULL AUTO_INCREMENT,

idade INT(3) NOT NULL CHECK(idade > 0),

nota FLOAT NOT NULL CHECK(nota <= 10),

data_nascimento DATE NOT NULL CHECK(data_nascimento <= '2023-07-


25'),

nome VARCHAR(100) NOT NULL CHECK(nome <> 'Uianes'),

PRIMARY KEY(aluno_id)

);

E para adicionar uma verificação em uma tabela já existe:

ALTER TABLE nomeTabela

ADD CONSTRAINT nomeCheck CHECK(atributo operador valor);

Exemplo:

ALTER TABLE Aluno

ADD CONSTRAINT testeIdade CHECK(idade >= 1);

E para adicionar várias restrições em uma tabela já existe:

ALTER TABLE nomeTabela

ADD CONSTRAINT checkNome CHECK(atributo1 operador valor1 AND


atributo2 operador valor2);

Utilizamos "AND" para unir diferentes condições. Há uma parte


específica mais adiante para falar sobre AND, OR e NOT.

Para apagar uma limitação é necessário que a restrição seja


declarada através de CONSTRAINT com nome próprio, mesmo que seja
somente para um atributo. Exemplo de criação:

ALTER TABLE nomeTabela

ADD CONSTRAINT checkNome CHECK(atributo1 operador valor1);

E para apagar:

ALTER TABLE nomeTabela

DROP CONSTRAINT checkNome;

17 Valor Padrão (DEFAULT)



Utilizamos a restrição DEFAULT para definir um valor padrão para
um atributo. Quando o usuário não gravar um valor para
determinada coluna, o SGBD usará o valor Default. A sintaxe que
utilizamos é a seguinte:

nomeAtributo Tipo(tamanho) DEFAULT valor

→ Observe o exemplo para adicionar um valor padrão na criação de


uma tabela:

CREATE TABLE Aluno(

aluno_id INT(4) NOT NULL AUTO_INCREMENT,

nome VARCHAR(100) NOT NULL,

cidade VARCHAR(100) NOT NULL DEFAULT 'Santo Augusto',

PRIMARY KEY(aluno_id)

);

Exemplo para registrar a data atual como padrão:

CREATE TABLE Aluno(

aluno_id INT(4) NOT NULL AUTO_INCREMENT,

nome VARCHAR(100) NOT NULL,

cidade VARCHAR(100) DEFAULT 'Santo Augusto',

data_da_matricula DATE DEFAULT CURRENT_DATE(),

PRIMARY KEY(aluno_id)

);

Para adicionar o valor padrão em uma tabela já existente:

ALTER TABLE Cliente

ALTER cidade SET DEFAULT 'Três Passos';

Para apagar um DEFAULT em uma tabela já existente:

ALTER TABLE Cliente

ALTER cidade DROP DEFAULT;

18 Atualizar valores gravados (UPDATE)


UPDATE é a instrução utilizada para atualizar ou modificar um
valor já registrado. Por exemplo, se você cadastrou um nome e
percebeu que ele foi digitado errado, é possível resolver o
problema utilizando o comando UPDATE. Sintaxe:

UPDATE nomeTabela

SET coluna1 = valor1, coluna2 = valor2, ...

WHERE condição;

CUIDADO! O uso do WHERE é fortemente recomendado. Caso você


execute o comando sem WHERE, todos os registros da sua tabela
serão modificados.

Considerando uma tabela com alunos cadastrados, com a coluna


id_aluno e nome_aluno, observe:

→ Tabela "Alunos" antes do comando:




→ Para alterar o nome do aluno com ID 01:


UPDATE Alunos

SET nome_aluno = "Uianes"

WHERE id_aluno = 1;

→ Tabela "Alunos" após o comando:




→ Para alterar dois os registros:


Antes:


Comando:
UPDATE Alunos

SET nome_aluno = "Uianes", cidade_aluno = "Crissiumal"

WHERE id_aluno = 1;

Depois:


→ Se você executar o comando sem WHERE:


UPDATE Alunos

SET nome_aluno = "Uianes", cidade_aluno = "Crissiumal"

Depois:


→ Na condição, do WHERE, podemos adicionar outras colunas da


tabela, em vez de somente a PK (id), imagine, por exemplo, que
você deseja trocar a palavra "Crissiumal" por "Santo Augusto" em
todos os registros da tela, o comando ficaria assim:

UPDATE Alunos

SET cidade_aluno = "Santo Augusto"

WHERE cidade_aluno = "Crissiumal";

Resultado:


19 Deletar um valor registrado (DELETE)

DELETE é a instrução utilizada para eliminar, ou apagar, um valor


ou mais valores já registrados. Sintaxe:

DELETE FROM nomeTabela

WHERE condição;

CUIDADO! O uso do WHERE é fortemente recomendado. Caso você


execute o comando sem WHERE, todos os registros da sua tabela
serão apagados (o que equivale ao comando TRUNCATE, visto
anteriormente).

Considerando uma tabela com alunos cadastrados, observe:

→ Tabela "Alunos" antes do comando:




→ Para apagar aluno com ID 01:


DELETE FROM Alunos

WHERE id_aluno = 1;

→ Tabela "Alunos" após o comando:




→ Se você executar o comando sem WHERE:


DELETE FROM Alunos

Depois:


20 Consultar valores de uma tabela (SELECT)


A instrução SELECT é usada para selecionar dados de um banco de
dados. O SGBD vai criar uma tabela de resultados. Sintaxe:

SELECT coluna1, coluna2, ...


FROM nomeTabela;

Exemplo:


SELECT nome_aluno

FROM Alunos;

Resultado:


SELECT nome_aluno, cidade_aluno

FROM Alunos;

Resultado:


→ Para visualizar todas as colunas de uma tabela, utilizamos o


seguinte comando:

SELECT *

FROM nomeTabela;

Exemplo:

SELECT *

FROM Alunos;

Resultado:

Perceba que na lista de cidades dos alunos, há 3 pessoas da mesma
cidade. Caso você queira visualizar uma lista de valores não
repetidos, podemos utilizar o comando SELECT DISTINCT.

SELECT DISTINCT cidade_aluno

FROM Alunos;

Resultado:


E, se em vez de visualizar o nome das cidades, você quiser


somente saber quantas cidades diferentes existem, pode-se
utilizar a função COUNT.

SELECT COUNT(DISTINCT cidade_aluno)

FROM Alunos;

Resultado:


21 Operadores em SQL (MySQL Operators)


Podemos utilizar 5 tipos de operadores em SQL: Aritméticos, Bit-
a-Bit (Bitwise), Comparativos, Compostos e Lógicos.

Aritméticos:

+ Adição

- Subtração

* Multiplicação

/ Divisão

% Resto (Módulo)

MOD Resto (Módulo)

Bit-a-Bit (Bitwise):

& Bitwise AND

| Bitwise OR
^ Bitwise exclusive OR

Comparativos:

= Igualdade

> Maior que

< Menor que

>= Maior ou igual a

<= Menor ou igual a

<> Diferença

!= Diferença

Compostos (Dependo da versão do MySQL esses operadores não


funcionam):

+= Adiciona igualmente

-= Subtrai igualmente

*= Multiplica igualmente

/= Divide igualmente

%= Módulo igualmente

&= Bitwise AND igualmente

^-= Bitwise XOR igualmente

|*= Bitwise OR igualmente

Lógicos:

ALL →Retorna "TRUE" se todos os valores da subconsulta atendem


uma determinada condição;

AND → Retorna "TRUE" se todos as condições forem "TRUE";


ANY → Retorna "TRUE" se um valor da subconsulta atender uma
determinada condição;

BETWEEN →
Retorna "TRUE" se um valor da subconsulta estiver em
um determinado intervalo;

EXISTS → Retorna "TRUE" se um valor da subconsulta existir;

IN → Retorna "TRUE" se um valor da subconsulta estiver em dentro


de uma determinada lista;
LIKE → Retorna "TRUE" se a operação encontrar um padrão
definido;

NOT → Retorna "TRUE" ou exibe um registro quando a condição não


for verdadeira.

OR → Retorna "TRUE" se ao menos uma condição for verdadeira.


SOME → Retorna "TRUE" se ao menos uma condição da subconsulta
for verdadeira.

22 WHERE


A cláusula WHERE é usada para definir condições, utilizamos WHERE
junto com os comandos SELECT, UPDATE, DELETE, entre outros.
Sintaxe:

SELECT coluna1, coluna2, ...

FROM nomeTabela

WHERE condição;

Os operadores que podemos usar com o WHERE, são:

=, >, <, >=, <=, <>, BETWEEN, LIKE, IN.

Exemplo:


Caso você queira mostrar o nome da pessoa que vive em Três


Passos, basta utilizar o seguinte comando:

SELECT nome_aluno

FROM Alunos

WHERE cidade_aluno = "Três Passos";

23 AND, OR e NOT


AND, OR e NOT podem ser utilizados em vários contextos,
principalmente com WHERE.
Sintaxe AND:

SELECT coluna1, coluna2, ...

FROM nomeTabela

WHERE condição AND condição AND condição ...;

Sintaxe OR:

SELECT coluna1, coluna2, ...

FROM nomeTabela

WHERE condição OR condição OR condição ...;

Sintaxe NOT:

SELECT coluna1, coluna2, ...

FROM nomeTabela

WHERE NOT condição;

Observação: É possível misturar AND, OR e NOT. Basta separar as


expressões por parênteses.

Exemplo:


→ Para selecionar o nome das pessoas de "Santo Augusto", do


bairro "São Francisco":

SELECT nome_aluno

FROM Alunos

WHERE cidade_aluno = "Santo Augusto"

AND bairro_aluno = "São Francisco";

→ Para selecionar o nome das pessoas de "Santo Augusto" ou de


"Três Passos":

SELECT nome_aluno

FROM Alunos

WHERE cidade_aluno = "Santo Augusto"


OR cidade_aluno = "Três Passos";

→ Para selecionar o nome das pessoas que não são de "Santo


Augusto":

SELECT nome_aluno

FROM Alunos

id d l

24 ORDER BY


A instrução ORDER BY é usada para ordenar os resultados de uma
consulta SQL. Por padrão, o ORDER BY retornará os resultados em
ordem crescente (ascendente). No entanto, é possível inverter a
ordem e obter os resultados em ordem descendente. A sintaxe é a
seguinte:

SELECT coluna1, coluna2, ...

FROM nomeTabela

ORDER BY coluna1 ASC | DESC;

Exemplo:


SELECT nome_aluno, cidade_aluno

FROM Alunos

ORDER BY nome_aluno ASC;

Resultado:


Perceba que os nomes agora estão organizados em ordem alfabética


ascendente. Caso o comando recebesse DESC, a ordem seria
invertida.

SELECT nome_aluno, cidade_aluno

FROM Alunos
ORDER BY nome_aluno DESC;

→ Ordenação múltipla: É possível ordenar valores através de duas


ou mais colunas. Por exemplo, se existem 3 pessoas de "Santo
Augusto", caso você deseje ordenar os alunos pela cidade, é
possível fazer uma nova ordenação para que as pessoas da mesma
cidade apareçam em ordem ascendente ou descendente.


SELECT nome_aluno, cidade_aluno

FROM Alunos

ORDER BY cidade_aluno, nome_aluno ASC;

Resultado:


Observação: Caso você utilize ORDER BY junto com WHERE, a


cláusula WHERE deve aparecer primeiro.

Sintaxe:

SELECT coluna1, coluna2, ...

FROM nomeTabela

WHERE condição

ORDER BY coluna1 ASC | DESC;


25 NULL VALUES


Como dito anteriormente, nunca um registro do banco de dados
permanecerá vazio (em branco). Quando for possível, o SGBD fará a
inserção do valor NULL automaticamente. Também é possível
realizar essa inserção manualmente através do comando INSERT
INTO.

INSERT INTO Alunos(nome_aluno, cidade_aluno)

VALUES (NULL, NULL);

Perceba que "NULL" e NULL são coisas diferentes. "NULL" é um


texto com a palavra "NULL". E NULL é um valor nulo. Portanto,
para inserir um valor nulo, usamos NULL sem aspas. Resultado:


Após esse contexto, podemos filtrar valores nulos e não nulos em


um SELECT.

IS NULL

Retorna valores nulos. E:

IS NOT NULL

Retorna valores não nulos.

Exemplo:

SELECT * FROM Alunos

WHERE cidade_aluno IS NULL;

Retornará todas as informações sobre o aluno que tiver a cidade


como Null. Outro exemplo:

SELECT * FROM Alunos

WHERE cidade_aluno IS NOT NULL;


26 LIMIT

A instrução LIMIT é usada para limitar os resultados. Por
exemplo, quando você deseja ter um número X de resultados.
Sintaxe:

SELECT coluna1, coluna2, ...

FROM nomeTabela

LIMIT número;

Exemplo:


SELECT nome_aluno, cidade_aluno

FROM Alunos

LIMIT 2;

Somente dois alunos serão mostrados. Caso você utilize um WHERE


nesse comando, o WHERE deve vir antes do LIMIT.

SELECT nome_aluno, cidade_aluno

FROM Alunos

WHERE cidade_aluno = "Santo Augusto"

LIMIT 2;

27 MIN e MAX


As funções MIN e MAX servem para retornar, respectivamente, o
menor e o maior valor de uma coluna. Considere a seguinte tabela
de exemplo:


→ Para verificar o menor preço da tabela:


SELECT MIN(preço_produto)

FROM Produto;

→ Para verificar o maior preço da tabela:


SELECT MAX(preço_produto)

FROM Produto;

28 COUNT, AVG e SUM


As funções matemáticas COUNT, AVG e SUM podem ser utilizadas em
algumas situações. COUNT realiza uma contagem de determinada
condição. AVG retorna a média de uma coluna e SUM retorna a soma
dos valores. Tanto COUNT, AVG e SUM podem ser aplicados junto com
a cláusula WHERE, contanto que WHERE seja colocado na última
linha.


→ Para verificar a contagem de registros:


SELECT COUNT(preço_produto)

FROM Produto;

Isso retornará 4 como resposta, pois existem 4 produtos


registrados.

→ Para verificar a contagem com uma condição específica:


SELECT COUNT(preço_produto)

FROM Produto

WHERE preço_produto < 10.00;

Isso retornará 3 como resposta, pois existem 3 produtos


registrados com o preço abaixo de 10,00.

→ Para verificar a média de preço:


SELECT AVG(preço_produto)

FROM Produto;

Isso retornará 6.875 como resposta.


→ Para verificar a soma dos preços da tabela:
SELECT SUM(preço_produto)

FROM Produto;

Isso retornará 27.5 como resposta.

Em nenhum dos casos os valores NULL são considerados. Ou seja,


essas funções ignoram os valores NULL.

Mas é possível utilizar COUNT para contar valores Nulos. Assim:

SELECT COUNT(*)

FROM Produto

WHERE preço_produto IS NULL;

29 LIKE e Wildcards


O operador LIKE é utilizado em conjunto com a cláusula Wildcards.
Ambas instruções são utilizadas junto com o WHERE.

Quando utilizamos a seguinte sintaxe: WHERE cidade_aluno = "Santo


Augusto", estamos definindo que somente os valores iguais a
"Santo Augusto" serão retornados. E assim surge uma questão: E se
você quiser somente as cidades que tenham a letra "s" no nome?

Para fazer essa busca específica, podemos utilizar o operador


LIKE e um Wildcard.

Wildcards são representados por dois caracteres especiais: "%" e


"_".

O símbolo "%" representa 0, 1 ou muitos caracteres textuais


ou numéricos.
O símbolo "_" representa exatamente 1 caractere, podendo ser
qualquer caractere textual ou numérico.

Esses wildcards são usados em conjunto com o operador LIKE para


criar padrões de busca mais abrangentes e flexíveis em consultas
SQL.

Sintaxe:

SELECT coluna1, coluna2, ...

FROM nomeTabela

WHERE coluna LIKE padrão;

Para selecionar somente cidades com "s" no nome, por exemplo:


SELECT cidade_aluno

FROM Alunos

WHERE cidade_aluno LIKE '%s%';

Tipos de padrões:

→ WHERE cidade_aluno LIKE 's%': Vai mostrar qualquer valor que


comece com "s".

→ WHERE cidade_aluno LIKE '%s': Vai mostrar qualquer valor que


termine com "s".

→ WHERE cidade_aluno LIKE '%s%': Vai mostrar qualquer valor que


tenha "s" em qualquer lugar.

→ WHERE cidade_aluno LIKE '_s%': Vai mostrar qualquer valor que


tenha a letra "s" como segunda letra da palavra ou frase.

→ WHERE cidade_aluno LIKE 's_%': Vai mostrar qualquer valor que


comece com "s" e que tenha pelo menos 2 caracteres de
comprimento.

→ WHERE cidade_aluno LIKE 's__%': Vai mostrar qualquer valor que


comece com "s" e que tenha pelo menos 3 caracteres de
comprimento.

→ WHERE cidade_aluno LIKE 's_n_o%': Vai mostrar qualquer valor


que comece com "s", tenha um caractere qualquer, seguido de "n",
após um caractere qualquer e que termine com "o".

→ WHERE cidade_aluno LIKE 's%o': Vai mostrar qualquer valor que


comece com "s" e termine com "o".

É possível combinar o operador LIKE com NOT.

Para demonstrar todos os valores que NÃO tenham um "s":

SELECT cidade_aluno

FROM Alunos

WHERE cidade_aluno NOT LIKE '%s%';

30 IN

O operador IN permite retornar valores de uma lista em um comando
WHERE. Sintaxe:

SELECT coluna1, coluna2, ...

FROM nomeTabela

WHERE coluna IN (valor1, valor2, ...);

Por exemplo, caso você queira listar somente o nome de pessoas de


"Três Passos" e "Tenente Portela":


SELECT nome_aluno

FROM Alunos

WHERE cidade_aluno IN ('Três Passos', 'Tenente Portela');

É possível utilizar NOT junto com IN, ou seja, os valores a serem


retornados não deverão estar contidos na lista.

SELECT nome_aluno

FROM Alunos

WHERE cidade_aluno NOT IN ('Três Passos', 'Tenente Portela');

Neste caso o resultado retornado será qualquer cidade, menos Três


Passos e Tenente Portela.

Outra possibilidade é utilizar o IN para criar uma tabela com


dados de outra tabela. Observe as tabelas "Alunos" e "Cidades":



Caso você queira mostrar o nome dos alunos, mas somente aqueles
cuja cidade apareça na tabela "Cidades", podemos fazer isso
através de um IN.

SELECT nome_aluno

FROM Alunos

WHERE cidade_aluno IN (SELECT nome_cidade FROM Cidades);

31 BETWEEN


O operador BETWEEN permite retornar valores de um intervalo
(numérico, textual ou data) em um comando WHERE. Sintaxe:

SELECT coluna1, coluna2, ...

FROM nomeTabela

WHERE coluna BETWEEN valor1 AND valor2;

Por exemplo, caso você queira listar somente os nomes dos


produtos com o preço entre 10 e 20:


SELECT nome_produto

FROM Produto

WHERE preço_produto BETWEEN 10 AND 20;

É possível utilizar NOT junto com BETWEEN, ou seja, os valores a


serem retornados não deverão estar contidos no intervalo.

SELECT nome_produto

FROM Produto

WHERE preço_produto NOT BETWEEN 10 AND 20;

Neste caso o resultado retornado será qualquer valor, menos os


números que estiverem entre 10 e 20.

Outra possibilidade é utilizar o IN conjuntamente com o BETWEEN.

SELECT *

FROM Produto
WHERE preço_produto BETWEEN 1 AND 10 AND id_produito IN (1, 2,
3);

Perceba que neste caso serão retornados somente as informações


dos Produtos com preço entre 1 e 10, e que tenham ID entre 1 e 3.

Observação: Também é possível utilizar intervalos textuais e de


data. No caso de textos, o resultado ficará entre a primeira e a
segunda palavra.

Exemplo com data:

SELECT coluna1, coluna2, ...

FROM nomeTabela

WHERE coluna BETWEEN "YYYY-MM-DD" AND "YYYY-MM-DD";

Exemplo com texto:

SELECT nome_produto

FROM Produto

WHERE preço_produto BETWEEN "Caneta" AND "Borracha";

Resultado: Caneta, Caderno, Borracha.

32 ALIASES


Você percebeu que quando utilizamos COUNT, AVG ou SUM, o
resultado aparece como: COUNT(nome_atributo). Caso você queira
mudar o nome desse resultado, utilizamos Aliases.

Aliases têm a função de dar um nome temporário para outros


elementos, utilizando a palavra-chave AS.

SELECT coluna1 AS novoNome1, coluna2 AS novoNome2, ...

FROM nomeTabela;

Exemplo:


SELECT COUNT(id_aluno) AS "Contagem de cadastros"

FROM Alunos;
Resultado:


Observação: Caso o nome definido em AS contenha espaços, então


devemos colocar aspas.

Aliases podem ser utilizados para nomear tabelas também. E isso é


extremamente útil ao criarmos JOINS.

SELECT coluna1, coluna2, ...

FROM nomeTabela AS novoNomeTabela;

Exemplo:

SELECT a.nome_aluno, a.cidade_aluno

FROM Alunos AS a;

Por fim, observe a seguinte tabela:




Podemos utilizar Aliases para nomear a junção de várias colunas.

Exemplo:

SELECT nome_aluno, CONCAT_WS(',', bairro_aluno, cidade_aluno) AS


"Endereço"

FROM Alunos;

CONCAT_WS serve para unir colunas. Primeiro determinamos como os


valores serão separados, neste caso aparecerá uma , entre as
palavras.

Resultado:

33 JOINS


Uma cláusula JOIN faz uma ponte entre duas tabelas relacionadas
entre si através de uma PK (Primary Key) e uma FK (Foreign Key).
O JOIN realiza a união entre os valores de duas ou mais tabelas
diferentes, permitindo combinar informações relevantes de ambas
as tabelas em uma única consulta.

SELECT nomeTabela1.coluna, nomeTabela2.coluna

FROM nomeTabela1

TIPO JOIN nomeTabela2 ON nomeTabela1.PKTabela1 =


nomeTabela2.FKTabela2;

Tipos de JOIN:

INNER JOIN → Retorna todos os registros em comum entre duas


tabelas.

LEFT JOIN →Retorna todos os registros da primeira tabela


(tabela da esquerda) e todos os registros em comum com a segunda
tabela (tabela da direita).

RIGHT JOIN →Retorna todos os registros da segunda tabela


(tabela da direita) e todos os registros em comum com a primeira
tabela (tabela da esquerda).

CROSS JOIN → Retorna todos os registros em das duas tabelas.


Representações:

INNER JOIN


LEFT JOIN

RIGHT JOIN


CROSS JOIN


34 INNER JOIN


INNER JOIN → Retorna todos os registros em comum entre duas
tabelas.

Sintaxe:

SELECT nomeTabela.coluna1, nomeTabela.coluna2, ...

FROM nomeTabela1

INNER JOIN nomeTabela2

ON nomeTabela1.PK = nomeTabela2.FK;

Exemplo:

Tabela 01

Tabela 02


Para demonstrar o nome e a média de um aluno, podemos realizar um


INNER JOIN.

SELECT a.nome_aluno, m.Média

FROM Alunos AS a

INNER JOIN Médias AS m

ON a.id_aluno = m.id_aluno;

Resultado:


Caso você precise juntar três tabelas (ou mais):

SELECT a.coluna, b.coluna, c.coluna

FROM ((tabela1 AS a

INNER JOIN tabela2 AS b ON a.PK = b.FK)

INNER JOIN tabela3 AS c ON a.PK = c.FK);

35 LEFT JOIN


LEFT JOIN →Retorna todos os registros da primeira tabela
(tabela da esquerda) e todos os registros em comum com a segunda
tabela (tabela da direita).
Sintaxe:

SELECT nomeTabela1.coluna, nomeTabela2.coluna

FROM nomeTabela1

LEFT JOIN nomeTabela2

ON nomeTabela1.PK = nomeTabela2.FK;

Observe as próximas tabelas que iremos utilizar:




Cliente:


Responsável:


Transportadora:

Pedido:


Para demonstrar o nome do Cliente e todos os pedidos


relacionados, podemos realizar um LEFT JOIN, mas perceba que caso
algum cliente não tenha pedidos, ele também aparecerá na lista,
pois o LEFT JOIN mostrará o nome de todos os clientes (tabela da
esquerda).

SELECT c.cliente_nome, p.pedido_id

FROM cliente AS c

LEFT JOIN pedido AS p

ON c.cliente_id = p.cliente_id;

Resultado:


36 RIGHT JOIN


RIGHT JOIN →Retorna todos os registros da segunda tabela
(tabela da direita) e todos os registros em comum com a primeira
tabela (tabela da esquerda).

Sintaxe:

SELECT nomeTabela1.coluna, nomeTabela2.coluna

FROM nomeTabela1

RIGHT JOIN nomeTabela2

ON nomeTabela1.FKTabela2 = nomeTabela2.PKTabela2;
Para demonstrar o ID do Pedido e o nome de todos os empregados,
podemos realizar um RIGHT JOIN, mas perceba que caso algum
empregado não tenha pedidos, ele também aparecerá na lista, pois
o RIGHT JOIN mostrará o nome de todos os empregados (tabela da
direita).

SELECT p.pedido_id, r.responsável_nome

FROM pedido AS p

RIGHT JOIN responsável AS r

ON p.responsável_id = r.responsável_id;

Resultado:


37 CROSS JOIN


CROSS JOIN → Retorna todos os registros em das duas tabelas.
SELECT coluna1, coluna2, ...

FROM nomeTabela1

CROSS JOIN nomeTabela2;

Cuidado! Um CROSS JOIN pode retornar MUITOS registros. Pois cada


registro de uma tabela será relacionado com os registros de outra
tabela.

Exemplo: CROSS JOIN entre o nome de um cliente e o id dos


pedidos.

SELECT c.cliente_nome, p.pedido_id

FROM cliente AS c

CROSS JOIN pedido AS p;

Resultado:

Perceba que nem todos os clientes realmente fizeram os pedidos
que aparecem no resultado. Isso ocorre porque o CROSS JOIN
retorna todos os registros, tendo relação ou não. Caso você
adicione a cláusula WHERE, o CROSS JOIN torna-se um INNER JOIN.

SELECT c.cliente_nome, p.pedido_id

FROM cliente AS c

CROSS JOIN pedido AS p

WHERE c.cliente_id = p.cliente_id;




E se executarmos um INNER JOIN, o resultado será o mesmo:

SELECT c.cliente_nome, p.pedido_id

FROM cliente AS c

INNER JOIN pedido AS p

ON c.cliente_id = p.cliente_id;

Resultado:

38 SELF JOIN


SELF JOIN une os elementos de uma tabela com outros elementos da
própria tabela. Sintaxe:

SELECT coluna1 AS nome1, coluna2 AS nome2

FROM nomeTabela AS nomeTabela1, nomeTabela AS nomeTabela2

WHERE condição;

Exemplo de uma lista que relaciona possíveis duplas de clientes


sem repetir os nomes:

SELECT a.cliente_nome AS Nomes1, b.cliente_nome AS Nomes2

FROM cliente AS a, cliente AS b

WHERE a.cliente_nome <> b.cliente_nome;

Resultado:


39 UNION


A instrução UNION é usada para unir dados de duas ou mais
tabelas. O SGBD criará uma tabela de resultados com os valores
das tabelas combinadas. É importante que toda vez que um UNION
for utilizado, o mesmo número de colunas seja solicitado em ambas
as tabelas. Sintaxe:

SELECT coluna1

FROM nomeTabela1

UNION

SELECT coluna1
FROM nomeTabela2;

Exemplo:

Tabela "cidade" →


Tabela "cliente" →


Para criar uma lista de todas as cidades presentes nas duas


tabelas:

SELECT cliente_cidade FROM cliente

UNION

SELECT cidade_nome FROM cidade;

Resultado:


Perceba que nenhuma cidade é repetida, pois o UNION ignora os


valores repetidos, escrevendo-os somente uma vez. Para que os
valores iguais sejam repetidos é necessário utilizar o UNION ALL.

SELECT cliente_cidade FROM cliente

UNION ALL
SELECT cidade_nome FROM cidade;

Resultado:


40 GROUP BY


A instrução GROUP BY é usada para agrupar os resultados de
funções de agregação, como COUNT(), MAX(), MIN(), SUM() e AVG().
Imagine que você queira exibir a contagem de alunos por cidade;
isso sempre foi possível, porém, envolveria utilizar a opção de
COUNT para cada cidade registrada. Com o GROUP BY, é possível
simplificar o processo. Sintaxe:

SELECT coluna1, coluna2, ...

FROM nomeTabela

WHERE condição

GROUP BY nomeColuna

ORDER BY nomeColuna;

Exemplo:


SELECT COUNT(cidade_aluno), cidade_aluno

FROM Alunos

GROUP BY cidade_aluno;
Resultado:


É possível utilizar a instrução ORDER BY em conjunto com GROUP


BY, porém, a ORDER BY deve aparecer por último. Veja o exemplo
anterior, mas com o resultado em ordem alfabética ascendente
(crescente).

SELECT COUNT(cidade_aluno), cidade_aluno

FROM Alunos

GROUP BY cidade_aluno

ORDER BY cidade_aluno ASC;

Resultado:


Utilização do GROUP BY com JOIN:

Observe as tabelas:

→ Alunos


→ Nota


Comando:

SELECT alunos.nome_aluno, COUNT(nota.id_aluno) AS "Quantidade de


notas"
FROM Alunos

LEFT JOIN Nota ON alunos.id_aluno = nota.id_aluno

GROUP BY alunos.nome_aluno;

Resultado:


41 HAVING


A cláusula HAVING pois adicionada ao MySQL para condições que
envolvam funções numéricas, como COUNT(), MAX(), MIN(), SUM() e
AVG(). A cláusula WHERE não pode ser usada em conjunto com essas
funções. Sintaxe:

SELECT coluna1, coluna2, ...

FROM nomeTabela

WHERE condição

GROUP BY nomeColuna

HAVING condição

ORDER BY nomeColuna;

Exemplo, para mostrar somente as cidades com mais do que dois


alunos cadastrados:


SELECT cidade_aluno, COUNT(cidade_aluno) AS "Quantidade de alunos


por cidade"

FROM Alunos

GROUP BY cidade_aluno

HAVING COUNT(cidade_aluno) > 2;


Resultado:


42 EXISTS


O operador EXISTS é usado para verificar a existência de um dado
determinado dentro de uma subconsulta. Sintaxe:

SELECT coluna1, coluna2, ...

FROM nomeTabela

WHERE EXISTS

(SELECT coluna FROM nomeTabela WHERE condição);

Exemplo: Para demonstrar o nome dos alunos que apresentam notas


menores que 7.

nome_aluno

Alunos;

SELECT nome_aluno

FROM alunos

WHERE EXISTS

(SELECT nota FROM nota WHERE alunos.id_aluno = nota.id_aluno AND


nota < 7);

Resultado:


43 ANY e ALL


Os operadores ANY e ALL permitem que você faça uma comparação
entre um valor e uma lista de valores. Eles permitem verificar se
uma determinada condição é verdadeira para algum ou todos os
valores da lista, respectivamente.
O operador ANY: Realiza a comparação entre um valor e uma lista
de valores. Caso exista um registro na lista que seja igual ao
valor comparado, o operador ANY retornará TRUE.

SELECT coluna1, coluna2, ...

FROM nomeTabela

WHERE coluna operador ANY

(SELECT coluna1, coluna2, ...

FROM nomeTabela);

Exemplo:

→ Tabela "Produto":


→ Tabela "Pedido":


Para mostrar os nomes dos produtos da tabela "Produto" que


aparecem com mais de 3 pedidos gravados na tabela "Pedido":

SELECT produto_nome FROM `produto`

WHERE produto_id = ANY

(SELECT produto_id

FROM pedido

WHERE pedido_quantidade > 3);

Resultado:


O operador ALL: Realiza a comparação entre um valor e todos os


registros de uma lista de valores.
Pode ser utilizado com os operadores SELECT, WHERE e HAVING.

SELECT ALL coluna1, coluna2, ...

FROM nomeTabela;

Todos os registros dessa das colunas selecionadas serão


mostrados.

Com o WHERE ou HAVING é possível utilizar a seguinte sintaxe:

SELECT coluna1, coluna2, ...

FROM nomeTabela

WHERE nomeColuna operador ALL

(SELECT coluna

FROM nomeTabela);

Exemplo:

SELECT ALL produto_nome FROM produto;




44 INSERT SELECT


A instrução INSERT SELECT faz uma cópia de uma tabela em outra
tabela, desde que elas tenham o mesmo número de colunas. Sintaxe:

INSERT INTO nomeTabela2

SELECT *

FROM nomeTabela1;

Exemplo:

→ Tabela "Produto"

→ Tabela "Produto2"


Comando:

INSERT INTO produto2

SELECT *

FROM produto;

Resultado:


45 CASE


A instrução CASE é usada para selecionar uma instrução de um
conjunto de instruções. Sintaxe:

CASE

WHEN condição1 THEN resultado1

WHEN condição2 THEN resultado2

WHEN condição3 THEN resultado3

WHEN condição4 THEN resultado4

...

ELSE resultadoX

END;

Exemplo:

SELECT pedido.pedido_id, produto.produto_nome,

CASE

WHEN pedido.pedido_quantidade > 1 AND pedido.pedido_quantidade <


10 THEN "Mais do que um pedido"

WHEN pedido.pedido_quantidade >= 10 THEN "São 10 ou mais pedidos"

ELSE "Somente um pedido"

END AS "Status dos pedidos"

FROM pedido

INNER JOIN produto

ON pedido.produto_id = produto.produto_id;

Resultado:


46 NULL FUNCTIONS


As funções IFNULL() e COALESCE() são utilizadas em SQL para lidar
com valores nulos em consultas e expressões. Ambas têm o
propósito de retornar um valor alternativo caso a expressão ou
coluna especificada seja nula.

→ A função IFNULL() e a função COALESCE() permite retornar um


valor alternativo caso algum valor seja NULL. Neste exemplo o
valor NULL é trocado por 0.

Exemplo:


Comando:

SELECT IFNULL(produto_nome, "Nome não cadastrado")

FROM produto;
Resultado:


Alternativa:

SELECT COALESCE(produto_nome, "Nome não cadastrado")

FROM produto;

O resultado produzido será o mesmo.

47 COMMENTS


Comentários em MySQL são úteis para criarmos anotações no código.
O SGBD (Sistema Gerenciador de Banco de Dados) ignora os trechos
comentados e não executa aquelas instruções.

Comentário de uma linha é iniciado por "--":

–- Isso é um comentário de uma linha

SELECT * FROM nomeTabela;

Comentário de várias linhas é iniciado por "/*" e encerrado por


"*/":

/* Isso é um comentário

de várias linhas*/

SELECT * FROM nomeTabela;

48 MySQL CREATE INDEX


CREATE INDEX é uma instrução SQL utilizada para criar um índice
em uma tabela de um banco de dados. Um índice é uma estrutura de
dados que melhora a velocidade de busca e recuperação de
informações em uma tabela, funcionando de forma semelhante a um
índice em um livro, onde você pode localizar rapidamente uma
página específica com base nas palavras-chave.

Sintaxe:
CREATE INDEX nomeIndex

ON nomeTabela(coluna1, coluna2...);

Exemplo:

CREATE INDEX produtoIndex

ON produto(produto_nome);

Para evitar que outro Index seja criado para uma mesma coluna, é
possível usar a cláusula UNIQUE.

Exemplo:

CREATE UNIQUE INDEX produtoIndex

ON produto(produto_nome);

Para apagar um Index, basta utilizar um DROP.

Exemplo:

ALTER TABLE produto

DROP INDEX produtoIndex;

49 VIEWS


Toda vez que você deseja realizar uma busca é necessário executar
um SELECT. Mas e se for necessário realizar a mesma busca várias
vezes? Para facilitar o desenvolvimento de atividades como essa,
existe o comando VIEW.

Sintaxe:

CREATE VIEW nomeView AS


SELECT coluna1, coluna2, ...
FROM nomeTabela;

Exemplo:

CREATE VIEW nomesAlunos AS

SELECT nome_aluno

FROM alunos;

Em seu SGBD aparecerá uma opção (View) "nomesAlunos", toda vez


que você clicar, ele executará o SELECT que foi salvo.

Para alterar uma VIEW salva, utilizamos a seguinte sintaxe:


CREATE OR REPLACE VIEW nomeView AS
SELECT coluna1, coluna2, ...
FROM nomeTabela;

Para deletar uma VIEW salva, utilizamos a seguinte sintaxe:

DROP VIEW nomeView;

50 MySQL Functions


Lista de funções em MySQL.

→ Funções de texto:
ASCII: Retorna o código ASCII de um caractere específico.

CHAR_LENGTH: Retorna o tamanho de um texto.

CHARACTER_LENGTH: Retorna o tamanho de um texto.

CONCAT: Une dois ou mais textos.

CONCAT_WS: Une dois ou mais textos, porém separa-os por meio de


um caractere especial.

FIELD: Retorna a posição de um valor específico em uma lista de


valores.

FIND_IN_SET: Retorna a posição de um texto em uma lista de


textos.

FORMAT: Permite formatar um número em um formato específico.

INSERT: Insere um texto dentro de outro texto, em uma posição


específica.

INSTR: Retorna a posição específica de um texto dentro de outro.

LCASE: Converte um texto para letras minúsculas.

LEFT: Retorna um número de caracteres de um texto (iniciando na


esquerda).

LENGTH: Retorna o tamanho de um texto, em bytes.

LOCATE: Retorna a posição da primeira ocorrência de um texto


dentro de outro.

LOWER: Converte um texto para letras minúsculas.

LPAD: Adiciona um texto específico, na parte esquerda de outro


texto. A função faz isso até atingir um número X de caracteres.

LTRIM: Remove os espaços em branco do início do texto.


MID: Retorna uma parte de um texto.

POSITION: Retorna a posição da primeira ocorrência de um texto


dentro de outro.

REPEAT: Repete um texto uma quantidade X de vezes.

REPLACE: Troca um trecho de texto por outro.

REVERSE: Inverte um texto.

RIGHT: Retorna um número de caracteres de um texto (iniciando na


direita).

RPAD: Adiciona um texto específico, na parte direita de outro


texto. A função faz isso até atingir um número X de caracteres.

RTRIM: Remove os espaços em branco do final do texto.

SPACE: Retorna um texto com um número X de espaços.

STRCMP: Compara dois textos.

SUBSTR: Retorna uma parte de um texto.

SUBSTRING: Retorna uma parte de um texto.

SUBSTRING_INDEX: Retorna uma parte de um texto após um número


específico de ocorrências daquele texto.

TRIM: Remove os espaços em branco do início e do fim de um texto.

UCASE: Converte um texto para letras maiúsculas.

UPPER: Converte um texto para letras maiúsculas.

→ Funções numéricas:
ABS: Retorna o valor absoluto de um número (sem sinal).

ACOS: Retorna o arco cosseno de um número.

ASIN: Retorna o arco seno de um número.

ATAN: Retorna o arco tangente de um número.

ATAN2: Retorna o arco tangente de dois números.

AVG: Retorna a média de um conjunto de números.

CEIL: Retorna o menor valor inteiro que é maior ou igual a um


número.

CEILING: Retorna o menor valor inteiro que é maior ou igual a um


número.
COS: Retorna o cosseno de um número.

COT: Retorna o cotangente de um número.

COUNT: Retorna a contagem de ocorrências de um valor.

DEGREES: Converte um número de radianos para graus.

DIV: Retorna a parte inteira de uma divisão.

EXP: Retorna o valor elevado a X número.

FLOOR: Retorna o maior valor inteiro que é menor ou igual a um


número.

GREATEST: Retorna o maior valor de uma lista.

LEAST: Retorna o menor valor de uma lista.

LN: Retorna o logaritmo natural de um número.

LOG: Retorna o logaritmo natural de um número, em uma base


específica.

LOG10: Retorna o logaritmo de base 10.

LOG2: Retorna o logaritmo de base 2.

MAX: Retorna o maior valor em um conjunto de números.

MIN: Retorna o menor valor em um conjunto de números.

MOD: Retorna o resto de uma divisão.

PI: Retorna o valor de PI.

POW: Retorna o valor elevado de um número a X.

POWER: Retorna o valor elevado de um número a X.

RADIANS: Converte um número de graus para radianos.

RAND: Retorna um valor aleatório.

ROUND: Arredonda um número.

SIGN: Retorna o sinal de um número.

SIN: Retorna o seno de um número.

SQRT: Retorna a raiz quadrada de um número.

SUM: Retorna a soma de um conjunto de valores.

TAN: Retorna o valor da tangente de um número.

TRUNCATE: Remove a parte decimal de um número.


→ Funções de data:
ADDDATE: Adiciona um intervalo de data a outra data.

ADDTIME: Adiciona um intervalo de tempo a outro intervalo de


tempo.

CURDATE: Retorna o valor atual da data.

CURRENT_DATE: Retorna o valor atual da data.

CURRENT_TIME: Retorna o valor atual do tempo.

CURRENT_TIMESTAMP: Retorna a data e hora atual.

CURTIME: Retorna o valor atual do tempo.

DATE: Retorna a data de uma expressão "DATETIME".

DATEDIFF: Retorna o número de dias entre duas datas.

DATE_ADD: Adiciona um intervalo de data/hora a uma data.

DATE_FORMAT: Formata uma data.

DATE_SUB: Subtrai um intervalo de data/hora de uma data.

DAY: Retorna o dia de uma data.

DAYNAME: Retorna o nome do dia.

DAYOFMONTH: Retorna o dia de um mês de uma data.

DAYOFWEEK: Retorna o dia da semana de uma data.

DAYOFYEAR: Retorna o dia de um ano específico.

EXTRACT: Extrai uma parte de uma data.

FROM_DAYS: Retorna uma data a partir de um valor numérico.

HOUR: Retorna a hora de um valor de tempo.

LAST_DAY: Extrai o último dia de um mês.

LOCALTIME: Retorna a data/hora atual com base em uma localização.

LOCALTIMESTAMP: Retorna a data/hora atual com base em uma


localização.

MAKEDATE: Cria uma data com base em um ano ou um número de dias.

MAKETIME: Cria um horário com base em um valor de hora, minutos


ou segundos.

MICROSECOND: Retorna os microssegundos de um valor de tempo/data.


MINUTE: Retorna os minutos de um valor de tempo/data.

MONTH: Retorna um mês de uma data.

MONTHNAME: Retorna o nome de um mês.

NOW: Retorna a data/hora atual.

PERIOD_ADD: Adiciona uma quantidade específica de meses a um


período.

PERIOD_DIFF: Retorna a diferença entre dois períodos.

QUARTER: Retorna o trimestre de um valor de data/tempo.

SECOND: Retorna o valor de segundos de um valor de data/tempo.

SEC_TO_TIME: Converte um valor em segundos em um horário.

STR_TO_DATE: Converte um texto em uma data.

SUBDATE: Subtrai um intervalo de datas de um valor de data/tempo.

SUBTIME: Subtrai um intervalo de tempo de um valor de data/tempo.

SYSDATE: Retorna a data/hora atual do sistema.

TIME: Retorna o tempo de uma expressão de data/tempo.

TIME_FORMAT: Converte um valor de tempo em um valor específico.

TIME_TO_SEC: Converte um valor de tempo em segundos.

TIMEDIFF: Retorna a diferença entre duas expressões de


data/tempo.

TIMESTAMP: Retorna o date/time com base em uma data.

TO_DAYS: Retorna o número de dias entre uma data e "0000-00-00".

WEEK: Retorna a semana de uma data.

WEEKDAY: Retorna o número de dias da semana de uma data.

WEEKOFYEAR: Retorna o número de semanas de uma data.

YEAR: Retorna o ano de uma data.

YEARWEEK: Retorna o ano e o número de semanas para uma


determinada data.

→ Funções avançadas:
BIN: Retorna a representação binária de um número.

BINARY: Converte um valor em uma sequência binária.


CASE: Retorna um valor definido conforme uma lista de condições.

CAST: Converte um valor definido para um tipo diferente.

COALESCE: Retorna o primeiro valor não NULL de uma lista.

CONNECTION_ID: Retorna o ID de conexão exclusivo para a conexão


atual.

CONV: Converte um número de uma base numérica para outra.

CONVERT: Converte um valor para um padrão específico de data ou


texto.

CURRENT_USER: Retorna o nome e host do servidor MySQL.

SESSION_USER: Retorna o nome e host do servidor MySQL.

SYSTEM_USER: Retorna o nome e host do servidor MySQL.

USER: Retorna o nome e host do servidor MySQL.

VERSION: Retorna a versão do MySQL que você está utilizando.

DATABASE: Retorna o nome da base de dados atual.

IF: Retorna um valor se a condição for verdadeira e pode retornar


outro valor quando a condição é falsa.

IFNULL: Retorna um valor específico se a condição for NULL e pode


retornar outro valor quando a condição não é NULL.

ISNULL: Retorna 1 ou 0 dependendo se a expressão é NULL.

LAST_INSERT_ID: Retorna o valor do último ID adicionado através


de AUTO_INCREMENT.

NULLIF: Compara duas expressões e retorna NULL se elas forem


iguais. Caso contrário, a primeira expressão será retornada.
O amor é livre e esta apostila também. Você pode ler, editar, distribuir, excluir partes, mas não deixe de referenciar o autor.
Escrito por Uianes Luiz Rockenbach Biondo, em 2023.
ISBN: 978-65-00-82430-8
Registrado pela Câmara Brasileira do Livro
Baseado em: https://www.w3schools.com/mysql/

Você também pode gostar