1. 程式人生 > 實用技巧 >資料庫複習(三) Microsoft SQL Server 基本語法小結 2020.12.18

資料庫複習(三) Microsoft SQL Server 基本語法小結 2020.12.18

資料庫複習(三) Microsoft SQL Server 基本語法小結 2020.12.18

1.表定義及表操作

1.1 建立基本表

e.g 建立學生表

use school
go

create table student(Sno char(10) not null, Sname char(20), Ssex char(5), Sage integer, Sdept char(20))
go

1.2 修改基本表(新增約束、修改表的定義等操作)

新增約束在第三節講,這裡介紹如何修改表的定義

增加屬性

-- 為學生表xs增加屬性列'籍貫'

alter table xs
add 籍貫 char(20) -- 注意不是 add column

刪除屬性

-- 為學生表xs刪除屬性列'籍貫'

alter table xs
drop column 籍貫 -- 注意是 add column

1.3 表的查詢

  • 表查詢的基本結構如下
select ...
from ...
where ...
  • 在表的查詢中常用聚集操作、排序操作
-- 統計各個專業的男生人數
select 專業,count(*) as 男生人數
from xs
where 性別 = '男'
group by 專業



-- 從高到低排序'計算機'專業學生的'計算機基礎'成績,輸出所有及格學生成績
select 學生,成績
from cj left join xs on cj.學號 = xs.學號 left join kc on cj.課程號 = kc.課程號
where xs.專業 = '計算機' and kc.課程名 = '計算機基礎' and cj.成績 >= 60
order by 成績 desc



distinct -- 去重
  • 此外,在聚集操作中還常用到語法
case 'xxx'
when '...' then '...'
when '...' then '...'
when '...' then '...'
else '...'
end
  • 此外,表的查詢還常用到集合、邏輯運算運算
except -- 差集(可以用別的方式代替)
exists -- 存在
all() -- 所有的
any() -- 其中之一的
  • 其他常用語法
-- 查詢年齡不在20~30歲之間的學生姓名、專業和年齡

select 姓名,專業,年齡
from xs
where 年齡 not between 20 and 30


-- 字元匹配
-- % 表示任意長度的任意字串
-- _代表任意單個字元
  • 高階的查詢方法包括:子查詢、派生表
-- 查詢和程明同齡的學生的學號和姓名以及年齡


-- 使用相關子查詢
select 姓名,年齡
from xs
where 年齡 = 
	(
	select 年齡
	from xs
	where 姓名 = '程明'
    )
    
-- 使用派生表 + 連線
select 姓名,年齡
from xs right join 
	(
    select 年齡
	from xs
	where 姓名 = '程明'
    ) as temp on xs.年齡 = temp.年齡 

1.4 更新、新增、刪除元組

更新

-- 將被全部學生都選修了的課程的總學分改為4學分
use xsgl
go

update kc
set kc.學分 = 4
where not exists
	(
	select * 
	from xs
	where not exists
		(
		select *
		from cj
		where cj.學號 = xs.學號 and cj.課程號 = kc.課程號
		)
	)

新增

-- 向課程表kc中新增元組('001','離散數學',3,3,null)
-- kc 表結構為(課程號,課程名,學分,學時數,先行課號)

insert into kc
values('001','離散數學',3,3,null)

-- 或
insert into kc (課程號,課程名,學分,學時數,先行課號)
values('001','離散數學',3,3,null)

刪除

-- 在學生表xs中刪除未選課的學生
delete from xs
where 學號 not in
	(
	select xs
	from cj
    )

1.5 刪除表

drop table xs

2.資料的組織方式

2.1模式

模式是資料庫中全體資料的邏輯結構和特徵的描述,在關係型資料庫中,模式的表現是一系列表與表之間的聯絡

模式將一系列表按照邏輯組織起來,如一個醫院可能劃分為門診部模式、住院部模式等。如果不建立多個模式,那麼整個資料庫就會出現大量的表,邏輯混亂,還可能出現命名衝突的問題。

在Microsoft SQL Server中,由資料庫管理員建立模式;或者某一個使用者獲得了資料庫管理員給授予的CREATE SCHEMA許可權

建立模式的語法如下

-- 使用使用者名稱 test_db 建立模式 "test_schema"
create schema test_schema authorization test_db
-- 模式名可以省略,此時模式名即為使用者名稱

在建立完模式之後,就可以指定表的模式了;我們既可以在建立表的時候直接定義表的模式,也可以在建立表之後再新增修改表的模式

-- 建立表時指定模式
create table test_schema.test_table(
	Feature1 integer,
    Feature2 integer
)

刪除模式

drop schema test_schema [cascade 級聯/ restrict 限制]

2.2 索引

索引用於快速找出在某個列中具有特定值的行,不使用索引,資料庫系統必須從第一個記錄開始讀取整個表,直到找出所有符合條件的行。表越大,花費的時間越多,如果表中查詢的列有一個索引,就可以加快查詢。

-- 聚集索引(需排序索引,唯一)
-- 主鍵本身就是一個聚集索引;如果表定義了主鍵,則不能再建立其他的聚集索引
create unique clustered index 專業索引 on xs(專業)

-- 非聚集索引(無需排序索引)
create unique nonclustered index 專業索引 on xs(專業) -- unique是指學生的專業無重複值(實際上是不可能的)

create nonclustered index 專業索引 on xs(專業) 

2.3 檢視

檢視是從一個或幾個基本表(或檢視匯出的表)。它與基本表不同,是一個虛表。資料庫只會存放檢視的定義,而不會存放檢視對應的資料,這些資料仍然存放在原來的基本表中,所以一旦基本表發生改變,檢視也會隨之改變;可以將檢視理解為一個原表的引用,它沒有獲得新的儲存空間,只是獲得了原表的地址。

建立檢視

-- 建立每一門課選課門數和平均分的檢視


create view 課程平均分及選課人數 as
select temp.課程號,kc.課程名,temp.平均分,temp.選課人數
from kc left join
	(
	select kc.課程號,avg(cj.成績) as 平均分,count(*) as 選課人數
	from kc left join cj on kc.課程號 = cj.課程號
	group by kc.課程號
    ) as temp on kc.課程號 = temp.課程號
    
    
    
with check option; -- 對檢視的插入、刪除、更新時都需要滿足檢視的where條件

檢視的其他操作基本與表操作一致

3. 資料庫安全性

3.2 建立登入名、使用者名稱

登入名用於登入伺服器,使用者名稱用於將登入名連線至某一個特定的資料庫

建立登入名

-- 使用sql語句
create login test_dba with password = '123'
go

-- 使用儲存過程
exec sp_addlogin 'test_dba','123'
go

建立使用者名稱

-- 使用sql語句
create user test_school_dba for login test_dba
go

-- 使用儲存過程
exec sp_adduser 'test_dba','test_school_dba'