《数据库原理》学生表,课程表,选课表的相关内容
生活随笔
收集整理的這篇文章主要介紹了
《数据库原理》学生表,课程表,选课表的相关内容
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
# 學生表
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 Coursevalues('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 SCvalues('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 字段 from 表1 inner join 表2 on 表1.字段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 SCwhere 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);
總結
以上是生活随笔為你收集整理的《数据库原理》学生表,课程表,选课表的相关内容的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 邱淑贞的女儿太漂亮啦,邱淑贞为她女儿站台
- 下一篇: Android 多渠道配置