Instruções de consulta avançada SQL do banco de dados: consulta de agregação, consulta de múltiplas tabelas, consulta de junção

Criar tabela de alunos

Criar tabelas de Alunos e Cursos

CREATE TABLE Students (
    StudentID int PRIMARY KEY,
    Name varchar(255),
    Gender varchar(1),
    Age int,
    City varchar(255)
);
INSERT INTO Students VALUES(1, 'David', 'M', 21, 'Shanghai');
INSERT INTO Students VALUES(2, 'Kevin', 'M', 19, 'Beijing');
INSERT INTO Students VALUES(3, 'Emily', 'F', 22, 'Shanghai');
INSERT INTO Students VALUES(4, 'William', 'M', 20, 'New York City');
INSERT INTO Students VALUES(5, 'Alice', 'F', 19, 'Los Angeles');
INSERT INTO Students VALUES(6, 'Frank', 'F', 22, 'Los Angeles');
CREATE TABLE Courses (
    CourseID int PRIMARY KEY,
    CourseName varchar(255)
);
INSERT INTO Courses VALUES(1, 'CS101');
INSERT INTO Courses VALUES(2, 'CS202');
INSERT INTO Courses VALUES(3, 'EE101');

Consulta de agregação

Insira a descrição da imagem aqui

função agregada

inquérito direto

SELECT COUNT(*) FROM Students;

Insira a descrição da imagem aqui

Configurar consulta de alias

SELECT COUNT(*) AS StudentsNum FROM Students;

Definir consulta condicional

Usar COUNT(*) tem o mesmo efeito que COUNT(StudentID), porque StudentID é a chave primária e a chave primária de cada linha é diferente. Além disso, ainda podemos usar a cláusula WHERE na consulta de agregação. Por exemplo, se quisermos encontrar o número de alunos com idade superior a 20 anos , podemos usar a seguinte instrução SQL:

SELECT COUNT(*) FROM Students AS s WHERE s.age > 20; 

Funções agregadas comumente usadas

Descrição da função
SUM Calcula a soma de uma coluna, a coluna deve ser do tipo numérico
AVG Calcula a média de uma coluna, a coluna deve ser do tipo numérico
MAX Calcula o valor máximo de uma coluna
MIN Calcula o valor mínimo de uma coluna

Consultar a idade média dos alunos

SELECT AVG(Age) FROM Students;

Use a função agregada do AVG
Insira a descrição da imagem aqui

Consulta de grupo

Campo únicoAgrupar por

Agrupar os alunos de acordo com a cidade, e precisar consultar quantos alunos há em cada cidade

SELECT City, COUNT(*) FROM Students GROUP BY City;

Insira a descrição da imagem aqui

Consulta do grupo de relatórios de erros

Se Nome também for colocado no resultado da consulta, será reportado um erro, pois pode haver muitos alunos da mesma cidade com nomes diferentes, portanto a seguinte afirmação é ilegal:

SELECT City, COUNT(*), Name FROM Students GROUP BY City;

A mensagem de erro é a seguinte: A
Insira a descrição da imagem aqui
expressão nº 3 da lista SELECT não está na cláusula GROUP BY e contém uma coluna não agregada "tuling.Students.Name", que não é funcionalmente dependente das colunas da cláusula GROUP BY; isso é o mesmo que sql_mode= only_full_group_by não é compatível.

#3 refere-se à coluna Nome

Consulta de grupo com vários campos

GROUP BY também pode colocar vários campos. Por exemplo, se quisermos agrupar os alunos primeiro por cidade e depois por gênero , podemos usar a seguinte instrução:

SELECT City, Gender, COUNT(*) FROM Students GROUP BY City, Gender;

Insira a descrição da imagem aqui
Na tabela de alunos, as duas pessoas em Los Angeles têm o mesmo gênero, a exibição do grupo é F e a contagem é 2.
Insira a descrição da imagem aqui
Agora mudo o gênero de uma delas para M. O resultado da consulta mudará?

Foram distinguidos aqueles com a mesma localização, mas de gêneros diferentes.
Insira a descrição da imagem aqui
Pode-se observar que o Los Angeles original era 2, mas agora se tornou dois 1, e os gêneros M e F são diferenciados.
Insira a descrição da imagem aqui

consulta multi-tabela

Além de consultar dados de uma única tabela, as consultas SELECT também podem consultar dados de diversas tabelas. A sintaxe é a seguinte:

inquérito direto

SELECT * FROM Students, Courses;

O resultado da consulta é o produto cartesiano das duas tabelas

Supondo que Alunos tenha 5 colunas e 7 linhas, e Cursos tenha 2 colunas e 3 linhas, o resultado é uma tabela bidimensional com 21 (3 * 7) linhas e 7 (5 + 2) colunas, ou seja, Alunos Cada linha da tabela é emparelhado com cada linha da tabela Cursos. O número de colunas no conjunto de resultados será a soma do número de colunas nas duas tabelas e o número de linhas será o produto do número de linhas nas duas tabelas.
Insira a descrição da imagem aqui

Renomear consulta

Às vezes, duas tabelas podem ter campos com o mesmo nome e o resultado será confuso. Podemos usar AS como alias dos campos para distingui-los. Por exemplo, use a seguinte instrução para renomear StudentID e CourseID para StudentId e CourseId:

SELECT Students.StudentID AS StudentId, Courses.CourseID AS CourseId FROM Students, Courses;

A sintaxe para alias de um campo é semelhante a nome_da_coluna AS new_column_name.A instrução acima cria o alias de StudentID e CoursesID respectivamente, StudentId e CourseId, embora neste exemplo apenas alteremos a última letra D para minúscula. Mas considere outra situação: assumindo que os campos-chave primários de Alunos e Cursos são ambos chamados de ID, então este alias é muito útil. Podemos usar a seguinte declaração para tornar os resultados da consulta mais claros:

SELECT Students.ID AS StudentId, Courses.ID AS CourseId FROM Students, Courses;

Além de criar um alias para o campo de saída, também é útil criar um alias para a tabela. A sintaxe é semelhante ao nome_da_tabela AS alias. Podemos escrever a instrução acima da seguinte forma:

SELECT S.ID AS StudentId, C.ID AS CourseId FROM Students AS S, Courses AS C;

Crie uma nova coluna CourseID na tabela Alunos

Em consultas multitabelas, a cláusula WHERE ainda pode ser usada. Para ajudar todos a entenderem o conteúdo a seguir, precisamos adicionar um novo campo CourseID aos Alunos, que representa o curso escolhido por este aluno:

Crie uma nova coluna de CourseID após City

alter table Students add column CourseID int(4) not null after City;

Insira a descrição da imagem aqui
O valor de CouseID é definido como metade do valor de StudentID

update Students set CourseID = StudentID/2

Insira a descrição da imagem aqui

Consultar StudentID e o nome do curso correspondente

SELECT S.StudentID,C.CourseName 
FROM Students AS S,Courses AS C
WHERE S.CourseID = C.CourseID;

Insira a descrição da imagem aqui
Relate um erro! ! ! Você sabe por quê? Geralmente, a sintaxe de erro é um problema com caracteres chineses.

Students as S,Courses as C 这个逗号是中文字符,改成英文字符后运行成功啦

Insira a descrição da imagem aqui
Além da cláusula WHERE, outras cláusulas semelhantes a ORDER BY e GROUP BY também são adequadas para consultas multitabelas.

Além da cláusula WHERE, outras cláusulas semelhantes a ORDER BY e GROUP BY também são adequadas para consultas multitabelas.

Consulta de conexão (JOIN)

JUNÇÃO INTERNA

A consulta de junção é outro tipo de consulta de múltiplas tabelas. A consulta de junção executa a operação JOIN em várias tabelas. Ou seja, primeiro determine uma tabela principal como o conjunto de resultados e, em seguida, "incorpore" seletivamente os registros de outras tabelas no conjunto de resultados da tabela principal.

Suponha que queiramos saber o nome do curso escolhido por cada aluno. Além da consulta multitabela mais a cláusula WHERE mencionada acima, também podemos utilizar a cláusula INNER JOIN:

SELECT S.StudentID, C.CourseName 
FROM Students AS S 
INNER JOIN Courses AS C ON S.CourseID = C.CourseID;

Insira a descrição da imagem aqui
Esta instrução pode consultar cada StudentID e seu nome de curso correspondente. Observe que o processo de execução interna da instrução INNSER JOIN é o seguinte:

  • 1 Determine a tabela principal, use FROM table_name
  • 2 Em seguida, confirme a tabela conectada e use INNER JOIN table_name
  • 3 Determine as condições de conexão e use a condição ON. A condição da instrução acima é S.CourseID = C.CourseID
  • 4 Por fim, podemos adicionar: WHERE, ORDER BY e outras cláusulas.Além
    de INNER JOIN, também temos LEFT JOIN, RIGHT JOIN e FULL JOIN.

Suplemento: Aliases não são necessários, apenas para aumentar a legibilidade.

JUNTE-SE À DIREITA, JUNTE-SE À ESQUERDA

Se mudarmos a instrução para RIGHT JOIN:

SELECT S.StudentID, C.CourseName
FROM Students AS S 
RIGHT JOIN Courses AS C ON S.CourseID = C.CourseID;

Insira a descrição da imagem aqui

Modifique a tabela Alunos, deixe 5 e 6 selecionar o curso 1 e junte-se novamente à consulta.
Insira a descrição da imagem aqui
Após executar a instrução acima, se houver uma turma sem nenhum aluno ingressando, teremos um registro redundante com apenas CourseName no registro, mas StudentID é NULL.
Insira a descrição da imagem aqui
Porque isto é assim? INNER JOIN retornará dados que existem em duas tabelas ao mesmo tempo. Se os alunos tiverem os números de curso 1, 2, 3 e 5, e os cursos também tiverem os números de curso 1, 2, 3 e 4, então o resultado será sua interseção conjunto 1, 2 e 3. RIGHT JOIN retorna os registros que existem na tabela da direita. Se algumas linhas da tabela da direita não existirem na tabela da esquerda, essas linhas no resultado serão NULL.

E LEFT JOIN retornará os números que existem na tabela da esquerda. Se você adicionar CourseID=10 a Alunos, mesmo que não haja nenhum registro de curso com ID 10 na tabela Cursos, então o resultado de LEFT JOIN ainda terá mais uma linha de registros e o CourseName correspondente é NULL. (Suplemento: LEFT JOIN é chamado LEFT OUT JOIN em alguns bancos de dados. Da mesma forma, RIGHT JOIN também pode ser chamado RIGHT OUT JOIN.)

JUNTE-SE COMPLETO

O último tipo de JOIN é FULL JOIN. O conjunto de resultados selecionará todos os registros das duas tabelas e adicionará automaticamente as colunas que não existem nas duas tabelas a NULL.

Para ajudá-lo a entender a lógica das consultas de junção, você pode consultar as seguintes ilustrações: O círculo à esquerda pode ser entendido como a tabela da esquerda, e o círculo à direita pode ser entendido como a tabela da direita.
Insira a descrição da imagem aqui
O texto acima é o tutorial básico da sintaxe SQL. Agora você aprendeu como usar SQL para criar tabelas e registros e usar instruções SQL avançadas para realizar consultas complexas. No próximo capítulo, começaremos a aprender a usar o software de banco de dados real MySQL.

Trabalho de casa

Por favor, escreva uma instrução SQL para descobrir o número de alunos cujo CourseID é 1 e o nome do curso. Deve-se observar que estamos procurando apenas o número de alunos do sexo masculino com idade superior a 20 anos.

Método 1 usa Onde

SELECT COUNT(*) AS StudentsNum,CourseName 
FROM Students AS S,Courses AS C
WHERE S.CourseID = C.CourseID AND S.CourseID = 1 AND S.Age > 20 AND S.Gender = 'M';

Método 2 Agrupar por + onde

SELECT COUNT(*) AS StudentsNum, CourseName 
FROM Students LEFT JOIN Courses ON Students.CourseID = Courses.CourseID 
WHERE Students.Age > 20 AND Students.Gender = 'M'
GROUP BY Students.CourseID;

análise

  • 1 Determine a tabela principal, use FROM table_name
  • 2 Em seguida, confirme a tabela conectada e use INNER JOIN table_name
  • 3 Determine as condições de conexão e use a condição ON. A condição da instrução acima é S.CourseID = C.CourseID
  • 4 Por fim, podemos adicionar: WHERE, ORDER BY e outras cláusulas.Além
    de INNER JOIN, também temos LEFT JOIN, RIGHT JOIN e FULL JOIN.

referência

【Instruções de consulta avançada SQL: consulta de agregação, consulta de múltiplas tabelas, consulta de junção 【Tutorial SQL de banco de dados relacional 5】】 https://www.bilibili.com/video/BV1Zp4y1Q7mj/?share_source=copy_web&vd_source=fe6c23f6f1353ed1eff5d5e866171572

Acho que você gosta

Origin blog.csdn.net/qq_41398619/article/details/132263105
Recomendado
Clasificación