MySQL《多表连接操作2》

drop database if exists 学生管理数据库;
create database 学生管理数据库;
use 学生管理数据库;
create table 学生表
(学号 int primary key,
姓名 char(10),
性别 char(2),
年龄 int,
所在院系 char(20),
班级 char(10),
入学日期 date)charset utf8;

create table 课程表
(课程号 char(4) primary key,
课程名 char(20),
先修课 char(4),
学分 int)charset utf8;

create table 成绩表
(学号 int ,
课程号 char(4),
成绩 int,
学分 int,
primary key(学号,课程号))charset utf8;

create table 授课表
(教师名 char(10),
课程号 char(4),
学时数 int,
班级名 char(10),
primary key(课程号,班级名))charset utf8;

insert into 学生表
values(20009001,'葛文卿','女',22,'国际贸易','国贸2班','2000-8-29'),
(20014019,'郑秀丽','女',21,'会计学','会计1班','2001-9-2'),
(20023001,'刘成铠','男',18,'计算机','软件2班','2002-8-27'),
(20026002,'李涛','女',19,'电子学','电子1班','2002-8-27'),
(20023002,'沈香娜','女',18,'计算机','软件2班','2002-8-27'),
(20026003,'李涛','男',19,'计算机','软件1班','2002-8-27'),
(20023003,'肖一竹','女',19,'计算机','软件2班','2002-8-27');

insert into 课程表
values('C801','高等数学',NULL,4),
('C802','C++语言','C807',3),
('C803','数据结构','C802',4),
('C804','数据库原理','C803',4),
('C805','操作系统','C807',4),
('C806','编译原理','C803',4),
('C807','离散数学',NULL,4);

insert into 成绩表
values(20023001,'C801',98,4),
(20023001,'C802',92,3),
(20023001,'C803',NULL,4),
(20023002,'C802',NULL,3),
(20023002,'C804',70,4),
(20026001,'C801',85,4),
(20026002,'C803',95,4);

insert into 授课表
values('苏亚步','C801',72,'软件2班'),
('王文山','C802',64,'软件2班'),
('张珊','C803',72,'软件2班'),
('王文山','C804',64,'软件2班'),
('苏亚步','C801','72','软件1班');

1.为授课表添加外键约束FK_Cno,使授课表中的“课程号”引用课程表中的“课程号”(同时实现课程表的课程号信息发生更新时,授课表中课程信息也相应更新)。

ALTER TABLE 授课表 ADD CONSTRAINT FK_Cno FOREIGN KEY(课程号) REFERENCES 课程表(课程号) ON UPDATE CASCADE;

2.删除授课表的外键约束。

ALTER TABLE 授课表 DROP FOREIGN KEY FK_Cno;

3.给学生表增加一属性:民族,数据类型为varchar(10)。

ALTER TABLE 学生表 ADD COLUMN 民族 varchar(10); ALTER TABLE 学生表 ADD 民族 varchar(10);

4.删除学生表中新增的属性民族。

ALTER TABLE 学生表 DROP COLUMN 民族; ALTER TABLE 学生表 DROP 民族;

5.列出2002年元旦前入学的学生名单。

SELECT 姓名 FROM 学生表 WHERE 入学日期 < ‘2002-01-01’;

6.统计男、女学生各自的“人数”和“平均年龄”。

SELECT 性别,COUNT(*) 人数,AVG(年龄) 平均年龄 FROM 学生表 GROUP BY 性别;

7.找出软件1班,软件2班学生的姓名、性别、年龄。

select 姓名,性别,年龄 from 学生表
where 班级=‘软件1班’ or 班级=‘软件2班’;

8.查询“沈香娜”同学所在班级的所有学生的学号和姓名(如果使用学生表自连接,表别名用S1和S2)。

select s1.学号,s1.姓名
from 学生表 s1 join 学生表 s2
on s1.班级=s2.班级 and s2.姓名=‘沈香娜’;

9.找出肖一竹所在班级的“学生人数”。

select count(*) 学生人数
from 学生表 s1 join 学生表 s2
on s1.班级=s2.班级 and s2.姓名=‘肖一竹’;

10.列出王文山老师所带的课程名及班级名。

select c.课程名,tc.班级名
from 授课表 tc join 课程表 c
on tc.课程号=c.课程号 and tc.教师名=‘王文山’;

11.列出选修了一门以上课程的学生学号,及其“选修门数”。

select 学号,count() 选修门数
from 成绩表 group by 学号 having
count(
)>1;

12.找出所有没被学生选修了的课程号(DISTINCT如果可以不用则不用)。

select 课程号 from 课程表
where 课程号 not in (select 课程号 from 成绩表);

13.找出选修了课程“高等数学”的“学生人数”(只显示“学生人数”一个字段)。

select count(*) 学生人数
from 成绩表 sc join 课程表 c
on sc.课程号=c.课程号 and c.课程名=‘高等数学’;

14.找出计算机学院的成绩为空的学生姓名。

select s.姓名
from 学生表 s join 成绩表 sc
on s.学号=sc.学号 and s.所在院系='计算机’and sc,成绩 is null;

15.统计每一年龄选修课程的“学生人数”(DISTINCT如果可以不用则不用)。

select s.年龄,count(distinct s.学号)学生人数
from 成绩表 sc join 学生表 s
on sc.学号=s.学号 group by s.年龄;

16.检索平均成绩最高的学生姓名和所在班级。

SELECT S.姓名,S.班级,AVG(SC.成绩) FROM 学生表 S JOIN 成绩表 SC ON S.学号 = SC.学号
GROUP BY SC.学号 HAVING AVG(成绩) = (

SELECT MAX(SNO_AVG) FROM (SELECT 学号,AVG(成绩) SNO_AVG FROM 成绩表 GROUP BY 学号) SA

);

猜你喜欢

转载自blog.csdn.net/ziyue13/article/details/112071665