1. 程式人生 > >SQL Server 2008 資料庫_實驗三_SQL DDL 操作

SQL Server 2008 資料庫_實驗三_SQL DDL 操作

SQL DDL 操作

什麼是SQL DDL 操作?
  DDL是SQL定義語言,它主要包括三個關鍵字:create ,alter , drop(資料庫關鍵字不分大小寫 ),主要操作物件 有資料庫、表、索引、檢視等。
  
語句說明:

建立資料庫   create database
修改資料庫   alter database
刪除資料庫   drop database
建立表     create table
修改表     alter table
刪除表     drop table
建立索引    create index
刪除索引    drop index

實驗的目的

  • 掌握基本的SELECT查詢。
  • 掌握複雜查詢的實現
  • 掌握聚合函式的應用。
  • 掌握基本表的連線操作。

實驗內容與要求
在實驗1、2建立的S、SC、C、T四個基本表基礎上,完成以下查詢
1. 在四個基本表中完成以下查詢
  1)檢索學習C3課程的所有學生姓名和年齡
  2)檢索學習由教授講授的課程的學生學號和姓名
  3)檢索沒選修任何課程的學生學號
  4)檢索年齡在18到20歲之間的女學生學習的課程號和課程名
  5)檢索學習了C1或C3課程的學生學號
  6)檢索Hu同學不學的課程號
  7)檢索成績為空的課程對應的教師號和教師姓名
  8)檢索至少有S2和S4學習的課程號
  9)檢索選修了S3學習的全部課程的學生學號
  10)檢索每個學生的姓名和出生年份,並將出生年份列重新命名為Birth_Year
2.在四個基本表中完成以下查詢
  1) 檢索選修了課程的所有學生的學號,要求不顯示重複結果
  2) 檢索LIU老師所授課程的每門課程的人數和平均成績。
  3) 統計各門課程的最高分。
  4) 統計每門課程的學生選修人數,(超過3人的課程才統計),要求顯示課程號和人數,查詢結構按人數升序排序,若人數相同,按課程號降序排序。
  5) 查詢每個學生超過他自己選修課程平均成績的學號及課程號。
  6) 把低於所有課程總平均成績的女同學的成績提高3%
  7) 分別用INNER JOIN 和LEFT OUTER JOIN 連線S和SC表
  8) 檢索姓名中第三個字母為“N”的學生的姓名和年齡。
  9) 選擇C1課程的前3名的學生學號和成績。
  10) 檢索平均成績大於85的學生學號。
3.Select 語句是否必須包含FROM和WHERE字句?或者至少應該包含哪個或哪些字句?請參考聯機叢書並實驗之。

實驗主要步驟

在四個基本表中完成以下查詢

1)檢索學習C3課程的所有學生姓名和年齡
在這裡插入圖片描述
原始碼:

select S.SNAME,S.AGE 
from S,SC
where S.S# = SC.S# and SC.C# = 'c3'

2)檢索學習由教授講授的課程的學生學號和姓名
在這裡插入圖片描述
原始碼:

--檢索學習由教授講授的課程的學生學號和姓名
select distinct S.S#,S.SNAME 
from S,SC,C,T 
where T.TITLE='教授' and T.T#=C.T# and C.C#=SC.C# and SC.S#=S.S#

3)檢索沒選修任何課程的學生學號
在這裡插入圖片描述


原始碼:

--檢索沒選修任何課程的學生學號
select S.S# 
from S 
where S.S# NOT IN (SELECT S# FROM SC) 

4)檢索年齡在18到20歲之間的女學生學習的課程號和課程名
在這裡插入圖片描述
原始碼:

--檢索年齡在18到20歲之間的女學生學習的課程號和課程名
select distinct C.C#,C.CNAME 
from C,SC 
where C.C# = SC.C# and SC.S# in
(
	select S# from S 
	where S.AGE between 18 and 20
)

5)檢索學習了C1或C3課程的學生學號
在這裡插入圖片描述
原始碼:

--檢索學習了c1或c3課程的學生學號
select distinct S.S# 
from S,SC 
where S.S# like SC.S# and (SC.C# = 'c1' or SC.C# = 'c3')

6)檢索Hu同學不學的課程號
在這裡插入圖片描述

原始碼:

--檢索Hu同學不學的課程號
select C.C# 
from C 
where C.C# not in 
(
	select C# 
	from SC,S 
	where SC.S# like S.S# and S.SNAME = 'HU'
)

7)檢索成績為空的課程對應的教師號和教師姓名
在這裡插入圖片描述
原始碼:

--檢索成績為空的課程對應的教師號和教師姓名
select T.T#,T.TNAME 
from T 
where T.T# in 
(
	select C.T# 
	from C,SC 
	where C.C# like SC.C# and SC.SCORE is null
)

8)檢索至少有S2和S4學習的課程號
在這裡插入圖片描述
原始碼:

--檢索至少有S2和S4學習的課程號
select distinct SC.C# 
from SC 
where SC.C# in 
(
	(
		select SC.C# 
		from SC 
		where SC.S# like 's2'
	) 
	intersect --交集
	(
		select SC.C# 
		from SC 
		where SC.S# like 's4'
	)
)

9)檢索選修了S3學習的全部課程的學生學號
在這裡插入圖片描述
原始碼:

--檢索選修了S3學習的全部課程的學生學號
select distinct SC.S# 
from SC 
where SC.C# in 
(
	select SC.C# 
	from SC 
	where SC.S# like 's3'
)

10)檢索每個學生的姓名和出生年份,並將出生年份列重新命名為Birth_Year
在這裡插入圖片描述
原始碼:

--檢索每個學生的姓名和出生年份,並將出生年份列重新命名為Birth_Year
select S.SNAME,2018-S.AGE as Birth_Year from S

在四個基本表中完成以下查詢

1)檢索選修了課程的所有學生的學號,要求不顯示重複結果
在這裡插入圖片描述
原始碼:

--檢索選修了課程的所有學生的學號,要求不顯示重複結果
select distinct SC.S# from SC 

2)檢索LIU老師所授課程的每門課程的人數和平均成績
在這裡插入圖片描述
原始碼:

--檢索LIU老師所授課程的每門課程的人數和平均成績。
select C.C#,count(distinct SC.S#),avg(SC.SCORE)
from C,T,SC
where C.T# = T.T# and C.C# = SC.C# and TNAME = 'LIU'
group by C.C#

3)統計各門課程的最高分
在這裡插入圖片描述
原始碼:

--統計各門課程的最高分
select SC.C#,max(SC.SCORE) 
from SC 
group by SC.C#

4)統計每門課程的學生選修人數,(超過3人的課程才統計),要求顯示課程號和人數,查詢結構按人數升序排序,若人數相同,按課程號降序排序。
在這裡插入圖片描述
原始碼:

--統計每門課程的學生選修人數
--(超過3人的課程才統計),要求顯示課程號和人數,查詢結構按人數升序排序,若人數相同,按課程號降序排序。
select distinct C#,count(distinct S#) as 人數
from SC
group by C#
having count(S#)>3
order by count(distinct S#) asc,C#

5)查詢每個學生超過他自己選修課程平均成績的學號及課程號
在這裡插入圖片描述
原始碼:

--查詢每個學生超過他自己選修課程平均成績的學號及課程號。
select X.S#,X.C#
from SC as X 
where X.SCORE > 
(
	select avg(Y.SCORE) 
	from SC as Y 
	where X.S# =Y.S# 
)

6)把低於所有課程總平均成績的女同學的成績提高3%
在這裡插入圖片描述
此處的警告是因為存在空值,可在語句頂部新增 set ansi_warnings off;
原始碼:

--把低於所有課程總平均成績的女同學的成績提高3%
update SC set SC.SCORE=SC.SCORE*1.03 
where SC.SCORE like 
(
	select SC.SCORE 
	from SC,S 
	where SC.S# like S.S# and S.sex = '女' and SC.SCORE <
	(
		select avg(SC.SCORE) 
		from SC
	)
)

7)分別用INNER JOIN 和LEFT OUTER JOIN 連線S和SC表
在這裡插入圖片描述
原始碼:

--分別用 inner join 和 left outer join 連線 S 和 SC 表
select *from S inner join SC on S.S# = SC.S# 
select *from S left outer join SC on S.S# = SC.S# 

8)檢索姓名中第三個字母為“N”的學生的姓名和年齡
在這裡插入圖片描述
原始碼:

--檢索姓名中第三個字母為“N”的學生的姓名和年齡。
select S.SNAME,S.AGE 
from S 
where S.SNAME like '__N%'

9) 選擇C1課程的前3名的學生學號和成績
在這裡插入圖片描述
原始碼:

--選擇C1課程的前3名的學生學號和成績。
select top(3) SC.S#,SC.SCORE 
from SC 
where SC.C# like 'c1' order by SC.SCORE desc

10)檢索平均成績大於85的學生學號
在這裡插入圖片描述
原始碼:

--檢索平均成績大於85的學生學號。
select distinct X.S# 
from SC as X 
where 85 <= all
(
	select avg(Y.SCORE) 
	from SC as Y 
	where Y.S# = X.S# group by Y.S#
)

select 語句是否必須包含from和where字句?或者至少應該包含哪個或哪些字句?請參考聯機叢書並實驗之。

  • select column from table [where … ]
  • select 語句必須包含from字句,但並非必須包含where條件選擇字句。
  • select 語句應該包含:
      - select 關健字 必須
      - column 欄位名 必須。最少一個.全部則用*號代替。
      - from 關健字 必須
      - table 表名 必須

關鍵語法介紹:

  • like
      語法格式是:
        select * from 表名 where 欄位名 like 對應值(子串)
      它主要是針對字元型欄位的,它的作用是在一個字元型欄位列中檢索包含對應子串的。

  • distinct
      一般是用來去除查詢結果中的重複記錄的,而且這個語句在select、insert、delete和update中,只可以在select中使用。
      具體的語法如下:
      select distinct 表示式[,表示式…] from 表名 [where 條件];

  • intersect 和 except 
    (1)intersect 語句可以用來查兩個表中的“公共”資料資訊,即“交叉”資料資訊。intersect 返回 intersect運算元左右兩邊的兩個查詢都返回的所有非重複值。
    (2)except 語句則是用來查詢上述“公共”資訊“除外”才信息。except 從左查詢中返回右查詢沒有找到的所有非重複值。
    (3)與union聯合查詢語句一樣,intersect 語句和 except 語句查詢的兩個表必須具有相同的結構,即他們的列必須相似,數目相等,順序相同,且資料型別相容。
    (4)語法如下:
      select 列名 from 表名1
      intersect
      select 列名 from 表名2
      
      select 列名 from 表名1
      except
      select 列名 from 表名2

  • group by
      group by語句從英文的字面意義上理解就是“根據(by)一定的規則進行分組(Group)”。它的作用是通過一定的規則將一個數據集劃分成若干個小的區域,然後針對若干個小區域進行資料處理。

  • order by
      order by 是用在where條件之後,用來對查詢結果進行排序
      語法如下:
        order by 欄位名 asc/desc
        - asc 表示升序(預設為asc,可以省略)
        - desc表示降序
      order by 無法用於子查詢,否則會報錯:除非另外還指定了 top 或 for xml,否則,order by 子句在檢視、行內函數、派生表、子查詢和公用表表達式中無效。

如有錯誤,歡迎指正!