Administrator
发布于 2025-10-10 / 4 阅读
0
0

习题答案

以下是根据您提供的建表语句和数据,所有习题的完整答案:

练习1:比较查询

​
-- 1. 查询所有女生的姓名、家乡和语文成绩
​
SELECT s_name, s_hometown, s_chinese 
​
FROM students 
​
WHERE s_gender = '女';
​
-- 2. 查询数学成绩大于 90 分的学生姓名
​
SELECT s_name 
​
FROM students 
​
WHERE s_math > 90;
​
-- 3. 查询语文成绩在 70~90 分之间的学生
​
SELECT * 
​
FROM students 
​
WHERE s_chinese BETWEEN 70 AND 90;
​
-- 4. 查询数学成绩比语文成绩高至少 20 分的学生
​
SELECT * 
​
FROM students 
​
WHERE s_math - s_chinese >= 20;
​
-- 5. 查询总分(四科之和)超过 350 分的学生
​
SELECT * 
​
FROM students 
​
WHERE (COALESCE(s_chinese,0) + COALESCE(s_math,0) + COALESCE(s_english,0) + COALESCE(s_computer,0)) > 350;
​
-- 6. 查询总分高于"丁雨萱"的学生
​
SELECT * 
​
FROM students 
​
WHERE (COALESCE(s_chinese,0) + COALESCE(s_math,0) + COALESCE(s_english,0) + COALESCE(s_computer,0)) > 
​
•      (SELECT COALESCE(s_chinese,0) + COALESCE(s_math,0) + COALESCE(s_english,0) + COALESCE(s_computer,0) 
​
•       FROM students WHERE s_name = '丁雨萱');
​

练习2:IN 或 NOT IN查询

​
-- 1. 查询来自"丛台区"、"邯山区"、"复兴区"这三个地区的学生信息
​
SELECT s_name, s_gender, s_hometown 
​
FROM students 
​
WHERE s_hometown IN ('丛台区', '邯山区', '复兴区');
​
-- 2. 查询不是"肥乡区"和"永年区"的学生,且语文成绩在80分以上的学生信息
​
SELECT * 
​
FROM students 
​
WHERE s_hometown NOT IN ('肥乡区', '永年区') 
​
AND s_chinese > 80;
​
-- 3. 查询有特长且家乡在"丛台区"或"复兴区",或者家乡为空的学生
​
SELECT * 
​
FROM students 
​
WHERE s_specialty = '是' 
​
AND (s_hometown IN ('丛台区', '复兴区') OR s_hometown IS NULL);
​
-- 4. 查询数学成绩或英语成绩在90分以上的男生,或者计算机成绩在85分以上的女生
​
SELECT * 
​
FROM students 
​
WHERE (s_gender = '男' AND (s_math > 90 OR s_english > 90)) 
​
   OR (s_gender = '女' AND s_computer > 85);
​
-- 5. 查询没有特长,且家乡不在"丛台区"和"邯山区",同时出生日期不为空的学生信息
​
SELECT * 
​
FROM students 
​
WHERE s_specialty = '否' 
​
AND s_hometown NOT IN ('丛台区', '邯山区') 
​
AND s_birthdate IS NOT NULL;
​

练习3:LIKE匹配查询

​
-- 1. 查询姓"许"的学生信息
​
SELECT * 
​
FROM students 
​
WHERE s_name LIKE '许%';
​
-- 2. 查询名字中包含"雨"字的学生
​
SELECT * 
​
FROM students 
​
WHERE s_name LIKE '%雨%';
​
-- 3. 查询名字第三个字是"雨"的学生
​
SELECT * 
​
FROM students 
​
WHERE s_name LIKE '__雨%';
​
-- 4. 查询姓"高"或"吴"的学生
​
SELECT * 
​
FROM students 
​
WHERE s_name LIKE '高%' OR s_name LIKE '吴%';
​
-- 5. 查询姓名长度为3个字且最后一个字是"琪"的学生
​
SELECT * 
​
FROM students 
​
WHERE s_name LIKE '__琪';
​
-- 6. 查询姓名中包含"小"且出生年份为偶数的学生
​
SELECT * 
​
FROM students 
​
WHERE s_name LIKE '%小%' 
​
AND YEAR(s_birthdate) % 2 = 0;
​

练习4:空值判断查询

​
-- 1. 查询计算机成绩为 NULL 的学生信息
​
SELECT * 
​
FROM students 
​
WHERE s_computer IS NULL;
​
-- 2. 查询没有计算机成绩的学生中,数学成绩最高的学生
​
SELECT * 
​
FROM students 
​
WHERE s_computer IS NULL 
​
ORDER BY COALESCE(s_math, 0) DESC 
​
LIMIT 1;
​
-- 3. 查询计算机成绩为 NULL 的学生中,年龄最大的前3人
​
SELECT * 
​
FROM students 
​
WHERE s_computer IS NULL 
​
ORDER BY s_birthdate ASC 
​
LIMIT 3;
​
-- 4. 查询外语成绩比计算机成绩高的学生(排除 computer 为 NULL)
​
SELECT * 
​
FROM students 
​
WHERE s_computer IS NOT NULL 
​
AND s_english > s_computer;
​

练习5:逻辑查询

​
-- 1. 查询家乡是"丛台区"或"复兴区"且语文成绩 ≥ 80 的学生
​
SELECT * 
​
FROM students 
​
WHERE s_hometown IN ('丛台区', '复兴区') 
​
AND s_chinese >= 80;
​
-- 2. 查询年龄在 18~20 岁之间(假设当前日期为 2023-10-01)的男生
​
SELECT * 
​
FROM students 
​
WHERE s_gender = '男' 
​
AND s_birthdate IS NOT NULL 
​
AND TIMESTAMPDIFF(YEAR, s_birthdate, '2023-10-01') BETWEEN 18 AND 20;
​
-- 3. 查询计算机成绩不为空且数学成绩 < 60 的学生
​
SELECT * 
​
FROM students 
​
WHERE s_computer IS NOT NULL 
​
AND s_math < 60;
​
-- 4. 查询肥乡区或永年区,外语和计算机成绩均 ≥ 80 的男生
​
SELECT * 
​
FROM students 
​
WHERE s_gender = '男' 
​
AND s_hometown IN ('肥乡区', '永年区') 
​
AND s_english >= 80 
​
AND s_computer >= 80;
​
-- 5. 查询计算机成绩在 70~90 分之间的复兴区学生
​
SELECT * 
​
FROM students 
​
WHERE s_hometown = '复兴区' 
​
AND s_computer BETWEEN 70 AND 90;
​
-- 6. 查询家乡为"丛台区"或"复兴区",且四科成绩均 ≥ 80 分的学生
​
SELECT * 
​
FROM students 
​
WHERE s_hometown IN ('丛台区', '复兴区') 
​
AND COALESCE(s_chinese,0) >= 80 
​
AND COALESCE(s_math,0) >= 80 
​
AND COALESCE(s_english,0) >= 80 
​
AND COALESCE(s_computer,0) >= 80;
​

练习6:RAND()函数查询

​
-- 1. 随机选择5名学生的所有信息
​
SELECT * 
​
FROM students 
​
ORDER BY RAND() 
​
LIMIT 5;
​
-- 2. 随机查询3名学生的姓名和各科成绩
​
SELECT s_name, s_chinese, s_math, s_english, s_computer 
​
FROM students 
​
ORDER BY RAND() 
​
LIMIT 3;
​
-- 3. 随机选择2名男生和2名女生(分别随机选择)
​
(SELECT * FROM students WHERE s_gender = '男' ORDER BY RAND() LIMIT 2)
​
UNION ALL
​
(SELECT * FROM students WHERE s_gender = '女' ORDER BY RAND() LIMIT 2);
​
-- 4. 随机抽取3名有特长(s_specialty='是')的学生
​
SELECT * 
​
FROM students 
​
WHERE s_specialty = '是' 
​
ORDER BY RAND() 
​
LIMIT 3;
​
-- 5. 随机选择4名家乡不为空的学生
​
SELECT * 
​
FROM students 
​
WHERE s_hometown IS NOT NULL 
​
ORDER BY RAND() 
​
LIMIT 4;
​
-- 6. 随机抽取3名语文成绩在80分以上的学生
​
SELECT * 
​
FROM students 
​
WHERE s_chinese > 80 
​
ORDER BY RAND() 
​
LIMIT 3;
​
-- 7. 随机选择5名学生,显示姓名和随机数(0-1之间)
​
SELECT s_name, RAND() as random_num 
​
FROM students 
​
ORDER BY RAND() 
​
LIMIT 5;
​
-- 8. 随机抽取2名数学成绩为空的学生
​
SELECT * 
​
FROM students 
​
WHERE s_math IS NULL 
​
ORDER BY RAND() 
​
LIMIT 2;
​
-- 9. 随机选择3名来自丛台区或复兴区的学生
​
SELECT * 
​
FROM students 
​
WHERE s_hometown IN ('丛台区', '复兴区') 
​
ORDER BY RAND() 
​
LIMIT 3;
​
-- 10. 随机抽取4名2005年出生的学生
​
SELECT * 
​
FROM students 
​
WHERE YEAR(s_birthdate) = 2005 
​
ORDER BY RAND() 
​
LIMIT 4;
​

练习7:BETWEEN运算符查询

​
-- 1. 出生日期在2005年1月1日到2005年12月31日之间的学生信息
​
SELECT * 
​
FROM students 
​
WHERE s_birthdate BETWEEN '2005-01-01' AND '2005-12-31';
​
-- 2. 查询语文成绩在80分到90分之间的学生姓名和语文成绩
​
SELECT s_name, s_chinese 
​
FROM students 
​
WHERE s_chinese BETWEEN 80 AND 90;
​
-- 3. 查询数学成绩在70分到85分之间,或者英语成绩在80分到95分之间的学生
​
SELECT * 
​
FROM students 
​
WHERE s_math BETWEEN 70 AND 85 
​
   OR s_english BETWEEN 80 AND 95;
​
-- 4. 查询计算机成绩在80分到90分之间,且出生日期在2005年9月1日到2006年8月31日之间的学生
​
SELECT * 
​
FROM students 
​
WHERE s_computer BETWEEN 80 AND 90 
​
AND s_birthdate BETWEEN '2005-09-01' AND '2006-08-31';
​
-- 5. 查询总分(语文+数学+英语+计算机)在300分到350分之间的学生信息
​
SELECT * 
​
FROM students 
​
WHERE (COALESCE(s_chinese,0) + COALESCE(s_math,0) + COALESCE(s_english,0) + COALESCE(s_computer,0)) 
​
•      BETWEEN 300 AND 350;
​

这些查询语句涵盖了所有练习要求,并考虑了数据中可能存在的NULL值情况。您可以根据需要运行这些查询来验证结果。


评论