MySQL 50 题。

MySQL 50 题。


文章目录

    • MySQL 50 题。
      • 数据库。
      • sql。


数据库。

CREATE SCHEMA `new_schema` DEFAULT CHARACTER SET utf8mb4 ;Operation failed: There was an error while applying the SQL script to the database.
Executing:
CREATE SCHEMA `new_schema` DEFAULT CHARACTER SET utf8mb4 ;ERROR 1044: Access denied for user 'lyfgeek'@'%' to database 'new_schema'
SQL Statement:
CREATE SCHEMA `new_schema` DEFAULT CHARACTER SET utf8mb4
CREATE SCHEMA `mysql_fifty` DEFAULT CHARACTER SET utf8 ;
CREATE TABLE `lyfgeek`.`student`
(`id`             BIGINT      NOT NULL AUTO_INCREMENT COMMENT '主键 id。',`s_id`           VARCHAR(45) NOT NULL DEFAULT '' COMMENT '学生 id。',`s_name`         VARCHAR(45) NOT NULL DEFAULT '' COMMENT '姓名。',`s_birth`        VARCHAR(45) NOT NULL DEFAULT '' COMMENT '出生年月。',`s_sex`          VARCHAR(45) NOT NULL DEFAULT '' COMMENT '性别。',`db_insert_time` TIMESTAMP   NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'db_insert_time。',`db_update_time` TIMESTAMP   NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'db_update_time。',`db_deleted`     INT         NOT NULL DEFAULT 0 COMMENT 'db_deleted。',PRIMARY KEY (`id`, `s_id`),UNIQUE INDEX `s_id_UNIQUE` (`s_id` ASC) VISIBLE
)ENGINE = InnoDBDEFAULT CHARACTER SET = utf8mb4COMMENT = '学生。';-- 课程表。
CREATE TABLE `lyfgeek`.`course`
(`id`             BIGINT      NOT NULL AUTO_INCREMENT COMMENT '主键 id。',`c_id`           VARCHAR(45) NOT NULL DEFAULT '' COMMENT '课程 id。',`c_name`         VARCHAR(45) NOT NULL DEFAULT '' COMMENT '课程名称。',`t_id`           VARCHAR(45) NOT NULL DEFAULT '' COMMENT '教师 id。',`db_insert_time` TIMESTAMP   NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'db_insert_time。',`db_update_time` TIMESTAMP   NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'db_update_time。',`db_deleted`     INT         NOT NULL DEFAULT 0 COMMENT 'db_deleted。',PRIMARY KEY (`id`),UNIQUE INDEX `c_id_UNIQUE` (`c_id` ASC) VISIBLE
)ENGINE = InnoDBDEFAULT CHARACTER SET = utf8mb4COMMENT = '成绩。';-- 教师表。
CREATE TABLE `lyfgeek`.`teacher`
(`id`             BIGINT      NOT NULL AUTO_INCREMENT COMMENT '主键 id。',`t_id`           VARCHAR(45) NOT NULL DEFAULT '' COMMENT '教师 id。',`t_name`         VARCHAR(45) NOT NULL DEFAULT '' COMMENT '姓名。',`db_insert_time` TIMESTAMP   NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'db_insert_time。',`db_update_time` TIMESTAMP   NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'db_update_time。',`db_deleted`     INT         NOT NULL DEFAULT 0 COMMENT 'db_deleted。',PRIMARY KEY (`id`, `t_id`),UNIQUE INDEX `t_id_UNIQUE` (`t_id` ASC) VISIBLE
)ENGINE = InnoDBDEFAULT CHARACTER SET = utf8mb4COMMENT = '教师。';-- 成绩表。
CREATE TABLE `lyfgeek`.`score`
(`id`             BIGINT      NOT NULL AUTO_INCREMENT COMMENT '主键 id。',`s_id`           VARCHAR(45) NOT NULL DEFAULT '' COMMENT '学生 id。',`c_id`           VARCHAR(45) NOT NULL DEFAULT '' COMMENT '课程 id。',`s_score`        INT         NULL     DEFAULT NULL COMMENT '成绩。',`db_insert_time` TIMESTAMP   NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'db_insert_time。',`db_update_time` TIMESTAMP   NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'db_update_time。',`db_deleted`     INT         NOT NULL DEFAULT 0 COMMENT 'db_deleted。',PRIMARY KEY (`id`)
)ENGINE = InnoDBDEFAULT CHARACTER SET = utf8mb4COMMENT = '成绩。';# 学生表测试数据。
INSERT INTO `lyfgeek`.`student` (`s_id`, `s_name`, `s_birth`, `s_sex`)
VALUES ('01', '学生 1', '2021-01-01', '男');
INSERT INTO `lyfgeek`.`student` (`s_id`, `s_name`, `s_birth`, `s_sex`)
VALUES ('02', '学生 2', '2022-02-02', '男');
INSERT INTO `lyfgeek`.`student` (`s_id`, `s_name`, `s_birth`, `s_sex`)
VALUES ('03', '学生 3', '2023-03-03', '男');
INSERT INTO `lyfgeek`.`student` (`s_id`, `s_name`, `s_birth`, `s_sex`)
VALUES ('04', '学生 4', '2024-04-04', '男');
INSERT INTO `lyfgeek`.`student` (`s_id`, `s_name`, `s_birth`, `s_sex`)
VALUES ('05', '学生 5', '2025-05-05', '女');
INSERT INTO `lyfgeek`.`student` (`s_id`, `s_name`, `s_birth`, `s_sex`)
VALUES ('06', '学生 6', '2026-06-06', '女');
INSERT INTO `lyfgeek`.`student` (`s_id`, `s_name`, `s_birth`, `s_sex`)
VALUES ('07', '学生 7', '2027-07-07', '女');
INSERT INTO `lyfgeek`.`student` (`s_id`, `s_name`, `s_birth`, `s_sex`)
VALUES ('08', '学生 8', '2028-08-08', '女');# 课程表测试数据。
INSERT INTO `lyfgeek`.`course`(`c_id`, `c_name`, `t_id`)
VALUES ('01', '语文', '02');
INSERT INTO `lyfgeek`.`course`(`c_id`, `c_name`, `t_id`)
VALUES ('02', '数学', '01');
INSERT INTO `lyfgeek`.`course`(`c_id`, `c_name`, `t_id`)
VALUES ('03', '英语', '03');# 教师表测试数据。
INSERT INTO `lyfgeek`.`teacher` (`t_id`, `t_name`)
VALUES ('01', '老师 1');
INSERT INTO `lyfgeek`.`teacher` (`t_id`, `t_name`)
VALUES ('02', '老师 2');
INSERT INTO `lyfgeek`.`teacher` (`t_id`, `t_name`)
VALUES ('03', '老师 3');# 成绩表测试数据。
INSERT INTO `lyfgeek`.`score` (`s_id`, `c_id`, `s_score`)
VALUES ('01', '01', '80');
INSERT INTO `lyfgeek`.`score` (`s_id`, `c_id`, `s_score`)
VALUES ('01', '02', '90');
INSERT INTO `lyfgeek`.`score` (`s_id`, `c_id`, `s_score`)
VALUES ('01', '03', '99');
INSERT INTO `lyfgeek`.`score` (`s_id`, `c_id`, `s_score`)
VALUES ('02', '01', '70');
INSERT INTO `lyfgeek`.`score` (`s_id`, `c_id`, `s_score`)
VALUES ('02', '02', '60');
INSERT INTO `lyfgeek`.`score` (`s_id`, `c_id`, `s_score`)
VALUES ('02', '03', '80');
INSERT INTO `lyfgeek`.`score` (`s_id`, `c_id`, `s_score`)
VALUES ('03', '01', '80');
INSERT INTO `lyfgeek`.`score` (`s_id`, `c_id`, `s_score`)
VALUES ('03', '02', '80');
INSERT INTO `lyfgeek`.`score` (`s_id`, `c_id`, `s_score`)
VALUES ('03', '03', '80');
INSERT INTO `lyfgeek`.`score` (`s_id`, `c_id`, `s_score`)
VALUES ('04', '01', '50');
INSERT INTO `lyfgeek`.`score` (`s_id`, `c_id`, `s_score`)
VALUES ('04', '02', '30');
INSERT INTO `lyfgeek`.`score` (`s_id`, `c_id`, `s_score`)
VALUES ('04', '03', '20');
INSERT INTO `lyfgeek`.`score` (`s_id`, `c_id`, `s_score`)
VALUES ('05', '01', '76');
INSERT INTO `lyfgeek`.`score` (`s_id`, `c_id`, `s_score`)
VALUES ('05', '02', '87');
INSERT INTO `lyfgeek`.`score` (`s_id`, `c_id`, `s_score`)
VALUES ('06', '01', '31');
INSERT INTO `lyfgeek`.`score` (`s_id`, `c_id`, `s_score`)
VALUES ('06', '03', '34');
INSERT INTO `lyfgeek`.`score` (`s_id`, `c_id`, `s_score`)
VALUES ('07', '02', '89');
INSERT INTO `lyfgeek`.`score` (`s_id`, `c_id`, `s_score`)
VALUES ('07', '03', '98');


sql。

-- 查询课程"01"比课程"02"成绩高的学生的信息及课程分数。
-- - in ~ 长型数据变成宽型数据。
SELECT st.*,t.s01,t.s02
FROM (SELECT sc.`s_id`,MAX(CASEWHEN sc.`c_id` = '01' THEN sc.`s_score`END) s01,MAX(CASEWHEN sc.`c_id` = '02' THEN sc.`s_score`END) s02FROM `score` scGROUP BY sc.`s_id`) t,`student` st
WHERE t.s01 > t.s02AND t.`s_id` = st.`s_id`;-- 自连接。
SELECT st.*,sc1.`s_score`,sc2.`s_score`
FROM `student` st,`score` sc1,`score` sc2
WHERE st.`s_id` = sc1.`s_id`AND sc1.`s_id` = sc2.`s_id`AND sc1.`c_id` = '01'AND sc2.`c_id` = '02'AND sc1.`s_score` > sc2.`s_score`;-- 2、查询课程"01"比课程"02"成绩低的学生的信息及课程分数。
SELECT `student`.*,sc1.`s_score`,sc2.`s_score`
FROM `student`INNER JOIN`score` sc1 ON `student`.`s_id` = sc1.`s_id`AND sc1.`c_id` = '01'INNER JOIN`score` sc2 ON sc1.`s_id` = sc2.`s_id`AND sc2.`c_id` = '02'
WHERE sc1.`s_score` < sc2.`s_score`OR sc1.`s_score` IS NULL;-- 3、查询平均成绩大于等于 60 分的同学的学生编号和学生姓名和平均成绩。
-- 子查询方法。
SELECT sc.`s_id`,(SELECT `s_name`FROM `student` stWHERE st.`s_id` = sc.`s_id`) AS s_name,AVG(sc.`s_score`)                avg_score
FROM `score` sc
GROUP BY sc.`s_id`
HAVING avg_score >= 60;-- 两个表连接方法。
SELECT st.`s_id`,st.`s_name`,AVG(sc.`s_score`)
FROM `student` st,`score` sc
WHERE st.`s_id` = sc.`s_id`
GROUP BY st.`s_id`
HAVING AVG(sc.`s_score` >= 60);-- 4、查询平均成绩小于 60 分的同学的学生编号和学生姓名和平均成绩。
-- (包括有成绩的和无成绩的)。
SELECT st.`s_id`,st.`s_name`,AVG(sc.`s_score`) AS avg_score
FROM `student` st,`score` sc
WHERE st.`s_id` = sc.`s_id`
GROUP BY sc.`s_id`
HAVING AVG(sc.`s_score`) < 60
UNION
SELECT st.`s_id`,st.`s_name`,0 AS avg_score
FROM `student` st
WHERE st.`s_id` NOT IN (SELECT DISTINCT `s_id`FROM `score`);-- 5、查询所有同学的学生编号、学生姓名、选课总数、所有课程的总成绩。
SELECT st.`s_id`,st.`s_name`,COUNT(sc.s_id)               AS sum_course,IFNULL(SUM(sc.`s_score`), 0) AS sum_score
FROM `student` stLEFT OUTER JOIN`score` sc ON st.`s_id` = sc.`s_id`
GROUP BY st.`s_id`;-- 6、查询"李"姓老师的数量。
SELECT COUNT(`t_id`)
FROM `teacher`
WHERE `t_name` LIKE '李%';-- 7、查询学过"张三"老师授课的同学的信息。
SELECT st.*
FROM `student` stJOIN`score` sc ON st.`s_id` = sc.`s_id`
WHERE sc.`c_id` IN (SELECT `c_id`FROM `course`WHERE `t_id` = (SELECT `t_id`FROM `teacher`WHERE `t_name` = '老师 1'));SELECT st.*
FROM `student` stINNER JOIN`score` sc ON st.`s_id` = sc.`s_id`
WHERE sc.`c_id` IN (SELECT `c_id`FROM `course` cINNER JOIN`teacher` t ON c.`t_id` = t.`t_id`WHERE `t`.`t_name` = '老师 1');-- 8、查询没学过"张三"老师授课的同学的信息。
SELECT *
FROM `student` st
WHERE st.s_id NOT IN (SELECT st.`s_id`FROM `student` stJOIN`score` sc ON st.`s_id` = sc.`s_id`WHERE sc.`c_id` IN (SELECT `c_id`FROM `course`WHERE `t_id` = (SELECT `t_id`FROM `teacher`WHERE `t_name` = '老师 1')));SELECT *
FROM `student`
WHERE `s_id` NOT IN (SELECT sc.`s_id`FROM `teacher` t,`score` sc,`course` cWHERE t.`t_id` = c.`t_id`AND c.`c_id` = sc.`c_id`AND t.`t_name` = '老师 1');SELECT *
FROM `student`
WHERE NOT EXISTS(SELECT 1FROM (SELECT sc.`s_id`FROM `teacher` t,`score` sc,`course` cWHERE t.`t_id` = c.`t_id`AND c.`c_id` = sc.`c_id`AND t.`t_name` = '老师 1') tWHERE t.s_id = student.s_id);-- 9、查询学过编号为"01"并且也学过编号为"02"的课程的同学的信息。
SELECT st.*
FROM `student` st,`score` sc1,`score` sc2
WHERE st.`s_id` = sc1.`s_id`AND st.`s_id` = sc2.`s_id`AND sc1.`c_id` = '01'AND sc2.`c_id` = '02';-- 10、查询学过编号为"01"但是没有学过编号为"02"的课程的同学的信息。
SELECT st.*
FROM `student` st
WHERE st.`s_id` IN (SELECT `s_id`FROM `score`WHERE `c_id` = '01')AND st.`s_id` NOT IN (SELECT `s_id`FROM `score`WHERE `c_id` = '02');SELECT st.*
FROM `student` st,(SELECT `s_id`,MAX(IF(`c_id` = '01', `s_score`, NULL)) s01,MAX(IF(`c_id` = '02', `s_score`, NULL)) s02FROM `score`GROUP BY `s_id`) t
WHERE t.`s_id` = st.`s_id`AND t.s01 IS NOT NULLAND t.s02 IS NULL;-- 11、查询没有学全所有课程的同学的信息。
SELECT st.*,COUNT(sc.`c_id`) count_sc
FROM `student` stLEFT JOIN`score` sc ON st.`s_id` = sc.`s_id`
GROUP BY st.`s_id`
HAVING COUNT(sc.`c_id`) < (SELECT COUNT(`c_id`)FROM `course`);SELECT st.*
FROM `student` st
WHERE st.`s_id` IN (SELECT `s_id`FROM `score`WHERE `s_id` NOT IN (SELECT sc1.`s_id`FROM `score` sc1JOIN`score` sc2 ON sc1.`s_id` = sc2.`s_id`AND sc2.`c_id` = '02'JOIN`score` sc3 ON sc1.`s_id` = sc3.`s_id`AND sc3.`c_id` = '03'WHERE sc1.`c_id` = '01'));-- 12、查询至少有一门课与学号为"01"的同学所学相同的同学的信息。
SELECT *
FROM `student`
WHERE `s_id` IN (SELECT DISTINCT `s_id`FROM `score`WHERE `c_id` IN (SELECT `c_id`FROM `score`WHERE `s_id` = '01'))
GROUP BY 1, 2, 3, 4;
-- 第 1 2 3 4 字段。-- 13、查询和"01"号的同学学习的课程完全相同的其他同学的信息。-- 创建 01 所学临时表。
CREATE TABLE s01_sc_temp AS
SELECT t1.*, sc.`c_id` cid2
FROM (SELECT st.*,t2.`c_id`FROM `student` st,(SELECT `c_id`FROM `score`WHERE `s_id` = '01') t2) t1LEFT JOIN`score` sc ON t1.`s_id` = sc.`s_id`AND t1.`c_id` = sc.`c_id`
UNION
SELECT t.*,sc.`c_id` cid2
FROM (SELECT st.*,b.`c_id`FROM `student` st,(SELECT `c_id`FROM `score`WHERE `s_id` = '01') b) tRIGHT JOIN`score` sc ON t.`s_id` = sc.`s_id`AND t.`c_id` = sc.`c_id`;SELECT *
FROM `student`
WHERE `s_id` NOT IN (SELECT `s_id`FROM s01_s_tempWHERE cid2 IS NULLOR `c_id` IS NULL)AND `s_id` != '01';-- ~ ~ ~SELECT *
FROM `student`
WHERE `s_id` IN (SELECT DISTINCT `s_id`FROM `score`WHERE `s_id` != '01'AND `c_id` IN (SELECT `c_id`FROM `score`WHERE `s_id` = '01')GROUP BY `s_id`HAVING COUNT(1) = (SELECT COUNT(1)FROM `score`WHERE `s_id` = '01'));-- 14、查询没学过"张三"老师讲授的任一门课程的学生姓名。
SELECT st.`s_name`
FROM `student` st
WHERE st.`s_id` NOT IN (SELECT `s_id`FROM `score`WHERE `c_id` = (SELECT `c_id`FROM `course`WHERE `t_id` = (SELECT `t_id`FROM `teacher`WHERE `t_name` = '老师 1'))GROUP BY s_id);-- 15、查询两门及其以上不及格课程的同学的学号,姓名及其平均成绩。
SELECT st.`s_id`,st.`s_name`,AVG(sc.`s_score`) avg_score
FROM `student` stLEFT JOIN`score` sc ON st.`s_id` = sc.`s_id`
GROUP BY st.`s_id`
HAVING SUM(IF(sc.`s_score` >= 60, 0, 1)) >= 2;SELECT st.`s_id`,st.`s_name`,AVG(sc.`s_score`) avg_score
FROM `student` stLEFT JOIN`score` sc ON st.`s_id` = sc.`s_id`
GROUP BY st.`s_id`
HAVING SUM(IF(sc.`s_score` >= 60, 0, 1)) >= 2;SELECT st.`s_id`,st.`s_name`,ROUND(AVG(sc.`s_score`))
FROM student stLEFT JOINscore sc ON st.`s_id` = sc.`s_id`
WHERE st.`s_id` IN (SELECT `s_id`FROM `score`WHERE `s_score` < 60GROUP BY `s_id`HAVING COUNT(1) >= 2)
GROUP BY st.`s_id`, st.`s_name`;-- 16、检索课程"01"分数小于 60,按分数降序排列的学生信息。
SELECT st.*,sc.`s_score`
FROM `score` scRIGHT JOIN`student` st ON sc.`s_id` = st.`s_id`
WHERE sc.`c_id` = '01'AND sc.`s_score` < 60
ORDER BY `s_score` DESC;SELECT st.*,sc.`c_id`,sc.`s_score`
FROM `student` st,`score` sc
WHERE st.`s_id` = sc.`s_id`AND sc.`c_id` = '01'AND sc.`s_score` < 60
ORDER BY sc.`s_score` DESC;-- 17、按平均成绩从高到低显示所有学生的所有课程的成绩以及平均成绩。
SELECT sc.`s_id`,(SELECT `s_score`FROM `score`WHERE `s_id` = sc.`s_id`AND `c_id` = '01')    AS 语文,(SELECT `s_score`FROM `score`WHERE `s_id` = sc.`s_id`AND `c_id` = '02')    AS 数学,(SELECT `s_score`FROM `score`WHERE `s_id` = sc.`s_id`AND `c_id` = '03')    AS 英语,ROUND(AVG(`s_score`), 2) AS 平均分
FROM `score` sc
GROUP BY sc.`s_id`
ORDER BY 平均分 DESC;-- 18.查询各科成绩最高分、最低分和平均分,以如下形式显示:课程 ID,课程 name,最高分,最低分,平均分,及格率,中等率,优良率,优秀率。
-- 及格为 >= 60,中等为:70 ~ 80,优良为:80 ~ 90,优秀为:>= 90。
SELECT sc.`c_id`,c.`c_name`,MAX(`s_score`),MIN(`s_score`),ROUND(AVG(`s_score`), 2),ROUND(100 * (SUM(IF(sc.`s_score` >= 60, 1, 0)) / SUM(IF(sc.`s_score`, 1, 0))),2) AS 及格率,ROUND(100 * (SUM(IF(sc.`s_score` >= 70 AND sc.`s_score` <= 80, 1, 0)) / SUM(IF(sc.`s_score`, 1, 0))),2) AS 中等率,ROUND(100 * (SUM(IF(sc.`s_score` >= 80 AND sc.`s_score` <= 90, 1, 0)) / SUM(IF(sc.`s_score`, 1, 0))),2) AS 优良率,ROUND(100 * (SUM(IF(sc.`s_score` >= 90, 1, 0)) / SUM(IF(sc.`s_score`, 1, 0))),2) AS 优秀率
FROM `score` scLEFT JOIN`course` c ON sc.`c_id` = c.`c_id`
GROUP BY sc.`c_id`, c.`c_name`;-- 19、按各科成绩进行排序,并显示排名(实现不完全)。
-- mysql 没有 rank(); 函数。
SELECT sc1.`c_id`,sc1.`s_id`,sc1.`s_score`,COUNT(sc2.`s_score`) + 1 AS `rank`
FROM `score` sc1LEFT JOIN`score` sc2 ON sc1.`s_score` < sc2.`s_score`AND sc1.`c_id` = sc2.`c_id`
GROUP BY sc1.`c_id`, sc1.`s_id`, sc1.`s_score`
ORDER BY sc1.`c_id`, `rank`;-- 20、查询学生的总成绩并进行排名。
SELECT t1.`s_id`,@i := @i + 1                              AS i,@k := (IF(@score = t1.sum_score, @k, @i)) AS `rank`,@score := t1.sum_score                    AS score
FROM (SELECT `s_id`,SUM(`s_score`) AS sum_scoreFROM `score`GROUP BY `s_id`ORDER BY sum_score DESC) t1,(SELECT @k := 0, @i := 0, @score := 0) AS kis;-- 21、查询不同老师所教不同课程平均分从高到低显示。
SELECT c.`t_id`,t.`t_name`,c.`c_id`,ROUND(AVG(`s_score`), 2) AS avg_score
FROM `course` cLEFT JOIN`score` sc ON c.`c_id` = sc.`c_id`LEFT JOIN`teacher` t ON c.`t_id` = t.`t_id`
GROUP BY c.`c_id`, c.`t_id`, t.`t_name`
ORDER BY avg_score DESC;-- 22、查询所有课程的成绩第 2 名到第 3 名的学生信息及该课程成绩。
SELECT d.*,si2.排名,si2.`s_score`,si2.`c_id`
FROM (SELECT sc.`s_id`,sc.`s_score`,sc.`c_id`,@i := @i + 1 AS 排名FROM `score` sc,(SELECT @i := 0) as i2WHERE sc.c_id = '01') as si2LEFT JOINstudent d ON si2.s_id = d.s_id
WHERE 排名 BETWEEN 2 AND 3
UNION
SELECT st.*,sj2.排名,sj2.s_score,sj2.c_id
FROM (SELECT sc.s_id,sc.s_score,sc.c_id,@j := @j + 1 AS 排名FROM `score` sc,(SELECT @j := 0) as j2WHERE sc.c_id = '02') as sj2LEFT JOIN`student` st ON sj2.s_id = st.s_id
WHERE 排名 BETWEEN 2 AND 3
UNION
SELECT d.*,s.排名,s.`s_score`,s.`c_id`
FROM (SELECT sc.`s_id`,sc.`s_score`,sc.`c_id`,@k := @k + 1 AS 排名FROM `score` sc,(SELECT @k := 0) as k2WHERE sc.`c_id` = '03') as sLEFT JOIN`student` d ON s.`s_id` = d.`s_id`
WHERE 排名 BETWEEN 2 AND 3;-- 23、统计各科成绩各分数段人数:课程编号, 课程名称, [100-85], [85-70], [70-60], [0-60] 及所占百分比。
SELECT DISTINCT c.`c_name`,sc.`c_id`,t1.`85-100`,t1.百分比,t2.`70-85`,t2.百分比,t3.`60-70`,t3.百分比,t4.`0-60`,t4.百分比
FROM `score` scLEFT JOIN(SELECT `c_id`,SUM(IF(`s_score` > 85 AND `s_score` <= 100, 1, 0))                              AS `85-100`,ROUND(100 * (SUM(IF(`s_score` > 85 AND `s_score` <= 100, 1, 0)) / COUNT(*)), 2) AS 百分比FROM `score`GROUP BY `c_id`) t1 ON sc.`c_id` = t1.`c_id`LEFT JOIN(SELECT `c_id`,SUM(IF(`s_score` > 70 AND `s_score` <= 85, 1, 0))                              AS `70-85`,ROUND(100 * (SUM(IF(`s_score` > 70 AND `s_score` <= 85, 1, 0)) / COUNT(*)), 2) AS 百分比FROM `score`GROUP BY `c_id`) t2 ON sc.`c_id` = t2.`c_id`LEFT JOIN(SELECT `c_id`,SUM(IF(`s_score` > 60 AND `s_score` <= 70, 1, 0))                              AS `60-70`,ROUND(100 * (SUM(IF(`s_score` > 60 AND `s_score` <= 70, 1, 0)) / COUNT(*)), 2) AS 百分比FROM `score`GROUP BY `c_id`) t3 ON sc.`c_id` = t3.`c_id`LEFT JOIN(SELECT `c_id`,SUM(IF(`s_score` >= 0 AND `s_score` <= 60, 1, 0))                              AS `0-60`,ROUND(100 * (SUM(IF(`s_score` >= 0 AND `s_score` <= 60, 1, 0)) / COUNT(*)), 2) AS 百分比FROM `score`GROUP BY `c_id`) t4 ON sc.`c_id` = t4.`c_id`LEFT JOIN`course` c ON sc.`c_id` = c.`c_id`;-- 24、查询学生平均成绩及其名次。
SELECT t.`s_id`,@i := @i + 1                                 AS '不保留空缺排名',@k := (IF(@avg_score = t.avg_score, @k, @i)) AS '保留空缺排名',@avg_score := avg_score                      AS '平均分'
FROM (SELECT `s_id`,ROUND(AVG(`s_score`), 2) AS avg_scoreFROM scoreGROUP BY `s_id`) t,(SELECT @avg_score := 0, @i := 0, @k := 0) b;-- 25、查询各科成绩前三名的记录。
-- - 选出 sc1 表比 sc2 表成绩大的所有组。
-- - 选出比当前 id 成绩大的小于三个的。
SELECT sc1.`s_id`,sc1.`c_id`,sc1.`s_score`
FROM `score` sc1LEFT JOIN`score` sc2 ON sc1.`c_id` = sc2.`c_id`AND sc1.`s_score` < sc2.`s_score`
GROUP BY sc1.`s_id`, sc1.`c_id`, sc1.`s_score`
HAVING COUNT(sc2.`s_id`) < 3
ORDER BY sc1.`c_id`, sc1.`s_score` DESC;-- 26、查询每门课程被选修的学生数。
SELECT `c_id`,COUNT(`s_id`)
FROM `score`
GROUP BY `c_id`;-- 27、查询出只有两门课程的全部学生的学号和姓名。
SELECT `s_id`,`s_name`
FROM `student`
WHERE `s_id` IN (SELECT `s_id`FROM `score`GROUP BY `s_id`HAVING COUNT(`c_id`) = 2);-- 28、查询男生、女生人数。
SELECT `s_sex`,COUNT(`s_sex`) AS 人数
FROM student
GROUP BY s_sex;-- 29、查询名字中含有"风"字的学生信息。
SELECT *
FROM `student`
WHERE `s_name` LIKE '%风%';-- 30、查询同名同性学生名单,并统计同名人数。
SELECT st1.`s_name`,st1.`s_sex`,COUNT(*)
FROM `student` st1JOIN`student` st2 ON st1.`s_id` != st2.`s_id`AND st1.`s_name` = st2.`s_name`AND st1.`s_sex` = st2.`s_sex`
GROUP BY st1.`s_name`, st1.`s_sex`;-- 31、查询 1990 年出生的学生名单。
SELECT `s_name`
FROM `student`
WHERE `s_birth` LIKE '1990%';-- 32、查询每门课程的平均成绩,结果按平均成绩降序排列,平均成绩相同时,按课程编号升序排列。
SELECT `c_id`,ROUND(AVG(`s_score`), 2) AS avg_score
FROM `score`
GROUP BY `c_id`
ORDER BY avg_score DESC, `c_id` ASC;-- 33、查询平均成绩大于等于 85 的所有学生的学号、姓名和平均成绩。
SELECT sc.`s_id`,st.`s_name`,ROUND(AVG(sc.`s_score`), 2) AS avg_score
FROM `score` scLEFT JOIN`student` st ON sc.`s_id` = st.`s_id`
GROUP BY `s_id`
HAVING avg_score >= 85;-- 34、查询课程名称为"数学",且分数低于 60 的学生姓名和分数。
SELECT st.`s_name`,sc.`s_score`
FROM `score` scLEFT JOIN`student` st ON st.`s_id` = sc.`s_id`
WHERE sc.`c_id` = (SELECT `c_id`FROM `course`WHERE `c_name` = '数学')AND sc.s_score < 60;-- 35、查询所有学生的课程及分数情况。
SELECT st.`s_id`,st.`s_name`,SUM(IF(c.`c_name` = '语文', sc.`s_score`, 0)) AS '语文',SUM(IF(c.`c_name` = '数学', sc.`s_score`, 0)) AS '数学',SUM(IF(c.`c_name` = '英语', sc.`s_score`, 0)) AS '英语',SUM(sc.`s_score`)                             AS '总分'
FROM `student` stLEFT JOIN`score` sc ON st.`s_id` = sc.`s_id`LEFT JOIN`course` c ON sc.`c_id` = c.`c_id`
GROUP BY st.`s_id`, st.`s_name`;-- 36、查询任何一门课程成绩在 70 分以上的姓名、课程名称和分数。
SELECT st.`s_name`,c.`c_name`,sc.`s_score`
FROM `course` cLEFT JOIN`score` sc ON c.`c_id` = sc.`c_id`LEFT JOIN`student` st ON st.`s_id` = sc.`s_id`
WHERE sc.`s_score` >= 70;-- 37、查询不及格的课程。
SELECT sc.`s_id`,sc.`c_id`,c.`c_name`,sc.`s_score`
FROM `score` scLEFT JOIN`course` c ON sc.`c_id` = c.`c_id`
WHERE sc.`s_score` < 60;-- 38、查询课程编号为 01 且课程成绩在 80 分以上的学生的学号和姓名。
SELECT sc.`s_id`,st.`s_name`
FROM `score` scLEFT JOIN`student` st ON sc.`s_id` = st.`s_id`
WHERE sc.`c_id` = '01'AND sc.`s_score` > 80;-- 39、求每门课程的学生人数。
SELECT COUNT(*)
FROM `score`
GROUP BY `c_id`;-- 40、查询选修"张三"老师所授课程的学生中,成绩最高的学生信息及其成绩。
-- 查询老师 id。
SELECT `c_id`
FROM `course` c,`teacher` t
WHERE c.`t_id` = t.`t_id`AND t.`t_name` = '老师 1';
-- 查询最高分(可能有相同分数)。
SELECT MAX(`s_score`)
FROM `score`
WHERE `c_id` = '02';
-- 查询信息。
SELECT st.*,sc.`s_score`,sc.`c_id`,c.`c_name`
FROM `student` stLEFT JOIN`score` sc ON st.`s_id` = sc.`s_id`LEFT JOIN`course` c ON sc.`c_id` = c.`c_id`
WHERE sc.`c_id` = (SELECT `c_id`FROM `course` c,`teacher` tWHERE c.`t_id` = t.`t_id`AND t.`t_name` = '老师 1')AND sc.s_score IN (SELECT MAX(s_score)FROM scoreWHERE c_id = '02');SELECT c.`c_name`, sc.`s_score`, st.*
FROM `course` c,`score` sc,`teacher` t,`student` st
WHERE t.`t_id` = c.`t_id`AND c.`c_id` = sc.`c_id`AND st.`s_id` = sc.`s_id`AND t.`t_name` = '老师 1'AND sc.`s_score` IN (SELECT MAX(`s_score`)FROM `course`,`score`,`teacher`,`student`WHERE `teacher`.`t_id` = `course`.`t_id`AND `course`.`c_id` = `score`.`c_id`AND `student`.`s_id` = `score`.`s_id`AND `teacher`.`t_name` = '老师 1');-- 41、查询不同课程成绩相同的学生的学生编号、课程编号、学生成绩。
SELECT DISTINCT sc2.`s_id`,sc2.`c_id`,sc2.`s_score`
FROM `score` sc1,`score` sc2
WHERE sc1.`c_id` != sc2.`c_id`AND sc1.`s_score` = sc2.`s_score`;-- 42、查询每门功成绩最好的前两名。
-- 牛逼的写法。
SELECT sc1.`s_id`,sc1.`c_id`,sc1.`s_score`
FROM `score` sc1
WHERE (SELECT COUNT(1)FROM `score` sc2WHERE sc2.`c_id` = sc1.`c_id`AND sc2.`s_score` >= sc1.`s_score`) <= 2
ORDER BY sc1.`c_id`;-- 43、统计每门课程的学生选修人数(超过 5 人的课程才统计)。要求输出课程号和选修人数,查询结果按人数降序排列,若人数相同,按课程号升序排列。
SELECT `c_id`,COUNT(*) AS total
FROM `score`
GROUP BY `c_id`
HAVING total > 5
ORDER BY total DESC, `c_id`;-- 44、检索至少选修两门课程的学生学号。
SELECT `s_id`,COUNT(*)
FROM `score`
GROUP BY `s_id`
HAVING COUNT(*) >= 2;-- 45、查询选修了全部课程的学生信息。
SELECT *
FROM `student`
WHERE `s_id` IN (SELECT `s_id`FROM `score`GROUP BY `s_id`HAVING COUNT(*) = (SELECT COUNT(*)FROM `course`));-- 46、查询各学生的年龄。
-- 按照出生日期来算,当前月日 < 出生年月的月日则,年龄减一。
SELECT `s_birth`,(DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(`s_birth`, '%Y') -(IF(DATE_FORMAT(NOW(), '%m%d') > DATE_FORMAT(`s_birth`, '%m%d'),0,1))) AS age
FROM `student`;-- 47、查询本周过生日的学生。
SELECT *
FROM `student`
WHERE WEEK(DATE_FORMAT(NOW(), '%Y%m%d')) = WEEK(`s_birth`);SELECT *
FROM `student`
WHERE YEARWEEK(`s_birth`) = YEARWEEK(DATE_FORMAT(NOW(), '%Y%m%d'));SELECT WEEK(DATE_FORMAT(NOW(), '%Y%m%d'));-- 48、查询下周过生日的学生。
SELECT *
FROM `student`
WHERE WEEK(DATE_FORMAT(NOW(), '%Y%m%d')) + 1 = WEEK(`s_birth`);-- 49、查询本月过生日的学生。
SELECT *
FROM `student`
WHERE MONTH(DATE_FORMAT(NOW(), '%Y%m%d')) = MONTH(`s_birth`);-- 50、查询下月过生日的学生。
SELECT *
FROM `student`
WHERE MONTH(DATE_FORMAT(NOW(), '%Y-%m-%d')) + 1 = MONTH(`s_birth`);
-- 查询课程"01"比课程"02"成绩高的学生的信息及课程分数。
-- - in ~ 长型数据变成宽型数据。
SELECT st.*, t.s01, t.s02
FROM(SELECT sc.`s_id`,MAX(CASEWHEN sc.`c_id` = '01' THEN sc.`s_score`END) s01,MAX(CASEWHEN sc.`c_id` = '02' THEN sc.`s_score`END) s02FROM`score` scGROUP BY sc.`s_id`) t,`student` st
WHEREt.s01 > t.s02 AND t.`s_id` = st.`s_id`;-- 自连接。
SELECT st.*, sc1.`s_score`, sc2.`s_score`
FROM`student` st,`score` sc1,`score` sc2
WHEREst.`s_id` = sc1.`s_id`AND sc1.`s_id` = sc2.`s_id`AND sc1.`c_id` = '01'AND sc2.`c_id` = '02'AND sc1.`s_score` > sc2.`s_score`;-- 2、查询课程"01"比课程"02"成绩低的学生的信息及课程分数。
SELECT `student`.*, sc1.`s_score`, sc2.`s_score`
FROM`student`INNER JOIN`score` sc1 ON `student`.`s_id` = sc1.`s_id`AND sc1.`c_id` = '01'INNER JOIN`score` sc2 ON sc1.`s_id` = sc2.`s_id`AND sc2.`c_id` = '02'
WHEREsc1.`s_score` < sc2.`s_score`OR sc1.`s_score` IS NULL;-- 3、查询平均成绩大于等于 60 分的同学的学生编号和学生姓名和平均成绩。
-- 子查询方法。
SELECT sc.`s_id`,(SELECT `s_name`FROM`student` stWHEREst.`s_id` = sc.`s_id`) AS s_name,AVG(sc.`s_score`) avg_score
FROM`score` sc
GROUP BY sc.`s_id`
HAVING avg_score >= 60;-- 两个表连接方法。
SELECT st.`s_id`, st.`s_name`, AVG(sc.`s_score`)
FROM`student` st,`score` sc
WHEREst.`s_id` = sc.`s_id`
GROUP BY st.`s_id`
HAVING AVG(sc.`s_score` >= 60);-- 4、查询平均成绩小于 60 分的同学的学生编号和学生姓名和平均成绩。
-- (包括有成绩的和无成绩的)。
SELECT st.`s_id`, st.`s_name`, AVG(sc.`s_score`) AS avg_score
FROM`student` st,`score` sc
WHEREst.`s_id` = sc.`s_id`
GROUP BY sc.`s_id`
HAVING AVG(sc.`s_score`) < 60 
UNION SELECT st.`s_id`, st.`s_name`, 0 AS avg_score
FROM`student` st
WHEREst.`s_id` NOT IN (SELECT DISTINCT`s_id`FROM`score`);-- 5、查询所有同学的学生编号、学生姓名、选课总数、所有课程的总成绩。
SELECT st.`s_id`,st.`s_name`,COUNT(sc.s_id) AS sum_course,IFNULL(SUM(sc.`s_score`), 0) AS sum_score
FROM`student` stLEFT OUTER JOIN`score` sc ON st.`s_id` = sc.`s_id`
GROUP BY st.`s_id`;-- 6、查询"李"姓老师的数量。
SELECT COUNT(`t_id`)
FROM`teacher`
WHERE`t_name` LIKE '李%';-- 7、查询学过"张三"老师授课的同学的信息。
SELECT st.*
FROM`student` stJOIN`score` sc ON st.`s_id` = sc.`s_id`
WHEREsc.`c_id` IN (SELECT `c_id`FROM`course`WHERE`t_id` = (SELECT `t_id`FROM`teacher`WHERE`t_name` = '老师 1'));SELECT st.*
FROM`student` stINNER JOIN`score` sc ON st.`s_id` = sc.`s_id`
WHEREsc.`c_id` IN (SELECT `c_id`FROM`course` cINNER JOIN`teacher` t ON c.`t_id` = t.`t_id`WHERE`t`.`t_name` = '老师 1');-- 8、查询没学过"张三"老师授课的同学的信息。
SELECT *
FROM`student` st
WHEREst.s_id NOT IN (SELECT st.`s_id`FROM`student` stJOIN`score` sc ON st.`s_id` = sc.`s_id`WHEREsc.`c_id` IN (SELECT `c_id`FROM`course`WHERE`t_id` = (SELECT `t_id`FROM`teacher`WHERE`t_name` = '老师 1')));SELECT *
FROM`student`
WHERE`s_id` NOT IN (SELECT sc.`s_id`FROM`teacher` t,`score` sc,`course` cWHEREt.`t_id` = c.`t_id`AND c.`c_id` = sc.`c_id`AND t.`t_name` = '老师 1');SELECT *
FROM`student`
WHERENOT EXISTS( SELECT 1FROM(SELECT sc.`s_id`FROM`teacher` t, `score` sc, `course` cWHEREt.`t_id` = c.`t_id`AND c.`c_id` = sc.`c_id`AND t.`t_name` = '老师 1') tWHEREt.s_id = student.s_id);-- 9、查询学过编号为"01"并且也学过编号为"02"的课程的同学的信息。
SELECT st.*
FROM`student` st,`score` sc1,`score` sc2
WHEREst.`s_id` = sc1.`s_id`AND st.`s_id` = sc2.`s_id`AND sc1.`c_id` = '01'AND sc2.`c_id` = '02';-- 10、查询学过编号为"01"但是没有学过编号为"02"的课程的同学的信息。
SELECT st.*
FROM`student` st
WHEREst.`s_id` IN (SELECT `s_id`FROM`score`WHERE`c_id` = '01')AND st.`s_id` NOT IN (SELECT `s_id`FROM`score`WHERE`c_id` = '02');SELECT st.*
FROM`student` st,(SELECT `s_id`,MAX(IF(`c_id` = '01', `s_score`, NULL)) s01,MAX(IF(`c_id` = '02', `s_score`, NULL)) s02FROM`score`GROUP BY `s_id`) t
WHEREt.`s_id` = st.`s_id`AND t.s01 IS NOT NULLAND t.s02 IS NULL;-- 11、查询没有学全所有课程的同学的信息。
SELECT st.*, COUNT(sc.`c_id`) count_sc
FROM`student` stLEFT JOIN`score` sc ON st.`s_id` = sc.`s_id`
GROUP BY st.`s_id`
HAVING COUNT(sc.`c_id`) < (SELECT COUNT(`c_id`)FROM`course`);SELECT st.*
FROM`student` st
WHEREst.`s_id` IN (SELECT `s_id`FROM`score`WHERE`s_id` NOT IN (SELECT sc1.`s_id`FROM`score` sc1JOIN`score` sc2 ON sc1.`s_id` = sc2.`s_id`AND sc2.`c_id` = '02'JOIN`score` sc3 ON sc1.`s_id` = sc3.`s_id`AND sc3.`c_id` = '03'WHEREsc1.`c_id` = '01'));-- 12、查询至少有一门课与学号为"01"的同学所学相同的同学的信息。
SELECT *
FROM`student`
WHERE`s_id` IN (SELECT DISTINCT`s_id`FROM`score`WHERE`c_id` IN (SELECT `c_id`FROM`score`WHERE`s_id` = '01'))
GROUP BY 1 , 2 , 3 , 4;
-- 第 1 2 3 4 字段。-- 13、查询和"01"号的同学学习的课程完全相同的其他同学的信息。-- 创建 01 所学临时表。
CREATE TABLE s01_sc_temp AS SELECT t1.*, sc.`c_id` cid2 FROM(SELECT st.*, t2.`c_id`FROM`student` st, (SELECT `c_id`FROM`score`WHERE`s_id` = '01') t2) t1LEFT JOIN`score` sc ON t1.`s_id` = sc.`s_id`AND t1.`c_id` = sc.`c_id` 
UNION SELECT t.*, sc.`c_id` cid2
FROM(SELECT st.*, b.`c_id`FROM`student` st, (SELECT `c_id`FROM`score`WHERE`s_id` = '01') b) tRIGHT JOIN`score` sc ON t.`s_id` = sc.`s_id`AND t.`c_id` = sc.`c_id`;SELECT *
FROM`student`
WHERE`s_id` NOT IN (SELECT `s_id`FROMs01_s_tempWHEREcid2 IS NULL OR `c_id` IS NULL)AND `s_id` != '01';-- ~ ~ ~SELECT *
FROM`student`
WHERE`s_id` IN (SELECT DISTINCT`s_id`FROM`score`WHERE`s_id` != '01'AND `c_id` IN (SELECT `c_id`FROM`score`WHERE`s_id` = '01')GROUP BY `s_id`HAVING COUNT(1) = (SELECT COUNT(1)FROM`score`WHERE`s_id` = '01'));-- 14、查询没学过"张三"老师讲授的任一门课程的学生姓名。
SELECT st.`s_name`
FROM`student` st
WHEREst.`s_id` NOT IN (SELECT `s_id`FROM`score`WHERE`c_id` = (SELECT `c_id`FROM`course`WHERE`t_id` = (SELECT `t_id`FROM`teacher`WHERE`t_name` = '老师 1'))GROUP BY s_id);-- 15、查询两门及其以上不及格课程的同学的学号,姓名及其平均成绩。
SELECT st.`s_id`, st.`s_name`, AVG(sc.`s_score`) avg_score
FROM`student` stLEFT JOIN`score` sc ON st.`s_id` = sc.`s_id`
GROUP BY st.`s_id`
HAVING SUM(IF(sc.`s_score` >= 60, 0, 1)) >= 2;SELECT st.`s_id`, st.`s_name`, AVG(sc.`s_score`) avg_score
FROM`student` stLEFT JOIN`score` sc ON st.`s_id` = sc.`s_id`
GROUP BY st.`s_id`
HAVING SUM(IF(sc.`s_score` >= 60, 0, 1)) >= 2;SELECT st.`s_id`, st.`s_name`, ROUND(AVG(sc.`s_score`))
FROMstudent stLEFT JOINscore sc ON st.`s_id` = sc.`s_id`
WHEREst.`s_id` IN (SELECT `s_id`FROM`score`WHERE`s_score` < 60GROUP BY `s_id`HAVING COUNT(1) >= 2)
GROUP BY st.`s_id` , st.`s_name`;-- 16、检索课程"01"分数小于 60,按分数降序排列的学生信息。
SELECT st.*, sc.`s_score`
FROM`score` scRIGHT JOIN`student` st ON sc.`s_id` = st.`s_id`
WHEREsc.`c_id` = '01' AND sc.`s_score` < 60
ORDER BY `s_score` DESC;SELECT st.*, sc.`c_id`, sc.`s_score`
FROM`student` st,`score` sc
WHEREst.`s_id` = sc.`s_id`AND sc.`c_id` = '01'AND sc.`s_score` < 60
ORDER BY sc.`s_score` DESC;-- 17、按平均成绩从高到低显示所有学生的所有课程的成绩以及平均成绩。
SELECT sc.`s_id`,(SELECT `s_score`FROM `score`WHERE `s_id` = sc.`s_id`AND `c_id` = '01')    AS 语文,(SELECT `s_score`FROM `score`WHERE `s_id` = sc.`s_id`AND `c_id` = '02')    AS 数学,(SELECT `s_score`FROM `score`WHERE `s_id` = sc.`s_id`AND `c_id` = '03')    AS 英语,ROUND(AVG(`s_score`), 2) AS 平均分
FROM `score` sc
GROUP BY sc.`s_id`
ORDER BY 平均分 DESC;-- 18.查询各科成绩最高分、最低分和平均分,以如下形式显示:课程 ID,课程 name,最高分,最低分,平均分,及格率,中等率,优良率,优秀率。
-- 及格为 >= 60,中等为:70 ~ 80,优良为:80 ~ 90,优秀为:>= 90。
SELECT sc.`c_id`,c.`c_name`,MAX(`s_score`),MIN(`s_score`),ROUND(AVG(`s_score`), 2),ROUND(100 * (SUM(IF(sc.`s_score` >= 60, 1, 0)) / SUM(IF(sc.`s_score`, 1, 0))),2) AS 及格率,ROUND(100 * (SUM(IF(sc.`s_score` >= 70 AND sc.`s_score` <= 80, 1, 0)) / SUM(IF(sc.`s_score`, 1, 0))),2) AS 中等率,ROUND(100 * (SUM(IF(sc.`s_score` >= 80 AND sc.`s_score` <= 90, 1, 0)) / SUM(IF(sc.`s_score`, 1, 0))),2) AS 优良率,ROUND(100 * (SUM(IF(sc.`s_score` >= 90, 1, 0)) / SUM(IF(sc.`s_score`, 1, 0))),2) AS 优秀率
FROM `score` scLEFT JOIN`course` c ON sc.`c_id` = c.`c_id`
GROUP BY sc.`c_id`, c.`c_name`;-- 19、按各科成绩进行排序,并显示排名(实现不完全)。
-- mysql 没有 rank(); 函数。
SELECT sc1.`c_id`,sc1.`s_id`,sc1.`s_score`,COUNT(sc2.`s_score`) + 1 AS `rank`
FROM`score` sc1LEFT JOIN`score` sc2 ON sc1.`s_score` < sc2.`s_score`AND sc1.`c_id` = sc2.`c_id`
GROUP BY sc1.`c_id` , sc1.`s_id` , sc1.`s_score`
ORDER BY sc1.`c_id` , `rank`;-- 20、查询学生的总成绩并进行排名。
SELECT t1.`s_id`,@i:=@i + 1 AS i,@k:=(IF(@score = t1.sum_score, @k, @i)) AS `rank`,@score:=t1.sum_score AS score
FROM(SELECT `s_id`, SUM(`s_score`) AS sum_scoreFROM`score`GROUP BY `s_id`ORDER BY sum_score DESC) t1,(SELECT @k:=0, @i:=0, @score:=0) AS kis;-- 21、查询不同老师所教不同课程平均分从高到低显示。
SELECT c.`t_id`,t.`t_name`,c.`c_id`,ROUND(AVG(`s_score`), 2) AS avg_score
FROM`course` cLEFT JOIN`score` sc ON c.`c_id` = sc.`c_id`LEFT JOIN`teacher` t ON c.`t_id` = t.`t_id`
GROUP BY c.`c_id` , c.`t_id` , t.`t_name`
ORDER BY avg_score DESC;-- 22、查询所有课程的成绩第 2 名到第 3 名的学生信息及该课程成绩。
SELECT d.*,si2.排名,si2.`s_score`,si2.`c_id`
FROM (SELECT sc.`s_id`,sc.`s_score`,sc.`c_id`,@i := @i + 1 AS 排名FROM `score` sc,(SELECT @i := 0) as i2WHERE sc.c_id = '01') as si2LEFT JOINstudent d ON si2.s_id = d.s_id
WHERE 排名 BETWEEN 2 AND 3
UNION
SELECT st.*,sj2.排名,sj2.s_score,sj2.c_id
FROM (SELECT sc.s_id,sc.s_score,sc.c_id,@j := @j + 1 AS 排名FROM `score` sc,(SELECT @j := 0) as j2WHERE sc.c_id = '02') as sj2LEFT JOIN`student` st ON sj2.s_id = st.s_id
WHERE 排名 BETWEEN 2 AND 3
UNION
SELECT d.*,s.排名,s.`s_score`,s.`c_id`
FROM (SELECT sc.`s_id`,sc.`s_score`,sc.`c_id`,@k := @k + 1 AS 排名FROM `score` sc,(SELECT @k := 0) as k2WHERE sc.`c_id` = '03') as sLEFT JOIN`student` d ON s.`s_id` = d.`s_id`
WHERE 排名 BETWEEN 2 AND 3;-- 23、统计各科成绩各分数段人数:课程编号, 课程名称, [100-85], [85-70], [70-60], [0-60] 及所占百分比。
SELECT DISTINCT c.`c_name`,sc.`c_id`,t1.`85-100`,t1.百分比,t2.`70-85`,t2.百分比,t3.`60-70`,t3.百分比,t4.`0-60`,t4.百分比
FROM `score` scLEFT JOIN(SELECT `c_id`,SUM(IF(`s_score` > 85 AND `s_score` <= 100, 1, 0))                              AS `85-100`,ROUND(100 * (SUM(IF(`s_score` > 85 AND `s_score` <= 100, 1, 0)) / COUNT(*)), 2) AS 百分比FROM `score`GROUP BY `c_id`) t1 ON sc.`c_id` = t1.`c_id`LEFT JOIN(SELECT `c_id`,SUM(IF(`s_score` > 70 AND `s_score` <= 85, 1, 0))                              AS `70-85`,ROUND(100 * (SUM(IF(`s_score` > 70 AND `s_score` <= 85, 1, 0)) / COUNT(*)), 2) AS 百分比FROM `score`GROUP BY `c_id`) t2 ON sc.`c_id` = t2.`c_id`LEFT JOIN(SELECT `c_id`,SUM(IF(`s_score` > 60 AND `s_score` <= 70, 1, 0))                              AS `60-70`,ROUND(100 * (SUM(IF(`s_score` > 60 AND `s_score` <= 70, 1, 0)) / COUNT(*)), 2) AS 百分比FROM `score`GROUP BY `c_id`) t3 ON sc.`c_id` = t3.`c_id`LEFT JOIN(SELECT `c_id`,SUM(IF(`s_score` >= 0 AND `s_score` <= 60, 1, 0))                              AS `0-60`,ROUND(100 * (SUM(IF(`s_score` >= 0 AND `s_score` <= 60, 1, 0)) / COUNT(*)), 2) AS 百分比FROM `score`GROUP BY `c_id`) t4 ON sc.`c_id` = t4.`c_id`LEFT JOIN`course` c ON sc.`c_id` = c.`c_id`;-- 24、查询学生平均成绩及其名次。
SELECT t.`s_id`,@i := @i + 1                                 AS '不保留空缺排名',@k := (IF(@avg_score = t.avg_score, @k, @i)) AS '保留空缺排名',@avg_score := avg_score                      AS '平均分'
FROM (SELECT `s_id`,ROUND(AVG(`s_score`), 2) AS avg_scoreFROM scoreGROUP BY `s_id`) t,(SELECT @avg_score := 0, @i := 0, @k := 0) b;-- 25、查询各科成绩前三名的记录。
-- - 选出 sc1 表比 sc2 表成绩大的所有组。
-- - 选出比当前 id 成绩大的小于三个的。
SELECT sc1.`s_id`, sc1.`c_id`, sc1.`s_score`
FROM`score` sc1LEFT JOIN`score` sc2 ON sc1.`c_id` = sc2.`c_id`AND sc1.`s_score` < sc2.`s_score`
GROUP BY sc1.`s_id` , sc1.`c_id` , sc1.`s_score`
HAVING COUNT(sc2.`s_id`) < 3
ORDER BY sc1.`c_id` , sc1.`s_score` DESC;-- 26、查询每门课程被选修的学生数。
SELECT `c_id`, COUNT(`s_id`)
FROM`score`
GROUP BY `c_id`;-- 27、查询出只有两门课程的全部学生的学号和姓名。
SELECT `s_id`, `s_name`
FROM`student`
WHERE`s_id` IN (SELECT `s_id`FROM`score`GROUP BY `s_id`HAVING COUNT(`c_id`) = 2);-- 28、查询男生、女生人数。
SELECT `s_sex`, COUNT(`s_sex`) AS 人数
FROMstudent
GROUP BY s_sex;-- 29、查询名字中含有"风"字的学生信息。
SELECT *
FROM`student`
WHERE`s_name` LIKE '%风%';-- 30、查询同名同性学生名单,并统计同名人数。
SELECT st1.`s_name`, st1.`s_sex`, COUNT(*)
FROM`student` st1JOIN`student` st2 ON st1.`s_id` != st2.`s_id`AND st1.`s_name` = st2.`s_name`AND st1.`s_sex` = st2.`s_sex`
GROUP BY st1.`s_name` , st1.`s_sex`;-- 31、查询 1990 年出生的学生名单。
SELECT `s_name`
FROM`student`
WHERE`s_birth` LIKE '1990%';-- 32、查询每门课程的平均成绩,结果按平均成绩降序排列,平均成绩相同时,按课程编号升序排列。
SELECT `c_id`, ROUND(AVG(`s_score`), 2) AS avg_score
FROM`score`
GROUP BY `c_id`
ORDER BY avg_score DESC , `c_id` ASC;-- 33、查询平均成绩大于等于 85 的所有学生的学号、姓名和平均成绩。
SELECT sc.`s_id`,st.`s_name`,ROUND(AVG(sc.`s_score`), 2) AS avg_score
FROM`score` scLEFT JOIN`student` st ON sc.`s_id` = st.`s_id`
GROUP BY `s_id`
HAVING avg_score >= 85;-- 34、查询课程名称为"数学",且分数低于 60 的学生姓名和分数。
SELECT st.`s_name`, sc.`s_score`
FROM`score` scLEFT JOIN`student` st ON st.`s_id` = sc.`s_id`
WHEREsc.`c_id` = (SELECT `c_id`FROM`course`WHERE`c_name` = '数学')AND sc.s_score < 60;-- 35、查询所有学生的课程及分数情况。
SELECT st.`s_id`,st.`s_name`,SUM(IF(c.`c_name` = '语文', sc.`s_score`, 0)) AS '语文',SUM(IF(c.`c_name` = '数学', sc.`s_score`, 0)) AS '数学',SUM(IF(c.`c_name` = '英语', sc.`s_score`, 0)) AS '英语',SUM(sc.`s_score`)                             AS '总分'
FROM `student` stLEFT JOIN`score` sc ON st.`s_id` = sc.`s_id`LEFT JOIN`course` c ON sc.`c_id` = c.`c_id`
GROUP BY st.`s_id`, st.`s_name`;-- 36、查询任何一门课程成绩在 70 分以上的姓名、课程名称和分数。
SELECT st.`s_name`, c.`c_name`, sc.`s_score`
FROM`course` cLEFT JOIN`score` sc ON c.`c_id` = sc.`c_id`LEFT JOIN`student` st ON st.`s_id` = sc.`s_id`
WHEREsc.`s_score` >= 70;-- 37、查询不及格的课程。
SELECT sc.`s_id`, sc.`c_id`, c.`c_name`, sc.`s_score`
FROM`score` scLEFT JOIN`course` c ON sc.`c_id` = c.`c_id`
WHEREsc.`s_score` < 60;-- 38、查询课程编号为 01 且课程成绩在 80 分以上的学生的学号和姓名。
SELECT sc.`s_id`, st.`s_name`
FROM`score` scLEFT JOIN`student` st ON sc.`s_id` = st.`s_id`
WHEREsc.`c_id` = '01' AND sc.`s_score` > 80;-- 39、求每门课程的学生人数。
SELECT COUNT(*)
FROM`score`
GROUP BY `c_id`;-- 40、查询选修"张三"老师所授课程的学生中,成绩最高的学生信息及其成绩。
-- 查询老师 id。
SELECT `c_id`
FROM`course` c,`teacher` t
WHEREc.`t_id` = t.`t_id`AND t.`t_name` = '老师 1';
-- 查询最高分(可能有相同分数)。
SELECT MAX(`s_score`)
FROM`score`
WHERE`c_id` = '02';
-- 查询信息。
SELECT st.*, sc.`s_score`, sc.`c_id`, c.`c_name`
FROM`student` stLEFT JOIN`score` sc ON st.`s_id` = sc.`s_id`LEFT JOIN`course` c ON sc.`c_id` = c.`c_id`
WHEREsc.`c_id` = (SELECT `c_id`FROM`course` c,`teacher` tWHEREc.`t_id` = t.`t_id`AND t.`t_name` = '老师 1')AND sc.s_score IN (SELECT MAX(s_score)FROMscoreWHEREc_id = '02');SELECT c.`c_name`, sc.`s_score`, st.*
FROM`course` c,`score` sc,`teacher` t,`student` st
WHEREt.`t_id` = c.`t_id`AND c.`c_id` = sc.`c_id`AND st.`s_id` = sc.`s_id`AND t.`t_name` = '老师 1'AND sc.s_score IN (SELECT MAX(s_score)FROMcourse,score,teacher,studentWHEREteacher.t_id = course.t_idAND course.c_id = score.c_idAND student.s_id = score.s_idAND teacher.t_name = '老师 1');-- 41、查询不同课程成绩相同的学生的学生编号、课程编号、学生成绩。
SELECT DISTINCTsc2.`s_id`, sc2.`c_id`, sc2.`s_score`
FROM`score` sc1,`score` sc2
WHEREsc1.`c_id` != sc2.`c_id`AND sc1.`s_score` = sc2.`s_score`;-- 42、查询每门功成绩最好的前两名。
-- 牛逼的写法。
SELECT sc1.`s_id`, sc1.`c_id`, sc1.`s_score`
FROM`score` sc1
WHERE(SELECT COUNT(1)FROM`score` sc2WHEREsc2.`c_id` = sc1.`c_id`AND sc2.`s_score` >= sc1.`s_score`) <= 2
ORDER BY sc1.`c_id`;-- 43、统计每门课程的学生选修人数(超过 5 人的课程才统计)。要求输出课程号和选修人数,查询结果按人数降序排列,若人数相同,按课程号升序排列。
SELECT `c_id`, COUNT(*) AS total
FROM`score`
GROUP BY `c_id`
HAVING total > 5
ORDER BY total DESC , `c_id`;-- 44、检索至少选修两门课程的学生学号。
SELECT `s_id`, COUNT(*)
FROM`score`
GROUP BY `s_id`
HAVING COUNT(*) >= 2;-- 45、查询选修了全部课程的学生信息。
SELECT *
FROM`student`
WHERE`s_id` IN (SELECT `s_id`FROM`score`GROUP BY `s_id`HAVING COUNT(*) = (SELECT COUNT(*)FROM`course`));-- 46、查询各学生的年龄。
-- 按照出生日期来算,当前月日 < 出生年月的月日则,年龄减一。
SELECT `s_birth`,(DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(`s_birth`, '%Y') - (IF(DATE_FORMAT(NOW(), '%m%d') > DATE_FORMAT(`s_birth`, '%m%d'),0,1))) AS age
FROM`student`;-- 47、查询本周过生日的学生。
SELECT *
FROM`student`
WHEREWEEK(DATE_FORMAT(NOW(), '%Y%m%d')) = WEEK(`s_birth`);SELECT *
FROM`student`
WHEREYEARWEEK(`s_birth`) = YEARWEEK(DATE_FORMAT(NOW(), '%Y%m%d'));SELECT WEEK(DATE_FORMAT(NOW(), '%Y%m%d'));-- 48、查询下周过生日的学生。
SELECT *
FROM`student`
WHEREWEEK(DATE_FORMAT(NOW(), '%Y%m%d')) + 1 = WEEK(`s_birth`);-- 49、查询本月过生日的学生。
SELECT *
FROM`student`
WHEREMONTH(DATE_FORMAT(NOW(), '%Y%m%d')) = MONTH(`s_birth`);-- 50、查询下月过生日的学生。
SELECT *
FROM`student`
WHEREMONTH(DATE_FORMAT(NOW(), '%Y-%m-%d')) + 1 = MONTH(`s_birth`);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/69916.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【ES6】js中的__proto__和prototype

在JavaScript中&#xff0c;__proto__和prototype都是用于实现对象继承的关键概念。 1、proto __proto__是一个非标准的属性&#xff0c;用于设置或获取一个对象的原型。这个属性提供了直接访问对象内部原型对象的途径。对于浏览器中的宿主对象和大多数对象来说&#xff0c;可…

单例模式——C++版本

1.什么是单例模式 在一个项目中&#xff0c;全局范围内&#xff0c;某个类的实例有且仅有一个&#xff0c;通过这个唯一实例向其他模块提供数据的全局访问&#xff0c;这种模式就叫单例模式。 类中多对象的操作函数有如下几个&#xff1a; 构造函数 &#xff1a; 能够创建出一…

加强版python连接飞书通知——本地电脑PC端通过网页链接打开本地已安装软件(调用注册表形式,以漏洞扫描工具AppScan为例)

前言 如果你想要通过超链接来打开本地应用,那么你首先你需要将你的应用添入windows注册表中(这样网页就可以通过指定代号来调用程序),由于安全性的原因所以网页无法直接通过输入绝对路径来调用本地文件。 一、通过创建reg文件自动配置注册表 创建文本文档,使用记事本打开…

STM32使用FAT文件系统-常见概念、代码走读

fat文件系统的所有外部接口都在ff.h中 格式化 挂载 使用文件系统的第一步&#xff0c;就是挂载。 函数原型&#xff1a;FRESULT f_mount (FATFS* fs, const TCHAR* path, BYTE opt); /* Mount/Unmount a logical drive */ static FATFS fs; FRESULT fres f_mo…

【爬虫】7.4. 字体反爬案例分析与爬取实战

字体反爬案例分析与爬取实战 文章目录 字体反爬案例分析与爬取实战1. 案例介绍2. 案例分析3. 爬取 本节来分析一个反爬案例&#xff0c;该案例将真实的数据隐藏到字体文件里&#xff0c;即使我们获取了页面源代码&#xff0c;也无法直接提取数据的真实值。 1. 案例介绍 案例网…

第2节-PhotoShop基础课程-基础操作

文章目录 前言一、详细操作1. 新建 Ctrl N2.打开 Ctrl o1.拖入同一个文件2.打开另外一个文件 3. 首选项 提高软件运行效率 Ctrl K1. 选择ps界面颜色2.文件处理3. 内存以及回操4.暂存位置2. 另存为 Ctrl Shift S3.导出为 Ctrl Alt Shift w 5. 关闭1. 关闭Ctrl W 6. 选择7…

存储过程报Illegal mix of collations错误的解决方法

CREATE PROCEDURE maxAgeStudent(IN _gender CHAR) BEGINDECLARE maxage INT DEFAULT 0;SELECT max(age) INTO maxage FROM student where gender _gender;SELECT * from student WHERE age maxage and gender _gender; END; 在调用的时候 call maxAgeStudent(1) 产生了报…

SpringCloud入门实战(十五)分布式事务框架Seata简介

&#x1f4dd; 学技术、更要掌握学习的方法&#xff0c;一起学习&#xff0c;让进步发生 &#x1f469;&#x1f3fb; 作者&#xff1a;一只IT攻城狮 &#xff0c;关注我&#xff0c;不迷路 。 &#x1f490;学习建议&#xff1a;1、养成习惯&#xff0c;学习java的任何一个技术…

利用梯度下降法求最小值及动画展示

视频讲解链接:3.1梯度下降法求最小值_哔哩哔哩_bilibili# 利用梯度下降法求最小值 import matplotlib.pyplot as plt from matplotlib.animation import FuncAnimation import numpy as np plt.rcParams[font.sans-serif] = [SimHei] # 用来正常显示中文标签 plt.rcParams[ax…

qemu/kvm学习笔记

qemu/kvm架构 cpu虚拟化的示例 Reference: kvmtest.c [LWN.net] 主要步骤&#xff1a; QEMU通过/dev/kvm设备文件发起KVM_CREATE_VM ioctl&#xff0c;请求KVM创建一个虚拟机。KVM创建虚拟机相应的结构体&#xff0c;并为QEMU返回一个虚拟机文件描述符QEMU通过虚拟机文件描述…

学习设计模式之代理模式,但是宝可梦

前言 作者在准备秋招中&#xff0c;学习设计模式&#xff0c;做点小笔记&#xff0c;用宝可梦为场景举例&#xff0c;有错误欢迎指出。 代码同步更新到 github ,要是点个Star您就是我的神 目录 前言代理模式1.情景模拟1.1静态代理优点局限 1.2 动态代理 2.应用3.局限4.解决方…

读懂AUTOSAR,之CAN Driver L-PDU发送和“重入问题”

1. L-PDU发送 L-PDU传输时,Can模块将L-PDU内容ID和数据长度转换为硬件特定格式(如果需要),并触发传输。 [SWS_Can_00059] CAN到内存的数据映射定义为首先发送的CAN数据字节为数组元素0,最后发送的CAN数据字节为数组元素7或63(在CAN FD的情况下)。(SRS_SPAL_12063)[S…

CSDN每日一练 |『生命进化书』『订班服』『c++难题-大数加法』2023-09-06

CSDN每日一练 |『生命进化书』『订班服』『c++难题-大数加法』2023-09-06 一、题目名称:生命进化书二、题目名称:订班服三、题目名称:c++难题-大数加法一、题目名称:生命进化书 时间限制:1000ms内存限制:256M 题目描述: 小A有一本生命进化书,以一个树形结构记载了所有生…

leetcode分类刷题:易混题辨析一、209. 长度最小的子数组 vs 560. 和为K的子数组

1、刷题慢慢积累起来以后&#xff0c;遇到相似的题目时&#xff0c;会出现算法思路混淆了 2、这两道题都是对连续子数组加和进行考察&#xff0c;细节区别在于数组元素在209. 长度最小的子数组为正整数&#xff08;窗口增加元素递增&#xff0c;减少元素递减&#xff09;&#…

linux 进程管理命令

进程管理命令 查看进程命令 ps命令 显示系统上运行的进程列表 # 查看系统中所有正在运行的系统ps aux# 获取占用内存资源最多的10个进程&#xff0c;可以使用如下命令组合&#xff1a;ps aux|head -1;ps aux|grep -v PID|sort -rn -k 4|head# 获取占用CPU资源最多的10个进程&am…

PXE批量装机

目录 前言 一、交互式 &#xff08;一&#xff09;、搭建环境 &#xff08;二&#xff09;、配置dhcp服务 &#xff08;三&#xff09;、FTP服务 &#xff08;四&#xff09;、配置TFTP服务 &#xff08;五&#xff09;、准备pxelinx.0文件、引导文件、内核文件 &#…

C#开发的OpenRA游戏之信标按钮

前面已经分析了两个按钮:变卖和维修,接着下来就是分析信标按钮,这个按钮使用是比较少,但是对于多人游戏时,使用这个信号就很方便同盟军过来查看和帮助了,相当于一个朋友之间共同查看的地址。当你经过同盟标记的标志时,就会听到beacon detected,检测到信标,这就是你的盟…

如何系统地学习 JavaScript?

前言 在学习JavaScript前需要先将Html和Css的相关知识点弄清楚&#xff0c;Js的很多操作是要结合Html和Css&#xff0c;下面我总结了Html、Css和Js的相关学习知识点供参考&#xff0c;希望对你有所帮助喔~ Html 文档学习 【HTML 】w3school教程 :https://www.w3school.com.…

【SpringBoot入门】详解@Autowired的使用

【SpringBoot入门】详解Autowired的使用 在构造函数中使用Autowired的注解的简单实例除了构造函数&#xff0c;Autowired注解还可以用在哪些地方&#xff1f;方法上&#xff1a;字段上&#xff1a;Setter方法上&#xff1a;构造函数参数上&#xff1a; 在构造函数中使用Autowir…

Java分别用BIO、NIO实现简单的客户端服务器通信

分别用BIO、NIO实现客户端服务器通信 BIONIONIO演示&#xff08;无Selector&#xff09;NIO演示&#xff08;Selector&#xff09; 前言&#xff1a; Java I/O模型发展以及Netty网络模型的设计思想 BIO Java BIO是Java平台上的BIO&#xff08;Blocking I/O&#xff09;模型&a…