MSSQL 基础知识002

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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触发器。

约束-保证数据完整性

非空约束

主键约束(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执行完毕

以上是关于MSSQL 基础知识002的主要内容,如果未能解决你的问题,请参考以下文章

HLS NGINX-RTMP [错误] 1281#0:* 58 hls:强制片段拆分:10.002 秒

方便调试使用的代码片段

Microsoft SQL Server 代码片段收集

如何在 mssql 中更新 JSON 中的嵌套数组

002_Python3基础语法

002-pythn基础-循环编码