数据库设计的基本步骤:
1、系统需求分析与设计。
2、概念结构分析与设计。
3、逻辑结构分析与设计。
4、物理结构分析与设计。
5、系统实施。
6、系统维护。
扩展资料:
数据库设计技巧:
1、原始文件与实体的关系
它可以是一对一,一对多,多对多的关系。一般来说,它们是一对一的关系:一个原始文档只对应于一个实体。在特殊情况下,它们可以是一对多或多对一关系,即一个原始文档对应于多个实体,或者多个原始文档对应于一个实体。
这里的实体可以理解为基本表。在对应关系明确后,对输入接口的设计非常有利。
2、主键和外键
一般来说,实体不能既没有主键也没有外键。在E-R图中,叶中的实体可以定义主键或不定义主键(因为它没有子代),但它必须有外键(因为它有父项)。
主键和外键的设计在全局数据库的设计中起着重要的作用。当全球数据库的设计完成后,一位美国数据库设计专家说:“钥匙无处不在,只有钥匙。”。这是他数据库设计的经验,也体现了他对信息系统核心(数据模型)高度抽象的理念。
因为:主键是一个高度抽象的实体。主键和外键的配对表示实体之间的连接。
3、基本表的属性
基本表不同于中间表和临时表,因为它具有以下四个特点:
原子性。基本表中的字段不可分解。
原始主义。基本表中的记录是原始数据(基本数据)的记录。
演绎的。所有输出数据都可以从基本表和代码表中的数据导出。
稳定。基本表的结构比较稳定,表中的记录要长期保存。
在了解基本表的性质之后,在设计数据库时,可以将基本表与中间表和临时表区分开来。
参考资料来源:百度百科-数据库设计
select a.学号,b.姓名,c.课程名,a.分数 from 学习 a inner join 学生 b on a.学号=b.学号 and b.奖学金>0 inner join 课程 c on a.课程号=c.课程号
select a.课程号,c.课程名,a.分数 from 学习 a inner join 学生 b on a.学号=b.学号 and b.姓名=‘黎明’ inner join 课程 c on a.课程号=c.课程号 where a.分数<60
前面2个综合下,不写了
前面类似,不写了
二、 更新teachers_courses表数据:请写出符合下列要求的SQL语句(不要仅针对给出的数据),把所有SQL语句放入文本文件Exam02.SQL中提交。1. 目前的teachers_courses中只包含了必修课的教师任课情况,假设所有编号IT开始的老师都上了所有编号开始为SPE的选修课,请在teachers_courses插入相应的记录,写出insert语句。
insert into teachers_courses
select teachers.teacherid,courses.courseid, ‘’ from teachers,courses
where teachers.teacherid like 'IT%' and courses.courseid like 'SPE%' and courses.attri=1
2. 假设学校规定年龄小于25岁(当前年份-出生年份)的教师不能上必修课,请删除teachers_courses中的相应记录,写出delete语句。
Delete from teachers_courses where teacherid in (select teacherid from teachers where year(getdate())-year(birthday)<25) and courseid in (select courseid from courses where attri=1)
3. 教师的工作量为其担任教学课程的学分总和,写出更新teachers.workload的update语句。
update teachers set workload=(select sum(courses.grade)
from teachers_courses,courses
where teachers_courses.courseid=courses.courseid
and teachers_courses.teacherid=teachers.teacherid)
三、 写出select语句,实现下列查询:把所有SQL语句放入文本文件Exam03.SQL中提交。
1. 查询所有教师的任课情况,包括教师编号、教师姓名、性别、任课课程名、学分,按教师性别排序,女教师在前。(没有任课的教师可以不显示)。性别显示“男”和“女”。
select a.teacherid,a.teachername,
case when a.sex=0 then '男' when a.sex=1 then '女' end,
b.coursename,b.grade
from teachers a,courses b,teachers_courses c
where a.teacherid=c.teacherid and b.courseid=c.courseid order by 3 desc
2. 上述查询要求包括没有任课的教师编号和姓名,在任课课程名中显示“未任课”,学分列显示为0。
select a.teacherid,a.teachername,
case when a.sex=0 then '男' when a.sex=1 then '女' end,
isnull(c.coursename,'未任课'),isnull(c.grade,0)
from (teachers a left join teachers_courses b on a.teacherid=b.teacherid) left join courses c on b.courseid=c.courseid
order by 3 desc
3. 查询所有没有任课的教师编号、姓名和性别。
select teacherid,teachername,sex from teachers where teacherid not in (select teacherid from teachers_courses)
4. 查询每个教师的总的学时数,包括教师编号、姓名、性别、年龄(当前年份-出生年份)和总学时
select a.teacherid,a.teachername,a.sex,year(getdate())-year(a.birthday), sum(b.grade) from teachers a,courses b,teachers_courses c
where a.teacherid=c.teacherid and b.courseid=c.courseid
group by a.teacherid,a.teachername,a.sex,year(getdate())-year(a.birthday)
5. 对上述查询,仅查询总学时数小于8的并且年龄小于50岁的教师的编号、姓名、性别、年龄和总学时。
select a.teacherid,a.teachername,a.sex,year(getdate())-year(a.birthday), sum(b.grade) from teachers a,courses b,teachers_courses c
where a.teacherid=c.teacherid and b.courseid=c.courseid and year(getdate())-year(a.birthday)<50
group by a.teacherid,a.teachername,a.sex,year(getdate())-year(a.birthday)
having sum(b.grade)<8
6. 查询总学时最多的教师编号,姓名和总学时(可使用视图)。
create view sumgrade (teacherid,grade)
as
select c.teacherid,sum(b.grade) from courses b,teachers_courses c
where b.courseid=c.courseid
group by a.teacherid
select teacherid,teachername,grade from teschers,sumgrade
where teachers.teacherid=sumgrade.teacherid and grade=(select max(grade) from sumgrade)
或
select a.teacherid,a.teachername,sum(b.grade)
from teachers a,courses b,teachers_courses c
where a.teacherid=c.teacherid and b.courseid=c.courseid
group by a.teacherid,a.teachername
having sum(b.grade)=(select max(grade) from sumgrade)
四、 编写表值函数dept_teachlist,参数为部门编号,返回该部门所有教师的教师编号、教师姓名、必修课总学时、选修课总学时(不包括未任课的教师)。写出验证该函数的select语句(参数为‘IT01’)。把完成的程序放入文本文件Exam04.SQL中提交。
CREATE FUNCTION dept_teachlist (@deptid CHAR(6)) RETURNS @tb_deptlist TABLE (teacherid1 CHAR(6) PRIMARY KEY,teachername varchar(10),num1 INT,num2 INT) AS
BEGIN
--插入该部门教师信息
INSERT into @tb_deptlist
SELECT teacherid,teachername,0,0 FROM teachers WHERE departmentid=@deptid
--计算必修课总学时数
UPDATE @tb_deptlist SET num1=(SELECT sum(b.grade) FROM courses b,teachers_courses c
WHERE b.courseid=c.courseid and b.attri=0 and b.teacherid=teacherid1)
--计算选修课总学时数
UPDATE @tb_deptlist SET num2=(SELECT sum(b.grade) FROM teachers a,courses b,teachers_courses c
WHERE a.teacherid=c.teacherid and b.courseid=c.courseid and b.attri=1 and a.teacherid=teacherid1)
RETURN
END
select * from dept_teachlist('IT01')
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)