SqlServer常用SQL語句

· # 1 SqlServer 數據類型

1.1 image類型

分類 備註 類型 說明
二進制數據類型 存儲非字符和文本的數據 Image 可用來存儲圖像、文件(只要是byte類型就行),等價於varbinary(MAX)
日期和時間 日期和時間在單引號內輸入 DateTime 日期和時間
數字數據 該數據僅包含數字(正數、負數和分數) int、smallint 、float和real 正數、數字(float、real)
貨幣 10進制貨幣值,money、smallmoney,精確到他們所代表的貨幣單位的萬分之一 Money
Bit數據類型 表示是/否的數據 Bit 存儲布爾數據類型

1.2 字符串類型

  1. 帶n和不帶n的區別:

char(2) 表示可以存儲2個字節,如ab、12、裏
不帶n的數據類型,存儲中文等雙字節字符,佔用2個字節,存儲英文,數字等每個字符佔一個字節。

nchar(2)帶n的,無論存儲中文還是英文、數字等,每個字符都是佔用兩個字節。nchar(2)表示可以存儲兩個字符,每個字符佔用2個字節。
不帶n的這些數據類型,長度最常可以設置8000,而帶n的這些數據類型,長度最長可以設置4000

****總結:**中文需要帶n

  1. 帶var和不帶var的區別:
    varchar、nvarchar與 char、nchar
    帶var的表示:可變長度
    不帶var的表示:固定長度
    固定長度: 如char(16) 存儲一個字符也要16個字節,會自動補全
    **可變長度:**會根據實際存儲數據的大小動態重新分配存儲空間,相對來說節省存儲空間。
    //char(16) 中16表示最多16個字節,如果存儲的數據超過了16個字節,那麼無論是固定長度還是可變長度都是會報錯的。
------------------創建數據庫---------------------------
--1、創建數據(沒有設置任何特殊的選項,都是使用默認的)
create database MyDatabaseOne

--2、刪除數據庫
drop database MyDatabaseOne

--3、創建數據庫時設置參數
create database MydatabaseOne
on primary
(
	--配置主數據文件的選項
	name="MydatabaseOne",
	filename="C:\test\MydatabaseOne.mdf",
	size=5MB,
	maxsize=150MB,
	filegrowth=20%
)
log on(
	--配置日誌文件的選項
	name="MydatabaseOne.log",--日誌文件邏輯名稱
	filename="C:\test\MydatabaseOne_log.ldf",--日誌文件的實際保存路徑
	size=5MB,--日誌文件初始化大小
	filegrowth=5mb
)

------------------在數據庫中創建一張表---------------------------
use MydatabaseOne

create table Departments(AutoID int identity(1,1) primary key,DepartmentName nvarchar(64) not null)

drop table Departments

--創建員工表
create table Employees(
       EmpID int identity(1,1) primary key,
       EmpIDCard varchar(32) not null,
       EmpName nvarchar(64) null,
       EmpGender bit not null,
       EmpJoinDate datetime,
       EmpAge int,
       EmpAdderss nvarchar(320),
       EmpPhone varchar(128),
       DeptID int not null,
       EmpEmail varchar(128)
       )


create table TblClass(tClassId int identity(1,1) primary key,tClassName nvarchar(64))

--向自動編號的列插入數據
SET IDENTITY_INSERT TblClass ON
insert into TblClass(tClassId,tClassName) values(500,N'您好') --如果是字符串常量 中文前帶‘N’
SET IDENTITY_INSERT TblClass OFF


--開啓事務
begin tran 

update TblClass set tClassName = N'張裏' where tClassId=500
waitfor delay '0:0:5' --5s
update TblClass set tClassName = N'王金龍' where tClassId=500
commit tran



--打開和關閉查詢結果窗口 :Ctrl+R

--更新語句
-- update 表名 set1 = 新值1,2=新值2 where 條件
--Update語句,如果不加where條件,那麼表示對錶中數據都修改

insert into SysUserInfo(Name,Age) values(N'張三',12) 
select * from  SysUserInfo

Update SysUserInfo set Name = Name+N'[女]',Age=Age-1 where ID=1
--where中可以使用的其他邏輯運算運算符;(||)or、(&&)and,(!)not,<>>=<=<>(或!=)等



--數據刪除 delete
--delete from 表名  where 條件
--delete語句如果不加where條件,表示將表中的數據全部刪除
--自動編號並沒有恢復到默認,仍然繼續編號
--Delete 只是刪除數據,表還存在,和Drop Table(表結構也一併刪除)不同   
delete from  SysUserInfo
--========================
--刪除表中的全部數據
--1、delete from--2、truncate table 表
--如果確實要刪除表中的全部數據,那麼建議使用truncate
--truncate特點:
--(1)truncate語句不能跟where條件(無法根據條件來刪除,只能全部刪除數據)
--2)同時自動編號會恢復到初始值
--3)使用truncate刪除表中的所有數據要比delete效率高的多;
--4)truncate刪除數據,不觸發delete觸發器
truncate table SysUserInfo



--約束 保證數據的完成性
--數據庫約束是爲了保證數據的完整性(正確性)而實現的一套機制
--非空約束
--主鍵約束(PK)primary constraint
--唯一約束(UQ)Unique constraint 唯一,允許爲空,但只能出現一次
--默認約束(DF)default constraint 範圍以及格式限制
--檢查約束(CK)check constraint 範圍以及格式限制
--外鍵約束(FK)foreign key constraint 表關係
--增加外鍵約束是,設置級聯更新,級聯刪除
 --[ON DELETE{NO ACTION|CASCADE |SET NULL| SET DEFAULT}]
 --[ON UPDATE{NO ACTION|CASCADE |SET NULL| SET DEFAULT}]

create table Employees(EmpId int identity(1,1),EmpName varchar(64),EmpGender char(4),EmpAge int, EmpEmail varchar(64),EmpAddress varchar(512))
 
create table Department(DepId int identity(1,1),DepName varchar(64))
 
-------------------------------------------------------------------------------
--通過t-sql語句來創建約束
use MydatabaseOne

Drop table Employees --刪除數據表

delete from  Employees

Select *from Employees

 create table Employees(EmpId int identity(1,1),EmpName varchar(64),EmpGender char(4),EmpAge int, EmpEmail varchar(64),EmpAddress varchar(512))
 
 create table Department(DepId int identity(1,1),DepName varchar(64))
 
 --刪除一列
 alter table Employees  drop column EmpAddress
 
 --手動增加一列(增加EmpAddress nvarchar(1024))
  alter table Employees  add EmpAddress nvarchar(1024)
  
  --手動修改一下EmpEmailde數據類型(Varchar(200))
  alter table Employees  alter column EmpEmail varchar(256)
  
  --爲EmpID 增加一個主鍵約束
  alter table Employees add constraint PK_Employees_EmpID primary key(EmpId)
  
  --非空約束 爲Employees 增加一個非空約束(修改列)
  alter table Employees alter column EmpName varchar(64) not null
  
  --爲EmpName增加一個唯一約束
   alter table Employees add constraint UQ_Employees_EmpName unique(EmpName)
   
   --爲性別增加一個默認約束,默認爲‘男’
   alter table Employees add constraint DF_Employees_EmpGender default('男') for EmpGender
   
   --爲性別增加一個檢查約束,要求性別只能是 男 或者女
   alter table Employees add constraint CK_Employees_EmpGender check(EmpGender='男' or   EmpGender='女')
   
   --爲年齡增減檢查約束
   alter table Employees add constraint CK_Employees_EmpAge check(EmpAge>=0 and EmpAge<=120)
   
   --創建一個部門表 然後爲Employees表增加一個DepId列
   alter table Department  add constraint PK_Department_DepID primary key(DepID)
   
   alter table Employees  add EmpDepId int
   
   --增加外鍵約束
   alter table Employees add constraint FK_Employees_Department foreign key(EmpDepId) references Department(DepId)
   
   --刪除約束
   alter table Employees drop constraint FK_Employees_Department,PK_Department_DepID
   
   -------》》》》》創建表就給表增加約束《《《《《---------
   --先刪除
 drop table Department2
 drop table Employees
    
 create table Employees(
           EmpId int identity(1,1) primary key,
           EmpName varchar(64) not null unique check(len(EmpName)>2),
           EmpGender char(4) default('男'),
           EmpAge int check(EmpAge>0 and EmpAge<120), 
           EmpEmail varchar(64) unique,
           EmpAddress varchar(512) not null,
           EmpDepId int foreign key references Department(DepId) on delete cascade
           )
 


--數據檢索(查詢)
--並不是說select一定需要配合form使用   也可以單獨使用
select 當前系統的時間=GETDATE() 



--top  Distinct
select Distinct *from Employees --Distinct去重

--top 一般配合排序使用
--order by  列名
--按照年齡  降序排序
select *from Employees order by EmpAge desc
--按照年齡升序排序
select *from Employees order by EmpAge asc
select *from Employees order by EmpAge   --默認是升序排序


--查詢最高的前幾名
select top 5 * from Employees order by EmpAge desc

--看前百分之幾的數據 
select top 30 percent * from Employees order by EmpAge desc


--聚合函數

--統計出所有人的年齡總和
select SUM(EmpAge) as 年齡總和 from Employees

--統計當前表種一共有多少條記錄
select COUNT(*) from Employees

--計算平均年齡
select 平均年齡=(select SUM(EmpAge) as 年齡總和 from Employees)* 1.0/(select COUNT(*) from Employees)

select AVG(EmpAge) as 平均年齡 from Employees


--計算年齡最大的
select MAX(EmpAge) from Employees

--計算年齡最小的
select MIN(EmpAge) from Employees
--1、聚合函數不統計空值
--2、如果使用聚合函數的時候沒有手動group by 分組     那麼聚合函數會把整個表中的數據作爲一組來統計


-------帶條件的查詢------
select * from Employees where EmpAge between 20 and 30

select * from Employees where EmpAge in (10,20,30)

--模糊查詢
--通配符:_ 、 %[]^

--姓張,兩個字的
select *from Employees where EmpName like '張_'

--姓張,三個字的
select *from Employees where EmpName like '張__'

-- %  匹配任意多個任意字符
--無論姓名的字數,只是第一個字符是‘張’就查詢出來
select *from Employees where EmpName like '張%'

-- [] 表示篩選,範圍
  select *from Employees where EmpName like '張[a-z]妹'
  select *from Employees where EmpName like '張[a-z0-9]妹'
  select *from Employees where EmpName like '張[^0-9]妹'
  select *from Employees where EmpName not like '張[0-9]妹'
  
  --查詢姓名中帶%號的   需轉義
  select *from Employees where EmpName like '%[%]%'
  
--自定義轉義符  關鍵字:ESCAPE
  select *from Employees where EmpName like '%/]%' ESCAPE '/'
  
  --null值無法使用=<>來進行比較
  --unknown
  --判斷null值必須使用is null 或者is not null
  
  --查詢所有年齡不是null的同學
  select *from Employees where EmpName<>null
  
  
  -----order by進行排序
  --1、降序order by 列名  desc
  --2、升序order by 列名  asc
  --3、order by 語句必須一定要放在整個SQL語句最後
  --4、根據多列進行排序
  --5、可以根據表達式來進行排序
  select *,平均分=(EmpAge+EmpId)*1.0/2 from Employees order by EmpAge desc,EmpId desc,平均分 desc
  --例:先根據英語成績排序、再根據數學成績排序
  
  select *from Employees order by EmpAge desc,EmpId desc

--當使用了分組語句(group by) 或者聚合函數的時候,在select的查詢列表中不能再包含其他的列名,除非該列同時也出現在了group by子句中,或者該列也包含在了某個聚合函數中
  
  --對分組以後的數據進行篩選:使用having
  --having 與where都是對數據進行篩選 where是對分組前的每一行數據進行篩選,而having是對分組後的每一組數據進行篩選
  
  --select 語句的處理順序
  --以下步驟:
  --FROM->ON->JOIN->WHERE->GROUP BY->WITH CUBE或WITH ROLLUP ->HAVING->SELECT->DISTINCT->ORDER BY->TOP
  
  Select  銷售總額=銷售數量 *from baio  order by 銷售數量 desc
  
  select *from biao
  
  --分組查詢
   Select 商品名稱,SUM(銷售數量) as 銷售數量 from 表名 group by 商品名稱   oeder by 銷售數量 desc
   
   select 商品名稱,銷售總價=SUM(銷售數量*銷售價格) from 表名 group by 商品名稱 having SUM(銷售數量*銷售價格)>3000 order by 銷售總價 desc
   
   select 購買人,購買數量 = SUM(銷售數量) fromwhere 商品名稱 = '可口可樂' group by 購買人 order by 購買數量 Desc
   
   
   -----------------類型轉換函數-----------------------------
   select 100.0+CAST('1000' as int)
   slect 100.0+convert(int,'1000')
   
   
   print convert(varchar(256) ,getdate(),109)
   
   ---聯合結果集  union(集合運算符)
   --使用union和union all都能進行聯合,區別在於:使用union聯合會去除重複,重新排列數據,而使用union all 不會去除重複也不會進行重新排列
   select *from1
   union all
      select *from2
   
   
   ------向表中插入多條記錄----------------
   select * into1   from2 --將表2中的數據備份到表11是在 
   
   select top  0 * into1 from2   --只創建表結構   不copy數據
   
   --使用insert intoselect .... from------日期函數
    print getdate()
    
    print sysdatetime()
    --dateadd() 增加時間
    select DATEADD(day,200,getdate())
    
     select DATEADD(month,200,getdate())
     
       select DATEADD(year,200,getdate())
       
       
       --查詢出入職一年(含)以上的員工信息
       select *From 表1 where DATEADD(YEAR,1,JoinDate)<=GETDATE()
       
       --datediff() 計算兩個日期的差
       select DATEDIFF(YEAR ,'1994-11-07',GETDATE())
      print  year(getdate())
         select DATEDIFF(MONTH ,'1994-11-07',GETDATE())
         select DATEDIFF(DAY ,'1994-11-07',GETDATE())
         
         
         
         
         --獲取日期的某部分的值
         print datepart(year,getdate())
  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章