数据库 实验三 数据库查询和数据操纵
實驗目的
1. 掌握各種查詢的使用方法。
2. 掌握數據操縱的使用方法。
1. 使用查詢語句完成以下任務(每一個查詢都要給出SQL語句,并且列出查詢結果)。
① 查詢與“張志國”同一班級的學生信息(使用連接查詢和子查詢方式)。
子查詢方式:
SELECT *
FROM Student
WHERE Sname!='張志國' and DeptandClass=(SELECT DeptandClass
FROM Student
WHERE Sname='張志國'
)
連接查詢:
FROM后接兩個表,取A表某字段值與B表某字段作為關聯條件
例如:
查詢“劉偉”老師所講授的課程,要求列出教師號、教師姓名和課程號。SELECT T.TNo,TN,CNo
FROM T,TC
WHERE (T.TNo = TC. TNo) AND (TN='劉偉')
連接條件(T.TNo = TC. TNo) 的比較運算符為“=”時,稱為等值連接。其他情況為非等值連接。
引用列名TNo時要加上表名前綴,這是因為兩個表中的列名相同,必須用表名前綴來確切說明所指列屬于哪個表,以避免二義性。
這里給原學生表取兩個別名,也就是變成兩張表,取對應字段連接。
從第一個表中取學生數據的記錄,以行(一條記錄)為單位,所有符合條件的行都會被選出。
取得的所有記錄的班級一列(一個字段)要與第二個表取得記錄(在本例中全部取得)的字段相等。
為什么要用兩張表呢?
在同一表中查詢相同的記錄就需要起別名,因為必須要有一個字段與字段比較的過程,因為查詢實際上是兩個記錄集合之間運算。
SELECT Student1.*
FROM ?Student as Student1,Student as Student2?
WHERE Student2.Sname='張志國' AND Student1.DeptandClass=Student2.DeptandClass;
② 查詢比“計算機應用基礎”學時多的課程信息(使用連接查詢和子查詢方式)。
子查詢方式:
SELECT *
FROM Course
WHERE STime>(SELECT STime
FROM Course
WHERE Cname='計算機應用基礎'
)
連接查詢:
SELECT Course1.* ?FROM Course AS Course1,Course AS Course2?
WHERE Course2.Cname = '計算機應用基礎' AND Course1.STime>Course2.STime;
單張表格同字段比較,用別名建立兩張表,再比較。
③ 查詢選修課程號為K002的學生的學號,姓名(使用連接查詢,普通子查詢,相關子查詢)。
連接查詢:
SELECT Student.Sno,Sname
FROM Homework
INNER JOIN Student
ON Student.Sno=Homework.Sno
INNER JOIN Course
ON Homework.Cno=Course.Cno
WHERE HomeWork.Cno='K002'
普通子查詢:
先使用連接查詢,查詢出符合條件的學號,再查詢其中不重復的學號與姓名字段
select distinct Student.Sno,Student.Sname
from Homework,Student
where Student.Sno in (
select Student.Sno
from Homework
where Homework.Cno='K002' and Homework.Sno=Student.Sno)
相關子查詢:(不太確定)
select distinct Student.Sno,Student.Sname
from Homework,Student
where Student.Sno in (
select Student.Sno
from Homework
where Homework.Cno='K002')
普通子查詢執行的順序:首先執行子查詢,然后把子查詢的結果作為父查詢的查詢條件的值。普通子查詢只執行一次,而父查詢所涉及的所有記錄行都與其查詢結果進行比較以確定查詢結果集合。
相關子查詢的執行順序:首先選取父查詢表中的第一行記錄,內部的子查詢利用此行中相關屬性值進行查詢,然后父查詢根據子查詢返回的結果判斷此行是否滿足查詢條件。
④ 查詢沒有同時選修K001和M001課程的學號,姓名,課程號和三次成績。
首先,查詢同時選修了K001和M001的學號集合
再查詢不在這集合中的學號
SELECT Student.Sno,Sname,Homework.Cno,Score1,Score2,Score3
FROM Homework
INNER JOIN Student
ON Student.Sno=Homework.Sno
INNER JOIN Course
ON Homework.Cno=Course.Cno
WHERE Homework.Sno not in(SELECT Homework.Sno?
FROM Homework?
WHERE Homework.Cno='K001' and Homework.Sno in (
SELECT Homework.Sno
FROM Homework
WHERE Homework.Cno='M001')
)
補充:用SQL查詢同時選修了1號課和2號課的學生學號
不能用
WHERE Cno='1'?and Cno='2'
而一定要用
WHERE?Cno='1'?and Sno in (SELECT?Sno
FROM Course
WHERE Cno='2')
先查詢選修了課程二的學號集合,再查詢選修來課程一并且學號在上述集合之內的學號。
因為在一次查詢的過程中,Cno不可能既為1,又為2
值得一提的是,不論任何查詢,都可以先提前把多個表連接起來,以便后續的操作
2. 使用數據操縱完成以下任務(每一個任務都要給出SQL語句,并且列出查詢結果)。
① 在學生表中添加一條學生記錄,其中,學號為0593,姓名為張樂,性別為男,專業班級為電子05,出生日期為1991-01-01。
語法
INSERT INTO 表名稱 VALUES (值1, 值2,....)
INSERT INTO Student?VALUES (0593,'張樂','男','電子05','1991-01-01',null)
電話即便為空,也不能少,必須填個null,不然:
插入日期時,要用單引號包含,否則數據會出錯:
② 將所有課程的學分數變為原來的兩倍。
語法:
UPDATE 表名稱 SET 列名稱 = 新值 WHERE 列名稱 = 某值
UPDATE Course SET Score = 2*Score
注意:在檢查表格內容變化時,需要先關閉原表格,(再刷新對象資源管理器?)然后重新打開
③ 刪除張樂的信息。
語法
DELETE FROM 表名稱 WHERE 列名稱 = 值
DELETE FROM Student WHERE Sname = '張樂'
操作前
操作后
總結
以上是生活随笔為你收集整理的数据库 实验三 数据库查询和数据操纵的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 标签体系构建原则
- 下一篇: riak mysql_[Trans