现在有三个数据库表结构如下:
1、科目表(subject):
编号:SubID char(2) PK
科目名:SubName nvarchar(10)
编号 科目名
01 语文
02 数学
03 英语
04 物理
05 历史
06 地理
07 计算机
... ...
2、学生表(student)
学号:StuID char(6) PK
姓名:Name nvarchar(10)
性别:Sex bit
出生日期:Birthday smalldatetime
...
学号 姓名 性别 出生日期
....
000901 张一 1 1983-2-7
000902 王二 0 1984-6-20
000903 李三 1 1983-5-2
... ... ... ...
....
3、选课表(stusubject)
编号:ID int 自动编号 PK
学号:StuID char(6)
选择科目编号:SubID varchar(50)
ID StuID SubID
1 000901 02,05,07
2 000902 01,02,03,05,07
3 000903 01,02,04,05
问题:
1、选课表的结构是否合理?
2、如果需要检索出选择英语(编号:03)课程的所有学生信息,最优化查询语句该怎
样写?
我只考虑到用"select * from student where SubID like '%03%'"可实现查询,但
性能不理想,不知道用IN能否实现?
3、在可修改科目表(subject)和选课表(stusubject)结构的情况下,有没有更好的方法
能解决上述的查询问题?
1、科目表(subject):
编号:SubID char(2) PK
科目名:SubName nvarchar(10)
编号 科目名
01 语文
02 数学
03 英语
04 物理
05 历史
06 地理
07 计算机
... ...
2、学生表(student)
学号:StuID char(6) PK
姓名:Name nvarchar(10)
性别:Sex bit
出生日期:Birthday smalldatetime
...
学号 姓名 性别 出生日期
....
000901 张一 1 1983-2-7
000902 王二 0 1984-6-20
000903 李三 1 1983-5-2
... ... ... ...
....
3、选课表(stusubject)
编号:ID int 自动编号 PK
学号:StuID char(6)
选择科目编号:SubID varchar(50)
ID StuID SubID
1 000901 02,05,07
2 000902 01,02,03,05,07
3 000903 01,02,04,05
问题:
1、选课表的结构是否合理?
2、如果需要检索出选择英语(编号:03)课程的所有学生信息,最优化查询语句该怎
样写?
我只考虑到用"select * from student where SubID like '%03%'"可实现查询,但
性能不理想,不知道用IN能否实现?
3、在可修改科目表(subject)和选课表(stusubject)结构的情况下,有没有更好的方法
能解决上述的查询问题?
解决方案 »
- 如果要保存如下的信息的话,该如何建个table?
- 装了sql server 2005但进去后用的还是sql server 2000的引擎怎么办
- 通过存储过程统计金额怎么做?
- 高手帮忙看一下这个触发器吧???
- 一个定时执行的作业,有一定难度
- sql2000server的安装问题!高手给个答案吧···
- 一个奇怪的问题,请大虾帮忙 50分
- 请教: 在SQL SERVER 2000下,存储过程判断插入怎么写?
- 多个表内连接对查询性能影响大吗?
- SQLserver 2008 R2 卸载安装报错
- 关于读取sqlserver 中image字段问题,急急急!!!
- sp_addumpdevice 备份数据库出错 !!!
id stuid subid
1 000901 02
1 000901 05
.......
3 000903 01
3 000903 02 select * from stusubject here SubID ='3'
来查或者不改 用
select * from stusubject a where not exists (select 1 from stusubject where stuid=a.stuid and charindex(','+'03'+',',subid)=0)
--2、如果需要检索出选择英语(编号:03)课程的所有学生信息
select b.*
from subject a,student b,stusubject c
where a.SubName = '英语' and charindex(',' + a.SubID + ',' , ',' + c.subid + ',') > 0 and b.StuID = c.StuID
--如果这个查询速度不慢(也就是数据量不是非常大的话),可以不改表结构,用如下SQL即可.
select b.*
from subject a,student b,stusubject c
where a.SubName = '英语' and charindex(',' + a.SubID + ',' , ',' + c.subid + ',') > 0 and b.StuID = c.StuID
编号:ID int PK 学号:StuID char(6) 选择科目编号:SubID char(2)
目前这样的结构对于修改,查询,关联,都很麻烦。可操作性和扩展性都很差。