當初的SqlServer數據庫複習筆記

數據庫用戶和權限管理

查看數據庫的全部用戶

select * from sys.sql_logins
複製代碼

刪除用戶

drop login login_name
複製代碼

建立用戶:

建立登錄:sql

create login user1 with password='123456',default_database=test2
複製代碼

建立用戶:數據庫

create user U1 for login user1
複製代碼

授予權限:express

grant select on employee to U1
複製代碼
  • 授予用戶單個權限
grant select on employee to U1
複製代碼
  • 賦予全部權限: 先建立登陸名user2和用戶U2,而後執行下面語句
grant all on employee to U2,U3
複製代碼

執行成功,並提示all權限不推薦使用
經常使用的權限:bash

收回權限:

和賦予權限相似:服務器

revoke all on employee to U1,U2
複製代碼

注意:不能直接爲登陸名受權,必須爲登陸名建立一個用戶函數

create user U1 for login user1
grant select on employee to U1
複製代碼

後面內容可能用到的表結構:

部門數據庫 工具

中文:fetch

學生信息數據庫:ui

數據庫遊標

定義遊標:

DECLARE cursor_name CURSOR [ LOCAL | GLOBAL]
FOR select_statement

[ FOR UPDATE [ OF column_name [,...n] ] ]
複製代碼

注意:有標名稱寫在關鍵字CURSOR前面,select_statement就是查詢語句,用的是for關鍵字鏈接的spa

  • 對一條查詢語句定義一個遊標
declare c1 cursor 
for 
select emp_no,emp_name,dept,title,salary,addr 
from employee where sex='f'
複製代碼

遊標的使用:

利用遊標查找全部女業務員的基本狀況。

declare c1 cursor 
for 
select emp_no,emp_name,dept,title,salary,addr 
from employee where sex='f' 

open c1
declare @emp_no nvarchar(5),@emp_name nvarchar(10),@dept nvarchar(4),@title nvarchar(6),@salary int,@addr nvarchar(50)
--遊標的初始狀態指向爲空,因此讓他先往下走一步
fetch next from c1 into @emp_no,@emp_name,@dept,@title,@salary,@addr

while @@FETCH_STATUS=0--判斷fetch語句是否執行成功(前提是執行過)
begin
	--print @emp_no+','+@emp_name+','+@dept+','+@title+','+@salary+','+@addr
	select @emp_no 員工標號,@emp_name 員工姓名,@dept 部門,@title 職稱,@salary 工資,@addr 住址
	fetch next from c1 into @emp_no,@emp_name,@dept,@title,@salary,@addr
	
end
close c1
deallocate c1--釋放遊標
複製代碼

一個小知識點:賦值時,使用select或者set

存儲過程

一個簡單的介紹:

存儲過程就是SQL Server爲了實現特定任務,而將一些須要屢次調用的固定操做語句編寫成程序段,這些程序段存儲在服務器上,有數據庫服務器經過程序來調用。

建立存儲過程(小例子):

利用存儲過程查找「劉剛」的員工編號、訂單編號、銷售金額。

create proc p1 as
select emp_no,order_no,tot_amt from employee inner join sales on employee.emp_no=sales.sale_id where emp_name='劉剛'
exec p1—執行存儲過程
複製代碼

注意:關鍵字用as

修改和刪除存儲過程

修改存儲過程:

alter proc p1 as
select * from employee
複製代碼

刪除存儲過程:

drop proc p1
複製代碼

建立帶有參數的存儲過程

建立帶有一個參數的存儲過程

create proc p1(@emp_name nvarchar(10)) as
select * from employee where emp_name=@emp_name
exec p1 '劉剛'
複製代碼

建立帶有兩個參數的存儲過程

create proc p2(@emp_name nvarchar(10),@dept nvarchar(4)) as
select * from employee where emp_name=@emp_name and dept=@dept
exec p2 '劉剛','業務'
複製代碼

建立帶有返回值的存儲過程

create proc p3(@emp_name nvarchar(10),@dept nvarchar(4) output) as
select @dept=dept from employee where emp_name=@emp_name

declare @de nvarchar(4)
exec p3 '劉剛',@de output
print @de
複製代碼

存儲過程能夠帶有通配符,也能夠帶遊標參數

用戶自定義函數

關於數據庫的go命令(簡單的解釋)

GO 是SYBASE和SQL Server中用來表示事物結束,提交併確認結果,至關於ORACLE的Commit。 GO不是Transact-SQL語句;而是可爲cmdsql和osql實用工具及SQL Server查詢分析器識別的命令。 SQL Server實用工具將GO解釋爲應將當前的Transact-SQL批處理語句發送給SQL Server的信號。 當前批處理語句是自上一GO命令後輸入的全部語句,如果第一條GO命令,則是從特殊會話或腳本的開始處到這條GO命令之間的全部語句。

建立標量函數語法:

create function [函數的全部者].函數名(標量參數 [as] 標量參數類型 [=默認值])
returns 標量返回值類型
[with {Encryption | Schemabinding }]
[as]
begin
    函數體(即 Transact-SQL 語句)
    return 變量/標量表達式
end
複製代碼

標量函數的一個小例子:

定義:

use test2
go
create function avgSalary(@sex nvarchar(1))
returns decimal
as
begin

	declare @avgs decimal(10,2)
	select @avgs=avg(salary) from employee where sex=@sex
	return @avgs
end
go
複製代碼

執行:

select dbo.avgSalary('m') as 平均工資
複製代碼

注意:

  • 執行時函數的全部者是不能省的
  • 函數內不能用print語句

內嵌表值函數:

go
create function empInfo(@emp_no nvarchar(5))
returns table
as
return(
select * from employee where emp_no=@emp_no
)
go
複製代碼

執行

select * from employee
select * from dbo.empInfo('e0001')
複製代碼

自定義函數的執行

使用select語句

select dbo.avgSalary('m') as 平均工資
複製代碼

使用exec語句

declare @avg decimal(10,2)
exec @avg=dbo.avgSalary @sex='m'
print @avg
複製代碼

自定義函數的刪除

drop function empInfo
drop function avgSalary
複製代碼

數據庫ER圖基礎概念

基本介紹

ER圖分爲實體、屬性、關係三個核心部分。
實體是長方形體現,而屬性則是橢圓形,關係爲菱形。

ER圖的實體(entity)

即數據模型中的數據對象,例如人、學生、音樂均可以做爲一個數據對象,用長方體來表示,每一個實體都有本身的實體成員(entity member)或者說實體對象(entity instance),例如學生實體裏包括張3、李四等,實體成員(entity member)/實體實例(entity instance) 不須要出如今ER圖中。

ER圖的屬性(attribute)

即數據對象所具備的屬性,例如學生具備姓名、學號、年級等屬性,用橢圓形表示,屬性分爲惟一屬性( unique attribute)和非惟一屬性,惟一屬性指的是惟一可用來標識該實體實例或者成員的屬性,用下劃線表示,通常來說實體都至少有一個惟一屬性。

ER圖的關係(relationship)

用來表現數據對象與數據對象之間的聯繫,例如學生的實體和成績表的實體之間有必定的聯繫,每一個學生都有本身的成績表,這就是一種關係,關係用菱形來表示。

簡單的例子:

實體:

ER的實體還會細分爲弱實體和複合實體:

弱實體:

一個實體必須依賴於另外一個實體存在,那麼前者是弱實體,後者是強實體,弱實體必須依賴強實體存在,例如上圖的學生實體和成績單實體,成績單依賴於學生實體而存在,所以學生是強實體,而成績單是弱實體。
弱實體和強實體的聯繫必然只有1:N或者1:1,這是因爲弱實體徹底依賴於強實體,強實體不存在,那麼弱實體就不存在,因此弱實體是徹底參與聯繫的,所以弱實體與聯繫之間的聯繫也是用的雙線菱形。

複合實體:

複合實體也稱聯合實體或橋接實體,經常用於實現兩個或多個實體間的M:N聯繫,它由每一個關聯實體的主瑪組成,用長方體內加一個菱形來表示。

下圖就是一個典型的複合實體,用戶和商品兩個實體是M:N的關係,中間又訂單這個實體聯繫,所以訂單這個實體是一個複合實體,同時若是用戶 實體不存在,就沒有訂單實體的存在,所以對於用戶實體來說訂單是弱實體,同理商品實體若是不存在,一樣不存在訂單實體,所以對商品實體而言訂單是弱實體,具體如圖:

屬性:

ER圖的屬性還細分爲複合屬性、多值屬性和派生屬性、可選屬性,同時還有用來表示聯繫的屬性,稱爲聯繫屬性。

複合屬性(composite attribute):

複合屬性是指具備多個屬性的組合,例如名字屬性,它能夠包含姓氏屬性和名字屬性,以下圖:

複合屬性也有惟一屬性,例如學生的所在班級屬性,因爲多個年級都有班級,因此單單班級屬性是不惟一的,可是和年級組成的複合屬性後則能夠匹配成惟一屬性。

多值屬性(multivalued attribute):

一個實體的某個屬性能夠有多個不一樣的取值,例如一本書的分類屬性,這本書有多個分類,例如科學、醫學等,這個分類就是多值屬性, 用雙線橢圓表示。

派生屬性(derivers attribute):

是非永久性存於數據庫的屬性。派生屬性的值能夠從別的屬性值或其餘數據(如當前日期)派生出來,用虛線橢圓表示,以下圖。
下面的小組人數就是典型的派生屬性,隨着學生實例的參加的興趣小組變化,小組人數屬性也會變化,通常來說派生屬性不存在於數據庫中,而是經過相應的公式進行計算獲得,若是要放到數據庫中,那麼隔一段時間就要進行更新,不然會出現數據錯誤。

可選屬性(optional attribute):

並非全部的屬性都必須有值,有些屬性的能夠沒有值,這就是可選屬性,在橢圓的文字後用(O)來表示,以下圖的地址就是一個可選屬性。

聯繫屬性:

聯繫屬於用戶表示多個實體之間聯繫所具備的屬性,通常來說M:N的兩個實體的聯繫具備聯繫屬性,在1:1和1:M的實體聯繫中聯繫屬性並沒必要要。

關係:

ER圖中關聯關係有三種:

1對1(1:1) :

1對1關係是指對於實體集A與實體集B,A中的每個實體至多與B中一個實體有關係;反之,在實體集B中的每一個實體至多與實體集A中一個實體有關係。

1對多(1:N) :

1對多關係是指實體集A與實體集B中至少有N(N>0)個實體有關係;而且實體集B中每個實體至多與實體集A中一個實體有關係。

多對多(M:N) :

多對多關係是指實體集A中的每個實體與實體集B中至少有M(M>0)個實體有關係,而且實體集B中的每個實體與實體集A中的至少N(N>0)個實體有關係。

表示

在E-R圖中,用「->」表示指向參與聯繫集中的「一」方實體集, 「——」表示參與聯繫集中的「多」方實體集。

形式化關係查詢語言

符號:

選擇:

查詢年齡小於20歲的學生。

σSage < 20(Student) 
複製代碼

相似這個效果:

Select * from Student where Sage<20
複製代碼

查找全部1992年及之後出生的女學生狀況

σyear(birthday)>=1992∧sex='女'(Student)
複製代碼

∧相似於and

投影:

1.查找全部學生的姓名和民族

∏:投影,相似於

Select studentName,nation from Student
複製代碼

2.括號裏的內容能夠是用σ符號選出來的內容: 查找全部「蒙古族」學生的姓名和籍貫:

∏studentName, native(σnation=‘蒙古族’(Student))
複製代碼

鏈接:

簡單複習下數據庫基礎

數據庫的基本數據類型:

  • char(n). 用戶指定長度的字符串,n爲字符串長度
  • varchar(n). 可變長度的字符串,用戶指定最大長度.
  • varchar(max) 可變長度的字符串。最多 1,073,741,824 個字符。
  • text 可變長度的字符串。最多 2GB 字符數據。
  • int. 整型,4B
  • smallint. 小整數類型,2B
  • numeric(p,d). 定點數,精度由用戶指定,decimal(p,d)和這個相似
  • float(n). 精度至少爲n位的浮點數,n由用戶指定
  • Datetime 日期/時間型,8B
  • Bit 容許 0、1 或 NULL
  • binary(n) 固定長度的二進制數據。最多 8,000 字節。
  • varbinary(n) 可變長度的二進制數據。最多 8,000 字節。
  • varbinary(max) 可變長度的二進制數據。最多 2GB 字節。
  • image 可變長度的二進制數據。最多 2GB。

數據庫的定義和刪除

  • 建立:CREATE DATABASE <數據庫名>
  • 刪除:DROP DATABASE <數據庫名>

###表的定義和刪除:

表的定義:

CREATE TABLE <表名>
      (<列名1> <數據類型> [<列1的完整性約束>][,
          <列名2> <數據類型> [<列2的完整性約束>],
                 … …  ,
          <列名n> <數據類型> [<列n的完整性約束>],
     [<表的完整性約束>]]);
複製代碼

基本表的修改:

增長列(新增一列的值爲空值):

ALTER TABLE <tableName>
     ADD <columnName> <dataType>
複製代碼

刪除列:

ALTER TABLE <tableName>
     DROP column < columnName >
複製代碼

修改列的數據類型:

ALTER TABLE <tableName>
     ALTER COLUMN <columnName> <newDataType>
複製代碼

注意:在刪除列之前必須先刪除基於該列的全部索引和約束
注意:對列定義的修改只適用於修改列的類型和長度,列名不能修改。當表中已有數據時,只能增長列的長度,不能縮短列的長度。

約束

  • NULL:指出該列能夠爲空值。
  • NOT NULL:指出該列不能爲空值。每個表中至少應有一個列的可選項爲NOT NULL。
  • PRIMARY KEY:指出該列名爲表的主鍵。
  • CHECK (<值的約束條件>):表檢驗CHECK約束

索引

建立索引

CREATE [UNIQUE ] [CLUSTER ] INDEX <索引名> 
&emsp;&emsp;ON&emsp;<表名>&emsp;&emsp;(<列名>[<次序>][,<列名>[<次序>]]...)
複製代碼

刪除索引

DROP INDEX  索引名
複製代碼

查詢

基本語法:

Select <列名>,<列名>,<列名>… from 表名 [where 篩選語句]
複製代碼

限制結果集返回行數

若是SELECT語句返回的結果集的行數很是多,那麼可使用TOP選項限制其返回的行數。TOP選項的基本格式爲:

[ TOP expression [ PERCENT ] [ WITH TIES ] ]
複製代碼

指示只能從查詢結果集返回指定的第一組行或指定的百分比數目的行。expression能夠是指定數目或百分比數目的行。若帶PERCENT關鍵字,則表示返回結果集的前expression%行。

【例】 對PXSCJ數據庫的XSB表選擇姓名、專業和總學分,返回結果集的前6行。

SELECT TOP 6 姓名,專業,總學分
	FROM XSB
複製代碼

查詢條件:

換碼字符

若是查詢字串中自己要包含%和_,必須使用「ESCAPE <換碼字符>」短語,對通配符進行轉義處理。

[例] 在班級Class表中查詢班級名稱中含有「08_」符號的班級名稱

SELECT className
   FROM Class
   WHERE className LIKE '%08\_%' ESCAPE '\' 複製代碼

「ESCAPE ‘\’」表示\爲換碼字符。 緊跟在\符號後的_不是通配符,而是普通的用戶要查詢的符號

結果排序:

SELECT Sno,Grade 
FROM SC 
WHERE Cno=‘3ORDER BY Grade DESC
複製代碼
SELECT *
FROM  Student
ORDER BY Sdept, Sage DESC
複製代碼

缺省按升序(ASC)排序,按降序排序,必須指明DESC選項

當排序列含空值時

  • ASC:排序列爲空值的元組最後顯示
  • DESC:排序列爲空值的元組最早顯示

集函數(聚合函數)

  • COUNT([DISTINCT|ALL]*)
  • COUNT([DISTINCT|ALL]<列名>) 計算列數
  • SUM ([DISTINCT|ALL] <列名>) 計算總和
  • AVG ([DISTINCT|ALL] <列名>) 計算平均數
  • MAX ([DISTINCT|ALL] <列名>) 最大值
  • MIN ([DISTINCT|ALL] <列名>) 最小值

[例] 查詢學生總人數。

SELECT COUNT(*) FROM  Student
複製代碼

[例] 查詢選修了課程的學生人數。

SELECT COUNT(DISTINCT Sno) FROM SC
複製代碼

分組:

SELECT Cno,COUNT(Sno)
FROM SC 
GROUP BY Cno 
複製代碼

注意:分組查詢的結果只能包含分組依據和彙集函數

查詢選修了3門以上課程的學生學號:

SELECT Sno
 FROM SC 
GROUP BY Sno 
HAVING COUNT(*)>3
複製代碼

WHERE和HAVING的區別在於做用對象不一樣: WHERE做用於基本表或視圖,從中選擇知足條件的元組, HAVING做用於子組,從中選擇知足條件的組。

鏈接查詢:

SELECT Student.* ,  SC.*  
FROM Student,SC  
WHERE Student.Sno=SC.Sno
複製代碼
  • 內鏈接。指定了INNER關鍵字的鏈接是內鏈接,內鏈接按照ON所指定的鏈接條件合併兩個表,返回知足條件的行。
  • 外鏈接。指定了OUTER關鍵字的爲外鏈接,外鏈接的結果表不但包含知足鏈接條件的行,還包括相應表中的全部行。外鏈接包括如下三種。
    • 左外鏈接(LEFT OUTER JOIN):結果表中除了包括知足鏈接條件的行外,還包括左表的全部行;
    • 右外鏈接(RIGHT OUTER JOIN):結果表中除了包括知足鏈接條件的行外,還包括右表的全部行;
    • 徹底外鏈接(FULL OUTER JOIN):結果表中除了包括知足鏈接條件的行外,還包括兩個表的全部行。 其中的OUTER關鍵字都可省略。

嵌套查詢:

  • 一個SELECT-FROM-WHERE語句稱爲一個查詢塊
  • 嵌套查詢:嵌套兩個以上的查詢塊
SELECT Sname		       /*外層查詢/父查詢*/
    FROM Student
    WHERE Sno INSELECT Sno            /*內層查詢/子查詢*/
             FROM SC
             WHERE Cno= ‘ 2 ’);
複製代碼

帶有比較運算符的查詢:

SELECT Sno,Sname,Sdept
     FROM    Student
     WHERE Sdept   =
                   (SELECT Sdept
                    FROM    Student
                    WHERE Sname= ‘劉晨’)
複製代碼

帶有ANY(SOME)或ALL謂詞的子查詢

在比較運算符中,=ANY等價於IN謂詞,!=ALL等價於NOT IN謂詞

相關子查詢:

[例]找出每一個學生超過他選修課程平均成績的課程號。

SELECT Sno, Cno
    FROM  SC  x
    WHERE Grade >=(SELECT AVG(Grade) 
		                          FROM  SC  y
                                       WHERE y.Sno=x.Sno);
複製代碼

帶有EXISTS謂詞的子查詢

  • EXISTS( … )->true
  • EXISTS( )->False
  • NOT EXISTS( )->true
  • NOT EXISTS( …)->false

[例]查詢全部選修了1號課程的學生姓名。

SELECT Sname
     FROM Student
     WHERE EXISTS
                   (SELECT *
                    FROM SC
                    WHERE Sno=Student.Sno AND Cno= ' 1 ');
複製代碼

數據更新:

插入數據:

語法:

INSERT  
INTO 〈表名〉[〈屬性列1〉[,〈屬性列2〉…)] 
VALUES (<常量1>[,<常量2>]…)
複製代碼

例如:

INSERT  
INTO SC(Sno,Cno)
VALUES (’95020‘,’1‘)
複製代碼

修改數據

語法:

UPDATE <表名>  
SET 〈列名〉=<表達式>[,〈列名〉=<表達式>]… 
[WHERE <條件>]
複製代碼

刪除數據

語法:

DELETE  FROM  <表名>
[WHERE <條件>]
複製代碼
相關文章
相關標籤/搜索