SQL serversqlserver的查询语句句

SQL(STructured Query Language)是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统。SQL同时也是的扩展名。SQL是高级的非过程化编程语言,允许用户在高层数据结构上工作。他不要求用户指定对数据的存放方法,也不需要用户了解具体的数据存放方式,所以具有完全不同底层结构的不同数据库系统可以使用相同的SQL语言作为数据输入与管理的接口。它以记录集合作为操作对象,所有SQL语句接受集合作为输入,返回集合作为输出,这种集合特性允许一条SQL语句的输出作为另一条SQL语句的输入,所以SQL语句可以嵌套,这使他具有极大的灵活性和强大的功能,在多数情况下,在其他语言中需要一大段程序实现的功能只需要一个SQL语句就可以达到目的,这也意味着用SQL语言可以写出非常复杂的语句。
SQL简介/sql查询语言
SQL是英文Structured Query Language的缩写,意思为。SQL语言的主要功能就是同各种建立联系,进行沟通。按照ANSI(美国国家标准协会)的规定,SQL被作为管理系统的标准语言。SQL语句可以用来执行各种各样的操作,例如更新数据库中的数据,从数据库中提取数据等。目前,绝大多数流行的关系型数据库管理系统,如, , , 等都采用了SQL语言标准。虽然很多数据库都对SQL语句进行了再开发和扩展,但是包括Select, Insert, Update, Delete, Create,以及Drop在内的标准的SQL命令仍然可以被用来完成几乎所有的数据库操作。
结构化查询语言(Structured Query Language)最早是的圣约瑟研究实验室为其关系数据库管理系统SYSTEM R开发的一种查询语言,它的前身是SQUARE语言。SQL语言结构简洁,功能强大,简单易学,所以自从IBM公司1981年推出以来,SQL语言得到了广泛的应用。如今无论是像、、Informix、SQL Server这些大型的数据库管理系统,还是像Visual Foxporo、PowerBuilder这些PC上常用的数据库开发系统,都支持SQL语言作为查询语言。
SQL Server
是一个关系数据库管理系统它最初是由Microsoft Sybase 和Ashton-Tate三家公司共同开发的于1988 年推出了第一个OS/2 版本在Windows NT 推出后Microsoft与Sybase 在SQL Server 的开发上就分道扬镳了Microsoft 将SQL Server 移植到Windows NT 系统上专注于开发推广SQL Server 的Windows NT 版本Sybase 则较专注于SQL Server在操作系统上的应用在本书中介绍的是Microsoft SQL Server 以后简称为SQL Server或MS SQL Server .
SQL Server 2000 是Microsoft 公司推出的SQL Server 数据库管理系统的最新版本该版本继承了SQL Server 7.0 版本的优点同时又比它增加了许多更先进的功能具有使用方便可伸缩性好与相关软件集成程度高等优点可跨越从运行Microsoft Windows 98 的膝上型电脑到运行Microsoft Windows 2000 的大型多处理器的服务器等多种平台使用.
SQL语言包含4个部分:
1.&数据定义语言(DDL),例如:CREATE、DROP、ALTER等语句。&DDL 用于定义和管理物件,例如资料库、资料表以及检视表,DDL 陈述式通常包括每个物件的CREATE、ALTER 以及 DROP 命令
2.&数据操作语言(DML),例如:INSERT、UPDATE、DELETE语句。DML 利用 INSERT、SELECT、UPDATE 及 DELETE 等陈述式来操作资料库物件所包含的资料。
3.数据查询语言(),例如:SELECT语句。 UPDATE 陈述式用来更新或改变一列或多列中的值。
4.数据控制语言(DCL),例如:GRANT、REVOKE、COMMIT、ROLLBACK等语句。
DCL是用来管理数据库的语言。包含管理权限及数据更改。
SQL查询语句大全/sql查询语言
一、简单查询 简单的Transact-SQL查询只包括选择列表、FROM子句和WHERE子句。它们分别说明所查询列、查询的表或视图、以及搜索条件等。例如,下面的语句查询testtable表中姓名为"张三"的nickname字段和email字段。
SELECT nickname,emailFROM testtableWHERE name='张三'
(一) 选择列表
选择列表(select_list)指出所查询列,它可以是一组列名列表、星号、表达式、变量(包括局部变量和全局变量)等构成。
1、选择所有列
例如,下面语句显示testtable表中所有列的数据:
SELECT *FROM testtable
2、选择部分列并指定它们的显示次序
查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。例如:
SELECT nickname,emailFROM testtable
3、更改列标题
在选择列表中,可重新指定列标题。定义格式为:列标题=列名列名 列标题如果指定的列标题不是标准的标识符格式时,应使用引号定界符,例如,下列语句使用汉字显示列标题:
SELECT 昵称=nickname,电子邮件=emailFROM testtable
4、删除重复行
SELECT语句中使用ALL或DISTINCT选项来显示表中符合条件的所有行或删除其中重复的数据行,默认为ALL。使用DISTINCT选项时,对于所有重复的数据行在SELECT返回的结果集合中只保留一行。
5、限制返回的行数
使用TOP n [PERCENT]选项限制返回的数据行数,TOP n说明返回n行,而TOP n PERCENT时,说明n是表示一百分数,指定返回的行数等于总行数的百分之几。例如:
SELECT TOP 2 *FROM testtableSELECT TOP 20 PERCENT *FROM testtable
(二)FROM子句
FROM子句指定SELECT语句查询及与查询相关的或。在FROM子句中最多可指定256个表或视图,它们之间用逗号分隔。在FROM子句同时指定多个表或视图时,如果选择列表中存在同名列,这时应使用对象名限定这些列所属的表或视图。例如在usertable和citytable表中同时存在cityid列,在查询两个表中的cityid时应使用下面语句格式加以限定:
SELECT username,citytable.cityidFROM usertable,citytableWHERE usertable.cityid=citytable.cityid
在FROM子句中可用以下两种格式为表或视图指定别名:表名 as 别名表名 别名
例如上面语句可用表的别名格式表示为:
SELECT username,b.cityidFROM usertable a,citytable bWHERE a.cityid=b.cityid
SELECT不仅能从表或视图中检索数据,它还能够从其它查询语句所返回的结果集合中查询数据。
SELECT a.au_fname+a.au_lnameFROM authors a,titleauthor ta(SELECT title_id,titleFROM titlesWHERE ytd_sales&10000) AS tWHERE a.au_id=ta.au_idAND ta.title_id=t.title_id
此例中,将SELECT返回的结果集合给予一别名t,然后再从中检索数据
三) 使用WHERE子句设置查询条件
WHERE子句设置查询条件,过滤掉不需要的数据行。例如下面语句查询年龄大于20的数据:
SELECT *FROM usertableWHERE age&20
WHERE子句可包括各种条件运算符:比较运算符(大小比较):&、&=、=、、!&、!=10 AND age、&=、、!。3、自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询结果集合中所包括的列,并删除连接表中的重复列。例,下面使用列出authors和publishers表中位于同一城市的作者和出版社:
SELECT *FROM authors AS a INNER JOIN publishers AS pON a.city=p.city又如使用自然连接,在选择列表中删除authors 和publishers 表中重复列(city和state):SELECT a.*,p.pub_id,p.pub_name,p.countryFROM authors AS a INNER JOIN publishers AS pON a.city=p.city
(二)外连接内连接时,返回查询结果集合中的仅是符合查询条件( WHERE 搜索条件或 HAVING 条件)和连接条件的行。而采用外连接时,它返回到查询结果集合中的不仅包含符合连接条件的行,而且还包括左表(左外连接时)、右表(右外连接时)或两个边接表(全外连接)中的所有数据行。如下面使用左外连接将论坛内容和作者信息连接起来:
SELECT a.*,b.* FROM luntan LEFT JOIN usertable as bON a.username=b.username
下面使用全外连接将city表中的所有作者以及user表中的所有作者,以及他们所在的城市:
SELECT a.*,b.*FROM city as a FULL OUTER JOIN user as bON a.username=b.username
(三)交叉连接交叉连接不带WHERE 子句,它返回被连接的两个表所有数据行的笛,返回到结果集合中的数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。例,titles表中有6类图书,而publishers表中有8家出版社,则下列交叉连接到的记录数将等于6*8=48行。SELECT type,pub_nameFROM titles CROSS JOIN publishersORDER BY type
&|&相关影像
互动百科的词条(含所附图片)系由网友上传,如果涉嫌侵权,请与客服联系,我们将按照法律之相关规定及时进行处理。未经许可,禁止商业网站等复制、抓取本站内容;合理使用者,请注明来源于www.baike.com。
登录后使用互动百科的服务,将会得到个性化的提示和帮助,还有机会和专业认证智愿者沟通。
此词条还可添加&
编辑次数:12次
参与编辑人数:4位
最近更新时间: 09:58:58
贡献光荣榜
扫码下载APP豆丁微信公众号
君,已阅读到文档的结尾了呢~~
sql查询语句错误
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
sql查询语句错误
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='http://www.docin.com/DocinViewer--144.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口在 SegmentFault,学习技能、解决问题
每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。
问题对人有帮助,内容完整,我也想知道答案
问题没有实际价值,缺少关键内容,没有改进余地
问题:列出每个职工经手的具有最高金额的订购单信息。 select * from suguanquan.订购单 a where 金额=(select MAX(金额) from suguanquan.订购单 b where a.职工号=b.职工号)order by 职工号 ASC
这查询方式可用嵌套查询的方式来替换么?如果有请写出替换代码。
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
你是想转为非相关子查询吧,这个没办法转,不过可以转化为连接
select o1.* from 订单 a1
join 订单 a2
on(a1.职工=a2.职工)
group by o1.职工
having a1.金额=max(a2.金额);
连接速度应该要比子查询快,在有索引的时候。
分享到微博?
关闭理由:
删除理由:
忽略理由:
推广(招聘、广告、SEO 等)方面的内容
与已有问题重复(请编辑该提问指向已有相同问题)
答非所问,不符合答题要求
宜作评论而非答案
带有人身攻击、辱骂、仇恨等违反条款的内容
无法获得确切结果的问题
非开发直接相关的问题
非技术提问的讨论型问题
其他原因(请补充说明)
我要该,理由是:
在 SegmentFault,学习技能、解决问题
每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。SQLServer调优:查询语句运行几个指标值监测
上一篇我们分析了查询优化器的工作方式,其中包括:查询优化器的详细运行步骤、筛选条件分析、索引项优化等信息。
本篇我们分析在我们运行的过程中几个关键指标值的检测。
通过这些指标值来分析语句的运行问题,并且分析其优化方式。
通过本篇我们可以学习到调优中经常利用的几个利器!
废话少说,开始本篇的正题。
版本为SQL Server2008R2,利用微软的一个更简洁的案例库(Northwind)进行分析。
利器一、IO统计
通过这个IO统计能为我们分析出当前查询语句所要扫描的数据页的数量。这里面有几个重要的概念,我们依次分析。
方法很简单,一行代码搞定:
SET STATISTICS IO ON
来看个例子
SET STATISTICS IO ON
SELECT * FROM Person.Contact
这里可以看到这个语句对于数据表的操作次数,基于数据页的扫描项。
所谓的数据页就是数据库的底层数据存储方式,SQL Server以数据页的形式存储表行数据。每个数据页为8K,
8K=8192字节-96字节(页头)-36字节(行偏移)=8060字节
也就说一个数据页存储的纯数据内容为8060字节。
我们依次来解释上面出现几个读取的概念:
表示处理查询所需要访问页的总数。也就是说要完成一个查询语句需要读取的数据页的总数。
这里的数据页有可能来自内存,也有可能来自硬盘读取。
这个就是说来自硬盘读取的数据页数。我们知道SQL Server每次都会将读取的数据页尽可能存在于内存中,以方便下一次直接读取,提升读取速度。
所以在这里关于存储于内存中的数据页下次访问的概率,提出了一个指标:缓存命中率
缓存命中率=(逻辑读&物理读)/逻辑读
提出这个指标的提出其实就是为了衡量内存中缓存的数据页的有效性。比如:假如缓存与内存中的数据页就使用一次就不使用了,对于这种就应该及时从内存中清除掉,毕竟对于内存资源来说是非常昂贵的。应该用它来缓存命中率高的数据页。
预读其实就是SQL语句在优化的时候预先读取到内存中的数据页数。这个预先读取的数据页是提前评估出来的,也就是上一篇我们文章中介绍的查询优化器要做的事情。
当然,这些预读的数据页有时候不是所有的都要用到,但是它基本能涵盖到查询用到的数据页。
这里要提示一下,预读数据是通过另外一个线程进行读取的和语句优化线程非用同一线程,并行运行,目的是快速获取数据,提升查询获取的速度。
从这个指标我们可以分析出很多问题,来举个例子:
我们新添加一张测试表,脚本如下
--执行下面脚本新生成一张表
INTO NewOrders
FROM Orders
--新增加一列
ALTER TABLE NewOrders
ADD Full_Details CHAR(2000) NOT NULL DEFAULT 'full details'
然后利用如下脚本来看下这张表的大小
EXEC sp_spaceused NewOrders,TRUE
我们可以看到这张表数据页的总大小为2216KB,我们知道一页为8KB,可以推断出这个表的数据页有:
2216(数据页总大小)/8(一个数据页大小)=277页
也就是说这个数据表有277个数据页。
当然,我们也可以通过如下DMV视图来查看该页的数据页数
FROM SYS.dm_db_index_physical_stats
(DB_ID('Northwind'),object_id('NewOrders'),NULL,NULL,'detailed')
经过上面的分析,
我们可以推测,在查询这张表做全表扫描的时候,理论的数据页的逻辑读数就应该为277次
通过如下语句验证下
--先清空缓存数据,生产机慎用
DBCC DROPCLEANBUFFERS
SET STATISTICS IO ON
SELECT * FROM NewOrders
这里的逻辑读取为1047页,和我们上面的推断277页不相符...擦...神马原因!!!
这里就是我们要分析的数据页Forwarded record现象造成的。因为我们在新建立的表,在后面新添加的一列数据:Full_Details,类型为CHAR(2000)的数据列,当数据行中的变长列增长使得原有页无法容纳下数据行时,数据将会移动到新的页中,并在原位置留下一个指向新页的指针,这就是所谓的: Forwarded record
我们可以通过如下DMV视图,查看该表的Forwarded Record形成的页有多少
FROM SYS.dm_db_index_physical_stats
(DB_ID(N'Northwind'),object_id('NewOrders'),NULL,NULL,'detailed')
纠正一下:上图的770数据页为Forwarded Record页,非拆分页的概念(感谢院友 wy123 指出)。
看到了,这里的Forwarded Record页为770页,那么我们就可以推测出我们的逻辑读数量来了
277(原数据页)+770(Forwarded Record页)=1047页
所以上面的我们的问题就分析出原因了。
我们通过此表也展示了一个Forwarded Record页的问题:会影响查询性能。
解决的方式很多种,最简单的方式就是重建聚集索引。
CREATE CLUSTERED INDEX orderID_C ON NewOrders(OrderID)
DROP INDEX NewOrders.orderID_C
SET STATISTICS IO ON
SELECT * FROM NewOrders
通过IO统计项,除了可以分析出上面的Forwarded Record页造成的碎片外,更重要的地方使用来对比不同查询语句之间的读取次数,通过降低读取的次数来优化语句。
关于预读的情况,我们在前面已经分析了,其数据时通过另外一个线程在T-SQL查询语句优化的时候进行数据的预加载。
所以这个线程在预读数据的时候其实是有一个参考值的,根据这个参考值读取出来的数据才能保证大部分数据是有用的,也就是提高上面提到的缓存命中率。
关于这个参考值,我分析了下,其实是分为两中情况分析的。
首先、如果是数据表为堆表,SQL Server获取的方式只能通过全表扫描了。而此方式为了避免重复读取,增加消耗,所以一次的预读并非读取一个数据页,
而是一段物理上的连续64个页
来看联机丛书的官方解释:
预读机制允许数据库引擎从一个文件中读取最多 64 个连续页 (512KB)。该读取作为缓冲区高速缓存中相应数量(可能是非相邻的)缓冲区的一次散播-聚集读取来执行。如果此范围内的任何页在缓冲区高速缓存中已存在,当读取完成时,所读取的相应页将被放弃。如果相应页在缓存中已存在,也可以从任何一端&裁剪&页的范围。
所以,如果我们的表在物理上不是连续页,那么读取次数就不好怎么确定了。
我们来看个堆表的例子
SET STATISTICS IO ON
--新建个测试表
SELECT * INTO NewOrders_TEST FROM NewOrders
SELECT * FROM NewOrders_TEST
这里预读的次数为8次,所以我估计底层的数据页肯定不是连续的。所以造成了多出了3次。
我们可以DBCC IND()进行查询下,来验证下我的推断。
DBCC IND('Northwind','NewOrders_TEST',1)
数据信息比较多,我将其粘贴到Excel中,然后做了一个折线图,其中涂掉的部分其实是没有数据页的,所以不会产生一次读取。
关于读取顺序标示的也有点问题,不过确定的总数肯定是8次.....
希望这种方式,各位看官能看懂了...希望我也表述明白了。
其次、如果表非堆表,也就是说存在聚集索引项,那么好了,SQL Server很轻松的找到了它预读的参考依据:统计信息。
并且,我们知道数据以B-Tree数存储,读取的数据页都存在与叶子节点。所以基本没有了什么连续读取的感念。
一个叶子节点就是一个数据页,一个数据页就是一次预读。
来看个例子:
我们将上面的表添加上聚集索引项,再一次清空缓存,执行查询,脚本如下
CREATE CLUSTERED INDEX NewOrders_TESTIndex ON NewOrders_TEST(OrderID)
SELECT * FROM NewOrders_TEST
这里添加了聚集索引,SQL Server仿佛一下看到了救星,根据统计信息,预读数据就可以。
所以如果统计信息有错误,就造成了预读的乱读取....然后严重降低了缓存命中率.....然后严重增加了内存中换出换入的速度....增加了CPU....
好了,咱们继续文章,上面我们提到的这个预读数据行,可以在如下DMV中查到。
FROM SYS.dm_db_index_physical_stats
(DB_ID(N'Northwind'),object_id('NewOrders_TEST'),NULL,NULL,'detailed')
从这个DMV视图中可以看到这种表统计信息为277个数据页,所以形成了277次预读。
但是,事实这个数据表是279页,也就是说统计的信息有问题,造成了少读读取了2个数据页,而为了弥补这个统计过失就出现了2次物理读,重新从硬盘中获取。
利器二、时间统计
关于时间统计这个很简单,就是统计T-SQL执行语句执行时间项,包括CPU占用时间、语句编译时间、语句执行总时间等项。
使用方法也很简单,一行代码
SET STATISTICS TIME ON
通过这个参数,可以分析出以上信息,其作用主要是用来对比查询语句调优中的执行时间,我们的目标就是降低执行时间。
举例:我们通过开启时间统计,来对比下,上面的查询语句,在第一次运行和以后运行(数据已经缓存)的时间对比,了解下缓存的重要性
再次执行的时间
缓存追踪(补充于日)
当然我们也可以再深入一点,如果想查看该部分数据在内存中缓存的明细,可以通过如下DMV脚本查看
SELECT * FROM sys.dm_os_buffer_descriptors
WHERE DB_NAME(database_id)='Northwind'
AND page_type='DATA_PAGE'
ORDER BY page_id
也可以通过该DMV分析出各个库在内存中占据的大小比例,脚本如下:
--清除缓存
dbcc dropcleanbuffers
--查看缓存内容中在内存大小
SELECT COUNT(*)*8/1024 as 'Cached Size(MB)'
,CASE database_id
WHEN 32767 THEN 'ResourceDB'
ELSE DB_NAME(database_id)
END AS 'Database'
FROM sys.dm_os_buffer_descriptors
GROUP BY DB_NAME(database_id),database_id
ORDER BY 'Cached Size(MB)' DESC
经过这次查询,这张表已经全部缓存到内存里了,因为整张表总共就2MB的大小
文章已经有点长度了...先到此吧。
关于调优内容太广泛,我们放在以后的篇幅中介绍,有兴趣的可以提前关注。求sql的复合查询语句
[问题点数:40分,结帖人doubagui]
求sql的复合查询语句
[问题点数:40分,结帖人doubagui]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
2007年12月 VB大版内专家分月排行榜第三
2007年12月 VB大版内专家分月排行榜第三
2016年4月荣获微软MVP荣誉称号2015年4月荣获微软MVP称号2014年4月 荣获微软MVP称号
2016年7月 MS-SQL Server大版内专家分月排行榜第一
匿名用户不能发表回复!|

我要回帖

更多关于 sqlserver子查询语句 的文章

 

随机推荐