Exercícios de instrução básica de SQL

O objetivo principal é fazer um resumo preliminar de algumas instruções SQL encontradas com frequência. Você pode verificar o grau de aprendizado de sql e consolidar e fortalecer ainda mais a instrução SQL.

Pronto para trabalhar

  • Primeiro, você precisa criar quatro tabelas, a saber: aluno (tabela do aluno), professor (tabela do professor), pontuação (tabela de pontuação), curso (tabela do curso)
  • SQL de criação de tabela e predefinição de dados inicial
  • aluna:
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for student
-- ----------------------------
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student`  (
  `stuNo` int(10) NOT NULL,
  `stuName` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
  `stuSex` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
  `stuAge` int(255) DEFAULT NULL,
  PRIMARY KEY (`stuNo`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of student
-- ----------------------------
INSERT INTO `student` VALUES (1, '张一', '男', 15);
INSERT INTO `student` VALUES (2, '张二', '女', 35);
INSERT INTO `student` VALUES (3, '张三', '女', 27);
INSERT INTO `student` VALUES (4, '张四', '男', 15);

SET FOREIGN_KEY_CHECKS = 1;
  • professora:
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for teacher
-- ----------------------------
DROP TABLE IF EXISTS `teacher`;
CREATE TABLE `teacher`  (
  `teaNo` int(11) NOT NULL,
  `teaName` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
  PRIMARY KEY (`teaNo`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of teacher
-- ----------------------------
INSERT INTO `teacher` VALUES (1, '孙一');
INSERT INTO `teacher` VALUES (2, '孙二');

SET FOREIGN_KEY_CHECKS = 1;
  • pontuação:
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for score
-- ----------------------------
DROP TABLE IF EXISTS `score`;
CREATE TABLE `score`  (
  `id` int(11) NOT NULL,
  `stuNo` int(11) DEFAULT NULL,
  `cNo` int(11) DEFAULT NULL,
  `score` int(255) DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of score
-- ----------------------------
INSERT INTO `score` VALUES (1, 1, 1, 60);
INSERT INTO `score` VALUES (2, 1, 2, 25);
INSERT INTO `score` VALUES (3, 1, 3, 56);
INSERT INTO `score` VALUES (4, 1, 4, 100);
INSERT INTO `score` VALUES (5, 1, 5, 63);
INSERT INTO `score` VALUES (6, 2, 1, 5);
INSERT INTO `score` VALUES (7, 2, 2, 29);
INSERT INTO `score` VALUES (8, 2, 3, 59);
INSERT INTO `score` VALUES (9, 2, 4, 60);
INSERT INTO `score` VALUES (10, 2, 5, 65);
INSERT INTO `score` VALUES (11, 3, 1, 60);
INSERT INTO `score` VALUES (12, 3, 2, 100);
INSERT INTO `score` VALUES (13, 3, 3, 88);
INSERT INTO `score` VALUES (14, 3, 4, 75);
INSERT INTO `score` VALUES (15, 3, 5, 65);
INSERT INTO `score` VALUES (16, 4, 1, 60);
INSERT INTO `score` VALUES (17, 4, 2, 57);
INSERT INTO `score` VALUES (18, 4, 3, 86);
INSERT INTO `score` VALUES (19, 4, 4, 73);
INSERT INTO `score` VALUES (20, 4, 5, 62);

SET FOREIGN_KEY_CHECKS = 1;
  • curso:
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for course
-- ----------------------------
DROP TABLE IF EXISTS `course`;
CREATE TABLE `course`  (
  `cNo` int(11) NOT NULL,
  `cName` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
  `cTeacher` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
  PRIMARY KEY (`cNo`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of course
-- ----------------------------
INSERT INTO `course` VALUES (1, '数学', '1');
INSERT INTO `course` VALUES (2, '语文', '1');
INSERT INTO `course` VALUES (3, '英语', '2');
INSERT INTO `course` VALUES (4, '美术', '2');
INSERT INTO `course` VALUES (5, '音乐', '2');

SET FOREIGN_KEY_CHECKS = 1;

Descrição da tabela

Os atributos das quatro tabelas criadas acima são explicados.

  • Tabela do aluno: os quatro principais atributos StuNo (chave primária) número do aluno do aluno, nome do aluno nome do aluno, sexo do aluno do stuSex, idade do aluno
    imagem
  • professor professor tabela: principalmente dois atributos: teaNo (chave primária) o número do trabalho do professor, teaName o nome do professor
    imagem
  • Tabela de pontuação: Existem principalmente quatro atributos: id (chave primária), stuNo (associado à tabela do aluno) número do aluno, cNo (associado ao currículo) número do curso, pontuação
    imagem
  • tabela do curso do curso: cNo (chave primária) número do curso, cName nome do curso, cTeacher (associado à tabela do professor) número do trabalho do professor
    imagem

Exercícios de instrução SQL clássicos

É recomendável que você tente resolvê-lo sozinho primeiro e, em seguida, observe a análise e o código específico quando encontrar dificuldades. Se você tiver ideias melhores ou opiniões diferentes, fique à vontade para discutir na área de comentários.

  • Consultar o ID do aluno de todos os alunos cujas notas no curso "1" são superiores às do curso "2"
select a.stuNo from score a,score b where a.cNo='1'and b.cNo='2' and  a.stuNo=b.stuNo and a.score>b.score;

Isso é relativamente simples: ele lê principalmente dados de duas tabelas e pesquisa o mesmo número de aluno.

  • Consulte a ID do aluno e a pontuação média dos alunos com uma pontuação média superior a 60 pontos
select stuNo,AVG(score) from score group by stuNo  having avg(score)>60  ;

Primeiro use a função AVG para obter a média e, em seguida, use agrupar por para agrupar

  • Consulte a ID do aluno, o nome, o número de cursos e a pontuação total de todos os alunos
select a.stuNo,a.stuName,count(cNo),sum(score) from student a,score b  where a.stuNo=b.stuNo  group by a.stuNo,a.stuName  ;

Semelhante ao anterior, use principalmente a contagem para contar e a soma para a soma

  • Consulte o número de professores com o sobrenome "Sol"
SELECT count(teaName) ,'孙'as 'Name'from teacher WHERE teaName like '孙%'

Use principalmente como consulta semelhante, e use% para adaptação e use como para exibir

  • Consulte a carteira de alunos e o nome dos alunos que não cursaram a classe de "Sun Yi"
select stuName from student where stuNo not in (select stuNo from score where cNo in(select a.cNo from course a,teacher b where b.teaNo=a.cTeacher and b.teaName ='孙一'))

É dividido principalmente em três etapas: primeiro consulte quais lições Sun Yi ensina, depois use em para consultar quais alunos fizeram esses cursos e, em seguida, use não em para consultar os alunos que não estão incluídos neles.

  • Consulte a ID do aluno e o nome de todos os alunos cujas notas do curso número "2" sejam inferiores às do curso número "1"
方法一:
SELECT a.stuNo,a.stuName from student a,score b ,score c WHERE a.stuNo=b.stuNo and a.stuNo=c.stuNo and b.cNo='2'and c.cNo='1'and b.score <  c.score;
方法二:
select stuNo,stuName from student  where stuNo in   (select a.stuNo from score a,score b  where a.cNo='1' and b.cNo='2' and a.stuNo=b.stuNo and a.score>b.score)

O primeiro método é semelhante ao primeiro. É apenas para comparar os resultados

O segundo método é mudar o texto para operar

  • Consulte a identificação do aluno e o nome dos alunos que não cursaram todos os cursos
SELECT  a.stuNO,a.stuName FROM student a, score b WHERE a.stuNo=b.stuNo  group by b.stuNo having count(b.cNo)<(select count(cNo) from course)

É para comparar o número total de cursos selecionados pelos alunos com o número total de cursos,

  • Consulte a ID do aluno e o nome de pelo menos um curso que seja igual ao do aluno cuja ID do aluno é "1"
select distinct a.stuNo,stuName from student a,score b  where a.stuNo=b.stuNo and cNo in (select cNo from score where stuNo='1')

Primeiro descubra os cursos escolhidos pelo aluno com o aluno número um e, em seguida, pesquise

  • Consulte as pontuações mais altas e mais baixas de cada disciplina: exiba no seguinte formato: ID do curso, maior pontuação, menor pontuação
select  cNo,max(score) as 最高分,min(score) as 最低分 from score  group by cNo
  • Exclua as notas "1" do curso de "2" colegas de classe
delete from score where stuNo='2' and cNo='1'
  • Consultar as informações de outros alunos que estão cursando os mesmos cursos que os alunos com "01"
SELECT * from student WHERE stuNo in (SELECT  stuNo FROM score WHERE cNo in(SELECT distinct cNo FROM score WHERE stuNo='01')and stuNo<>'01'GROUP BY stuNo having count(cNo)>=4);
  • Consulte a identificação do aluno, o nome e a nota média dos alunos que reprovaram em dois ou mais cursos
select a.stuNo,a.stuName,b.平均成绩 FROM student a right join (select stuNo,AVG(score)平均成绩 from score where score<60 group by stuNo having COUNT(score)>=2)b on a.stuNo=b.stuNo;
  • Consulte a pontuação mais alta, a pontuação mais baixa e a pontuação média de cada assunto: exiba na seguinte forma: ID do curso, nome do curso, pontuação mais alta, pontuação mais baixa, pontuação média, taxa de aprovação, taxa média, taxa excelente, aprovação de taxa excelente> = 60 , Moderado: 70-80, Excelente: 80-90, Excelente:> = 90
select distinct A.cNo,cName,最高分,最低分,平均分,及格率,中等率,优良率,优秀率 from score A
left join Course on A.cNo=course.cNo
left join (select cNo,MAX(score)最高分,MIN(score)最低分,AVG(score)平均分 from score group by cNo)B on A.cNo=B.cNo
left join (select cNo,(((sum(case when score>=60 then 1 else 0 end)*1.00)/COUNT(*))*100)及格率 from score group by cNo)C on A.cNo=C.cNo
left join (select cNo,(((sum(case when score >=70 and score<80 then 1 else 0 end)*1.00)/COUNT(*))*100)中等率 from score group by cNo)D on A.cNo=D.cNo
left join (select cNo,(((sum(case when score >=80 and score<90 then 1 else 0 end)*1.00)/COUNT(*))*100)优良率 from score group by cNo)E on A.cNo=E.cNo
left join (select cNo,(((sum(case when score >=90 then 1 else 0 end)*1.00)/COUNT(*))*100)优秀率 
from score group by cNo)F on A.cNo=F.cNo
  • Classifique pela pontuação de cada disciplina e exiba a classificação. Se a pontuação se repetir, a vaga será reservada (não reservada)
保留
select *,RANK()over(order by score desc)排名 from score;
不保留
select *,DENSE_RANK()over(order by score desc)排名 from score
  • Consulte a pontuação total do aluno e classifique-a. Se a pontuação total se repetir, a classificação permanecerá vaga
select *,RANK()over(order by 总成绩 desc)排名 from(
select stuNo,SUM(score)总成绩 from score group by stuNo)A
  • Consulte os três principais registros de cada assunto
select * from(select *,rank()over (partition by stuNo order by score desc)A from score)B where B.A<=3
select * from score a where (select COUNT(*) from score where cNo=a.cNo and score>a.score)<3 order by a.cNo,a.score desc

Como melhorar a eficiência da pesquisa SQL

  • Tente evitar o uso de * na cláusula select

    • Além disso, select * é usado para conexão multi-mesa, o que causará maior sobrecarga de custo
  • A cláusula where compara o lado esquerdo do símbolo para evitar a função e move-o para a direita

  • Tente evitar usar em e não em

  • Tente evitar o uso de ou e use união em vez disso

  • Faça bom uso da cláusula limit para limitar o número de linhas de dados retornados

Se você estiver interessado, haverá vários artigos otimizados para sql no acompanhamento.

Finalmente

  • Se você sentir que é recompensado após lê-lo, espero que me dê um sinal de positivo. Essa será a maior motivação para me atualizar. Obrigado pelo seu apoio.
  • Sejam todos bem-vindos, prestem atenção à minha conta pública [Java Fox], com foco no conhecimento básico de java e informática, prometo deixar vocês obterem algo depois de lê-lo, se não acreditam em mim, me bata
  • Se você tiver opiniões ou sugestões diferentes após a leitura, por favor, comente e compartilhe conosco. Obrigado pelo seu apoio e amor.

imagem

Acho que você gosta

Origin blog.csdn.net/issunmingzhi/article/details/110918192
Recomendado
Clasificación