老尸 发表于 2015-1-16 22:21:34

MSSQL网页设计SELECT语句参数详解

mysql的prepare其实是本地PHP客户端模拟的,并没有根据你mysql的设置做字符集的调整。应该交与mysqlserver端做prepare,同时得调用mysql_set_character_set去操作,server才会按照字符集去做转义。SELECT

Name

SELECT--从表或视图中掏出多少行.Synopsis

SELECTexpression[,...])]]*|expressionoutput_name][,...]from_item[,...]]condition]expression[,...]]condition[,...]][{UNION|INTERSECT|EXCEPT}select]expressionoperator][,...]]tablename[,...]]]count|ALL}]start]这里from_item能够是:table_name[*][alias[(column_alias_list)]]|(select)alias[(column_alias_list)]|from_itemjoin_typefrom_itemjoin_condition|USING(join_column_list)]输出

<P>
<p>expression表的列/字段名或一个表达式.
output_name利用AS子句为一个列/字段或一个表达式声明另外一个称号.这个称号次要用于标志输入列用于显现。它能够在ORDERBY和GROUPBY子句里代表列/字段的值.可是output_name不克不及用于WHERE或HAVING子句;用表达式取代.
from_item一个表援用,子查询,大概JOIN子句.详见下文.
condition一个布尔表达式,给出真或假的了局.拜见上面形貌的WHERE和HAVING子句.
select一个选择语句,能够有除ORDERBY,FORUPDATE,和LIMIT子句之外的一切特征(乃至在加了括弧的情形下那些语句也能够用).
<p><P>FROM项能够包含:<p><p>table_name一个现存的表或视图的名字.假如声了然ONLY,则只扫描该表.假如没有声明ONLY,该表和一切其派生表(假如有的话)都被扫描.能够在表名前面跟一个*来暗示扫一切厥后代表,但在今朝的版本里,这是缺省特征.(在PostgreSQL7.1之前的版本里,ONLY是缺省特征.)
alias用于于后面的table_name.的交换名字,用于缩写或打消一个表自毗连时的含糊.(此时统一个表要扫描好几回.)假如写了别号,那末你也能够写一个字段别号列表,为表的一个大概几个字段供应交换名字.
select一个在FORM子句里呈现的子查询.它的输入感化好象是为这条SELECT命令在其保存期里创立一个一时表.请注重这个子查询必需用园括弧包抄.而且必需给它加别号.
join_typeJOIN,LEFTJOIN,RIGHTJOIN,FULLJOIN,或CROSSJOIN.之一.就INNER和OUTER毗连范例,必需呈现NATURALONjoin_condition,或USING(join_column_list)之一.关于CROSSJOIN,下面的项都不克不及呈现.
join_condition一个前提限定.相似WHERE前提,只不外它只使用于在这条JOIN子句里毗连的两个from_item.
join_column_list一个USING字段列表(a,b,...)是ON前提left_table.a=right_table.aANDleft_table.b=right_table.b...的缩写.
<p>输入

<P><p><p>Rows你声明的查询前往的一切了局集的行.
count查询前往的行的计数.
<p>形貌

SELECT将从一个或更多表中前往纪录行。选择的侯选行是满意WHERE前提的一切行。大概假如省略了WHERE语句则选择表中的一切行.(参阅WHERE子句).
实践上,前往的行并非由FROM/WHERE/GROUPBY/HAVING子句间接天生的行;实在,输入行是经由过程给每一个选出的行盘算SELECT输入表达式构成的.你能够在输入列表上写一个*暗示选出的行的一切列.一样我们能够拿table_name.*暗示来自该表的以是行.
DISTINCT将从选择出来的了局会合删除一切的反复的行。ALL(缺省)将前往一切侯选行,包含反复的行。
DISTINCTON删除婚配一切你声明的表达式的行,只保存每一个反复集的第一行。DISTINCTON表达式是用和ORDERBY项一样的划定规矩来注释的,见下文.注重这里每一个反复集的"第一行"是不成意料的,除非我们用ORDERBY来包管我们但愿的行开始呈现。比方,
SELECTDISTINCTON(location)location,time,reportFROMweatherReportsORDERBYlocation,timeDESC;检索出每一个区域的比来的天色预告。可是假如我们没有利用ORDERBY来强迫每一个区域定时间值降续分列,我们失掉的将是每一个区域的不成意料的工夫的呈报。
GROUPBY子句同意用户把表分红婚配一个或多个数值的分歧行的组.(参考GROUPBY子句.)
HAVING同意只选择那些满意声明前提的行组(参阅HAVING子句.)
ORDERBY招致前往的行依照声明的按次分列.假如没有给出ORDERBY,输入的行的按次将以体系以为开支最小的按次发生.(参阅ORDERBY子句.)
多个SELECT查询能够用UNION,INTERSECT,和EXCEPT操纵符组合起来.需要时请利用圆括弧断定这些操纵符的按次.
UNION操纵符盘算是那些介入的查询所前往的行的汇合。假如没有声明ALL,那末反复行被删除.(参阅UNION子句.)
INTERSECT给出两个查询大众的行。假如没有声明ALL,那末反复行被删除.(参阅INTERSECT子句.)
EXCEPT给出存在于第一个查询而不存在于第二个查询的行。假如没有声明ALL,那末反复行被删除.(参阅EXCEPT子句.)
FORUPDATE子句同意SELECT语句对选出的行实行排他锁。
LIMIT子句同意给用户前往一个查询天生的了局的子集。(参阅LIMIT子句.)
你必需有SELECT权限用来从表中读取数值(参阅GRANT/REVOKE语句.)
FROM子句

FROM子句为SELECT声明一个或多个源表.假如声了然多个源表,则观点上了局是一切源表一切行的迪卡尔积---不外一般会增添限定前提以把前往的行限定为迪卡尔积的一个小子集.
假如FROM项是一个复杂表名字,它隐含包含来自该表子表(承继子表)的行.ONLY将打消从该表的子表来的行.在PostgreSQL7.1之前,这是缺省了局,而猎取子表的行是经由过程在表名前面附加*完成的.这类老式性子能够经由过程命令SETSQL_InheritanceTOOFF;猎取.
FROM项也能够是一个加了圆括弧的子查询(请注重子查询必要一一般名子句!).这个特征十分有用,由于这是在一条查询中取得多层分组,会萃,大概排序的独一办法.
最初,FROM项能够是一条JOIN子句,它把两个复杂的FROM项组合在一同.(需要时利用圆括弧来形貌嵌套按次.)
CROSSJOIN或INNERJOIN是复杂的迪卡尔积,和你在顶层FROM里列出这两个项失掉的一样.CROSSJOIN等效于INNERJOINON(TRUE),也就是说,不会有任何行被前提删除.这些毗连范例只是标记上的便当,由于它们做得一点不比你只使用FROM和WHERE来的多.
LEFTOUTERJOIN前往一切切合前提的迪卡尔积(也就是说,一切切合它的ON前提的组合了的行),别的加上一切没有右手边行切合ON前提的左手边表中的行.如许的左手边行经由过程向右手边行拔出NULL扩大为全长.请注重,当判别哪些行及格的时分,只思索JOIN本人的ON或USING.然后才思索外层的ON或WHERE前提.
相反,RIGHTOUTERJOIN前往一切毗连的行,别的加上一切未婚配右手边行(左手边拔出NULL扩大为全长).这个字句只是标记便利,由于你能够互换摆布输出而改用LEFTOUTERJOIN.
FULLOUTERJOIN前往一切毗连行,加上一切未婚配的左手边行(右侧拔出NULL扩大为全长),再加上一切未婚配的右手边行(左手边拔出NULL扩大为全长).
除CROSSJOIN之外的一切JOIN范例,你必需写ONjoin_condition,USING(join_column_list),和NATURAL中的一个.年夜多半情形下会是ON:你能够写触及两个毗连表的任何前提表达式.USING字段列表(a,b,...)是ON前提left_table.a=right_table.aANDleft_table.b=right_table.b...的缩写.别的,USING假定两对等式中只要一个包括在JOIN输入中,而不是两个.NATURAL是说起表中一切类似名字字段的USING列表的缩写.
WHERE子句

可选的WHERE前提有以下罕见的情势:
WHEREboolean_exprboolean_expr能够包括恣意个得出布尔值的表达式。一般表达式会是
exprcond_opexpr或
log_opexpr这里cond_op能够是:=,<,<=,>,>=或,或前提操纵符象ALL,ANY,IN,LIKE等,大概用户界说的操纵符,而log_op能够为:AND,OR,NOT.SELECT将疏忽一切WHERE前提不为TRUE的行.
GROUPBY子句

GROUPBY声明一个分了组的表,该表源于使用利用上面的子句:
GROUPBYexpression[,...]<p>GROUPBY将把一切在组合了的列上共享一样的值的行紧缩成一行。假如存在会萃函数,这些会萃函数将盘算每一个组的一切行,而且为每一个组盘算一个自力的值(假如没有GROUPBY,会萃函数对选出的一切行盘算出一个数值)。存在GROUPBY时,除在会萃函数内里,SELECT输入表达式对任何非组合列的援用都长短法的,由于对一个非组合列会有多于一个大概的前往值。
一个在GROUPBY内里的条目还能够是输入列的称号大概序号(SELECT表达式),大概是一个从输出列的数值构成的恣意表达式.当存在语义含混时,一个GROUPBY称号将被注释成一个输出列/字段称号而不是一个输入列/字段称号.
HAVING子句

可选的HAVING前提有以下情势:
HAVINGboolean_expr这里boolean_expr和为WHERE子句里声明的不异.
HAVING子句声明一个夙昔面的子句的了局会合往除一些不切合boolean_expr.组后分组的表.HAVING与WHERE分歧:WHERE在使用GROUPBY之前过滤出独自的行,而HAVING过滤由GROUPBY创立的行.
在boolean_expr里援用的每一个列/字段应当明晰地指明一个组的列/字段,除非援用在一个会萃函数里。
ORDERBY子句

<p>ORDERBYexpressionoperator][,...]<p>一个ORDERBY项能够是一个输入列(SELECT表达式)的名字大概序数,大概它也能够是任何来自输出列值构成的表达式.在呈现搅浑的场所下,ORDERBY名字将被注释成一个输入名字.
序数指的是列/字段按按次(从左到右)的地位.这个特征可使得对没有一个符合称号的列/字段的排序成为大概.这一点大概永久没有效,由于老是能够经由过程AS子句给一个要盘算的列/字段付与一个称号,比方:
SELECTtitle,date_prod+1ASnewlenFROMfilmsORDERBYnewlen;<p>还能够ORDERBY恣意表达式(一个对SQL92的扩大),包含那些没有呈现在SELECT了局列内外面的域。因而上面的语句如今是正当的:
SELECTnameFROMdistributorsORDERBYcode;这个特征的一个范围就是使用于UNION,INTERSECT,大概EXCEPT查询的ORDERBY子句只能在一个输入字段名大概数字上声明,而不克不及在一个表达式上声明.
请注重假如一个ORDERBY条目是一个婚配了局列和输出列的复杂称号,ORDERBY将把它注释成了局列称号.这和GROUPBY在一样情形下做的选择正相反.如许的纷歧致是由SQL92尺度强迫的.
我们能够给ORDERBY子句里每一个列/字段加一个关头字DESC(降序)或ASC(升序).假如不声明,ASC是缺省.我们还能够声明一个排序操纵符来完成排序。ASC等效于利用<而DESC等效于利用>。
在一个域里,空值排序时排在别的数值后面.换句话说,升序排序时,空值排在开端,而降序排序时空值排在开首.
UNION子句

<p>table_queryUNIONtable_queryexpressionoperator][,...]]count|ALL}[{OFFSET|,}start]]这里table_query标明任何没有ORDERBY,FORUPDATE,大概LIMIT子句的选择表达式.(假如用圆括弧包抄,ORDERBY和LIMIT能够放在子表达式里.假如没有圆括弧,这些子句将交给UNION的了局利用,而不是给它们右手边的输出表达式.)
UNION操纵符的了局集是那些触及到的一切查询所前往了局的汇合。两个做为UNION间接操纵数的SELECT必需天生不异数量的字段,而且对应的字段必需有兼容的数据范例。
缺省地,UNION的了局不包括任何反复的行,除非声了然ALL子句.ALL停止了打消反复的举措.
统一SELECT语句中的多个UNION操纵符是从左向右盘算的,除非用圆括弧举行了标识).
今朝,FORUPDATE不克不及在UNION的了局或输出中声明.
INTERSECT子句

<p>table_queryINTERSECTtable_queryexpressionoperator][,...]]count|ALL}]start]这里table_query声明任何没有ORDERBY,FORUPDATE,大概LIMIT子句的选择表达式。
INTERSECT相似UNION,只不外它给出在两个查询中都呈现的行,而不是两个查询的一切行.
INTERSECT的了局不包括任何反复行,除非你声了然ALL选项.用了ALL今后,一个在L里有m个反复而在R里有n个反复的即将呈现min(m,n)次.
除非用圆括号指明按次,统一SELECT语句中的多个INTERSECT操纵符是从左向右盘算的。INTERSECT比UNION绑定得更紧---也就是说AUNIONBINTERSECTC将读做AUNION(BINTERSECTC),除非你用圆括弧声明.
EXCEPT子句

<p>table_queryEXCEPTtable_queryexpressionoperator][,...]]count|ALL}]start]这里table_query声明任何没有ORDERBY,FORUPDATE,大概LIMIT子句的选择表达式。
EXCEPT相似于UNION,只不外EXCEPT给出存在于右边查询输入而不存在于右侧查询输入的行。
EXCEPT的了局不包括任何反复的行,除非声了然ALL选项.利用ALL时,一个在L中有m个反复而在R中有n个反复的行将呈现max(m-n,0)次.
除非用圆括弧指明按次,统一SELECT语句中的多个EXCEPT操纵符是从左向右盘算的。EXCEPT和UNION绑定级别不异.
LIMIT子句

<p>LIMIT{count|ALL}OFFSETstart这里count声明前往的最年夜行数,而start声明入手下手前往行之前疏忽的行数。
LIMIT同意你检索由查询其他部分天生的行的某一部分。假如给出了限定计数,那末前往的行数不会凌驾哪一个限定。假如给出了一个偏移量,那末入手下手前往行之前会疏忽谁人数目的行。
在利用LIMIT时,一个好习气是利用一个ORDERBY子句把了局行限定成一个独一的按次。不然你会失掉没法意料的查询前往的子集---你大概想要第十行到第二十行,但以甚么按次?除非你声明ORDERBY,不然你不晓得甚么按次。
从PostgreSQL7.0入手下手,查询优化器在天生查询计划时把LIMIT思索出来了,以是你很有大概因给出的LIMIT和OFFSET值分歧而失掉分歧的计划(天生分歧的行序)。因而用分歧的LIMIT/OFFSET值选择分歧的查询了局的子集将不会发生分歧的了局,除非你用ORDERBY强迫天生一个可估计的了局按次。这可不是偏差;这是SQL生来的特性,由于除非用了ORDERBYE束缚按次,SQL不包管查询天生的了局有任何特定的按次。
用法

将表films和表distributors毗连在一同:
SELECTf.title,f.did,d.name,f.date_prod,f.kindFROMdistributorsd,filmsfWHEREf.did=d.didtitle|did|name|date_prod|kind---------------------------+-----+------------------+------------+----------TheThirdMan|101|BritishLion|1949-12-23|DramaTheAfricanQueen|101|BritishLion|1951-08-11|RomanticUneFemmeestuneFemme|102|JeanLucGodard|1961-03-12|RomanticVertigo|103|Paramount|1958-11-14|ActionBecket|103|Paramount|1964-02-03|Drama48Hrs|103|Paramount|1982-10-22|ActionWarandPeace|104|Mosfilm|1967-02-12|DramaWestSideStory|105|UnitedArtists|1961-01-03|MusicalBananas|105|UnitedArtists|1971-07-13|ComedyYojimbo|106|Toho|1961-06-16|DramaTheresaGirlinmySoup|107|Columbia|1970-06-11|ComedyTaxiDriver|107|Columbia|1975-05-15|ActionAbsenceofMalice|107|Columbia|1981-11-15|ActionStoriadiunadonna|108|Westward|1970-08-15|RomanticTheKingandI|109|20thCenturyFox|1956-08-11|MusicalDasBoot|110|BavariaAtelier|1981-11-11|DramaBedKnobsandBroomsticks|111|WaltDisney||Musical(17rows)<p>统计用kind分组的一切影戏和组的列/字段的len(长度)的和:
SELECTkind,SUM(len)AStotalFROMfilmsGROUPBYkind;kind|total----------+-------Action|07:34Comedy|02:58Drama|14:28Musical|06:42Romantic|04:38(5rows)<p>统计一切影戏(films),组的列/字段len(长度)的和,用kind分组而且显现小于5小时的组总和:
SELECTkind,SUM(len)AStotalFROMfilmsGROUPBYkindHAVINGSUM(len)<INTERVAL5hour;kind|total----------+-------Comedy|02:58Romantic|04:38(2rows)<p>上面两个例子是依据第二列(name)的内容对独自的了局排序的典范的办法:
SELECT*FROMdistributorsORDERBYname;SELECT*FROMdistributorsORDERBY2;did|name-----+------------------109|20thCenturyFox110|BavariaAtelier101|BritishLion107|Columbia102|JeanLucGodard113|Lusofilms104|Mosfilm103|Paramount106|Toho105|UnitedArtists111|WaltDisney112|WarnerBros.108|Westward(13rows)<p>这个例子演示怎样取得表distributors和actors的毗连,只将每一个表中以字母W开首的掏出来.由于只取了不相干的行,以是关头字ALL被省略了:
distributors:actors:did|nameid|name-----+------------------+----------------108|Westward1|WoodyAllen111|WaltDisney2|WarrenBeatty112|WarnerBros.3|WalterMatthau......SELECTdistributors.nameFROMdistributorsWHEREdistributors.nameLIKEW%UNIONSELECTactors.nameFROMactorsWHEREactors.nameLIKEW%name----------------WaltDisneyWalterMatthauWarnerBros.WarrenBeattyWestwardWoodyAllen<p>兼容性

扩大

PostgreSQL同意我们在一个查询里省略FROM子句。这个特征是从最后的PostQuel查询言语里保存上去的它的最间接用处就是盘算复杂的常量表达式的了局:
SELECT2+2;?column?----------4别的有些DBMS不克不及这么做,除非引进一个单行的伪表做select的from.这个特征的别的一个不太分明的用处是把一个一般的从一个或多个表的select缩写:
SELECTdistributors.*WHEREdistributors.name=Westward;did|name-----+----------108|Westward如许也能够运转是由于我们给查询中援用了但没有在FROM中提到的每一个表都加了一个隐含的FROM项.只管这是个很便利的写法,但它却简单误用.好比,上面的查询
SELECTdistributors.*FROMdistributorsd;大概就是个毛病;用户最有大概的意义是
SELECTd.*FROMdistributorsd;而不是上面的他实践上失掉的无束缚的毗连
SELECTdistributors.*FROMdistributorsd,distributorsdistributors;为了匡助检测这类毛病,PostgreSQL7.1和今后的版本将在你利用一条即有隐含FROM特征又有明白的FORM子句的查询的时分给出告诫.
SQL92

<p>SELECT子句

在SQL92标准里,可选的关头字"AS"是过剩的,能够疏忽失落而不合错误语句发生任何影响.PostgreSQL剖析器在重定名列/字段时必要这个关头字,由于范例扩大的特征会招致高低文语意不清.不外,"AS"在FROM项里是可选的.
DISTINCTON语法不是SQL92的尺度。LIMIT和OFFSET也不是。
在SQL92里,一个ORDERBY子句只可使用在了局列称号大概序号上,而GROUPBY子句只能用于输出列/字段上.PostgreSQL把这两个子句都扩大为同意另外一种选择(可是假如呈现抵触则利用尺度的注释).PostgreSQL还同意两个子句声明恣意的表达式.请注重,在表达式里呈现的称号将老是被当作输出列/字段的称号,而不是了局列/字段称号.
UNION/INTERSECT/EXCEPT子句

SQL92的UNION/INTERSECT/EXCEPT语法同意一个附加的CORRESPONDINGBY选项:
table_queryUNIONcolumn[,...])]]table_query<p>CORRESPONDINGBY今朝还不被PostgreSQL撑持.
既能够作为一个单独的应用程序应用在客户端服务器网络环境中,也能够作为一个库而嵌入到其他的软件中。

admin 发表于 2015-1-16 22:21:57

MSSQL网页设计SELECT语句参数详解

语句级快照和事务级快照终于为SQLServer的并发性能带来了突破。个人感觉语句级快照大家应该应用。事务级快照,如果是高并发系统还要慎用。如果一个用户总是被提示修改不成功要求重试时,会杀人的!

透明 发表于 2015-1-19 09:31:33

同样会为索引视图等应用带来麻烦。看看行级和事务级的快照数据放在tempdb中,就能感觉到目前架构的尴尬。

因胸联盟 发表于 2015-1-28 06:04:07

记得在最开始使用2k的时候就要用到这个功能,可惜2k没有,现在有了作解决方案的朋友会很高兴吧。

老尸 发表于 2015-2-5 18:51:11

如果我们从集合论(关系代数)的角度来看,一张数据库的表就是一组数据元的关系,而每个SQL语句会改变一种或数种关系,从而产生出新的数据元的关系(即产生新的表)。

莫相离 发表于 2015-2-13 06:37:23

不好!如果出了错;不好调试;不好处理!其实web开发将代码分为3层:web层;业务逻辑层和数据访问层;一般对数据库的操作都在数据访问层来做;这样便于调试和维护!而且将来如果是换了数据库的话;你只需要改数据层的代码;其他层的基本可以不变!要是你在jsp中直接调用sql数据库;那么如果换了数据库呢?岂不都要改?如果报了异常呢?怎么做异常处理?

爱飞 发表于 2015-3-3 17:56:19

然后最好有实践机会,能够把实践到的和实践结合起来,其实理论思考是个非常困扰和痛苦的事情

再见西城 发表于 2015-3-11 12:40:42

一直以来个人感觉SQLServer的优化器要比Oracle的聪明。SQL2005的更是比2k聪明了不少。(有次作试验发现有的语句在200万级时还比50万级的相同语句要快show_text的一些提示没有找到解释。一直在奇怪。)

变相怪杰 发表于 2015-3-18 18:25:24

对递归类的树遍历很有帮助。个人感觉这个真是太棒了!阅读清晰,非常有时代感。

简单生活 发表于 2015-3-26 14:00:10

原来公司用过MYSQL自己也只是建个表写个SQL
页: [1]
查看完整版本: MSSQL网页设计SELECT语句参数详解