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())
  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章