金色的骷髅 发表于 2015-1-16 22:39:30

MSSQL网页编程之SQL查询语句精髓利用扼要

用一个库#bak_database存放这些历史数据。精髓|语句1、复杂查询
复杂的Transact-SQL查询只包含选择列表、FROM子句和WHERE子句。它们分离申明所查询列、查询的
表或视图、和搜刮前提等。
比方,上面的语句查询testtable表中姓名为“张三”的nickname字段和email字段。
SELECTnickname,email
FROMtesttable
WHEREname=张三

(一)选择列表
选择列表(select_list)指出所查询列,它能够是一组列名列表、星号、表达式、变量(包含部分变
量和全局变量)等组成。

1、选择一切列
比方,上面语句显现testtable表中一切列的数据:
SELECT*
FROMtesttable

2、选择部排列并指定它们的显现序次
查询了局汇合中数据的分列按次与选择列表中所指定的列名分列按次不异。
比方:
SELECTnickname,email
FROMtesttable

3、变动列题目
在选择列表中,可从头指定列题目。界说格局为:
列题目=列名
列名列题目
假如指定的列题目不是尺度的标识符格局时,应利用引号定界符,比方,以下语句利用汉字显现列
题目:
SELECT昵称=nickname,电子邮件=email
FROMtesttable

4、删除反复行
SELECT语句中利用ALL或DISTINCT选项来显现表中切合前提的一切行或删除个中反复的数据行,默许
为ALL。利用DISTINCT选项时,关于一切反复的数据行在SELECT前往的了局汇合中只保存一行。

5、限定前往的行数
利用TOPn选项限定前往的数据行数,TOPn申明前往n行,而TOPnPERCENT时,申明n是
暗示一百分数,指定前往的行数即是总行数的百分之几。
比方:
SELECTTOP2*
FROMtesttable
SELECTTOP20PERCENT*
FROMtesttable

(二)FROM子句
FROM子句指定SELECT语句查询及与查询相干的表或视图。在FROM子句中最多可指定256个表或视图,
它们之间用逗号分开。
在FROM子句同时指定多个表或视图时,假如选择列表中存在同名列,这时候应利用工具名限制这些列
所属的表或视图。比方在usertable和citytable表中同时存在cityid列,在查询两个表中的cityid时应
利用上面语句格局加以限制:
SELECTusername,citytable.cityid
FROMusertable,citytable
WHEREusertable.cityid=citytable.cityid
在FROM子句中可用以下两种格局为表或视图指定别号:
表名as别号
表名别号

(二)FROM子句
FROM子句指定SELECT语句查询及与查询相干的表或视图。在FROM子句中最多可指定256个表或视图,
它们之间用逗号分开。
在FROM子句同时指定多个表或视图时,假如选择列表中存在同名列,这时候应利用工具名限制这些列
所属的表或视图。比方在usertable和citytable表中同时存在cityid列,在查询两个表中的cityid时应
利用上面语句格局加以限制:
SELECTusername,citytable.cityid
FROMusertable,citytable
WHEREusertable.cityid=citytable.cityid
在FROM子句中可用以下两种格局为表或视图指定别号:
表名as别号
表名别号
比方下面语句可用表的别号格局暗示为:
SELECTusername,b.cityid
FROMusertablea,citytableb
WHEREa.cityid=b.cityid
SELECT不但能从表或视图中检索数据,它还可以从别的查询语句所前往的了局汇合中查询数据。
比方:
SELECTa.au_fname+a.au_lname
FROMauthorsa,titleauthorta
(SELECTtitle_id,title
FROMtitles
WHEREytd_sales>10000
)ASt
WHEREa.au_id=ta.au_id
ANDta.title_id=t.title_id
此例中,将SELECT前往的了局汇合赐与一别号t,然后再从中检索数据。

(三)利用WHERE子句设置查询前提
WHERE子句设置查询前提,过滤失落不必要的数据行。比方上面语句查询岁数年夜于20的数据:
SELECT*
FROMusertable
WHEREage>20
WHERE子句可包含各类前提运算符:
对照运算符(巨细对照):>、>=、=、<、<=、、!>、!<
局限运算符(表达式值是不是在指定的局限):BETWEEN…AND…
NOTBETWEEN…AND…
列表运算符(判别表达式是不是为列表中的指定项):IN(项1,项2……)
NOTIN(项1,项2……)
形式婚配符(判别值是不是与指定的字符通配格局符合):LIKE、NOTLIKE
空值判别符(判别表达式是不是为空):ISNULL、NOTISNULL
逻辑运算符(用于多前提的逻辑毗连):NOT、AND、OR
1、局限运算符例:ageBETWEEN10AND30相称于age>=10ANDage<=30
2、列表运算符例:countryIN(Germany,China)
3、形式婚配符例:经常使用于含混查找,它判别列值是不是与指定的字符串格局相婚配。可用于char、
varchar、text、ntext、datetime和smalldatetime等范例查询。
可以使用以下通配字符:
百分号%:可婚配恣意范例和长度的字符,假如是中文,请利用两个百分号即%%。
下划线_:婚配单个恣意字符,它经常使用来限定表达式的字符长度。
方括号[]:指定一个字符、字符串或局限,请求所婚配工具为它们中的任一个。
[^]:其取值也[]不异,但它请求所婚配工具为指定字符之外的任一个字符。
比方:
限定以Publishing开头,利用LIKE%Publishing
限定以A开首:LIKE%
限定以A开首外:LIKE[^A]%
4、空值判别符例WHEREageISNULL
5、逻辑运算符:优先级为NOT、AND、OR
(四)查询了局排序
利用ORDERBY子句对查询前往的了局按一列或多列排序。ORDERBY子句的语法格局为:
ORDERBY{column_name}[,…n]
个中ASC暗示升序,为默许值,DESC为降序。ORDERBY不克不及按ntext、text和image数据范例举行排
序。
比方:
SELECT*
FROMusertable
ORDERBYagedesc,useridASC
别的,能够依据表达式举行排序。

2、团结查询
UNION运算符能够将两个或两个以上上SELECT语句的查询了局汇合兼并成一个了局汇合显现,即实行联
合查询。UNION的语法格局为:
select_statement
UNIONselectstatement
selectstatement][…n]
个中selectstatement为待团结的SELECT查询语句。
ALL选项暗示将一切行兼并到了局汇合中。不指定该项时,被团结查询了局汇合中的反复即将只保存一
行。
团结查询时,查询了局的列题目为第一个查询语句的列题目。因而,要界说列题目必需在第一个查询语
句中界说。要春联合查询了局排序时,也必需利用第一查询语句中的列名、列题目大概列序号。
在利用UNION运算符时,应包管每一个团结查询语句的选择列表中有不异数目的表达式,而且每一个查询选
择表达式应具有不异的数据范例,或是能够主动将它们转换为不异的数据范例。在主动转换时,关于数值类
型,体系将低精度的数据范例转换为高精度的数据范例。
在包含多个查询的UNION语句中,其实行按次是自左至右,利用括号能够改动这一实行按次。比方:
查询1UNION(查询2UNION查询3)

3、毗连查询
经由过程毗连运算符能够完成多个表查询。毗连是干系数据库模子的次要特性,也是它区分于别的范例
数据库办理体系的一个标记。
在干系数据库办理体系中,表创建时各数据之间的干系不用断定,常把一个实体的一切信息寄存在
一个表中。当检索数据时,经由过程毗连操纵查询出寄存在多个表中的分歧实体的信息。毗连操纵给用户带
来很年夜的天真性,他们能够在任什么时候候增添新的数据范例。为分歧实体创立新的表,此后经由过程毗连举行
查询。
毗连能够在SELECT语句的FROM子句或WHERE子句中创建,貌同实异在FROM子句中指出毗连时有助于
将毗连操纵与WHERE子句中的搜刮前提辨别开来。以是,在Transact-SQL中保举利用这类办法。
SQL-92尺度所界说的FROM子句的毗连语法格局为:
FROMjoin_tablejoin_typejoin_table

个中join_table指出介入毗连操纵的表名,毗连能够对统一个表操纵,也能够对多表操纵,对统一
个表操纵的毗连又称做自毗连。
join_type指出毗连范例,可分为三种:内毗连、外毗连和交织毗连。内毗连(INNERJOIN)利用比
较运算符举行表间某(些)列数据的对照操纵,并列出这些表中与毗连前提相婚配的数据行。依据所利用
的对照体例分歧,内毗连又分为等值毗连、天然毗连和不等毗连三种。
外毗连分为左外毗连(LEFTOUTERJOIN或LEFTJOIN)、右外毗连(RIGHTOUTERJOIN或RIGHTJOIN)
和全外毗连(FULLOUTERJOIN或FULLJOIN)三种。与内毗连分歧的是,外毗连不但列出与毗连前提相匹
配的行,而是列出左表(左外毗连时)、右表(右外毗连时)或两个表(全外毗连时)中一切切合搜刮前提的
数据行。
交织毗连(CROSSJOIN)没有WHERE子句,它前往毗连表中一切数据行的笛卡尔积,其了局汇合中的
数据行数即是第一个表中切合查询前提的数据行数乘以第二个表中切合查询前提的数据行数。
毗连操纵中的ON(join_condition)子句指出毗连前提,它由被毗连表中的列和对照运算符、逻辑
运算符等组成。
不管哪一种毗连都不克不及对text、ntext和image数据范例列举行间接毗连,但能够对这三种列举行直接
毗连。比方:
SELECTp1.pub_id,p2.pub_id,p1.pr_info
FROMpub_infoASp1INNERJOINpub_infoASp2
ONDATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info)

(一)内毗连
内毗连查询操纵列出与毗连前提婚配的数据行,它利用对照运算符对照被毗连列的列值。内毗连分
三种:
1、等值毗连:在毗连前提中利用即是号(=)运算符对照被毗连列的列值,其查询了局中列出被毗连
表中的一切列,包含个中的反复列。
2、不等毗连:在毗连前提利用除即是运算符之外的别的对照运算符对照被毗连的列的列值。这些
运算符包含>、>=、<=、<、!>、!<和。
3、天然毗连:在毗连前提中利用即是(=)运算符对照被毗连列的列值,但它利用选择列表指出查询
了局汇合中所包含的列,并删除毗连表中的反复列。
例,上面利用等值毗连列出authors和publishers表中位于统一乡村的作者和出书社:
SELECT*
FROMauthorsASaINNERJOINpublishersASp
ONa.city=p.city
又如利用天然毗连,在选择列表中删除authors和publishers表中反复列(city和state):
SELECTa.*,p.pub_id,p.pub_name,p.country
FROMauthorsASaINNERJOINpublishersASp
ONa.city=p.city
(二)外毗连
内毗连时,前往查询了局汇合中的仅是切合查询前提(WHERE搜刮前提或HAVING前提)和毗连前提
的行。而接纳外毗连时,它前往到查询了局汇合中的不但包括切合毗连前提的行,并且还包含左表(左外
毗连时)、右表(右外毗连时)或两个边接表(全外毗连)中的一切数据行。
以下面利用左外毗连将论坛内容和作者信息毗连起来:
SELECTa.*,b.*FROMluntanLEFTJOINusertableasb
ONa.username=b.username
上面利用全外毗连将city表中的一切作者和user表中的一切作者,和他们地点的乡村:
SELECTa.*,b.*
FROMcityasaFULLOUTERJOINuserasb
ONa.username=b.username

(三)交织毗连
交织毗连不带WHERE子句,它前往被毗连的两个表一切数据行的笛卡尔积,前往到了局汇合中的数
据行数即是第一个表中切合查询前提的数据行数乘以第二个表中切合查询前提的数据行数。
例,titles表中有6类图书,而publishers表中有8家出书社,则以下交织毗连检索到的纪录数将等
于6*8=48行。
SELECTtype,pub_name
FROMtitlesCROSSJOINpublishers
ORDERBYtype
限制,如果WHERE子句的查询条件里有不等号(WHEREcoloum!=),MySQL将无法使用索引。类似地,如果WHERE子句的查询条件里使用了函数(WHEREDAY(column)=),MySQL也将无法使用索引。

第二个灵魂 发表于 2015-1-19 20:47:09

groupby子句可以将查询结果分组,并返回行的汇总信息Oracle按照groupby子句中指定的表达式的值分组查询结果。

冷月葬花魂 发表于 2015-2-5 06:43:09

多加的系统视图和实时系统信息这些东西对DBA挑优非常有帮助,但是感觉粒度还是不太细。

小魔女 发表于 2015-2-11 06:57:16

比如,MicrosoftSQLServer2008的某一个版本可以满足现在的这个业务的需要,而且价格还比Oracle11g要便宜,那么这一产品就是适合的。

海妖 发表于 2015-3-1 23:22:58

需要注意的一点,也是我使用过程中发现的一个问题。在建立function->schema->table后,如果在现有的分区表上建立没有显式声明的聚集索引时,分区表会自动变为非分区表。这一点很让我纳闷。

谁可相欹 发表于 2015-3-11 01:10:43

分区表是个亮点!从分区表也能看出微软要做大作强SQLServer的信心。资料很多,这里不详细说。但是重点了解的是:现在的SQLServer2005的表,都是默认为分区表的。因为它要支持滑动窗口的这个特性。这种特性对历史数据和实时数据的处理是很有帮助的。

再现理想 发表于 2015-3-17 17:31:20

发几份SQL课件,以飨阅者

若相依 发表于 2015-3-24 16:01:43

对一张百万级别的表建游标,同时又没有什么过滤条件,取得游标效率是如果直接SQL查询百万条数据;如果再对每条记录做处理,耗时将更长。
页: [1]
查看完整版本: MSSQL网页编程之SQL查询语句精髓利用扼要