數據庫實驗系列之2數據庫上的基本操作實驗(針對表、視圖及不同權限用戶的增、刪、改、查及數據庫的備份和恢復)

數據庫上的基本操作實驗(針對表、視圖及不同權限用戶的增、刪、改、查及數據庫的備份和恢復)

實驗3 數據庫的簡單查詢和連接查詢

  • 實驗目的
  1. 掌握無條件查詢的使用方法。
  2. 掌握條件查詢的使用方法。
  3. 掌握庫函數及彙總查詢的使用方法。
  4. 掌握分組查詢的使用方法。
  5. 掌握查詢的排序方法。
  6. 掌握連接查詢的使用方法。
  • 實驗內容
    根據第一部分實驗中創建的學生作業管理數據庫以及其中的學生表、課程表和學生作業表,進行以下的查詢操作(每一個查詢都要給出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. 查詢於蘭蘭的選課信息,列出學號、姓名、課程名(使用兩種連接查詢的方式)。

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 數據庫查詢和數據操縱

  • 實驗目的
  1. 掌握各種查詢的使用方法。
  2. 掌握數據操縱的使用方法。
  • 實驗內容
    根據第一部分實驗中創建的學生作業管理數據庫以及其中的學生表、課程表和學生作業表,進行以下操作。
  1. 使用查詢語句完成以下任務(每一個查詢都要給出SQL語句,並且列出查詢結果)。
  1. 查詢與“張志國”同一班級的學生信息(使用連接查詢和子查詢方式)。
  2. 查詢比“計算機應用基礎”學時多的課程信息(使用連接查詢和子查詢方式)。
  3. 查詢選修課程號爲K002的學生的學號、姓名(使用連接查詢、普通子查詢、相關子查詢、使用exists關鍵字的相關子查詢)。
  4. 查詢沒有選修K001和M001課程的學號、課程號和三次成績(使用子查詢)。
  1. 使用數據操縱完成以下任務(每一個任務都要給出SQL語句,並且列出查詢結果)。
  1. 在學生表中添加一條學生記錄,其中,學號爲0593,姓名爲張樂,性別爲男,專業班級爲電子05。
  2. 將所有課程的學分數變爲原來的兩倍。
  3. 刪除張樂的信息。

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 課程表2WHERE 課程表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行所示)
*/

在這裏插入圖片描述在這裏插入圖片描述在這裏插入圖片描述在這裏插入圖片描述在這裏插入圖片描述在這裏插入圖片描述在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章