① sql server中关系型数据库的第一、第二、第三标准形式的各自要求是什么
第一范式的目标是确保每列的原子性
如果每列都是不可再分的最小数据单元(也称为最小的原子单元),则满足第一范式(1NF)
如果一个关系满足1NF,并且除了主键以外的其他列,都依赖与该主键,则满足第二范式(2NF)
第二范式要求每个表只描述一件事情
如果一个关系满足2NF,并且除了主键以外的其他列都不传递依赖于主键列,则满足第三范式(3NF)
② SQL语句执行流程与顺序原理解析
SQL语句执行流程与顺序原理解析
Oracle语句执行流程
第一步:客户端把语句发给服务器端执行
当我们在客户端执行SQL语句时,客户端会把这条SQL语句发送给服务器端,让服务器端的进程来处理这语句。也就是说,Oracle 客户端是不会做任何的操作,他的主要任务就是把客户端产生的一些SQL语句发送给服务器端。服务器进程从用户进程把信息接收到后, 在PGA 中就要此进程分配所需内存,存储相关的信息,如:在会话内存存储相关的登录信息等。
虽然在客户端也有一个数据库进程,但是,这个进程的作用跟服务器上的进程作用是不相同的,服务器上的数据库进程才会对SQL 语句进行相关的处理。不过,有个问题需要说明,就是客户端的进程跟服务器的进程是一一对应的。也就是说,在客户端连接上服务器后,在客户端与服务器端都会形成一个进程,客户端上的我们叫做客户端进程,而服务器上的我们叫做服务器进程。
第二步:语句解析
当客户端把SQL语句传送到服务器后,服务器进程会对该语句进行解析。这个解析的工作是在服务器端所进行的,解析动作又可分为很多小动作。
1)查询高速缓存(library cache)
服务器进程在接到客户端传送过来的SQL语句时,不会直接去数据库查询。服务器进程把这个SQL语句的字符转化为ASCII等效数字码,接着这个ASCII码被传递给一个HASH函数,并返回一个hash值,然后服务器进程将到shared pool中的library cache(高速缓存)中去查找是否存在相同的hash值。如果存在,服务器进程将使用这条语句已高速缓存在SHARED POOL的library cache中的已分析过的版本来执行,省去后续的解析工作,这便是软解析。若调整缓存中不存在,则需要进行后面的步骤,这便是硬解析。硬解析通常是昂贵的操作,大约占整个SQL执行的70%左右的时间,硬解析会生成执行树,执行计划,等等。
所以,采用高速数据缓存的话,可以提高SQL 语句的查询效率。其原因有两方面:一方面是从内存中读取数据要比从硬盘中的数据文件中读取数据效率要高,另一方面也是因为避免语句解析而节省了时间。
不过这里要注意一点,这个数据缓存跟有些客户端软件的数据缓存是两码事。有些客户端软件为了提高查询效率,会在应用软件的客户端设置数据缓存。由于这些数据缓存的存在,可以提高客户端应用软件的查询效率。但是,若其他人在服务器进行了相关的修改,由于应用软件数据缓存的存在,导致修改的数据不能及时反映到客户端上。从这也可以看出,应用软件的数据缓存跟数据库服务器的高速数据缓存不是一码事。
2)语句合法性检查(data dict cache)
当在高速缓存中找不到对应的SQL语句时,则服务器进程就会开始检查这条语句的合法性。这里主要是对SQL语句的语法进行检查,看看其是否合乎语法规则。如果服务器进程认为这条SQL语句不符合语法规则的时候,就会把这个错误信息反馈给客户端。在这个语法检查的过程中,不会对SQL语句中所包含的表名、列名等等进行检查,只是检查语法。
3)语言含义检查(data dict cache)
若SQL 语句符合语法上的定义的话,则服务器进程接下去会对语句中涉及的表、索引、视图等对象进行解析,并对照数据字典检查这些对象的名称以及相关结构,看看这些字段、表、视图等是否在数据库中。如果表名与列名不准确的话,则数据库会就会反馈错误信息给客户端。
所以,有时候我们写select语句的时候,若语法与表名或者列名同时写错的话,则系统是先提示说语法错误,等到语法完全正确后再提示说列名或表名错误。
4)获得对象解析锁(control structer)
当语法、语义都正确后,系统就会对我们需要查询的对象加锁。这主要是为了保障数据的一致性,防止我们在查询的过程中,其他用户对这个对象的结构发生改变。
5)数据访问权限的核对(data dict cache)
当语法、语义通过检查之后,客户端还不一定能够取得数据,服务器进程还会检查连接用户是否有这个数据访问的权限。若用户不具有数据访问权限的话,则客户端就不能够取得这些数据。要注意的是数据库服务器进程先检查语法与语义,然后才会检查访问权限。
6)确定最佳执行计划
当语法与语义都没有问题权限也匹配,服务器进程还是不会直接对数据库文件进行查询。服务器进程会根据一定的规则,对这条语句进行优化。在执行计划开发之前会有一步查询转换,如:视图合并、子查询解嵌套、谓语前推及物化视图重写查询等。为了确定采用哪个执行计划,Oracle还需要收集统计信息确定表的访问联结方法等,最终确定可能的最低成本的执行计划。
不过要注意,这个优化是有限的。一般在应用软件开发的过程中,需要对数据库的sql语句进行优化,这个优化的作用要大大地大于服务器进程的自我优化。
当服务器进程的优化器确定这条查询语句的最佳执行计划后, 就会将这条SQL语句与执行计划保存到数据高速缓存(library cache)。如此,等以后还有这个查询时,就会省略以上的语法、语义与权限检查的步骤,而直接执行SQL语句,提高SQL语句处理效率。
第三步:绑定变量赋值
如果SQL语句中使用了绑定变量,扫描绑定变量的声明,给绑定变量赋值,将变量值带入执行计划。若在解析的第一个步骤,SQL在高速缓冲中存在,则直接跳到该步骤。
第四步:语句执行
语句解析只是对SQL语句的语法进行解析,以确保服务器能够知道这条语句到底表达的是什么意思。等到语句解析完成之后,数据库服务器进程才会真正的执行这条SQL语句。
对于SELECT语句:
1)首先服务器进程要判断所需数据是否在db buffer存在,如果存在且可用,则直接获取该数据而不是从数据库文件中去查询数据,同时根据LRU 算法增加其访问计数;
2)若数据不在缓冲区中,则服务器进程将从数据库文件中查询相关数据,并把这些数据放入到数据缓冲区中(buffer cache)。
其中,若数据存在于db buffer,其可用性检查方式为:查看db buffer块的头部是否有事务,如果有事务,则从回滚段中读取数据;如果没有事务,则比较select的scn和db buffer块头部的scn,如果前者小于后者,仍然要从回滚段中读取数据;如果前者大于后者,说明这是一非脏缓存,可以直接读取这个db buffer块的中内容。
对于DML语句(insert、delete、update):
1)检查所需的数据库是否已经被读取到缓冲区缓存中。如果已经存在缓冲区缓存,则直接执行步骤3;
2)若所需的数据库并不在缓冲区缓存中,则服务器将数据块从数据文件读取到缓冲区缓存中;
3)对想要修改的表取得的数据行锁定(Row Exclusive Lock),之后对所需要修改的数据行取得独占锁;
4)将数据的Redo记录复制到redo log buffer;
5)产生数据修改的undo数据;
6)修改db buffer;
7)dbwr将修改写入数据文件;
其中,第2步,服务器将数据从数据文件读取到db buffer经经历以下步骤:
1)首先服务器进程将在表头部请求TM锁(保证此事务执行过程其他用户不能修改表的结构),如果成功加TM锁,再请求一些行级锁(TX锁),如果TM、TX锁都成功加锁,那么才开始从数据文件读数据。
2)在读数据之前,要先为读取的文件准备好buffer空间。服务器进程需要扫描LRU list寻找free db buffer,扫描的过程中,服务器进程会把发现的所有已经被修改过的db buffer注册到dirty list中。如果free db buffer及非脏数据块缓冲区不足时,会触发dbwr将dirty buffer中指向的缓冲块写入数据文件,并且清洗掉这些缓冲区来腾出空间缓冲新读入的数据。
3)找到了足够的空闲buffer,服务器进程将从数据文件中读入这些行所在的每一个数据块(db block)(DB BLOCK是ORACLE的最小操作单元,即使你想要的数据只是DB BLOCK中很多行中的一行或几行,ORACLE也会把这个DB BLOCK中的所有行都读入Oracle DB BUFFER中)放入db buffer的空闲的区域或者覆盖已被挤出LRU list的非脏数据块缓冲区,并且排列在LRU列表的头部,也就是在数据块放入db buffer之前也是要先申请db buffer中的锁存器,成功加锁后,才能读数据到db buffer。
若数据块已经存在于db buffer cache(有时也称db buffer或db cache),即使在db buffer中找到一个没有事务,而且SCN比自己小的非脏缓存数据块,服务器进程仍然要到表的头部对这条记录申请加锁,加锁成功才能进行后续动作,如果不成功,则要等待前面的进程解锁后才能进行动作(这个时候阻塞是tx锁阻塞)。
在记redo日志时,其具体步骤如下:
1)数据被读入到db buffer后,服务器进程将该语句所影响的并被读入db buffer中的这些行数据的rowid及要更新的原值和新值及scn等信息从PGA逐条的写入redo log buffer中。在写入redo log buffer之前也要事先请求redo log buffer的锁存器,成功加锁后才开始写入。
2)当写入达到redo log buffer大小的三分之一或写入量达到1M或超过三秒后或发生检查点时或者dbwr之前发生,都会触发lgwr进程把redo log buffer的数据写入磁盘上的redo file文件中(这个时候会产生log file sync等待事件)。
3)已经被写入redo file的redo log buffer所持有的锁存器会被释放,并可被后来的写入信息覆盖,redo log buffer是循环使用的。Redo file也是循环使用的,当一个redo file写满后,lgwr进程会自动切换到下一redo file(这个时候可能出现log file switch(check point complete)等待事件)。如果是归档模式,归档进程还要将前一个写满的redo file文件的内容写到归档日志文件中(这个时候可能出现log file switch(archiving needed)。
在为事务建立undo信息时,其具体步骤如下:
1)在完成本事务所有相关的redo log buffer之后,服务器进程开始改写这个db buffer的块头部事务列表并写入scn(一开始scn是写在redo log buffer中的,并未写在db buffer)。
2)然后包含这个块的头部事务列表及scn信息的数据副本放入回滚段中,将这时回滚段中的信息称为数据块的“前映像”,这个“前映像”用于以后的回滚、恢复和一致性读。(回滚段可以存储在专门的回滚表空间中,这个表空间由一个或多个物理文件组成,并专用于回滚表空间,回滚段也可在其它表空间中的数据文件中开辟)。
在修改信息写入数据文件时,其具体步骤如下:
1)改写db buffer块的数据内容,并在块的头部写入回滚段的地址。
2)将db buffer指针放入dirty list。如果一个行数据多次update而未commit,则在回滚段中将会有多个“前映像”,除了第一个“前映像”含有scn信息外,其他每个"前映像"的头部都有scn信息和"前前映像"回滚段地址。一个update只对应一个scn,然后服务器进程将在dirty list中建立一条指向此db buffer块的指针(方便dbwr进程可以找到dirty list的db buffer数据块并写入数据文件中)。接着服务器进程会从数据文件中继续读入第二个数据块,重复前一数据块的动作,数据块的读入、记日志、建立回滚段、修改数据块、放入dirty list。
3)当dirty queue的长度达到阀值(一般是25%),服务器进程将通知dbwr把脏数据写出,就是释放db buffer上的锁存器,腾出更多的free db buffer。前面一直都是在说明oracle一次读一个数据块,其实oracle可以一次读入多个数据块(db_file_multiblock_read_count来设置一次读入块的个数)
当执行commit时,具体步骤如下:
1)commit触发lgwr进程,但不强制dbwr立即释放所有相应db buffer块的锁。也就是说有可能虽然已经commit了,但在随后的一段时间内dbwr还在写这条sql语句所涉及的数据块。表头部的行锁并不在commit之后立即释放,而是要等dbwr进程完成之后才释放,这就可能会出现一个用户请求另一用户已经commit的资源不成功的现象。
2)从Commit和dbwr进程结束之间的时间很短,如果恰巧在commit之后,dbwr未结束之前断电,因为commit之后的数据已经属于数据文件的内容,但这部分文件没有完全写入到数据文件中。所以需要前滚。由于commit已经触发lgwr,这些所有未来得及写入数据文件的更改会在实例重启后,由smon进程根据重做日志文件来前滚,完成之前commit未完成的工作(即把更改写入数据文件)。
3)如果未commit就断电了,因为数据已经在db buffer更改了,没有commit,说明这部分数据不属于数据文件。由于dbwr之前触发lgwr也就是只要数据更改,(肯定要先有log)所有dbwr在数据文件上的修改都会被先一步记入重做日志文件,实例重启后,SMON进程再根据重做日志文件来回滚。
其实smon的前滚回滚是根据检查点来完成的,当一个全部检查点发生的时候,首先让LGWR进程将redologbuffer中的所有缓冲(包含未提交的重做信息)写入重做日志文件,然后让dbwr进程将dbbuffer已提交的缓冲写入数据文件(不强制写未提交的)。然后更新控制文件和数据文件头部的SCN,表明当前数据库是一致的,在相邻的两个检查点之间有很多事务,有提交和未提交的。
当执行rollback时,具体步骤如下:
服务器进程会根据数据文件块和db buffer中块的头部的事务列表和SCN以及回滚段地址找到回滚段中相应的修改前的副本,并且用这些原值来还原当前数据文件中已修改但未提交的改变。如果有多个”前映像“,服务器进程会在一个“前映像”的头部找到“前前映像”的回滚段地址,一直找到同一事务下的最早的一个“前映像”为止。一旦发出了commit,用户就不能rollback,这使得commit后dbwr进程还没有全部完成的后续动作得到了保障。
第五步:提取数据
当语句执行完成之后,查询到的数据还是在服务器进程中,还没有被传送到客户端的用户进程。所以,在服务器端的进程中,有一个专门负责数据提取的一段代码。他的作用就是把查询到的数据结果返回给用户端进程,从而完成整个查询动作。
从这整个查询处理过程中,我们在数据库开发或者应用软件开发过程中,需要注意以下几点:
一是要了解数据库缓存跟应用软件缓存是两码事情。数据库缓存只有在数据库服务器端才存在,在客户端是不存在的。只有如此,才能够保证数据库缓存中的内容跟数据库文件的内容一致。才能够根据相关的规则,防止数据脏读、错读的发生。而应用软件所涉及的数据缓存,由于跟数据库缓存不是一码事情,所以,应用软件的数据缓存虽然可以提高数据的查询效率,但是,却打破了数据一致性的要求,有时候会发生脏读、错读等情况的发生。所以,有时候,在应用软件上有专门一个功能,用来在必要的时候清除数据缓存。不过,这个数据缓存的清除,也只是清除本机上的数据缓存,或者说,只是清除这个应用程序的数据缓存,而不会清除数据库的数据缓存。
二是绝大部分SQL语句都是按照这个处理过程处理的。我们DBA或者基于Oracle数据库的开发人员了解这些语句的处理过程,对于我们进行涉及到SQL语句的开发与调试,是非常有帮助的。有时候,掌握这些处理原则,可以减少我们排错的时间。特别要注意,数据库是把数据查询权限的审查放在语法语义的后面进行检查的。所以,有时会若光用数据库的权限控制原则,可能还不能满足应用软件权限控制的需要。此时,就需要应用软件的前台设置,实现权限管理的要求。而且,有时应用数据库的权限管理,也有点显得繁琐,会增加服务器处理的工作量。因此,对于记录、字段等的查询权限控制,大部分程序涉及人员喜欢在应用程序中实现,而不是在数据库上实现。
Oracle SQL语句执行顺序
(8)SELECT (9) DISTINCT (11) <select_list>
(1) FROM <left_table>
(3) <join_type> JOIN <right_table>
(2) ON <join_condition>
(4) WHERE <where_condition>
(5) GROUP BY <group_by_list>
(6) WITH {CUBE | ROLLUP}
(7) HAVING <having_condition>
(10) ORDER BY <order_by_list>
1)FROM:对FROM子句中的表执行笛卡尔积(交叉联接),生成虚拟表VT1。
2)ON:对VT1应用ON筛选器,只有那些使为真才被插入到TV2。
3)OUTER (JOIN):如果指定了OUTER JOIN(相对于CROSS JOIN或INNER JOIN),保留表中未找到匹配的行将作为外部行添加到VT2,生成TV3。如果FROM子句包含两个以上的表,则对上一个联接生成的结果表和下一个表重复执行步骤1到步骤3,直到处理完所有的表位置。
4)WHERE:对TV3应用WHERE筛选器,只有使为true的行才插入TV4。
5)GROUP BY:按GROUP BY子句中的列列表对TV4中的行进行分组,生成TV5。
6)CUTE|ROLLUP:把超组插入VT5,生成VT6。
7)HAVING:对VT6应用HAVING筛选器,只有使为true的组插入到VT7。
8)SELECT:处理SELECT列表,产生VT8。
9)DISTINCT:将重复的行从VT8中删除,产品VT9。
10)ORDER BY:将VT9中的行按ORDER BY子句中的列列表顺序,生成一个游标(VC10),生成表TV11,并返回给调用者。
以上每个步骤都会产生一个虚拟表,该虚拟表被用作下一个步骤的输入。这些虚拟表对调用者(客户端应用程序或者外部查询)不可用。只有最后一步生成的表才会会给调用者。如果没有在查询中指定某一个子句,将跳过相应的步骤。
③ SQL数据库(简单)简答题
Microsoft SQL Server 2000 简答题及其答案
1.在安装SQL Server 2000时,“仅客户端工具”、“服务器和客户端工具”及“仅连接”等安装定义有什么差别?
答:仅客户端工具:仅安装客户端工具。服务器和客户端工具:同时安装服务器和客户端工具。仅连接:仅安装客户端连接。
2.一个数据库中包含哪几种文件?
答:主数据库文件,辅助数据文件,事务日志文件。
3.事务文件和数据文件分开存放有什么好处?
答:因为利用事务日志备份可以将数据库恢复到特定的即时点(如输入不想要的数据之前的那一点)或故障发生点。在媒体恢复策略中应考虑利用事务日志备份。
4.什么是批处理?使用批处理有何限制?
答:包含一个或多个T-SQL语句的组,从应用程序将一次性发送到SQL Server执行,SQL Server批处理语句作为整体编译成一个可执行单元。
限制:如不能够在同一个批处理中更改表,然后引用新列。如在一个批处理程序中,有两条语句。第一条语句用来在一张表中插入一个字段,如在User表中插入员工的出生年月;第二条语句则用来引用这个列,如根据身份证号码来推算出这个员工的出身年月并把这个值赋值给这个第一条语句创建的出身年月字段。
5.数据检索时,COMPUTE和COMPUTE BY产生的结果有何不同?
答:Compute:第一个为明细行 第二个为聚合函数的合计 Compute by:第一个为明细行第二个为聚合函数的小计
6.什么是索引?索引分为哪两种?各有什么特点?
答:1、数据库中的索引与书籍中的目录类似。在一本书中,利用目录可以快速查找所需信息,无须阅读整本书。在数据库中,索引使数据库程序无须对整个表进行扫描,就可以在其中找到所需数据。 2、聚集索引和非聚集索引。
3、聚集索引的特点:行的物理位置和行在索引中的位置是相同的,每个表只能有一个聚集索引,聚集索引的平均大小大约为表大小的5%左右。
非聚集索引特点:若未指定索引类型,则默认为非聚集索引,叶节点页的次序和表的物理存储次序不同,每个表最多可以有249个非聚集索引,在非聚集索引创建之前创建聚集索引。
7.创建索引有什么优点和缺点?
答:优点:索引在数据库中的作用类似于目录在书籍中的作用,用来提高查找信息的速度。
使用索引查找数据,无需对整表进行扫描,可以快速找到所需数据。
缺点:索引需要占用数据表以外的物理存储空间。创建索引和维护索引要花费一定的时间。当对表进行更新操作时,索引需要被重建,这样降低了数据的维护速度。
8.什么是视图?使用视图的优点和缺点是什么?
答:视图是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。但是,视图并不在数据库中以存储的数据值集形式存在。行和列数据来自由定义视图的查询所引用的表,并且在引用视图时动态生成。
优点:1隐蔽数据库的复杂性2控制用户提取数据3简化数据库用户管理 4简化查询
缺点:1性能:SQL Server必须把视图的查询转化成对基本表的查询,如果这个视图是由,一个复杂的多表查询所定义,那么,即使是视图的一个简单查询,SQL Server也,把它变成一个复杂的结合体,需要花费一定的时间。2修改限制:当用户试图修改视图的某些行时,SQL Server必须把它转化为对基本,表的某些行的修改。对于简单视图来说,这是很方便的,但是,对于比较复杂的,视图,可能是不可修改的。
9. 修改视图中的数据会受到哪些限制?
答:1、必须有权限 2、单表视图直接改
3、多表可在视图中定义 instead of 触发器.
4、对由多表连接成的视图修改数据时,不能同时影响一个以上的基表,也不能删除视图中的数据
5、对视图上的某些列不能修改,这些列是:计算列,内置函数列和行集合函数列
6、对具有NOT NULL 的列进行修改时可能会出错。通过视图修改或者插入数据时,必须保证未显示的具有NOT NULL 属性的列有值,可以是默认值,IDENTITY 等,否则不能像视图中插入数据行。
7、如果某些列因为规则或者约束的限制不能接受从视图插入的数据时,则插入数据可能会失败
8、删除基表并不删除视图,建议采用与表明显不同的名字命名规则
10. 什么是数据完整性?如果数据库不实施数据完整性会产生什么结果?
答:数据完整性是指数据的精确性和可靠性。它是应防止数据库中存在不符合语义规定的数据和防止因错误信息的输入输出造成无效操作或错误信息而提出的。
11.数据完整性有哪几类?如何实施?
答:1、数据完整性分为四类:实体完整性、域完整性、参照完整性、用户定义的完整性。
2、数据库采用多种方法来保证数据完整性,包括外键、束约、规则和触发器。系统很好地处理了这四者的关系,并针对不同的具体情况用不同的方法进行,相互交叉使用,相补缺点。
12. 什么是主键约束?什么是惟一约束?两者有什么区别?
答:主键约束:有一列或列的组合,其值能唯一的标识表中的每一行。
唯一约束:不允许数据库表在指定列上具有相同的值,但允许有空值。
区别:一个表可以定义多个唯一约束,只能定义一个主键约束;空值得列上可以定义唯一约束,不能定义主键约束。
13.什么是外键,怎样建立外键约束?
答:外键是用于建立和加强两个表数据之间的链接的一列或多列。通过将保存表中主键值的一列或多列添加到另一个表中,可创建两个表之间的链接。这个列就成为第二个表的外键。
14.什么是存储过程?使用存储过程有什么好处?
答:1、是存储在服务器上的 Transact-SQL 语句的命名集合,是封装重复性任务的方法,支持用户声明变量、条件执行以及其他强有力的编程特性。
2、存储过程封装了商务逻辑,确保一致的数据访问和修改。若规则或策略有变化,则只需要修改服务器上的存储过程,所有的客户端就可以直接使用
屏蔽数据库模式的详细资料。用户不需要访问底层的数据库和数据库内的对象
提供了安全性机制。用户可以被赋予执行存储过程的权限,而不必在存储过程引用的所有对象上都有权限
改善性能。预编译的 Transact-SQL 语句,可以根据条件决定执行哪一部分
减少网络通信量。客户端用一条语句调用存储过程,就可以完成可能需要大量语句才能完成的任务,这样减少了客户端和服务器之间的请求/回答包
15.什么是触发器?触发器分有什么作用?
答:触发器是一类特殊的存储过程,不能被直接调用,也不传递或接受参数
作用:1、维护不可能在表创建时刻通过声明性约束进行的复杂的完整性约束限制。
2、通过记录所进行的修改以及谁进行了修改来审计表中的信息。
3、当表被修改的时候,自动给其他需要执行操作的程序发信号。
④ SQL一道题目。选什么为什么
SQL SERVER 帮助文档关于批处理的:
批处理是同时从应用程序发送到 SQL Server 并得以执行的一组单条或多条 Transact-SQL 语句。SQL Server 将批处理的语句编译为单个可执行单元,称为执行计划。执行计划中的语句每次执行一条。
每个 Transact-SQL 语句应以分号结束。此要求不是强制性的,但不推荐使用允许语句不以分号结束的功能,Microsoft SQL Server 的未来版本可能会删除这种功能。
编译错误(如语法错误)可使执行计划无法编译。因此,不会执行批处理中的任何语句。
诸如算术溢出或约束冲突之类的运行时错误具有下面的影响:
- 大多数运行时错误将停止执行批处理中当前语句和它之后的语句。
- 某些运行时错误(如违反约束)仅停止执行当前语句。而继续执行批处理中其他所有语句。
在遇到运行时错误的语句之前执行的语句不受影响。唯一例外的情况是批处理位于事务中并且错误导致事务回滚。在这种情况下,所有在运行时错误之前执行的未提交数据修改都将回滚。
例如,假定批处理中有 10 条语句。如果第五条语句有一个语法错误,则不执行批处理中的任何语句。如果批处理经过编译,并且第二条语句在运行时失败,则第一条语句的结果不会受到影响,因为已执行了该语句。
SQL Server 提供了语句级重新编译功能。也就是说,如果一条语句触发了重新编译,则只重新编译该语句而不是整个批处理。此行为与 SQL Server 2000 不同。请考虑下面的示例,其中在同一批处理中包含一条 CREATE TABLE 语句和四条 INSERT 语句。
首先,对批处理进行编译。对 CREATE TABLE 语句进行编译,但由于表 dbo.t3 尚不存在,因此,未编译 INSERT 语句。
然后,批处理开始执行。表已创建。编译第一条 INSERT,然后立即执行。表现在具有一个行。然后,编译第二条 INSERT 语句。编译失败,批处理终止。SELECT 语句返回一个行。
在 SQL Server 2000 中,批处理开始执行,同时创建了表。逐一编译三条 INSERT 语句,但不执行。因为第二条 INSERT 语句导致一个编译错误,因此,整个批处理都将终止。SELECT 语句未返回任何行。
批处理使用规则下面的规则适用于批处理的使用:
- CREATE DEFAULT、CREATE FUNCTION、CREATE PROCEDURE、CREATE RULE、CREATE SCHEMA、CREATE TRIGGER 和 CREATE VIEW 语句不能在批处理中与其他语句组合使用。批处理必须以 CREATE 语句开始。所有跟在该批处理后的其他语句将被解释为第一个 CREATE 语句定义的一部分。
- 不能在同一个批处理中更改表,然后引用新列。
- 如果 EXECUTE 语句是批处理中的第一句,则不需要 EXECUTE 关键字。如果 EXECUTE 语句不是批处理中的第一条语句,则需要 EXECUTE 关键字。
⑤ 使用sql函数检测字符串是否存在对应的字串问题,。
函数分类列表
加载宏和自动化函数
多维数据集函数
数据库函数
日期和时间函数
工程函数
财务函数
信息函数
逻辑函数
查找和引用函数
数学和三角函数
统计函数
文本函数
-----------------------------------------------------
加载宏和自动化函数
CALL 调用动态链接库或代码源中的过程
EUROCONVERT 用于将数字转换为欧元形式,将数字由欧元形式转换为欧元成员国货币形式,或利用欧元作为中间货币将数字由某一欧元成员国货币转化为另一欧元成员国货币形式(三角转换关系)
GETPIVOTDATA 返回存储在数据透视表中的数据
REGISTER.ID 返回已注册过的指定动态链接库 (DLL) 或代码源的注册号
SQL.REQUEST 连接到一个外部的数据源并从工作表中运行查询,然后将查询结果以数组的形式返回,无需进行宏编程
多维数据集函数
CUBEKPIMEMBER 返回重要性能指标 (KPI) 名称、属性和度量,并显示单元格中的名称和属性。KPI 是一项用于监视单位业绩的可量化的指标,如每月总利润或每季度雇员调整。
CUBEMEMBER 返回多维数据集层次结构中的成员或元组。用于验证多维数据集内是否存在成员或元组。
CUBEMEMBERPROPERTY 返回多维数据集内成员属性的值。用于验证多维数据集内是否存在某个成员名并返回此成员的指定属性。
CUBERANKEDMEMBER 返回集合中的第 n 个或排在一定名次的成员。用于返回集合中的一个或多个元素,如业绩排在前几名的销售人员或前 10 名学生。
CUBESET 通过向服务器上的多维数据集发送集合表达式来定义一组经过计算的成员或元组(这会创建该集合),然后将该集合返回到 Microsoft Office Excel。
CUBESETCOUNT 返回集合中的项数。
CUBEVALUE 返回多维数据集内的汇总值。
数据库函数
DAVERAGE 返回所选数据库条目的平均值
DCOUNT 计算数据库中包含数字的单元格的数量
DCOUNTA 计算数据库中非空单元格的数量
DGET 从数据库提取符合指定条件的单个记录
DMAX 返回所选数据库条目的最大值
DMIN 返回所选数据库条目的最小值
DPRODUCT 将数据库中符合条件的记录的特定字段中的值相乘
DSTDEV 基于所选数据库条目的样本估算标准偏差
DSTDEVP 基于所选数据库条目的样本总体计算标准偏差
DSUM 对数据库中符合条件的记录的字段列中的数字求和
DVAR 基于所选数据库条目的样本估算方差
DVARP 基于所选数据库条目的样本总体计算方差
日期和时间函数
DATE 返回特定日期的序列号
DATEVALUE 将文本格式的日期转换为序列号
DAY 将序列号转换为月份日期
DAYS360 以一年 360 天为基准计算两个日期间的天数
EDATE 返回用于表示开始日期之前或之后月数的日期的序列号
EOMONTH 返回指定月数之前或之后的月份的最后一天的序列号
HOUR 将序列号转换为小时
MINUTE 将序列号转换为分钟
MONTH 将序列号转换为月
NETWORKDAYS 返回两个日期间的全部工作日数
NOW 返回当前日期和时间的序列号
SECOND 将序列号转换为秒
TIME 返回特定时间的序列号
TIMEVALUE 将文本格式的时间转换为序列号
TODAY 返回今天日期的序列号
WEEKDAY 将序列号转换为星期日期
WEEKNUM 将序列号转换为代表该星期为一年中第几周的数字
WORKDAY 返回指定的若干个工作日之前或之后的日期的序列号
YEAR 将序列号转换为年
YEARFRAC 返回代表 start_date 和 end_date 之间整天天数的年分数
工程函数
BESSELI 返回修正的贝赛耳函数 In(x)
BESSELJ 返回贝赛耳函数 Jn(x)
BESSELK 返回修正的贝赛耳函数 Kn(x)
BESSELY 返回贝赛耳函数 Yn(x)
BIN2DEC 将二进制数转换为十进制数
BIN2HEX 将二进制数转换为十六进制数
BIN2OCT 将二进制数转换为八进制数
COMPLEX 将实系数和虚系数转换为复数
CONVERT 将数字从一种度量系统转换为另一种度量系统
DEC2BIN 将十进制数转换为二进制数
DEC2HEX 将十进制数转换为十六进制数
DEC2OCT 将十进制数转换为八进制数
DELTA 检验两个值是否相等
ERF 返回误差函数
ERFC 返回互补错误函数
GESTEP 检验数字是否大于阈值
HEX2BIN 将十六进制数转换为二进制数
HEX2DEC 将十六进制数转换为十进制数
HEX2OCT 将十六进制数转换为八进制数
IMABS 返回复数的绝对值(模数)
IMAGINARY 返回复数的虚系数
IMARGUMENT 返回参数 theta,即以弧度表示的角
IMCONJUGATE 返回复数的共轭复数
IMCOS 返回复数的余弦
IMDIV 返回两个复数的商
IMEXP 返回复数的指数
IMLN 返回复数的自然对数
IMLOG10 返回复数的以 10 为底的对数
IMLOG2 返回复数的以 2 为底的对数
IMPOWER 返回复数的整数幂
IMPRODUCT 返回从 2 到 29 的复数的乘积
IMREAL 返回复数的实系数
IMSIN 返回复数的正弦
IMSQRT 返回复数的平方根
IMSUB 返回两个复数的差
IMSUM 返回多个复数的和
OCT2BIN 将八进制数转换为二进制数
OCT2DEC 将八进制数转换为十进制数
OCT2HEX 将八进制数转换为十六进制数
财务函数
ACCRINT 返回定期支付利息的债券的应计利息
ACCRINTM 返回在到期日支付利息的债券的应计利息
AMORDEGRC 返回使用折旧系数的每个记帐期的折旧值
AMORLINC 返回每个记帐期的折旧值
COUPDAYBS 返回从付息期开始到成交日之间的天数
COUPDAYS 返回包含成交日的付息期天数
COUPDAYSNC 返回从成交日到下一付息日之间的天数
COUPNCD 返回成交日之后的下一个付息日
COUPNUM 返回成交日和到期日之间的应付利息次数
COUPPCD 返回成交日之前的上一付息日
CUMIPMT 返回两个付款期之间累积支付的利息
CUMPRINC 返回两个付款期之间为贷款累积支付的本金
DB 使用固定余额递减法,返回一笔资产在给定期间内的折旧值
DDB 使用双倍余额递减法或其他指定方法,返回一笔资产在给定期间内的折旧值
DISC 返回债券的贴现率
DOLLARDE 将以分数表示的价格转换为以小数表示的价格
DOLLARFR 将以小数表示的价格转换为以分数表示的价格
DURATION 返回定期支付利息的债券的每年期限
EFFECT 返回年有效利率
FV 返回一笔投资的未来值
FVSCHEDULE 返回应用一系列复利率计算的初始本金的未来值
INTRATE 返回完全投资型债券的利率
IPMT 返回一笔投资在给定期间内支付的利息
IRR 返回一系列现金流的内部收益率
ISPMT 计算特定投资期内要支付的利息
MDURATION 返回假设面值为 ¥100 的有价证券的 Macauley 修正期限
MIRR 返回正和负现金流以不同利率进行计算的内部收益率
NOMINAL 返回年度的名义利率
NPER 返回投资的期数
NPV 返回基于一系列定期的现金流和贴现率计算的投资的净现值
ODDFPRICE 返回每张票面为 ¥100 且第一期为奇数的债券的现价
ODDFYIELD 返回第一期为奇数的债券的收益
ODDLPRICE 返回每张票面为 ¥100 且最后一期为奇数的债券的现价
ODDLYIELD 返回最后一期为奇数的债券的收益
PMT 返回年金的定期支付金额
PPMT 返回一笔投资在给定期间内偿还的本金
PRICE 返回每张票面为 ¥100 且定期支付利息的债券的现价
PRICEDISC 返回每张票面为 ¥100 的已贴现债券的现价
PRICEMAT 返回每张票面为 ¥100 且在到期日支付利息的债券的现价
PV 返回投资的现值
RATE 返回年金的各期利率
RECEIVED 返回完全投资型债券在到期日收回的金额
SLN 返回固定资产的每期线性折旧费
SYD 返回某项固定资产按年限总和折旧法计算的每期折旧金额
TBILLEQ 返回国库券的等价债券收益
TBILLPRICE 返回面值 ¥100 的国库券的价格
TBILLYIELD 返回国库券的收益率
VDB 使用余额递减法,返回一笔资产在给定期间或部分期间内的折旧值
XIRR 返回一组现金流的内部收益率,这些现金流不一定定期发生
XNPV 返回一组现金流的净现值,这些现金流不一定定期发生
YIELD 返回定期支付利息的债券的收益
YIELDDISC 返回已贴现债券的年收益;例如,短期国库券
YIELDMAT 返回在到期日支付利息的债券的年收益
信息函数
CELL 返回有关单元格格式、位置或内容的信息
ERROR.TYPE 返回对应于错误类型的数字
INFO 返回有关当前操作环境的信息
ISBLANK 如果值为空,则返回 TRUE
ISERR 如果值为除 #N/A 以外的任何错误值,则返回 TRUE
ISERROR 如果值为任何错误值,则返回 TRUE
ISEVEN 如果数字为偶数,则返回 TRUE
ISLOGICAL 如果值为逻辑值,则返回 TRUE
ISNA 如果值为错误值 #N/A,则返回 TRUE
ISNONTEXT 如果值不是文本,则返回 TRUE
ISNUMBER 如果值为数字,则返回 TRUE
ISODD 如果数字为奇数,则返回 TRUE
ISREF 如果值为引用值,则返回 TRUE
ISTEXT 如果值为文本,则返回 TRUE
N 返回转换为数字的值
NA 返回错误值 #N/A
TYPE 返回表示值的数据类型的数字
逻辑函数
AND 如果其所有参数均为 TRUE,则返回 TRUE
FALSE 返回逻辑值 FALSE
IF 指定要执行的逻辑检测
NOT 对其参数的逻辑求反
OR 如果任一参数为 TRUE,则返回 TRUE
TRUE 返回逻辑值 TRUE
查找和引用函数
ADDRESS 以文本形式将引用值返回到工作表的单个单元格
AREAS 返回引用中涉及的区域个数
CHOOSE 从值的列表中选择值
COLUMN 返回引用的列号
COLUMNS 返回引用中包含的列数
GETPIVOTDATA 返回存储在数据透视表中的数据
HLOOKUP 查找数组的首行,并返回指定单元格的值
HYPERLINK 创建快捷方式或跳转,以打开存储在网络服务器、Intranet 或 Internet 上的文档
INDEX 使用索引从引用或数组中选择值
INDIRECT 返回由文本值指定的引用
LOOKUP 在向量或数组中查找值
MATCH 在引用或数组中查找值
OFFSET 从给定引用中返回引用偏移量
ROW 返回引用的行号
ROWS 返回引用中的行数
RTD 从支持 COM 自动化 (自动化:从其他应用程序或开发工具使用应用程序的对象的方法。以前称为“OLE 自动化”,自动化是一种工业标准和组件对象模型 (COM) 功能。)的程序中检索实时数据
TRANSPOSE 返回数组的转置
VLOOKUP 在数组第一列中查找,然后在行之间移动以返回单元格的值
数学和三角函数
ABS 返回数字的绝对值
ACOS 返回数字的反余弦值
ACOSH 返回数字的反双曲余弦值
ASIN 返回数字的反正弦值
ASINH 返回数字的反双曲正弦值
ATAN 返回数字的反正切值
ATAN2 返回 X 和 Y 坐标的反正切值
ATANH 返回数字的反双曲正切值
CEILING 将数字舍入为最接近的整数或最接近的指定基数的倍数
COMBIN 返回给定数目对象的组合数
COS 返回数字的余弦值
COSH 返回数字的双曲余弦值
DEGREES 将弧度转换为度
EVEN 将数字向上舍入到最接近的偶数
EXP 返回 e 的 n 次方
FACT 返回数字的阶乘
FACTDOUBLE 返回数字的双倍阶乘
FLOOR 向绝对值减小的方向舍入数字
GCD 返回最大公约数
INT 将数字向下舍入到最接近的整数
LCM 返回最小公倍数
LN 返回数字的自然对数
LOG 返回数字的以指定底为底的对数
LOG10 返回数字的以 10 为底的对数
MDETERM 返回数组的矩阵行列式的值
MINVERSE 返回数组的逆矩阵
MMULT 返回两个数组的矩阵乘积
MOD 返回除法的余数
MROUND 返回一个舍入到所需倍数的数字
MULTINOMIAL 返回一组数字的多项式
ODD 将数字向上舍入为最接近的奇数
PI 返回 pi 的值
POWER 返回数的乘幂
PRODUCT 将其参数相乘
QUOTIENT 返回除法的整数部分
RADIANS 将度转换为弧度
RAND 返回 0 和 1 之间的一个随机数
RANDBETWEEN 返回位于两个指定数之间的一个随机数
ROMAN 将阿拉伯数字转换为文本式罗马数
ROUND 将数字按指定位数舍入
ROUNDDOWN 向绝对值减小的方向舍入数字
ROUNDUP 向绝对值增大的方向舍入数字
SERIESSUM 返回基于公式的幂级数的和
SIGN 返回数字的符号
SIN 返回给定角度的正弦值
SINH 返回数字的双曲正弦值
SQRT 返回正平方根
SQRTPI 返回某数与 pi 的乘积的平方根
小计 返回列表或数据库中的分类汇总
SUM 求参数的和
SUMIF 按给定条件对若干单元格求和
SUMIFS 在区域中添加满足多个条件的单元格
SUMPRODUCT 返回对应的数组元素的乘积和
SUMSQ 返回参数的平方和
SUMX2MY2 返回两数组中对应值平方差之和
SUMX2PY2 返回两数组中对应值的平方和之和
SUMXMY2 返回两个数组中对应值差的平方和
TAN 返回数字的正切值
TANH 返回数字的双曲正切值
TRUNC 将数字截尾取整
统计函数
AVEDEV 返回数据点与它们的平均值的绝对偏差平均值
AVERAGE 返回其参数的平均值
AVERAGEA 返回其参数的平均值,包括数字、文本和逻辑值
AVERAGEIF 返回区域中满足给定条件的所有单元格的平均值(算术平均值)
AVERAGEIFS 返回满足多个条件的所有单元格的平均值(算术平均值)。
BETADIST 返回 Beta 累积分布函数
BETAINV 返回指定 Beta 分布的累积分布函数的反函数
BINOMDIST 返回一元二项式分布的概率值
CHIDIST 返回 χ2 分布的单尾概率
CHIINV 返回 γ2 分布的单尾概率的反函数
CHITEST 返回独立性检验值
CONFIDENCE 返回总体平均值的置信区间
CORREL 返回两个数据集之间的相关系数
COUNT 计算参数列表中数字的个数
COUNTA 计算参数列表中值的个数
COUNTBLANK 计算区域内空白单元格的数量
COUNTIF 计算区域内非空单元格的数量
COVAR 返回协方差,成对偏差乘积的平均值
CRITBINOM 返回使累积二项式分布小于或等于临界值的最小值
DEVSQ 返回偏差的平方和
EXPONDIST 返回指数分布
FDIST 返回 F 概率分布
FINV 返回 F 概率分布的反函数值
FISHER 返回 Fisher 变换值
FISHERINV 返回 Fisher 变换的反函数值
FORECAST 返回沿线性趋势的值
FREQUENCY 以垂直数组的形式返回频率分布
FTEST 返回 F 检验的结果
GAMMADIST 返回 γ 分布
GAMMAINV 返回 γ 累积分布函数的反函数
GAMMALN 返回 γ 函数的自然对数,Γ(x)
GEOMEAN 返回几何平均值
GROWTH 返回沿指数趋势的值
HARMEAN 返回调和平均值
HYPGEOMDIST 返回超几何分布
INTERCEPT 返回线性回归线的截距
KURT 返回数据集的峰值
LARGE 返回数据集中第 k 个最大值
LINEST 返回线性趋势的参数
LOGEST 返回指数趋势的参数
LOGINV 返回对数分布函数的反函数
LOGNORMDIST 返回对数累积分布函数
MAX 返回参数列表中的最大值
MAXA 返回参数列表中的最大值,包括数字、文本和逻辑值
MEDIAN 返回给定数值集合的中值
MIN 返回参数列表中的最小值
MINA 返回参数列表中的最小值,包括数字、文本和逻辑值
MODE 返回在数据集内出现次数最多的值
NEGBINOMDIST 返回负二项式分布
NORMDIST 返回正态累积分布
NORMINV 返回标准正态累积分布的反函数
NORMSDIST 返回标准正态累积分布
NORMSINV 返回标准正态累积分布函数的反函数
PEARSON 返回 Pearson 乘积矩相关系数
PERCENTILE 返回区域中数值的第 K 个百分点的值
PERCENTRANK 返回数据集中值的百分比排位
PERMUT 返回给定数目对象的排列数
POISSON 返回泊松分布
PROB 返回区域中的数值落在指定区间内的概率
QUARTILE 返回一列数字的数字排位
RANK 返回一列数字的数字排位
RSQ 返回 Pearson 乘积矩相关系数的平方
SKEW 返回分布的不对称度
SLOPE 返回线性回归线的斜率
SMALL 返回数据集中的第 K 个最小值
STANDARDIZE 返回正态化数值
STDEV 基于样本估算标准偏差
STDEVA 基于样本(包括数字、文本和逻辑值)估算标准偏差
STDEVP 基于整个样本总体计算标准偏差
STDEVPA 基于总体(包括数字、文本和逻辑值)计算标准偏差
STEYX 返回通过线性回归法预测每个 x 的 y 值时所产生的标准误差
TDIST 返回学生的 t 分布
TINV 返回学生的 t 分布的反函数
TREND 返回沿线性趋势的值
TRIMMEAN 返回数据集的内部平均值
TTEST 返回与学生的 t 检验相关的概率
VAR 基于样本估算方差
VARA 基于样本(包括数字、文本和逻辑值)估算方差
VARP 计算基于样本总体的方差
VARPA 计算基于总体(包括数字、文本和逻辑值)的标准偏差
WEIBULL 返回 Weibull 分布
ZTEST 返回 z 检验的单尾概率值
文本函数
ASC 将字符串中的全角(双字节)英文字母或片假名更改为半角(单字节)字符
BAHTTEXT 使用 ß(泰铢)货币格式将数字转换为文本
CHAR 返回由代码数字指定的字符
CLEAN 删除文本中所有非打印字符
CODE 返回文本字符串中第一个字符的数字代码
CONCATENATE 将几个文本项合并为一个文本项
DOLLAR 使用 $(美元)货币格式将数字转换为文本
EXACT 检查两个文本值是否相同
FIND、FINDB 在一个文本值中查找另一个文本值(区分大小写)
FIXED 将数字格式设置为具有固定小数位数的文本
JIS 将字符串中的半角(单字节)英文字母或片假名更改为全角(双字节)字符
LEFT、LEFTB 返回文本值中最左边的字符
LEN、LENB 返回文本字符串中的字符个数
LOWER 将文本转换为小写
MID、MIDB 从文本字符串中的指定位置起返回特定个数的字符
PHONETIC 提取文本字符串中的拼音(汉字注音)字符
PROPER 将文本值的每个字的首字母大写
REPLACE、REPLACEB 替换文本中的字符
REPT 按给定次数重复文本
RIGHT、RIGHTB 返回文本值中最右边的字符
SEARCH、SEARCHB 在一个文本值中查找另一个文本值(不区分大小写)
SUBSTITUTE 在文本字符串中用新文本替换旧文本
T 将参数转换为文本
TEXT 设置数字格式并将其转换为文本
TRIM 删除文本中的空格
UPPER 将文本转换为大写形式
VALUE 将文本参数转换为数字
⑥ 北大青鸟南京校区的课程介绍
北大青鸟IT教育的培训课程是面向社会的系统化、职业化、专业化的培训课程,为有志于进入这个新兴行业寻求发展的人们提供了一座跨越梦想的桥梁。
ACCP6.0课程介绍
入学条件 面向大众、以培养软件开发人员(程序员、软件工程师)为目标的课程。 报读人员要求:
1) 年龄要求:18 周岁(含)以上;
2) 学历要求:高中(含)以上学历;
3) 专业技术要求:有一定的逻辑能力,对学习计算机有兴趣。 课程简介
ACCP6.0是北大青鸟APTECH推出的最新软件工程师职业教育课程,由中印两国软件技术专家联合研发完成。作为一款面向大众的求职系列教育产品,ACCP6.0的课程开发采用了全球同步机制,推陈出新,引领未来IT技术发展潮流,继续保持了北大青鸟APTECHACCP课程体系的国际同步水平以及在国内IT职业教育领域的领导地位。
ACCP6.0的课程相对于ACCP5.0增加了DB2关系型数据库系统,DB2具有很好的网络支持能力,每个子系统可以连接十几万个分布式用户,可同时激活上千个活动线程,对大型分布式应用系统尤为适用。
逆向设计确保就业:专业分析5362条招聘信息,深入访谈386家用人企业,定制2份行业人才需求标准简历,针对286项关键技能点逐一突破,斥资2000万,组织186名中美印专家投入研发高强训练编程能力,1年半完,成52000行代码编写,相当于1名程序员2年代码编写量项目驱动案例贯穿,提供CRM、ERP中型项目实战训,演练26项全真项目案例,贯穿8大行业打造COT六脉神剑,训练目标清晰、训练手段多样,渗透学习过程,考核方法明确。
课程背景
ACCP(阿博泰克认证的计算机专家)课程始于2002年,由150多名知名技术开发人员,在对中国IT企业,培训中心经过一系列调研的基础上,研发完成。已经历时11年,毕业学员已超过40万人。
具体课程以及设置
第一学期:
1、先学习进入软件编程世界,才能够具备计算机Java语言学习的基础;
2、第一学期Java课程结束后,.NET课程的基本语言语法都与Java课程类似,将对比进行学习;
3、HTML语言是独立的课程,不牵涉到程序编写,学习Java课程之后,为了缓解学习压力,调整学习节奏,先学习这门课程;
4、SQL Server课程和.NET课程共同结合起来完成第一学期的阶段项目。
第二学期:
1、第二学期刚开始就学习SQL Server课程,是在第一学期学会SQL基本操作、基本查询的基础上学习高级知识;
2、第二学期两门.NET课程有严格的先后次序关系,并且是在第一学期的基础上进行提高;
3、JavaScript课程是在学习完成.NET课程之后进行,同时要求首先学会第一学期的HTML课程,否则无法建立页面,更谈不上动态效果;
4、Java的两门课程也存在严格的先后次序关系,只有熟练理解、掌握了面向对象的思想,才能够进入到MVC开发模式的学习,否则将会存在很大的理解上的困难;
5、.NET课程中的三层结构模式,与Java的MVC模式,存在诸多相似之处;
6、学习完Java课程,将结合数据库课程、HTML、JavaScript课程,综合来完成第二学期的阶段项目。
第二学年:
1、第一门Java课程,核心技术JSP/Servlet/JavaBean,就是MVC模式的经典实现,需要第二学期JSP课程作为基础;
2、只有在掌握了JSP/Servlet/JavaBean的应用以后,才能够体会到框架的必要性,第二门Java课程中的Struts/Hibernate/Spring中,JSP/Servlet/JavaBean是最基本的应用,并在此基础上做框架的集成,因此这两门课程也存在严格的先后关系;
3、Ajax技术在Java课程中先讲解基础、原理,并要求手写Ajax代码,继而在.NET课程中使用方便的控件来实现,因此Java和.NET课程安排的次序不能变更;
4、.NET第一门课程是基于三层结构的企业级B/S系统开发,因此三层结构是这门课程的基础;
5、只有掌握了B/S中的开发技术,并且实现了网上书店的应用系统开发,才能够在该系统上进行优化和提高、扩展更方便的功能,因此,第二门.NET课程也必须在第一门.NET课程之后进行;
6、毕业设计项目分别在Java课程结束、.NET课程结束后都会执行,整个第二学年的学习过程,将有三个月时间的实战训练(其中集中编码的课时为免费学时)。
JAVA方向:
计算机软件基础、数据库原理、SQLserver、C++程序设计、java核心编程、linux、websphere 开发工具、DB2数据库高级管理、DB2数据库应用开发、ERWin数据库建模、UML、ratioanlrose建模、OM软件开发生命周期、J2EEOM企业级开发、基于MVC的struts框架技术、软件测试工具与方法、项目管理基础等。
网络应用方向:
电子技术基础、数字电路与逻辑设计、面向对象程序设计、操作系统原理、计算机网络、微机原理及接口应用、现代通信技术、实用网络技术、数据库原理及应用、WEB应用开发技术、计算机网络安全与维护、网络管理技术、TCP/IP及应用、网络存储技术、组网工程、局域网应用技术、网络编程技术等。
ACCP软件工程师就业方向:
初级程序员、初级代码编程、软件外包开发、网站设计和开发工程师、ERP/CRM/OA/B2C开发应用工程师、系统分析设计员、文档工程师
BENET4.0课程介绍
入学条件 面向大众、以培养企业高级网络技术人员为目标的课程。 报读人员要求:
1) 年龄要求:18 周岁(含)以上。
2) 学历要求:具备高中或同等学历。
3) 专业技术要求:零起点,具备基本的计算机操作、实际动手操作能力。 4)其他要求:热爱计算机、对网络感兴趣均可。
课程简介
北大青鸟IT教育的BENET(网络工程师)培训课程是面向社会的系统化、职业化的培训课程。在2012年2月,北大青鸟IT教育BENET(网络工程师)培训课程已经从3.0版本升级为4.0版本。在3.0的基础上,4.0添加了3G技术,蓝牙技术,还有云计算技术。同时,学期由3.0的两个学期延长为3个学期。
BENET4.0课程,共计700(320+230+150)学时,采取讲课与实验相结合的教学方式,且重在实际操作。分为三个模块:分别是第一学期、第二学期和第二学年。从内容上讲每一模块都是前一模块的提高与延伸。
BENET4.0课程研发过程定位课程的内容需求建立招聘的岗位数据库(分析、对比了1800个招聘岗位需求)与专业咨询公司——赛迪顾问合作(80家典型企业用人需求,分析了120个专业技术人士的工作技能)全国各地17家中心(11个城市)跟踪调查236个已就业学员研发人员参与企业面试明确产品的教学要求(中心教员调研了全国各地27家中心,共80名教员样本)。
BENET4.0课程的培训目标岗位:
第一学期的培训目标:网络管理员,系统管理员;第二学期的培训目标:系统工程师,网络工程师,售后工程师;第二学年的培训目标:信息安全工程师,系统架构工程师
BTEST课程介绍
入学条件 面向大众、以软件检查测试人员为目标的课程; 报读人员要求:1) 年龄要求:21周岁(含)以上;2)学历要求:大专(含)以上学历; 课程简介
国内第一套系统全面的软件测试工程师职业教育课程
一、课程体系说明
BTEST是北大青鸟Aptech公司经过走访国内大量软件企业测试岗位和人力资源部门、综合国内主要人才招聘媒体的最新招聘数据、分析研究国内外职业教育课程体系后,结合北大青鸟 Aptech 公司多年的 IT 职业教育经验,由国家劳动和社会保障部、北大软件学院、北大软件工程中心,国家重点实验室、北大青鸟集团、印度 Aptech 公司的多位职业教育专家、软件开发专家、项目经理和测试经理共同完成的。
1、能够掌握单机、网络环境下多种体系结构软件的测试; 2、能够在 Linux/Windows 平台上,建立多种体系结构(包括数据库)的软件运行和测试环境;3、能够掌握软件开发技术并能够编写简单应用程序、测试脚本;4、能够掌握测试流程、缺陷管理流程,并能对测试流程实施监督和处理;5、能够编写测试计划、设计测试用例、执行测试并填写缺陷报告;6、能够独立或协助开发人员进行单元测试和白盒测试;7、能够使用自动化测试工具来进行各种测试
二、课程设置说明
1、搭建 Windows 测试环境
主要讲解搭建Windows测试环境所要具备的软、硬件及网络知识。包括计算机中各种硬件和接口。软件的分类、分发和授权等方式;操作系统的初步知识;注册表、病毒、安全等知识; TCP/IP 协议和 DNS 、活动目录等知识。
2、使用C 语言开发简单应用
设置本课程的目的主要是使学员掌握软件开发的技术,掌握编程的方法、思想,了解软件开发过程当中常犯的错误,为后面的测试课程以及编写测试脚本打下语言基础。
3、测试计划与软件缺陷
本课程主要介绍软件测试的基本概念和基础知识、如何编写测试计划、识别软件缺陷、编写缺陷报告等。
4、高效设计测试用例
本课程主要通过引入的大量案例讲解如何编写测试用例。讲解设计测试用例的技术包括等价类划分、边界值分析、因果图方法、状态图方法、测试大纲等的方法以及正交排列表、测试矩阵等。测试特性包括:功能、性能、兼容性、易用性等。
5、白盒测试
本课程主要讲解白盒测试技术。主要内容包括逻辑驱动覆盖和基本路径覆盖两个方面,在逻辑驱动覆盖中主要介绍了语句覆盖、判定覆盖、条件覆盖、判定 / 条件覆盖、条件组合覆盖、路径覆盖和循环语句覆盖;在基本路径覆盖中介绍了绘制控制流图及程序复杂性相关概念,最后重点介绍了单元测试技术。
6、Linux 与网络应用环境
本课程主要讲解搭建Linux测试环境所应具备的知识。通过学习 Linux 的安装和配置、Linux常用命令、 Linux 下软件安装、卸载和使用、常见Linux的服务(Apache、Mysql、Squid 、Iptables等)、Linux软件开发环境等,让学员能够使用Linux实现一个提供常见服务的网络环境。
7、WEB 技术与数据库
本课程通过对数据库、HTML、XML、HTTP、J2EE、.NET等基础知识的讲解,让学员掌握这些技术,以便于建立分布式软件的测试环境。数据库是以 SQL Server 作为重点讲解,同时也介绍了Oracle和MySQL数据库。
8、高效使用自动测试工具
本课程主要介绍了国际测试工具占有率最高的 MI 的三大测试工具:功能测试工具 QuickTest Professional 、性能测试工具LoadRunner、测试管理工具TestDirector。学员掌握这些流行的测试工具,从而进一步提高测试的效率。
9、软件测试实训
本课程是最后一门课程,该课程主要是通过运用前面所学习的课程,指导学员完成一个项目的测试过程,从而巩固所学知识。
10、 职业导向训练 (COT)
职业导向训练,简称COT课程,即Career Oriented Training,是对学员进行职业引导,包括就业指导和职前引导。通过就业指导以及就业专员、就业明星与学员的座谈会等日常辅助训练明确就业方向,进一步了解就业形式。
课程介绍
JBNS2.0网站工程师(英文名称:Jade Bird Certified North Star Web Development Engineer, 中文简称:JB北极星网站工程师),是北大青鸟IT教育公司在对国内IT行业发展现状及企业人才需求状况充分调研的基础上,针对电大体系定向开发的网站开发工程师教育产品。JBNS网站工程师教育产品仅提供电大体系,不再向电大体系外第三方提供。中央电大开放教育专为本套课程的合作设置网站开发专业,学生参加该专业的学习后,如果达到中央电大毕业要求,不仅可以获得中央电大相关专业学历证书,还可以通过职业资格认证考试获得北大青鸟IT教育颁发的JBNS职业资格证书。
JBNS网站工程师培训--胜任职位:
1、软件公司的软件工程师:参与商用网站或政府网站的开发、维护、技术支持;参与企业内部信息系统的开发、维护、技术支持
2、网站运营企业的网站开发与维护工程师:网站系统的开发、维护、技术支持
3、信息化企业的IT服务岗:企业内部信息系统和服务的搭建、维护;企业自己的网站的开发、维护;企业内部信息系统的安全防护
学士后课程介绍
课程定位
“学士后”是北大青鸟学士后课程专门针对大学生人群设计,解决“大学生就业难”问题的教育产品。眼下,“大学生就业难”已经成为亟待解决的社会问题,其根本原因在于:大学生虽然文化素质基础不错,不缺知识,但缺乏企业需要的技能和经验。
北大青鸟作为中国IT职业教育领导品牌,凭借对业界的深刻理解,认为“技能”和“经验”并非只能在工作中获得,恰恰相反,工作中获得的“技能”和“经验”不仅并不全面,而且积累速度慢,获得成本并不低。
学士后入学条件 面向大众、以软件开发人员为目标的课程; 报读人员要求:
1) 年龄要求:21 周岁(含)以上。
2) 学历要求:大专(含)以上学历。
3) 专业技术要求:必须具备一定的英语基础,对计算机感兴趣。 课程介绍
学士后开设的课程主要有网络营销师,JAVA、和.NET软件工程师,Android软件工程师。
“2段式”课程结构:整个学习过程被划分为两个阶段。第一个阶段为“技能准备阶段”,3个月左右;第二个阶段为“就业冲刺阶段”,2个月左右。第一个阶段通过精心设计的知识、技能点训练重点提升学员的专业技术能力,使每个学员的技术技能达到可动手实战项目的水平。第二个阶段将通过实战项目重点增加学员的项目经验和工作经验,向就业发起冲刺,实现就业对接。
“混合式”学习模式:在第一阶段,“学士后”中独创了“混合式”学习模式,课程内容被设计为“线上”和“线下”2部分,学员们将体验到“网上学习课程、线下验证效果”的混合式方法带来的便利和优势。
⑦ 求助SQL考试题。。明天早上就考了 今晚要交
1.select 书名,出版社 from 图书 where 20=<价格=<50 order by 价格 desc
2.select distinct a.书号 as 图书种类 ,a.操作员帐号 from 借出 a,操作员 b where a.操作员帐号=(select b.操作员帐号 from 操作员 where 操作员姓名='李凡')
3.select 书名,出版社 from 图书 where 书名 like '%数据库%' or 书名 like '%SQL%'
4.delete from 课程 where 课程编号 in ( '20016','20018','20019')
5.insert into 教师 (教师编号,姓名,所在部门,职称) values (60016,王力,,讲师)
6.select a.生产厂家,count(b.商品编号) as 商品种类 from 商品 b,(select distinct 生产厂家 from 商品) as a where a.生产厂家=b.生产厂家 group by a.生产厂家
⑧ sql数据库 建立三个表 student(学号 姓名 性别) sc(学号 课程号 成绩)course(课程号 课程名 分数 )
select 姓名,savg from (select 学号,avg(成绩)as savg from sc where 成绩<60 group by 学号 having count(学号)>=2) t1,student where t1.学号=student.学号
1. Group By 语句简介:
Group By语句从英文的字面意义上理解就是“根据(by)一定的规则进行分组(Group)”。它的作用是通过一定的规则将一个数据集划分成若干个小的区域,然后针对若干个小区域进行数据处理。 2. Group By 的使用: 上面已经给出了对Group By语句的理解。基于这个理解和SQL Server 2000的联机帮助,下面对Group By语句的各种典型使用进行依次列举说明。 2.1 Group By [Expressions]: 这个恐怕是Group By语句最常见的用法了,Group By + [分组字段](可以有多个)。在执行了这个操作以后,数据集将根据分组字段的值将一个数据集划分成各个不同的小组。比如有如下数据集,其中水果名称(FruitName)和出产国家(ProctPlace)为联合主键: FruitName ProctPlace Price
Apple China $1.1
Apple Japan $2.1
Apple USA $2.5
Orange China $0.8
Banana China $3.1
Peach USA $3.0
如果我们想知道每个国家有多少种水果,那么我们可以通过如下SQL语句来完成: SELECT COUNT(*) AS 水果种类, ProctPlace AS 出产国 FROM T_TEST_FRUITINFO GROUP BY ProctPlace 这个SQL语句就是使用了Group By + 分组字段的方式,那么这句SQL语句就可以解释成“我按照出产国家(ProctPlace)将数据集进行分组,然后分别按照各个组来统计各自的记录数量。”很好理解对吧。这里值得注意的是结果集中有两个返回字段,一个是ProctPlace(出产国), 一个是水果种类。如果我们这里水果种类不是用Count(*),而是类似如下写法的话: SELECT FruitName, ProctPlace FROM T_TEST_FRUITINFO GROUP BY ProctPlace 那么SQL在执行此语句的时候会报如下的类似错误: 选择列表中的列 'T_TEST_FRUITINFO.FruitName' 无效,因为该列没有包含在聚合函数或 GROUP BY 子句中。 这就是我们需要注意的一点,如果在返回集字段中,这些字段要么就要包含在Group By语句的后面,作为分组的依据;要么就要被包含在聚合函数中。我们可以将Group By操作想象成如下的一个过程,首先系统根据SELECT 语句得到一个结果集,如最开始的那个水果、出产国家、单价的一个详细表。然后根据分组字段,将具有相同分组字段的记录归并成了一条记录。这个时候剩下的那些不存在于Group By语句后面作为分组依据的字段就有可能出现多个值,但是目前一种分组情况只有一条记录,一个数据格是无法放入多个数值的,所以这里就需要通过一定的处理将这些多值的列转化成单值,然后将其放在对应的数据格中,那么完成这个步骤的就是聚合函数。这就是为什么这些函数叫聚合函数(aggregate functions)了。 2.2 Group By All [expressions] : Group By All + 分组字段, 这个和前面提到的Group By [Expressions]的形式多了一个关键字ALL。这个关键字只有在使用了where语句的,且where条件筛选掉了一些组的情况才可以看出效果。在SQL Server 2000的联机帮助中,对于Group By All是这样进行描述的: 如果使用 ALL 关键字,那么查询结果将包括由 GROUP BY 子句产生的所有组,即使某些组没有符合搜索条件的行。没有 ALL 关键字,包含 GROUP BY 子句的 SELECT 语句将不显示没有符合条件的行的组。 其中有这么一句话“如果使用ALL关键字,那么查询结果将包含由Group By子句产生的所有组...没有ALL关键字,那么不显示不符合条件的行组。”这句话听起来好像挺耳熟的,对了,好像和LEFT JOIN 和 RIGHT JOIN 有点像。其实这里是类比LEFT JOIN来进行理解的。还是基于如下这样一个数据集: FruitName ProctPlace Price
Apple China $1.1
Apple Japan $2.1
Apple USA $2.5
Orange China $0.8
Banana China $3.1
Peach USA $3.0
首先我们不使用带ALL关键字的Group By语句: SELECT COUNT(*) AS 水果种类, ProctPlace AS 出产国 FROM T_TEST_FRUITINFO WHERE (ProctPlace <> 'Japan') GROUP BY ProctPlace 那么在最后结果中由于Japan不符合where语句,所以分组结果中将不会出现Japan。 现在我们加入ALL关键字: SELECT COUNT(*) AS 水果种类, ProctPlace AS 出产国 FROM T_TEST_FRUITINFO WHERE (ProctPlace <> 'Japan') GROUP BY ALL ProctPlace 重新运行后,我们可以看到Japan的分组,但是对应的“水果种类”不会进行真正的统计,聚合函数会根据返回值的类型用默认值0或者NULL来代替聚合函数的返回值。 2.3 GROUP BY [Expressions] WITH CUBE | ROLLUP: 首先需要说明的是Group By All 语句是不能和CUBE 和 ROLLUP 关键字一起使用的。 首先先说说CUBE关键字,以下是SQL Server 2000联机帮助中的说明: 指定在结果集内不仅包含由 GROUP BY 提供的正常行,还包含汇总行。在结果集内返回每个可能的组和子组组合的 GROUP BY 汇总行。GROUP BY 汇总行在结果中显示为 NULL,但可用来表示所有值。使用 GROUPING 函数确定结果集内的空值是否是 GROUP BY 汇总值。 结果集内的汇总行数取决于 GROUP BY 子句内包含的列数。GROUP BY 子句中的每个操作数(列)绑定在分组 NULL 下,并且分组适用于所有其它操作数(列)。由于 CUBE 返回每个可能的组和子组组合,因此不论指定分组列时所使用的是什么顺序,行数都相同。 我们通常的Group By语句是按照其后所跟的所有字段进行分组,而如果加入了CUBE关键字以后,那么系统将根据所有字段进行分组的基础上,还会通过对所有这些分组字段所有可能存在的组合形成的分组条件进行分组计算。由于上面举的例子过于简单,这里就再适合了,现在我们的数据集将换一个场景,一个表中包含人员的基本信息:员工所在的部门编号(C_EMPLINFO_DEPTID)、员工性别(C_EMPLINFO_SEX)、员工姓名(C_EMPLINFO_NAME)等。那么我现在想知道每个部门各个性别的人数,那么我们可以通过如下语句得到: SELECT C_EMPLINFO_DEPTID, C_EMPLINFO_SEX, COUNT(*) AS C_EMPLINFO_TOTALSTAFFNUM FROM T_PERSONNEL_EMPLINFO GROUP BY C_EMPLINFO_DEPTID, C_EMPLINFO_SEX 但是如果我现在希望知道: 1. 所有部门有多少人(这里相当于就不进行分组了,因为这里已经对员工的部门和性别没有做任何限制了,但是这的确也是一种分组条件的组合方式); 2. 每种性别有多人(这里实际上是仅仅根据性别(C_EMPLINFO_SEX)进行分组); 3. 每个部门有多少人(这里仅仅是根据部门(C_EMPLINFO_DEPTID)进行分组);那么我们就可以使用ROLLUP语句了。 SELECT C_EMPLINFO_DEPTID, C_EMPLINFO_SEX, COUNT(*) AS C_EMPLINFO_TOTALSTAFFNUM FROM T_PERSONNEL_EMPLINFO GROUP BY C_EMPLINFO_DEPTID, C_EMPLINFO_SEX WITH CUBE 那么这里你可以看到结果集中多出了很多行,而且结果集中的某一个字段或者多个字段、甚至全部的字段都为NULL,请仔细看一下你就会发现实际上这些记录就是完成了上面我所列举的所有统计数据的展现。使用过SQL Server 2005或者RDLC的朋友们一定对于矩阵的小计和分组功能有印象吧,是不是都可以通过这个得到答案。我想RDLC中对于分组和小计的计算就是通过Group By的CUBE和ROLLUP关键字来实现的。(个人意见,未证实) CUBE关键字还有一个极为相似的兄弟ROLLUP, 同样我们先从这英文入手,ROLL UP是“向上卷”的意思,如果说CUBE的组合是绝对自由的,那么ROLLUP的组合就需要有点约束了。我们先来看看SQL Server 2000的联机中对ROLLUP关键字的定义: 指定在结果集内不仅包含由 GROUP BY 提供的正常行,还包含汇总行。按层次结构顺序,从组内的最低级别到最高级别汇总组。组的层次结构取决于指定分组列时所使用的顺序。更改分组列的顺序会影响在结果集内生成的行数。 那么这个顺序是什么呢?对了就是Group By 后面字段的顺序,排在靠近Group By的分组字段的级别高,然后是依次递减。如:Group By Column1, Column2, Column3。那么分组级别从高到低的顺序是:Column1 > Column2 > Column3。还是看我们前面的例子,SQL语句中我们仅仅将CUBE关键字替换成ROLLUP关键字,如: SELECT C_EMPLINFO_DEPTID, C_EMPLINFO_SEX, COUNT(*) AS C_EMPLINFO_TOTALSTAFFNUM FROM T_PERSONNEL_EMPLINFO GROUP BY C_EMPLINFO_DEPTID, C_EMPLINFO_SEX WITH ROLLUP 和CUBE相比,返回的数据行数减少了不少。:),仔细看一下,除了正常的Group By语句后,数据中还包含了: 1. 部门员工数;(向上卷了一次,这次先去掉了员工性别的分组限制) 2. 所有部门员工数;(向上又卷了依次,这次去掉了员工所在部门的分组限制)。 在现实的应用中,对于报表的一些统计功能是很有帮助的。 这里还有一个问题需要补充说明一下,如果我们使用ROLLUP或者CUBE关键字,那么将产生一些小计的行,这些行中被剔除在分组因素之外的字段将会被设置为NULL,那么还存在一种情况,比如在作为分组依据的列表中存在可空的行,那么NULL也会被作为一个分组表示出来,所以这里我们就不能仅仅通过NULL来判断是不是小计记录了。下面的例子展示了这里说得到的情况。还是我们前面提到的水果例子,现在我们在每种商品后面增加一个“折扣列”(Discount),用于显示对应商品的折扣,这个数值是可空的,也就是可以通过NULL来表示没有对应的折扣信息。数据集如下所示: FruitName ProctPlace Price Discount
Apple China $1.1 0.8
Apple Japan $2.1 0.9
Apple USA $2.5 1.0
Orange China $0.8 NULL
Banana China $3.1 NULL
Peach USA $3.0 NULL
现在我们要统计“各种折扣对应有多少种商品,并总计商品的总数。”,那么我们可以通过如下的SQL语句来完成: SELECT COUNT(*) AS ProctCount, Discount FROM T_TEST_FRUITINFO GROUP BY Discount WITH ROLLUP 好了,运行一下,你会发现数据都正常出来了,按照如上的数据集,结果如下所示: ProctCount Discount
3 NULL
1 0.8
1 0.9
1 1.0
6 NULL
好了,各种折扣的商品数量都出来了,但是在显示“没有折扣商品”和“商品小计”的时候判断上确存在问题,因为存在两条Discount为Null的记录。是哪一条呢?通过分析数据我们知道第一条数据(3, Null)应该对应没有折扣商品的数量,而(6,Null)应该对应所有商品的数量。需要判断这两个具有不同意义的Null就需要引入一个聚合函数Grouping。现在我们把语句修改一下,在返回值中使用Grouping函数增加一列返回值,SQL语句如下: SELECT COUNT(*) AS ProctCount, Discount, GROUPING(Discount) AS Expr1 FROM T_TEST_FRUITINFO GROUP BY Discount WITH ROLLUP 这个时候,我们再看看运行的结果: ProctCount Discount Expr1
3 NULL 0
1 0.8 0
1 0.9 0
1 1.0 0
6 NULL 1
对于根据指定字段Grouping中包含的字段进行小计的记录,这里会标记为1,我们就可以通过这个标记值将小计记录从判断那些由于ROLLUP或者CUBE关键字产生的行。Grouping(column_name)可以带一个参数,Grouping就会去判断对应的字段值的NULL是否是由ROLLUP或者CUBE产生的特殊NULL值,如果是那么就在由Grouping聚合函数产生的新列中将值设置为1。注意Grouping只会检查Column_name对应的NULL来决定是否将值设置为1,而不是完全由此列是否是由ROLLUP或者CUBE关键字自动添加来决定的。 2.2 Group By 和 Having, Where ,Order by语句的执行顺序: 最后要说明一下的Group By, Having, Where, Order by几个语句的执行顺序。一个SQL语句往往会产生多个临时视图,那么这些关键字的执行顺序就非常重要了,因为你必须了解这个关键字是在对应视图形成前的字段进行操作还是对形成的临时视图进行操作,这个问题在使用了别名的视图尤其重要。以上列举的关键字是按照如下顺序进行执行的:Where, Group By, Having, Order by。首先where将最原始记录中不满足条件的记录删除(所以应该在where语句中尽量的将不符合条件的记录筛选掉,这样可以减少分组的次数),然后通过Group By关键字后面指定的分组条件将筛选得到的视图进行分组,接着系统根据Having关键字后面指定的筛选条件,将分组视图后不满足条件的记录筛选掉,然后按照Order By语句对视图进行排序,这样最终的结果就产生了。在这四个关键字中,只有在Order By语句中才可以使用最终视图的列名,如: SELECT FruitName, ProctPlace, Price, ID AS IDE, Discount FROM T_TEST_FRUITINFO WHERE (ProctPlace = N'china') ORDER BY IDE 这里只有在ORDER BY语句中才可以使用IDE,其他条件语句中如果需要引用列名则只能使用ID,而不能使用IDE。
⑨ 求如何在SQL语句里实现两次或多次求合
干嘛要查2次,一次就可以了
select 科目,sum(第一单元成绩) 第一单元成绩,sum(第二单元成绩) 第二单元成绩
from 成绩表
group by 科目
⑩ 定义SQL用户函数取单元格内值
substring参数使用不正确,很明显,错误也在提示你这个原因!
substring一共要三个参数,第一个为要截的字符,第二个为字符串截取的起始位置,最后一个为要截取的长度!
很明显你要截取的字符串是@content,
起始位置为@spaceindex1+len(@text1),
长度为@spaceindex2-@spaceindex1-len(@text1)
这几个值你写的都是正确的,但我们必须要考虑一些意外情况!
varchar与nvarchar两者之间的区别!还有就是查找不到的情况!比如你输入的错了一个字符,那么就会导致@spaceindex1与@spaceindex2都为0第一个式子还好说,而第二个,也就是说长度会变为负值,而substring就会报错!
所以我们不妨先测试一下@spaceindex2的值,若为0时,则直接让其等于len(@content),这样如果查不到由直接返回整个字串,当然如果是@spaceindex1不为0时,还可以照样截取.
另一种情况也是你程序中常出现的错误!
set
@spaceindex2=charindex(@text2,@content)如果反过来了,也是得到的负值的.好在charindex支持第三个参数!
set
@spaceindex2=charindex(@text2,@content,@spaceindex1+1)
这样做的目的是保证@spaceindex2大于@spaceindex1,否则照出现错误!为了杜绝重复引起的错误,最好是
set
@spaceindex2=charindex(@text2,@content,@spaceindex1+1+len(@text1))
这样保证了@spaceindex2-len(@text1)也大于@spaceindex1
最后的那个varchar与nvarchar两者的区别,建议你如果处理有中文最好用nvarchar,因为这两个在统计长度是不至于出错的!
我想你最终的程序,应该是好修改的吧?