4
respostas

Criar select para acessar campos específicos das tabelas

CREATE DATABASE DBSISTEMAARTIGOS; /*USE DBSISTEMAARTIGOS; */

CREATE TABLE USUARIO ( ID SERIAL PRIMARY KEY, NOME VARCHAR(245) NOT NULL, EMAIL VARCHAR(245) NOT NULL UNIQUE, PASSWORD VARCHAR(245) NOT NULL, ADMIN BOOLEAN DEFAULT false );

CREATE TABLE CATEGORIA ( ID SERIAL PRIMARY KEY, /usando SERIAL e PRIMARY KEY não há a necessidade do uso de NOT NULL e AUTO_INCREMENT/ NOME VARCHAR(245) NOT NULL );

CREATE TABLE ARTIGO ( ID SERIAL PRIMARY KEY, /tipo correto SERIAL ao invés do INT, AUTO_INCREMENT não necessário/ NOME VARCHAR(245) NOT NULL, DESCRICAO VARCHAR(245) NOT NULL, /como todos os outros campos estavam NOT NULL, imaginei que esse também deveria ficar, pois lá em cima, no outro exercício de criação de tabelas, esse campo Descrição também era NOT NULL/ CONTEUDO JSON NOT NULL, ANO INT NOT NULL, IDUSUARIO INT NOT NULL, IDCATEGORIA INT NOT NULL, FOREIGN KEY (IDUSUARIO) REFERENCES USUARIO (ID), FOREIGN KEY (IDCATEGORIA) REFERENCES CATEGORIA (ID) );

/aspas simples no lugar de aspas duplas nos valores/ INSERT INTO USUARIO (NOME, EMAIL, PASSWORD) VALUES ('JORGE HENRIQUE', 'jorge@teste.com', 'senha'); INSERT INTO USUARIO (NOME, EMAIL, PASSWORD) VALUES ('JOAO PAULO', 'joao@teste.com', 'senha'); INSERT INTO USUARIO (NOME, EMAIL, PASSWORD) VALUES ('ANA MARTINS', 'ana@teste.com', 'senha'); INSERT INTO USUARIO (NOME, EMAIL, PASSWORD) VALUES ('LUIZA FLORES', 'luiza@teste.com', 'senha'); INSERT INTO USUARIO (NOME, EMAIL, PASSWORD) VALUES ('PAULO TARSO', 'paulo@teste.com', 'senha'); INSERT INTO USUARIO (NOME, EMAIL, PASSWORD, ADMIN) VALUES ('AMANDA SILVA', 'amanda@teste.com', 'senha', true);

INSERT INTO CATEGORIA (NOME) VALUES('TECNOLOGIA'); INSERT INTO CATEGORIA (NOME) VALUES('CIENCIA'); INSERT INTO CATEGORIA (NOME) VALUES('PROGRAMACAO');

INSERT INTO ARTIGO (NOME, DESCRICAO, CONTEUDO, ANO, IDUSUARIO, IDCATEGORIA)VALUES('INTRODUCAO AO DOCKER', 'PRIMEIRO CONTATO COM DOCKER', '{"conteudo": "UM CONTEUDO QUALQUER"}', 2020, 1, 1); INSERT INTO ARTIGO (NOME, DESCRICAO, CONTEUDO, ANO, IDUSUARIO, IDCATEGORIA)VALUES('ENTENDENDO REGEX', 'ONDE UTILIZAR REGEX', '{"conteudo": "UM CONTEUDO QUALQUER"}', 2019, 2, 2); INSERT INTO ARTIGO (NOME, DESCRICAO, CONTEUDO, ANO, IDUSUARIO, IDCATEGORIA)VALUES('GoLang', 'SIMPLIFICANDO A COMPLEXIDADE', '{"conteudo": "UM CONTEUDO QUALQUER"}', 2020, 3, 3); INSERT INTO ARTIGO (NOME, DESCRICAO, CONTEUDO, ANO, IDUSUARIO, IDCATEGORIA)VALUES('PHP', 'PHP morreu ou vai morrer?', '{"conteudo": "UM CONTEUDO QUALQUER"}', 2018, 6, 1);

 Faça uma consulta de artigos que retorne todos os campos de artigos, mas somente de artigos que são de usuários administradores.  Faça uma consulta de artigos que retorne os artigos com o nome de suas categorias, limite essa consulta para que traga no máximo 2 resultados em ordem ascendente.

Estou procurando alguns exercícios na internet para fixar o aprendizado e não consegui resolver esse. Como faço os SELECT abaixo? Alguém pode me ajudar porque não entendi a lógica por trás. Desde já agradeço

4 respostas

Oii Rodrigo, tudo bom?

Faça uma consulta de artigos que retorne todos os campos de artigos, mas somente de artigos que são de usuários administradores.

Aqui você tem que trazer os artigos, mas só de usuários que são administradores.

  • No select, você vai colocar todos os campos da tabela artigo com exceção dos ids e é necessário juntar com a tabela de usuário para poder trazer os artigos do usuário que é administrador. No where é onde fazemos o filtro para trazer todos que é administradores.
SELECT 
a.nome,
a.descricao,
a.ano

FROM artigo a 

INNER JOIN usuario u ON u.id_usuario = a.id_usuario

WHERE u.admin = 1;

Faça uma consulta de artigos que retorne os artigos com o nome de suas categorias, limite essa consulta para que traga no máximo 2 resultados em ordem ascendente.

Aqui você tem que trazer os artigos com o nome das categorias e trazer no máximo dois resultados em ordem ascendente.

  • No select vamos colocar todos os campos da tabela artigo com exceção dos ids e o campo nome da tabela categoria. Vamos também juntar com a tabela de categoria para podermos trazer o nome. Usaremos o limit para limitar os resultados e o order by para ordenar em ordem ascendente.
SELECT 
c.nome as nome_categoria,
a.nome as nome_artigo,
a.descricao,
a.ano

FROM artigo a 

INNER JOIN categoria c ON c.id_categoria = a.id_categoria

ORDER BY c.nome ASC 
LIMIT 2

Espero ter ajudado e explicado melhor. Se ficar alguma dúvida, só me falar tá bom? :)

Rodrigo,

Complementando a resposta, eu gostaria de te dar uma dica referente a nomeação de campos das tabelas.

Recomendo sempre, na chave primária (ID) complementar de onde é essa chave primária, para que não cause confusão em quem vai administrar o banco de dados ou até mesmo desenvolver os relatórios com base nas queries.

Exemplo:

  • Tabela usuario: id_usuario

Espero ter ajudado :)

Oi Maria, tentei aqui lançar seus códigos e ambos não rodaram. O que pode ser? Não entendi o a.nome, a.descricao... esse 'a' e também o 'u."alguma coisa"' que não entendi sua linha de raciocínio

Oii Rodrigo,

O código não rodou no seu banco, porque eu criei os campos ID com outros nomes: ID_PRODUTO e ID_CATEGORIA. É só alterar para como está no seu que vai rodar.

Não entendi o a.nome, a.descricao... esse 'a' e também o 'u."alguma coisa"' que não entendi sua linha de raciocínio

FROM artigo a

Essa letra na frente do nome da tabela, se chama alias, que é o apelido da tabela e ele pode ter qualquer nome. O alias existe para que possamos identificar de qual tabela vem a coluna, visto que temos colunas que possuem nomes iguais. Como estamos fazendo uma junção com duas tabelas, ali em artigo e categoria, ambas tem o campo nome, sem o alias retornaria um erro de ambiguidade.

Espero ter ajudado. Qualquer dúvida estou por aqui :)