SELECT语句执行的过程是:

1>. FROM
2>. WHERE
3>. GROUP BY
4>. HAVING
5>. SELECT
6>. ORDER BY

WHERE子句在SELECT子句之前执行,所以在SELECT中的列别名,WHERE中当然是不会认识的。

 

Order by和Top语句一起的时候,执行的顺序就不同了。先order by 进行排序,然后在取Top前X条记录。

eg:SELECT TOP 10000 * FROM OrderDetail
ORDER BY OrderDetailID DESC
上面语句是取OrderDetail表中的最后1W条记录。

 

-----------------------------------------------------------------------------------------------------------------------

一.FOR XML PATH 简单介绍

FOR XML PATH 有的人可能知道有的人可能不知道,其实它就是将查询结果集以XML形式展现,有了它我们可以简化我们的查询语句实现一些以前可能需要借助函数活存储过程来完成的工作。那么以一个实例为主。

使用FOR XML PATH('')),1,1,'')语句。

例如表
fieldname
-----------
AAA
BBB
CCC
串联之后就是字符串: AAA,BBB,CCC

 二.一个应用场景与FOR XML PATH应用

        首先呢!我们在增加一张学生表,列分别为(stuID,sName,hobby),stuID代表学生编号,sName代表学生姓名,hobby列存学生的爱好!那么现在表结构如下:

这时,我们的要求是查询学生表,显示所有学生的爱好的结果集,代码如下:

SELECT B.sName,LEFT(StuList,LEN(StuList)-1) as hobby FROM (
SELECT sName,
(SELECT hobby+',' FROM student 
  WHERE sName=A.sName 
  FOR XML PATH('')) AS StuList
FROM student A 
GROUP BY sName
) B

结果如下:

分析: 好的,那么我们来分析一下,首先看这句:

SELECT hobby+',' FROM student
  WHERE sName=A.sName
  FOR XML PATH('')

这句是通过FOR XML PATH 将某一姓名如张三的爱好,显示成格式为:“ 爱好1,爱好2,爱好3,”的格式!

那么接着看:

剩下的代码首先是将表分组,在执行FOR XML PATH 格式化,这时当还没有执行最外层的SELECT时查询出的结构为:

可以看到StuList列里面的数据都会多出一个逗号,这时随外层的语句:SELECT B.sName,LEFT(StuList,LEN(StuList)-1) as hobby 就是来去掉逗号,并赋予有意义的列明!

二、with (nolock)的介绍和使用。

为了性能,往往会在表后面加一个nolock,或者是with(nolock),其目的就是查询是不锁定表,从而达到提高查询速度的目的。

什么是并发访问:同一时间有多个用户访问同一资源,并发用户中如果有用户对资源做了修改,此时就会对其它用户产生某些不利的影响,例如:

1:脏读,一个用户对一个资源做了修改,此时另外一个用户正好读取了这条被修改的记录,然后,第一个用户放弃修改,数据回到修改之前,这两个不同的结果就是脏读。(即B用户读取了一个A用户没有提交事务的数据(rollback transaction),这样读出来的数据是属于脏数据)

小结:NOLOCK 语句执行时不发出共享锁,允许脏读 ,等于 READ UNCOMMITTED事务隔离级别
nolock确实在查询时能提高速度,但它并不是没有缺点的,起码它会引起脏读。

nolock的使用场景(个人观点):

NOLOCK 可能把没有提交事务的数据也显示出来.

1:数据量特别大的表,牺牲数据安全性来提升性能是可以考虑的;

2:允许出现脏读现象的业务逻辑,反之一些数据完整性要求比较严格的场景就不合适了,像金融方面等。

3:数据不经常修改的表,这样会省于锁定表的时间来大大加快查询速度。

综上所述,如果在项目中的每个查询的表后面都加nolock,这种做法并不科学,起码特别费时间,不如行版本控制来的直接有效。而且会存在不可预期的技术问题。应该有选择性的挑选最适合的表来放弃共享锁的使用。

最后说下nolockwith(nolock)的几个小区别:

1:SQL05中的同义词,只支持with(nolock);

2:with(nolock)的写法非常容易再指定索引。

跨服务器查询语句时 不能用with (nolock)
只能用nolock
同一个服务器查询时
with (nolock)和nolock都可以用
比如

SQL code

select * from [IP].a.dbo.table1 with
(nolock) 这样会提示用错误select * from a.dbo.table1
with (nolock) 这样就可以

 三、数据表死锁

如果对某一个进行了事务操作,如果该操作最后完成没有提交事务或者回滚事务。则表差生死锁状态。

例如:

BEGIN TRANSACTION

insert into tableA values(。。。。)

此时没有Commit transaction或者Rollback transaction操作,则tableA将被死锁。

四、Output和Output into 语句的使用。

参考CSDN资料:http://msdn.microsoft.com/zh-cn/library/ms177564(SQL.105).aspx#

A. 将 OUTPUT INTO 用于简单 INSERT 语句

以下示例将行插入soloreztest表,并使用 OUTPUT 子句将语句的结果返回到 @mytable table 变量中
declare @mytable table
(
  id int identity(1,1) primary key,
  name varchar(50)
)
insert into soloreztest output inserted.name into @mytable values('147')
select * from soloreztest
select * from @mytable

结果是:
 

output    into子句是将向soloreztest表里面的数据同步的插入的@mytable的表变量里面
  output 子句则只是用于显示被改变的数据INSERTED 或 DELETED 前缀
  inserted 前缀:用于检索新插入表中或是更新后的数据的数据 可用与insert和update语句中不能在delete语句中出现
  deleted 前缀: 用于检索被删除或是更新前的数据 可用与delete和update语句中不能在insert 语句中出现

B. 将 OUTPUT 用于 DELETE 语句
   以下实例是将在表中soloreztest删除行是放回被删除行的信息
     delete soloreztest  output deleted.* where id=2

同理以上也可使用会 output into语句将被删除的信息插入到一个新表中

C. 将 OUTPUT  用于 UPDATE
以下实例将在表中更新数据是使用output 返回修改前的数据和修改后的数据
update soloreztest   set name='zz' output  inserted.name,deleted.name where id=3

inserted.name:表示的是在 soloreztest表中更新后的数据内容。
deleted.name :表示的是在soloreztest表中的更新前的数据内容。

四、with as 语句

参考文章:http://www.cnblogs.com/fygh/archive/2011/08/31/2160266.html

好处:

1) WITH AS存储过程中使用,声明了就一定要用,不然会报错.

2) 存储过程中如果有select 好像就一定得有into......

3) 复杂的查询会产生很大的sql,with as语法显示一个个中间结果,显得有条理些,可读性提高

4) 前面的中间结果可以被语句中的select或后面的中间结果表引用,类似于一个范围仅限于本语句的临时表,在需要多次查询某中间结果时可以提升效率

例子:
with t as (select * from emp where depno=10)
select * from t where empno=xxx

再举个简单的例子

with a as (select * from test)

select * from a;

其实就是把一大堆重复用到的SQL语句放在with as 里面,取一个别名,后面的查询就可以用它

这样对于大批量的SQL语句起到一个优化的作用,而且清楚明了

是个临时存储,一般是在存储过程里使用的

可以做多个表的连接,结果集的连接查询

转载于:https://www.cnblogs.com/51net/archive/2012/09/08/2676797.html

SQL语句使用总结(一)相关推荐

  1. 合肥工业大学—SQL Server数据库实验三:SQL语句创建和删除基本表

    SQL语句创建和删除基本表 1. 编写6个基本表 2. 修改基本表结构,完整性约束条件 3. 用Drop table 语句删除基本表 1. 编写6个基本表 设有简单教学管理的6个关系模式如下: 系(系 ...

  2. 怎么查找执行比较慢的sql语句

    一.MySQL数据库有几个配置选项可以帮助我们及时捕获低效SQL语句 1,slow_query_log 这个参数设置为ON,可以捕获执行时间超过一定数值的SQL语句. 2,long_query_tim ...

  3. 练习用基础SQL语句

    http://www.cnblogs.com/zxlovenet/p/3728842.html 本文语句大部分SQL语句来自<数据库系统概论>(第四版)王珊&萨师煊 ,是我们上课用 ...

  4. c语言解析sql语句_sql语句面试50题(Mysql版附解析)

    本人最近在自学sql,从开始学到自己写完本练习50题大概花了12天的时间. 学习路径:<sql基础教程>第1遍(3天)→知乎中的sql网课+leetcode刷题(4天)→牛客网刷题(2天) ...

  5. mysql ef sql语句_EF to MySQL 的 Database.ExecuteSqlCommand 和 SqlQuery

    一: 执行sql语句,返回受影响的行数 在mysql里面,如果没有影响,那么返回行数为  -1 ,sqlserver 里面  还没有测试过(var ctx =  MyDbContext()) { ct ...

  6. db2case语句_DB2 常用的SQL语句

    1.组合语句执行 BEGINATOMIC 表达式1分号空格/回车 表达式2分号空格/回车 END 2.应该限制访问权限的表(应该撤销这些表PUBLIC SELECT访问权) SYSCAT.DBAUTH ...

  7. java批量执行sql语句_Java中批量执行sql语句

    在我们实际项目开发过程中,可能有的功能在后台需要执行几条sql语句甚至需要批量的执行一些sql语句,如果是循环一条一条执行,我想大家都知道这样做的效率特别低,尤其是批量sql时,但是如果我们先循环把整 ...

  8. groovy怎样从sql语句中截取表名_SQL常用的基础查询语句

    数据分析过程中,我们经常可以看到提数的SQL语句,了解SQL常用的基础查询语句,是检验提数逻辑是否正确的途径之一,并且也能更方便使用SMART BI数据分析工具.今天就让小编带大家走进SQL基础查询的 ...

  9. 获取执行SQL语句的返回结果

    最近遇到的问题,在存储过程中需要拼接动态SQL语句,用变量保存,可直接使用EXECUTE SP_EXECUTESQL是不能获取想要的结果的 于是经过baidu了一番后,找到了解决的办法 declare ...

  10. 黑客必知的SQL语句 黑客知道,程序员必知

    SQL语句先前写的时候,很容易把一些特殊的用法忘记,我特此整理了一下SQL语句操作. 一.基础 1.说明:创建数据库 Create DATABASE database-name 2.说明:删除数据库 ...

最新文章

  1. 工作中一些代码优化的地方
  2. 网络推广——网络推广专员是如何进行图像优化的?
  3. JAVA 运行与开发环境配置(二)- hello java
  4. scala外部传入时间参数-亲测有效
  5. 使用tensorflow训练数据时遇到的问题总结
  6. python基础教程(第二版)
  7. Django内建模版标签和过滤器
  8. amd 深度学习模型部署_Web服务部署深度学习模型-续集
  9. 高性能实践IO之Reactor模式
  10. **ML : ML中的最优化方法
  11. Linux重启网卡的方法
  12. 闲鱼的云原生故事:靠什么支撑起万亿的交易规模?
  13. 《极品飞车12》官方网站公布发售日
  14. 写在国产接口管理工具ApiPost 5.2.5发布后的一些话
  15. Python的那些隐藏特性
  16. Linux 系统查看网卡配置信息
  17. Web程序设计(一)
  18. java poi 读合并单元格的内容,poi合并单元格,poi合并单元格并设置内容居中
  19. Mugeda(木疙瘩)H5案例课—H5酷炫特效制作-岑远科-专题视频课程
  20. 单例设计模式,写出几个例子

热门文章

  1. 新星云集!CVPR 论文分享会圆桌论坛:计算机视觉科研​之“路”
  2. CVPR 2021 机器学习及多模态最新进展分享
  3. CVPR 2019 | 今日新出14篇论文汇总(来自微软、商汤、腾讯、斯坦福等)
  4. 快速排序c语言单链表代码,快速排序算法及源代码(C语言)
  5. power bi连接mysql_一起学微软Power BI系列-使用技巧(6) 连接Sqlite数据库
  6. 震惊!单身也要开始交税了!你还没有用Python帮你找一个女朋友吗
  7. 无意中发现的一份清华大佬的代码模版,简洁易懂!
  8. 重磅 | 《机器学习综述》算法分类及特征工程手写笔记
  9. jupyter安装php,Jupyter Notebook 下安装 PHP 内核
  10. 基于RANSAC的激光点云分割