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 子句在檢視、行內函數、派生表、子查詢和公用表表達式中無效。
如有錯誤,歡迎指正!