資料庫實驗系列之2資料庫上的基本操作實驗(針對錶、視圖及不同許可權用戶的增、刪、改、查及資料庫的備份和恢復) ...
目錄
實驗3 資料庫的簡單查詢和連接查詢
- 實驗目的
- 掌握無條件查詢的使用方法。
- 掌握條件查詢的使用方法。
- 掌握庫函數及彙總查詢的使用方法。
- 掌握分組查詢的使用方法。
- 掌握查詢的排序方法。
- 掌握連接查詢的使用方法。
- 實驗內容
根據第一部分實驗中創建的學生作業管理資料庫以及其中的學生表、課程表和學生作業表,進行以下的查詢操作(每一個查詢都要給出SQL語句,列出查詢結果)。
- 查詢各位學生的學號、班級和姓名。
- 查詢課程的全部信息。
- 查詢資料庫中有哪些專業班級。
- 查詢學時數大於60的課程信息。
- 查詢在1986年出生的學生的學號、姓名和出生日期。
- 查詢三次作業的成績都在80分以上的學號、課程號。
- 查詢姓張的學生的學號、姓名和專業班級。
- 查詢05級的男生信息。
- 查詢沒有作業成績的學號和課程號。
- 查詢學號為0538的學生的作業1總分。
- 查詢選修了K001課程的學生人數。
- 查詢資料庫中共有多少個班級。
- 查詢選修三門以上(含三門)課程的學生的學號和作業1平均分、作業2平均分和作業3平均分。
- 查詢於蘭蘭的選課信息,列出學號、姓名、課程名(使用兩種連接查詢的方式)。
SQL語句代碼
/*
1.查詢各位學生的學號、班級和姓名。
2.查詢課程的全部信息。
3.查詢資料庫中有哪些專業班級。
4.查詢學時數大於60的課程信息。
5.查詢在1986年出生的學生的學號、姓名和出生日期。
6.查詢三次作業的成績都在80分以上的學號、課程號。
7.查詢姓張的學生的學號、姓名和專業班級。
8.查詢05級的男生信息。
9.查詢沒有作業成績的學號和課程號。
10.查詢學號為0538的學生的作業1總分。
11.查詢選修了K001課程的學生人數。
12.查詢資料庫中共有多少個班級。
13.查詢選修三門以上(含三門)課程的學生的學號和作業1平均分、作業2平均分和作業3平均分。
14.查詢於蘭蘭的選課信息,列出學號、姓名、課程名(使用兩種連接查詢的方式)。
*/
select * from 學生表;
select * from 課程表;
select * from 學生作業表;
--1.查詢各位學生的學號、班級和姓名。
select distinct 學號,姓名,專業班級 from 學生表,課程表;
--2.查詢課程的全部信息。
select * from 課程表;
--3.查詢資料庫中有哪些專業班級。
select 專業班級 from 學生表;
--4.查詢學時數大於60的課程信息。
select * from 課程表 where 學時數>60;
--5.查詢在1986年出生的學生的學號、姓名和出生日期。
select 學號,姓名,出生日期 from 學生表 where 出生日期 like '1986%';
--6.查詢三次作業的成績都在80分以上的學號、課程號。
select 學號,課程號 from 學生作業表 where 作業1成績>=80 and 作業2成績>=80 and 作業3成績 >=80;
--7.查詢姓張的學生的學號、姓名和專業班級。
select 學號,姓名,專業班級 from 學生表 where 姓名 like '張%';
--8.查詢05級的男生信息。
select * from 學生表 where 專業班級 like '%05' and 性別 in ('男');
--9.查詢沒有作業成績的學號和課程號。
select 學號,課程號 from 學生作業表 where 作業1成績 | 作業2成績| 作業3成績 is null;
--10.查詢學號為0538的學生的作業1總分。
select sum(作業1成績) as '學號為0538的學生的作業1總分' from 學生作業表 where 學號 in (0538);
--11.查詢選修了K001課程的學生人數。
select distinct count(學號) as '選修了K001課程的學生人數' from 學生作業表 where 課程號 in ('K001');
--12.查詢資料庫中共有多少個班級。
select count(distinct 專業班級) as '資料庫中共有多少個班級' from 學生表;
--13.查詢選修三門以上(含三門)課程的學生的學號和作業1平均分、作業2平均分和作業3平均分。
select 學號,avg(作業1成績) as '作業1平均分',avg(作業2成績) as '作業2平均分',avg(作業3成績) as '作業3平均分'
from 學生作業表
where 學號 in
(select 學號 from 學生作業表 group by 學號 having (count(*)>2))
group by 學號;
/*
SELECT 學生作業表.學號,AVG(作業1成績) as '作業1平均分',AVG(作業2成績) as '作業2平均分',AVG(作業3成績) as '作業3平均分'
FROM 學生表,學生作業表
WHERE 學生表.學號 = 學生作業表.學號
GROUP BY 學生作業表.學號
HAVING COUNT(*) >2;
*/
--14.查詢於蘭蘭的選課信息,列出學號、姓名、課程名(使用兩種連接查詢的方式)。
--第一種
select 學生表.學號,姓名,課程名 from 學生表,課程表,學生作業表
where 學生表.學號=學生作業表.學號 and
課程表.課程號=學生作業表.課程號 and
姓名 in ('於蘭蘭');
--第二種
select 學生表.學號,姓名,課程名 from 學生表 left join
(select 學號,課程名 from 課程表 join 學生作業表 on 課程表.課程號=學生作業表.課程號) as 連接表
on 學生表.學號=連接表.學號 where 姓名='於蘭蘭' ;
實驗4 資料庫查詢和數據操縱
- 實驗目的
- 掌握各種查詢的使用方法。
- 掌握數據操縱的使用方法。
- 實驗內容
根據第一部分實驗中創建的學生作業管理資料庫以及其中的學生表、課程表和學生作業表,進行以下操作。
- 使用查詢語句完成以下任務(每一個查詢都要給出SQL語句,並且列出查詢結果)。
- 查詢與“張志國”同一班級的學生信息(使用連接查詢和子查詢方式)。
- 查詢比“電腦應用基礎”學時多的課程信息(使用連接查詢和子查詢方式)。
- 查詢選修課程號為K002的學生的學號、姓名(使用連接查詢、普通子查詢、相關子查詢、使用exists關鍵字的相關子查詢)。
- 查詢沒有選修K001和M001課程的學號、課程號和三次成績(使用子查詢)。
- 使用數據操縱完成以下任務(每一個任務都要給出SQL語句,並且列出查詢結果)。
- 在學生表中添加一條學生記錄,其中,學號為0593,姓名為張樂,性別為男,專業班級為電子05。
- 將所有課程的學分數變為原來的兩倍。
- 刪除張樂的信息。
SQL語句代碼
--1.使用查詢語句完成以下任務(每一個查詢都要給出SQL語句,並且列出查詢結果)。
--(1)查詢與“張志國”同一班級的學生信息(使用連接查詢和子查詢方式)。
--子查詢
select * from 學生表
WHERE 專業班級 = (SELECT 專業班級
FROM 學生表
WHERE 姓名 = '張志國');
--連接查詢
select 學生表1.* from 學生表 as 學生表1,學生表 as 學生表2
where 學生表2.姓名='張志國' AND 學生表1.專業班級=學生表2.專業班級;
--(2)查詢比“電腦應用基礎”學時多的課程信息(使用連接查詢和子查詢方式)。
--連接查詢
SELECT 課程表1.*
FROM 課程表 AS 課程表1,課程表 AS 課程表2
WHERE 課程表2.課程名 = '電腦應用基礎' AND 課程表1.學時數>課程表2.學時數;
--子查詢
SELECT * FROM 課程表
WHERE 學時數>(SELECT 學時數
FROM 課程表
WHERE 課程名 = '電腦應用基礎');
--(3)查詢選修課程號為K002的學生的學號、姓名(使用連接查詢、普通子查詢、相關子查詢、使用exists關鍵字的相關子查詢)。
--連接查詢1
select 學生表.學號,姓名 from 學生表 join
(select 學號 from 學生作業表 join 課程表
on 課程表.課程號='K002'and 學生作業表.課程號='K002' ) as 新命名錶
on 新命名錶.學號=學生表.學號;
--連接查詢2
SELECT 學生表.學號,學生表.姓名 FROM 學生作業表,學生表
WHERE 學生作業表.課程號 = 'K002' AND 學生作業表.學號=學生表.學號;
--普通子查詢
select distinct 學生表.學號,學生表.姓名
from 學生作業表,學生表
where 學生表.學號 in (
select 學生表.學號
from 學生作業表
where 學生作業表.課程號='K002' and 學生作業表.學號=學生表.學號
);
--相關子查詢
select distinct 學生表.學號,學生表.姓名
from 學生表,學生作業表
where 學生表.學號 in (
select 學生作業表.學號
from 學生作業表
where 學生作業表.課程號='K002'
);
--使用exists關鍵字的相關子查詢
select distinct 學生表.學號,學生表.姓名
from 學生作業表,學生表
where exists (
select *
from 學生作業表
where 學生作業表.課程號='K002' and 學生作業表.學號=學生表.學號
);
--select * from 學生表
--select * from 課程表
--select * from 學生作業表
--(4)查詢沒有選修K001和M001課程的學號、課程號和三次成績(使用子查詢)。
select distinct 學號,課程號,作業1成績,作業2成績,作業3成績 from 學生作業表
where 學號 not in
(select 學號 from 學生作業表 where 課程號='K001' OR 課程號='M001');
--2.使用數據操縱完成以下任務(每一個任務都要給出SQL語句,並且列出查詢結果)。
--(1)在學生表中添加一條學生記錄,其中,學號為0593,姓名為張樂,性別為男,專業班級為電子05。
insert into 學生表(學號,姓名,性別,專業班級) values (0593,'張樂','男','電子05');
--(2)將所有課程的學分數變為原來的兩倍。
update 課程表 SET 學分數=學分數*2;
--(3)刪除張樂的信息。
delete from 學生表 where 姓名='張樂';
--select * from 課程表;
--select * from 學生表;
實驗8:資料庫備份與恢復實驗
用資料庫備份語句完成資料庫的完全備份,能用DTS工具對錶的數據進行導出和導入,能用備份文件恢複數據庫。
註意:為演示導入導出,備份恢復,特意創建一個aoe資料庫(和之前的market資料庫基本一致),用來演示
SQL語句代碼
--先創建一個aoe資料庫,用來演示導入導出,備份恢復
create database aoe;
use aoe;
create table Customers( --客戶表
CustomerID int constraint pk_1 primary key, --客戶編號為主鍵
Cname nvarchar(20) not null, --客戶姓名
City nvarchar(20) --所在城市
);
create table Goods( --商品表
GoodID int constraint pk_2 primary key, --商品編號為主鍵
Gname nvarchar(20) not null, --商品名稱
Price float not null, --單價
Provider nvarchar(20) not null,--供應商
Stocks int check(Stocks>=0), --庫存量
Status nvarchar(20) --商品狀態
);
create table Orders( --訂單表
OrderID int constraint pk_3 primary key, --訂單號
GoodID int constraint fk_1 foreign key references Goods(GoodID), --商品編號
CustomerID int constraint fk_2 foreign key references Customers(CustomerID),--客戶編號
Quantity int check(Quantity>0),--訂貨數量
OrderSum float ,--訂貨金額
Date nvarchar(20) --日期
);
--插入兩條數據
insert into Customers (CustomerID,Cname,City) values (2,'李勇','西安');
insert into Customers (CustomerID,Cname,City) values (1,'阿綱','西安');
--使用DTS 數據轉換服務,導入導出數據(具體操作實驗報告展示)
/*可能遇到的問題:
1、沒有數據源(重要):
解決方法:去(控制面板)搜索(ODBC 數據源)然後新添加由SQLSERVER驅動程式組成的數據源(記得將自己設置的名稱記下)
然後再導入導出嚮導的幫助下可以繼續進行操作
2、關於數據源使用Microsoft OLE DB Driver for SQL Server還是Microsoft OLE DB Provider for SQL Server?
區別是前者是 ODBC 連接,後者是OLE DB連接
--這個設計到一些歷史沿革問題:最初每個廠商標準不一樣,後來出現同一標準ODBC,微軟又推出自己的Sql Server的oledb,
為了照顧使用者,微軟給了個odbc介面,用戶使用後內部進行OLE DC轉化,再轉化執行,因此多一道轉化,耗時些
3、我第一次導出數據時,因不熟練導出的數據不知道位置
後來發現在系統資料庫master中
*/
select * from Customers; --查看發現導入數據成功
--補充知識點:ODBC:一般指開放資料庫連接(Open Database Connectivity,ODBC)是為解決異構資料庫間的數據共用而產生的。
--備份和恢復圖形化界面操作方法(手動操作很簡單,根據提示進行)
--SQL語句方法展示
--1、備份:
DECLARE @filename VARCHAR(255); --文件名
DECLARE @date DATETIME; --日期
DECLARE @path VARCHAR(255); --文件存放路徑
SELECT @date = GETDATE(); --獲取當前時間
SET @filename = CAST(DATEPART(yyyy, @date) AS VARCHAR) + '-' + CAST(DATEPART(mm, @date) AS VARCHAR) + '-'
+ CAST(DATEPART(dd, @date) AS VARCHAR) +'-' + CAST(DATEPART(hh,@date) as varchar)+CAST(DATEPART(mi,@date) as varchar)+'.bak';
--設置的文件名是用時間命名的(好處:下次備份名字不會重覆)
set @path='D:\SqlServer備份文件示例\'+@filename;
backup database aoe to disk=@path;
/*可能遇到的問題:
1.備份的磁碟顯示操作系統許可權不夠5(重要)
解決辦法1:去(電腦)右鍵點擊選擇(屬性)選擇(安全)修改用戶的許可權(這種辦法比較耗時,且對磁碟不安全)
解決辦法2:在盤中新建文件夾,查看屬性中安全是否允許寫入,如果允許,就用這個文件夾路徑
*/
--2、還原:
drop database aoe;
--先刪除後還原
restore database aoe from disk='D:\SqlServer備份文件示例\2020-5-17-1416.bak' WITH REPLACE;
/*可能遇到的問題:日誌文件沒有備份(重要)
解決方法:在還原語句後加WITH REPLACE(如56行所示)
*/