SQL面试50题 数据库准备(存储过程)
数据表关系图
数据表
CREATE TABLE `student` (`id` int(11) NOT NULL AUTO_INCREMENT,`name` varchar(255) NOT NULL,`sex` enum('female','male') NOT NULL,`birth` date NOT NULL,`credit` float(5,2) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=25 DEFAULT CHARSET=utf8;CREATE TABLE `teacher` (`id` int(11) NOT NULL,`name` varchar(255) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;CREATE TABLE `course` (`id` int(11) NOT NULL,`name` varchar(255) DEFAULT NULL,`tid` int(11) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;CREATE TABLE `score` (`sid` int(11) NOT NULL,`cid` int(11) NOT NULL,`score` float(5,2) DEFAULT NULL,PRIMARY KEY (`sid`,`cid`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
添加学生表数据
存储过程,添加 学生表(student
)
DELETE FROM student;
ALTER TABLE student AUTO_INCREMENT = 1;DROP TABLE IF EXISTS temp_stu;
CREATE TEMPORARY TABLE temp_stu(name VARCHAR(255)
);INSERT INTO `temp_stu` (`name`) VALUES ('张三'),('李四'),('王五'),('赵六'),('牛金霞'),('闫景立'),('孙浩'),('周莉'),('吴鹏'),('郑洁'),('陈婷婷'),('刘洋'),('高敏'),('黄磊'),('林静'),('郭涛'),('何婉如'),('梁志远'),('罗芳芳'),('谢霆锋'),('唐嫣'),('韩雪'),('冯小刚'),('程思远');DROP PROCEDURE IF EXISTS insert_student_records;DELIMITER //CREATE PROCEDURE insert_student_records()
BEGINDECLARE done INT DEFAULT FALSE;DECLARE student_name VARCHAR(255);DECLARE student_sex ENUM('female', 'male');DECLARE random_year INT;DECLARE random_month INT;DECLARE random_day INT;DECLARE days_in_month INT;DECLARE credit FLOAT(5,2);-- 声明游标DECLARE nameset CURSOR FOR SELECT name FROM temp_stu;-- 声明继续处理程序DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;OPEN nameset;read_loop: LOOPFETCH nameset INTO student_name;IF done THENLEAVE read_loop;END IF;SET student_sex = IF(RAND() < 0.5, 'female', 'male');-- 随机选择一个年份(1994, 1995, 1997, 1998, 1999)SET random_year = FLOOR(1 + RAND() * 5) + 1993; IF random_year = 1996 THENSET random_year = CASE FLOOR(RAND() * 4) + 1994 WHEN 1996 THEN 1994 + FLOOR(RAND() * 4) ELSE random_year - 1 END; END IF;SET random_month = FLOOR(1 + RAND() * 12);-- 计算该月的天数(考虑闰年)SET days_in_month = CASEWHEN (random_month = 2 AND (random_year % 4 = 0 AND (random_year % 100 != 0 OR random_year % 400 = 0))) THEN 29WHEN random_month IN (4, 6, 9, 11) THEN 30ELSE 31END;SET random_day = FLOOR(1 + RAND() * days_in_month);SET @birth_date = CONCAT(random_year, '-', LPAD(random_month, 2, '0'), '-', LPAD(random_day, 2, '0'));SET credit = CASE WHEN RAND() < 0.1 THEN 50 - 30 * RAND() WHEN RAND() < 0.7 THEN 50 + 30 * RAND()ELSE 80 + 20 * RAND() END;-- 插入到student表INSERT INTO student(name, sex, birth, credit) VALUES(student_name, student_sex, @birth_date, ROUND(credit, 2));END LOOP;CLOSE nameset;END //DELIMITER ;-- SHOW CREATE PROCEDURE insert_student_records;
CALL insert_student_records();DROP PROCEDURE IF EXISTS insert_student_records;
SELECT * FROM student;
其他表
-- 清理环境
DELETE FROM course;
DELETE FROM teacher;
DELETE FROM score;
DROP PROCEDURE IF EXISTS insert_course_records;
DROP PROCEDURE IF EXISTS insert_teacher_records;
DROP PROCEDURE IF EXISTS insert_score_records;DROP TABLE IF EXISTS temp_course;
CREATE TEMPORARY TABLE temp_course (value VARCHAR(255)
);-- 插入数据到临时表
INSERT INTO temp_course (value) VALUES ('语文'), ('数学'), ('英语'), ('政治'), ('地理'), ('历史'), ('物理'), ('化学'), ('生物'), ('C++'), ('Python'), ('机器学习'), ('强化学习'), ('自然语言处理'), ('关联规则挖掘');DROP TABLE IF EXISTS temp_teacher;
CREATE TEMPORARY TABLE temp_teacher (value VARCHAR(255)
);-- 插入数据到临时表
INSERT INTO temp_teacher (value) VALUES ('李明'), ('王芳'), ('张伟'), ('赵敏'), ('刘洋'), ('陈静'), ('周杰'), ('孙磊'),('徐丽'), ('朱强'), ('邓敏'), ('韩雪');DELIMITER //CREATE PROCEDURE insert_course_records()
BEGINDECLARE done INT DEFAULT FALSE;DECLARE course_id INT DEFAULT 1;DECLARE course_name VARCHAR(255);DECLARE course_num INT DEFAULT 15;DECLARE teacher_num INT DEFAULT 12;-- 声明游标DECLARE courseset CURSOR FOR SELECT value FROM temp_course;-- 声明继续处理程序DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;OPEN courseset;read_loop: LOOPFETCH courseset INTO course_name;IF done THENLEAVE read_loop;END IF;SET @teacher_id = CEILING(teacher_num * RAND());INSERT INTO course(id, name, tid) VALUES(course_id, course_name, @teacher_id);SET course_id = course_id +1;END LOOP read_loop;CLOSE courseset;END //CREATE PROCEDURE insert_teacher_records()
BEGINDECLARE done INT DEFAULT FALSE;DECLARE teacher_id INT DEFAULT 1;DECLARE teacher_name VARCHAR(255);DECLARE teacherset CURSOR FOR SELECT value FROM temp_teacher;DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;OPEN teacherset;read_loop: LOOPFETCH teacherset INTO teacher_name;IF done THENLEAVE read_loop;END IF;INSERT INTO teacher(id, name) VALUES(teacher_id, teacher_name);SET teacher_id = teacher_id + 1;END LOOP read_loop;CLOSE teacherset;END //CREATE PROCEDURE insert_score_records()
BEGINDECLARE student_num INT DEFAULT 24;DECLARE course_num INT DEFAULT 15;DECLARE student_id INT DEFAULT 1;DECLARE course_id INT DEFAULT 1;DECLARE score FLOAT(5,2);WHILE student_id <= student_num DOSET @temp_course_num = FLOOR(course_num / 3 * RAND());SET @course_idx = 1;WHILE @course_idx <= @temp_course_num DOSET course_id = CASE WHEN RAND() < 0.4 THEN @course_idxWHEN RAND() < 0.5 THEN FLOOR(course_num / 3) + @course_idxELSE FLOOR(course_num / 3 * 2) + @course_idxEND ;SET score = CASEWHEN RAND() < 0.3 THEN ROUND(50 - 20 * RAND(), 2)WHEN RAND() < 0.8 THEN ROUND(50 + 30 * RAND(), 2)ELSE ROUND(80 + 20 * RAND(), 2)END ;INSERT INTO score(sid,cid, score) VALUES(student_id, course_id, score);SET @course_idx = @course_idx + 1; END WHILE;SET student_id = student_id + 1;END WHILE;
END//DELIMITER ;CALL insert_course_records();
CALL insert_teacher_records();
CALL insert_score_records();DROP PROCEDURE IF EXISTS insert_course_records;
DROP PROCEDURE IF EXISTS insert_teacher_records;
DROP PROCEDURE IF EXISTS insert_score_records;SELECT * from course;
SELECT * from teacher;
SELECT * FROM score;
查询示例
- 查询
语文
成绩比数学
成绩高的学生
-- 第一题-查询课程编号为01的课程比02的课程成绩低的所有学生的学号(重要)SELECT id, name, a.score '语文' , b.score '数学' FROM student JOIN (SELECT sid, score FROM score WHERE cid = 1) a on id = a.sidJOIN (SELECT sid, score FROM score WHERE cid = 2) b on id = b.sidWHERE a.score < b.score;-- 第二题-查询平均成绩大于60分的学生的学号和平均成绩SELECT id, name, a.avg_score FROM studentRIGHT JOIN( SELECT sid , ROUND(AVG(score), 2) avg_score FROM scoreGROUP BY sidHAVING avg_score > 60) a on student.id = a.sid;-- 第三题-查询所有学生的学号、姓名、选课数、总成绩SELECT id, name, IF (ISNULL(a.selected_course),0,a.selected_course) '选课数', IF(ISNULL(a.sum_score),0,a.sum_score) '总成绩' FROM studentLEFT JOIN (SELECT sid, count(score) selected_course, SUM(score) sum_score FROM score GROUP BY sid) a on student.id = a.sid;-- 第四题-查询姓猴的老师的个数SELECT COUNT(*) FROM teacher WHERE `name` LIKE '朱%';-- 第五题-查询没学过张三老师课的学生的学号和姓名(重要)-- SELECT tid, temp.`name` ,GROUP_CONCAT(course.name) FROM course JOIN (SELECT * FROM teacher) temp ON course.tid = temp.id GROUP BY tid,temp.`name`;
-- 邓敏老师SELECT id, `name` FROM student WHERE id NOT IN (SELECT sid FROM score WHERE cid IN (SELECT id FROM course WHERE tid = (SELECT id from teacher WHERE `name` = '邓敏') )
);-- 学过邓敏课程的学生
SELECT id, name, score.cid FROM student JOIN score ON id = score.sidWHERE score.cid IN (SELECT id FROM course WHERE tid = (SELECT id FROM teacher WHERE `name` = '邓敏' ));SELECT id, name FROM student WHERE id NOT IN(-- 学过邓敏课程的学生 SELECT id FROM student JOIN score ON id = score.sidWHERE score.cid IN (SELECT id FROM course WHERE tid = (SELECT id FROM teacher WHERE `name` = '邓敏' ))
);-- 文心一言优化
SELECT s.id, s.name FROM student sWHERE s.id NOT IN (SELECT sc.sid FROM score scJOIN course c ON sc.cid = c.idJOIN teacher t ON c.tid = t.idWHERE t.name = '邓敏'
);-- 第六题-查询学过张三老师所教的所有课的同学的学号和姓名(重要)-- 查询所教的课程数目大于1的老师
SELECT teacher.`name` , GROUP_CONCAT(course.`name`) FROM teacher JOIN course on course.tid = teacher.idGROUP BY teacher.id, teacher.`name`HAVING COUNT(*) > 1;-- 查询所选的课程数目大于1的学生
SELECT student.`name`, GROUP_CONCAT(course.`name`) FROM studentJOIN score ON score.sid = student.idJOIN course ON course.id = score.cidGROUP BY student.id, student.`name`HAVING COUNT(*) > 1;-- 学过李明老师课程的学生
SELECT student.`name`, GROUP_CONCAT(course.`name`) AS '科目', GROUP_CONCAT(score.score) '成绩' FROM studentJOIN score ON student.id = score.sidJOIN course ON course.id = score.cidJOIN (SELECT * FROM teacher WHERE teacher.`name` = '李明') t ON t.id = course.tidGROUP BY student.id, student.`name`;-- 所有科目:通过数目进行判断
SELECT s.id, s.name FROM student sJOIN score sc ON s.id = sc.sidJOIN course c ON sc.cid = c.idJOIN (SELECT id FROM teacher WHERE `name` = '李明' ) t ON t.id = c.tidGROUP BY s.id, s.`name`HAVING COUNT(*) = (SELECT COUNT(*) FROM course JOIN (SELECT id FROM teacher WHERE `name` = '李明') t ON t.id = course.tid);-- 文心一言WITH Teacher AS (SELECT id FROM teacher WHERE `name` = '李明'
),
CoursesByTeacher AS (SELECT c.id AS cidFROM course cJOIN Teacher t ON c.tid = t.id
),
StudentCourseCounts AS (SELECT s.id AS sid, COUNT(sc.cid) AS course_countFROM student sJOIN score sc ON s.id = sc.sidJOIN CoursesByTeacher ct ON sc.cid = ct.cidGROUP BY s.id
),
TeacherCourseCount AS (SELECT COUNT(*) AS total_course_countFROM CoursesByTeacher
)
SELECT sc.sid AS id, s.name
FROM StudentCourseCounts sc
JOIN student s ON sc.sid = s.id
WHERE sc.course_count = (SELECT total_course_count FROM TeacherCourseCount);-- 第七题-查询学过编号为01的课程并且也学过编号为02的课程的学生的学号和姓名(重要)SELECT student.id, student.`name` FROM studentJOIN (SELECT sid FROM score WHERE cid = '1') a ON a.sid = student.idJOIN (SELECT sid FROM score WHERE cid = '2') b ON b.sid = student.id;-- 第七题-查询学过编号为01的课程或者学过编号为02的课程的学生的学号和姓名(重要)SELECT student.id, student.`name`,course.`name` FROM studentJOIN (SELECT sid,cid FROM score) a ON a.sid = student.idJOIN course ON course.id = a.cid WHERE cid = '1' OR cid = '2';SELECT student.id, student.`name`, a.`name` FROM studentJOIN (SELECT sid, course.`name` FROM score JOIN course ON course.id = score.cid WHERE cid = '1' OR cid = '2' ) a ON a.sid = student.id;-- 对一个学生有多门选课时,只显示一次名称-- 无法达成效果
-- DISTINCT关键字的使用方式有一点小瑕疵。在SQL中,DISTINCT是用来对整个结果集进行去重的,而不是单独对某一个字段进行去重。
SELECT DISTINCT(student.id), student.`name`, a.`name` FROM studentJOIN (SELECT sid, course.`name` FROM score JOIN course ON course.id = score.cid WHERE cid = '1' OR cid = '2' ) a ON a.sid = student.id;-- GROUP BY
SELECT DISTINCT(student.id), student.`name`, GROUP_CONCAT(a.`name`) '所选科目' FROM studentJOIN (SELECT sid, course.`name` FROM score JOIN course ON course.id = score.cid WHERE cid = '1' OR cid = '2' ) a ON a.sid = student.idGROUP BY student.id, student.`name`;-- 第八题-查询课程编号为02的总成绩SELECT course.id, course.`name` , SUM(score) FROM scoreJOIN course ON score.cid = course.idGROUP BY course.id,course.`name`;-- 第九题-查询所有课程成绩小于60分的学生的学号和姓名
SELECT student.id, student.`name`, GROUP_CONCAT(score.score SEPARATOR " ") '所有成绩' FROM studentJOIN score ON score.sid = student.idGROUP BY student.id, student.`name`;SELECT DISTINCT student.id,student.name FROM studentRIGHT JOIN score ON score.sid = student.idWHERE student.id NOT IN (SELECT student.id FROM student JOIN(SELECT sid FROM score WHERE score.score >= 60) a ON a.sid = student.id
);-- 文心一言
-- MAX 函数的使用, ok ...-- 不考虑没选课
SELECT student.id, student.name
FROM student
LEFT JOIN score ON student.id = score.sid
GROUP BY student.id, student.name
HAVING MAX(score.score) < 60;-- 没选课的学生
SELECT student.id, student.name
FROM student
LEFT JOIN score ON student.id = score.sid
GROUP BY student.id, student.name
HAVING COUNT(score.score) = 0;-- 考虑没有选课的学生
SELECT student.id, student.name
FROM student
LEFT JOIN score ON student.id = score.sid
GROUP BY student.id, student.name
HAVING COALESCE(MAX(score.score), -9999) < 60; -- 使用一个远低于任何可能分数的值(如-9999)作为没有分数时的默认值-- 第十课-查询没有学全所有课的学生的学号和姓名(重点)
-- 略过,GROUP BY 通过数目比对-- 第十一题-查询至少有一门课与学号为01的学生所学课程相同的学生的学号和姓名(重点)SELECT DISTINCT student.id, student.`name` FROM studentJOIN score ON student.id = score.sidWHERE score.cid in ( SELECT score.cid FROM score WHERE score.sid = 1 ) AND student.id <> 1;-- 第十二题-查询和01号同学所学课程完全相同的其他同学的学号 (重点)SELECT * FROM studentWHERE student.id IN (-- 选课数目与1号同学选课数目相同 SELECT score.sid FROM scoreGROUP BY score.sid HAVING COUNT(score.cid) = (SELECT COUNT(DISTINCT score.cid) FROM score WHERE score.sid = 12)) AND student.id NOT IN (-- 选择了1号同学不同的科目 SELECT score.sid FROM scoreWHERE score.cid NOT IN (SELECT score.cid FROM score WHERE score.sid = 12) )AND student.id != 12;-- 每位同学的选课情况
SELECT student.id, student.name, GROUP_CONCAT(course.`name` SEPARATOR " ") FROM student LEFT JOIN score ON score.sid = student.idJOIN course ON course.id = score.cidGROUP BY student.id, student.`name`;-- 每门课程的选课学生
SELECT course.id, course.`name`, GROUP_CONCAT(student.`name` SEPARATOR " ")FROM courseLEFT JOIN score ON score.cid = course.idJOIN student ON student.id = score.sidGROUP BY course.id, course.`name`;-- 第十五题-(13题前面有重复,14题没有)查询两门及其以上不及格课程的同学的学号姓名及其平均成绩(重点)SELECT student.id, student.name, ROUND(AVG(score.score), 2) FROM student JOIN score ON student.id = score.sidWHERE student.id IN (SELECT score.sid FROM score WHERE score.score < 60GROUP BY score.sidHAVING COUNT(score.score) >= 2)GROUP BY student.id;-- 第十六题-检索01课程分数小于60,按分数降序排列的学生信息
SELECT student.*, sc.score FROM studentRIGHT JOIN (SELECT sid, score FROM score WHERE score.cid = 1) sc ON sc.sid = student.idWHERE sc.score < 60ORDER BY sc.score DESC;-- 第十七题-(case when)按平均成绩从高到低显示所有学生的所有课程的成绩以及平均成绩(重点 )SELECT student.id, student.`name`, ROUND(AVG(COALESCE(score.score, 0)), 2) '平均成绩', GROUP_CONCAT(COALESCE(score.score, 0) SEPARATOR " 、 ") FROM studentLEFT JOIN score ON score.sid = student.idGROUP BY student.id, student.`name`;-- max 考虑补考情况,一门课两次成绩
SELECT student.id, student.`name`, ROUND(AVG(score.score), 2) '平均成绩', MAX(CASE WHEN score.cid = 1 THEN score.score ELSE NULL END) '语文',MAX(CASE WHEN score.cid = 2 THEN score.score ELSE NULL END) '数学', MAX(CASE WHEN score.cid = 3 THEN score.score ELSE NULL END) '英语' FROM student LEFT JOIN score ON score.sid = student.idGROUP BY student.id, student.`name`ORDER BY AVG(score.score) DESC;-- 第十八题-查询各科成绩最高分,最低分,平均分,及格率,中等率,优良率,优秀率(重点)SELECT course.`name`, MAX(score.score), MIN(score.score), AVG(score.score), COUNT(CASE WHEN score.score >= 60 THEN 1 ELSE NULL END) / COUNT(score.score) FROM scoreLEFT JOIN course ON course.id = score.cidGROUP BY score.cid, course.`name`;-- 查询中位数
-- 注意:这个查询是为了演示目的而编写的,并且可能不适用于所有数据库系统。
-- 它使用了字符串聚合来模拟成绩列表,这可能会导致性能问题和精度损失。
-- 在实际生产环境中,建议使用数据库特定的功能或临时表来计算中位数。-- TODO-- 第十九题-按各科成绩进行排序,并显示排名(row_number,rank,dense_rank)SELECT course.`name`, GROUP_CONCAT(score.score ORDER BY score.score) FROM studentLEFT JOIN score ON score.sid = student.idJOIN course ON course.id = score.cidGROUP BY score.cid, course.`name`-- ROW_NUMBER() 为每个学生的成绩分配一个唯一的序号,这个序号在每个课程内部是唯一的,并且是根据成绩降序排列的。
-- RANK() 如果有两个学生的成绩相同,他们将获得相同的排名,但下一个学生的排名将跳过(例如,1, 2, 2, 4)。
-- DENSE_RANK() 在这个排名中,如果有两个学生的成绩相同,他们将获得相同的排名,并且下一个学生的排名不会跳过(例如,1, 2, 2, 3)。-- 按个人征信credit对学生进行排名
SELECT ROW_NUMBER() over (ORDER BY credit DESC) , student.* FROM student; -- 分区函数 PARTITION BY
-- <窗口函数> over ( partition by<用于分组的列名> order by <用于排序的列名>)-- 窗口函数
-- 专用窗口函数: rank(), dense_rank(), row_number()
-- 聚合函数 : sum(), max(), min(), count(), avg() 等-- 专用窗口函数
-- over(partition by type order by price desc)
-- 先对 type 中相同的进行分区,在 type 中相同的情况下对 price 进行排序-- 每个学生的科目成绩排序
SELECT student.`name`, course.`name` '科目', RANK() over(PARTITION BY score.sid ORDER BY score.score DESC) '排名', score.score FROM student JOIN score ON score.sid = student.idJOIN course ON course.id = score.cid;-- 聚合函数作为窗口函数-- 窗口内的累计总分,实际使用场景???
-- TODO
SELECT student.`name`, course.`name` '科目', SUM(score.score) over(PARTITION BY score.sid ORDER BY score.score DESC) '排名', score.score FROM student JOIN score ON score.sid = student.idJOIN course ON course.id = score.cid;-- 科目名次
SELECT DENSE_RANK() OVER (PARTITION BY score.cid ORDER BY ROUND(score.score) DESC) '名次',course.name '科目', student.`name` '学生姓名', ROUND(score.score) '分数' FROM scoreJOIN course ON course.id = score.cidJOIN student ON student.id = score.sid;-- 第二十题-查询学生的总成绩并进行排名-- 平均成绩,总成绩科目数相差太多,无意义
SELECT RANK() over (ORDER BY AVG(score.score) DESC), student.`name`, AVG(score.score) AS avg_score FROM studentJOIN score ON score.sid = student.idGROUP BY score.sid, student.`name`ORDER BY avg_score DESC;-- 未选课视为0分
SELECT RANK() over (ORDER BY AVG(COALESCE(score.score, 0)) DESC), student.`name`, AVG(COALESCE(score.score, 0)) AS avg_score FROM studentLEFT JOIN score ON score.sid = student.idGROUP BY student.id, student.`name`ORDER BY avg_score DESC;-- 第二十一题-查询不同老师所教不同课程平均分从高到低显示SELECT teacher.`name`, AVG(CASE WHEN score.cid = 1 THEN score.score ELSE 0 END) '语文平均成绩', GROUP_CONCAT(DISTINCT(course.`name`)) , AVG(score.score) FROM teacherLEFT JOIN course ON course.tid = teacher.id JOIN score ON score.cid = course.idGROUP BY teacher.id, teacher.`name`, score.cid;-- 第二十二题-查询所有课程的成绩第2名到第3名的学生信息及该课程成绩(重点)
-- TODO
SELECT * FROM (SELECT RANK() over( PARTITION BY course.id ORDER BY score.score DESC) as rk, student.`name` as sname, course.`name` as cname, score.score FROM studentLEFT JOIN score ON score.sid = student.idJOIN course ON course.id = score.cid
) temp
WHERE temp.rk in (2,3);-- 第二十四题-查询学生平均成绩及其名次
SELECT ROW_NUMBER() over (ORDER BY rk.avg_sc DESC), rk.sname, rk.avg_sc FROM(SELECT student.`name` as sname, AVG(score.score) avg_sc FROM student LEFT JOIN score ON score.sid = student.idGROUP BY student.id, student.`name`ORDER BY avg_sc DESC) rk ;-- 第二十六题 -(第25题与第22题类似)查询每门课程被选修的学生数
SELECT course.`name`, COUNT(score.sid) FROM courseLEFT JOIN score ON score.cid = course.idGROUP BY course.id;-- 第二十七题 - 查询出只有两门课程的全部学生的学号和姓名SELECT student.`name`, GROUP_CONCAT(course.`name`) FROM studentJOIN score ON score.sid = student.idJOIN course ON course.id = score.cidGROUP BY score.sid, student.`name`HAVING COUNT(DISTINCT score.cid) = 2;-- 第二十八题 - 查询男生、女生人数SELECT student.sex, COUNT(student.id) FROM studentGROUP BY student.sex;-- 第二十九题-查询名字中含有风字的学生信息SELECT * FROM studentWHERE student.`name` LIKE '%雪%';-- 第三十一题-(30题没有)查询1990年出生的学生名单(重点)SELECT * FROM studentWHERE YEAR(birth) = 1994;-- 第三十二题-查询平均成绩大于等于85的所有学生的学号、姓名和平均成绩SELECT student.id, student.`name`, AVG(score.score) FROM studentLEFT JOIN score ON score.sid = student.idGROUP BY student.id, student.`name`HAVING AVG(score.score) > 70;-- 第三十三题-查询每门课程的平均成绩,结果按平均成绩升序排序,平均成绩相同时,按课程号降序排列SELECT course.`name`,AVG(score.score) AS avg_sc, score.cid FROM scoreLEFT JOIN course ON course.id = score.cidGROUP BY score.cid, course.`name`ORDER BY avg_sc ASC, score.cid DESC;-- 第三十四题-查询课程名称为数学,且分数低于60的学生姓名和分数SELECT * FROM student LEFT JOIN score ON score.sid = student.idWHERE score.cid = (SELECT course.id FROM course WHERE course.`name` = '数学') AND score.score < 60;-- 第三十五题-查询所有学生的课程及分数情况(重点)
-- 第三十六题-查询课程成绩在70分以上课程名称,分数和学生姓名
-- 第三十七题-查询不及格的课程并按课程号从大到小排列
-- 第三十八题-查询课程编号为03且课程成绩在80分以上的学生的学号和姓名
-- 第三十九题-求每门课程的学生人数-- 第四十题-查询选修张三老师所授课程的学生中成绩最高的学生姓名及其成绩SELECT * FROM studentJOIN score ON score.sid = student.idJOIN course ON course.id = score.cidWHERE course.tid = (SELECT id FROM teacher WHERE teacher.`name` = '赵敏')ORDER BY score.score;-- 好吧,一个老师一门课
SELECT teacher.id, GROUP_CONCAT(course.`name`) FROM teacherLEFT JOIN course ON course.id = teacher.idGROUP BY teacher.id;-- 第四十一题-查询不同课程成绩相同的学生的学生编号、课程编号、学生成绩SELECT ROUND(score.score),GROUP_CONCAT(course.`name`), GROUP_CONCAT(student.`name`) FROM studentLEFT JOIN score ON score.sid = student.idJOIN course ON course.id = score.cidGROUP BY ROUND(score.score)HAVING COUNT(DISTINCT score.cid) > 1;-- 第四十三题 -(42题有类似题)统计每门课程的学生选修人数
-- 第四十四题-检索至少选修两门课程的学生学号
-- 第四十五题-查询选修了全部课程的学生信息-- 第四十六题-查询各学生的年龄-- 日期操作
SELECT name, TIMESTAMPDIFF(YEAR, birth, CURDATE()) as age FROM student ORDER BY age; -- 第四十七题-查询没学过张三老师讲授的任一门课程的学生姓名
-- 第四十八题-查询下周过生日的同学SELECT * FROM student ORDER BY MONTH(birth);-- 查找下周过生日的学生
SELECT * FROM student WHERE WEEK(NOW())+2 = WEEK(birth);
SELECT * FROM student WHERE WEEK(NOW())+1 = WEEK(CONCAT(YEAR(NOW()),"-",SUBSTR(birth,6,5)));-- 第四十九题-查询本月过生日的人
-- 第五十题-查询下一个月过生日的同学
-- 跨年
-- 查到下个月过生日的学生
SELECT * FROM student WHERE MONTH(NOW()) = MONTH(birth);
SELECT * FROM student WHERE MONTH(birth) - MONTH(NOW()) = 1;
SELECT * FROM student WHERE MONTH(birth) = CASE WHEN MONTH(NOW()) = 12 THEN 1 ELSE MONTH(NOW()) + 1 END;-- 逻辑错误
-- 在MySQL中,使用TIMESTAMPDIFF函数计算两个日期之间的月份差异时,函数会返回两个日期之间完整的月份数。
SELECT TIMESTAMPDIFF(MONTH, '2024-01-31', '2024-02-29');
SELECT TIMESTAMPDIFF(MONTH, '2024-01-31', '2024-03-01');SELECT CONCAT(YEAR(CURDATE()), "-", SUBSTR("1994-12-06", 6,5 ));
SELECT * FROM student WHERE TIMESTAMPDIFF(MONTH, STR_TO_DATE(CONCAT(YEAR(CURDATE()), "-", SUBSTR(birth, 6, 5)),"%Y-%m-%d"), CURDATE())=10;
相关文章:
SQL面试50题 数据库准备(存储过程)
数据表关系图 数据表 CREATE TABLE student (id int(11) NOT NULL AUTO_INCREMENT,name varchar(255) NOT NULL,sex enum(female,male) NOT NULL,birth date NOT NULL,credit float(5,2) DEFAULT NULL,PRIMARY KEY (id) ) ENGINEInnoDB AUTO_INCREMENT25 DEFAULT CHARSETutf8;…...
Github 基本使用学习笔记
1. 基本概念 1.1 一些名词 Repository(仓库) 用来存放代码,每个项目都有一个独立的仓库。 Star(收藏) 收藏你喜欢的项目,方便以后查看。 Fork(克隆复制项目) 复制别人的仓库&…...
react + vite 中的环境变量怎么获取
一、Vite 环境变量基础 创建一个.env文件,Vite 定义的环境变量需要以VITE_开头。 VITE_API_URL "http://localhost:3000/api" 生产模式创建.env.production。 VITE_API_URL "https://production-api-url.com/api" 二、在 React 组件中获…...
leetcode hot100【 LeetCode 54.螺旋矩阵】java实现
LeetCode 54.螺旋矩阵 题目描述 给定一个 m x n 的矩阵,返回其元素按照螺旋顺序的数组。 示例 1: 输入: [[ 1, 2, 3 ],[ 4, 5, 6 ],[ 7, 8, 9 ] ]输出: [1, 2, 3, 6, 9, 8, 7, 4, 5]示例 2: 输入: [[1, 2, 3, 4],[5, 6, 7, 8],[9, 10, 11, 12] ]输出: [1, …...
Axios与FastAPI结合:构建并请求用户增删改查接口
在现代Web开发中,FastAPI以其高性能和简洁的代码结构成为了构建RESTful API的热门选择。而Axios则因其基于Promise的HTTP客户端特性,成为了前端与后端交互的理想工具。本文将介绍FastAPI和Axios的结合使用,通过一个用户增删改查(C…...
插入排序算法
一、基本思想 插入排序通过构建有序序列,对于未排序的数据,在已排序序列中从后向前扫描,找到相应位置并插入。它重复这个过程直到所有数据都被处理过。 二、示例 public class InsertionSort {public static void main(String[] args) {in…...
如何启动 Docker 服务:全面指南
如何启动 Docker 服务:全面指南 一、Linux 系统(以 Ubuntu 为例)二、Windows 系统(以 Docker Desktop 为例)三、macOS 系统(以 Docker Desktop for Mac 为例)四、故障排查五、总结Docker,作为一种轻量级的虚拟化技术,已经成为开发者和运维人员不可或缺的工具。它允许用…...
摄影相关常用名词
本文介绍与摄影相关的常用名词。 曝光 Exposure 感光元件接收光线的过程,决定图像的明暗程度和细节表现。 光圈 Aperture 控制镜头进光量的孔径大小,用 F 值(f-stop) 表示。 光圈越大(F 值越小),…...
kafka消费者组和分区数之间的关系是怎样的?
消费者组和分区数之间的关系决定了Kafka中消息的消费方式和负载均衡。合理配置分区数和消费者数量对于优化Kafka的性能和资源利用率至关重要。以下是这种关系的几个关键点: 一个分区只能被同一组的一个消费者消费:这是为了保证消息的顺序性。在同一个消费…...
【num_groups、 groups、init_filters以及归一化的选择】
目录 省流总结:一、num_groups与 groups的关系1. num_groups在代码中的作用(1) 定义(2) num_groups的值的不同影响1. 每组的通道数量:2. 计算效率:3. 对模型表现的影响:4. 对分割任务的影响:5. 训练稳定性:…...
Java设计模式——职责链模式:解锁高效灵活的请求处理之道
嘿,各位 Java 编程大神和爱好者们!今天咱们要一同深入探索一种超厉害的设计模式——职责链模式。它就像一条神奇的“处理链”,能让请求在多个对象之间有条不紊地传递,直到找到最合适的“处理者”。准备好跟我一起揭开它神秘的面纱…...
ubuntu20配置mysql注意事项
目录 一、mysql安装 二、初始化配置密码 三、配置文件的位置 四、常用的mysql命令 五、踩坑以及解决方法 一、mysql安装 1.更新apt源 sudo apt update 2.安装mysql服务 sudo apt-get install mysql-server 3.初始化配置 sudo mysql_secure_installation 4.配置项 VALI…...
JDBC 设置 PostgreSQL 查询中 any(?) 的参数
这段时间都纠缠于 Java 如何操作 PostgreSQL 数据库上,千方百计的为求得更好的性能。为此我们用上了 Batch, 或用 id any(?) 这种更 PostgreSQL 化的数组参数操作。其实它还有更多数组方面的花样可以玩,毕竟 PostgreSQL 数据库有一种广纳百川的胸怀&am…...
论文笔记(五十七)Diffusion Model Predictive Control
Diffusion Model Predictive Control 文章概括摘要1. Introduction2. Related work3. 方法3.1 模型预测控制3.2. 模型学习3.3. 规划(Planning)3.4. 适应 4. 实验(Experiments)4.1. 对于固定奖励,D-MPC 可与其他离线 RL…...
【在Linux世界中追寻伟大的One Piece】多线程(三)
目录 1 -> Linux线程同步 1.1 -> 条件变量 1.2 -> 同步概念与竞态条件 1.3 -> 条件变量函数 1.4 -> 为什么pthread_cond_wait需要互斥量 1.5 -> 条件变量使用规范 2 -> 生产者消费者模型 2.1 -> 为什么要使用生产者消费者模型 2.2 -> 生产…...
eBay 基于 Celeborn RESTful API 进行自动化工具集成实践
作者:王斐,ebay Hadoop 团队软件工程师,Apache Kyuubi PMC member,Apache Celeborn Committer。 简介:Apache Celeborn 是一个统一的大数据中间服务,致力于提高不同MapReduce引擎的效率和弹性。为了Spark …...
Vue 前端 el-input 如何实现输入框内容始终添加在尾部%
要在 el-input 输入框的尾部添加 %,你可以通过两种方式来实现: 使用 suffix 插槽:这是最直接和最常用的方法。使用 append 插槽:如果你需要在输入框内或者右侧显示其他内容。 方法 1:使用 suffix 插槽 el-input 提供…...
如何通过轻易云实现泛微OA与金蝶云星空的数据无缝对接
FD003-非生产性付款申请 泛微>金蝶付款单-422 数据集成案例分享 在企业信息化系统中,数据的高效流转和准确对接是确保业务流程顺畅运行的关键。本文将重点探讨如何通过轻易云数据集成平台,实现泛微OA-Http与金蝶云星空之间的数据无缝对接,…...
【docker】docker的起源与容器的由来、docker容器的隔离机制
Docker 的起源与容器的由来 1. 虚拟机的局限:容器的需求萌芽 在 Docker 出现之前,开发和部署软件主要依赖虚拟机(VMs): 虚拟机通过模拟硬件运行操作系统,每个应用程序可以运行在自己的独立环境中。虽然虚…...
mysql 事务之LBCC与MVCC
一、事务 数据库事务(Database Transaction)是数据库管理系统(DBMS)中执行的一系列操作,这些操作被当作一个逻辑单元进行处理,以保证数据的一致性和完整性。 ACID,事务四个关键特性 1、原子性…...
记一次 .NET某hdp智能柜系统 卡死分析
一:背景 1. 讲故事 停了一个月时间没有更新博客了,主要是这段时间有些许事情导致心神不宁,我这个人也比较浮躁所以无法潜心修炼,事情如下: 被狗咬了 也不知道是不是出门没看黄历,在小区门口店里买烟&am…...
大模型专栏--Spring Ai Alibaba介绍和功能演示
Spring AI Alibaba 介绍和功能演示 背景 Spring AI Alibaba 开源项目基于 Spring AI 构建,是阿里云通义系列模型及服务在 Java AI 应用开发领域的最佳实践,提供高层次的 AI API 抽象与云原生基础设施集成方案,帮助开发者快速构建 AI 应用。…...
【GPT】为什么人需要睡觉?
睡觉对人类来说是至关重要的生理和心理需求。以下是一些为什么人需要睡觉的主要原因,以及睡眠对身体和大脑的影响: 1. 恢复与修复 身体修复:在睡眠期间,身体进行细胞修复和再生。例如,生长激素在深度睡眠中分泌&#…...
【Linux】磁盘 | 文件系统 | inode
🪐🪐🪐欢迎来到程序员餐厅💫💫💫 主厨:邪王真眼 主厨的主页:Chef‘s blog 所属专栏:青果大战linux 总有光环在陨落,总有新星在闪烁 模电好难啊ÿ…...
A051-基于Spring Boot的网络海鲜市场系统的设计与实现
🙊作者简介:在校研究生,拥有计算机专业的研究生开发团队,分享技术代码帮助学生学习,独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取,记得注明来意哦~🌹 赠送计算机毕业设计600…...
谷歌浏览器Chrome打开百度很慢,其他网页正常的解决办法,试了很多,找到了适合的
最近不知怎么的,Chrome突然间打开百度很慢,甚至打不开。不光我一个人遇到这问题,我同事也遇到这个问题。开发中难免遇到问题,需要百度,现在是百度不了。 作为一名开发人员,习惯了使用Chrome进行开发&#…...
《企业级低代码开发平台技术要求》核心要点解析
一、引言 在数字化转型的浪潮中,企业级低代码开发平台成为推动企业创新与发展的关键力量。深圳市标准化协会发布的《企业级低代码开发平台技术要求》(T/SZAS 77—2024)为该领域提供了重要的规范与指引。深入剖析其核心要点,对于理…...
AI一键生成3D动画:腾讯最新方案,为小程序带来革命性变化
随着3D技术的快速发展,将静态的3D模型转化为能够生动展现各种动作的角色已经成为许多创作者和开发者梦寐以求的能力。然而,在过去,这一过程往往需要大量的手动工作和技术积累。现在,腾讯推出了一项创新的技术——AI一键生成3D动画,它不仅极大地简化了流程,还显著提高了效…...
AD软件如何快速切换三维视图,由2D切换至3D,以及如何恢复
在Altium Designer软件中,切换三维视图以及恢复二维视图的操作相对简单。以下是具体的步骤: 切换三维视图 在PCB设计界面中,2D切换3D,快捷键按住数字键盘中的“3”即可切换; 快捷键ctrlf(或者vb快捷键也…...
【赵渝强老师】PostgreSQL的数据库
PostgreSQL的逻辑存储结构主要是指数据库中的各种数据库对象,包括:数据库集群、数据库、表、索引、视图等等。所有数据库对象都有各自的对象标识符oid(object identifiers),它是一个无符号的四字节整数,相关对象的oid都…...
opencv 区域提取三种算法
opencv 区域提取三种算法 1.轮廓查找 findContours()函数,得到轮廓的点集集合 cv::vector<cv::vector<Point>> contours;threshold(roiMat,binImg,m_pPara.m_nMinGray,m_pPara.m_nMaxGray,THRESH_BINARY);//膨胀处理Mat dilaElement getStructuringE…...
C++初阶(十六)--STL--list的模拟实现
目录 结点类的实现 迭代器类的模拟实现 迭代器类的模板参数说明 构造函数 *运算符重载 ->运算符的重载 运算符的重载 --运算符重载 !运算符重载 运算符重载 list类的模拟实现 成员变量 默认成员函数 构造函数 拷贝构造函数 赋值运算符重载 迭代器相关函数 …...
树莓集团:以人工智能为核心,打造数字化生态运营新典范
在当今数字化浪潮席卷全球的背景下,各行各业都在积极探索数字化转型的路径。作为数字产业的领军者,树莓集团凭借其深厚的技术积累和创新理念,在人工智能、大数据、云计算等前沿技术领域不断突破,成功打造了一个以人工智能为核心的…...
基于深度学习的卷积神经网络十二生肖图像识别系统(PyQt5界面+数据集+训练代码)
本研究提出了一种基于深度学习的十二生肖图像识别系统,旨在利用卷积神经网络(CNN)进行图像分类,特别是十二生肖图像的自动识别。系统的核心采用了两种经典的深度学习模型:ResNet50和VGG16,进行图像的特征提…...
Torchtune在AMD GPU上的使用指南:利用多GPU能力进行LLM微调与扩展
Torchtune on AMD GPUs How-To Guide: Fine-tuning and Scaling LLMs with Multi-GPU Power — ROCm Blogs 这篇博客提供了一份详细的使用Torchtune在AMD GPU上微调和扩展大型语言模型(LLM)的指南。Torchtune 是一个PyTorch库,旨在让您轻松地…...
ESLint
代码规范 一套写代码的约定规则;比如赋值符号左右是否需要空格,一句话结束是否要加;.... 代码规范错误 如果你的代码不符合standard的要求,ESLint(脚手架里配的东西)会告诉你哪个文件第几行错了 解决代码…...
小程序-基于java+SpringBoot+Vue的微信小程序养老院系统设计与实现
项目运行 1.运行环境:最好是java jdk 1.8,我们在这个平台上运行的。其他版本理论上也可以。 2.IDE环境:IDEA,Eclipse,Myeclipse都可以。推荐IDEA; 3.tomcat环境:Tomcat 7.x,8.x,9.x版本均可 4.硬件环境:…...
如何具体实现商品详情的提取?
在电商领域,获取商品详情信息对于市场分析、价格比较、商品推荐等应用场景至关重要。本文将详细介绍如何使用Java编写爬虫程序,以合法合规的方式获取淘宝商品的详情信息,并提供详细的代码示例。 1. 环境准备 在开始编写爬虫之前,…...
antd table 自定义表头过滤表格内容
注意:该功能只能过滤可一次性返回全部数据的表格,通过接口分页查询的请自主按照需求改动哈~ 实现步骤: 1.在要过滤的列表表头增加过滤图标,点击图标显示浮窗 2.浮窗内显示整列可选选项,通过勾选单选或者全选、搜索框来…...
高效处理 iOS 应用中的大规模礼物数据:以直播项目为例(1-礼物池)
引言 在现代iOS应用开发中,处理大规模数据是一个常见的挑战。尤其实在直播项目中,礼物面板作为展示用户互动的重要部分,通常需要实时显示海量的礼物数据。这些数据不仅涉及到不同的区域、主播的动态差异,还需要保证高效的加载与渲…...
Maven - 优雅的管理多模块应用的统一版本号
文章目录 概述一、使用 versions-maven-plugin 插件1. 在主 pom.xml 中定义插件2. 修改版本号3. 回退修改4. 提交修改 二、使用占位符统一管理版本号1. 在主 pom.xml 中定义占位符2. 使用 flatten-maven-plugin 插件自动替换占位符3. 修改版本号4. 为什么这种方式更方便&#x…...
C++设计模式(观察者模式)
一、介绍 1.动机 在软件构建过程中,我们需要为某些对象建立一种“通知依赖关系”,即一个对象的状态发生改变,所有的依赖对象(观察者对象)都将得到通知。如果这样的依赖关系过于紧密,将使软件不能很好地抵…...
【unity】WebSocket 与 EventSource 的区别
WebSocket 也是一种很好的选择,尤其是在需要进行 双向实时通信(例如聊天应用、实时数据流等)时。与 EventSource 不同,WebSocket 允许客户端和服务器之间建立一个持久的、全双工的通信通道。两者的区别和适用场景如下:…...
从ETL到DataOps:WhaleStudio替代Informatica,实现信创化升级
作者 | 白鲸开源 姜维 在数据集成和调度的领域,Informatica曾经是公认的权威工具。其强大的ETL功能、多年积累的市场经验,使其成为众多企业数据处理的核心工具。 然而,随着新一代大数据平台的迅速崛起,以及信创化改造的要求愈发严…...
第四十二篇 EfficientNet:重新思考卷积神经网络的模型缩放
文章目录 摘要1、简介2、相关工作3、复合模型缩放3.1、 问题公式化3.2、扩展维度3.3、复合比例 4、EfficientNet架构5、实验5.1、扩展MobileNets和ResNets5.2、EfficientNet的ImageNet结果5.3、EfficientNet的迁移学习结果 6、讨论7、结论 摘要 卷积神经网络(ConvNets)通常在固…...
[OpenHarmony5.0][Docker][环境]OpenHarmony5.0 Docker编译环境镜像下载以及使用方式
T. 已测试目录 主机类型主机版本Docker镜像版本结果WSL2Ubuntu22.04Ubuntu20.04PASSWSL2Ubuntu22.04Ubuntu18.04PASS R. 软硬件要求: 编译硬件需求:做多系统测试,磁盘500GB起步(固态)(机械会卡死),内存3…...
Web Worker 和 WebSocket的区别
Web Worker(消息传递机制) 定义:是为了在浏览器中提供多线程支持,允许 JavaScript 在后台线程运行,而不阻塞主线程。它非常适合执行耗时的计算任务或处理大量数据,避免主线程(通常是 UI 线程&a…...
vmware Ubuntu2004运行STAR-Searcher
github链接 安装ros noetic gazebo11 略 gazebo更新方法 sudo sh -c echo "deb http://packages.osrfoundation.org/gazebo/ubuntu-stable lsb_release -cs main" > /etc/apt/sources.list.d/gazebo-stable.list wget https://packages.osrfoundation.org/gaz…...
04_JavaScript引入到文件
JavaScript引入到文件 嵌入到HTML文件中 <body> <script> var age 20 </script></body> 引入本地独立JS文件 <body> <script type"text/javascript" src"./itbaizhan.js"> </script></body> 引入网络来…...
计算机网络的功能
目录 信息交换 资源共享 分布式处理 可靠性增强 集中管理 信息交换 计算机网络最基本的功能之一是允许不同设备之间的数据通信。这包括电子邮件的发送和接收、即时消息的传递、文件传输等。通过网络,用户可以轻松地与全球各地的其他人进行沟通和协作。 信息交…...