重新捡起枪杆子,学习N年没用过的MS-SQL,整理一些学习笔记记录。
一、创建、修改和删除表
在SQL中,表有如下规则:
- 每张表都有一个名字,通常称为表名或关系名。
- 表名必须以字母开头,最大长度为 30 个字符。
- 一张表可以由若干列组成。
- 同一张表中,列名唯一,列名也称为属性名或字段。
- 同一列的数据必须有相同的数据类型。
- 表中的每一列值必须是不可分割的基本数据项。
- 表中的一行称为一个元组,相当于一条记录。
SQL支持以下3种类型的表:
- 永久表
- 全局临时表
- 局部临时表
创建表
创建数据库中的表,表由行和列组成,每个表都必须有个表名:CREATE TABLE
CREATE TABLE 表名称
(
列名称1 数据类型,
列名称2 数据类型,
列名称3 数据类型,
....
)
注:创建表,必须要保证该表名在数据库中不存在,否则数据库会提示创建失败。如果需要创建已经存在的表,我们必须先将原来的表删除,再重新创建。
修改表
在已有的表中添加、修改或删除列:ALTER TABLE
表中添加列:ALTER TABLE (表) ADD (列)
表中删除列:ALTER TABLE (表) DROP COLUMN (列)
注:一些数据库系统不允许这样删除数据库表中的列。
表中更改列的数据类型:ALTER TABLE (表) ALTER COLUMN (更改的数据类型)
表的删除与重命名
重命名表:SP_RENAME '原始名','重命名'
删除表:DROP TABLE 表
二、创建、删除数据库
创建数据库
SQL Server 允许为每个数据库服务创建多个数据库。在 MS-SQL 中,使用 CREATE DATABASE 语句创建数据库的完整语法:
CREATE DATABASE database_name
[ ON
[ < filespec > [ ,...n ] ]
[ , < filegroup > [ ,...n ] ]
]
[ LOG ON { < filespec > [ ,...n ] } ]
删除数据库
与表的删除类似,数据库的删除是通过 DROP DATABASE 语句来实现的,语法如下:
DROP DATABASE database_name [ ,...n ]
三、创建索引与视图
索引的创建与销毁
索引是一个单独的、物理的数据库结构,是数据库的一个表中所包含的值的列表,其中 注明了表的各个值所在的存储位置。索引是依赖于表建立的,提供了编排表中数据的方法。打个比方,把数据库看作一本书,把索引看作书的目录,通过目录查找书 中的信息。显然,与没有目录的书相比,这显得方便和快捷。
按存储结构的不同将索引分为两类,簇索引 (ClusteredIndex)和非簇索引(Nonclustered Index)。
CREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name ON { table | view } ( column [ ASC | DESC ] [ ,...n ] ) [ WITH { PAD_INDEX | FILLFACTOR = fillfactor | IGNORE_DUP_KEY | DROP_EXISTING | STATISTICS_NORECOMPUTE | SORT_IN_TEMPDB} [ ,...n] ] [ ON filegroup ]
UNIQUE (DISTINCT):惟一性索引,不允许表中不同的行在索引列上取相同值。若已有相同值存在,则系统给出相关信息,不建此索引。
CLUSTERED/ NONCLUSTERED:聚集和非聚集索引,若为 CLUSTERED,则为聚 集索引,即表中元组按索引项的值排序,并聚集在一起。一个基本表上只能建一个 聚集索引。NONCLUSTERED 表示创建的索引为非聚集索引。缺省时,创建的索引 为非聚集索引。
ASC/DESC:索引表中索引值的排序次序,缺省为 ASC(正序排列)。
索引的销毁
在 SQL 中,无论是簇集索引还是非簇索引,都可以通过 DROP INDEX 关键字销毁。
DROP INDEX (索引名称)
在 SQL Server 中,用 DROP INDEX 语句销毁索引时,我们一定要指明索引所在表 的名字。
使用索引的几点原则
- 对小的数据表来说,使用索引并不能提高检索效率,因此不需对其创建索引。
- 当用户要检索的字段的数据包含有很多数值或很多空值(NULL)时,为该字段创建 索引,会大大提高检索效率。
- 当用户查询表中的数据时,如果查询结果包含的数据(行)较少,一般少于数据总 数的 25%时,使用索引会显著提高查询效率。反之,如果用户的查询操作返回结果 总是包含大量数据,那么索引的用处不大。
- 索引列在 WHERE子句中应频繁使用。
- 我们要先装数据,后建索引。对于大多数的表,总有一批初始数据需要装入。该原则是说,建立表后,我们要先将这些初始数据装入表,然后再建索引,这样可以加快初始数据的录入。如果建表后就建索引,那么在输入初始数据时,每插入一个记
录都要维护一次索引;当然,对于索引来说,早建和晚建都是允许的。- 索引提高了数据检索的速度,但也降低了数据更新的速度。如果要对表中的数据进行大量更新,我们最好先销毁索引,等数据更新完毕再创建索引,这样会
提高效率。- 索引要占用数据库空间。在设计数据库时,我们要把需要的索引空间考虑在内。 我们要尽量把表和它的索引存放在不同的磁盘上,这样会提高查询速度。
四、视图
视图是从一个或多个表中导出的表,其结构和数据是建立在对表的查询基础上的。和表 一样,视图也是包括几个被定义的数据列和多个数据行,但就本质而言,这些数据列和数据 行来源于它所引用的表。所以视图不是真实存在的基础表,而是一张虚表。
创建视图
视图的创建主要由 CREATE VIEW 关键字实现,其数据则由 SELECT 语句定义。
CREATE VIEW [(column1, column2...)] AS SELECT FROM
销毁视图
在 SQL 中,我们可以通过 DROP VIEW 关键字销毁创建的视图。
DROP VIEW (视图名称)
销毁视图,只需在 DROP VIEW 关键字后写入视图的名称就可以了。
视图也有几个原则
- 和表一样,视图必须有唯一的名字。
- 并且视图与表不允许拥有相同的名字。
- 视图的创建个数不受限制,用户可以创建任意多个视图。
- 用户要创建视图,必须从数据库管理员那里得到创建权限。
- 视图可以嵌套,即可以创建视图的视图。
- SQL Server禁止用户在查询语句中使用ORDER BY 子句。
五、SQL查询语句
SELECT语句的完整语法
SELECT [DISTINCT | ALL] select_list
FROM table_name_source
[ WHERE search_condition ]
[ GROUP BY group_by_expression ]
[ HAVING search_condition ]
[ ORDER BY order_expression [ ASC | DESC ] ]
DISTINCT:删除查询结果中相同的行。
ALL:返回查询结果中的所有行。如果没有指定任何一个关键字,那么关键字 ALL 就是默认的关键字。
WHERE:列出搜索标准,用于选择要显示的数据行。
GROUP BY :分组查询结果。
HAVING:列出另外的行选择标准。
ORDER BY : 对 查询结果进行排列。
ASC:升序排列结果。
DESC:降序排列结果。
列的查询
在 SQL 中,查询表中某一列(字段)信息的语法可表示如下
SELECT (表) FROM (字段)
注:在 SQL 语言中,SQL 关键词对大小写不敏感,所以对 SELECT 关键词来说, SELECT、select 或者 Select 都是一样的;然而对于表名或者列名来说,可能对大小写 敏感,这取决于数据库的 DBMS。
使用DISTINCT去除重复数据
SELECT 子句中,我们通过指明 DISTINCT 关键字,可以去除列中的重复数据。
SELECT DISTINCT 表 FROM 字段
多列查询
多列查询只是在 SELECT 关键词后罗列出所要查询的列名并以逗号相互间隔,注意一点,列出的最后一列的名字后面不能加逗号,否则会造成语法错误。
SELECT col1,col2,……,coln FROM table_name
查询所有的列
使用“*”通配符,查询结果将列出表中所有列的元素,而不必指明各列的列名,这在用户不清楚表中各列的列名时非常有用。
SELECT * FROM table_name
六、排序查询
单列排序
按照某一列的顺序(升序)进行排列显示的,即 ORDER BY 子句后面只有一个字段。
SELECT column1, column12,……
FROM table_name_name
ORDER BY column N
注:ORDER BY 子句一定要放在所有子句的最后(无论包含多少子句)。
多列排序
根据 ORDER BY 子句后面列名的顺序确定优先级的, 即查询结果首先按照列 col1 的顺序进行排列,而只有当列 col1 出现相同的信息时,这些相同 的信息再按照列 col2 的顺序进行排列,以此类推。
SELECT col1,col2,……,coln
FROM table_name
ORDER BY col1,col2,……,colm
采用序号进行多列排序
根据列的相对位置(即序号)进行排序。
SELECT col1,col2,……,coln
FROM table_name
ORDER BY i,j,……
反向排序
要实现反向(降序)排序,我们必须使用关键字“DESC”。
SELECT col1,col2,……,coln
FROM table_name
ORDER BY col1 DESC,col2
七、使用WHERE子句定义搜索条件查询
WHERE 子句中定义的搜索条件可以是简单的单值比较条件,也可以使用各种运算符、组合子句条件。
参考资料:
https://learn.microsoft.com/zh-cn/sql/sql-server/editions-and-components-of-sql-server-2019?view=sql-server-ver16
https://learn.microsoft.com/zh-cn/sql/relational-databases/indexes/indexes?view=sql-server-ver16
https://learn.microsoft.com/zh-cn/sql/relational-databases/tables/tables?view=sql-server-ver16
https://learn.microsoft.com/zh-cn/sql/relational-databases/views/views?view=sql-server-ver16