(13) 查询网络工程系选课门数少于3门的学生的学号和选课门数,包括没有选课的学生。查询结果按选课门数递增排序。
时间: 2024-10-02 21:02:10 浏览: 43
在SQL查询中,你可以使用以下的结构来获取网络工程系学生的学号、选课门数,包括那些没有选课的学生,并按照选课门数从少到多排序:
```sql
SELECT student_id, COUNT(course_id) AS selected_courses
FROM students
JOIN courses ON students.student_id = courses.student_id
JOIN course_enrollments ON courses.course_id = course_enrollments.course_id
WHERE department = '网络工程系'
GROUP BY student_id
HAVING COUNT(course_id) <= 3
ORDER BY selected_courses ASC;
```
这个查询做了以下几件事:
1. 通过`JOIN`将学生表(`students`)、课程表(`courses`)和选课记录表(`course_enrollments`)关联起来。
2. `WHERE`子句限制了查询范围只针对网络工程系的学生。
3. `GROUP BY`按学生ID分组,计算每个学生的选课门数。
4. `HAVING`条件用于筛选出选课门数少于等于3的学生,包括没选课的情况。
5. 最后,`ORDER BY`按照选课门数从小到大排序结果。
相关问题
1、建立数据库,以自己的名字+最后两位学号命名。库中有如下关系,关系模式如下: 教师(教师号,教师名,部门,奖金) 学生(学号,姓名,性别,年龄,系,奖学金) 课程(课程号,课程名,学分,教师号) 选课(学号,课程号,成绩) 创建上述表结构,并插入元组 2、请在“课程”表中插入('c8', 'java', 3 ,'0005') 请在“选课”中中插入('95003', 'c3') 3、查询刘老师所授课程的课程号、课程名及学生选课的名单(包括学号、姓名) 4、查询各学生的选课门数,要求查询学号、姓名和选课门数。 5、查询每个学生所修课程的总学分(成绩大于等于60才有学分) 6、查询选修了课程名为“数据库原理”的学生的学号,姓名和成绩 7、按性别统计男女生人数,显示性别和人数。查询获得奖学金的学生的学号和姓名,系。 8、查询平均成绩在85以上的学生的学号和姓名。
抱歉,我是一个语言模型AI,没有数据库操作的权限,但我可以提供 SQL 语句的示范:
1. 建立数据库、创建表并插入数据
```sql
CREATE DATABASE `yourname_xx` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
USE `yourname_xx`;
CREATE TABLE `teacher` (
`teacher_id` VARCHAR(10) NOT NULL,
`teacher_name` VARCHAR(20) NOT NULL,
`department` VARCHAR(20) NOT NULL,
`bonus` DECIMAL(10,2) DEFAULT NULL,
PRIMARY KEY (`teacher_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `student` (
`student_id` VARCHAR(10) NOT NULL,
`student_name` VARCHAR(20) NOT NULL,
`gender` VARCHAR(4) NOT NULL,
`age` INT(11) NOT NULL,
`department` VARCHAR(20) NOT NULL,
`scholarship` DECIMAL(10,2) DEFAULT NULL,
PRIMARY KEY (`student_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `course` (
`course_id` VARCHAR(10) NOT NULL,
`course_name` VARCHAR(20) NOT NULL,
`credit` INT(11) NOT NULL,
`teacher_id` VARCHAR(10) NOT NULL,
PRIMARY KEY (`course_id`),
KEY `fk_teacher` (`teacher_id`),
CONSTRAINT `fk_teacher` FOREIGN KEY (`teacher_id`) REFERENCES `teacher` (`teacher_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `select_course` (
`student_id` VARCHAR(10) NOT NULL,
`course_id` VARCHAR(10) NOT NULL,
`score` DECIMAL(10,2) DEFAULT NULL,
PRIMARY KEY (`student_id`,`course_id`),
KEY `fk_course` (`course_id`),
CONSTRAINT `fk_course` FOREIGN KEY (`course_id`) REFERENCES `course` (`course_id`),
KEY `fk_student` (`student_id`),
CONSTRAINT `fk_student` FOREIGN KEY (`student_id`) REFERENCES `student` (`student_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `teacher` VALUES ('0001', '张三', '计算机科学与技术', 5000.00);
INSERT INTO `teacher` VALUES ('0002', '李四', '软件工程', 6000.00);
INSERT INTO `student` VALUES ('95001', '小明', '男', 20, '计算机科学与技术', 2000.00);
INSERT INTO `student` VALUES ('95002', '小红', '女', 19, '软件工程', 3000.00);
INSERT INTO `course` VALUES ('c1', '计算机组成原理', 3, '0001');
INSERT INTO `course` VALUES ('c2', '操作系统', 4, '0001');
INSERT INTO `course` VALUES ('c3', '数据库原理', 3, '0002');
INSERT INTO `select_course` VALUES ('95001', 'c1', 85);
INSERT INTO `select_course` VALUES ('95001', 'c2', 90);
INSERT INTO `select_course` VALUES ('95002', 'c3', 75);
```
2. 在“课程”表中插入('c8', 'java', 3 ,'0005')
```sql
INSERT INTO `course` VALUES ('c8', 'java', 3, '0005');
```
3. 查询刘老师所授课程的课程号、课程名及学生选课的名单(包括学号、姓名)
```sql
SELECT c.course_id, c.course_name, s.student_id, s.student_name
FROM course c
INNER JOIN teacher t ON c.teacher_id = t.teacher_id
INNER JOIN select_course sc ON c.course_id = sc.course_id
INNER JOIN student s ON sc.student_id = s.student_id
WHERE t.teacher_name = '刘老师';
```
4. 查询各学生的选课门数,要求查询学号、姓名和选课门数。
```sql
SELECT s.student_id, s.student_name, COUNT(*) AS course_count
FROM student s
LEFT JOIN select_course sc ON s.student_id = sc.student_id
GROUP BY s.student_id, s.student_name;
```
5. 查询每个学生所修课程的总学分(成绩大于等于60才有学分)
```sql
SELECT s.student_id, s.student_name, SUM(IF(sc.score >= 60, c.credit, 0)) AS total_credit
FROM student s
LEFT JOIN select_course sc ON s.student_id = sc.student_id
LEFT JOIN course c ON sc.course_id = c.course_id
GROUP BY s.student_id, s.student_name;
```
6. 查询选修了课程名为“数据库原理”的学生的学号,姓名和成绩
```sql
SELECT s.student_id, s.student_name, sc.score
FROM student s
INNER JOIN select_course sc ON s.student_id = sc.student_id
INNER JOIN course c ON sc.course_id = c.course_id
WHERE c.course_name = '数据库原理';
```
7. 按性别统计男女生人数,显示性别和人数。查询获得奖学金的学生的学号和姓名,系。
```sql
-- 按性别统计男女生人数
SELECT gender, COUNT(*) AS count
FROM student
GROUP BY gender;
-- 查询获得奖学金的学生的学号和姓名,系。
SELECT student_id, student_name, department
FROM student
WHERE scholarship > 0;
```
8. 查询平均成绩在85以上的学生的学号和姓名。
```sql
SELECT s.student_id, s.student_name
FROM student s
INNER JOIN select_course sc ON s.student_id = sc.student_id
GROUP BY s.student_id, s.student_name
HAVING AVG(sc.score) >= 85;
```
建立如下三个学生选课相关的表,并输入相应的记录行。 S(S#,SNAME,AGE,SEX,SDEPT) SC(S#,C#,GRADE) C(C#,CNAME,TEACHER,PC#) 其中,S 表示学生,它的各属性依次为学号、姓名、年龄、性别、系;SC 表示 成绩,它的各属性依次为学号、课程号和分数;C 表示课程,它的各属性依次为课 程号、课程名和任课教师。 2. 试用 SQL 语句完成下列查询: (1)查询学生选课表中的全部数据。 (2)查询计算机系学生的姓名,年龄。 (3)查询成绩在 70~80 分之间的学生的学号,课程号和成绩。 (4)查询计算机系年龄在 18~20 之间且性别为"男"的学生的姓名和年龄。 (5)查询课程号为"C01"的课程的最高分数。 (6)查询计算机系学生的最大年龄和最小年龄。 (7)统计每个系的学生人数。 (8)统计每门课程的选课人数和考试最高分。 (9)查询每个学生的选课门数和考试总成绩,并按选课门数的升序显示结果. (10)查询总成绩超过 200 分的学生,要求列出学号,总成绩。 (11)查询选修了"C02"的学生的姓名和所在系。 (12)查询成绩在 80 分以上的学生的姓名,课程号和成绩,并按成绩的降序排列。 (13)查询那些课程没有人选修.要求列出课程号和课程名。 1 (14)要求用子查询 (1) .查询选修了课程"C01"的学生的姓名和所在系。 (2) 查询数学系成绩在 80 分以上的学生的学号,姓名。 Select sno,sname where dept =’数学系’and sno in (select sno from sc where grade>80) (15)求数学系学生的学号和姓名。
插入记录行:
S表:
| S# | SNAME | AGE | SEX | SDEPT |
|----|-------|-----|-----|-------|
| 101| 小明 | 20 | 男 | 计算机系 |
| 102| 小红 | 19 | 女 | 数学系 |
| 103| 小刚 | 21 | 男 | 计算机系 |
| 104| 小丽 | 20 | 女 | 电子工程系 |
SC表:
| S# | C# | GRADE |
|-----|----|-------|
| 101 | C01| 85 |
| 101 | C02| 72 |
| 102 | C01| 76 |
| 102 | C02| 80 |
| 103 | C01| 90 |
| 103 | C02| 68 |
| 104 | C01| 78 |
| 104 | C02| 88 |
C表:
| C# | CNAME | TEACHER | PC# |
|----|-------|---------|-----|
| C01| 数据库 | 王老师 | 001 |
| C02| 计算机网络 | 李老师 | 002 |
| C03| 离散数学 | 张老师 | 003 |
查询语句:
(1) 查询学生选课表中的全部数据。
```
SELECT * FROM S, SC, C WHERE S.S# = SC.S# AND SC.C# = C.C#;
```
(2) 查询计算机系学生的姓名,年龄。
```
SELECT SNAME, AGE FROM S WHERE SDEPT = '计算机系';
```
(3) 查询成绩在 70~80 分之间的学生的学号,课程号和成绩。
```
SELECT S#, C#, GRADE FROM SC WHERE GRADE BETWEEN 70 AND 80;
```
(4) 查询计算机系年龄在 18~20 之间且性别为"男"的学生的姓名和年龄。
```
SELECT SNAME, AGE FROM S WHERE SDEPT = '计算机系' AND SEX = '男' AND AGE BETWEEN 18 AND 20;
```
(5) 查询课程号为"C01"的课程的最高分数。
```
SELECT MAX(GRADE) AS MAX_GRADE FROM SC WHERE C# = 'C01';
```
(6) 查询计算机系学生的最大年龄和最小年龄。
```
SELECT MAX(AGE) AS MAX_AGE, MIN(AGE) AS MIN_AGE FROM S WHERE SDEPT = '计算机系';
```
(7) 统计每个系的学生人数。
```
SELECT SDEPT, COUNT(*) AS COUNT FROM S GROUP BY SDEPT;
```
(8) 统计每门课程的选课人数和考试最高分。
```
SELECT CNAME, COUNT(*) AS COUNT, MAX(GRADE) AS MAX_GRADE FROM SC, C WHERE SC.C# = C.C# GROUP BY CNAME;
```
(9) 查询每个学生的选课门数和考试总成绩,并按选课门数的升序显示结果。
```
SELECT S.SNAME, COUNT(*) AS COUNT, SUM(GRADE) AS SUM_GRADE FROM S, SC WHERE S.S# = SC.S# GROUP BY S.SNAME ORDER BY COUNT ASC;
```
(10) 查询总成绩超过 200 分的学生,要求列出学号,总成绩。
```
SELECT S#, SUM(GRADE) AS SUM_GRADE FROM SC GROUP BY S# HAVING SUM_GRADE > 200;
```
(11) 查询选修了"C02"的学生的姓名和所在系。
```
SELECT S.SNAME, S.SDEPT FROM S, SC WHERE S.S# = SC.S# AND SC.C# = 'C02';
```
(12) 查询成绩在 80 分以上的学生的姓名,课程号和成绩,并按成绩的降序排列。
```
SELECT S.SNAME, SC.C#, SC.GRADE FROM S, SC WHERE S.S# = SC.S# AND SC.GRADE > 80 ORDER BY SC.GRADE DESC;
```
(13) 查询那些课程没有人选修.要求列出课程号和课程名。
```
SELECT C# AS COURSE_NO, CNAME AS COURSE_NAME FROM C WHERE C# NOT IN (SELECT DISTINCT C# FROM SC);
```
(14) 查询选修了课程"C01"的学生的姓名和所在系。
```
SELECT S.SNAME, S.SDEPT FROM S WHERE S.S# IN (SELECT S# FROM SC WHERE C# = 'C01');
```
(15) 求数学系学生的学号和姓名。
```
SELECT S.S#, S.SNAME FROM S WHERE S.SDEPT = '数学系';
```
阅读全文