以下是根据您提供的建表语句和数据,所有习题的完整答案:
练习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值情况。您可以根据需要运行这些查询来验证结果。