仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 597|回复: 8
打印 上一主题 下一主题

[学习教程] MSSQL教程之SQL中心语句有用技能

[复制链接]
深爱那片海 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 22:22:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
如果WHERE子句的查询条件里使用比较操作符LIKE和REGEXP,MySQL只有在搜索模板的第一个字符不是通配符的情况下才能使用索引。比如说,如果查询条件是LIKEabc%‘,MySQL将使用索引;如果查询条件是LIKE%abc’,MySQL将不使用索引。技能|语句
  1.拔出数据
  
  向表中增加一个新纪录,你要利用SQLINSERT语句。这里有一个怎样利用这类语句的例子:
  
  der=1cellspacing=0cellpadding=2bordercolorlight=blackbordercolordark=#FFFFFFalign=center> INSERTmytable(mycolumn)VALUES(somedata);
  
  这个语句把字符串somedata拔出表mytable的mycolumn字段中。将要被拔出数据的字段的名字在第一个括号中指定,实践的数据在第二个括号中给出。
  
  INSERT语句的完全句法以下:
  
  INSERT[INTO]{table_name|view_name}[(column_list)]
  {DEFAULTVALUES|Values_list|select_statement};
  
  假如一个表有多个字段,经由过程把字段名和字段值用逗号离隔,你能够向一切的字段中拔出数据。假定表mytable有三个字段first_column、second_column和third_column。上面的INSERT语句增加了一条三个字段都有值的完全纪录:
  
  INSERTmytable(first_column,second_column,third_column)
  VALUES(somedata,somemoredata,yetmoredata);
  
  注重:
  
  你可使用INSERT语句向文本型字段中拔出数据。可是,假如你必要输出很长的字符串,你应当利用WRITETEXT语句。要懂得更多的信息,请参考MicrosoftSQLSever的文档。
  
  假如你在INSERT语句中只指定两个字段和数据会怎样呢?换句话说,你向一个表中拔出一条新纪录,但有一个字段没有供应数据。在这类情形下,有上面的四种大概:
  
  1)假如该字段有一个缺省值,该值会被利用。比方,假定你拔出新纪录时没有给字段third_column供应数据,而这个字段有一个缺省值somevalue。在这类情形下,当新纪录创建时会拔出值somevalue。
  
  2)假如该字段能够承受空值,并且没出缺省值,则会被拔出空值。
  
  3)假如该字段不克不及承受空值,并且没出缺省值,就会呈现毛病。你会收到毛病信息:
  
  Thecolumnintablemytablemaynotbenull.
  
  4)最初,假如该字段是一个标识字段,那末它会主动发生一个新值。当你向一个有标识字段的表中拔出新纪录时,只需疏忽该字段,标识字段会给本人赋一个新值。
  
  注重:
  
  向一个有标识字段的表中拔出新纪录后,你能够用SQL变量@@identity来会见新纪录的标识字段的值。思索以下的SQL语句:
  
  INSERTmytable(first_column)VALUES(somevalue);
  INSERTanothertable(another_first,another_second);
  VALUES(@@identity,somevalue);
  
  假如表mytable有一个标识字段,该字段的值会被拔出表anothertable的another_first字段。这是由于变量@@identity老是保留最初一次拔出标识字段的值。
  
  字段another_first应当与字段first_column有不异的数据范例。可是,字段another_first不克不及是应当标识字段。Another_first字段用来保留字段first_column的值。
  
  2.删除纪录
  
  要从表中删除一个或多个纪录,必要利用SQLDELETE语句。你能够给DELETE语句供应WHERE子句。WHERE子句用来选择要删除的纪录。比方,上面的这个DELETE语句只删除字段first_column的值即是DeleteMe的纪录:
  
  DELETEmytableWHEREfirst_column=DeltetMe;
  
  DELETE语句的完全句法以下:
  
  DELETE[FROM]{table_name|view_name}[WHEREclause];
  
  在SQLSELECT语句中可使用的任何前提都能够在DELECT语句的WHERE子句中利用。比方,上面的这个DELETE语句只删除那些first_column字段的值为goodbye或second_column字段的值为solong的纪录:
  
  DELETEmytableWHEREfirst_column=goodbyORsecond_column=solong;
  
  假如你不给DELETE语句供应WHERE子句,表中的一切纪录都将被删除,你不该该有这类设法。假如你想删除表中的一切纪录,应利用TRUNCATETABLE语句。注重这里为何要用TRUNCATETABLE语句取代DELETE语句:当你利用TRUNCATETABLE语句时,纪录的删除是不作纪录的。也就是说,这意味着TRUNCATETABLE要比DELETE快很多。
  
  3.更新纪录
  
  要修正表中已存在的一条或多笔记录,应利用SQLUPDATE语句。同DELETE语句一样,UPDATE语句可使用WHERE子句来选择更新特定的纪录。请看这个例子:
  
  UPDATEmytableSETfirst_column=Updated!WHEREsecond_column=UpdateMe!;
  
  这个UPDATE语句更新一切second_column字段的值为UpdateMe!的纪录。对一切被选中的纪录,字段first_column的值被置为Updated!。
  
  上面是UPDATE语句的完全句法:
  
  UPDATE{table_name|view_name}
  SET[{table_name|view_name}]
  {column_list|variable_list|variable_and_column_list}
  [,{column_list2|variable_list2|variable_and_column_list2}…
  [,{column_listN|variable_listN|variable_and_column_listN}]]
  [WHEREclause]
  
  注重:你能够对文本型字段利用UPDATE语句。可是,假如你必要更新很长的字符串,应利用UPDATETEXT语句。要懂得更多的信息,请参考MicrosoftSQLSever的文档。
  
  假如你不供应WHERE子句,表中的一切纪录都将被更新。
  
  你也能够同时更新多个字段,比方,上面的UPDATE语句同时更新first_column、second_column和third_column这三个字段:
  
  UPDATEmytableSETfirst_column=Updated!
  Second_column=Updated!
  Third_column=Updated!
  WHEREfirst_column=UpdateMe!;
  
  技能:
  
  SQL疏忽语句中过剩的空格,你能够把SQL语句写成任何你最简单读的格局。
  
  4.用SELECT创立纪录和表
  
  你大概已注重到,INSERT语句与DELETE语句和UPDATE语句有一点分歧,它一次只操纵一个纪录。但是,有一个办法可使INSERT语句一次增加多个纪录。要作到这一点,你必要把INSERT语句与SELECT语句分离起来,象如许:
  
  INSERTmytable(first_column,second_column)
  SELECTanother_first,another_second
  FROManothertable
  WHEREanother_first=CopyMe!;
  
  这个语句从anothertable拷贝纪录到mytable.只要表anothertable中字段another_first的值为CopyMe!的纪录才被拷贝。
  
  当为一个表中的纪录创建备份时,这类情势的INSERT语句长短常有效的。在删除一个表中的纪录之前,你能够先用这类办法把它们拷贝到另外一个表中。
  
  假如你必要拷贝全部表,你可使用SELECTINTO语句。比方,上面的语句创立了一个名为newtable的新表,该表包括表mytable的一切数据:
  
  SELECT*INTOnewtableFROMmytable;
  
  你也能够指定只要特定的字段被用来创立这个新表。要做到这一点,只需在字段列表中指定你想要拷贝的字段。别的,你可使用WHERE子句来限定拷贝到新表中的纪录。上面的例子只拷贝字段second_columnd的值即是CopyMe!的纪录的first_column字段。
  
  SELECTfirst_columnINTOnewtable
  FROMmytable
  WHEREsecond_column=CopyMe!;
  
  利用SQL修正已创建的表是很坚苦的。比方,假如你向一个表中增加了一个字段,没有简单的举措往复除它。别的,假如你不当心把一个字段的数据范例给错了,你将没有举措改动它。可是,利用本节中报告的SQL语句,你能够绕过这两个成绩。
  
  比方,假定你想从一个表中删除一个字段。利用SELECTINTO语句,你能够创立该表的一个拷贝,但不包括要删除的字段。这使你既删除该字段,又保存了不想删除的数据。
  
  假如你想改动一个字段的数据范例,你能够创立一个包括准确数据范例字段的新表。创立好该表后,你就能够分离利用UPDATE语句和SELECT语句,把本来表中的一切数据拷贝到新表中。经由过程这类办法,你既能够修正表的布局,又能保留原本的数据。

这类操作的执行过程是,1)按照新的表定义建立一个临时表tmpa,2)将原表数据拷贝到临时表,3)将原始表改名tmpb,4)将tmpa改名为原表名,5)将tmpb删除。
再现理想 该用户已被删除
沙发
发表于 2015-1-19 09:51:25 | 只看该作者
外键的级联更能扩展可能大部分的同行在设计OLTP系统的时候都不愿意建立外键,都是通过程序来控制父子数据的完整性。
精灵巫婆 该用户已被删除
板凳
发表于 2015-1-25 11:05:46 | 只看该作者
这是一个不错的新特性。虽然索引的附加字段没有索引键值效率高,但是相对映射到数据表中效率还是提高了很多。我做过试验,在我的实验环境中会比映射到表中提高30%左右的效率。
分手快乐 该用户已被删除
地板
发表于 2015-2-2 21:50:28 | 只看该作者
我是一个ERP初学者,对于前台运用基本熟悉,但对于后台SQLServer的运用一点也不懂,特想学习下相关资料。至少懂得一些基本的运用。希望各位能给于建议,小弟再谢过!
5#
发表于 2015-2-8 07:39:38 | 只看该作者
多走走一此相关论坛,多看一些实例开发,多交流0经验,没什么的,我也是刚学没多久!加油
莫相离 该用户已被删除
6#
发表于 2015-2-25 01:12:35 | 只看该作者
个人感觉没有case直观。而且默认的第三字段(还可能更多)作为groupby字段很容易造成新手的错误。
因胸联盟 该用户已被删除
7#
发表于 2015-3-7 15:00:19 | 只看该作者
我是一个ERP初学者,对于前台运用基本熟悉,但对于后台SQLServer的运用一点也不懂,特想学习下相关资料。至少懂得一些基本的运用。希望各位能给于建议,小弟再谢过!
再见西城 该用户已被删除
8#
发表于 2015-3-15 07:58:06 | 只看该作者
外键的级联更能扩展可能大部分的同行在设计OLTP系统的时候都不愿意建立外键,都是通过程序来控制父子数据的完整性。
老尸 该用户已被删除
9#
发表于 2015-3-21 22:54:02 | 只看该作者
是否碎片会引发效率问题?这都是需要进一步探讨的东西。varbinary(max)代替image也让SQLServer的字段类型更加简洁统一。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-22 23:31

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表