Comandos SQL: SELECT, INSERT, UPDATE e DELETE

Comandos SQL: SELECT, INSERT, UPDATE e DELETE
Giulia Losnak
Giulia Losnak

Compartilhe

Introdução: Comandos SQL — SELECT, INSERT, UPDATE e DELETE

Fui chamada por um amigo meu que trabalha em uma biblioteca para criar um sistema para que os funcionários tivessem controle do estoque de livros, quais eram emprestados, quantos haviam disponíveis, quando um novo livro fosse acrescentado ao inventário, entre outras coisas.

Sugeri de fazer um sistema no banco de dados, pois assim eles podiam fazer isso facilmente e teriam um sistema somente deles, no qual pudessem ter esse controle.

Comecei baixando o MySQL (confira nosso tutorial sobre MySQL do download, instalação e criação da sua primeira tabela), configurei um servidor e criei CREATE uma database biblioteca, com o comando:

CREATE database biblioteca;

Agora que a database, que é um banco de dados próprio da biblioteca, foi criado, devemos adicionar os dados dos livros. E como podemos fazer isso?

No SQL os dados são inseridos em tabelas, na qual cada coluna representa um dado e cada linha, um livro cadastrado.

Banner de divulgação da Imersão IA da Alura em colaboração com o Google. Mergulhe em Inteligência artificial com a Alura e o Google. Serão cinco aulas gratuitas para você aprender a usar IA na prática e desenvolver habilidades essenciais para o mercado de trabalho. Inscreva-se gratuitamente agora!

Criando tabelas com MySQL

Comecei a pensar o que teria que ter na tabela. Cheguei aos seguintes tópicos:

  • Título
  • Autor
  • ISBN
  • Edição
  • Editora
  • Ano publicação
  • Páginas
  • Gênero literário
  • Idioma
  • Quantidade de livros desta edição
  • Quantidade de livros desta edição disponível na biblioteca

Porém, lembrei que antes de começar a criar qualquer coisa no banco de dados, devemos informar qual database queremos usar. Para isso, usamos o comando USE e o nome da database sempre que formos mexer nessa database. Então, escrevi:

USE biblioteca;

A partir daí, comecei a escrever o código para criar CREATE a tabela TABLE e o nome da tabela, que será livros. Ficando:

CREATE TABLE livros

Para colocar as colunas, devemos abrir e fechar um parênteses e escrever as colunas entre eles, colocando o que é cada um.

Na frente do nome da coluna, precisamos colocar o tipo de informação que ela receberá.

Para começar, na coluna título e autor, como serão textos, e muitas vezes podem ser grandes, coloquei a categoria text que não precisa estipular um limite de caracteres. Aí ficou:

CREATE TABLE livros (
titulo text,
autor text,

Porém, nas colunas ISBN, edição e editora, que são informações que podem conter algum número ou caractere especial, coloquei na categoria varchar, e como não podemos deixar uma possibilidade enorme, coloquei um limite de 50 caracteres cada um. Ficando:


ISBN varchar (50),
edicao varchar (50),
editora varchar(50),

Então, criei a coluna ano para indicar a data em que ano o livro foi publicado, sendo a categoria year, que aceita somente o ano e, assim não precisamos incluir a data inteira:

anoPublicacao year,

Para a coluna de páginas, como essa informação sempre será um número inteiro, coloquei a categoria int que indica que ali só serão acrescentando números inteiros.

 qtdePaginas int,

Já na coluna de gênero, como sempre inserimos os mesmos tipos, coloquei a categoria enum, que só permite inserir um valor que está entre alguns que foram definidos na criação da tabela.

Assim, também podemos saber quantos livros de determinado gênero temos no estoque. E o como ficou como a seguir:


genero ENUM ('poesia', 'soneto', 'romance', 'fábula', 'novela', 'cronica', 'conto', 'ensaio', 'biografia', 'chicklit', 'fantasia', 'distopia', 'ficcao cientifica', 'horror', 'fantastica', 'infanto juvenil', 'young adult', 'suspense', 'autoajuda', 'negocios', 'tecnologia', 'hq', 'aventura')),

Na categoria de idioma, também coloquei varchar porque podemos receber livros de diversas linguagens. Ficando:

 idioma varchar(50),

Por fim, coloquei as colunas da quantidade total de exemplares daquele livro estão disponíveis na biblioteca e a quantidade que está disponível, que deve ser atualizada sempre que um livro for emprestado.

CREATE TABLE livros (
titulo text,
autor text,
ISBN varchar (50),
edicao varchar (50),
editora varchar(50),
anoPublicacao year,
qtdePaginas int,
genero ENUM ('poesia', 'soneto', 'romance', 'fábula', 'novela', 'cronica', 'conto', 'ensaio', 'biografia', 'chicklit', 'fantasia', 'distopia', 'ficcao cientifica', 'horror', 'fantastica', 'infanto juvenil', 'young adult', 'suspense', 'autoajuda', 'negocios', 'tecnologia', 'hq', 'aventura'),
idioma varchar(50),

Mais colunas e chave-primária

A biblioteca quer uma coluna para a quantidade total e para a quantidade disponível para uma ser sempre atualizada, enquanto outra permanece com o mesmo valor desde que recebermos um livro, para termos um controle de quanto livros deveríamos ter - e saber se algum deles foi perdido.

Como só podem ser números inteiros também, já que não podemos ter meio livro, coloquei na categoria int:

quantidade int,
disponivel int );

Além disso, no fim do insert, depois de fechar o parênteses, devemos finalizar o comando com ponto e vírgula (;), como devemos fazer no fim de todo comando em SQL.

O código inteiro para criar a tabela ficou assim:

CREATE TABLE livros (
titulo text,
autor text,
ISBN varchar (50),
edicao varchar (50),
editora varchar(50),
anoPublicacao year,
qtdePaginas int,
genero ENUM ('poesia', 'soneto', 'romance', 'fábula', 'novela', 'cronica', 'conto', 'ensaio', 'biografia', 'chicklit', 'fantasia', 'distopia', 'ficcao cientifica', 'horror', 'fantastica', 'infanto juvenil', 'young adult', 'suspense', 'autoajuda', 'negocios', 'tecnologia', 'hq', 'aventura'),
idioma varchar(50),
quantidade INT,
disponivel int);

Antes de executar, pensei em criar uma coluna que na primeira linha ela tivesse o valor “1” e fosse aumentando os valores automaticamente para que, assim, esse número indicasse quantos livros a biblioteca tinha ao todo.

Pensando em como fazer isso, lembrei que na Apostila de SQL da Alura era criada uma coluna "id" que seria auto-incrementada com o comando auto_increment e ela seria uma chave primária ou PRIMARY KEY, que é uma coluna que possui um valor único em cada linha, o que as identifica.

CREATE TABLE livros (
id INT auto_increment PRIMARY KEY,
titulo text,
autor text,
isbn varchar (50),
edicao varchar (50),
editora varchar(50),
anoPublicacao year,
qtdePaginas int,
genero ENUM ('poesia', 'soneto', 'romance', 'fábula', 'novela', 'cronica', 'conto', 'ensaio', 'biografia', 'chicklit', 'fantasia', 'distopia', 'ficcao cientifica', 'horror', 'fantastica', 'infanto juvenil', 'young adult', 'suspense', 'autoajuda', 'negocios', 'tecnologia', 'hq', 'aventura'),
idioma varchar(50),
quantidade int,
disponivel int );

E pronto! A minha tabela foi criada!

Agora com a tabela criada temos que adicionar dados nela! E como podemos fazer isso?

INSERT - Inserindo dados na tabela

Para isso, eu usei o comando INSERT

Para usar o INSERT devemos escrever INSERT INTO e o nome da tabela. Depois colocar em parênteses as colunas que terão um valor inseridos, escrever VALUES e escrever em outro parênteses os valores que serão inseridos nas colunas.

Como a coluna id será auto-incrementada automaticamente, sempre que uma linha for adicionada, não precisamos inserir um valor nela.

Assim, iremos adicionar uma linha, que são os dados que terão na tabela:

INSERT INTO livros (titulo, autor, isbn, edicao, editora, anoPublicacao, qtdePaginas, genero, idioma, quantidade) VALUES ('orgulho e preconceito', 'jane austen', 978-8544001820, 'luxo', 'martin claret', 2018, 424, 'romance', 2);

Porém, apareceu o seguinte erro:

Error Code: 1136. Column count doesn’t match value count at row 1

Quando procurei para saber mais, descobri que este erro acontece quando colocamos valores a colunas que não existem. Porém, todas essas colunas existem na minha tabela. Qual será o problema?

Analisando o comando, notei que não havia inserido nenhum valor na coluna idioma, mesmo tendo informado no comando que ela receberia um valor. Tentando novamente:

INSERT INTO livros (titulo, autor, isbn, edicao, editora, anoPublicacao, qtdePaginas, genero, idioma, quantidade, disponivel) VALUES ('orgulho e preconceito', 'jane austen', '978-8544001820', 'luxo', 'martin claret', 2018, 424, 'romance', 'portugues', 2, 2);

E deu certo! Assim, comecei a adicionar os as outras matérias daquele mês.

Porém, como eu podia fazer para mostrar a tabela na tela? Pensei que eu deveria selecionar a tabela inteira ou uma parte dela para mostrar, então, o comando é SELECT:

SELECT ALL FROM livros;

Porém, apresentou o seguinte erro:

Error 1064. You have an error in your SQL syntax.

Isso significa que eu errei a sintaxe do SQL, ou seja, que o comando ou uma parte dele foi escrita errado. Foi então que eu procurei e descobri que no SQL o comando para selecionar todos é *, então, coloquei:

SELECT * FROM livros

E apareceu todas as coisas que eu cadastrei no banco de dados!

DELETE - Deletando linhas de tabelas

Porém, observando a lista, notei que havia adicionado duas vezes uma mesma edição em capa de Orgulho e Preconceito.

Como a questão é controlarmos a quantidade de título que temos, não tem necessidade de tê-lo duas vezes, quando a quantidade de livros está na tabela, certo? E como eu poderia apagar uma das linhas duplicadas?

Para deletar no computador usamos o DELETE, então, podemos usar o mesmo comando:

DELETE from livros

Porém, percebi que não tinha indicado qual linha deveria ser deletada e utilizando o comando assim eu poderia deletar toda a tabela, ou seja, todos os dados que eu havia inserido nela.

Então, pensei em especificar qual linha era com ao menos um valor de uma das colunas. Na minha tabela, existe alguma coluna que possui um valor único para cada linha?

Lembra que quando criamos a tabela criamos a coluna id que teria um número que se auto-incrementaria e era a chave primária da tabela?

Essa é a coluna que devemos usar como parâmetro! Pois, se usássemos a coluna de nome, as duas linhas seriam excluídas e teríamos que incluir mais uma vez. Usando a coluna id, que tem um número diferente para cada linha, só a linha errada é excluída.

Então, usei mais uma vez o SELECT * FROM livros e vi na tabela o id da linha duplicada.

Que no caso, o id é o 2.

Mudando o comando para deletar a linha da tabela, onde o id era 2, ficou:

DELETE from livros WHERE id=2;

E funcionou! Vendo a tabela novamente, não existe mais a linha 2 e há somente uma linha para esta edição do Orgulho e Preconceito.

E pronto! Agora a biblioteca começou a funcionar!

UPDATE - Mudando dados da tabela

Os livros já estão sendo emprestados e como posso fazer para atualizar a quantidade de livros disponíveis na biblioteca?

Para mudar dados de uma coluna de uma linha de uma tabela em SQL utiliza o comando UPDATE. Porém, assim como DELETE, deve ser especificado para que não sejam alteradas todas as linhas.

Fui escrevendo o comando para atualizar a linha da coluna, utilizando como parâmetro o nome do livro.

UPDATE livros SET disponivel=1 WHERE titulo='O Diário de Anne Frank';

Porém, temos diversas edições deste mesmo livro e, utilizando este comando, iríamos alterar a quantidade de livros disponíveis para todas as edições. Então, precisamos de uma informação da tabela que seja única em cada linha. Qual seria essa?

Sim! O id da linha, que é auto incrementado e tem um número específico para cada linha, permitindo que saibamos exatamente qual linha queremos alterar.

Assim, comecei a mudar os comandos, colocando como parâmetro de verificação da linha é o id, que é a chave primária da tabela, de cada um. Como aqui:

UPDATE livros SET disponivel=1 WHERE id=19;

Deu certo! E assim podemos atualizar a quantidade de livros disponíveis para aquela edição sempre que um for emprestado e devolvido!

SELECT - Mostrando dados da tabela

Passado algum tempo com a biblioteca funcionando, uma pessoa veio questionar quantos livros de poesia a biblioteca possui, que tinham edições disponíveis para serem emprestadas. E como poderíamos saber esses dados para respondê-la?

Vimos anteriormente como mostrar todos os dados da tabela, que é com o SELECT * from livros.

Mas como podemos utilizar este comando para mostrar somente os títulos que são poesia e não todos os livros que a biblioteca possui, como o comando fará se o executarmos assim?

Para isso, precisamos utilizar o título do livro como parâmetro para que possamos selecionar somente as edições deste mesmo título.

Então, seguindo a ideia dos comandos de DELETE e UPDATE, onde devemos mostrar quais são as linhas que devem ser afetadas, vamos fazer o mesmo com o SELECT.

SELECT * from livros WHERE genero='poesia' AND disponivel>0;

E funcionou! Aparecem somente os títulos de poesia E que possuem edições disponíveis para serem emprestadas.

Porém, assim, aparecem todas as informações do livro e quero saber somente o título, o autor e a quantidade disponível, certo? Como posso utilizar o comando SELECT para mostrar apenas essas colunas?

Tentei o seguinte comando:

SELECT titulo, autor, disponivel FROM livros WHERE genero='poesia' AND disponivel>0;

E deu certo! Apareceram somente essas colunas das linhas que são do gênero poesia.

Agora que sabemos como criar uma tabela, inserir, deletar, mudar e selecionar dados dela,q ual tabela você pode criar com o banco de dados? Acesse os nossos cursos de SQL e descubra o que mais você pode fazer com banco de dados!

Giulia Losnak
Giulia Losnak

Veja outros artigos sobre Data Science