《数据库原理》学生表,课程表,选课表的相关内容

6 篇文章 0 订阅
# 学生表
create table Student(
	Sno char(9) primary key,
	Sname char(20) unique, 
	Ssex char(2),
	Sage smallint,
	Sdept char(20)   
);

# 课程表
create table Course(
	Cno char(4) primary key,
	Cname char(40) not null,
	Cpno char(4), 
	Ccredit smallint,
	foreign key(Cpno) references Course(Cno) 
);
# 表级完整性约束条件, 相当于是自关联  外键Cpno, 参照主键 Cno


# 学生选课表
create table SC(
	Sno char(9),
	Cno char(4),
	Grade smallint,
	primary key(Sno, Cno),
	foreign key(Sno) references Student(Sno),
	foreign key(Cno) references Course(Cno)
);
# 设置两个子墩 合并为主键
# 常规外键



# 插入数据
# 学生表
insert into Student values('201215121', '李勇', '男', 20, 'CS'),
			('201215122', '刘晨', '女', 19, 'CS'),
			('201215123', '王敏', '女', 18, 'MA'),
			('201215125', '张立', '男', 19, 'IS');

# 课程表
insert into Course
	values('1', '数据库', '5', 4),
	('2', '数学', null, 2),
	('3', '信息系统', '1', 4),
	('4', '操作系统', '6', 3),
	('5', '数据结构', '7', 3),
	('6', '数据处理', null, 2),
	('7', 'PASCAL语言', '6', 4);

# SC表
insert into SC
	values('201215121', '1', 92),
	('201215121', '2', 85),
	('201215121', '3', 88),
	('201215122', '2', 90),
	('201215122', '3', 80);

# 三表展示:
select * from Student;
+-----------+--------+------+------+-------+
| Son       | Sname  | Ssex | Sage | Sdept |
+-----------+--------+------+------+-------+
| 201215121 | 李勇   ||   20 | CS    |
| 201215122 | 刘晨   ||   19 | CS    |
| 201215123 | 王敏   ||   18 | MA    |
| 201215125 | 张立   ||   19 | IS    |
+-----------+--------+------+------+-------+

select * from Course;
+-----+--------------+------+---------+
| Cno | Cname        | Cpno | Ccredit |
+-----+--------------+------+---------+
| 1   | 数据库       | 5    |       4 |
| 2   | 数学         | NULL |       2 |
| 3   | 信息系统     | 1    |       4 |
| 4   | 操作系统     | 6    |       3 |
| 5   | 数据结构     | 7    |       3 |
| 6   | 数据处理     | NULL |       2 |
| 7   | PASCAL语言   | 6    |       4 |
+-----+--------------+------+---------+

select * from SC;
+-----------+-----+-------+
| Sno       | Cno | Grade |
+-----------+-----+-------+
| 201215121 | 1   |    92 |
| 201215121 | 2   |    85 |
| 201215121 | 3   |    88 |
| 201215122 | 2   |    90 |
| 201215122 | 3   |    80 |
+-----------+-----+-------+



# 修改
alter table 表名 add foreign key (字段名)references 表名(字段名)
alter table Course add foreign key  references 表名(字段名)
ALTER TABLE Course DROP FOREIGN KEY (fk_symbol);


# 101页,3.52 查询每门课的间接先修课。(自身连接)

select first.Cno, second.Cpno 
from Course as first, Course as second
where first.Cpno=second.Cno; 
# 结果
+-----+------+
| Cno | Cpno |
+-----+------+
| 1   | 7    |
| 3   | 5    |
| 4   | NULL |
| 5   | 6    |
| 7   | NULL |
+-----+------+
5 rows in set (0.01 sec)


# 多表查询(这个题目中自关联相当于使用两张表)当不加条件的时候,就是相当于 两个表当中的元组(各条记录) 做笛卡尔积
select *  
from Course as first, Course as second;


# (内连接) 就是取交集,我感觉和 上面的例子,多表查询没区别,书上也没写这个概念
select 字段 from1 inner join2 on1.字段1 =2.字段2;

# 还以上面的题为例子:
select first.Cno, second.Cpno from Course as first inner join Course as second on first.Cpno=second.Cno;
# 结果: 和上面是一样的
+-----+------+
| Cno | Cpno |
+-----+------+
| 1   | 7    |
| 3   | 5    |
| 4   | NULL |
| 5   | 6    |
| 7   | NULL |
+-----+------+
5 rows in set (0.00 sec)


# 外连接(还分为左连接,右链接)
# 外连接,没有外键约束的条件下,可能出现左右两边都出现空值
select Student.*, SC.* from Student join SC on Student.Son = SC.Sno;

# 左连接: 已左边为标准,右边补 null, 右链接相反(具体参考课本 54,55页的理论基础)
select Student.Sno, Sname, Ssex, Sage, Sdept, Cno, Grade 
from Student left outer join SC on (Student.Sno=SC.Sno);

# 结果:可以看到学生的选课情况,为null的,说明该学生没有选择该门课程
+-----------+--------+------+------+-------+------+-------+
| Sno       | Sname  | Ssex | Sage | Sdept | Cno  | Grade |
+-----------+--------+------+------+-------+------+-------+
| 201215121 | 李勇   ||   20 | CS    | 1    |    92 |
| 201215121 | 李勇   ||   20 | CS    | 2    |    85 |
| 201215121 | 李勇   ||   20 | CS    | 3    |    88 |
| 201215122 | 刘晨   ||   19 | CS    | 2    |    90 |
| 201215122 | 刘晨   ||   19 | CS    | 3    |    80 |
| 201215123 | 王敏   ||   18 | MA    | NULL |  NULL |
| 201215125 | 张立   ||   19 | IS    | NULL |  NULL |
+-----------+--------+------+------+-------+------+-------+
7 rows in set (0.00 sec)


# 多表连接(自身连接相当于两个表,三个表以上通常叫做多表连接)
# (103页,3.54) 查询学生学号,姓名,选修课程名及成绩
select Student.Sno, Sname, Cname, Grade
from Student, SC, Course
where Student.Sno=SC.Sno and SC.Cno=Course.Cno;

# 结果: 三张表进行笛卡尔积运算,之后根据等值连接取 它的子集。
+-----------+--------+--------------+-------+
| Sno       | Sname  | Cname        | Grade |
+-----------+--------+--------------+-------+
| 201215122 | 刘晨   | 数学         |    90 |
| 201215122 | 刘晨   | 信息系统     |    80 |
| 201215121 | 李勇   | 数据库       |    92 |
| 201215121 | 李勇   | 数学         |    85 |
| 201215121 | 李勇   | 信息系统     |    88 |
+-----------+--------+--------------+-------+
5 rows in set (0.01 sec)


# 嵌套查询(103页): 一个select-from-where 语句为一个查询块。
# 将一个查询块嵌套进另一个查询块的where子句或者having短语中查询,称为嵌套查询 

# 查询选修了课程二的学生的姓名;
select Sname from Student  
where sno in (                
	select Sno from SC
	where Cno="2"
);
# 外层叫做父查询,内层叫做子查询,另外需要注意:子查询不能使用 order_by 子句, 
# order_by 只能对最终的查询结果排序。
# 当子查询是一个单值的时候,也可以使用 = 替换 in

# 结果  
+--------+
| Sname  |
+--------+
| 李勇   |
| 刘晨   |
+--------+
2 rows in set (0.02 sec)

# 另外根据经验, 嵌套查询的效率是很低的,一般不使用,还可以:

select * from Student, SC
where Student.sno = SC.Sno and  Cno="2"; 

# 结果,注意条件 Student.sno = SC.Sno and  Cno="2", 因为是笛卡尔积,全部结果集合中挑选数据
+-----------+--------+------+------+-------+-----------+-----+-------+
| sno       | Sname  | Ssex | Sage | Sdept | Sno       | Cno | Grade |
+-----------+--------+------+------+-------+-----------+-----+-------+
| 201215121 | 李勇   ||   20 | CS    | 201215121 | 2   |    85 |
| 201215122 | 刘晨   ||   19 | CS    | 201215122 | 2   |    90 |
+-----------+--------+------+------+-------+-----------+-----+-------+
2 rows in set (0.00 sec)

# 104页 有很好的例题,可以看看。 105页是一个三层嵌套查询,然后都可以用连接查询替换掉的。
# 不相关查询:子查询的查询条件不依赖于 父查询。
 
# 相关查询: 建议查看106页,好好研究一下,有执行过程解读。


# 子查询中的 谓词 : 具体看书107,108,109.
any  # 任何一个,也就是某一个值
all  # 所有值

< any  # 小于某个值即可

# 后面的内容不再介绍了,都是类似于离散数学的,谓词逻辑,全称量词,存在量词的理论基础上的。
# 书上很清晰的例子。






























# 修改数据表字段名
ALTER TABLE 表名 CHANGE 旧字段名 新字段名 新数据类型;

alter table Student change son sno char(9);
  • 3
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
use test/*一个项目涉及到的50个Sql语句问题及描述:--1.学生Student(S#,Sname,Sage,Ssex) --S# 学生编号,Sname 学生姓名,Sage 出生年月,Ssex 学生性别--2.课程表 Course(C#,Cname,T#) --C# --课程编号,Cname 课程名称,T# 教师编号--3.教师 Teacher(T#,Tname) --T# 教师编号,Tname 教师姓名--4.成绩 SC(S#,C#,score) --S# 学生编号,C# 课程编号,score 分数select * from Studentselect * from Courseselect * from Teacherselect * from SC*/--创建测试数据create table Student(S# varchar(10),Sname nvarchar(10),Sage datetime,Ssex nvarchar(10))insert into Student values('01' , N'赵雷' , '1990-01-01' , N'男')insert into Student values('02' , N'钱电' , '1990-12-21' , N'男')insert into Student values('03' , N'孙风' , '1990-05-20' , N'男')insert into Student values('04' , N'李云' , '1990-08-06' , N'男')insert into Student values('05' , N'周梅' , '1991-12-01' , N'女')insert into Student values('06' , N'吴兰' , '1992-03-01' , N'女')insert into Student values('07' , N'郑竹' , '1989-07-01' , N'女')insert into Student values('08' , N'王菊' , '1990-01-20' , N'女')create table Course(C# varchar(10),Cname nvarchar(10),T# varchar(10))insert into Course values('01' , N'语文' , '02')insert into Course values('02' , N'数学' , '01')insert into Course values('03' , N'英语' , '03')create table Teacher(T# varchar(10),Tname nvarchar(10))insert into Teacher values('01' , N'张三')insert into Teacher values('02' , N'李四')insert into Teacher values('03' , N'王五')create table SC(S# varchar(10),C# varchar(10),score decimal(18,1))insert into SC values('01' , '01' , 80)insert into SC values('01' , '02' , 90)insert into SC values('01' , '03' , 99)insert into SC values('02' , '01' , 70)insert into SC values('02' , '02' , 60)insert into SC values('02' , '03' , 80)insert into SC values('03' , '01' , 80)insert into SC values('03' , '02' , 80)insert into SC values('03' , '03' , 80)insert into SC values('04' , '01' , 50)insert into SC values('04' , '02' , 30)insert into SC values('04' , '03' , 20)insert into SC values('05' , '01' , 76)insert into SC values('05' , '02' , 87)insert into SC values('06' , '01' , 31)insert into SC values('06' , '03' ,
SQL查询一 实验学时:2   实验类型:验证 实验要求:必修 一、实验目的 通过本实验使学生掌握单查询并初步掌握多查询的技能。 二、实验内容 使用实验一建立的银行贷款数据库,完成以下查询。 1-10题为单查询,11-25为多查询。 查询所有法人的法人代码、法人名称、经济性质和注册资金。 查询“B1100”银行的的银行名称和电话。 查询贷款金额在2000至4000万元之间的法人代码、银行代码、贷款日期和贷款金额。 查询2009年1月1日以后贷款且贷款期限是10年的法人代码。 查询贷款期限为5年、10年或15年的贷款信息。 查询经济性质为“私营“的所有法人的最高注册资金、最低注册资金和平均注册资金。 查询每种经济性质的法人的经济性质、最高注册资金、最低注册资金和平均注册资金。 统计每个法人的法人代码和贷款总次数,要求查询结果按贷款总次数的升序排列。 查询贷款次数超过3次的法人的平均贷款金额和贷款次数。  统计每种经济性质贷款的法人的总数和其平均贷款金额,列出平均贷款金额前三名的经济性质、法人总数和平均贷款金额。  查询贷款期限为5年、10年或15年的法人名称、银行名称、贷款日期、贷款金额和贷款期限。  查询经济性质为“国营”的法人在“上海”的银行贷款的信息,列出法人名称、银行名称和贷款日期。  查询与“B1100”银行在同一城市(假设银行名称的第5和第6个字符为城市名称)的其他的银行的名称。  查询哪些银行没有贷过款,列出银行号和银行名称。分别用多连接和子查询两种方式实现。  查询贷过款的所有法人的名称,贷款银行名称,贷款日期,贷款金额,要求将查询结果放在一张新的永久New_LoanT中,新中的列名分别为:法人名称、银行名称、贷款日期和贷款金额。  分别查询经济性质“国营”和“私营”的法人名称,贷款银行名称,贷款日期,贷款金额,要求将这两个查询结果合并成一个结果集,并以法人名称、银行名称、贷款日期和贷款金额作为显示列名,结果按贷款日期的升序和贷款金额的降序显示。 使用实验一建立的学生数据库,完成以下查询 查询计算机系没有选课学生的姓名和年龄。 统计‘VB’课程的考试最高分、最低分和平均分。 统计‘数据库课程选课人数。 统计计算机系学生’vb’课程考试的最高分、最低分、平均分。  统计每个系学生’vb’课程考试的最高分、最低分、平均分,列出系名和三个分数。 查询每个学生的修课总学分,并进行如下处理:如果总学分高于10分,则显示‘好学生’;如果总学分在6到10分间,则显示‘一般学生’;如果总学分低于6分,则显示‘不好学生’。 统计每个系每个学生的修课门数和平均成绩,如果修课门数大于3并且平均成绩高于90的显示‘优秀’;如果修课门数大于3并且平均成绩在80~90,则显示‘较好’;对于修课门数小于等于3的并且平均成绩高于90的显示‘较好’;如果修课门数小于等于3并且平均成绩在80~90,则显示‘一般’;其他情况显示为‘应努力’。列出系名、学号、原修课门数和平均成绩以及处理后的显示结果。 查询计算机系学生考试成绩最低的两个成绩所对应的学生的姓名、课程名和成绩。 列出没有选课学生的学号、姓名和所在系。 三、思考题 1、创建: 教师(   tid 普通编码定长字符型,长度为10,主关键字   tname 普通编码定长字符型,长度为10,非空 zc 普通编码定长字符型,长度为6) 设此数据如下: tid Tname zc T1 A 教授 T2 B 副教授 T3 C 教授 编写SQL语句,使查询的结果显示为如下形式: 教师号 教师名 教授 副教授 T1 A 教授 T2 B 副教授 T3 C 教授 2、创建: 教师(   tid 普通编码定长字符型,长度为10,主码   tname 普通编码定长字符型,长度为10,非空 zc 普通编码定长字符型,长度为6 Salary 工作,整型) 设此数据如下: tid Tname zc Salary T1 A 教授 5000 T2 B 副教授 4000 T3 C 教授 5000 编写SQL语句,使查询的结果显示为如下形式: 教师号 教师名 教授工资 副教授工资 T1 A 5000 Null T2 B Null 4000 T3 C 5000 Null 四、实验报告 将实验结果反映在实验报告中,并对实验中遇到的问题及解决方案进行整理、分析总结,提出实验结论或自己的看法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值