求救~SQL怎么写同时满足三个条件的update语句怎么写?字段A是时间(某一时间段)B要=状态C要等于人名

查询9万多张表中特定的某个内容,该怎么处理_查询9万多张表中特定的某个内容,该怎么解决_查询a,b,c三个表的一些字段 可是b表需要UNION ALL b的历史表 可以实现吗?解决办法__脚本百事通
稍等,加载中……
^_^请注意,有可能下面的2篇文章才是您想要的内容:
查询9万多张表中特定的某个内容,该怎么处理
查询9万多张表中特定的某个内容,该怎么解决
查询a,b,c三个表的一些字段 可是b表需要UNION ALL b的历史表 可以实现吗?解决办法
查询9万多张表中特定的某个内容,该怎么处理
查询9万多张表中特定的某个内容有一数据库有9万多张表
我想查询这表中的关键字段NAME为小王的所有记录
这个SQL语句该如何写呢?
怎样才能降低查询的时候不影响整体运行速度呢?------解决方案--------------------9万多张表, 如果用select * from table1 where name= '小王'
select * from table2 where name= '小王'
select * from table3 where name= '小王'
select * from table10000 where name= '小王'
速度上应该还可以,不过你的这个SQL语句的长度估计无法承受。
建议还是用程序一个表一个表进行搜索比较合理。------解决方案--------------------用程序,每个表都循环过去------解决方案--------------------估计要用SP,取得所有表名,根据表名取得字段名,一个一个循环判断------解决方案--------------------要从那么多表里去取数据,我想性能牺牲是免不了的。我觉得讨论怎么省事还可以。
我有一个思路,我没实验过,但我觉得是可行的。
先从SYSIBM.SYSTABLES中选出你要查询的表,然后一个一个循环,组合字符串,即叠加(SELECT NAME FROM 表明 UNION ALL ),最后用隐式查询然后返回结果集!
当然,也可以循环tables做单个select,呵呵。也是隐式的。。。------解决方案--------------------只能每个表出select一次,循环处理。------解决方案--------------------先把表明查出来(从SYSIBM.SYSTABLES,可以放入一个表中)
然后循环这些表明,找出相关的记录------解决方案--------------------用程序并不复杂啊?
访问系统表,得到所有表名。然后循环处理每条记录(系统表中的每个记录也就是一个表)
然后对每个表名,在程序中生成相应的 select * from " + rs.fields("tableName") 根据返回的结果判断是否包含 小王
楼主现在的问题是什么呢? 不了解怎么写程序?还是其它?------解决方案--------------------访问系统表,得到所有表名。然后循环处理每条记录(系统表中的每个记录也就是一个表)
然后对每个表名,在程序中生成相应的 select * from " + rs.fields("tableName") 根据返回的结果判断是否包含 小王------解决方案--------------------能有这样的需求 就不要考虑性能问题了。
遍历表名,遍历出此表的所有列名, 查询
select * from table where col1 =' 小王'
拼接SQL 吧------解决方案--------------------传说中的全文索引是如何索引的?
另外,感觉你这个需求有问题,一般不会有这么变态的需求吧,
看看变通一下吧,
如果程序也不会写,SQL语句也不会,那就没办法了,------解决方案--------------------我是菜鸟。我说一下我的理解:
为什么非要一次执行呢。
你9万张表可以化大为小,执行时以10张表(或者更多张表)为单位查询,将每次返回结果存储到一个表中;
这样效率肯定会快;
查询9万多张表中特定的某个内容,该怎么解决
查询9万多张表中特定的某个内容有一数据库有9万多张表我想查询这表中的关键字段NAME为小王的所有记录这个SQL语句该如何写呢?怎样才能降低查询的时候不影响整体运行速度呢?------解决方案--------------------9万多张表, 如果用SQL code
select * from table1 where name= '小王'
select * from table2 where name= '小王'
select * from table3 where name= '小王'
select * from table10000 where name= '小王'
------解决方案--------------------用程序,每个表都循环过去
------解决方案--------------------估计要用SP,取得所有表名,根据表名取得字段名,一个一个循环判断
------解决方案--------------------要从那么多表里去取数据,我想性能牺牲是免不了的。我觉得讨论怎么省事还可以。我有一个思路,我没实验过,但我觉得是可行的。先从SYSIBM.SYSTABLES中选出你要查询的表,然后一个一个循环,组合字符串,即叠加(SELECT NAME FROM 表明 UNION ALL ),最后用隐式查询然后返回结果集!当然,也可以循环tables做单个select,呵呵。也是隐式的。。。
------解决方案--------------------只能每个表出select一次,循环处理。
------解决方案--------------------先把表明查出来(从SYSIBM.SYSTABLES,可以放入一个表中)然后循环这些表明,找出相关的记录
------解决方案--------------------用程序并不复杂啊?访问系统表,得到所有表名。然后循环处理每条记录(系统表中的每个记录也就是一个表)然后对每个表名,在程序中生成相应的 select * from " + rs.fields("tableName") 根据返回的结果判断是否包含 小王楼主现在的问题是什么呢? 不了解怎么写程序?还是其它?
------解决方案--------------------访问系统表,得到所有表名。然后循环处理每条记录(系统表中的每个记录也就是一个表)然后对每个表名,在程序中生成相应的 select * from " + rs.fields("tableName") 根据返回的结果判断是否包含 小王------解决方案--------------------能有这样的需求 就不要考虑性能问题了。遍历表名,遍历出此表的所有列名, 查询select * from table where col1 =' 小王'拼接SQL 吧
------解决方案--------------------传说中的全文索引是如何索引的?另外,感觉你这个需求有问题,一般不会有这么变态的需求吧,看看变通一下吧,如果程序也不会写,SQL语句也不会,那就没办法了,------解决方案--------------------我是菜鸟。我说一下我的理解:为什么非要一次执行呢。你9万张表可以化大为小,执行时以10张表(或者更多张表)为单位查询,将每次返回结果存储到一个表中;这样效率肯定会快;
------解决方案--------------------select * from table1 where name= '小王'union allselect * from table2 where name= '小王'union allselect * from table3 where name= '小王'union all....union allselect * from table10000 where name= '小王'------解决方案--------------------9万张表确实够疯狂的解决方案一般可从两个方向入手:一 通过前台程序语言入手
一般在这种情况想要大幅度提高查询性能很难;但可以通用使用AJAX和多线程结合处理;二 通过优化SQL语句和数据库结构
表结构一般是动不了的,只能寄希望于索引;
再者优化SQL
select * from table1 where name= '小王'
select * from table2 where name= '小王'
select * from table3 where name= '小王'
select * from table10000 where name= '小王'
------解决方案--------------------感觉不是很变态啊.主要就是表多的问题.如果每一个表都查一次可能的话,那么浪费在获取连接的时间太多了.所以还是分批次查询,说的简单点就是union all 形式,一次设定多少张表,比如说1千张.也可以更多.主要看数据库性能了.还有就是缓存sql的形式.获取一次连接,然后执行.第三种方法就很简单了.用视图就行了.不过没试过9万多的.不过也可以实行分批的方法建立,建立9个或者其他的.
------解决方案--------------------
引用:引用:9W多张表,里面肯定有其他类型的表,但又无法获知哪些表才有NAME字段,所以需要全部都查询一遍都在一个实例用户下的那你这个需求就有问题了,查询出所有的name字段,而且还不知道是哪个表的.这样有意义么?
你查出来都不知道这个name是什么作用.有意义么?把……------解决方案--------------------1.先从SYSIBM.SYSTABLES中选出你要查询的表 List systabList=session.createQuery(SYSIBM.SYSTABLES)2.根据查询的结果拼出SQL,然后把些SQL存在一张表中MY_QUERY 可能数据库对union查询表的个数和整个长度的有限制,就像varchar的长度不能大于4000一样, String sql="insert into my_query_date(fld1,fld2,..fldn) ( "; int max_tab_num=n; for (Object obj :systabList) {
sql+=" select fld1,fld2,..fldn from "+obj.obj +"where name='小王' +union";
if (i=max_tab_num)
session.connection().createStatement().execute("insert into my_query fld values("+sql+")" );
sql="insert into my_query_date(fld1,fld2,..fldn) ( ";
(!sql.equals("insert into my_query_date(fld1,fld2,..fldn) ( ")) {
session.connection().createStatement().execute("insert into my_query fld values("+sql+")" ); }3.根据拼好的SQL把数据拿出来, 数据就存在my_query_date中;
List sqlList=session.createQuery(my_quert);
for (Object obj :sqlList){ session.createSQLQuery(obj.fld).executeUpdate();
}4.大功告成,从my_query_date表中拿数据就行了.. 设计表结构时,灵活一下,中间注意事务..
------解决方案--------------------http://blog.csdn.net/tzysf/archive//4574914.aspxSQL code
varchar(100)
@str='郑州南阳S-1N001'
--要搜索的字符串
varchar(8000)
exists(select
['+b.name+']
['+a.name+']
''%'+@str+'%'')
''所在的表及字段:
['+b.name+'].['+a.name+']'''
syscolumns
sysobjects
b.xtype='U'
a.status&=0
a.xusertype
in(175,239,231,167)
@@fetch_status=0
deallocate
------解决方案--------------------中间会多拼一个union 注意处理一下..这里只是提供一个大概的解决思路..第三步做之前应该先truncate talbe my_sql_可以放在存储过程中,用定时调度实现前两步的条件拼好的SQL还可以维护.
------解决方案--------------------
http://blog.csdn.net/tzysf/archive//4574914.aspxSQL codedeclare
varchar(100)
@str='郑州南阳S-1N001'
--要搜索的字符串
varchar(8000)
declare ……
------解决方案--------------------select * from table1 where name= '小王'union allselect * from table2 where name= '小王'union allselect * from table3 where name= '小王'union all....union allselect * from table10000 where name= '小王'
查询a,b,c三个表的一些字段 可是b表需要UNION ALL b的历史表 可以实现吗?解决办法
查询a,b,c三个表的一些字段 可是b表需要UNION ALL b的历史表 可以实现吗?查询a,b,c三个表的一些字段 可是b表需要UNION ALL b的历史表 可以实现吗?怎么写------解决方案--------------------
这样:select a.* , c.* , t.* from a , c ,
(select * from b union all select * from b的那些历史表,如果有多个逐一union all) twhere a.关键字 = b.关键字 and a.关键字 = t.关键字
如果您想提高自己的技术水平,欢迎加入本站官方1号QQ群:&&,&&2号QQ群:,在群里结识技术精英和交流技术^_^
本站联系邮箱:SQL 有A表,字段a,b,c。c为空值,我想a+b的值插入到C。语句如何写_百度知道
SQL 有A表,字段a,b,c。c为空值,我想a+b的值插入到C。语句如何写
alter table table1 alter column id numeric(12,0)哗肠糕段蕹灯革犬宫华这个只能改ID的小位数,如果我想同时改两个字段如何写
提问者采纳
update a set c = a+balter tab哗肠糕段蕹灯革犬宫华le 改两个字段只能写两行
提问者评价
其他类似问题
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁当前位置: >
> 复杂updatesql语句的书写我现在有一个表A,里面有字段a,b,c,d四个四段,我想再增加一个
复杂updatesql语句的书写我现在有一个表A,里面有字段a,b,c,d四个四段,我想再增加一个
nilihao & at
复杂update sql 语句的书写我现在有一个表A,里面有字段a,b,c,d四个四段,我想再增加一个字段,e,字段e的内容是想把前面四个字段按照一定规则组成的字符串,如下例子:a
12.3那么e的值应该是“001 03.50 123 12.30”,就是a字段补足三位,b字段补足小数点前两位,小数点后两位,c字段不变,d字段跟b字段一样。请问这种更新的update语句应该怎么写啊?或是如果可以不用update语句的话,应该用什么sql语句?sql语句应该怎么写啊?
  SQL code  select rpad(99,3,0) abc1
,lpad(99,3,0) abc2
niliu87 & &
& & (0)(0)  SQL code  UPDATE a
SET e = lpad(a, 4, '0') || chr(32) || to_char(b, '09.90') || chr(32) ||
to_char(c) || chr(32) || to_char(d, '09.90');nilookme13 & &
& & (0)(0)
本问题标题:
本问题地址:
温馨提示:本问题已经关闭,不能解答。
暂无合适的专家
&&&&&&&&&&&&&&&
希赛网 版权所有 & &&&&湘教QS2-164&&增值电信业务经营许可证湘B2-这个需要inner join与full join结合的SQL语句怎么写?有三个表,分别是b1、b2、b3b1字段为a、bname,b2和b3的字段都是b、c三个表的内容是b1:a bname1 老大2 老二3 老三4 老四5 老五6 老六7 老七8 老八9 老九b2:b c1 0……b3:b c_百度作业帮
这个需要inner join与full join结合的SQL语句怎么写?有三个表,分别是b1、b2、b3b1字段为a、bname,b2和b3的字段都是b、c三个表的内容是b1:a bname1 老大2 老二3 老三4 老四5 老五6 老六7 老七8 老八9 老九b2:b c1 1002 2003 300……b3:b c2 203 304 40……现在需要出一个像:老大 b2表里C字段的数字之和 减去 b3表里C字段的数字之和老二 b2表里C字段的数字之和 减去 b3表里C字段的数字之和……但是如何老五、老六没有在b2、b3中出现过,那就不显示他们大体思路应该是b1 inner join ( b2 full join b3 ),但是b2和b3还涉及一个字段名相同的问题实在想不出怎么写这个SQL来了,敬盼!
Select a.bname,sum(B.C) - C.C AS 分数 from b1 AS A INNER Join (b2 AS B full join b3 AS C ON (B.B = C.B)) ON (A.A = B.B) group by a.bname
您可能关注的推广SQLsql server check2008 check约束表达式怎么限定字段输入的长度? 比如:密码要求必须大于6位? 表达式该怎么写? - 叫阿莫西中心 - 中国网络使得骄傲马戏中心!
SQLsql server check2008 check约束表达式怎么限定字段输入的长度? 比如:密码要求必须大于6位? 表达式该怎么写?
近期因工作需要,希望比较全面的总结下SQL SERVER数据库性能优化相关的注意事项,在网上搜索了一下,发现很多文章,有的都列出了上百条,但是仔细看发现,有很多似是而非或者过时(可能对SQL SERVER6.5以前的版本或者ORACLE是适用的)的信息,只好自己根据以前的经验和测试结果进行总结了。我始终认为,一个系统的性能的提高,不单单是试运行或者维护阶段的性能调优的任务,也不单单是开发阶段的事情,而是在整个软件生命周期都需要注意,进行有效工作才能达到的。所以我希望按照软件生命周期的不同阶段来总结数据库性能优化相关的注意事项。一、分析阶段一般来说,在系统分析阶段往往有太多需要关注的地方,系统各种功能性、可用性、可靠性、安全性需求往往吸引了我们大部分的注意力,但是,我们必须注意,性能是很重要的非功能性需求,必须根据系统的特点确定其实时性需求、响应时间的需求、硬件的配置等。最好能有各种需求的量化的指标。另一方面,在分析阶段应该根据各种需求区分出系统的类型,大的方面,区分是OLTP(联机事务处理系统)和OLAP(联机分析处理系统)。二、设计阶段设计阶段可以说是以后系统性能的关键阶段,在这个阶段,有一个关系到以后几乎所有性能调优的过程—数据库设计。在数据库设计完成后,可以进行初步的,好的索引设计可以指导编码阶段写出高效率的代码,为整个系统的性能打下良好的基础。以下是性能要求设计阶段需要注意的:1、数据库逻辑设计的规范化数据库逻辑设计的规范化就是我们一般所说的范式,我们可以这样来简单理解范式:第1规范:没有重复的组或多值的列,这是数据库设计的最低要求。第2规范: 每个非关键字段必须依赖于主关键字,不能依赖于一个组合式主关键字的某些组成部分。消除部分依赖,大部分情况下,数据库设计都应该达到第二范式。第3规范: 一个非关键字段不能依赖于另一个非关键字段。消除传递依赖,达到第三范式应该是系统中大部分表的要求,除非一些特殊作用的表。更高的范式要求这里就不再作介绍了,个人认为,如果全部达到第二范式,大部分达到第三范式,系统会产生较少的列和较多的表,因而减少了数据冗余,也利于性能的提高。2、合理的冗余完全按照规范化设计的系统几乎是不可能的,除非系统特别的小,在规范化设计后,有计划地加入冗余是必要的。冗余可以是冗余数据库、冗余表或者冗余字段,不同粒度的冗余可以起到不同的作用。冗余可以是为了编程方便而增加,也可以是为了性能的提高而增加。从性能角度来说,冗余数据库可以分散数据库压力,冗余表可以分散数据量大的表的并发压力,也可以加快特殊查询的速度,冗余字段可以有效减少数据库表的连接,提高效率。3、主键的设计主键是必要的,SQL SERVER的主键同时是一个唯一索引,而且在实际应用中,我们往往选择最小的键组合作为主键,所以主键往往适合作为表的聚集索引。聚集索引对查询的影响是比较大的,这个在下面索引的叙述。在有多个键的表,主键的选择也比较重要,一般选择总的长度小的键,小的键的比较速度快,同时小的键可以使主键的B树结构的层次更少。主键的选择还要注意组合主键的字段次序,对于组合主键来说,不同的字段次序的主键的性能差别可能会很大,一般应该选择重复率低、单独或者组合查询可能性大的字段放在前面。4、外键的设计外键作为数据库对象,很多人认为麻烦而不用,实际上,外键在大部分情况下是很有用的,理由是:外键是最高效的一致性维护方法,数据库的一致性要求,依次可以用外键、CHECK约束、规则约束、触发器、客户端程序,一般认为,离数据越近的方法效率越高。谨慎使用级联删除和级联更新,级联删除和级联更新作为SQL SERVER 2000当年的新功能,在2005作了保留,应该有其可用之处。我这里说的谨慎,是因为级联删除和级联更新有些突破了传统的关于外键的定义,功能有点太过强大,使用前必须确定自己已经把握好其功能范围,否则,级联删除和级联更新可能让你的数据莫名其妙的被修改或者丢失。从性能看级联删除和级联更新是比其他方法更高效的方法。5、字段的设计字段是数据库最基本的单位,其设计对性能的影响是很大的。需要注意如下:A、数据类型尽量用数字型,数字型的比较比字符型的快很多。B、数据类型尽量小,这里的尽量小是指在满足可以预见的未来需求的前提下的。C、尽量不要允许NULL,除非必要,可以用NOT NULL+DEFAULT代替。D、少用TEXT和IMAGE,二进制字段的读写是比较慢的,而且,读取的方法也不多,大部分情况下最好不用。E、自增字段要慎用,不利于数据迁移。 6、数据库物理存储和环境的设计在设计阶段,可以对数据库的物理存储、操作系统环境、网络环境进行必要的设计,使得我们的系统在将来能适应比较多的用户并发和比较大的数据量。这里需要注意文件组的作用,适用文件组可以有效把I/O操作分散到不同的物理硬盘,提高并发能力。7、系统设计整个系统的设计特别是系统结构设计对性能是有很大影响的,对于一般的OLTP系统,可以选择C/S结构、三层的C/S结构等,不同的系统结构其性能的关键也有所不同。系统设计阶段应该归纳一些业务逻辑放在数据库编程实现,数据库编程包括数据库存储过程、触发器和函数。用数据库编程实现业务逻辑的好处是减少网络流量并可更充分利用数据库的预编译和缓存功能。8、索引的设计在设计阶段,可以根据功能和性能的需求进行初步的索引设计,这里需要根据预计的数据量和查询来设计索引,可能与将来实际使用的时候会有所区别。关于索引的选择,应改主意:A、根据数据量决定哪些表需要增加索引,数据量小的可以只有主键。B、根据使用频率决定哪些字段需要建立索引,选择经常作为连接条件、筛选条件、聚合查询、排序的字段作为索引的候选字段。C、把经常一起出现的字段组合在一起,组成组合索引,组合索引的字段顺序与主键一样,也需要把最常用的字段放在前面,把重复率低的字段放在前面。D、一个表不要加太多索引,因为索引影响插入和更新的速度。 三、编码阶段编码阶段是本文的重点,因为在设计确定的情况下,编码的质量几乎决定了整个系统的质量。编码阶段首先是需要所有程序员有性能意识,也就是在实现功能同时有考虑性能的思想,数据库是能进行集合运算的工具,我们应该尽量的利用这个工具,所谓集合运算实际是批量运算,就是尽量减少在客户端进行大数据量的循环操作,而用SQL语句或者存储过程代替。关于思想和意识,很难说得很清楚,需要在编程过程中来体会。下面罗列一些编程阶段需要注意的事项:1、只返回需要的数据返回数据到客户端至少需要数据库提取数据、网络传输数据、客户端接收数据以及客户端处理数据等环节,如果返回不需要的数据,就会增加服务器、网络和客户端的无效劳动,其害处是显而易见的,避免这类事件需要注意:A、横向来看,不要写SELECT *的语句,而是选择你需要的字段。B、纵向来看,合理写WHERE子句,不要写没有WHERE的SQL语句。C、注意SELECT INTO后的WHERE子句,因为SELECT INTO把数据插入到临时表,这个过程会锁定一些系统表,如果这个WHERE子句返回的数据过多或者速度太慢,会造成系统表长期锁定,诸塞其他进程。D、对于聚合查询,可以用HAVING子句进一步限定返回的行。2、尽量少做重复的工作这一点和上一点的目的是一样的,就是尽量减少无效工作,但是这一点的侧重点在客户端程序,需要注意的如下:A、控制同一语句的多次执行,特别是一些基础数据的多次执行是很多程序员很少注意的。B、减少多次的数据转换,也许需要数据转换是设计的问题,但是减少次数是程序员可以做到的。C、杜绝不必要的子查询和连接表,子查询在执行计划一般解释成外连接,多余的连接表带来额外的开销。D、合并对同一表同一条件的多次UPDATE,比如这两个语句应该合并成以下一个语句E、UPDATE操作不要拆成DELETE操作+INSERT操作的形式,虽然功能相同,但是性能差别是很大的。F、不要写一些没有意义的查询,比如
SELECT * FROM EMPLOYEE WHERE 1=23、注意事务和锁事务是数据库应用中和重要的工具,它有原子性、一致性、隔离性、持久性这四个属性,很多操作我们都需要利用事务来保证数据的正确性。在使用事务中我们需要做到尽量避免死锁、尽量减少阻塞。具体以下方面需要特别注意:A、事务操作过程要尽量小,能拆分的事务要拆分开来。B、事务操作过程不应该有交互,因为交互等待的时候,事务并未结束,可能锁定了很多资源。C、事务操作过程要按同一顺序访问对象。D、提高事务中每个语句的效率,利用索引和其他方法提高每个语句的效率可以有效地减少整个事务的执行时间。E、尽量不要指定锁类型和索引,SQL SERVER允许我们自己指定语句使用的锁类型和索引,但是一般情况下,SQL SERVER优化器选择的锁类型和索引是在当前数据量和查询条件下是最优的,我们指定的可能只是在目前情况下更有,但是数据量和数据分布在将来是会变化的。F、查询时可以用较低的隔离级别,特别是报表查询的时候,可以选择最低的隔离级别(未提交读)。4、注意临时表和表变量的用法在复杂系统中,临时表和表变量很难避免,关于临时表和表变量的用法,需要注意:A、如果语句很复杂,连接太多,可以考虑用临时表和表变量分步完成。B、如果需要多次用到一个大表的同一部分数据,考虑用临时表和表变量暂存这部分数据。C、如果需要综合多个表的数据,形成一个结果,可以考虑用临时表和表变量分步汇总这多个表的数据。D、其他情况下,应该控制临时表和表变量的使用。E、关于临时表和表变量的选择,很多说法是表变量在内存,速度快,应该首选表变量,但是在实际使用中发现,这个选择主要考虑需要放在临时表的数据量,在数据量较多的情况下,临时表的速度反而更快。F、关于临时表产生使用SELECT INTO和CREATE TABLE + INSERT INTO的选择,我们做过测试,一般情况下,SELECT INTO会比CREATE TABLE + INSERT INTO的方法快很多,但是SELECT INTO会锁定TEMPDB的系统表SYSOBJECTS、SYSINDEXES、SYSCOLUMNS,在多用户并发环境下,容易阻塞其他进程,所以我的建议是,在并发系统中,尽量使用CREATE TABLE + INSERT INTO,而大数据量的单个语句使用中,使用SELECT INTO。G、注意排序规则,用CREATE TABLE建立的临时表,如果不指定字段的排序规则,会选择TEMPDB的默认排序规则,而不是当前数据库的排序规则。如果当前数据库的排序规则和TEMPDB的排序规则不同,连接的时候就会出现排序规则的冲突错误。一般可以在CREATE TABLE建立临时表时指定字段的排序规则为DATABASE_DEFAULT来避免上述问题。5、子查询的用法子查询是一个 SELECT 查询,它嵌套在 SELECT、INSERT、UPDATE、DELETE 语句或其它子查询中。任何允许使用表达式的地方都可以使用子查询。子查询可以使我们的编程灵活多样,可以用来实现一些特殊的功能。但是在性能上,往往一个不合适的子查询用法会形成一个性能瓶颈。如果子查询的条件中使用了其外层的表的字段,这种子查询就叫作相关子查询。相关子查询可以用IN、NOT IN、EXISTS、NOT EXISTS引入。关于相关子查询,应该注意:A、NOT IN、NOT EXISTS的相关子查询可以改用LEFT JOIN代替写法。比如:
可以改写成: 可以改写成:B、如果保证子查询没有重复 ,IN、EXISTS的相关子查询可以用INNER JOIN 代替。比如:可以改写成:C、IN的相关子查询用EXISTS代替,比如可以用下面语句代替:D、不要用COUNT(*)的子查询判断是否存在记录,最好用LEFT JOIN或者EXISTS,比如有人写这样的语句:应该改成: 应该改成:6、慎用游标数据库一般的操作是集合操作,也就是对由WHERE子句和选择列确定的结果集作集合操作,游标是提供的一个非集合操作的途径。一般情况下,游标实现的功能往往相当于客户端的一个循环实现的功能,所以,大部分情况下,我们把游标功能搬到客户端。游标是把结果集放在服务器内存,并通过循环一条一条处理记录,对数据库资源(特别是内存和锁资源)的消耗是非常大的,所以,我们应该只有在没有其他方法的情况下才使用游标。另外,我们可以用SQL SERVER的一些特性来代替游标,达到提高速度的目的。A、字符串连接的例子这是论坛经常有的例子,就是把一个表符合条件的记录的某个字符串字段连接成一个变量。比如需要把JOB_ID=10的EMPLOYEE的FNAME连接在一起,用逗号连接,可能最容易想到的是用游标:可以如下修改,功能相同:B、用CASE WHEN 实现转换的例子很多使用游标的原因是因为有些处理需要根据记录的各种情况需要作不同的处理,实际上这种情况,我们可以用CASE WHEN语句进行必要的判断处理,而且CASE WHEN是可以嵌套的。比如:表结构:其中,单位字段可以是0,1,2,分别代表主单位、单位1、单位2,很多计算需要统一单位,统一单位可以用游标实现:
可以改写成:C、变量参与的UPDATE语句的例子SQL ERVER的语句比较灵活,变量参与的UPDATE语句可以实现一些游标一样的功能,比如:在产生临时表后,已经按照A字段排序,但是在A相同的情况下是乱序的,这时如果需要更改序号字段为按照A字段分组的记录序号,就只有游标和变量参与的UPDATE语句可以实现了,这个变量参与的UPDATE语句如下:D、如果必须使用游标,注意选择游标的类型,如果只是循环取数据,那就应该用只进游标(选项FAST_FORWARD),一般只需要静态游标(选项STATIC)。E、注意动态游标的不确定性,动态游标查询的记录集数据如果被修改,会自动刷新游标,这样使得动态游标有了不确定性,因为在多用户环境下,如果其他进程或者本身更改了纪录,就可能刷新游标的记录集。7、尽量使用索引建立索引后,并不是每个查询都会使用索引,在使用索引的情况下,索引的使用效率也会有很大的差别。只要我们在查询语句中没有强制指定索引,索引的选择和使用方法是SQLSERVER的优化器自动作的选择,而它选择的根据是查询语句的条件以及相关表的统计信息,这就要求我们在写SQL语句的时候尽量使得优化器可以使用索引。为了使得优化器能高效使用索引,写语句的时候应该注意:A、不要对索引字段进行运算,而要想办法做变换,比如SELECT ID FROM T WHERE NUM/2=100应改为:SELECT ID FROM T WHERE NUM=100*2 SELECT ID FROM T WHERE NUM/2=NUM1如果NUM有索引应改为:SELECT ID FROM T WHERE NUM=NUM1*2如果NUM1有索引则不应该改。 发现过这样的语句:应该改为: B、不要对索引字段进行格式转换日期字段的例子:WHERE CONVERT(VARCHAR(10), 日期字段,120)=’’应该改为WHERE日期字段〉=’’
日期字段&’’ ISNULL转换的例子:WHERE ISNULL(字段,’’)&&’’应改为:WHERE字段&&’’WHERE ISNULL(字段,’’)=’’不应修改WHERE ISNULL(字段,’F’) =’T’应改为: WHERE字段=’T’WHERE ISNULL(字段,’F’)&&’T’不应修改C、不要对索引字段使用函数WHERE LEFT(NAME, 3)='ABC' 或者WHERE SUBSTRING(NAME,1, 3)='ABC'应改为:WHERE NAME LIKE 'ABC%' 日期查询的例子:WHERE DATEDIFF(DAY, 日期,'')=0应改为:WHERE 日期 &='' AND 日期 &'‘WHERE DATEDIFF(DAY, 日期,'')&0应改为:WHERE 日期 &'‘WHERE DATEDIFF(DAY, 日期,'')&=0应改为:WHERE 日期 &'‘WHERE DATEDIFF(DAY, 日期,'')&0应改为:WHERE 日期&='‘WHERE DATEDIFF(DAY, 日期,'')&=0应改为:WHERE 日期&='‘D、不要对索引字段进行多字段连接比如:WHERE FAME+ ’.’+LNAME=‘HAIWEI.YANG’应改为:WHERE FNAME=‘HAIWEI’ AND LNAME=‘YANG’8、注意连接条件的写法多表连接的连接条件对索引的选择有着重要的意义,所以我们在写连接条件条件的时候需要特别的注意。A、多表连接的时候,连接条件必须写全,宁可重复,不要缺漏。B、连接条件尽量使用聚集索引C、注意ON部分条件和WHERE部分条件的区别 9、其他需要注意的地方经验表明,问题发现的越早解决的成本越低,很多性能问题可以在编码阶段就发现,为了提早发现性能问题,需要注意:A、程序员注意、关心各表的数据量。B、编码过程和单元测试过程尽量用数据量较大的数据库测试,最好能用实际数据测试。C、每个SQL语句尽量简单D、不要频繁更新有触发器的表的数据E、注意数据库函数的限制以及其性能10、学会分辩SQL语句的优劣自己分辨SQL语句的优劣非常重要,只有自己能分辨优劣才能写出高效的语句。A、查看SQL语句的执行计划,可以在查询分析其使用CTRL+L图形化的显示执行计划,一般应该注意百分比最大的几个图形的属性,把鼠标移动到其上面会显示这个图形的属性,需要注意预计成本的数据,也要注意其标题,一般都是CLUSTERED INDEX SEEK 、INDEX SEEK 、CLUSTERED INDEX SCAN 、INDEX SCAN 、TABLE SCAN等,其中出现SCAN说明语句有油画的余地。也可以用语句SET SHOWPLAN_ALL ON要执行的语句SET SHOWPLAN_ALL OFF查看执行计划的文本详细信息。B、用事件探查器跟踪系统的运行,可疑跟踪到执行的语句,以及所用的时间,CPU用量以及I/O数据,从而分析语句的效率。C、可以用WINDOWS的系统性能检测器,关注CPU、I/O参数四、测试、试运行、维护阶段测试的主要任务是发现并修改系统的问题,其中性能问题也是一个重要的方面。重点应该放在发现有性能问题的地方,并进行必要的优化。主要进行语句优化、索引优化等。试运行和维护阶段是在实际的环境下运行系统,发现的问题范围更广,可能涉及操作系统、网络以及多用户并发环境出现的问题,其优化也扩展到操作系统、网络以及数据库物理存储的优化。这个阶段的优花方法在这里不再展开,只说明下索引维护的方法:A、可以用DBCC DBREINDEX语句或者SQL SERVER维护计划设定定时进行索引重建,索引重建的目的是提高索引的效能。B、可以用语句UPDATE STATISTICS或者SQL SERVER维护计划设定定时进行索引统计信息的更新,其目的是使得统计信息更能反映实际情况,从而使得优化器选择更合适的索引。C、可以用DBCC CHECKDB或者DBCC CHECKTABLE语句检查数据库表和索引是否有问题,这两个语句也能修复一般的问题。D、 五、网上资料中一些说法的个人理解1、“应尽量避免在 WHERE 子句中对字段进行 NULL 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:SELECT ID FROM T WHERE NUM IS NULL可以在NUM上设置默认值0,确保表中NUM列没有NULL值,然后这样查询:SELECT ID FROM T WHERE NUM=0”个人意见:经过测试,IS NULL也是可以用INDEX SEEK查找的,0和NULL是不同概念的,以上说法的两个查询的意义和记录数是不同的。2、“应尽量避免在 WHERE 子句中使用!=或&&操作符,否则将引擎放弃使用索引而进行全表扫描。”个人意见:经过测试,&&也是可以用INDEX SEEK查找的。3、“应尽量避免在 WHERE 子句中使用 OR 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描,如:SELECT ID FROM T WHERE NUM=10 OR NUM=20可以这样查询:SELECT ID FROM T WHERE NUM=10UNION ALLSELECT ID FROM T WHERE NUM=20”个人意见:主要对全表扫描的说法不赞同。4、“IN 和 NOT IN 也要慎用,否则会导致全表扫描,如:SELECT ID FROM T WHERE NUM IN(1,2,3)对于连续的数值,能用 BETWEEN 就不要用 IN 了:SELECT ID FROM T WHERE NUM BETWEEN 1 AND 3”个人意见:主要对全表扫描的说法不赞同。5、“如果在 WHERE 子句中使用参数,也会导致全表扫描。因为SQL只有在运行时才会解析局部变量,但优化程序不能将访问计划的选择推迟到运行时;它必须在编译时进行选择。然而,如果在编译时建立访问计划,变量的值还是未知的,因而无法作为索引选择的输入项。如下面语句将进行全表扫描:SELECT ID FROM T WHERE NUM=@NUM可以改为强制查询使用索引:SELECT ID FROM T WITH(INDEX(索引名)) WHERE NUM=@NUM”个人意见:关于局部变量的解释比较奇怪,使用参数如果会影响性能,那存储过程就该校除了,我坚持我上面对于强制索引的看法。6、“尽可能的使用 VARCHAR/NVARCHAR 代替 CHAR/NCHAR ,因为首先变长字段存储空间小,可以节省存储空间,其次对于查询来说,在一个相对较小的字段内搜索效率显然要高些。”个人意见:“在一个相对较小的字段内搜索效率显然要高些”显然是对的,但是字段的长短似乎不是由变不变长决定,而是业务本身决定。在SQLSERVER6.5或者之前版本,不定长字符串字段的比较速度比定长的字符串字段的比较速度慢很多,所以对于那些版本,我们都是推荐使用定长字段存储一些关键字段。而在2000版本,修改了不定长字符串字段的比较方法,与定长字段的比较速度差别不大了,这样为了方便,我们大量使用不定长字段。7、关于连接表的顺序或者条件的顺序的说法,经过测试,在SQL SERVER,这些顺序都是不影响性能的,这些说法可能是对ORACLE有效。
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:102891次
积分:2067
积分:2067
排名:第7038名
原创:84篇
转载:34篇
译文:12篇
评论:14条
(1)(1)(1)(2)(2)(2)(1)(5)(1)(1)(5)(5)(4)(9)(2)(1)(4)(7)(2)(6)(6)(10)(1)(1)(1)(6)(3)(3)(2)(1)(1)(3)(1)(2)(2)(16)(9)精品:数据库习题 数据库课后习题答案 数据库原理习题 数据库系统概论习题 税法第..
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
SQLServer2008数据库应用与开发教程(第二版)(习题解答)
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer-4.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口RDBMS 指的是关系型数据库管理系统。
RDBMS 是 SQL 的基础。
RDBMS 中的数据存储在被称为表(tables)的数据库对象中。
表是相关的数据项的集合,它由列和行组成。
SQL 指结构化查询语言 SQL 使我们有能力访问数据库 SQL 是一种 ANSI 的标准计算机语言
除了 SQL 标准之外,大部分 SQL 数据库程序都拥有它们自己的私有扩展!
下面的例子是一个名为 &Persons& 的表:
Oxford Street
Fifth Avenue
Changan Street
SELECT LastName FROM Persons
结果集类似这样:
一定要记住,SQL 对大小写不敏感!
分号是在数据库系统中分隔每条 SQL 语句的标准方法
如果您使用的是 MS Access 和 SQL Server 2000,则不必在每条 SQL 语句之后使用分号,不过某些数据库软件要求必须使用分号。
可以把 SQL 分为两个部分:数据操作语言 (DML) 和 数据定义语言 (DDL)。
查询和更新指令构成了 SQL 的 DML 部分:
SELECT - 从数据库表中获取数据 UPDATE - 更新数据库表中的数据 DELETE - 从数据库表中删除数据 INSERT INTO - 向数据库表中插入数据
SQL 的数据定义语言 (DDL) 部分使我们有能力创建或删除表格。我们也可以定义索引(键),规定表之间的链接,以及施加表间的约束。
SQL 中最重要的 DDL 语句:
CREATE DATABASE - 创建新数据库 ALTER DATABASE - 修改数据库 CREATE TABLE - 创建新表 ALTER TABLE - 变更(改变)数据库表 DROP TABLE - 删除表 CREATE INDEX - 创建索引(搜索键) DROP INDEX - 删除索引
SELECT LastName,FirstName FROM Persons
SELECT * FROM Persons;选取所有列
由 SQL 查询程序获得的结果被存放在一个结果集中。大多数数据库软件系统都允许使用编程函数在结果集中进行导航,比如:Move-To-First-Record、Get-Record-Content、Move-To-Next-Record 等等。比如php等
在表中,可能会包含重复值。这并不成问题,不过,有时您也许希望仅仅列出不同(distinct)的值。
关键词 DISTINCT 用于返回唯一不同的值。例如:
&Orders&表:
OrderNumber
SELECT DISTINCT Company FROM Orders
w3school不重复
where用于条件搜索, 格式如下:
SELECT 列名称 FROM 表名称 WHERE 列 运算符 值
在某个范围内
搜索某种模式
在某些版本的 SQL 中,操作符 && 可以写为 !=。
&Persons& 表
Oxford Street
Fifth Avenue
Changan Street
Xuanwumen 10
SELECT * FROM Persons WHERE City='Beijing'
Changan Street
Xuanwumen 10
SQL 使用单引号来环绕文本值(大部分数据库系统也接受双引号)。如果是数值,请不要使用引号。
between用法:
select * from table where name !='' and id between 1 and 100;
AND 和 OR 可在 WHERE 子语句中把两个或多个条件结合起来。
原始的表 (用在例子中的):
Oxford Street
Fifth Avenue
Changan Street
Xuanwumen 10
SELECT * FROM Persons WHERE FirstName='Thomas' AND LastName='Carter'
Changan Street
ORDER BY 语句用于根据指定的列对结果集进行排序。
ORDER BY 语句默认按照升序对记录进行排序。
如果您希望按照降序对记录进行排序,可以使用 DESC 关键字。
原始的表 (用在例子中的):
Orders 表:
OrderNumber
SELECT Company, OrderNumber FROM Orders ORDER BY Company
OrderNumber
SELECT Company, OrderNumber FROM Orders ORDER BY Company, OrderNumber
OrderNumber
Comapny相同时, orderNumber有效
以逆字母顺序显示公司名称:
SELECT Company, OrderNumber FROM Orders ORDER BY Company DESC
以逆字母顺序显示公司名称,并以数字顺序显示顺序号:
SELECT Company, OrderNumber FROM Orders ORDER BY Company DESC, OrderNumber ASC
INSERT INTO 语句用于向表格中插入新的行。
INSERT INTO 表名称 VALUES (值1, 值2,....)
INSERT INTO table_name (列1, 列2,...) VALUES (值1, 值2,....)
&Persons& 表:
Changan Street
INSERT INTO Persons VALUES ('Gates', 'Bill', 'Xuanwumen 10', 'Beijing')
INSERT INTO Persons (LastName, Address) VALUES ('Wilson', 'Champs-Elysees')
Update 语句用于修改表中的数据。
UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值
Xuanwumen 10
Champs-Elysees
UPDATE Person SET FirstName = 'Fred' WHERE LastName = 'Wilson'
讲wilson的firstname设为fred
UPDATE Person SET Address = 'Zhongshan 23', City = 'Nanjing'WHERE LastName = 'Wilson'
DELETE 语句用于删除表中的行。
DELETE FROM 表名称 WHERE 列名称 = 值
DELETE FROM Person WHERE LastName = 'Wilson'
DELETE FROM table_name: 保留表格, 删除所有行
TOP 子句用于规定要返回的记录的数目。并非所有的数据库系统都支持 TOP 子句。
SELECT TOP number|percent column_name(s)
FROM table_name
在MySQL 中语法为:
SELECT column_name(s)
FROM table_name
LIMIT number
在Oracle 中语法为:
SELECT column_name(s)
FROM table_name
WHERE ROWNUM &= number
SELECT TOP 2 * FROM Persons; 返回头两行
LIKE 操作符用于在 WHERE 子句中搜索列中的指定模式。
SQL LIKE 操作符语法
SELECT column_name(s)
FROM table_name
WHERE column_name LIKE pattern
SELECT * FROM Persons WHERE City LIKE '%lon%'; 返回city包含lon的行
SELECT * FROM Persons WHERE City NOT LIKE '%lon%'; 返回city不包含lon的行
在 SQL 中,可使用以下通配符:
替代一个或多个字符
仅替代一个字符
[charlist]
字符列中的任何单一字符
[^charlist]
[!charlist]
不在字符列中的任何单一字
如果要搜&_&, 怎么办?
IN 操作符允许我们在 WHERE 子句中规定多个值。
SELECT column_name(s)
FROM table_name
WHERE column_name IN (value1,value2,...)
SELECT * FROM PersonsWHERE LastName IN ('Adams','Carter'); 选择lastname是adams和carter的行
操作符 BETWEEN ... AND 会选取介于两个值之间的数据范围。这些值可以是数值、文本或者日期。
SELECT * FROM Persons WHERE LastName BETWEEN 'Adams' AND 'Carter';
不同的数据库对 BETWEEN...AND 操作符的处理方式是有差异的。某些数据库会列出介于 &Adams& 和 &Carter& 之间的人,但不包括 &Adams& 和 &Carter& ;某些数据库会列出介于 &Adams& 和 &Carter& 之间并包括 &Adams& 和 &Carter& 的人;而另一些数据库会列出介于 &Adams& 和 &Carter& 之间的人,包括 &Adams& ,但不包括 &Carter& 。
SELECT * FROM Persons WHERE LastName NOT BETWEEN 'Adams' AND 'Carter'; 不在此之间
通过使用 SQL,可以为列名称和表名称指定别名(Alias)。
表的 SQL Alias 语法
SELECT column_name(s)
FROM table_name
AS alias_name
SELECT column_name AS alias_name
FROM table_name
可以在多张表中查找,以得到组合的输出结果, 用表名区分, 例如:
SELECT Product_Orders.OrderID, Persons.LastName, Persons.FirstNameFROM Persons, Product_OrdersWHERE Persons.LastName='Adams' AND Persons.FirstName='John'
别名可简化名称:
SELECT po.OrderID, p.LastName, p.FirstNameFROM Persons AS p, Product_OrdersAS poWHERE p.LastName='Adams' AND p.FirstName='John'
如果给列起别名, 那么输出表的列就是这个别名, 例如:
SELECT LastName AS Family, FirstName AS NameFROM Persons
有时为了得到完整的结果,我们需要从两个或更多的表中获取结果。我们就需要执行 join。
数据库中的表可通过键将彼此联系起来。主键(Primary Key)是一个列,在这个列中的每一行的值都是唯一的。在表中,每个主键的值都是唯一的。这样做的目的是在不重复每个表中的所有数据的情况下,把表间的数据交叉捆绑在一起。
请看 &Persons& 表:
Oxford Street
Fifth Avenue
Changan Street
id_p是persons表的主键
接下来请看 &Orders& 表:
id_o是orders的主键。
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNoFROM Persons, OrdersWHERE Persons.Id_P = Orders.Id_P
也可join, 输出与上面相同。
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo FROM Persons
INNER JOIN OrdersON Persons.Id_P = Orders.Id_PORDER BY Persons.LastName
不同的join:
JOIN: 如果表中有至少一个匹配,则返回行 LEFT JOIN: 即使右表中没有匹配,也从左表返回所有的行 RIGHT JOIN: 即使左表中没有匹配,也从右表返回所有的行 FULL JOIN: 只要其中一个表中存在匹配,就返回行
inner join:INNER JOIN 与 JOIN 是相同的
SELECT column_name(s)FROM table_name1INNER JOIN table_name2 ON table_name1.column_name=table_name2.column_name
left join:在某些数据库中, LEFT JOIN 称为 LEFT OUTER JOIN。
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNoFROM PersonsLEFT JOIN OrdersON Persons.Id_P=Orders.Id_PORDER BY Persons.LastName
会把前面例子中的bush也列出, 那个在order中没有订单
right join:在某些数据库中, RIGHT JOIN 称为 RIGHT OUTER JOIN。
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNoFROM PersonsRIGHT JOIN OrdersON Persons.Id_P=Orders.Id_PORDER BY Persons.LastName
这个order在persons表中没有对应!
full join:在某些数据库中, FULL JOIN 称为 FULL OUTER JOIN。
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNoFROM PersonsFULL JOIN OrdersON Persons.Id_P=Orders.Id_PORDER BY Persons.LastName
前面left 和right的结合(left 或者 right 存在, 不需要匹配, inner join则需要条件匹配)。
UNION 操作符用于合并两个或多个 SELECT 语句的结果集。
UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同。
SELECT column_name(s) FROM table_name1UNIONSELECT column_name(s) FROM table_name2
默认地,UNION 操作符选取不同的值。如果允许重复的值,请使用 UNION ALL。
SELECT column_name(s) FROM table_name1UNION ALLSELECT column_name(s) FROM table_name2
另外,UNION 结果集中的列名总是等于 UNION 中第一个 SELECT 语句中的列名。
Employees_China:
Zhang, Hua
Carter, Thomas
Yang, Ming
Employees_USA:
Adams, John
Bush, George
Carter, Thomas
Gates, Bill
使用union的结果:
Zhang, Hua
Carter, Thomas
Yang, Ming
Adams, John
Bush, George
Gates, Bill
使用union all的结果:
Zhang, Hua
Carter, Thomas
Yang, Ming
Adams, John
Bush, George
Carter, Thomas
Gates, Bill
SELECT INTO 语句从一个表中选取数据,然后把数据插入另一个表中。
SELECT INTO 语句常用于创建表的备份复件或者用于对记录进行存档。
您可以把所有的列插入新表:
INTO new_table_name [IN externaldatabase]
FROM old_tablename
或者只把希望的列插入新表:
SELECT column_name(s)
INTO new_table_name [IN externaldatabase]
FROM old_tablename
IN 子句可用于向另一个数据库中拷贝表:
INTO Persons IN 'Backup.mdb'
下面的例子通过从 &Persons& 表中提取居住在 &Beijing& 的人的信息,创建了一个带有两个列的名为 &Persons_backup& 的表:
SELECT LastName,Firstname
INTO Persons_backup
FROM Persons
WHERE City='Beijing'
下面的例子会创建一个名为 &Persons_Order_Backup& 的新表,其中包含了从 Persons 和 Orders 两个表中取得的信息:
SELECT Persons.LastName,Orders.OrderNo
INTO Persons_Order_Backup
FROM Persons
INNER JOIN Orders
ON Persons.Id_P=Orders.Id_P
CREATE DATABASE 用于创建数据库。
CREATE DATABASE database_name
CREATE TABLE 语句用于创建数据库中的表。
CREATE TABLE 表名称(列名称1 数据类型,列名称2 数据类型,列名称3 数据类型,....)
数据类型(data_type)规定了列可容纳何种数据类型。下面的表格包含了SQL中最常用的数据类型:
integer(size) int(size) smallint(size) tinyint(size)
仅容纳整数。在括号内规定数字的最大位数。
decimal(size,d) numeric(size,d)
容纳带有小数的数字。
&size& 规定数字的最大位数。&d& 规定小数点右侧的最大位数。
char(size)
容纳固定长度的字符串(可容纳字母、数字以及特殊字符)。
在括号中规定字符串的长度。
varchar(size)
容纳可变长度的字符串(可容纳字母、数字以及特殊的字符)。
在括号中规定字符串的最大长度。
date(yyyymmdd)
容纳日期。
本例演示如何创建名为 &Person& 的表。
该表包含 5 个列,列名分别是:&Id_P&、&LastName&、&FirstName&、&Address& 以及 &City&:
CREATE TABLE Persons
LastName varchar(255),
FirstName varchar(255),
Address varchar(255),
City varchar(255)
约束用于限制加入表的数据的类型。
可以在创建表时规定约束(通过 CREATE TABLE 语句),或者在表创建之后也可以(通过 ALTER TABLE 语句)。
我们将主要探讨以下几种约束:
NOT NULL UNIQUE PRIMARY KEY FOREIGN KEY CHECK DEFAULT
NOT NULL 约束强制列不接受 NULL 值。
NOT NULL 约束强制字段始终包含值。这意味着,如果不向字段添加值,就无法插入新纪录或者更新记录。
下面的 SQL 语句强制 &Id_P& 列和 &LastName& 列不接受 NULL 值:
CREATE TABLE Persons
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
UNIQUE 约束唯一标识数据库表中的每条记录。
UNIQUE 和 PRIMARY KEY 约束均为列或列集合提供了唯一性的保证。
PRIMARY KEY 拥有自动定义的 UNIQUE 约束。
请注意,每个表可以有多个 UNIQUE 约束,但是每个表只能有一个 PRIMARY KEY 约束。
下面的 SQL 在 &Persons& 表创建时在 &Id_P& 列创建 UNIQUE 约束:
CREATE TABLE Persons
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
UNIQUE (Id_P)
SQL Server / Oracle / MS Access:
CREATE TABLE Persons
Id_P int NOT NULL UNIQUE,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
给多个列申请unigue:
MySQL / SQL Server / Oracle / MS Access:
CREATE TABLE Persons
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
CONSTRAINT uc_PersonID UNIQUE (Id_P,LastName)
使用alter table增加unique约束:
MySQL / SQL Server / Oracle / MS Access:
ALTER TABLE Persons
ADD UNIQUE (P_Id)
ALTER TABLE Persons
ADD CONSTRAINT uc_PersonID UNIQUE (P_Id,LastName)
撤销unique:
ALTER TABLE Persons
DROP INDEX uc_PersonID
SQL Server / Oracle / MS Access:
ALTER TABLE Persons
DROP CONSTRAINT uc_PersonID
PRIMARY KEY 约束唯一标识数据库表中的每条记录。
主键必须包含唯一的值。
主键列不能包含 NULL 值。
每个表都应该有一个主键,并且每个表只能有一个主键。
CREATE TABLE Persons
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
PRIMARY KEY (Id_P)
SQL Server / Oracle / MS Access:
CREATE TABLE Persons
Id_P int NOT NULL PRIMARY KEY,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
如果需要命名 PRIMARY KEY 约束,以及为多个列定义 PRIMARY KEY 约束,请使用下面的 SQL 语法:
MySQL / SQL Server / Oracle / MS Access:
CREATE TABLE Persons
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
CONSTRAINT uc_PersonID PRIMARY KEY (Id_P,LastName)
ADD PRIMARY KEY (Id_P)
ADD CONSTRAINT pk_PersonID PRIMARY KEY (Id_P,LastName)
DROP PRIMARY KEY
DROP CONSTRAINT pk_PersonID
一个表中的 FOREIGN KEY 指向另一个表中的 PRIMARY KEY。
FOREIGN KEY 约束用于预防破坏表之间连接的动作。
FOREIGN KEY 约束也能防止非法数据插入外键列,因为它必须是它指向的那个表中的值之一。
CREATE TABLE Orders
O_Id int NOT NULL,
OrderNo int NOT NULL,
PRIMARY KEY (O_Id),
FOREIGN KEY (Id_P) REFERENCES Persons(Id_P)
SQL Server / Oracle / MS Access:
CREATE TABLE Orders
O_Id int NOT NULL PRIMARY KEY,
OrderNo int NOT NULL,
Id_P int FOREIGN KEY REFERENCES Persons(Id_P)
如果需要命名 FOREIGN KEY 约束,以及为多个列定义 FOREIGN KEY 约束,请使用下面的 SQL 语法:
MySQL / SQL Server / Oracle / MS Access:
CREATE TABLE Orders
O_Id int NOT NULL,
OrderNo int NOT NULL,
PRIMARY KEY (O_Id),
CONSTRAINT fk_PerOrders FOREIGN KEY (Id_P)
REFERENCES Persons(Id_P)
如果在 &Orders& 表已存在的情况下为 &Id_P& 列创建 FOREIGN KEY 约束,请使用下面的 SQL:
MySQL / SQL Server / Oracle / MS Access:
ALTER TABLE Orders
ADD FOREIGN KEY (Id_P)
REFERENCES Persons(Id_P)
如果需要命名 FOREIGN KEY 约束,以及为多个列定义 FOREIGN KEY 约束,请使用下面的 SQL 语法:
MySQL / SQL Server / Oracle / MS Access:
ALTER TABLE Orders
ADD CONSTRAINT fk_PerOrders
FOREIGN KEY (Id_P)
REFERENCES Persons(Id_P)
撤销 FOREIGN KEY 约束
如需撤销 FOREIGN KEY 约束,请使用下面的 SQL:
ALTER TABLE Orders
DROP FOREIGN KEY fk_PerOrders
SQL Server / Oracle / MS Access:
ALTER TABLE Orders
DROP CONSTRAINT fk_PerOrders
CHECK 约束用于限制列中的值的范围。
下面的 SQL 在 &Persons& 表创建时为 &Id_P& 列创建 CHECK 约束。CHECK 约束规定 &Id_P& 列必须只包含大于 0 的整数。
CREATE TABLE Persons
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
CHECK (Id_P&0)
SQL Server / Oracle / MS Access:
CREATE TABLE Persons
Id_P int NOT NULL CHECK (Id_P&0),
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
如果需要命名 CHECK 约束,以及为多个列定义 CHECK 约束,请使用下面的 SQL 语法:
MySQL / SQL Server / Oracle / MS Access:
CREATE TABLE Persons
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
CONSTRAINT chk_Person CHECK (Id_P&0 AND City='Sandnes')
ALTER TABLE PersonsADD CHECK (Id_P&0)
ALTER TABLE Persons
ADD CONSTRAINT chk_Person CHECK (Id_P&0 AND City='Sandnes')
ALTER TABLE Persons
DROP CONSTRAINT chk_Person
DEFAULT 约束用于向列中插入默认值。格式与其他约束相似
通过使用类似 GETDATE() 这样的函数,DEFAULT 约束也可以用于插入系统值:
CREATE TABLE Orders
Id_O int NOT NULL,
OrderNo int NOT NULL,
OrderDate date DEFAULT GETDATE()----》who provide such function?????
如果在表已存在的情况下为 &City& 列创建 DEFAULT 约束,请使用下面的 SQL:
ALTER TABLE Persons
ALTER City SET DEFAULT 'SANDNES'------&注意这里的SET和ALTER
SQL Server / Oracle / MS Access:
ALTER TABLE Persons
ALTER COLUMN City SET DEFAULT 'SANDNES'
如需撤销 DEFAULT 约束,请使用下面的 SQL:
ALTER TABLE Persons
ALTER City DROP DEFAULT--------&注意这里的ALTER
SQL Server / Oracle / MS Access:
ALTER TABLE Persons
ALTER COLUMN City DROP DEFAULT
您可以在表中创建索引,以便更加快速高效地查询数据。
用户无法看到索引,它们只能被用来加速搜索/查询。
注释:更新一个包含索引的表需要比更新一个没有索引的表更多的时间,这是由于索引本身也需要更新。因此,理想的做法是仅仅在常常被搜索的列(以及表)上面创建索引。
在表上创建一个简单的索引。允许使用重复的值:
CREATE INDEX index_name
ON table_name (column_name)
注释:&column_name& 规定需要索引的列。
在表上创建一个唯一的索引。唯一的索引意味着两个行不能拥有相同的索引值。
CREATE UNIQUE INDEX index_name
ON table_name (column_name)
如果您希望以降序索引某个列中的值,您可以在列名称之后添加保留字 DESC:
CREATE INDEX PersonIndex
ON Person (LastName DESC)
假如您希望索引不止一个列,您可以在括号中列出这些列的名称,用逗号隔开:
CREATE INDEX PersonIndex
ON Person (LastName, FirstName)
我们可以使用 DROP INDEX 命令删除表格中的索引。
用于 Microsoft SQLJet (以及 Microsoft Access) 的语法:
DROP INDEX index_name ON table_name
用于 MS SQL Server 的语法:
DROP INDEX table_name.index_name
用于 IBM DB2 和 Oracle 语法:
DROP INDEX index_name
用于 MySQL 的语法:
ALTER TABLE table_name DROP INDEX index_name
DROP TABLE 语句用于删除表(表的结构、属性以及索引也会被删除):
DROP TABLE 表名称
DROP DATABASE 语句用于删除数据库:
DROP DATABASE 数据库名称
如果我们仅仅需要除去表内的数据,但并不删除表本身,那么我们该如何做呢?
请使用 TRUNCATE TABLE 命令(仅仅删除表格中的数据):
TRUNCATE TABLE 表名称
ALTER TABLE 语句用于在已有的表中添加、修改或删除列。
如需在表中添加列,请使用下列语法:
ALTER TABLE table_name
ADD column_name datatype
要删除表中的列,请使用下列语法:
ALTER TABLE table_name
DROP COLUMN column_name
某些数据库系统不允许这种在数据库表中删除列的方式 (DROP COLUMN column_name)。
要改变表中列的数据类型,请使用下列语法:
ALTER TABLE table_name
ALTER COLUMN column_name datatype
我们通常希望在每次插入新纪录时,自动地创建主键字段的值。
我们可以在表中创建一个 auto-increment 字段。
用于 MySQL 的语法
下列 SQL 语句把 &Persons& 表中的 &P_Id& 列定义为 auto-increment 主键:
CREATE TABLE Persons
P_Id int NOT NULL AUTO_INCREMENT,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
PRIMARY KEY (P_Id)
默认地,AUTO_INCREMENT 的开始值是 1,每条新纪录递增 1。
要让 AUTO_INCREMENT 序列以其他的值起始,请使用下列 SQL 语法:
ALTER TABLE Persons AUTO_INCREMENT=100
用于 SQL Server 的语法
下列 SQL 语句把 &Persons& 表中的 &P_Id& 列定义为 auto-increment 主键:
CREATE TABLE Persons
P_Id int PRIMARY KEY IDENTITY,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
MS SQL 使用 IDENTITY 关键字来执行 auto-increment 任务。
默认地,IDENTITY 的开始值是 1,每条新纪录递增 1。
要规定 &P_Id& 列以 20 起始且递增 10,请把 identity 改为 IDENTITY(20,10)
用于 Access 的语法
下列 SQL 语句把 &Persons& 表中的 &P_Id& 列定义为 auto-increment 主键:
CREATE TABLE Persons
P_Id int PRIMARY KEY AUTOINCREMENT,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
MS Access 使用 AUTOINCREMENT 关键字来执行 auto-increment 任务。
默认地,AUTOINCREMENT 的开始值是 1,每条新纪录递增 1。
要规定 &P_Id& 列以 20 起始且递增 10,请把 autoincrement 改为 AUTOINCREMENT(20,10)
用于 Oracle 的语法
在 Oracle 中,代码稍微复杂一点。
您必须通过 sequence 对创建 auto-increment 字段(该对象生成数字序列)。
请使用下面的 CREATE SEQUENCE 语法:
CREATE SEQUENCE seq_person
MINVALUE 1
START WITH 1
INCREMENT BY 1
上面的代码创建名为 seq_person 的序列对象,它以 1 起始且以 1 递增。该对象缓存 10 个值以提高性能。CACHE 选项规定了为了提高访问速度要存储多少个序列值。
在 SQL 中,视图是基于 SQL 语句的结果集的可视化的表。
视图来自与视图或者表。可以用sql的语句操作, 看起来跟表差不多。
视图反映的是表的最新信息的一个方面。
数据库的设计和结构不会受到视图中的函数、where 或 join 语句的影响。
SQL CREATE VIEW 语法
CREATE VIEW view_name AS
SELECT column_name(s)
FROM table_name
WHERE condition
样本数据库 Northwind 拥有一些被默认安装的视图。视图 &Current Product List& 会从 Products 表列出所有正在使用的产品。这个视图使用下列 SQL 创建:
CREATE VIEW [Current Product List] AS
SELECT ProductID,ProductName
FROM Products
WHERE Discontinued=No
我们可以查询上面这个视图:
SELECT * FROM [Current Product List]
Northwind 样本数据库的另一个视图会选取 Products 表中所有单位价格高于平均单位价格的产品:
CREATE VIEW [Products Above Average Price] AS
SELECT ProductName,UnitPrice
FROM Products
WHERE UnitPrice&(SELECT AVG(UnitPrice) FROM Products)
另一个来自 Northwind 数据库的视图实例会计算在 1997 年每个种类的销售总数。请注意,这个视图会从另一个名为 &Product Sales for 1997& 的视图那里选取数据:
CREATE VIEW [Category Sales For 1997] AS
SELECT DISTINCT CategoryName,Sum(ProductSales) AS CategorySales
FROM [Product Sales for 1997]
GROUP BY CategoryName
您可以使用下面的语法来更新视图:
SQL CREATE OR REPLACE VIEW Syntax
CREATE OR REPLACE VIEW view_name AS
SELECT column_name(s)
FROM table_name
WHERE condition
现在,我们希望向 &Current Product List& 视图添加 &Category& 列。我们将通过下列 SQL 更新视图:
CREATE VIEW [Current Product List] AS
SELECT ProductID,ProductName,Category
FROM Products
WHERE Discontinued=No
您可以通过 DROP VIEW 命令来删除视图。
SQL DROP VIEW Syntax
DROP VIEW view_name
MySQL Date 函数
下面的表格列出了 MySQL 中最重要的内建日期函数:
返回当前的日期和时间
返回当前的日期
返回当前的时间
提取日期或日期/时间表达式的日期部分
返回日期/时间按的单独部分
给日期添加指定的时间间隔
从日期减去指定的时间间隔
返回两个日期之间的天数
用不同的格式显示日期/时间
SQL Server Date 函数
下面的表格列出了 SQL Server 中最重要的内建日期函数:
返回当前日期和时间
返回日期/时间的单独部分
在日期中添加或减去指定的时间间隔
返回两个日期之间的时间
用不同的格式显示日期/时间
MySQL 使用下列数据类型在数据库中存储日期或日期/时间值:
DATE - 格式 YYYY-MM-DD DATETIME - 格式: YYYY-MM-DD HH:MM:SS TIMESTAMP - 格式: YYYY-MM-DD HH:MM:SS YEAR - 格式 YYYY 或 YY
SQL Server 使用下列数据类型在数据库中存储日期或日期/时间值:
DATE - 格式 YYYY-MM-DD DATETIME - 格式: YYYY-MM-DD HH:MM:SS SMALLDATETIME - 格式: YYYY-MM-DD HH:MM:SS TIMESTAMP - 格式: 唯一的数字
当列中只有日期, 没有时间的时候, 可用下列语句返回结果:
SELECT * FROM Orders WHERE OrderDate=''
但如果日期后面带时间, 用上述语句就不行了。
单元格是NULL, 表明没有往单元格填充数据, 是可选项, 在注册用户的时候常有这种情况。
如果表中的某个列是可选的,那么我们可以在不向该列添加值的情况下插入新纪录或更新已有的记录。这意味着该字段将以 NULL 值保存。
NULL 值的处理方式与其他值不同。
NULL 用作未知的或不适用的值的占位符。
注释:无法比较 NULL 和 0;它们是不等价的。
无法使用比较运算符来测试 NULL 值,比如 =, &, 或者 &&。
我们必须使用 IS NULL 和 IS NOT NULL 操作符。
我们必须使用 IS NULL 操作符:
SELECT LastName,FirstName,Address FROM Persons
WHERE Address IS NULL
我们必须使用 IS NOT NULL 操作符:
SELECT LastName,FirstName,Address FROM Persons
WHERE Address IS NOT NULL
NULL的例子:
请看下面的 &Products& 表:
ProductName
UnitsInStock
UnitsOnOrder
我们使用如下 SELECT 语句:
SELECT ProductName,UnitPrice*(UnitsInStock+UnitsOnOrder)
FROM Products
在上面的例子中,如果有 &UnitsOnOrder& 值是 NULL,那么结果是 NULL。
使用SQL ISNULL()(sql server(ms sql)/ms access)、NVL()(oracle)、IFNULL()(mysql) 和 COALESCE()(my sql) 函数
SELECT ProductName,UnitPrice*(UnitsInStock+ISNULL(UnitsOnOrder,0))FROM Products
如果NULL的时候返回0, 否则返回表项值。
其他函数用法相似。
Microsoft Access 数据类型
用于文本或文本与数字的组合。最多 255 个字符。
Memo 用于更大数量的文本。最多存储 65,536 个字符。
注释:无法对 memo 字段进行排序。不过它们是可搜索的。
允许 0 到 255 的数字。
允许介于 -32,768 到 32,767 之间的数字。
允许介于 -2,147,483,648 与 2,147,483,647 之间的全部数字
单精度浮点。处理大多数小数。
双精度浮点。处理大多数小数。
用于货币。支持 15 位的元,外加 4 位小数。
提示:您可以选择使用哪个国家的货币。
AutoNumber
AutoNumber 字段自动为每条记录分配数字,通常从 1 开始。
用于日期和时间
逻辑字段,可以显示为 Yes/No、True/False 或 On/Off。
在代码中,使用常量 True 和 False (等价于 1 和 0)
注释:Yes/No 字段中不允许 Null 值
Ole Object
可以存储图片、音频、视频或其他 BLOBs (Binary Large OBjects)
包含指向其他文件的链接,包括网页。
Lookup Wizard
允许你创建一个可从下列列表中进行选择的选项列表。
MySQL 数据类型
在 MySQL 中,有三种主要的类型:文本、数字和日期/时间类型。
Text 类型:
CHAR(size)
保存固定长度的字符串(可包含字母、数字以及特殊字符)。在括号中指定字符串的长度。最多 255 个字符。
VARCHAR(size)
保存可变长度的字符串(可包含字母、数字以及特殊字符)。在括号中指定字符串的最大长度。最多 255 个字符。
注释:如果值的长度大于 255,则被转换为 TEXT 类型。
存放最大长度为 255 个字符的字符串。
存放最大长度为 65,535 个字符的字符串。
用于 BLOBs (Binary Large OBjects)。存放最多 65,535 字节的数据。
MEDIUMTEXT
存放最大长度为 16,777,215 个字符的字符串。
MEDIUMBLOB
用于 BLOBs (Binary Large OBjects)。存放最多 16,777,215 字节的数据。
存放最大长度为 4,294,967,295 个字符的字符串。
用于 BLOBs (Binary Large OBjects)。存放最多 4,294,967,295 字节的数据。
ENUM(x,y,z,etc.)
允许你输入可能值的列表。可以在 ENUM 列表中列出最大 65535 个值。如果列表中不存在插入的值,则插入空值。
注释:这些值是按照你输入的顺序存储的。
可以按照此格式输入可能的值:ENUM('X','Y','Z')
与 ENUM 类似,SET 最多只能包含 64 个列表项,不过 SET 可存储一个以上的值。
Number 类型:
TINYINT(size)
-128 到 127 常规。0 到 255 无符号*。在括号中规定最大位数。
SMALLINT(size)
-32768 到 32767 常规。0 到 65535 无符号*。在括号中规定最大位数。
MEDIUMINT(size)
-8388608 到 8388607 普通。0 to
无符号*。在括号中规定最大位数。
常规。0 到
无符号*。在括号中规定最大位数。
BIGINT(size)
-4775808 到 4775807 常规。0 到
无符号*。在括号中规定最大位数。
FLOAT(size,d)
带有浮动小数点的小数字。在括号中规定最大位数。在 d 参数中规定小数点右侧的最大位数。
DOUBLE(size,d)
带有浮动小数点的大数字。在括号中规定最大位数。在 d 参数中规定小数点右侧的最大位数。
DECIMAL(size,d)
作为字符串存储的 DOUBLE 类型,允许固定的小数点。
* 这些整数类型拥有额外的选项 UNSIGNED。通常,整数可以是负数或正数。如果添加 UNSIGNED 属性,那么范围将从 0 开始,而不是某个负数。
Date 类型:
日期。格式:YYYY-MM-DD
注释:支持的范围是从 '' 到 ''
DATETIME()
*日期和时间的组合。格式:YYYY-MM-DD HH:MM:SS
注释:支持的范围是从 ' 00:00:00' 到 ' 23:59:59'
TIMESTAMP()
*时间戳。TIMESTAMP 值使用 Unix 纪元(' 00:00:00' UTC) 至今的描述来存储。格式:YYYY-MM-DD HH:MM:SS
注释:支持的范围是从 ' 00:00:01' UTC 到 ' 03:14:07' UTC
时间。格式:HH:MM:SS 注释:支持的范围是从 '-838:59:59' 到 '838:59:59'
2 位或 4 位格式的年。
注释:4 位格式所允许的值:1901 到 2155。2 位格式所允许的值:70 到 69,表示从 1970 到 2069。
* 即便 DATETIME 和 TIMESTAMP 返回相同的格式,它们的工作方式很不同。在 INSERT 或 UPDATE 查询中,TIMESTAMP 自动把自身设置为当前的日期和时间。TIMESTAMP 也接受不同的格式,比如 YYYYMMDDHHMMSS、YYMMDDHHMMSS、YYYYMMDD 或 YYMMDD。
SQL Server 数据类型
Character 字符串:
固定长度的字符串。最多 8,000 个字符。
varchar(n)
可变长度的字符串。最多 8,000 个字符。
varchar(max)
可变长度的字符串。最多 1,073,741,824 个字符。
可变长度的字符串。最多 2GB 字符数据。
Unicode 字符串:
固定长度的 Unicode 数据。最多 4,000 个字符。
nvarchar(n)
可变长度的 Unicode 数据。最多 4,000 个字符。
nvarchar(max)
可变长度的 Unicode 数据。最多 536,870,912 个字符。
可变长度的 Unicode 数据。最多 2GB 字符数据。
Binary 类型:
允许 0、1 或 NULL
固定长度的二进制数据。最多 8,000 字节。
varbinary(n)
可变长度的二进制数据。最多 8,000 字节。
varbinary(max)
可变长度的二进制数据。最多 2GB 字节。
可变长度的二进制数据。最多 2GB。
Number 类型:
允许从 0 到 255 的所有数字。
允许从 -32,768 到 32,767 的所有数字。
允许从 -2,147,483,648 到 2,147,483,647 的所有数字。
允许介于 -9,223,372,036,854,775,808 和 9,223,372,036,854,775,807 之间的所有数字。
decimal(p,s)
固定精度和比例的数字。允许从 -10^38 +1 到 10^38 -1 之间的数字。
p 参数指示可以存储的最大位数(小数点左侧和右侧)。p 必须是 1 到 38 之间的值。默认是 18。
s 参数指示小数点右侧存储的最大位数。s 必须是 0 到 p 之间的值。默认是 0。
numeric(p,s)
固定精度和比例的数字。允许从 -10^38 +1 到 10^38 -1 之间的数字。
p 参数指示可以存储的最大位数(小数点左侧和右侧)。p 必须是 1 到 38 之间的值。默认是 18。
s 参数指示小数点右侧存储的最大位数。s 必须是 0 到 p 之间的值。默认是 0。
smallmoney
介于 -214,748.3648 和 214,748.3647 之间的货币数据。
介于 -922,337,203,685,477.5808 和 922,337,203,685,477.5807 之间的货币数据。
从 -1.79E + 308 到 1.79E + 308 的浮动精度数字数据。参数 n 指示该字段保存 4 字节还是 8 字节。float(24) 保存 4 字节,而 float(53) 保存 8 字节。n 的默认值是 53。
4 或 8 字节
从 -3.40E + 38 到 3.40E + 38 的浮动精度数字数据。
Date 类型:
从 1753 年 1 月 1 日 到 9999 年 12 月 31 日,精度为 3.33 毫秒。
从 1753 年 1 月 1 日 到 9999 年 12 月 31 日,精度为 100 纳秒。
smalldatetime
从 1900 年 1 月 1 日 到 2079 年 6 月 6 日,精度为 1 分钟。
仅存储日期。从 0001 年 1 月 1 日 到 9999 年 12 月 31 日。
仅存储时间。精度为 100 纳秒。
datetimeoffset
与 datetime2 相同,外加时区偏移。
8-10 bytes
存储唯一的数字,每当创建或修改某行时,该数字会更新。timestamp 基于内部时钟,不对应真实时间。每个表只能有一个 timestamp 变量。
其他数据类型:
sql_variant
存储最多 8,000 字节不同数据类型的数据,除了 text、ntext 以及 timestamp。
uniqueidentifier
存储全局标识符 (GUID)。
存储 XML 格式化数据。最多 2GB。
存储对用于数据库操作的指针的引用。
存储结果集,供稍后处理。
数据库管理系统是一种可以访问数据库中数据的计算机程序。
DBMS 使我们有能力在数据库中提取、修改或者存贮信息。
不同的 DBMS 提供不同的函数供查询、提交以及修改数据。
RDBMS 是 SQL 的基础,也是所有现代数据库系统诸如 Oracle、SQL Server、IBM DB2、Sybase、MySQL 以及 Microsoft Access 的基础。
&选择price大于avg的customer:
&SELECT Customer FROM OrdersWHERE OrderPrice&(SELECT AVG(OrderPrice) FROM Orders)
GROUP BY 语句用于结合合计函数,根据一个或多个列对结果集进行分组。
我们拥有下面这个 &Orders& 表:
OrderPrice
我们使用下列 SQL 语句:
SELECT Customer,SUM(OrderPrice) FROM Orders
GROUP BY Customer
结果集类似这样:
SUM(OrderPrice)
如果不用group by,
结果集类似这样:
SUM(OrderPrice)
在 SQL 中增加 HAVING 子句原因是,WHERE 关键字无法与合计函数(sum)一起使用
我们使用如下 SQL 语句:
SELECT Customer,SUM(OrderPrice) FROM Orders
GROUP BY Customer
HAVING SUM(OrderPrice)&2000
用having就可返回price&2000的订单
我们在 SQL 语句中增加了一个普通的 WHERE 子句:
SELECT Customer,SUM(OrderPrice) FROM Orders
WHERE Customer='Bush' OR Customer='Adams'
GROUP BY Customer
HAVING SUM(OrderPrice)&1500
format函数使用:
&SELECT ProductName, UnitPrice, FORMAT(Now(),'YYYY-MM-DD') as PerDateFROM Products
下面是有人发现的move table的方法, 在哪里可用?
move table 比 exp/imp 和 create table xxx as select *
1、Privileges and constraints to be kept
2、The table strcture to be changed
3、Movement to another tablespace
4、The command to be parallelized
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:312815次
积分:4977
积分:4977
排名:第1704名
原创:137篇
转载:440篇
评论:36条
(10)(2)(15)(20)(16)(12)(7)(11)(10)(4)(4)(6)(20)(33)(7)(16)(26)(13)(9)(21)(8)(3)(1)(11)(10)(10)(12)(15)(32)(48)(37)(18)(20)(22)(12)(4)(1)(1)(3)(1)(2)(5)(7)(5)(4)(5)(18)
说的太好了,我顶!
Copyright & 2014
Corporation, All Rights Reserved
Processed in 0.0062 second(s), 3 db_queries,
0 rpc_queries}

我要回帖

更多关于 sql更新语句怎么写 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信