• MSSQL 基础知识002


    ---启用sa账号

    1. 先使用一个windows账号登陆。

    2.在数据库实例上面右键,属性,安全性,登录名,sa.

    右键,属性。

    常规,修改sa的密码。

    状态,启用sa账号。

    主键的作用:

    1.唯一标识表中的一条记录。

    选择什么样的列作为主键:

    1.没有重复的列。

    2.不能为空(null)的列。

    3.选择比较稳定的列。(列不经常发生变化的),主键中的值一般不修改。

    4.选择那些比较“小”的列。(列的数据类型所占用的字节数小)。

    5.尽量选择那些没有实际意义的列作为主键(逻辑主键

       不建议选择那些在业务中具有实际意义的列作为主键(具有实际意义的列作为主键,叫做,业务主键。)

    6.尽量选择单列作为主键,不要选择多列作为主键(组合主键、复合主键)[一个主键是由多列组成的]

    一个表中可以有多个主键吗?不可以,因为表中数据的实际存储顺序只能有一种

    主键不是必须的,但是建议每张表都应该有主键。

    数据类型介绍

    image 用来存储二进制字节。byte[] 可以存储图片,文件,电影等。什么类型都可以存储。只要能转换为byte[]就可以使用image数据类型存储

    ---下面的这几种数据类型都是表示字符串类型---

    char/nchar/varchar/nvarchar/varchar(max)/nvarchar(max)/text/ntext

    char()/nchar()

    char(5) 最大可以写char(8000)

    五个字符  //不带n的,存储的时候是用ascii模式来存储,中文字符占用两个字节,英文字符、数字字符等占用一个字节

    nchar(5) 最大可以写nchar(4000)

    //凡是带n的都表示在存储的时候使用unicode方式来存储,那么无论是中文还是英文都是每个字符占用2个字节

    ---数据前面不加var,表示这个数据类型是一个固定长度的数据类型。

    如果设置了长度为10,那么

     1>最多能存储10个。多了则报错

     2>如果只存储了3个,那么后面也会自动补齐7个空格。

    ---如果加了var,那么表示的是可变长度。

    ---比如varchar(10)

     1>最多能存储10个,多了则报错

     2>如果存储的少于10个,则实际存储的长度就是,实际用户输入的字符串的个数,不会自动补齐。

    varchar()/nvarchar()

    带var的优点:节省空间。缺点:每次都会动态计算用户实际保存的数据的长度,重新设置数据类型长度。

    text 等价于varchar(max)

    ntext等价于nvrcahr(max)

    SQL Server一共有5个系统数据库:

    master:记录SQL Server系统的所有系统级信息,例如:登陆账户信息、链接服务器和系统配置设置、记录其他所有数据库的存在、数据文件的位置、SQL Server的初始化信息等。

    如果master数据库不可用,则无法启动SQL Server。

    msdb:用于SQL Server代理计划警报和作业。数据库定时执行某些操作、数据库邮件等。

    model:用作SQL Server实例上创建的所有数据库的模板。对model 数据库进行的修改(如数据库大小、排序规则、恢复模式和其他数据库选项)将应用于以后创建的所有数据库。在model数据库中创建一张表,则以后每次创建数据库的时候都会有默认的一张同样的表。

    tempdb:一个工作空间,用于保存临时对象或中间结果集。一个全局资源,可供连接到 SQL Server 实例的所有用户使用。每次启动 SQL Server 时都会重新创建 tempdb。

    SQL语句入门:

    SQL全名结构化查询语言(Structured Query Language),是关系数据库管理系统的标准语言

    Sybase与Microsoft对标准SQL做了扩展,称为:T-SQL(Transact-SQL)

    SQL主要分为DDL(数据库定义语言)、DML(数据操作语言) 、DCL(数据库控制语言)

    truncate table student 的作用与delete from student一样,都是删除student表中的全部数据,区别在于:

    1.truncate语句非常高效。由于truncate操作采用按最小方式来记录日志,所以效率非常高。对于数百万条数据使用truncate删除只要几秒钟,而使用delete则可能耗费几小时。

    2.truncate语句会把表中的自动编号重置为默认值。

    3.truncate语句不触发delete触发器。

    约束-保证数据完整性 参考链接:http://www.cnblogs.com/DrHao/p/5193567.html

    非空约束

    主键约束(PK) primary key 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 } ]

    top和distinct

    top获取查询出的结果集中的前n条

    order by 进行排序。所以,一般使用top的时候,必须配合排序一起使用才有意义。

    --row_number() (MSSQL Server2005之后新增) 数据库取底4条到第8条的数据

    1 select * from
    2 (select row_number() over (order by cid asc) as num,* from CheckTest) as s
    3 where s.num between 4 and 8
    4 
    5 select top 5 * from CheckTest where cid not in (select top 2 cid from CheckTest)
    分页Demo/row_number

    --Group by数据分组

    --1.分组的目的,就是为了汇总、统计。

    --2.聚合函数。刚才所说的聚合函数其实就是把整个表中的数据作为"一组",来进行统计汇总。

    --聚合函数使用的时候一定会配合分组(group by)来使用,如果使用聚合函数时,没用分组,那么意义不大。

    --聚合函数在使用的时候一定会分组,即便不写group by语句,其实也是默认把整个表中的数据作为"一个组"来使用,进行统计。

    select ---4
    tsclassId,
    count(*) as 班级人数
    from TblStudent ---1
    group by tsclassId ---2
    having count(*)>10 ---3 --注意在having中不能使用select中所使用的别名,因为在执行having的时候,select的还没执行呢。

    --但是,在order by语句中却可以使用select中为列起的别名,因为order by语句在最后执行,在执行order by语句的时候,select语句已经执行完毕了。

    --having的意思就是对分组后的结果,再进行筛选,最终确定哪些组显示,那些组不显示

    --where与having的区别

    --1.where是在分组前进行数据筛选,having是在分组后数据筛选。

    --2.不能在where中直接使用聚合函数来进行数据筛选,也不能在having中直接使用分组查询后并不包含的列来进行数据筛选

    SQL语句执行顺序:

     1 5>Select 5-1>选择列,5-2>distinct,5-3>top(应用top选项最后计算)
     2 1>From 3 2>Where 条件
     4 3>Group by 5 4>Having 筛选条件 
     6 6>Order by 7 ---------------------
     8 1.FROM
     9 2.ON
    10 3.JOIN
    11 4.WHERE
    12 5.GROUP BY
    13 6.WITH CUBE 或 WITH ROLLUP
    14 7.HAVING
    15 8.SELECT
    16 9.DISTINCT
    17 10.ORDER BY
    18 11.TOP
    MSSQL 执行顺序

    ---类型转换Cast()与Convert()

     Cast(getdate(),varchar(16))

     Convert(varchar(16),getdate())

    ---联合union

    --union指的是联合的意思,是将多个结果集联合成了一个结果集。把所有的记录都加起来变成一个大的结果集。

    --1:union ,使用union的时候会默认执行去除重复的操作。

    --2:union all(推荐),使用union all的时候并不会执行任何去除重复操作,会将所有的记录都联合显示出来。

    --3;进行结果集联合的时候,可以对多个结果集进行联合,但是前提是:

    --- 1>多个结果集中,每个结果集的列的个数都得一致

    --- 2>并且多个结果集之间的数据类型需要一一对应(数据类型一致,或者数据类型之间得兼容)

    --- 通过一条SQL语句向表中插入多条数据[insert into 表名 + 结果集]

    1 insert into 表名
    2 select 列1值,列2值,... union all
    3 select 列1值,列2值,... union all
    4 select 列1值,列2值,...
    insert表[使用select SQL]

    --- 把现有表的数据插入到新的表中(表不能存在),为表建立备份

      select * into NewCheckTest from checktest

    --- 创建一个新表,该表的结果与已经存在的表一致,但是该表中没有任何数据

      select * into MyNewCheckTest from checktest where 1<>1 (不推荐)

      select top 0 * into MyNewCheckTest from checktest (推荐)

    --- 如果表已经存在

      insert into 表名 select * from 已经存在的表

    --字符串函数

    LEN():计算字符串长度(字符的个数)

    datalength()://计算字符串所占用的字节数,不属于字符串函数。

           varchar变量与nvarchar变量存储字符串a的区别 [varchar占用1个字节数(使用ascii方式),nvarchar占用2个字节数(使用unicode方式)]

    LOWER()UPPER () :转小写、大写

    LTRIM():字符串左侧的空格去掉

    RTRIM():字符串右侧的空格去掉

          LTRIM(RTRIM(' bb ')):字符串两边的空格去掉

    LEFT()RIGHT():截取取字符串

             SELECT LEFT('abcdefg',2)

    SUBSTRING(string,start_position,length),索引从1开始。

     参数string为主字符串,start_position为子字符串在主字符串中的起始位置,length为子字符串的最大长度。SELECT SUBSTRING('abcdef111',2,3)

    --日期函数

    GETDATE() :取得当前日期时间

    DATEADD (datepart , number, date ):计算增加以后的日期。参数date为待计算的日期;参数number为增量;参数datepart为计量单位,可选值见备注。

                        DATEADD(DAY, 3,date)为计算日期date的3天后的日期,而DATEADD(MONTH ,-8,date)为计算日期date的8个月之前的日期 。

    Sql2005中只有DateTime类型,2008中有date、datetime、datetime2 等类型

    DATEDIFF ( datepart , startdate , enddate ):计算两个日期之间的差额。 datepart 为计量单位,可取值参考DateAdd。                       

    1 select DateDiff(year,sInDate,getdate()),count(*) from student Group by DateDiff(year,sInDate,getdate())
    统计不同入学年数的学生个数[DataDiff]

    DATEPART (datepart,date):返回一个日期的特定部分  Month()、year()、day()来代替。

    1 select DatePart(year,sBirthday),count(*)
    2 from student
    3 group by DatePart(year, sBirthday)
    统计学生的生日年份个数

    --返回刚刚插入数据的Id

    insert into 'TableName' output inserted.Id values('AA','BB')  (推荐)

    insert into 'TableName' values('laozhang',10);select @@identity  (不推荐,同时插入数据时,只会返回最后一个的id)

    --Case 等值判断

    CASE expression

      WHEN value1 THEN returnvalue1

      WHEN value2 THEN returnvalue2

      WHEN value3 THEN returnvalue3

      ELSE defaultreturnvalue

    END

    ---Case 区间判断

    CASE

      WHEN condition1 THEN returnvalue1

      WHEN condition 2 THEN returnvalue2

      WHEN condition 3 THEN returnvalue3

      ELSE defaultreturnvalue

    END

    --索引

    全表扫描:对数据进行检索(select)效率最差的是全表扫描,就是一条条的找。

    如果没有目录,查汉语字典就要一页页的翻,而有了目录只要查询目录即可。为了提高检索的速度,可以为经常进行检索的列添加索引,相当于创建目录。

    创建索引的方式,在表设计器中点击右键,选择“索引/键”→添加→在列中选择索引包含的列。

    使用索引能提高查询效率,但是索引也是占据空间的,而且添加、更新、删除数据的时候也需要同步更新索引,因此会降低Insert、Update、Delete的速度。

    只在经常检索的字段上(Where)创建索引。【MSSQL 默认使用【填充因子】 来提高效率(在每条数据之间留有空间)

    (*)即使创建了索引,仍然有可能全表扫描,比如like、函数、类型转换等。

    select A1,A2 from A where A3 like '%abc%'  --会全表扫描,不会使用索引

    select A1,A2 from A where A3 like 'abc%' --会使用索引

    --不清楚在哪列建立索引 可以使用MSSQL-->工具-->【数据库引擎优化顾问】

    索引

     相当于字典中的目录

     加快查询速度

     在执行增删改的时候降低了速度

    聚集索引

     一个表中只能有一个聚集索引。

    【相当于字典中拼音目录,拼音目录的顺序和数据的顺序是一致的】

     索引的排序顺序与表中数据的物理存储位置是一致的,一般新建主键列后回自动生成一个聚集索引。

    非聚集索引(逻辑上的排序)

     一个表中可以有多个非聚集索引。

    【相当于字典中笔画目录,笔画目录的顺序和数据是无关的】

    // 建索引的目的是为了加快查询速度。

    // 索引之所以能加快查询速度是【因为索引对数据进行了排序,排序后则可更高效的查询】。

    // 建索引应该建在某个列上(where中经常使用到的列),就是说要对某个列排序,

    //这是,如果用用户执行一条查询语句,where条件中包含了建索引的那列,那么这时,采用用到索引,否则,不会使用索引。Name=数据(用索引),name like ‘%aa%’(不用索引)

    =======非聚集索引=============

    CREATE NONCLUSTERED INDEX IX_SalesPerson_SalesQuota_SalesYTD ON Sales.SalesPerson (SalesQuota, SalesYTD); GO

    ====创建唯一非聚集索引=============

    CREATE UNIQUE INDEX AK_UnitMeasure_Name ON Production.UnitMeasure(Name); GO

    =======创建聚集索引=================

    CREATE TABLE t1 (a int, b int, c AS a/b); CREATE UNIQUE CLUSTERED INDEX Idx1 ON t1(c); INSERT INTO t1 VALUES (1, 0);

    =====删除索引=====

    drop index 表名.列名

    --子查询

    把一个查询的结果在另一个查询中使用就叫子查询。(将一个查询语句做为一个结果集供其他SQL语句使用)

    子查询基本分类:

     1. 独立子查询(连接子查询):子查询可以独立运行

     2. 相关子查询:子查询中引用了父查询中的结果

    --分页(每页显示4条数据,显示第三页数据)

     1 SELECT TOP 4
     2   *
     3 FROM UserInfo
     4 
     5 WHERE Id NOT IN
     6 
     7 ( SELECT TOP (4 * 2) Id FROM UserInfo)
     8 
     9 -------------------------------------
    10 SELECT
    11   *
    12 FROM
    13 
    14 (SELECT ROW_NUMBER() OVER (ORDER BY id ASC) AS num,* FROM UserInfo) AS U
    15 
    16 WHERE U.num BETWEEN (4 * 2)+ 1 AND (4 * 3)
    分页Demo

    --连接查询(join)

    交叉连接:(两种语法cross join 和 ,)

    内连接:(inner join),多表内连接。

      无论几张表连接,每次执行都是两张表进行连接。

    外连接:

      左外联(left outer join)

      右外联(right outer join)

    连接查询的基本执行步骤:

    1>笛卡尔积(第一张表的所有数据和第二张表一一连接)

    2>应用on筛选器

    3>添加外部行,到此from执行完毕

  • 相关阅读:
    SpringBoot: 2.SpringBoot整合servlet(转)
    SpringBoot: 1.创建第一个SpringBoot项目(转)
    SqlServer:SqlServer(服务器磁盘监控,创建管理员账号分配权,添加链接服务器,查询CPU,查询内存)
    Log parser工具使用
    目录爆破工具
    安装腾讯QQ问题记录
    Sql Server 2017 安装问题记录
    reGeorg+Proxifier使用
    Swaks
    python2.7 安装pycrypto库报错
  • 原文地址:https://www.cnblogs.com/DrHao/p/5197238.html
Copyright © 2020-2023  润新知