Índice
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
função agregada
inquérito direto
SELECT COUNT(*) FROM Students;
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
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;
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
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;
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.
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.
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.
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.
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;
O valor de CouseID é definido como metade do valor de StudentID
update Students set CourseID = StudentID/2
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;
Relate um erro! ! ! Você sabe por quê? Geralmente, a sintaxe de erro é um problema com caracteres chineses.
Students as S,Courses as C 这个逗号是中文字符,改成英文字符后运行成功啦
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;
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;
Modifique a tabela Alunos, deixe 5 e 6 selecionar o curso 1 e junte-se novamente à consulta.
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.
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.
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