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
複製代碼
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 是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 平均工資
複製代碼
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圖分爲實體、屬性、關係三個核心部分。
實體是長方形體現,而屬性則是橢圓形,關係爲菱形。
即數據模型中的數據對象,例如人、學生、音樂均可以做爲一個數據對象,用長方體來表示,每一個實體都有本身的實體成員(entity member)或者說實體對象(entity instance),例如學生實體裏包括張3、李四等,實體成員(entity member)/實體實例(entity instance) 不須要出如今ER圖中。
即數據對象所具備的屬性,例如學生具備姓名、學號、年級等屬性,用橢圓形表示,屬性分爲惟一屬性( unique attribute)和非惟一屬性,惟一屬性指的是惟一可用來標識該實體實例或者成員的屬性,用下劃線表示,通常來說實體都至少有一個惟一屬性。
用來表現數據對象與數據對象之間的聯繫,例如學生的實體和成績表的實體之間有必定的聯繫,每一個學生都有本身的成績表,這就是一種關係,關係用菱形來表示。
ER的實體還會細分爲弱實體和複合實體:
一個實體必須依賴於另外一個實體存在,那麼前者是弱實體,後者是強實體,弱實體必須依賴強實體存在,例如上圖的學生實體和成績單實體,成績單依賴於學生實體而存在,所以學生是強實體,而成績單是弱實體。
弱實體和強實體的聯繫必然只有1:N或者1:1,這是因爲弱實體徹底依賴於強實體,強實體不存在,那麼弱實體就不存在,因此弱實體是徹底參與聯繫的,所以弱實體與聯繫之間的聯繫也是用的雙線菱形。
複合實體也稱聯合實體或橋接實體,經常用於實現兩個或多個實體間的M:N聯繫,它由每一個關聯實體的主瑪組成,用長方體內加一個菱形來表示。
下圖就是一個典型的複合實體,用戶和商品兩個實體是M:N的關係,中間又訂單這個實體聯繫,所以訂單這個實體是一個複合實體,同時若是用戶 實體不存在,就沒有訂單實體的存在,所以對於用戶實體來說訂單是弱實體,同理商品實體若是不存在,一樣不存在訂單實體,所以對商品實體而言訂單是弱實體,具體如圖:
ER圖的屬性還細分爲複合屬性、多值屬性和派生屬性、可選屬性,同時還有用來表示聯繫的屬性,稱爲聯繫屬性。
複合屬性是指具備多個屬性的組合,例如名字屬性,它能夠包含姓氏屬性和名字屬性,以下圖:
複合屬性也有惟一屬性,例如學生的所在班級屬性,因爲多個年級都有班級,因此單單班級屬性是不惟一的,可是和年級組成的複合屬性後則能夠匹配成惟一屬性。
一個實體的某個屬性能夠有多個不一樣的取值,例如一本書的分類屬性,這本書有多個分類,例如科學、醫學等,這個分類就是多值屬性, 用雙線橢圓表示。
是非永久性存於數據庫的屬性。派生屬性的值能夠從別的屬性值或其餘數據(如當前日期)派生出來,用虛線橢圓表示,以下圖。
下面的小組人數就是典型的派生屬性,隨着學生實例的參加的興趣小組變化,小組人數屬性也會變化,通常來說派生屬性不存在於數據庫中,而是經過相應的公式進行計算獲得,若是要放到數據庫中,那麼隔一段時間就要進行更新,不然會出現數據錯誤。
並非全部的屬性都必須有值,有些屬性的能夠沒有值,這就是可選屬性,在橢圓的文字後用(O)來表示,以下圖的地址就是一個可選屬性。
聯繫屬於用戶表示多個實體之間聯繫所具備的屬性,通常來說M:N的兩個實體的聯繫具備聯繫屬性,在1:1和1:M的實體聯繫中聯繫屬性並沒必要要。
ER圖中關聯關係有三種:
1對1關係是指對於實體集A與實體集B,A中的每個實體至多與B中一個實體有關係;反之,在實體集B中的每一個實體至多與實體集A中一個實體有關係。
1對多關係是指實體集A與實體集B中至少有N(N>0)個實體有關係;而且實體集B中每個實體至多與實體集A中一個實體有關係。
多對多關係是指實體集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))
複製代碼
鏈接:
###表的定義和刪除:
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>
複製代碼
注意:在刪除列之前必須先刪除基於該列的全部索引和約束
注意:對列定義的修改只適用於修改列的類型和長度,列名不能修改。當表中已有數據時,只能增長列的長度,不能縮短列的長度。
建立索引
CREATE [UNIQUE ] [CLUSTER ] INDEX <索引名>
  ON <表名>  (<列名>[<次序>][,<列名>[<次序>]]...)
複製代碼
刪除索引
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=‘3’ ORDER BY Grade DESC
複製代碼
SELECT *
FROM Student
ORDER BY Sdept, Sage DESC
複製代碼
缺省按升序(ASC)排序,按降序排序,必須指明DESC選項
當排序列含空值時
[例] 查詢學生總人數。
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
複製代碼
SELECT Sname /*外層查詢/父查詢*/
FROM Student
WHERE Sno IN
(SELECT Sno /*內層查詢/子查詢*/
FROM SC
WHERE Cno= ‘ 2 ’);
複製代碼
SELECT Sno,Sname,Sdept
FROM Student
WHERE Sdept =
(SELECT Sdept
FROM Student
WHERE Sname= ‘劉晨’)
複製代碼
[例]找出每一個學生超過他選修課程平均成績的課程號。
SELECT Sno, Cno
FROM SC x
WHERE Grade >=(SELECT AVG(Grade)
FROM SC y
WHERE y.Sno=x.Sno);
複製代碼
[例]查詢全部選修了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 <條件>]
複製代碼