sqlserver 订阅
SQL是英文Structured Query Language的缩写,意思为结构化查询语言。SQL语言的主要功能就是同各种数据库建立联系,进行沟通。按照ANSI(美国国家标准协会)的规定,SQL被作为关系型数据库管理系统的标准语言。SQL Server是由Microsoft开发和推广的关系数据库管理系统(RDBMS)。 展开全文
SQL是英文Structured Query Language的缩写,意思为结构化查询语言。SQL语言的主要功能就是同各种数据库建立联系,进行沟通。按照ANSI(美国国家标准协会)的规定,SQL被作为关系型数据库管理系统的标准语言。SQL Server是由Microsoft开发和推广的关系数据库管理系统(RDBMS)。
信息
功    能
同各种数据库建立联系
外文名
Structured Query Language
释    义
结构化查询语言
中文名
SqlServer
SqlServer基本介绍
SQL Server是由Microsoft开发和推广的关系数据库管理系统(DBMS),它最初是由Microsoft、Sybase和Ashton-Tate三家公司共同开发的,并于1988年推出了第一个OS/2版本。Microsoft SQL Server近年来不断更新版本,1996年,Microsoft 推出了SQL Server 6.5版本;1998年,SQL Server 7.0版本和用户见面;SQL Server 2000是Microsoft公司于2000年推出,目前最新版本是2019年份推出的SQL SERVER 2019。
收起全文
精华内容
下载资源
问答
  • 2020-08-20 10:23:30

    一、SQL Server数据库简介

    SQL Server数据库是Microsoft开发设计的一个关系数据库智能管理系统(RDBMS),现在是全世界主流数据库之一;

    SQL Server数据库具备方便使用、可伸缩性好、相关软件集成程度高等优势,能够从单一的笔记本上运行或以高倍云服务器集群为基础,或在这两者之间任何东西上运行。尽管说成“任何东西”,可是依然要考虑有关的软件和硬件配置;

    SQL Server应用集成化的商务智能(BI)专用工具提供了企业级的数据管理服务。Microsoft SQL Server数据库引擎为关系型数据和结构化数据提供了更可靠安全的存储功能,使用户能够搭建和管理用于业务流程的高可用性和性能卓越的程序。

    SQL Server1.0在1989年公布,迄今SQL Server已变成一个企业级的信息化平台。SQL Server2014包含内嵌的商业智能专用工具,以及一系列的分析和报告工具,能够建立数据库、备份数据、拷贝,为数据安全提供了更强的保障。

    更多 SQL Server 教程请见:树懒学堂_一站式数据知识平台_SQL Server 教程

    二、SQL Server版本分类

    SQL Server有下列三个版本:

    1.商业版

    考虑到保险费用开售,商业版的目地是向规模性大数据中心和数据库管理解决方法。数据管理和商务智能服务平台,提供企业级的高可用性和安全性。数据中心版的全部功能(它是包括在SQL Server的初期版本,但如今已不用)在SQL Server 2014商业版。

    2.标准版

    标准版的目的是为一些规模小的机构或单位的数据库提供数据管理服务和比较有限的商务智能运用。

    3.商务智能版

    主要针对那些需要商务智能和自助服务功能,而不需要完整的在线事务处理(OLTP)性能和可扩展性的企业。

    三、SQL Server的优点和缺点:

    SQL Server 拥有众多优点,用以满足如今的商务环境,并根据不同的需求提供特定的数据库解决方案。它是一种运用普遍的数据库智能管理系统,具备很多明显的优势:

    • 便捷性、合适分布式系统的可伸缩性、用以决策支持的数据服务、与很多别的服务器软件密不可分的集成性、优良的性价比等;
    • 除这点优势外,SQL Server更为用户的数据管理与分析提供了协调能力,容许企业在迅速转变的环境中快速响应,从而提高核心竞争力,获取竞争方面的优势;
    • 从数据管理和分析角度来看,将原始数据转化为商务智能和灵活运用Web产生的机遇十分关键。做为一个完善的数据库和数据统计分析包,SQL Server为快速开发新一代企业级商业应用程序、为公司提高核心竞争力打开了胜利之门;
    • 作为可伸缩性和速度方面测试中的记录保持者,SQLServer是具备完全web支持的数据库系统,提供了了对可拓展编译语言(XML)的核心支持及其在Internet上和服务器防火墙外进行查询的能力。

    SQLServer尽管优势诸多,可是它和别的数据库相比也存在一些不足:

    • 开放性不够好:只有运行在windows平台才能获得最大的性能支撑,可以说是没有丝毫的开放性可言;
    • 此外,SQL Server的并行处理执行和共存模型并不成熟,难以解决日渐增加的用户量和数据信息,伸缩性比较有限,和同类数据库比缺点显著;
    • 最后,因为SQLServer彻底重写了SQL语言的底层编码,经历了长期性的检测,不断延迟,很多功能需要时间来证明,并不十分适配早期的产品,在应用上存在一定风险性。

    原文出自:https://www.shulanxt.com/doc/dbdoc/sqlserver-what

    更多相关内容
  • sql server2012 下载链接

    2017-05-04 16:55:01
    sql server2012下载链接。sql server2012是专业免费的关系数据库管理工具,他为你提供各种数据库并建立联系进行沟通,而且还可以用来执行各种各样的操作。
  • sql server客户端连接工具

    热门讨论 2017-03-27 09:15:24
    挺好用的。简单方便,熟悉的界面,又找到原来在校生的感觉。
  • sqlserver2008完整版安装包

    千次下载 热门讨论 2016-10-10 17:17:38
    sqlserver2008完整版安装包,需要的朋友可以下载使用哦
  • Toad for SQL Server 6.1,最新版绿色单文件(已注册)

    千次下载 热门讨论 2014-03-23 07:23:33
    最近折腾SQL Server的localdb,微软自带的管理工具很庞大,安装复杂。发现Toad的很好用SQL Server数据库管理工具,特意制作成单文件,不用安装,直接管理。已经注册好了,可以直接使用。win7、8(64位)测试可行。 ...
  • sql server odbc驱动

    热门讨论 2015-11-12 01:35:37
    sql server odbc驱动,官网下载(2015-11-12),适用多版本,现在修改为0积分,C语言连接教程见 https://blog.csdn.net/u012469987/article/details/49792005
  • SQLServer中文参考手册.chm

    热门讨论 2016-01-06 00:54:50
    讲述SQLServer从基础到高级应用。(chm无法显示内容时需在属性中“解除锁定”)
  • 用于解决SQLSERVER连接问题驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接问题JAR包。
  • sql server 导入超大SQL脚本文件

    热门讨论 2015-05-24 22:13:04
    sql server 导入超大SQL脚本文件.doc 说明
  • Win10可用的Microsoft SQL Server 2008 Native Client

    千次下载 热门讨论 2016-05-16 14:50:47
    Win10可用的Microsoft SQL Server 2008 Native Client Navicat 操作数据库 会用到
  • sqlserver 2008R2的jdbcjar包

    千次下载 热门讨论 2015-09-29 09:05:35
    sqlserver 2008R2的工具jar包,在学习或者工作中jar包是连接sqlserver 2008R2的纽带,比如JAVA举例,在编码中如果不导入这个jar包,会爆出很多的错误,
  • SQL Server

    千次阅读 2021-09-12 16:07:01
    01数据库的基本概念 数据库(DataBase):按照一定的数据结构来组织,存储和管理数据的仓库,分为关系型数据库和非关系型数据库 数据库管理系统(DataBase Management System DBMS):为管理数据库而设计的一个电脑...

    点击我看文档视频资源

    01数据库的基本概念

            数据库(DataBase):按照一定的数据结构来组织,存储和管理数据的仓库,分为关系型数据库和非关系型数据库         

            数据库管理系统(DataBase Management System DBMS):为管理数据库而设计的一个电脑软件系统

            数据库系统:由数据库和数据库管理系统组成

    02创建数据库

    登录数据库的时候如果数据库在本机上,服务器名称:local | . | 127.0.0.1

            数据库在远程服务器上: ip地址,端口号(如果有的话)

    身份验证:windows身份验证(windows身份拥有最高权限,相当于数据库管理员)

                   SQL Server身份验证(需要账号,密码,需要先以window身份登进去创建用户并赋予角色)

    03数据库的组成

    数据库是以文件的形式存在的,由文件和文件组组成

    数据库文件:

            a.主要数据文件,扩展名.mdf,存放数据和数据库的初始化信息,每个数据库只能有一个主要数据文件

            b.次要数据文件,扩展名.ndf,可以有0个到多个,当数据比较多的话,可以放到次要数据文件中

            c.事务日志文件,扩展名.ldf,存放用于恢复数据库的所有日志信息.每个数据库至少有一个日志文件,可以有多个

    数据库文件组:现在了解为时尚早,之后再说吧

     04数据库常用对象介绍

    表    字段    视图   索引           存储过程   触发器   约束   缺省值

    (不常用的:函数,事务)

    视图:一个或多个表中导出的虚拟表,其数据和数据结构建立在表的查询基础上

    索引:提供一种快速访问数据的方式,检索数据时不是对全表进行扫描,而是通过索引快速定位到要查找的数据

    存储过程:完成某一功能的sql集合,编译后存储到数据库中,以名称进行调用.

    触发器:在数据库中,属于用户自定义的事务命令集合,针对表来说,当对表进行增删改查操作时,命令就会自动触发而去执行

    约束: 对数据表中的列进行的一种限制.可以更好的规范表中的列

    缺省值:可以对表中的列指定一个默认值.

    05数据库的数据类型

    数值型:

            a.整型:bigint  int  smallint  tinyint    8->4->2->1->

            b.浮点型:

                    float  近似数值,存在精度损失,避免使用等号,而是使用><

                    decimal:精确数值,不存在精度的损失   decimal(18,2)

    货币类型:money   smallmoney     8->4

    二进制数据类型:(使用不太多)

            bit     允许0,1或者null

            varbinary(n)    可变长度的二进制数据最多8000字节

            varbinary(max)     可变长度的二进制数据最多2G字节

            image     可变长度的二进制数据最多2G字节

    字符型:

           

    注意:

            a.如果字符只有英文使用character字符串就可以,如果包含英文则使用unicode字符串,避免出现乱码问题.

            b.有var前缀的字符类型是可变字符,比如:

            定义varchar(100)属性的字段能够容纳的字符只有100个,不能超过100,但是如果存储的只有五个,他也不会浪费存储空间,这就是可变;定义char(100)属性的字段也是只能容纳100个字符,但是如果只存储5个,sql server会插入95个空格填满这列,这样就会很浪费空间了,所以一般使用varchar来存储字符串和文本值

            c.我工作中的数据库使用的字符集是cp950(繁体中文),使用这种字符集时character字符一个长度占一个字节,存储一个英文或者数字用一个字节,存储一个中文用两个字节;unicode字符一个长度占两个字节,存储一个英文或数字或中文都是用两个字节.如果一个列的数据类型是char(1),那么该列是不能存储一个汉字的.

            查看数据库使用编码的字符集: select serverProperty('SqlCharSetName')

            在我工作的数据库中有如下情况:

     是不是很奇怪,aaa表中的name列数据类型是nchar(3),为什么"宋宝涛"保存到数据库中还是乱码?

    这是因为在保存至数据库前使用的字符集是cp950(繁体中文),使用该字符集找不到"宝涛"二字符对应的编码,所以就默认保存"?"字符对应的编码. 在查找该数据时使用的字符集是Unicode字符集,巧合的是Unicode字符集和cp950字符集对"?"字符的编码数字值是一样的,所以就查出了"宋??".如果想要避免这种情况,请在插入数据的时候就告诉数据库aaa表中的name列使用的是Unicode字符集,即在前面加上N,如下:

    `        insert into aaa select N'宋宝涛'
     

           
     

            

     

    日期型:

    其他数据类型:

            只需要记住uniqueidentifier 全球唯一标识符,能够保证生成的每一个标识都是全球唯一的(我的天这是真的吗?)

    06创建表及其主外键

    主键:唯一标识一条数据,值不能重复,不能为空.(可以设置联合主键,两个列作为一个主键)

            创建一个主键的同时也默认创建了一个唯一聚集索引.

    标识列:一个列设置成标识列,他就不能再手动插入,每插入一条数据会自动生成,可以设置标识列的数据类型是整型(可以设置标识增量和标识种子)

    外键:一般在两个表之间要建立关联的时候需要创建外键,一个列创建为外键他在另一个表中必须是主键.(如果在外键表插入一个外键不存在的值是插不进去的)

    07数据库约束

    约束定义:规定表中的数据规则.如果违反数据规则就会被阻止.

    约束可以在表创建时或者创建后进行创建.()

    约束分类:

    主键     primary key约束

    外键     foreign key约束

    先建立主表中的主键,然后再定义从表中的外键,只有主表中的主键才能被外表中的外键使用.主表限制了从表的插入和更新操作.当删除主表中的数据应该先删除从表中的相关数据,再删除主表中的数据.

    Unique约束    唯一性约束

    确保表中的一列数据不能有相同的值,再给一个列设置为唯一键时会为该列自动创建一个唯一非聚集索引

    Check约束 

    通过逻辑表达式来判断数据的有效性,用来限制输入一列或者多列值的范围

    Dafault约束   默认值约束

    08数据库脚本

    数据库脚本:创建数据库对象(数据库对象请看上面)的语句集合.包含:存储过程[Procedure],事务[transaction]等,索引[Index],触发器[Trigger],函数[Function]等。

    SQL:

              结构化查询语言(Structured Query Language) 简称SQL,是一种特殊目的的编程语言,用于存取数据以及查询、更新和管理关系数据库系统;同时也是数据库脚本文件的扩展名

    T-SQL:

            T-SQL 即 Transact-SQL,是 SQL 在 Microsoft SQL Server 上的增强版,它是用来让应用程式与数据库沟通的主要语言。T-SQL为SQL的扩展语言,譬如加入了程序语言中的if,while 等语法,同时可以使用函数等数据库对象.

           

    09脚本创建数据库

    创建数据库:

    use master  --选择要使用的数据库
    go
    
    create database TestSongDataBase
    on primary
    (
    	name='TestSongDataBase',   --数据库主要数据文件的逻辑名
    	filename='D:\DataBase\TestSongDataBase.mdf',		--主要数据文件的路径(绝对路径)
    	size=5MB,   --数据库主要文件的初始大小
    	filegrowth=1MB    --文件的增量
    )
    log on  --创建日志文件
    (
    	name='TestSongDataBase_log',   --数据库日志文件的逻辑名
    	filename='D:\DataBase\TestSongDataBase_log.ldf',		--日志文件的路径(绝对路径)
    	size=5MB,   --数据库日志的初始大小
    	filegrowth=10%    --文件的增量
    )
    go
    
    
    

    go --批处理命令

            如果只是执行一条语句,有没有GO都一样如果多条语句之间用GO分隔开就不一样了每个被GO分隔的语句都是一个单独的事务

    为什么创建数据库要使用master? 

            master:系统数据库,它记录了SQL  Server系统的所有系统级信息,还记录了其他数据库的存在,数据库的文件位置,sql server的初始化信息.

    删除数据库:

            drop TestSongDataBase

     10 T-SQL创建表

    产品信息表:

            标识列   int

            编号   varchar(50)

            名称   nvarchar(50)

            产品类型   TypeId int

            价格    decimal(18,2)        

            数量    int

    产品类型表:

            编号   TypeId int

            名称  nvarchar(50)

    tips:

            1.哪个字段被设置成主键,那个字段就会被自动建立唯一聚集索引.

            2.只有数据类型是整形的字段才能够被设置标识符

            3.标识列和编号都可以被设置为主键,如果想要检索速度更快,将标识列设置成主键.因为标识列是整形设置成主键时创建的索引是聚集索引,而编号的数据类型是字符串类型,设置成主键时创建的索引是非聚集索引(检索时聚集索引要比非聚集索引性能更好)

    create table aaasong
    (
        id int  primary key,
        num varchar(250)
    )
    create table aaasong2
    (
        id int  ,
        num varchar(250) primary key
    )  , 这两个表创建的都是聚集索引呀?所以这个观点就是错误的.不管整形还是字符类型的列都可以创建成聚集索引,在插入数据时会根据聚集索引列数据的排序决定其在物理存储位置的顺序

     

            4.价格数据类型可以用decimal,也可以用money(精确到万分位),都是精确值

    创建表:

    use TestSongDataBase
    create table ProductInfos
    (
    	Id int primary key identity(1,1) not null,
    	ProNO varchar(50) not null,
    	ProName nvarchar(50) not null,
    	TypeId int not null,
    	Price decimal(18,2) default(0.00),
    	ProCount int default(0)
    )
    go
    
    
    create table ProductType
    (
    	TypeId int identity(1,1) primary key not null,
    	TypeName nvarchar(50) not null
    )
    go

    删除表:

    drop table ProductInfos --将表结构及其数据全部删除
    go

    truncate table ProductInfos --不删除表结构,只删除里面的数据
    go
     

    11 SQL修改表

    --添加一列
    alter table ProductInfos
    add ProRemark nvarchar(max) null
    
    --刪除一列
    alter table ProductInfos
    drop column ProRemark
    
    --修改一列(注意:修改列名要慎重,因为修改列名可能会破坏脚本和存储过程)
    alter table ProductInfos
    alter column ProNo nvarchar(50) null
    
    --修改列名(需要执行存储过程)
    exec sp_rename 'ProductInfos.ProCount','Count','column'
    

    12  T-SQL创建约束(主键,外键,Unique,Check,Default)


    在创建表的时候创建外键约束

    create table ProductInfos
    (
    	Id int primary key identity(1,1) not null,--主键约束
    	ProNO varchar(50) not null unique,  --unique约束
    	ProName nvarchar(50) not null,
    	TypeId int not null foreign key references ProductType(TypeId),--外键约束
    	Price decimal(18,2) default(0.00) check(price<10000),--default约束和check约束
    	ProCount int default(0) 
    )
    

    在表创建完成后创建约束

    --主键
    alter table ProductInfos
    add constraint PK_ProductInfos primary key(Id)
    
    --外键
    alter table ProductInfos
    add constraint FK_ProductInfos foreign key(TypeId) references ProductType(TypeId)
    
    --Unique
    alter table ProductInfos
    add constraint UQ_ProductInfos_ProNo unique(ProNo)
    
    alter table ProductInfos
    add constraint UQ_ProductInfos_ProNo unique(ProNo,ProName)--联合多个列的唯一约束
    
    
    --Check
    alter table ProductInfos
    add constraint CK_ProductInfos_Price check(price<10000)
    
    --Default
    alter table ProductInfos
    add constraint DF_ProductInfos_ProCount default(0) for ProCount
    

    13. T-SQL插入数据   --insert DML(数据操纵语言)

    --1.单条数据
    insert into ProductType(TypeName)
    values('衣服类')
    
    insert into ProductType(TypeName)
    select '食品类'     --这种插入方式有点新颖
    
    --2.多条数据
    drop table aaa_test
    create table aaa_test
    (
    	c1 int primary key identity(1,1),
    	c2 nvarchar(10) null,
    	c3 nvarchar(10) null
    )
    
    insert into aaa_test(c2,c3)
    values('c21','c31'),('c22','c32')
    
    insert into aaa_test(c2,c3)
    select 'c21','c31' union   
    select 'c21','c31'
    
    --注意:这里只能插入一条数据因为union具有去重的操作,使用union all则可以插入两条重复的数据,所以使用union all的效率更高
    select * from aaa_test
    
    --3.克隆数据--将一个表中的数据复制到另一个表
    --目标表在数据库中已经存在
    insert into aaa_test(c2)
    select TypeName from ProductType
    
    --目标表在数据库中不存在(注意:创建的新表aaa_test2没有目标表所拥有的约束,索引)
    select TypeName into aaa_test2 from ProductType
    

    14. T-SQL更新删除数据

    --更改(注意加where条件,不加where条件会更改整个表)
    update aaa_test set c2='c23' where c1=2
    
    --删除(注意:不加where会删除整个表的数据,同时删除后标识列会按照之前的最大值继续自增)
    delete from  aaa_test where c1=2
    
    --清空整个表的数据,并对表进行初始化(标识列会从初始值自增),表面上和delete from aaa_test
    truncate table aaa_test
    
    --注意:truncate的效率要比delete的高,因为delete每删除一条数据就记录一条日志;truancate 不会记录日志,不会激活触发器.
    --truncate drop 是即时操作,不能rollback;delete insert upate 在事务中可以rollback
    --慎用truncate,使用truncate删除数据一旦删除不能恢复

    T-SQL查询数据之单表查询

    --1.在表的查询中最好只查询需要的列.因为这样既可以节省内存,又可以提高查询的效率
    --2.给列命别名(三种方式)
    select ProNO as '产品编号',ProName '产品名字','产品数量'=ProCount from ProductInfos
    
    --3.排序
    select * from ProductInfos order by ProNO,ProCount   --默认升序排列(先排ProNO,再排ProCount)
    select * from ProductInfos order by ProNO asc,ProCount desc

    16. SQL查询之模糊查询

    通配符描述
    %替代 0 个或多个字符
    _替代一个字符
    [charlist]字符列中的任何单一字符
    [^charlist] 或 [!charlist]不在字符列中的任何单一字符

    17.SQL查询之范围查询

    select top 10 * from ProductInfos
    select top 10 percent * from ProductInfos



    >= 
    <= 

    <>
    in  
    not in
    between  相當於>= and <=(推荐使用between,因为>= and <=会一条一条的进行判断,而between给一个区间效率会高一些.)(这一句说的对吗?我持怀疑态度)

    18. 聚合函数


    select count(1) 伪造列,求一个表的记录数
    count(1) count(*) 一般使用count(1),因为count(1)的效率要比count(*)的效率要高(是吗?)
    2.sum()
    3.max()
    4.min()
    5.avg()
     

    19. 分组查询

    --统计各部门有多少个用户
    select deptId,count(1) from UserInfos--出现在select里面的列必须出现在group by之后,或者包含在聚合函数中
    where age>20
    group by deptId
    having count(1)>5   --分组后的筛选条件.
    order by deptId
    

    20. 连接查询之内连接

    连接查询:根据两个或者多个表之间的关系,从这些表中查询数据
    目的:实现多表查询
    分类:内连接,外连接,交叉连接

    --显式连接
    select userId,userName,age,d.deptId,d.deptName from UserInfos u
    inner join DeptInfos  d on u.deptid=d.deptid --on用于关联条件  u.deptid和d.deptid之间也可以用> < >= <= <>比较运算符,一般不使用
                                                --如果关联条件有多个可以u.deptid=d.deptid and ...
    --隐式连接
    select userId,userName,age,d.deptId,d.deptName from UserInfos u, DeptInfos  d 
    where u.deptid=d.deptid

    --上面这两种写法在效果和效率方面都是一样的.
    --如果用户表某个用户的deptid在部门表里不存在,则是查不出该用户的.

    21.连接查询之外连接

    外连接的分类:左外连接,右外连接,全外连接,简称左链接,右连接,全连接,

    左链接:left (outer) join : 右表的行数和左表相同,如果没有匹配上显示null
    select userId,userName,age,d.deptId,d.deptName from UserInfos u
    left join DeptInfos  d on u.deptid=d.deptid 

    右链接:right (outer) join: 左表的行数和右表相同,如果没有匹配上显示null
    select userId,userName,age,d.deptId,d.deptName from UserInfos u
    right join DeptInfos  d on u.deptid=d.deptid 

    全连接:full (outer) join : 左表和右表中的数据都会显示出来(当左表中存在匹配不到右表中的数据显示null,
    当右表中存在匹配不到左表中的数据显示null)
    select userId,userName,age,d.deptId,d.deptName from UserInfos u
    full join DeptInfos  d on u.deptid=d.deptid 
     

    22.连接查询之交叉连接

    --连接查询之交叉连接  迪卡尔积(用的不多)
    --交叉连接:cross join : 如果不带where条件返回的是两个表行数乘积条数据,带where子句等价于inner join 
    --交叉连接不能使用on筛选条件
    select userId,userName,age,d.deptId,d.deptName from UserInfos u
    cross join DeptInfos  d on u.deptid=d.deptid 
    where u.deptid=d.deptid 
     

    23. 类型转换函数

    --convert(类型(长度),表达式)
    select convert(varchar,2256)
    select convert(varchar(10),getdate(),120)--120日期格式
    --cast(表达式 as 数据类型(长度))    --转换成时间时不能指定时间的格式
    select cast(2 as varchar)  
    

    24. 数据库內置函数操作

            24.1.字符串函数操作

    --在数据库中索引开始的位置是1
    select lower('ABC')--转化成小写
    select upper('abc')--转化成大写
    select ltrim(' ABC')
    select rtrim('abc ')
    select reverse('ABC') --CBA
    
    select left('ABCDEFG',3)  --ABC 返回字符串左边起三个字符
    select right('ABCDEFG',3) --EFG 返回字符串右边起三个字符
    
    select charindex('ab','cabdf') --2 返回字符串中指定的子串出现的开始位置,默认不区分大小写
    select charindex('AB','cabdf'collate latin1_general_cs_as )  --0 大小写敏感  cs代表case sensitive
    select charindex('AB','cabdf'collate latin1_general_cs_as )  --0 大小写不敏感  ci代表case insensitive
    select patindex('%ab%','cabdf')--2 和上面的含义一样,只不过需要在子串前后添加%
    
    select replicate('ABC',3)--ABCABCABC
    
    select substring('ABCDEFG',3,4)--CDEF 从字符串左边起第三个开始,取四个字符
    
    select replace('abcdef' ,'bc', 'gg' ) --aggdef
    select stuff('abcdef',2,3,'tt')        --attef
    
    select LEN('123456')  --6   得到字符串中字符的個數
    select concat('first','last')--将两个字符串拼成一个字符串
    select concat('first','-','-','last')   --结果:first--last
    
    
    

    24.2.日期函数操作

    select GETDATE()
    select DATEADD(DAY,2,'2020-03-24')
    --获取SQL最小日期,在最小日期加上0天,0月,0年效果是一样的
    select DATEADD(DAY,0,0)
    --获取最小日期的前一天,也就是最小日期的上一个月的最后一天
    select DATEADD(DAY,0,-1)
    --计算当前日期加一个月的日期,也就是下个月的今天
    select DATEADD(MONTH,1,GETDATE())
    --计算GETDATE()与最小日期相差了多少月
    select DATEDIFF(MONTH,0,GETDATE())
    --计算当月最后一天的日期
    select EOMONTH(GETDATE())
    
    
    --DATEPART(datepart,date)--datepart:要获取时间的哪一部分;date:完整的时间
    select datepart(YEAR,getdate())  
    select datepart(quarter,getdate())  --获取时间中的季度
    select datepart(MONTH,getdate())   
    select datepart(day,getdate())   
    select datepart(week,getdate())  --一年中的第几周
    select datename(WEEKDAY,getdate())  --今天是星期几
    select datepart(HOUR,getdate())  --时
    select datepart(MINUTE,getdate())  --分
    select datepart(SECOND,getdate())  --秒
    --用不同的格式显示日期
    select CONVERT(varchar(10),GETDATE(),101) --USA  mm/dd/yy  结果:04/19/2021
    select CONVERT(varchar(10),GETDATE(),102) --ANSI  yy.mm.dd  结果:2021.04.19
    select CONVERT(varchar(10),GETDATE(),103) --British/French  dd/mm/yy  结果:19/04/2021
    select CONVERT(varchar(10),GETDATE(),111) --japan  yy/mm/dd  结果:2021/04/19
    select convert(varchar(30),GETDATE(),120) --yyyy-mm-dd hh:mi:ss  結果:2021-04-19 14:38:35
    select convert(varchar(10),GETDATE(),120) --yyyy-mm-dd hh:mi:ss  結果:2021-04-19
    

    24.3.其他函数操作或关键字

    --isnull
    --当@a=''或者'     '或者null的时候都会输出11111111
    declare @a varchar(50)=null
    if ISNULL(@a,'')=''
    print '11111111'
    
    
    --all any some
    --select invoices larger than all invoices of client 3 (发票额度大于client_id=3的客户的所有发票额度的发票都会被筛选出来)
    select * from invoices
    where invoice_total>all
    (
    	select invoice_total
    	from invoices
    	where client_id=3
    )
    --发票额度大于client_id=3的客户的任一发票额度的发票都会被筛选出来
    --any和some作用相同
    select * from invoices
    where invoice_total>any
    (
    	select invoice_total
    	from invoices
    	where client_id=3
    )
    
    
    
    --isnull(expression1,expression2) 
    --如果expression1为null,则取expression2的值,不管expression是否为null
    select isnull(null,null)
    
    
    --coalesce(expression1,expression2,...)
    --从左到右返回第一个不为null的值,expression至少有一个非null,即expression不能全为null
    select coalesce(null,null,null)

    --return的使用:
            --return会无条件的结束查询和程序,return之后语句不会再执行,同时可以向发出呼叫的程序返回一个整数值
    
            --语法:return [integer_expression]--只能是整数值,如果不写默认返回0
    alter proc sp_getUserInfo
    as
    begin
    	begin
    		select top 2 * from aaa_user
    		return 15
    		select top 4 * from aaa_user
    	end
    end
    
    declare @a varchar(20)
    exec @a= aaaa  --获取整数值
    select @a
    
    exec aaaa --也可以不要返回的整数值
    


     

    --case
    --语法:
    
    --Simple CASE expression:   
    CASE input_expression   
         WHEN when_expression THEN result_expression [ ...n ]   
         [ ELSE else_result_expression ]   
    END   
    
    --Searched CASE expression:  
    CASE  
         WHEN Boolean_expression THEN result_expression [ ...n ]   
         [ ELSE else_result_expression ]   
    END
    
    
    --实例:
    select userNo,userName,
    case siteCode
    	when 'LF' then '廊坊'
    	when 'LH' then '龍華'
    	else '其他'
    end SiteName
    from aaa_user
    
    select userNo,userName,
    case 
    	when GradeLevel<30 then '高級領導'
    	when GradeLevel>100 then '低層領導'
    	else '中層領導'
    end GradeLevel
    from aaa_user
    

    --goto语句的使用:(不建议使用,因为会增加代码的阅读难度)
    --语法:
    
    lable:
    Goto lable
    
    declare @level int
    select @level=GradeLevel from aaa_user where UserNO='P1187656'
    if @level<20
    	goto print1
    else
    	goto print2
    print1:
    	print 'big boss'
    	goto theEnd
    print '1111'
    print2:
    	print 'lower boss'
    	goto theEnd
    theEnd:
    

    25. 索引介绍

    索引的作用:提高查询速度

    索引是什么?索引类似于查询字典时的拼音和偏旁部首,通过拼音和偏旁部首能够快速的定位到想要查找的字。这样就不用进行全书查找了(全表扫描)

    索引会占用存储空间,设置索引时并不是越多越好,索引并不是总能提高系统性能

    给一个表的列设为主键时该列会自动被创建为唯一聚集索引

    索引分为:聚集索引和非聚集索引

    聚集索引:clustered  逻辑顺序和物理顺序是一致的

    非聚集索引:nonClustered  逻辑顺序和物理顺序并不一致

    聚集索引的查询效率高于非聚集索引

    一个表中最多只能有一个聚集索引,可以有0个以上非聚集索引

    如果需要在多个列上创建索引,这些列可以创建组合索引

    在小数据类型的列上创建的索引访问速度会比较快

    索引是看不见的,但是当你查询大数据的时候,他的优势是显而易见的

    26. 创建索引

    索引分类:聚集索引,非聚集索引,主鍵索引,唯一索引
    如果不指定索引的类型,一般创建的都是非聚集索引

    --创建聚集索引
    create clustered index PK_UserInfos
    on UserInfos(UserId)
    with
    (
        drop_existing=on --on:当存在PK_UserInfos索引的时候会先删除,然后再重新创建
    )                                    --off:当存在PK_UserInfos索引的时候会报错
    
    --创建唯一非聚集索引
    create unique nonclustered index uq_UserInfos
    on UserInfos(userId)
    with
    (
        pad_index=on, --索引页预留空间
        fillfactor=70,   --数据占整个页存储空间的百分比
        ignore_dup_key=on    --on:insert操作时,userId包含有重复值的数据会被拒绝,非重复的正常插入
                            --off:insert操作时,只要userId有重复值所有的数据都会被拒绝
    )
    
    --创建复合索引
    create unique nonclustered index uq_UserInfos2
    on UserInfos(userId,deptID)
    with
    (
        pad_index=on, --索引页预留空间
        fillfactor=70,
        ignore_dup_key=on    --on:insert操作时,userId包含有重复值的数据会被拒绝,非重复的正常插入
                            --off:insert操作时,只要userId有重复值所有的数据都会被拒绝
    )
    

    注意:a.一般我们不会这样创建索引,在我们创建主键和唯一键的时候就自动创建了索引,所以大多数情况下我们不需要创建索引

    b.一个表中已经存在了主键(即存在了唯一聚集索引),就不能再创建聚集索引,一个表中只能有一个聚集索引

    c.删除索引:     drop index index_name on table_name

    27.视图介绍

    视图:虚拟表,不包含数据

    与表的区别:表存储的是数据,视图存储的是查询语句(索引视图除外)

    作用:可以简化我们的查询,增加数据的保密性和安全性(视图只能查询所以安全性有保证)。

    缺点:增加了维护成本,并没有提高查询效率。

    分类:

            标准视图(经常使用),

            索引视图:被具体化的视图;可以创建索引来显著提高查询性能,聚集了很多行的查询,不太适合经常更新基本数据集

            分区视图:一台或者多台服务器间水平连接一组成员表的分区数据,使数据看起来就像来自一个表

    注意:

            我们不仅可以在select中使用视图,我们也可以在insert/delete/update中使用视图,但是要局限于特定情况:
            视图中没有distinct关键字/group by或者having子句/任何聚合函数/union运算符. 此时这个视图已经upate和delete条件了,当视图中有基础表中所有不为空的列才满足insert条件

            但是出于安全考虑我们可能没有某张表的直接权限,只能通过视图修改数据(增删改查),前提是:视图是可更新视图.

    28.脚本创建视图

    a.创建标椎视图:

    create view vUserInfos
    as
    select u.*,d.deptName from UserInfos u
    left join dept d on u.deptID=d.deptID
     

    b.创建索引视图:

    create view vUserInfos_index with schemabinding
    as
    select u.userId,u.userName,u.deptID,u.age  from dbo.UserInfos u
    go

    create unique clustered index uq_vUserInfos_index--给视图创建唯一聚集索引
    on vUserInfos_index(userId)
    go
     

    注意:1.with schemabinding后需要在关联的表名前添加架构(如:dbo等),同时不能使用select  *,需要把所需要的列给一一列举出来,

            2.视图的sql语句有外连接(左外连接,右外连接,全外连接),该视图是不能创建索引的

            3.数据是实际存在的删除视图里面的数据,基础表里面的数据也会被删除(慎用

    (如果基础表有两个及以上,就算视图创建了索引也是删除不了数据的)

    创建分区视图:

    create view vTest
    as
    select * from Test1
    union all
    select * from Test2
     

    29.存储过程介绍

    存储过程:一种为了完成特定功能的一个或一组sql语句的集合。经编译后存储在服务器端的数据库中,可以利用存储过程加速sql语句的执行。

    分类:

            系统存储过程:存在master数据库中,其他数据库中是可以直接调用的,就不需要在前面加上数据库名。创建新的数据库时这些存储过程在新的数据库中自动创建

            自定义存储过程:用户自己创建,可以传入参数,也可以有返回值,表示存储过程是否执行成功。

    30.脚本创建存储过程

    create proc sp_proc1
    @p1 int,
    @p2 varchar(20)
    as
    begin
        declare @sql varchar(2000)
        select * from userInfos
    end

    31.触发器的介绍

    触发器:一种特殊类型的存储过程。

    触发器的调用:通过事件触发,自动调用执行。

    对表进行插入,更新,删除操作时,如果定义了相应的触发器,系统会自动执行。

    分类:DDL(数据定义语言)触发器:create  alter  drop                      不常用

            DML(数据操纵语言)触发器:insert delete update         

    DML触发器分两种:after触发器:insert delete update :操作之后触发

                                    instead of触发器:insert delete update :不执行定义的操作,而执行相应的触发器

    32.触发器涉及的两个表:inserted       deleted    

    inserted   deleted : 插入表  删除表

    两个表都是逻辑表,也是虚表,系统在内存中创建的,不会存储到数据库中。只读的,读取但不能修改数据。结构与操作表的结构相同。触发器执行过程中存在并且可以访问,工作完成之后这两张表会自动删除。

            对表的操作:                                inserted                                deleted

            insert                                      存放插入的数据                             无                     

            delete                                              无                                  存放删除的数据                

            update                                    存放更新后的数据                  存放更新前的数据

    inserted:存放插入或者更新后的数据

    deleted:存放删除或者更新前的数据

    触发器在执行过程中这2个表都是可以访问的,提交之前是不是可以撤销呢--事务的回滚?

    答:可以,触发器是一种特殊的事务,可以设置一些数据校验,如果不满足让其回滚。

    33.after触发器之insert  delete update

    after insert:

    create trigger trigger_UserInfos_insert
    on UserInfos 
    for insert  --for insert 也可以写成 after insert
    as    --触发器不能用begin  end
        declare @userId varchar(20)
        declare @userName varchar(20)
        select @userId=userId,@userName=userName  from inserted--inserted表是只读的
        print @userId+'--'+@userName+'--'+'数据插入成功!'
    go

    after update:

    create trigger trigger_UserInfos_update
    on UserInfos
    for update
    as
    	declare @userId_before varchar(20)
    	declare @userName_before varchar(20)
    	declare @userId_after varchar(20)
    	declare @userName_after varchar(20)
    	select @userId_before=userid,@userName_before=userName from deleted
    	select @userId_after=userid,@userName_after=userName from inserted
    	print '修改前:'+@userId_before+@userName_before
    	print '修改后:'+@userId_after+@userName_after
    go
    

       after delete:                                         

    alter trigger trigger_UserInfos_delete
    on UserInfos
    for delete
    as
    	if(OBJECT_ID('UserInfosBackup','u') is  null)--判断表UserInfosBackup是否存在
    	begin
    		print 'null'
    		select * into UserInfosBackup from deleted
    	end
    	else
    	begin
    		print 'not null'
    		insert into UserInfosBackup select * from deleted
    	end
    	declare @userId varchar(20)
    	declare @userName varchar(20)
    	print '备份成功'
    go
    
    

    34.instead of 触发器之insert  delete update

            instead of触发器和after触发器差不多,只不过after触发器是在执行了定义的操作(insert delete update)后要执行的操作,instead of触发器是执行的定义的操作由触发器里面的操作代替。

    instead of  insert:

    create trigger trigger_UserInfos_insteadOfInsert
    on UserInfos
    instead of insert
    as
    	declare @age  int
    	declare @userName varchar(20)
    	select @age=age,@userName=userName from inserted
    	print '插入操作已被取代'
    
    

    。。。。。。

    36.游标介绍及分类

    游标是什么:对数据查询结果集的一种访问机制,用户对结果集进行逐条访问。

    游标访问对象:结果集

    游标的作用:定位到结果集的某一行,对当前数据进行读取

    数据的结果集是放在TempDB里,相当于内存中,所以游标适用于数据量比较小的情况下使用。

    游标的分类:静态,动态,只进,键集驱动游标

    静态:对数据库如何操作结果集都不会变,支持滚动,

    动态:与静态相对,结果集获取所有的改变,对数据库的操作都可以通过游标可见。api函数或t-sql where current of子句通过游标进行更新。游标外部所做的更新直到提交时才可见。前后滚动。

    只进:不支持滚动,从头读到尾,结果集获取所有的改变,对数据库所做的更改是可见的(仅限于提取前

    游标的声明周期:声明游标->打开游标->读取数据->关闭游标->释放游标

    37.创建只进游标

    --1.声明游标  只进游标是不允许向前翻动的
    declare user_cursor cursor local--local创建局部游标,global创建全局游标
    for
    select userId,userName,age from [dbo].[user] where age>14
    --2.打开游标
    open user_cursor
    --3.取值
    declare @userid uniqueidentifier,@userName nvarchar(10),@age int
    --提取数据:   next向下,prior向上,first第一个数据,last最后一个数据, 
    --absolute n 绝对位置第n个,relative n 相对位置第n个(相对位置正值向前,负值向后)
    fetch next from user_cursor  into @userId,@userName,@age
    
    while @@FETCH_STATUS=0  --判断值是否提取成功
    begin
    	print cast(@userId as varchar(100))+','+@userName+','+cast(@age as varchar)
    	fetch next from user_cursor  into @userId,@userName,@age
    end
    --关闭游标
    close user_cursor
    --释放游标
    deallocate user_cursor
    

    38.创建静态游标

    --1.声明游标  static标识该游标是静态游标
    declare user_cursor_static cursor static local--local创建局部游标,global创建全局游标
    for
    select userId,userName,age from [dbo].[user] where age>14
    --2.打开游标
    open user_cursor_static
    --3.取值
    declare @userid uniqueidentifier,@userName nvarchar(10),@age int
    --提取数据:   next向下,prior向上,first第一个数据,last最后一个数据, 
    --absolute n 绝对位置第n个,relative n 相对位置第n个(相对位置正值向前,负值向后)
    fetch next from user_cursor_static  into @userId,@userName,@age
    
    while @@FETCH_STATUS=0  --判断值是否提取成功
    begin	
    	update [dbo].[user] set age=19 where userid='32BECDFF-9886-4ED9-ACF2-AAEA5799B18E'
    
    	print cast(@userId as varchar(100))+','+@userName+','+cast(@age as varchar)
    	fetch next from user_cursor_static  into @userId,@userName,@age
    end
    --关闭游标
    close user_cursor_static
    --释放游标
    deallocate user_cursor_static
    

    39.创建动态游标

    --1.声明游标  dynamic标识该游标是动态游标
    declare user_cursor_dynamic cursor dynamic local--local创建局部游标,global创建全局游标
    for
    select userId,userName,age from [dbo].[user] where age>14
    --2.打开游标
    open user_cursor_dynamic
    --3.取值
    declare @userid uniqueidentifier,@userName nvarchar(10),@age int
    --提取数据:   next向下,prior向上,first第一个数据,last最后一个数据, 
    --absolute n 绝对位置第n个,relative n 相对位置第n个(相对位置正值向前,负值向后)
    fetch next from user_cursor_dynamic  into @userId,@userName,@age
    
    while @@FETCH_STATUS=0  --判断值是否提取成功
    begin	
    	update [dbo].[user] set age=33 where current of user_cursor_dynamic--更改当前动态游标所在位置的数据
    
    	print cast(@userId as varchar(100))+','+@userName+','+cast(@age as varchar)
    	fetch next from user_cursor_dynamic  into @userId,@userName,@age
    end
    --关闭游标
    close user_cursor_dynamic
    --释放游标
    deallocate user_cursor_dynamic

    40.自定义函数之标量函数

    自定义函数:根据自己的需要,自己定义函数

    自定义函数分类:标量函数,多语句表值函数,内嵌表值函数

    标量函数:对单一值的操作,返回单一值     begin end

    内嵌表值函数:相当于参数化的视图,返回一个表,没有begin end

    多语句表值函数:返回的也是一个表,只不过多语句表值函数可以多次查询,筛选和合并,弥补了内嵌表值函数的不足  begin end

    创建标量函数:

    alter function GetAge(@userid uniqueidentifier='2F7A94F2-A41B-40B5-8CEC-0C7B3793443C')
    returns int
    with encryption --此处可写可不写,如果指定encryption,则函数被加密
    as  --此处可写可不写
    begin
    	declare @age int
    	select @age=age from [user] where userid=@userid--加上[]标识user不是关键字或者预留字
    	return @age
    end
    
    select dbo.GetAge('2F7A94F2-A41B-40B5-8CEC-0C7B3793443C')
    --可以使用默认值进行调用函数,如上面的@userid uniqueidentifier='2F7A94F2-A41B-40B5-8CEC-0C7B3793443C'和下面的dbo.GetAge(default),如果上面的@userid没有指定默认值,下面的dbo.GetAge(default)会返回null
    select dbo.GetAge(default)
    
    
    
    

    注意调用标量函数的时候需要带上架构(比如:dbo.),而内嵌表值函数和多语句表值函数则不需要。

    创建内嵌表值函数:

    alter function GetUserInfo(@userid uniqueidentifier='2F7A94F2-A41B-40B5-8CEC-0C7B3793443C')
    returns table
    as
    return select * from [user] where userid=@userid
    go
    --调用函数
    select * from GetUserInfo('2F7A94F2-A41B-40B5-8CEC-0C7B3793443C')
    
    select * from GetUserInfo(default)
    

    注意:1.内嵌表值函数里面是没有begin end的

               2.内嵌表值函数的return后面有且仅有一句T-SQL语句

    创建多语句表值函数:

    create function GetUserInfo(@deptid uniqueidentifier)
    returns @userInfos table (userName nvarchar(10),deptId uniqueidentifier,createDate datetime,age int)
    with encryption --此处可写可不写,如果指定encryption,则函数被加密
    as  --此处可写可不写
    begin
    	insert into @userInfos select userName,deptID,createDate,age from [user] where deptID=@deptid
    	--这里可以写多条插入语句
    	return  --后面什么也不跟
    end
    
    --调用
    select * from GetUserInfo('921EC616-FFD4-4AFB-83CD-702751D1189B')
    
    

    函数总结:

             a.函数一般做查询使用

             b.如果使用内嵌表值函数就能实现的就不要使用多语句表值函数,因为多语句表值函数效率会低一些。

            c.函数不能够修改基表中的数据,也就是不能使用insert,update,delete语句,但是多语句表值函数可以更改@userInfos表里的值,最终呈现用户所想要的数据,而行内表值函数不能完成这样的操作

    42.事务的介绍

    什么是事务:一系列T-SQL语句构成的逻辑工作单元。

    事务应用:应用于多表操作。

            当事务执行过程中出现异常,系统死机或者断电,数据并没有保存到数据库。使用事务最终的结果要么是所有的操作都成功执行要么是所有的操作都不执行,提高了数据的安全性。

    事务的特性:四个特性 (CAID)

    原子性(atomicity)。一个事务是一个不可分割的工作单位,事务中包括的操作要么都做,要么都不做。

    一致性(consistency)。事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。

    隔离性(isolation)。一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。

    持久性(durability)。持续性也称永久性(permanence),指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。

    事务分类:显式事务,隐式事务

    事务执行的大概流程:

    begin try
    begin tran  --开启显式事务
    	--T-SQL操作(增删改)
    commit tran --提交事务
    end try
    begin catch
    rollback tran --回滚事务
    end catch
    
    
    
    
    set implicit_transactions on  --开启隐式事务
    --T-SQL操作
    commit tran
    rollback tran 
    set implicit_transactions off  --关闭隐式事务
    

    事务一般放在存储过程中。

    显示事务和隐式事务的区别:

    显式事务隐式事务
    开启事务执行命令begin tran开启先执行set implicit_transactions on语句,之后再执行sql命令时系统会自动为我们创建事务
    关闭事务执行命令commit tran或者rollback tran后关闭事务执行命令commit tran或者rollback tran后会关闭当前的事务,之后在执行sql命令系统又会帮我们创建一个新的事务.当我们执行命令set implicit_transactions on后,我们再执行sql命令时系统就不会为我们自动创建事务了

    总结:隐式事务和显式事务的不同之处在于隐式事务会为我们自动创建新事务,而显式事务需要我们begin tran 显式声明.

    ---------------------------------------------------华丽的分割线------------------------------------------------------------

    如果你已经将上面的全部掌握,那么就可以开始进行下面知识的学习了!

    SQL Server拓展知识及进阶

    1.将一个表的结构复制到另一个新表中

    select * into newSysUser from sysUser where 1=2
    --where 1=2:不复制原表中的数据,只赋值结构

    --原表中的约束条件(主键,外键,唯一,check,default)及其索引是没有复制到新表newSysUser 中

    2.给列名别名的三种方式

    select userno c1,UserNO as c2, c3=UserNO from aaa_user
     

    3.exists 和 in 的使用

    实例:

    select * from aaa_user u 
    where exists(select DeptCode from aaa_dept d where d.DeptCode=u.DeptCode)
    
    select * from aaa_user u 
    where u.DeptCode in(select DeptCode from aaa_dept d)
    
    --这两个sql语句的执行结果是相同的,执行计划中的实际执行方式也是相同的
    

    上面两个语句的执行计划:

    其中hash match(right semi join)的使用可以高效的解决exists 和 in的子查询.

    hash match(right semi join)的具体关联过程不知道博友是否知道,希望能有博友在评论区解释一下,小弟不胜感激!

    4.数据库表格标椎化设计


           在设计数据库表格之前我们要确保我们的设计是最优的,不存在冗余或者重复的数据,因为重复的数据增加了数据库的大小,而且会使插入,更新和删除操作复杂化. 比如:一个人的名字在许多不同的地方重复出现,然后此人决定改名,我们需要更新几个地方,否则数据会不一致,这就是标椎化意义的所在.  
           标椎化是审查我们的设计,确保它们遵循一些防止数据重复的预定义规则的过程. 基本上有七条规则,被称为七范式,对于几乎99%的应用场景我们只需要遵循前三条就可以了  

    第一范式:第一范式要求一行中的每个单元格都应该有单一值,且不能出现重复列. 比如courses表中的tag列就不满足第一范式,因为一个课程的标签可能会有多个,同时也不能建立tag1,tag2,tag3等多个标签列,这样会出现重复列
    解决方法:为标签单独建立一个tags表与courses表形成多对多的关系,然而在关系型数据库中并没有多对多的关系,只有一对一,一对多的关系,所以为了实现courses和tags两表的多对多关系我们引入一个新的表(course_tags)被称之为链接表.有了链接表之后我们的设计就满足了第一范式,courses表中没有tag1,tag2,tag3等重复的列,然后在一列中也没有多个值,更改标签名字的时候只需要更改tags表中的一条记录就可以了
    相反,之前的设计中,coures表中的每个标签会重复出现好多次,如果更改标签时就要更改多条记录

    第二范式:第二范式要求每张表都应该有一个单一目的,换句话说,它只能代表一种且仅一种实体类型,那个表中的每一列都应该是描述这个实体.(第二范式满足的前提是第一范式满足)
    根据第二范式如果一个表中有一列不是描述该表所代表的实体,就应该拿掉它并单独放入一张表中
    比如现在course表里有course_id,title,price,instructor列,那么这个course表就不满足第二范式,因为这里的讲师列不属于这张表,如果同一个讲师教多门课,他的名字就会在这张表中重复出现,所以我们必须在好多个地方进行更改

    第三范式:第三范式表示表中的列不应派生自其它的列(第三范式实现的前提是第二范式必须已经实现)
    比如:invoices中有invoice_total,payment_total,balance,如果我们用发票总计(invoice_total)-付款总计(payment_total)=结余(balance),比如:100-20=80 , 当我们改变payment_total为40而忘记了更新结余,我们的数据就不一致了
    比如:students表中有first_name,last_name,full_name, 那么full_name(first_name+last_name)就不满足第三范式,应该把他取消掉. 所以第三范式和其他范式一样减少重复,并提高数据的完整性

    作者建议:不要刻意记忆这些范式,并刻意关注表的设计不满足哪一个范式,只需要专注于消除冗余就可以了,不需要对每张表每个列逐个应用标准化规则,所以当你看到重复值,且这些值不是像1.2.3这样的外键时,这就意味着你的设计没有标准化, 至于它违背了第几范式并不重要,还是想想如何消除重复数据

    5.系统对象(列,约束,索引,表,视图,触发器,存储过程,函数,事务)

            5.1系统内置全局变量

             @@error:返回执行最后一个T-SQL语句的错误号(没有错误返回0)

             @@rowcount:返回被最后一个T-SQL语句影响的行数(没有影响返回0)

             @@identity:返回最后插入的标识列的值(在一个连接中一直没有插入返回null)

             上面的全局变量的作用域都是在一个连接中

      

            5.2系统内置存储过程

             sp_helptext

    exec sp_helptext viewName  --查看创建视图的sql
    exec sp_helptext procName  --查看创建存储过程的sql

            sp_executesql

            实例1:

    DECLARE @UserNoVariable NVARCHAR(500)    
    DECLARE @SQLString NVARCHAR(500) 
    DECLARE @ParmDefinition NVARCHAR(500)  
      
    /* Build the SQL string one time.*/  
    SET @SQLString =  N'SELECT * FROM usyUser WHERE UserNO=@UserNo';  
    SET @ParmDefinition = N'@UserNo NVARCHAR(250)';  
    /* Execute the string with the first parameter value. */  
    SET @UserNoVariable = 'F2847958';  
    EXECUTE sp_executesql @SQLString, @ParmDefinition,  
                          @UserNo = @UserNoVariable;  
    /* Execute the same string with the second parameter value. */  
    SET @UserNoVariable = 'X2000274';  
    EXECUTE sp_executesql @SQLString, @ParmDefinition,  @UserNo = @UserNoVariable;
    

            实例2:

    DECLARE @UserNoVariable VARCHAR(30)    
    DECLARE @SQLString NVARCHAR(500)  
    DECLARE @ParmDefinition NVARCHAR(500) 
    DECLARE @userNameVariable VARCHAR(30)  
     
    SET @SQLString =  N'SELECT @userName=userName FROM usyUser WHERE UserNO=@UserNo'  
    SET @ParmDefinition = N'@UserNo NVARCHAR(250),@userName NVARCHAR(250) OUTPUT'  
    SET @UserNoVariable = 'F2847958'
    
    EXECUTE sp_executesql @SQLString, @ParmDefinition, @UserNo=@UserNoVariable , @userName=@userNameVariable OUTPUT;  
    SELECT @userNameVariable
    

            

            5.3系统表

            select * from sysobjects


            5.4 系统内置函数

             CHECKSUM : 可以用于比较两条记录是否一致,如下,选出A表在B表中不存在的数据    

    select * from A
    WHERE checksum(*) not in (select checksum(*) from B)
    

             PIVOT

    DECLARE @SQLString NVARCHAR(500);  
    DECLARE @ParaDefinition NVARCHAR(500);  
    DECLARE @Variable NVARCHAR(20);  
    
    SET @SQLString = 'SELECT  * FROM usyUser WHERE UserNO=@UserNo'
    SET @ParaDefinition = '@UserNo NVARCHAR(20)'
    SET @Variable='F2847958'
    
    EXEC SP_EXECUTESQL @SQLString,@ParaDefinition,@UserNo=@Variable
    
    DECLARE @SQLString NVARCHAR(500);  
    DECLARE @ParaDefinition NVARCHAR(500);  
    DECLARE @Variable NVARCHAR(20);  
    DECLARE @UserName NVARCHAR(20);
    
    SET @SQLString = 'SELECT  @UserNameOut=UserName FROM usyUser WHERE UserNO=@UserNo';
    SET @ParaDefinition = '@UserNo NVARCHAR(20),@UserNameOut NVARCHAR(20) OUTPUT';
    SET @Variable='F2847958';
    
    EXEC SP_EXECUTESQL @SQLString,@ParaDefinition,@UserNo=@Variable,@UserNameOut=@UserName OUTPUT;
    PRINT @UserName
    

    5.运算符

    rollup 运算符
    with rollup只能应用于聚合函数的列(因为非聚合函数的列加起来没意义),可以对整个聚合函数列求和,并且其运算符要位于group by子句之后,
    select salesPersonId,sum(salesVolume) as totalSales from employeePerformanceTable
    where salesPersonId>20210101
    group by salesPersonId   with rollup
    having sum(salesVolume)>1000

    6.查询优化

    30种sql语句优化

    推荐阅读:

    索引统计信息
    索引统计信息 | Microsoft Docs

    查询优化建议
    查询优化建议 | Microsoft Docs

    用于对运行慢的查询进行分析的清单
    用于对运行慢的查询进行分析的清单 | Microsoft Docs

    逻辑运算符和物理运算符引用
    逻辑运算符和物理运算符引用 | Microsoft Docs

    认识优化查询中的Merge Join、Nested Loops和Hash Match
     

    如何在 SQL Server 的存储过程和函数里进行错误处理(try catch)

    -等学完这个sql后再看

    sqlserver中sql执行顺序

    我们在开发过程,或多或少都会遇到锁表情况,特别是数据量大的时候..碰到经理客户都在催的时候,我们就需要尽快找到锁表并且解锁。  

    方法/步骤 1 ---查看锁表  select request_session_id spid,OBJECT_NAME(resource_associated_entity_id) tableName from sys.dm_tran_locks where resource_type='OBJECT'  

    ---spid 锁表进程   ---tableName 被锁表名  

    ---解锁语句   declare @spid int   Set @spid = 136   --锁表进程   declare @sql varchar(1000)set   @sql='kill '+cast(@spid as varchar)exec(@sql)

    展开全文
  • sqlserver自动生成sql语句工具sqlserver转oracle
  • 打开Visual Studio Installer,取消勾选SQL Server Express 2016 LocalDB、SQL ADAL运行时、SQL Server Data Tools、SQL Server ODBC Driver、SQL Server 命令行实用工具、SQL Server 支持的数据源、SQL Server 的 ...
    1. 在服务中停止所有SQL Server相关服务。
    2. 打开Visual Studio Installer,取消勾选SQL Server Express 2016 LocalDB、SQL ADAL运行时、SQL Server Data Tools、SQL Server ODBC Driver、SQL Server 命令行实用工具、SQL Server 支持的数据源、SQL Server 的 CLR 数据类型等,当然包括其连带的一大堆组件包括使用C++的桌面开发、C++核心桌面功能、体系结构和分析工具、Windows Communication Foundation、通用Windows平台开发、.NET桌面开发、通用Windows平台工具、.NET桌面开发工具,然后安装(卸载)。
    3. 打开控制面板中的卸载程序,将Microsoft SQL Server 2012 Native Client、Microsoft SQL Server 2008 Setup Support Files及其安装程序、主程序、LocalDB、Microsoft SQL Server Compact 3.5 SP2及其x64版本、Microsoft System CLR Types for SQL Server、Microsoft VSS Writer for SQL Server、Microsoft OLE DB Driver for SQL Server等尽数删去,其中先卸载主程序,按步骤卸载掉实例后虽然还在列表中,但是卸载完其他项目后再卸载主程序会显示已卸载。注意如果有SQL Server Management Studio (SSMS)还要卸载SSMS。
    4. 打开Windows Installer Clean Up,将上述各程序及其他SQL Server相关程序尽数删去。
    5. 打开注册表管理器,在HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft下删除:Microsoft ODBC Driver 11 for SQL Server、Microsoft ODBC Driver 17 for SQL Server、Microsoft OLE DB Driver for SQL Server、Microsoft OLE DB Driver Redist、Microsoft SQL Server 2012 Redist、Microsoft SQL Server 2014 Redist、Microsoft SQL Server 2017 RC0 Redist、Microsoft SQL Server 2019 CTP2.2 Redist、Microsoft SQL Server Compact Edition、Microsoft SQL Server Native Client 11.0、Microsoft SQL Server、MSODBCSQL11、MSODBCSQL17、MSOLEDBSQL、MSSQLServer、SQLNCLI11等;在HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Session Manager下删除PendingFileRenameOperations;在HKEY_CLASSES_ROOT下删除MSOLEDBSQL.1、MSOLEDBSQL.AdvancedPage.1、MSOLEDBSQL.AdvancedPage、MSOLEDBSQL.AdvancedPage、MSOLEDBSQL.ConnectionPage.1、MSOLEDBSQL.ConnectionPage、MSOLEDBSQL.Enumerator.1、MSOLEDBSQL.Enumerator、MSOLEDBSQL.ErrorLookup.1、MSOLEDBSQL.ErrorLookup、MSOLEDBSQL、MSSQL.VDI.Client.2、MSSQL.VDI.Client、MSSQL.VDI.Server.2、MSSQL.VDI.Server、SQLNCLI11.1、SQLNCLI11.AdvancedPage.1、SQLNCLI11.AdvancedPage、SQLNCLI11.ConnectionPage.1、SQLNCLI11.ConnectionPage、SQLNCLI11.Enumerator.1、SQLNCLI11.Enumerator、SQLNCLI11.ErrorLookup.1、SQLNCLI11.ErrorLookup、SQLNCLI11、SQLOLEDB Enumerator.1、SQLOLEDB Enumerator、SQLOLEDB ErrorLookup.1、SQLOLEDB ErrorLookup、SQLOLEDB.1、SQLOLEDB、SQLServerProfilerTraceData、SQLServerProfilerTraceDef、SQLXMLX.1、SQLXMLX等;在HKEY_USERS\S-1-5-21-xxxxxxxxxx-xxxxxxxx-xxxxxxxxxx-xxxx\Software\Microsoft下删除Microsoft SQL Server;在HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft下删除Microsoft ODBC Driver 11 for SQL Server、Microsoft ODBC Driver 17 for SQL Server、Microsoft OLE DB Driver for SQL Server、Microsoft SQL Server Compact Edition、Microsoft SQL Server Native Client 11.0、Microsoft SQL Server、MSODBCSQL11、MSODBCSQL17、MSOLEDBSQL、MSSQLServer、SQLNCLI11;HKEY_USERS\S-1-5-18到S-1-5-8-21-...及S-1-5-80-...\Software下SQL Server相关注册表项。
    6. 删除C:\Program Files和Program Files (x86)\Common Files\System\Ole DB中的sqloledb.dll、sqloledb.rll、sqlxmlx.dll、sqlxmlx.rll、msdasql.dll、msdasqlr.dll以及en-US、ja-JP、zh-CN\sqloledb.rll.mui、msdasqlr.dll.mui、sqlxmlx.rll.mui;删除C:\WINDOWS\system32\sqlcecompact40.dll、sqlceoledb40、sqlceqp40.dll、sqlcese40.dll、sqlncli11.dll、SQLServerManager12.msc、SqlServerSpatial120.dll、SqlServerSpatial130.dll、SqlServerSpatial150.dll、sqlsrv32.dll、sqlsrv32.rll;删除C:\WINDOWS\SysWOW64\sqlcecompact40.dll、sqlceoledb40、sqlceqp40.dll、sqlcese40.dll、sqlsrv32.dll、sqlsrv32.rll、sqlunirl.dll、sqlwid.dll、sqlwoa.dll等。
    7. 使用Registrar Registry Manager搜索C:\Program Files\Microsoft SQL Server及C:\Program Files (x86)\Microsoft SQL Server,只选择数据,并选定全字匹配,搜索结果全部删除。
    8. 删除C:\Program Files\Microsoft SQL Server、C:\Program Files (x86)\Microsoft SQL Server、C:\Program Files (x86)\Microsoft Analysis Services、C:\Users\<username>\AppData\Roaming\Microsoft\Microsoft SQL Server、C:\Users\<username>\AppData\Local\Microsoft\Microsoft SQL Server(把C:\Program Files\Microsoft SQL Server\150\Setup Bootstrap\Log留下)。
    9. 打开SQL Server 2019安装程序,选择全新SQL Server独立安装或向现有安装添加功能,然后选择执行全新安装,指定可用版本为Developer,选择实例功能:数据库引擎服务、SQL Server复制、全文和语义提取搜索、Data Quality Services、Analysis Services和共享功能:Data Quality Client、客户端工具连接、客户端工具向后兼容性、客户端工具SDK、SQL Server客户端连接SDK(至此我们终于可以为实例功能、共享功能、共享功能(x86)都选择自己的安装目录,并且所有功能都没有变成灰色不可选或已选择的状态),选择命名实例为MSSQLSERVER,数据库引擎配置->服务器配置->身份验证模式为混合模式】设定密码并添加当前用户,再添加Administrators检查名称后的结果。
    10. 第一次报错:注册表权限问题,将提示的注册表十六进制代码在注册表中搜索定位到所在上一级Components(我的在HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Components)设置权限所有者为Administrators,启用继承,设置权限为Administrators和Users都可完全控制(记得之后改回原样,该注册表权限与Windows搜索结果菜单和开始菜单图标右键菜单高度相关)。
    11. 第二次报错:服务没有及时响应启动或控制请求。查询C:\Program Files\Microsoft SQL Server\150\Setup Bootstrap\Log下相应文件夹里的Details.txt找到这条报错信息向上溯源,发现很多feature都failed in result Result或ValidateResult,向上查找到最早的报错Result为E:\Program Files\Microsoft SQL Server\MSAS15.MSSQLSERVER\OLAP\和E:\Program Files\Microsoft SQL Server\MSAS15.MSSQLSERVER\OLAP\bin\,发现服务中的MSSQLServerOLAPService启动后迅速停止。再向上寻找发现报错信息:Slp: Sco: File 'G:\x64\setup\x64\RsFx.msi' does not exist、Slp: Sco: File 'G:\2052_CHS_LP\x64\setup\x64\sql_as_loc.msi' does not exist等,由于此时尚未安装MSSQLSERVER服务所以不能在服务上做文章,多次重试无用后取消,最后安装失败,共享功能全部成功安装,实例功能全部安装失败,最终错误代码为0x80004005。于是将ISO镜像文件解压并将其从移动硬盘复制到本地硬盘。试图使用修复但是现实修复程序没有作出更改,因为数据库引擎服务本就没有配置好,好在我们之前的安装是按照安装程序一步步安装的,我们可以在卸载程序中右键Microsoft SQL Server (64位)卸载/更改然后选择卸载所有实例功能。同时,安装还试图重装IIS,但是需要重启而未重启,总之没能解决该错误。试图通过命令行启动SQL Server返回错误信息服务没有响应控制功能。搜索报错信息Configuration action failed for feature SQL_Engine_Core_Inst during timing Startup and scenario Startup也没有得到解决办法。重启后通过本地硬盘中的安装程序重新安装。
    12. 第三次报错:服务没有及时响应启动或控制请求。这次更奇怪的是与第二次不同,没有文件does not exist,也没有Result和ValidateResult的报错信息,安装顿时陷入最艰难的情形。不过这次MSSQLSERVER已安装好,打开计算机管理(本地)->系统工具->事件查看器->Windows 日志->系统大量报错:等待……服务的连接超时(60000 毫秒)、由于下列错误,——服务启动失败: 服务没有及时响应启动或控制请求,更改MSSQLSERVER为本地系统登录后事件信息是SQL Server (MSSQLSERVER) 服务由于下列服务特定错误而终止: %%945。更改E:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\Log的权限后进入该目录打开ERRORLOG及ERRORLOG.x查看报错physical file "d:\dbs\sh\s19s\0924_133725\cmd\2\obj\x64retail\sql\mkmastr\databases\mkmastr.proj\MSDBData.mdf、model.mdf". Operating system error 3: "3(系统找不到指定的路径。)"、MSDBLog.ldf不正确以及spid23s     SQL Server failed to communicate with filter daemon launch service  (OS error: 服务没有及时响应启动或控制请求等,搜索错误代码9954也没有结果。结束本次安装,发现Analysis Service成功安装。
    13. SqlServer 错误1053:服务并未及时响应启动或控制请求启发,在安装到最后正在注册服务将要报错时在服务中依次将注册的SQL Server Full-text Filter Daemon Launcher (MSSQLSERVER)、SQL Server (MSSQLSERVER)、SQL Server Analysis Services (MSSQLSERVER)、SQL Server Analysis Services CEIP (MSSQLSERVER)、SQL Server Browser、SQL Server CEIP 服务 (MSSQLSERVER)、SQL Server VSS Writer、SQL Server 代理 (MSSQLSERVER)改为本地系统账户登录。安装成功。
    14. 另外一种更靠谱的方法:在安装失败后,SQL Server各服务都已经被添加好,只是无法启动而已,在计算机管理(本地)->系统工具->本地用户和组->组->Administrators->添加到组->添加NT Service\MSSQLSERVER、NT Service\MSSQLServerOLAPService、NT Service\MSSQLFDLauncher、NT Service\SQLSERVERAGENT,然后搜索本地安全策略->安全设置->本地策略->用户权限分配->允许本地登录->属性->添加用户或组中添加上述四项,然后卸载数据库引擎服务、SQL Server复制、全文和语义提取搜索、Data Quality Services、Analysis Services,然后重新安装时在数据库引擎配置->服务器配置->指定SQL Server管理员添加当前用户和Administrators,在下一步Analysis Services配置->指定哪些用户具有对Analysis Services的管理权限中也同样如此指定。顺利安装,并且服务登录为NT Service\...。
    15. 为解决SQL Server配置管理器中SQL Server网络配置和SQL Native Client 11.0配置只有32位的问题重新安装,这次清理了所有SQL Server、SQLServer、MSSQL、Microsoft ODBC、Microsoft OLE DB、MSODBCSQL、SQLOLEDB、SQLNCLI、SQLXMLX、sqlboot、SqlDumper、sqlmgmprovider、svrenumapi、instapi150等注册表,教训是搜索注册表时尽量不要勾选搜索数据,只需要勾选项和值即可,否则必然会导致误删,如Autorecover MOFs、环境变量、AppCompatCache等。
    16. 第一次报错:已添加了具有相同键的项。解决方法:删除C:\Users\<username>\AppData\Local\Microsoft_Corporation\LandingPage.exe*文件夹。
    17. 第二次报错:注册表权限问题,参考Windows 10无法打开注册表 由于某个错误无法打开该密钥(详细信息:拒绝访问)且无法在注册表上设置新的所有者拒绝访问的解决方案更改计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Components权限。
    18. 第三次卡在SqlEngineDBStartConfigAction_install_configrc_Cpu64报错(SQLEngine: --SqlServerServiceSCM: Waiting for nt event 'Global\sqlserverRecComplete' to be created、SQLEngine: --SqlServerServiceSCM: Wait for creation of event handle 'Global\sqlserverRecComplete' has timed out):AS或SQLEngine: --SqlEngineSetupPrivate: Failed to set register with Software Usage Metrics: System.IO.FileNotFoundException: 系统找不到指定的文件。 (异常来自 HRESULT:0x80070002)、SQLEngine: --SqlServerServiceSCM: Exception happens at start SQL Engine attempt 1. Exception: 找不到数据库引擎启动句柄之解决方法:安装时在服务器配置->服务账户->SQL Server数据库引擎->账户名称修改为NT AUTHORITY\SYSTEM,注意不用查找账户直接输入该名称确定。然后顺利安装。安装后MSSQLSERVER采用的是本地系统登录。
    19. 第四次发现SQL Server主服务启动不了,修复又报错找不到数据库引擎启动句柄,发现SQL Server服务的登录方式被改回了NT Service\MSSQLSERVER并且无法启动,报错启动失败或请求失败或服务未及时响应,解决方法是在服务中将其登录的登录身份改为本地系统账户即可。
    20. 打开SSMS,注意输入的是计算机名称,而不是MSSQLSERVER等乱七八糟的名称,否则会报错:
      ===================================
      
      无法连接到 MSSQLSERVER。
      
      ===================================
      
      在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误。未找到或无法访问服务器。请验证实例名称是否正确并且 SQL Server 已配置为允许远程连接。 (provider: Named Pipes Provider, error: 40 - 无法打开到 SQL Server 的连接) (.Net SqlClient Data Provider)
      
      ------------------------------
      有关帮助信息,请单击: http://go.microsoft.com/fwlink?ProdName=Microsoft%20SQL%20Server&EvtSrc=MSSQLServer&EvtID=53&LinkId=20476
      
      ------------------------------
      错误号: 53
      严重性: 20
      状态: 0
      
      
      ------------------------------
      程序位置:
      
         在 System.Data.SqlClient.SqlInternalConnectionTds..ctor(DbConnectionPoolIdentity identity, SqlConnectionString connectionOptions, SqlCredential credential, Object providerInfo, String newPassword, SecureString newSecurePassword, Boolean redirectedUserInstance, SqlConnectionString userConnectionOptions, SessionData reconnectSessionData, DbConnectionPool pool, String accessToken, Boolean applyTransientFaultHandling, SqlAuthenticationProviderManager sqlAuthProviderManager)
         在 System.Data.SqlClient.SqlConnectionFactory.CreateConnection(DbConnectionOptions options, DbConnectionPoolKey poolKey, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningConnection, DbConnectionOptions userOptions)
         在 System.Data.ProviderBase.DbConnectionFactory.CreateNonPooledConnection(DbConnection owningConnection, DbConnectionPoolGroup poolGroup, DbConnectionOptions userOptions)
         在 System.Data.ProviderBase.DbConnectionFactory.TryGetConnection(DbConnection owningConnection, TaskCompletionSource`1 retry, DbConnectionOptions userOptions, DbConnectionInternal oldConnection, DbConnectionInternal& connection)
         在 System.Data.ProviderBase.DbConnectionInternal.TryOpenConnectionInternal(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions)
         在 System.Data.ProviderBase.DbConnectionClosed.TryOpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions)
         在 System.Data.SqlClient.SqlConnection.TryOpenInner(TaskCompletionSource`1 retry)
         在 System.Data.SqlClient.SqlConnection.TryOpen(TaskCompletionSource`1 retry)
         在 System.Data.SqlClient.SqlConnection.Open()
         在 Microsoft.SqlServer.Management.SqlStudio.Explorer.ObjectExplorerService.ValidateConnection(UIConnectionInfo ci, IServerType server)
         在 Microsoft.SqlServer.Management.UI.ConnectionDlg.Connector.ConnectionThreadUser()
      
      ===================================
      
      找不到网络路径。

       

    21. 在SQL Server配置管理器仍然没有64位的节点的情况下,可尝试修改计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\150和计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL15.MSSQLSERVER下的注册表,例如TCP/IP是在计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQLServer\SuperSocketNetLib\Tcp。将其Enabled值设为1,查看其子项IP列表,如IP14的IpAddress为127.0.0.1,TcpPort为1433,那么就可以通过服务器名称为127.0.0.1,1433登录,注意如果通过Windows身份验证会报错:

      ===================================
      
      无法连接到 127.0.0.1,1433。
      
      ===================================
      
      登录失败。该登录名来自不受信任的域,不能与集成身份验证一起使用。 (.Net SqlClient Data Provider)
      
      ------------------------------
      有关帮助信息,请单击: http://go.microsoft.com/fwlink?ProdName=Microsoft%20SQL%20Server&EvtSrc=MSSQLServer&EvtID=18452&LinkId=20476
      
      ------------------------------
      服务器名称: 127.0.0.1,1433
      错误号: 18452
      严重性: 14
      状态: 1
      行号: 65536
      
      
      ------------------------------
      程序位置:
      
         在 System.Data.SqlClient.SqlInternalConnectionTds..ctor(DbConnectionPoolIdentity identity, SqlConnectionString connectionOptions, SqlCredential credential, Object providerInfo, String newPassword, SecureString newSecurePassword, Boolean redirectedUserInstance, SqlConnectionString userConnectionOptions, SessionData reconnectSessionData, DbConnectionPool pool, String accessToken, Boolean applyTransientFaultHandling, SqlAuthenticationProviderManager sqlAuthProviderManager)
         在 System.Data.SqlClient.SqlConnectionFactory.CreateConnection(DbConnectionOptions options, DbConnectionPoolKey poolKey, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningConnection, DbConnectionOptions userOptions)
         在 System.Data.ProviderBase.DbConnectionFactory.CreateNonPooledConnection(DbConnection owningConnection, DbConnectionPoolGroup poolGroup, DbConnectionOptions userOptions)
         在 System.Data.ProviderBase.DbConnectionFactory.TryGetConnection(DbConnection owningConnection, TaskCompletionSource`1 retry, DbConnectionOptions userOptions, DbConnectionInternal oldConnection, DbConnectionInternal& connection)
         在 System.Data.ProviderBase.DbConnectionInternal.TryOpenConnectionInternal(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions)
         在 System.Data.ProviderBase.DbConnectionClosed.TryOpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions)
         在 System.Data.SqlClient.SqlConnection.TryOpenInner(TaskCompletionSource`1 retry)
         在 System.Data.SqlClient.SqlConnection.TryOpen(TaskCompletionSource`1 retry)
         在 System.Data.SqlClient.SqlConnection.Open()
         在 Microsoft.SqlServer.Management.SqlStudio.Explorer.ObjectExplorerService.ValidateConnection(UIConnectionInfo ci, IServerType server)
         在 Microsoft.SqlServer.Management.UI.ConnectionDlg.Connector.ConnectionThreadUser()
      

      改为通过SQL Server身份验证登录即可。

    展开全文
  • sqlserver2008r2卸载工具包

    热门讨论 2015-05-30 23:06:58
    解决sqlserver2008卸载不干净的问题,一步一步从windows操作系统中卸载掉sqlserver 2008 r2;欢迎使用,有使用说明!谢谢支持
  • Microsoft SQL Server 2005技术内幕:存储引擎(中文).pdf

    千次下载 热门讨论 2012-06-23 13:15:03
    SQL Server 2005微软官方权威参考书.  公球公认SQL Server 2005 经典著作..  数据库“铁人”、微软MVP胡百敬先生鼎力推荐  微软SQL Server 总部Principal Group 项目经理朱凌志鼎力推荐  本书详细介绍了数据...
  • MySQL与SqlServer的区别

    千次阅读 多人点赞 2020-11-08 14:25:19
    一、MySQL与SqlServer的区别 目前最流行的两种后台数据库即为Mysql 和 SQL Server。这两者最基本的相似之处在于数据存储和属于查询系统,你可以使用SQL来访问这两种数据库的数据,因为它们都支持ANSI-SQL(数据库管理...

    MySQL与SqlServer的区别

    目前最流行的两种后台数据库即为Mysql 和 SQL Server。这两者最基本的相似之处在于数据存储和属于查询系统,你可以使用SQL来访问这两种数据库的数据,因为它们都支持ANSI-SQL(数据库管理标准)。还有,这两种数据库系统都支持二进制关键字和关键索引,这就大大地加快了查询速度。同时,二者也都提供支持XML的各种格式、也都能够在.NET或J2EE下运行正常,同样,都能够利用RAID(独立冗余磁盘阵列)

    根本的区别:

    1. SQL服务器的狭隘的、保守的存储引擎而MySQL服务器的可扩展、开放的存储引擎;
    2. SQL服务器的引擎是Sybase,而MySQL能够提供更多种的选择,如MyISAM、Heap、InnoDB、Berkeley DB;
    3. MySQL不完全支持陌生的关键词,所以它比SQL服务器要少一些相关的数据库;
    4. MySQL也缺乏一些存储程序的功能,比如MyISAM引擎联支持交换功能;

    性能方面

    MySQL:

    纯粹就性能而言,MySQL是相当出色的,因为它包含一个缺省桌面格式MyISAM。MyISAM 数据库与磁盘非常地兼容而不占用过多的CPU和内存。MySQL可以运行于Windows系统而不会发生冲突,在UNIX或类似UNIX系统上运行则更好。你还可以通过使用64位处理器来获取额外的一些性能。因为MySQL在内部里很多时候都使用64位的整数处理。Yahoo!商业网站就使用MySQL 作为后台数据库。

    当提及软件的性能,SQL服务器的稳定性要比它的竞争对手强很多。但是,这些特性也要付出代价的。比如,必须增加额外复杂操作,磁盘存储,内存损耗等等。如果你的硬件和软件不能充分支持SQL服务器,我建议你最好选择其他如DBMS数据库,因为这样你会得到更好的结果。

    安全方面:

    1. MySQL和SqlServer都有字节完整的安全机制(缺省IP端口,也可以自己设置),只要遵守这些机制,一般是不会出问题的;
    2. MySQL有一个用于改变数据的二进制日志。因为它是二进制,这一日志能够快速地从主机上复制数据到客户机上。当服务崩溃时,二进制文件也会完整的保存;
    3. 在SQL服务器中,你也可以记录SQL的有关查询,但这需要付出很高的代价;
    4. 在恢复性方面,两款都做的很好。对于MySQL来说,主要体现在MyISAM的配置上。而SqlServer表现的就很稳健,SQL服务器能够时刻监测数据交换点并能够把数据库损坏的过程保存下来;

    根据需求来选择

    如果说这两种数据库那种更好,只能说要根据实际需求来选择数据库。

    1. 如果要建立一个.NET服务器体系,这一体系可以从多个不同平台访问数据,参与数据库的管理,那么你可以选用SQL服务器
    2. 如果要建立一个第三方站点,这一站点可以从一些客户端读取数据,那么MySQL将是最好的选择
    3. 如果需要海量数据,建议使用SqlServer,MySQL主要是短小精悍,容易上手,操作简单,免费供用的,在应对海量数据时没有SqlServer效果好
    4. 从成本角度考虑,MySQL肯定是第一选择,抛开5块钱的盗版SqlServer,这个数据库还是很贵的(SQL-Server 2000 是微软公司开发的中型数据库,它的可视化方面做得很好,在安全性等方面功能非常强大,并且有微软的强大技术支持,当然价格比较昂贵,适合应用于中型系统)

    sql语句上的变形

    数据定义、主键约束

    Mysql定义数据库和主键:
    	create database name; 创建数据库 
    	use databasename; 选择数据库 
    	drop database name 直接删除数据库
    	CREATE TABLE --创建一个数据库表
    	
    	CREATE TABLE Persons
    	(
    		Id_P  int  NOT NULL,
    		LastName varchar(255) NOT NULL,
    		FirstName varchar(255),
    		Address varchar(255),
    		City varchar(255),
    		PRIMARY KEY (Id_P)               //声明主健写在最后
    	)
    
    SqlServer定义数据库和主键:
    	CREATE TABLE Persons
    	(
    		Id_P int NOT NULL PRIMARY KEY,     //声明主健 紧跟列后
    		LastName varchar(255) NOT NULL,
    		FirstName varchar(255),
    		Address varchar(255),
    		City varchar(255)
    	)
    

    当表存在时,给表加、删除主健:

    Mysql 、SqlServer添加:
    	ALTER TABLE Persons ADD PRIMARY KEY (Id_P)
    
    MySQL删除:
    	ALTER TABLE Persons DROP PRIMARY KEY
    SQL Server删除:
    	ALTER TABLE Persons DROP CONSTRAINT pk_PersonID
    

    UNIQUE 约束

    UNIQUE 和 PRIMARY KEY 约束均为列或列集合提供了唯一性的保证,每个表可以有多个unique,但只能有一个primary key。

    MySQL添加:
    CREATE TABLE Persons
    (
    	Id_P int NOT NULL,
    	UNIQUE (Id_P)                 //写在最后
    )
    MySQL删除:
    	ALTER TABLE Persons DROP INDEX  uc_PersonID
    
    SQL Server添加:
    CREATE TABLE Persons
    (
    	Id_P int NOT NULL UNIQUE,        //紧跟列后
    )
    SQL Server删除:
    	ALTER TABLE Persons DROP CONSTRAINT uc_PersonID
    

    CHECK 约束

    CHECK 约束用于限制列中的值的范围,如果对单个列定义 CHECK 约束,那么该列只允许特定的值。如果对一个表定义 CHECK 约束,那么此约束会在特定的列中对值进行限制。

    My SQL添加:
    CREATE TABLE Persons
    (
    	Id_P int NOT NULL,
    	CHECK (Id_P>0)                       //写在最后
    )
    SQL Server 添加:
    CREATE TABLE Persons
    (
    	Id_P int NOT NULL CHECK (Id_P>0),    //紧跟列后
    )
    
    MySQL / SQL Server添加多个:
    CREATE TABLE Persons
    (
    	Id_P int NOT NULL,
    	City varchar(255),
    	CONSTRAINT chk_Person CHECK (Id_P>0 AND City='Sandnes') //多个条件
    )
    
    MySQL / SQL Server对已有字段进行添加:
    	ALTER TABLE Persons ADD CHECK (Id_P>0)
    
    MySQL / SQL Server删除:
    	ALTER  TABLE  Persons  DROP CONSTRAINT chk_Person
    

    DEFAULT 约束

    DEFAULT 约束用于向列中插入默认值。如果没有规定其他的值,那么会将默认值添加到所有的新纪录。

    My SQL / SQL Server添加:
    CREATE TABLE Persons
    (
    	Id_P int NOT NULL,
    	City varchar(255) DEFAULT 'Sandnes'     //紧跟列后,默认值字符串Sandnes
    )
    
    通过使用类似 GETDATE() 这样的函数,DEFAULT 约束也可以用于插入系统值:
    CREATE TABLE Orders
    (
    	Id_O int NOT NULL,
    	OrderDate date DEFAULT GETDATE()   //紧跟列后,函数
    )
    
    
    MySQL对已有表进行添加:
    	ALTER  TABLE  Persons  ALTER  City  SET  DEFAULT  'SANDNES'
    SQL Server对已有表进行添加:
    	ALTER  TABLE  Persons  ALTER  COLUMN  City  SET  DEFAULT  'SANDNES'
    
    MySQL删除:
    	ALTER  TABLE  Persons  ALTER  City  DROP  DEFAULT
    
    SQL Server删除:
    	ALTER  TABLE  Persons  ALTER  COLUMN  City  DROP  DEFAULT
    

    索引

    在不读取整个表的情况下,索引使数据库应用程序可以更快地查找数据。

    Mysql和SqlServer在表上创建一个简单的索引(允许使用重复的值):
    	CREATE INDEX index_name ON table_name (column_name) //"column_name" 规定需要索引的列。
    
    Mysql和SqlServer在表上创建一个唯一的索引(两个行不能拥有相同的索引值):
    	CREATE UNIQUE INDEX index_name ON table_name (column_name)
    
    Mysql删除:
    	ALTER TABLE table_name DROP INDEX index_name
    SqlServer删除:
    	DROP INDEX table_name.index_name
    

    自增主键

    我们通常希望在每次插入新纪录时,自动地创建主键字段的值。

    mySql的主键自动增加是用auto_increment字段,默认地,AUTO_INCREMENT 的开始值是 1,每条新纪录递增 1
    sqlServer的自动增加则是identity字段.
    Auto-increment 会在新纪录插入表中时生成一个唯一的数字。
    我们可以在表中创建一个 auto-increment 字段。
    用于 MySQL 的语法

    MySQL增加:
    CREATE TABLE Persons
    (
    	P_Id int NOT NULL AUTO_INCREMENT,
    	PRIMARY KEY (P_Id)
    )
    设置自增的起始值:
    	ALTER TABLE Persons AUTO_INCREMENT=100
    SqlServer增加:
    CREATE TABLE Persons
    (
    	P_Id int PRIMARY KEY IDENTITY,或则是写成P_id int primary key identity (1,1),
    )
    要规定 "P_Id" 列以 20 起始且递增 10,请把 identity 改为 IDENTITY(20,10)
    
    
    

    MySQL支持enum,和set类型,SQL Server不支持

    枚举enum

    ENUM是一个字符串对象,其值来自表创建时在列规定中显式枚举的一列值,枚举最多可以有65,535个元素。

    create table meijut (f1 enum('1','2','3','4','5','6'))
    desc meijut
    
    +-------+-------------------------------+------+-----+---------+-------+
    | Field | Type                          | Null | Key | Default | Extra |
    +-------+-------------------------------+------+-----+---------+-------+
    | f1    | enum('1','2','3','4','5','6') | YES  |     | NULL    |       |
    +-------+-------------------------------+------+-----+---------+-------+
    insert into meijut values('5');
    
    

    集合set

    	create table jihe(f1 set('f','m'));
    	insert into jihe values('f');
    

    删表

    Mysql判断一个数据库表是否存在并删除的语句是:

    drop table if exists jihe
    

    SqlServer判断一个数据库表是否存在并删除的语句是:

        if exists (select * from sysobjects where name='Sheet1$' and xtype='U') drop table Sheet1$
        jihe数据库名 Sheet1$表名
    

    查表

    MySQL:
    		Show tables;           显示一个库中的所有表
            Desc table;              显示一个表的表结构
            Show create table tablename;         显示一个表的详细创建信息
            alter table t1 rename t2;        给表重命名
            alter table meijut add column f2 int default 0;				新增一列
            alter table meijut modify f2 text;					修改一列
    

    数据的CRUD

    limit和top

    SQL Server: 
    			select   top   8   *   from   table1 
    MySQL: 
    			select   *   from   table1   limit   5
    			select * from table1 limit 0,5
    

    ISNULL()函数

    SqlServer:
    	select * from test where isnull(no,0)=0;
    
    MySQL 可以使用 ISNULL() 函数
    MySQL:
    	select * from test where ifnull(no,0)=0;
    

    语法定义

    注释符区别

    SqlServer:–和 /* */
    MySql:–和/**/和#

    识别符的区别

    SqlServer识别符是[],[type]表示他区别于关键字
    MySQL识别符是 `

    存储过程

    1. MySql的存储过程中变量的定义去掉@
    2. MySql的declare只能用在begin end 的复合语句中,且只能是语句的开头。而SqlServer可以放在里面,也可以放在begin前
    3. MySql的Execute对应SqlServer的exec
    4. MySql存储过程调用其他存储过程用call
    5. SqlServer:select @a=count() from VW_Action MySQL为:select count() from VW_Action into @a
    6. MySql存储过程中没有return函数,在MySql中可以用循环和out参数代替
    7. MySql的out对应SQLServer的output,且mysql 的out要放在变量的前面,SQLServer的output放在变量后面
    展开全文
  • PS:C#开发的童鞋们,记得先安装VS开发工具,在安装sqlserver(做网站开发的 ,最后在安装 iis配置 )。 因为sqlserver需要 先安装.net framework相应版本, 才能顺利安装好sqlserver。 而先安装VS,VS自动安装多版本...
  • SQL Server 2012 64位

    热门讨论 2018-05-26 14:27:01
    SQL Server 2012 64位,用于数据库开发、SQL Server 2012 64位,用于数据库开发SQL Server 2012 64位,用于数据库开发SQL Server 2012 64位,用于数据库开发SQL Server 2012 64位,用于数据库开发
  • com.microsoft.sqlserver.jdbc.SQLServerException: 驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接。错误:“sun.security.validator.ValidatorException: PKIX path building failed: sun....
  • C++完整数据库SQLServer操作类(ODBC)

    千次下载 热门讨论 2014-10-20 11:39:36
    C++对SQLServer操作的可直接使用类,包括打开数据库,对数据库进行操作,获取数据等结合sql对数据库的全部操作,ODBC操作数据库
  • SQL Server 2008高级程序设计.pdf

    千次下载 热门讨论 2012-12-18 15:20:57
    英文版:Professional Microsoft SQL Server 2008 Programming 内容简介 《SQL Server 2008高级程序设计》由世界顶尖SQL Server权威专家Robert Vieira撰写,它介绍SQL Server 2008的新功能,讨论如何设计性能卓越的...
  • sqlserver2012入门视频教程

    千次下载 热门讨论 2013-08-15 12:29:51
    sqlserver2012入门视频教程,适合初学者入门用。
  • SQL SERVER字符串截取,SQL SERVER根据指定字符截取
  • VS2010连接SQL Server 2008操作与编程

    热门讨论 2014-12-29 17:56:34
    文档说明:http://blog.csdn.net/u010499449/article/details/42237887
  • Microsoft.SqlServer.Diagnostics.STrace.dll

    热门讨论 2013-10-05 13:53:31
    “Microsoft.SqlServer.Management.Dmf.PolicyStore”的类型初始值设定项引发异常。 (Microsoft.SqlServer.Dmf) 未能加载文件或程序集“Microsoft.SqlServer.Diagnostics.STrace, Version=10.0.0.0, Culture=...
  • SQL server Native Client 10.0

    热门讨论 2013-05-06 16:39:01
    SQL server Native Client 10.0,此为64位的ODBC数据源,亲测SQL Server 2008 r2支持良好,其它数据库版未测试,是组建64位DSN的必备组件。
  • 官网 下载地址:https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.这里我选择了developer版,也可以输入产品“药” https://www.cnblogs.com/Williamls/p/10506243.html 附上“药”, CSDN现在...
  • 完整版彻底卸载SQL Server2019

    万次阅读 多人点赞 2020-11-18 17:57:19
    重新安装SQL Server2019等要注意的事项
  • windows server2019安装SQLServer

    千次阅读 2021-10-24 13:13:22
    如果从远程共享安装 SQL Server ,则必须使用对远程共享具有读取和执行权限的域帐户。 2、执行安装 插入 SQL Server 安装介质, 然后双击根文件夹中的 Setup.exe 在“许可条款” 页中,审阅许可协议。 如果同意,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,450,507
精华内容 580,202
关键字:

sqlserver