SQL Server
常用查询
- 所有数据库名称
SELECT Name FROM Master..SysDatabases ORDER BY Name
- 某库所有表名称
SELECT Name FROM SysObjects Where XType='U' ORDER BY Name
- 某库所有的视图
SELECT Name FROM sysobjects Where xtype='V' ORDER BY Name;
- 查询所有存储过程
select Name from sys.procedures ORDER BY Name;
常用操作
- 重置数据库表
truncate table ${tableName}
字段简介
主要字段:
- Name:对象名
- Object_id:对象标识号,在数据中是唯一的
- Principal_id :架构所有者ID
- Parent_object_id:此对象所属对象的ID,0 = 不是子对象
- Type:对象类型,常用的类型有, AF = 聚合函数 P = SQL 存储过程 V = 视图 TT = 表类型 U = 表(用户定义类型)
- Type_desc:对象类型的说明
- Create_date / Modify_date :创建日期 / 修改日期
- is_ms_shipped:是否为 内部 SQL Server 组建所创建的对象,常用来判断 是否是 系统内置或用户自定义 的对象
脏读
开启读取死锁演示:
- 窗口一
BEGIN TRANSACTION
SELECT top 10 * from table with(xlock);
- 窗口二
SELECT top 10 * from table
此时因为上一个查询拥有锁,且事务没有提交。这里就会一直卡住。无法查询到结果。sqlserver withlock的使用
解决方式:
SELECT top 10 * from table with(nolock)
查询结果当做表继续查询
- 表和数据
traceId | count | name |
---|---|---|
001 | 1 | one |
001 | 2 | two |
002 | 2 | three |
002 | 1 | four |
查询需求:
- 将相同 traceId 下,最大 count 的数据查询出来。预期结果:
001 2 two
002 2 three
- 查询实现
select a.* from [test].[dbo].[temp] a,
( SELECT [traceId], max([count]) AS [count] FROM [test].[dbo].[temp] GROUP BY (traceId) ) b
where a.traceId = b.traceId
and a.[count] = b.[count];
数据库的复制
备份还原法
- 备份
数据库右键-》任务-》备份
1) 注意点
备份时,首先将【目标】中的默认路径删除。点击【添加】,指定备份的路径。
- 还原
-
数据库右键-》任务-》-》还原-》数据库
-
【源设备】-》右边的省略号选择刚才的备份文件
- 因为数据库正在使用,所以无法获得对数据库的独占访问权
1) 右键数据库“Dsideal_school_db”,然后选择【属性】
2) 在出现的“数据库属性 — Dsideal_school_db ”对话框中,选择“选项”,在“其他选项”下的“状态”中找到“限制访问”。选择【SINGLE_USER】,点击【确定】按钮,
分离附加法
你可能会问。既然备份还原已经有了。为什么还有这个? 备份还原法比较安全,但是相对速度较慢。比如数据库有200G及其以上,可能要耗费较多的时间和空间。
- 分离之后,在【附加】时可以指定附加成为目标数据库的名称。
使用sa登录SQL Server2008附加数据库,附加之后数据库为只读的,然后点数据库–>“属性”–>“选项”–>“状态”,发现“数据库为只读”这一项为True,改为false, 如果能够修改的话,那么恭喜你,你的人品不错哦!
导入导出法
这个使用起来也比较简单。
- 插入只读列报错
- 导入的时候指定查询条件
-
不支持多条语句同时执行。
-
执行的时候不需要带数据库的名称。
表之间的复制
- 跨数据的更新
如下两种方式都行,推荐第二种方式
1、两种嵌套
update [blog].[dbo].[user] set name=(
select [blog_dev].[dbo].[user].name FROM [blog_dev].[dbo].[user]
where [blog].[dbo].[user].id=[blog_dev].[dbo].[user].id );
2、条件或者外联也行
UPDATE b
SET b.name = a.name,
b.age = a.age
FROM [blog_dev].[dbo].[user] as a, [blog].[dbo].[user] as b
WHERE a.id = b.id;
SQL SERVER index
联合索引和MySQL不一样。不会自动为每一个字段都添加索引。
联合索引使用结论:
1) 查询条件中出现联合索引第一列,或者全部,则能利用联合索引.
2) 条件列中只要条件相连在一起,以本文例子来说就是:
last_name=’1′ and first_name=’1′
与
first_name=’1′ and last_name=’1′
,无论前后,都会利用上联合索引.
3) 查询条件中没有出现联合索引的第一列,而出现联合索引的第二列,或者第三列,都不会利用联合索引查询.
单一列索引的应用结论:
1) 只要条件列中出现索引列,无论在什么位置,都能利用索引查询
两者的共同点:
1) 要想利用索引,都要符合SARG标准.
2) 都是为了提高查询速度.
3) 都需要额外的系统开销,磁盘空间.
补充说明: stmtText信息来产生,在查询语句前面加上:SET STATISTICS PROFILE on.可以通过运行它,来观察你的查询是否合理,这样才能真正做到优化.
本文主旨:讨论什么情况下能利用上索引.
索引:创建索引可以根据查询业务的不同分为两种:单一列的索引,联合索引. 顾名思义,单一列索引就是指在表的某一列上创建索引,联合索引是在多个列上联合创建索引.
优缺点比较:
1) 索引所占用空间:单一列索引相对要小.
2) 索引创建时间:单一列索引相对短.
3) 索引对insert,update,delete的影响程序:单一列索引要相对低.
4) 在多条件查询时,联合索引效率要高.
索引的使用范围: 单一列索引可以出现在 where 条件中的任何位置, 而联合索引需要按一定的顺序来写.
缺少结构
直接 【安全性】=》【架构】=》右键【新建架构】=》输入对应架构名称。所有者为dbo即可。
Xml
SELECT * FROM table_name
where MsgBody.exist('/Task/Parameters/key[@value="file_name"]')=1
xPath 语法。