Dúvida Iniciante SQL - Exibir dados de duas tabelas

Gostaria de saber se é possível no MySql listar duas tabelas que sejam independentes onde uma terá mais resultados que a outra?
EX: Exiba os IDs e nomes dos alunos e professores da cidade de São Paulo.

Gostaria de exibir um resultado desse tipo abaixo:

Seria possível exibir essa consulta em SQL ou não pois toda consulta segue por linha horizontal?
OBS: Sei que tem a função UNION, mas o resultado seria apenas em uma fila unica de alunos e professores.

Olá.

Precisamos saber quais as tabelas existentes no banco assim, poderemos te ajudar.

Existem essas abaixo, mas como informei acima só preciso da tabela Aluno e a de Professores.

vc quer lista as duas tabelas de uma única vez? é isso?

Sim amigo, uma ao lado da outra como na img que passei, não sei se é possível isso com SQL exibir o resultado daquela forma.

vc tem o script aí com o create e os inserts das tabelas?
vou fazer um teste aqui.

Não tenho. Seria apenas 2 tabelas(Aluno e Professor) cada uma com ID, Nome, Cidade.
Não tem chave estrangeira.

Bruno,
Você terá que utilizar o UNION junto com uma clausula WHERE nas duas seleções. Fica mais ou menos assim:

SELECT 
	RA AS CODIGO
	, NOME AS NOME
	, CIDADE AS CIDADE
	, 'ALUNO' AS TIPO
FROM
	ALUNO
WHERE
	CIDADE = 'SAO PAULO'
UNION
SELECT 
	COD_PROF AS CODIGO
	, NOME AS NOME
	, CIDADE AS CIDADE
	, 'PROFESSOR' AS TIPO
FROM 
	PROFESSOR
WHERE
	CIDADE = 'SAO PAULO';

O grande mistério do UNION é você trabalhar com as colunas na mesma ordem!

Talvez em alguns banco exista a necessidade de você por um alias(apelido) para as colunas, como coloquei no exemplo a cima. No Sql Server o mesmo adota o nome das colunas da primeira seleção.

Att,

Felipe Cabral

Como eu já havia informado no tópico, já sei como utilizar a função UNION, não quero listar os dados em uma tabela única e sim visualizar por coluna separando aluno de professor como a img que tinha passado na abertura do tópico.

@Bruno_23 realmente fiquei intrigado com o que você quer fazer. Vamos lá novamente, minha segunda interpretação.

Criei aqui ma minha VM duas tabelas seguindo o modelo passado.

Ficou assim:

ALUNO

PROFESSOR

A query que te passei anteriormente te dava o seguinte resultado:

A minha nova interpretação seria este resultado que você está querendo, é isso?:

Para o resultado acima utilizei a seguinte query:

SELECT 
	* 
FROM (
	SELECT 
		ALUNO.RA AS ID_ALUNO
	    ,ALUNO.NOME AS NOME_ALUNO
	    ,ALUNO.ENDERECO AS ENDERECO_ALUNO
	    ,ALUNO.CIDADE AS CIDADE_ALUNO
	    ,PROFESSOR.COD_PROF AS ID_PROFESSOR
	    ,PROFESSOR.NOME AS NOME_PROFESSOR
	    ,PROFESSOR.ENDERECO AS ENDERECO_PROFESSOR
	    ,PROFESSOR.CIDADE AS CIDADE_PROFESSOR
	    FROM 
	    	ALUNO
	FULL  JOIN 
		PROFESSOR
	ON 
		ALUNO.RA = PROFESSOR.COD_PROF
        AND ALUNO.CIDADE='SAO PAULO'
        AND PROFESSOR.CIDADE='SAO PAULO'
        ) SS
WHERE 
	(SS.ID_ALUNO IS NOT NULL AND CIDADE_ALUNO = 'SAO PAULO')
 OR (SS.ID_PROFESSOR IS NOT NULL AND CIDADE_PROFESSOR = 'SAO PAULO');

Caraca vc tem tempo… vc tem alguma base pronta ou utiliza uma ferramenta pra preencher tabelas com dados??

Questão de prática mesmo amigo. Neste exemplo aqui fiz na mão. Mas existem algumas ferramentas gratuitas na Internet que possibilita geração de samples para banco de dados.

Na verdade vc fez o modo padrão do SQL. Mas minha dúvida é se seria possível não exibir os valores “Null”, tipo exibir um resultado por tabela dessa forma:

Esse resultado acima seria os professores e os alunos que moram em SP. Mas pelo jeito acredito que não seja possível isso em SQL pois toda coluna deve ter algo preenchido horizontalmente correto!?
De qualquer forma seu exemplo foi útil e agradeço a atenção.

@Bruno_23,
Continuei intrigado com o que você deseja! Está ai o que está ou estava querendo, sem null aparecendo. Espero poder ter ajudado você e aos próximos que virão:

SELECT 
	 CASE WHEN TO_CHAR(IDENT_ALUNO) IS NULL THEN ' ' ELSE TO_CHAR(IDENT_ALUNO) END AS IDENT_ALUNO
    ,CASE WHEN NOME_ALUNO IS NULL THEN ' ' ELSE NOME_ALUNO END AS NOME_ALUNO
    ,CASE WHEN TO_CHAR(IDENT_PROFESSOR) IS NULL THEN ' ' ELSE TO_CHAR(IDENT_PROFESSOR) END AS IDENT_PROFESSOR
    ,CASE WHEN NOME_PROFESSOR IS NULL THEN ' ' ELSE NOME_PROFESSOR END AS NOME_PROFESSOR
FROM 
	(SELECT 
        ALUNO.RA AS IDENT_ALUNO
		, ALUNO.NOME AS NOME_ALUNO
		, RANK() OVER (ORDER BY RA) AS IDENTIFICADOR_ALUNO 
	FROM 
		ALUNO 
	WHERE   
		CIDADE = 'SAO PAULO')
FULL JOIN 
	(SELECT 
        PROFESSOR.COD_PROF AS IDENT_PROFESSOR
		, PROFESSOR.NOME AS NOME_PROFESSOR
		, RANK() OVER (ORDER BY COD_PROF) AS IDENTIFICADOR_PROFESSOR 
	FROM 
		PROFESSOR 
	WHERE 
		CIDADE = 'SAO PAULO')
ON 
	IDENTIFICADOR_ALUNO = IDENTIFICADOR_PROFESSOR;

@Bruno_23

Amigo, essa deu trabalho hem!!
O Mysql não suporta alguns funções que outros banco de dados suportam (rank(), full outer join e etc.)

Tive que trabalha com tabelas temporárias o resultado foi este:

ATENÇÃO:

Lembre-se sempre que pelo fato de não ter a função full outer, você terá sempre que colocar o join em função da tabela com a maior quantidade de registros. Neste exemplo foi a de professor.

QUERY:

CREATE TEMPORARY TABLE CURSO.PROF_TEMP
	SELECT 
	        PROFESSOR.COD_PROF AS IDENT_PROFESSOR
			, PROFESSOR.NOME AS NOME_PROFESSOR
			, @CURRANK := @CURRANK + 1 AS IDENTIFICADOR_PROFESSOR 
		FROM 
			CURSO.PROFESSOR PROFESSOR, (SELECT @CURRANK := 0) R
		WHERE 
			CIDADE = 'SAO PAULO';
            

CREATE TEMPORARY TABLE CURSO.ALUNO_TEMP
	SELECT 
			ALUNO.RA AS IDENT_ALUNO
			, ALUNO.NOME AS NOME_ALUNO
			, @CURRANK := @CURRANK + 1 AS IDENTIFICADOR_ALUNO
		FROM 
			CURSO.ALUNO ALUNO, (SELECT @CURRANK := 0) R
	WHERE   
			ALUNO.CIDADE = 'SAO PAULO';
            
            
SELECT 
	CASE WHEN IDENT_ALUNO IS NULL THEN ' ' ELSE IDENT_ALUNO END AS IDENT_ALUNO
    ,CASE WHEN NOME_ALUNO IS NULL THEN ' ' ELSE NOME_ALUNO END AS NOME_ALUNO
    ,CASE WHEN IDENT_PROFESSOR IS NULL THEN ' ' ELSE IDENT_PROFESSOR END AS IDENT_PROFESSOR
    ,CASE WHEN NOME_PROFESSOR IS NULL THEN ' ' ELSE NOME_PROFESSOR END AS NOME_PROFESSOR

FROM ALUNO_TEMP
RIGHT JOIN PROF_TEMP
ON IDENTIFICADOR_ALUNO=IDENTIFICADOR_PROFESSOR;

--SELECT * FROM ALUNO_TEMP;
--SELECT * FROM PROF_TEMP;

--DROP TABLE CURSO.PROF_TEMP;
--DROP TABLE CURSO.ALUNO_TEMP;

A BASE DE DADOS CRIADA:

CREATE SCHEMA CURSO;

CREATE TABLE CURSO.ALUNO(
RA INTEGER,
NOME VARCHAR(200),
ENDERECO VARCHAR(200),
CIDADE VARCHAR(200));

CREATE TABLE CURSO.PROFESSOR(
COD_PROF INTEGER,
NOME VARCHAR(200),
ENDERECO VARCHAR(200),
CIDADE VARCHAR(200));

SELECT * FROM CURSO.ALUNO;
SELECT * FROM CURSO.PROFESSOR;

--TRUNCATE TABLE CURSO.PROFESSOR;
--TRUNCATE TABLE CURSO.ALUNO;


INSERT INTO CURSO.ALUNO (RA, NOME, ENDERECO, CIDADE) VALUES(1,'FELIPE','RUA MATARARA','SAO PAULO');
INSERT INTO CURSO.ALUNO (RA, NOME, ENDERECO, CIDADE) VALUES(2,'DAVRA','RUA SAO JOAO','RIO DE JANEIRO');
INSERT INTO CURSO.ALUNO (RA, NOME, ENDERECO, CIDADE) VALUES(3,'JHON','RUA JOANA DARK','SAO PAULO');
INSERT INTO CURSO.ALUNO (RA, NOME, ENDERECO, CIDADE) VALUES(4,'CARLOS','RUA JESUS DE NAZARE','ACRE');
INSERT INTO CURSO.ALUNO (RA, NOME, ENDERECO, CIDADE) VALUES(5,'MARIA','AVENRAA DOS PASSOS','AMAZONAS');
INSERT INTO CURSO.ALUNO (RA, NOME, ENDERECO, CIDADE) VALUES(6,'JOANA','AVENRAA DO CARMO','RIO GRANDE DO SUL');
INSERT INTO CURSO.ALUNO (RA, NOME, ENDERECO, CIDADE) VALUES(7,'JOAQUIM','RUA JOAO BRASIL','SAO PAULO');
INSERT INTO CURSO.ALUNO (RA, NOME, ENDERECO, CIDADE) VALUES(8,'LUISA','RUA LILIAN LEMOS MERCADETTE','ESPIRITO SANTO');
INSERT INTO CURSO.ALUNO (RA, NOME, ENDERECO, CIDADE) VALUES(9,'JOYCE','RUA AMAZONAS','SAO PAULO');

INSERT INTO CURSO.PROFESSOR (COD_PROF, NOME, ENDERECO, CIDADE) VALUES(1,'JOSE','RUA PIAUI','SAO PAULO');
INSERT INTO CURSO.PROFESSOR (COD_PROF, NOME, ENDERECO, CIDADE) VALUES(2,'JOAO','RUA SAO JOAO','RIO DE JANEIRO');
INSERT INTO CURSO.PROFESSOR (COD_PROF, NOME, ENDERECO, CIDADE) VALUES(3,'MARIA','RUA SAO PAULO','SAO PAULO');
INSERT INTO CURSO.PROFESSOR (COD_PROF, NOME, ENDERECO, CIDADE) VALUES(4,'JESUS','RUA RIO DE JANEIRO','ACRE');
INSERT INTO CURSO.PROFESSOR (COD_PROF, NOME, ENDERECO, CIDADE) VALUES(5,'MADALENA','AVENIDA OSWALDO CRUZ','AMAZONAS');
INSERT INTO CURSO.PROFESSOR (COD_PROF, NOME, ENDERECO, CIDADE) VALUES(6,'JONATHAN','AVENIDA NITEROI','RIO GRANDE DO SUL');
INSERT INTO CURSO.PROFESSOR (COD_PROF, NOME, ENDERECO, CIDADE) VALUES(7,'JUDAS','RUA SAO GONCALO','SAO PAULO');
INSERT INTO CURSO.PROFESSOR (COD_PROF, NOME, ENDERECO, CIDADE) VALUES(8,'PAULO','RUA RIO BRANCO','ESPIRITO SANTO');
INSERT INTO CURSO.PROFESSOR (COD_PROF, NOME, ENDERECO, CIDADE) VALUES(10,'PEDRO','RUA NILO PECANHA','SAO PAULO');
INSERT INTO CURSO.PROFESSOR (COD_PROF, NOME, ENDERECO, CIDADE) VALUES(11,'ANDRE','RUA SETE DE SETEMBRO','SAO PAULO');
INSERT INTO CURSO.PROFESSOR (COD_PROF, NOME, ENDERECO, CIDADE) VALUES(12,'BARTOLOMEU','RUA PRIMEIRO DE JANEIRO','PARA');
INSERT INTO CURSO.PROFESSOR (COD_PROF, NOME, ENDERECO, CIDADE) VALUES(13,'FELIPE','RUA 21 DE JULHO','SAO PAULO');
INSERT INTO CURSO.PROFESSOR (COD_PROF, NOME, ENDERECO, CIDADE) VALUES(14,'TOME','RUA TRINTA E UM DE DEZEMBRO','GOIAS');
INSERT INTO CURSO.PROFESSOR (COD_PROF, NOME, ENDERECO, CIDADE) VALUES(15,'SIMAO','RUA BOLSONARO','AMAPA');
INSERT INTO CURSO.PROFESSOR (COD_PROF, NOME, ENDERECO, CIDADE) VALUES(16,'TIAGO MAIOR','RUA DR ENEAS','SAO PAULO');
INSERT INTO CURSO.PROFESSOR (COD_PROF, NOME, ENDERECO, CIDADE) VALUES(17,'TIAGO MENOR','RUA CUTURUVI','ALAGOAS');

Select
tab1.,
tab2.

From
(
Tab1 full outer join on (tab1.Id = tab2.Id)
)

-------- ou
Select
tab1.,
tab2.

From
(
Tab1 left outer join on (tab1.Id = tab2.Id)
)

Testei o código mas não exibiu todos os resultados, tipo tenho 5 alunos e 8 professor que são de SP. Só conseguiu reproduzir 5-5.

Amigo, coloquei aqui o select do ALUNO_TEMP e PROF_TEMP. Assim terei mais conteúdo para poder te auxiliar.

SELECT * FROM ALUNO_TEMP;
SELECT * FROM PROF_TEMP;

Atenciosamente,

Felipe Cabral.

Não foi ainda!