1. 程式人生 > >SQlServer資料庫基礎

SQlServer資料庫基礎

目錄

1.檢查系統中是否存在這個資料庫,存在則刪除

格式:

if exists(select * from sysdatabases where name='資料庫名')

drop database 資料庫名

go

例子:

if exists(select * from sysdatabases where name='musicDB')

drop database musicDB

go

2.建立資料庫

格式:

create database 資料庫名

go

例子:

create database musicDB

go

1. 檢查資料庫中是否存在這個表,存在則刪除

格式:

if exists(select * from sysobjects where name='表名')

drop table 表名

例子:

if exists(select * from sysobjects where name='T_speciality')

drop table T_speciality;

2.建立表

格式:

create table 表名(

列名1 資料型別,

列名2 資料型別

…………

)

go

例子:

create table T_speciality(

specialityid varchar(20) primary key,

specialityname varchar(20)

)

go

格式:

drop database 資料庫名

例子:

drop database mystyle

格式:

drop table 表格名稱

例子:

drop table tbl_Music

格式:

truncate table 表名

例子:

truncate table tbl_Music

格式:

delete from

表名 where 列名='條件'

例子:

delete from tbl_Music where musicName='菊花臺'

注意:當沒有where條件時則會清空整張表的資料

格式:

alter table 表名 drop column 列名

例子:

alter table tbl_Music drop column singer_id

注意:使用該語句則會將該列的所有的資料都刪除,包括列名

1.修改表名

格式:

exec sp_rename '舊錶名', '新表名';

例子:

exec sp_rename 'tbl_Music', 'musics';

注意:更改物件名的任一部分都可能會破壞指令碼和儲存過程。所以不贊成修改表名

2.修改表屬性

增加一列

格式:

alter table 表名

add 列名 字元型別

例子:

alter table tbl_Music

add score varchar(20)

3.修改列名名字

格式:

exec sp_rename '表名.舊列名','新列名','column'

例子

exec sp_rename 'musics.musicid','id','column'

注意:這樣修改同樣會破壞儲存過程,建議先刪除這一列再新增新的列。

4.修改列資料型別

格式:

alter table 表名 alter column 列名 新的資料型別

例子:

alter table musics alter column clicknumber varchar(20)

注意:主鍵不能修改,字元型的不能轉為int型的。

5.修改表格資料

格式:

update  表名 set 列名='修改的值'  

where 條件

例子:

update  musics set clicknumber='200'  

where id=3

注意:主鍵不能修改

資料庫查詢的基本格式為:

select          ----輸出(顯示)你要查詢出來的值

from           -----查詢的依據,資料來源

where         -----篩選條件(對依據(資料庫中存在的表))

group by      -----對篩選後的資料 進行分組

having         ----- 篩選條件(對分組後的結果再次篩選)

order by       -----將結果進行排序

基本語法格式順序不能變,但可以預設

1.查詢全部

格式:

select * from 表名

“*”代表所有列

例子:

select * from musics

2.查詢指定列

格式:

select 列名 as '別名',列名

from 表名

也可以不給列取別名

例子:

select id as '賬號',musicname

from musics

內連線

全連線

左連線

右連線

Inner join

Full Outer join

Left join

Right join

內連線:此語句的結果為同時匹配表a和表b的記錄集。即內連線取的是兩個表的交集。

外連線:(全連線,左右連線)語句的結果為表a與表b的並集,即任意一個表的內容都將被查詢出來,如果另一個表無對應的項,則顯示為null

三種連線只是表格的對應順序不一樣

  1. 內連線

格式:

select *

from 表名1 別名1

inner join 表名2 別名2

on 別名1.主鍵=別名2.外來鍵

例子:

select *

from [dbo].[tbl_Music] t1

inner join [dbo].[tbl_Menu] t2

on t1.musicId=t2.musicId

結果展示:

  1. 外連線

格式:

select *

from 表名1 別名1

[full/left/right]join 表名2 別名2

on 別名1.主鍵=別名2.外來鍵

例子:

select *

from [dbo].[tbl_Music] t1

full join [dbo].[tbl_Menu] t2

on t1.musicId=t2.musicId

結果展示:

格式:

select *

from 表名1 別名1

inner join(

子查詢語句

) 別名2

on 別名1.共同擁有的鍵名=別名2. 共同擁有的鍵名

go

例子:

select t4.userName as '使用者名稱',t4.menuName as'歌單名',t3.musicName as '歌曲名',t3.clickNumber as'點選數量'

from [dbo].[tbl_Music] t3

inner join(

select t1.userId,t1.userName,t2.musicId,t2.menuName

from [dbo].[tbl_User] t1

inner join [dbo].[tbl_Menu] t2

on t1.userId=t2.userId) t4

on t3.musicId=t4.musicId

go

注意:

子查詢語句中不能使用select *,應為使用select * 查詢了所有的內容,就會由兩個相同的列,並且在查詢中必須把與主查詢相同的鍵給查詢出來,否則無法進行連線查詢。

1.聚合函式

聚合函式如下所示:

min  ---最小     max  ---最大

sum  ---和    avg  ---平均

count ---統計(個數)

聚合函式一般和分組group by一起使用

例:select avg(age)from student group by sex

2.聚合查詢

SELECT 所有查詢的內容

FROM

GROUP BY 分組條件

例子:

- • 統計每個客戶經理所經手的質押業務數

SELECT t1.agency_id AS '客戶經理編號',COUNT(*)AS '客戶數量'

FROM

t_agency_info t1

RIGHT JOIN

t_impawn_info t2

ON t1.agency_id=t2.agency_id

GROUP BY t2.agency_id

結果展示:

注意:

一旦使用min ,max ,sum,avg ,count 只能查詢相對應的聚合數,和分組條件,其他的都不能再查詢了。

(5)排序

排序分為降序和升序。

升序:

select *  from emp order by id asc

降序:

select * from emp order by id desc

按多列排序:

select * from emp order by id asc,name asc

限制固定行數顯示:

select top 2 id,name from emp where deptno=2

返回百分之多少行:

select top 20 percent id,name from emp where deptno=2

日期引數及縮寫如下表所示

日期部分

縮寫

year 

yy, yyyy

month

mm, m

day

dd, d

week

wk, ww

weekday

dw

hour

hh

minute

mi, n

second

ss, s

例子:

-- 獲取當前年份

 select datename(yy,GETDATE());

 select datename(yyyy,GETDATE());

 select datename(year,GETDATE());

格式:

alter table 表名

add 列名 資料型別

go

例子:

alter table tbl_Music

add score varchar(20)

go

方法一:安照列名依次給出資料值,不能交換順序,資料型別不能出錯

insert into demo values

 ('zhang',25,1)

('li',28,2)

方法二:安照指定順序給出資料值

insert into demo (nname,age,sex) values ('san',18,0)

方法三:交換順序,數值按照列名給就行

insert into demo (nname,sex,age) values ('san',1,22)

方法四:沒給數值的列顯示null

insert into demo (nname) values ('li')

2.複製表中資料到另一個表中:

insert into demo1(nname,nage,asex) select nname,age,sex from demo

注意事項

1:每次插入一行資料,不可能只插入半行或者幾列資料,因此,插入的資料是否有效將按照整行的完整性的要求來檢驗;

2:每個資料值的資料型別、精度和小數位數必須與相應的列匹配;

3:不能為標識列指定值,因為它的數字是自動增長的;

4:如果在設計表的時候就指定了某列不允許為空,則必須插入資料;

5:插入的資料項,要求符合檢查約束的要求

6:具有預設值的列,可以使用default(預設)關鍵字來代替插入的數值

六、約束

  1. 單一主鍵

格式:

alter table 表名

add constraint 主鍵名 primary key (列名)

go

例子:

alter table t_student

add constraint pk_t_student primary key (stud_id)

go

注意:在建表的時候主鍵不能為空

  1. 複合主鍵

複合主鍵即兩個欄位可以不唯一,但是兩個欄位聯合起來必須是唯一的,例如一些手機,華為p10,魅族Pro10,iphone pro12,只有商標和型號聯合起來才是一個唯一且不重複的值.

格式:

alter table 表名

add primary key(列名1,列名2)

go

例子:

alter table [dbo].[phone]

add primary key(brand,type)

go

注意:

在建表的時候這兩個欄位必須非空,因為主鍵非空且唯一.

  1. 主鍵標識列

標示列為非空自動增長且 不可自行修改的 主關鍵字一般用來在一個表中引用來自於另一個表中的特定記錄 其為非空 唯一的 其可以有一個以上的列合為主鍵 相同點就是都不可為空且都是唯一的 能理解這些就夠用了 給分吧!

格式:

create table 表名(標識列名 int identity(1,1) primary key not null )

其中(1,1)是表示從1開始,每行自增1

例子:

create table phone(id int identity(1,1) primary key not null )

格式:

alter table 表名 add constraint 外來鍵關係名foreign key (外來鍵名) references

主鍵表名 (主鍵)

例子:

alter table t_user add constraint FK_t_user_t_group_id foreign key (groupid) references t_group (id)

格式:

alter table 表名 add constraint 約束關係名unique(列名)

例子:

alter table Users add constraint UQ_Users_Name unique(Name)

  1. 普通檢查約束

格式:

alter table Users add constraint 約束關係名 check(約束條件)

例子:

alter table Users add constraint CK_Users_Age check(Age>0 and Age<100)

例子:

create table Users (

Id int  identity(1,1) primary key ,

Name nvarchar(32) unique,

Phone nvarchar(16) not null,

Email nvarchar(128) default('[email protected]'),

Age  int check(Age>0 and Age<100),

Sex  char(2) check(Sex in('男','女')),

createtime datetime default(getdate())

foreign key(pid)references partment(pid)

)

(6)刪除約束

alter table 表名 drop constraint 約束名

七、檢視

檢視是一張虛擬表,它表示一張表的部分資料或多張表的綜合資料,其結構和資料是建立在對錶的查詢基礎上,檢視中並不存放資料,而是存放在檢視所引用的原始表(基表)中,同一張原始表,根據不同使用者的不同需求,可以建立不同的檢視

檢視的用途:

  篩選表中的行

  防止未經許可的使用者訪問敏感資料

  降低資料庫的複雜程度

  將多個物理資料庫抽象為一個邏輯資料庫

格式:

 create view 檢視名稱

 as

sql語句

例子:

-- 4.5編寫檢視查詢借書人的姓名,手機號碼和地址;

 create view VW_borrow_student

 as

select c.card_name as '姓名',c.mobile as '電話號碼'

from  [dbo].[T_borrow] B

left join [dbo].[T_card] as C

 on b.card_no=c.card_no

 go

格式:

drop view  檢視名

例子:

drop view  VW_borrow_student

檢視是一張虛擬表不適合更新,可以先刪除再修改.我只遇到過這種情況可以更新.

create view  VW_1

as

select * from [dbo].[musics]

where musicName='菊花臺'

update VW_1

set score='100'

where id='3'

select * from VW_1

其中的score被更新至200

格式:

select * from 檢視名

例子:

select * from VW_1

儲存過程(procedure)用來執行管理任務或應用複雜的業務規則,儲存過程可以帶引數,也可以返回結果。

儲存過程可以包含資料操縱語句、變數、邏輯 控制語句等,比如:單個select語句,select語句塊,select語句與邏輯控制塊。

儲存過程優點: 

  執行速度更快

  允許模組化程式設計

  提高系統安全性

  減少網路流通量

  1. 不帶引數的儲存過程

格式:

建立:

create proc 儲存過程名

as

sql語句

查詢:

exec 儲存過程名

例子:

create proc proc_1

as

select * from [dbo].[musics]

exec proc_1

  1. 帶引數的儲存過程

格式:

建立:

create proc 儲存過程名

 @引數名 引數型別

 as

帶有資料的sql語句,其中引數又@引數名代替

go

查詢:

exec 儲存過程名 引數

例子:

-- 4.6 編寫儲存過程,查詢指定圖書名稱的借閱次數。

 create proc book_times

 @num int

 as

 select bookname from [dbo].[T_book] where loan=