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
例子:
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
三種連線只是表格的對應順序不一樣
- 內連線
格式:
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
結果展示:
- 外連線
格式:
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(預設)關鍵字來代替插入的數值
六、約束
- 單一主鍵
格式:
alter table 表名
add constraint 主鍵名 primary key (列名)
go
例子:
alter table t_student
add constraint pk_t_student primary key (stud_id)
go
注意:在建表的時候主鍵不能為空
- 複合主鍵
複合主鍵即兩個欄位可以不唯一,但是兩個欄位聯合起來必須是唯一的,例如一些手機,華為p10,魅族Pro10,iphone pro12,只有商標和型號聯合起來才是一個唯一且不重複的值.
格式:
alter table 表名
add primary key(列名1,列名2)
go
例子:
alter table [dbo].[phone]
add primary key(brand,type)
go
注意:
在建表的時候這兩個欄位必須非空,因為主鍵非空且唯一.
- 主鍵標識列
標示列為非空自動增長且 不可自行修改的 主關鍵字一般用來在一個表中引用來自於另一個表中的特定記錄 其為非空 唯一的 其可以有一個以上的列合為主鍵 相同點就是都不可為空且都是唯一的 能理解這些就夠用了 給分吧!
格式:
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)
- 普通檢查約束
格式:
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語句與邏輯控制塊。
儲存過程優點:
執行速度更快
允許模組化程式設計
提高系統安全性
減少網路流通量
- 不帶引數的儲存過程
格式:
建立:
create proc 儲存過程名
as
sql語句
查詢:
exec 儲存過程名
例子:
create proc proc_1
as
select * from [dbo].[musics]
exec proc_1
- 帶引數的儲存過程
格式:
建立:
create proc 儲存過程名
@引數名 引數型別
as
帶有資料的sql語句,其中引數又@引數名代替
go
查詢:
exec 儲存過程名 引數
例子:
-- 4.6 編寫儲存過程,查詢指定圖書名稱的借閱次數。
create proc book_times
@num int
as
select bookname from [dbo].[T_book] where loan=