㈠ sql语句执行过程详解
SQL语句执行过程详解
一条sql,plsql的执行到底是怎样执行的呢?
一、SQL语句执行原理:
第一步:客户端把语句发给服务器端执行当我们在客户端执行 select 语句时,客户端会把这条 SQL 语句发送给服务器端,让服务器端的
进程来处理这语句。也就是说,Oracle 客户端是不会做任何的操作,他的主要任务就是把客户端产生
的一些 SQL 语句发送给服务器端。虽然在客户端也有一个数据库进程,但是,这个进程的作用跟服务器
上的进程作用事不相同的。服务器上的数据库进程才会对SQL 语句进行相关的处理。不过,有个问题需
要说明,就是客户端的进程跟服务器的进程是一一对应的。也就是说,在客户端连接上服务器后,在客户
端与服务器端都会形成一个进程,客户端上的我们叫做客户端进程;而服务器上的我们叫做服务器进程。
第二步:语句解析
当客户端把 SQL 语句传送到服务器后,服务器进程会对该语句进行解析。同理,这个解析的工作,
也是在服务器端所进行的。虽然这只是一个解析的动作,但是,其会做很多“小动作”。
1. 查询高速缓存(library cache)。服务器进程在接到客户端传送过来的 SQL 语句时,不
会直接去数据库查询。而是会先在数据库的高速缓存中去查找,是否存在相同语句的执行计划。如果在
数据高速缓存中,则服务器进程就会直接执行这个 SQL 语句,省去后续的工作。所以,采用高速数据缓
存的话,可以提高 SQL 语句的查询效率。一方面是从内存中读取数据要比从硬盘中的数据文件中读取
数据效率要高,另一方面,也是因为这个语句解析的原因。
不过这里要注意一点,这个数据缓存跟有些客户端软件的数据缓存是两码事。有些客户端软件为了
提高查询效率,会在应用软件的客户端设置数据缓存。由于这些数据缓存的存在,可以提高客户端应用软
件的查询效率。但是,若其他人在服务器进行了相关的修改,由于应用软件数据缓存的存在,导致修改的
数据不能及时反映到客户端上。从这也可以看出,应用软件的数据缓存跟数据库服务器的高速数据缓存
不是一码事。
2. 语句合法性检查(data dict cache)。当在高速缓存中找不到对应的 SQL 语句时,则服
务器进程就会开始检查这条语句的合法性。这里主要是对 SQL 语句的语法进行检查,看看其是否合乎
语法规则。如果服务器进程认为这条 SQL 语句不符合语法规则的时候,就会把这个错误信息,反馈给客
户端。在这个语法检查的过程中,不会对 SQL 语句中所包含的表名、列名等等进行 SQL 他只是语法
上的检查。
3. 语言含义检查(data dict cache)。若 SQL 语句符合语法上的定义的话,则服务器进程
接下去会对语句中的字段、表等内容进行检查。看看这些字段、表是否在数据库中。如果表名与列名不
准确的话,则数据库会就会反馈错误信息给客户端。所以,有时候我们写 select 语句的时候,若语法
与表名或者列名同时写错的话,则系统是先提示说语法错误,等到语法完全正确后,再提示说列名或表名
错误。
4. 获得对象解析锁(control structer)。当语法、语义都正确后,系统就会对我们需要查询
的对象加锁。这主要是为了保障数据的一致性,防止我们在查询的过程中,其他用户对这个对象的结构发
生改变。
5. 数据访问权限的核对(data dict cache)。当语法、语义通过检查之后,客户端还不一定
能够取得数据。服务器进程还会检查,你所连接的用户是否有这个数据访问的权限。若你连接上服务器
的用户不具有数据访问权限的话,则客户端就不能够取得这些数据。有时候我们查询数据的时候,辛辛苦
苦地把 SQL 语句写好、编译通过,但是,最后系统返回个 “没有权限访问数据”的错误信息,让我们气
半死。这在前端应用软件开发调试的过程中,可能会碰到。所以,要注意这个问题,数据库服务器进程先
检查语法与语义,然后才会检查访问权限。
6. 确定最佳执行计划 ?。当语句与语法都没有问题,权限也匹配的话,服务器进程还是不会直接对
数据库文件进行查询。服务器进程会根据一定的规则,对这条语句进行优化。不过要注意,这个优化是有
限的。一般在应用软件开发的过程中,需要对数据库的 sql 语言进行优化,这个优化的作用要大大地大
于服务器进程的自我优化。所以,一般在应用软件开发的时候,数据库的优化是少不了的。当服务器进程
的优化器确定这条查询语句的最佳执行计划后,就会将这条 SQL 语句与执行计划保存到数据高速缓存
(library cache)。如此的话,等以后还有这个查询时,就会省略以上的语法、语义与权限检查的步骤,
而直接执行 SQL 语句,提高 SQL 语句处理效率。
第三步:语句执行
语句解析只是对 SQL 语句的语法进行解析,以确保服务器能够知道这条语句到底表达的是什么意
思。等到语句解析完成之后,数据库服务器进程才会真正的执行这条 SQL 语句。这个语句执行也分两
种情况。
一是若被选择行所在的数据块已经被读取到数据缓冲区的话,则服务器进程会直接把这个数据传递
给客户端,而不是从数据库文件中去查询数据。
若数据不在缓冲区中,则服务器进程将从数据库文件中查询相关数据,并把这些数据放入到数据缓冲
区中(buffer cache)。
第四步:提取数据
当语句执行完成之后,查询到的数据还是在服务器进程中,还没有被传送到客户端的用户进程。所以,
在服务器端的进程中,有一个专门负责数据提取的一段代码。他的作用就是把查询到的数据结果返回给
用户端进程,从而完成整个查询动作。从这整个查询处理过程中,我们在数据库开发或者应用软件开发过
程中,需要注意以下几点:
一是要了解数据库缓存跟应用软件缓存是两码事情。数据库缓存只有在数据库服务器端才存在,在
客户端是不存在的。只有如此,才能够保证数据库缓存中的内容跟数据库文件的内容一致。才能够根据
相关的规则,防止数据脏读、错读的发生。而应用软件所涉及的数据缓存,由于跟数据库缓存不是一码事
情,所以,应用软件的数据缓存虽然可以提高数据的查询效率,但是,却打破了数据一致性的要求,有时候
会发生脏读、错读等情况的发生。所以,有时候,在应用软件上有专门一个功能,用来在必要的时候清除
数据缓存。不过,这个数据缓存的清除,也只是清除本机上的数据缓存,或者说,只是清除这个应用程序
的数据缓存,而不会清除数据库的数据缓存。
二是绝大部分 SQL 语句都是按照这个处理过程处理的。我们 DBA 或者基于 Oracle 数据库的
开发人员了解这些语句的处理过程,对于我们进行涉及到 SQL 语句的开发与调试,是非常有帮助的。有
时候,掌握这些处理原则,可以减少我们排错的时间。特别要注意,数据库是把数据查询权限的审查放在
语法语义的后面进行检查的。所以,有时会若光用数据库的权限控制原则,可能还不能满足应用软件权限
控制的需要。此时,就需要应用软件的前台设置,实现权限管理的要求。而且,有时应用数据库的权限管
理,也有点显得繁琐,会增加服务器处理的工作量。因此,对于记录、字段等的查询权限控制,大部分程
序涉及人员喜欢在应用程序中实现,而不是在数据库上实现。
DBCC DROPCLEANBUFFERS
从缓冲池中删除所有清除缓冲区。
DBCC FREEPROCCACHE
从过程缓存中删除所有元素。
DBCC FREESYSTEMCACHE
从所有缓存中释放所有未使用的缓存条目
SQL语句中的函数、关键字、排序等执行顺序:
1. FROM 子句返回初始结果集。
2. WHERE 子句排除不满足搜索条件的行。
3. GROUP BY 子句将选定的行收集到 GROUP BY 子句中各个唯一值的组中。
4. 选择列表中指定的聚合函数可以计算各组的汇总值。
5. 此外,HAVING 子句排除不满足搜索条件的行。
6. 计算所有的表达式;
7. 使用 order by 对结果集进行排序。
8. 查找你要搜索的字段。
二、SQL语句执行完整过程:
1.用户进程提交一个 sql 语句:
update temp set a=a*2,给服务器进程。
2.服务器进程从用户进程把信息接收到后,在 PGA 中就要此进程分配所需内存,存储相关的信息,如在会
话内存存储相关的登录信息等。
3.服务器进程把这个 sql 语句的字符转化为 ASCII 等效数字码,接着这个 ASCII 码被传递给一个
HASH 函数,并返回一个 hash 值,然后服务器进程将到shared pool 中的 library cache 中去查找是否存在相
同的 hash 值,如果存在,服务器进程将使用这条语句已高速缓存在 SHARED POOL 的library cache 中的已
分析过的版本来执行。
4.如果不存在,服务器进程将在 CGA 中,配合 UGA 内容对 sql,进行语法分析,首先检查语法的正确性,接
着对语句中涉及的表,索引,视图等对象进行解析,并对照数据字典检查这些对象的名称以及相关结构,并根据
ORACLE 选用的优化模式以及数据字典中是否存在相应对象的统计数据和是否使用了存储大纲来生成一个
执行计划或从存储大纲中选用一个执行计划,然后再用数据字典核对此用户对相应对象的执行权限,最后生成
一个编译代码。
5.ORACLE 将这条 sql 语句的本身实际文本、HASH 值、编译代码、与此语名相关联的任何统计数据
和该语句的执行计划缓存在 SHARED POOL 的 library cache中。服务器进程通过 SHARED POOL 锁存
器(shared pool latch)来申请可以向哪些共享 PL/SQL 区中缓存这此内容,也就是说被SHARED POOL 锁存
器锁定的 PL/SQL 区中的块不可被覆盖,因为这些块可能被其它进程所使用。
6.在 SQL 分析阶段将用到 LIBRARY
CACHE,从数据字典中核对表、视图等结构的时候,需要将数据
字典从磁盘读入 LIBRARY
CACHE,因此,在读入之前也要使用LIBRARY
CACHE 锁存器(library cache
pin,library cache lock)来申请用于缓存数据字典。 到现在为止,这个 sql 语句已经被编译成可执行的代码了,
但还不知道要操作哪些数据,所以服务器进程还要为这个 sql 准备预处理数据。
7.首先服务器进程要判断所需数据是否在 db buffer 存在,如果存在且可用,则直接获取该数据,同时根据
LRU 算法增加其访问计数;如果 buffer 不存在所需数据,则要从数据文件上读取首先服务器进程将在表头部
请求 TM 锁(保证此事务执行过程其他用户不能修改表的结构),如果成功加 TM 锁,再请求一些行级锁(TX
锁),如果 TM、TX 锁都成功加锁,那么才开始从数据文件读数据,在读数据之前,要先为读取的文件准备好
buffer 空间。服务器进程需要扫面 LRU list 寻找 free db buffer,扫描的过程中,服务器进程会把发现的所有
已经被修改过的 db buffer 注册到 dirty list 中, 这些 dirty buffer 会通过 dbwr 的触发条件,随后会被写出到
数据文件,找到了足够的空闲 buffer,就可以把请求的数据行所在的数据块放入到 db buffer 的空闲区域或者
覆盖已经被挤出 LRU list 的非脏数据块缓冲区,并排列在 LRU list 的头部,也就是在数据块放入 DB
BUFFER 之前也是要先申请 db buffer 中的锁存器,成功加锁后,才能读数据到 db buffer。
8.记日志 现在数据已经被读入到 db buffer 了,现在服务器进程将该语句所影响的并被读
入 db buffer 中的这些行数据的 rowid 及要更新的原值和新值及 scn 等信息从 PGA 逐条的写入 redo log
buffer 中。在写入 redo log buffer 之前也要事先请求 redo log buffer 的锁存器,成功加锁后才开始写入,当
写入达到 redo log buffer 大小的三分之一或写入量达到 1M 或超过三秒后或发生检查点时或者 dbwr 之前
发生,都会触发 lgwr 进程把 redo log buffer 的数据写入磁盘上的 redo file 文件中(这个时候会产生log file
sync 等待事件)
已经被写入 redofile 的 redo log buffer 所持有的锁存器会被释放,并可被后来的写入信息覆盖,
redo log buffer是循环使用的。Redo file 也是循环使用的,当一个 redo file 写满后,lgwr 进程会自动切换到
下一 redo file(这个时候可能出现 log fileswitch(checkpoint complete)等待事件)。如果是归档模式,归档进
程还要将前一个写满的 redo file 文件的内容写到归档日志文件中(这个时候可能出现 log file
switch(archiving needed)。
9.为事务建立回滚段 在完成本事务所有相关的 redo log buffer 之后,服务器进程开始改写这个 db buffer
的块头部事务列表并写入 scn,然后 包含这个块的头部事务列表及 scn 信息的数据副本放入回滚段中,将
这时回滚段中的信息称为数据块的“前映像“,这个”前映像“用于以后的回滚、恢复和一致性读。(回滚段可以
存储在专门的回滚表空间中,这个表空间由一个或多个物理文件组成,并专用于回滚表空间,回滚段也可在其它
表空间中的数据文件中开辟。
10.本事务修改数据块 准备工作都已经做好了,现在可以改写 db buffer 块的数据内容了,并在块的头部写
入回滚段的地址。
11.放入 dirty list 如果一个行数据多次 update 而未 commit,则在回滚段中将会有多个“前映像“,除了第
一个”前映像“含有 scn 信息外,其他每个“前映像“的头部都有 scn 信息和“前前映像”回滚段地址。一个
update 只对应一个 scn,然后服务器进程将在 dirty list 中建立一
条指向此 db buffer 块的指针(方便 dbwr 进程可以找到 dirty list 的 db buffer 数据块并写入数据文件中)。
接着服务器进程会从数据文件中继续读入第二个数据块,重复前一数据块的动作,数据块的读入、记日志、建
立回滚段、修改数据块、放入 dirty list。当 dirty queue 的长度达到阀值(一般是 25%),服务器进程将通知
dbwr 把脏数据写出,就是释放 db buffer 上的锁存器,腾出更多的 free db buffer。前面一直都是在说明
oracle 一次读一个数据块,其实 oracle 可以一次读入多个数据块(db_file_multiblock_read_count 来设置一
次读入块的个数)
说明:
在预处理的数据已经缓存在 db buffer 或刚刚被从数据文件读入到 db buffer 中,就要根据 sql 语句
的类型来决定接下来如何操作。
1>如果是 select 语句,则要查看 db buffer 块的头部是否有事务,如果有事务,则从回滚段中读取数据;如
果没有事务,则比较 select 的 scn 和 db buffer 块头部的 scn,如果前者小于后者,仍然要从回滚段中读取数据;
如果前者大于后者,说明这是一非脏缓存,可以直接读取这个 db buffer 块的中内容。
2>如果是 DML 操作,则即使在 db buffer 中找到一个没有事务,而且 SCN 比自己小的非脏
缓存数据块,服务器进程仍然要到表的头部对这条记录申请加锁,加锁成功才能进行后续动作,如果不成功,则要
等待前面的进程解锁后才能进行动作(这个时候阻塞是 tx 锁阻塞)。
用户 commit 或 rollback 到现在为止,数据已经在 db buffer 或数据文件中修改完
成,但是否要永久写到数文件中,要由用户来决定 commit(保存更改到数据文件) rollback 撤销数据的更改)。
1.用户执行 commit 命令
只有当 sql 语句所影响的所有行所在的最后一个块被读入 db buffer 并且重做信息被写入 redo log
buffer(仅指日志缓冲区,而不包括日志文件)之后,用户才可以发去 commit 命令,commit 触发 lgwr 进程,但不
强制立即 dbwr来释放所有相应 db buffer 块的锁(也就是no-force-at-commit,即提交不强制写),也就是说有
可能虽然已经 commit 了,但在随后的一段时间内 dbwr 还在写这条 sql 语句所涉及的数据块。表头部的行锁
并不在 commit 之后立即释放,而是要等 dbwr 进程完成之后才释放,这就可能会出现一个用户请求另一用户
已经 commit 的资源不成功的现象。
A .从 Commit 和 dbwr 进程结束之间的时间很短,如果恰巧在 commit 之后,dbwr 未结束之前断电,因为
commit 之后的数据已经属于数据文件的内容,但这部分文件没有完全写入到数据文件中。所以需要前滚。由
于 commit 已经触发 lgwr,这些所有未来得及写入数据文件的更改会在实例重启后,由 smon 进程根据重做日
志文件来前滚,完成之前 commit 未完成的工作(即把更改写入数据文件)。
B.如果未 commit 就断电了,因为数据已经在 db buffer 更改了,没有 commit,说明这部分数据不属于数
据文件,由于 dbwr 之前触发 lgwr 也就是只要数据更改,(肯定要先有 log) 所有 DBWR,在数据文件上的修改
都会被先一步记入重做日志文件,实例重启后,SMON 进程再根据重做日志文件来回滚。
其实 smon 的前滚回滚是根据检查点来完成的,当一个全部检查点发生的时候,首先让 LGWR 进程将
redo log buffer 中的所有缓冲(包含未提交的重做信息)写入重做日志文件,然后让 dbwr 进程将 db buffer 已
提交的缓冲写入数据文件(不强制写未提交的)。然后更新控制文件和数据文件头部的 SCN,表明当前数据库
是一致的,在相邻的两个检查点之间有很多事务,有提交和未提交的。
像前面的前滚回滚比较完整的说法是如下的说明:
A.发生检查点之前断电,并且当时有一个未提交的改变正在进行,实例重启之后,SMON 进程将从上一个
检查点开始核对这个检查点之后记录在重做日志文件中已提交的和未提交改变,因为
dbwr 之前会触发 lgwr,所以 dbwr 对数据文件的修改一定会被先记录在重做日志文件中。因此,断电前被
DBWN 写进数据文件的改变将通过重做日志文件中的记录进行还原,叫做回滚,
B. 如果断电时有一个已提交,但 dbwr 动作还没有完全完成的改变存在,因为已经提交,提交会触发 lgwr
进程,所以不管 dbwr 动作是否已完成,该语句将要影响的行及其产生的结果一定已经记录在重做日志文件中
了,则实例重启后,SMON 进程根据重做日志文件进行前滚.
实例失败后用于恢复的时间由两个检查点之间的间隔大小来决定,可以通个四个参数设置检查点执行的频
率:
Log_checkpoint_interval:
决定两个检查点之间写入重做日志文件的系统物理块(redo blocks)
的大小,默认值是 0,无限制。
log_checkpoint_timeout:
两 个 检 查 点 之 间 的 时 间 长 度(秒)默 认 值 1800s。
fast_start_io_target:
决定了用于恢复时需要处理的块的多少,默认值是 0,无限制。
fast_start_mttr_target:
直接决定了用于恢复的时间的长短,默认值是 0,无限制(SMON 进程执行的前滚
和回滚与用户的回滚是不同的,SMON 是根据重做日志文件进行前滚或回滚,而用户的回滚一定是根据回滚段
的内容进行回滚的。
在这里要说一下回滚段存储的数据,假如是 delete 操作,则回滚段将会记录整个行的数据,假如是 update,
则回滚段只记录被修改了的字段的变化前的数据(前映像),也就是没有被修改的字段是不会被记录的,假如是
insert,则回滚段只记录插入记录的 rowid。 这样假如事务提交,那回滚段中简单标记该事务已经提交;假如是
回退,则如果操作是 delete,回退的时候把回滚段中数据重新写回数据块,操作如果是 update,则把变化前数据
修改回去,操作如果是 insert,则根据记录的 rowid 把该记录删除。
2.如果用户 rollback。
则服务器进程会根据数据文件块和 DB BUFFER 中块的头部的事务列表和 SCN 以及回滚段地址找到
回滚段中相应的修改前的副本,并且用这些原值来还原当前数据文件中已修改但未提交的改变。如果有多个
“前映像”,服务器进程会在一个“前映像”的头部找到“前前映像”的回滚段地址,一直找到同一事务下的最早的
一个“前映像”为止。一旦发出了 COMMIT,用户就不能rollback,这使得 COMMIT 后 DBWR 进程还没有
全部完成的后续动作得到了保障。到现在为例一个事务已经结束了。
说明:
TM 锁:
符合 lock 机制的,用于保护对象的定义不被修改。 TX 锁:
这个锁代表一个事务,是行
级锁,用数据块头、数据记录头的一些字段表示,也是符合 lock 机制,有 resource structure、lock
structure、enqueue 算法。
㈡ SQL语言有什么作用它与C语言有什么异同点。
SQL既结构化查询语言,是一种关系型数据库.作用和ORACLE,DB2,MYSQL类似.
作用:存储数据,查询数据.处理数据.
C语言是一种过程性语言,是从事系统软件和游戏软件开发的语言,现在主要是用VC++,它也可以从事手机系统开发,像塞班系统就是VC开发的.
SQL是一种非过程化语言,你只用下命令,不用说明怎么做,软件帮你解决.而C语言是过程化语言,你不仅要下命令,还要说明怎么做,难度远远大于SQL.
㈢ Sql语言是一个什么语言
结构化查询语言是高级的非过程化编程语言,允许用户在高层数据结构上工作。它不要求用户指定对数据的存放方法,也不需要用户了解具体的数据存放方式,所以具有完全不同底层结构的不同数据库系统,可以使用相同的结构化查询语言作为数据输入与管理的接口。结构化查询语言语句可以嵌套,这使它具有极大的灵活性和强大的功能。
(3)漫谈一条sql语句的一生扩展阅读:
sql语言的特点
1、综合统一
SQL语言集数据定义语言DDL、数据操纵语言DML、数据控制语言DCL的功能于一体,语言风格统一,可以独立完成数据库生命周期中的全部活动,包括定义关系模式、录入数据以建立数据库、查询、更新、维护、数据库重构、数据库安全性控制等一系列操作要求,这就为数据库应用系统开发提供了良好的环境,例如用户在数据库投入运行后,还可根据需要随时地逐步地修改模式,并不影响数据库的运行,从而使系统具有良好的可扩充性。
2、高度非过程化
非关系数据模型的数据操纵语言是面向过程的语言,用其完成某项请求,必须指定存取路径。而用SQL语言进行数据操作,用户只需提出“做什么”,而不必指明“怎么做”,因此用户无需了解存取路径,存取路径的选择以及SQL语句的操作过程由系统自动完成。这不但大大减轻了用户负担,而且有利于提高数据独立性。
3、面向集合的操作方式
SQL语言采用集合操作方式,不仅查找结果可以是元组的集合,而且一次插入、删除、更新操作的对象也可以是元组的集合。
非关系数据模型采用的是面向记录的操作方式,任何一个操作其对象都是一条记录。例如查询所有平均成绩在80分以上的学生姓名,用户必须说明完成该请求的具体处理过程,即如何用循环结构按照某条路径一条一条地把满足条件的学生记录读出来。
4、以同一种语法结构提供两种使用方式
SQL语言既是自含式语言,又是嵌入式语言。
作为自含式语言,它能够独立地用于联机交互的使用方式,用户可以在终端键盘上直接键入SQL命令对数据库进行操作。作为嵌入式语言,SQL语句能够嵌入到高级语言(例如C、PB)程序中,供程序员设计程序时使用。而在两种不同的使用方式下,SQL语言的语法结构基本上是一致的。这种以统一的语法结构提供两种不同的使用方式的作法,为用户提供了极大的灵活性与方便性。
㈣ SQL语句是什么意思
以下摘自网络 SQL基本语句 来自:SQL编程技巧
掌握SQL四条最基本的数据操作语句:Insert,Select,Update和Delete。
练掌握SQL是数据库用户的宝贵财 富。在本文中,我们将引导你掌握四条最基本的数据操作语句—SQL的核心功能—来依次介绍比较操作符、选择断言以及三值逻辑。当你完成这些学习后,显然你已经开始算是精通SQL了。
在我们开始之前,先使用CREATE TABLE语句来创建一个表(如图1所示)。DDL语句对数据库对象如表、列和视进行定义。它们并不对表中的行进行处理,这是因为DDL语句并不处理数据库中实际的数据。这些工作由另一类SQL语句—数据操作语言(DML)语句进行处理。
SQL中有四种基本的DML操作:INSERT,SELECT,UPDATE和DELETE。由于这是大多数SQL用户经常用到的,我们有必要在此对它们进行一一说明。在图1中我们给出了一个名为EMPLOYEES的表。其中的每一行对应一个特定的雇员记录。请熟悉这张表,我们在后面的例子中将要用到它。
INSERT语句
用户可以用INSERT语句将一行记录插入到指定的一个表中。例如,要将雇员John Smith的记录插入到本例的表中,可以使用如下语句:
INSERT INTO EMPLOYEES VALUES
('Smith','John','1980-06-10',
'Los Angles',16,45000);
通过这样的INSERT语句,系统将试着将这些值填入到相应的列中。这些列按照我们创建表时定义的顺序排列。在本例中,第一个值“Smith”将填到第一个列LAST_NAME中;第二个值“John”将填到第二列FIRST_NAME中……以此类推。
我们说过系统会“试着”将值填入,除了执行规则之外它还要进行类型检查。如果类型不符(如将一个字符串填入到类型为数字的列中),系统将拒绝这一次操作并返回一个错误信息。
如果SQL拒绝了你所填入的一列值,语句中其他各列的值也不会填入。这是因为SQL提供对事务的支持。一次事务将数据库从一种一致性转移到另一种一致性。如果事务的某一部分失败,则整个事务都会失败,系统将会被恢复(或称之为回退)到此事务之前的状态。
回到原来的INSERT的例子,请注意所有的整形十进制数都不需要用单引号引起来,而字符串和日期类型的值都要用单引号来区别。为了增加可读性而在数字间插入逗号将会引起错误。记住,在SQL中逗号是元素的分隔符。
同样要注意输入文字值时要使用单引号。双引号用来封装限界标识符。
对于日期类型,我们必须使用SQL标准日期格式(yyyy-mm-dd),但是在系统中可以进行定义,以接受其他的格式。当然,2000年临近,请你最好还是使用四位来表示年份。
既然你已经理解了INSERT语句是怎样工作的了,让我们转到EMPLOYEES表中的其他部分:
INSERT INTO EMPLOYEES VALUES
('Bunyan','Paul','1970-07-04',
'Boston',12,70000);
INSERT INTO EMPLOYEES VALUES
('John','Adams','1992-01-21',
'Boston',20,100000);
INSERT INTO EMPLOYEES VALUES
('Smith','Pocahontas','1976-04-06',
'Los Angles',12,100000);
INSERT INTO EMPLOYEES VALUES
('Smith','Bessie','1940-05-02',
'Boston',5,200000);
INSERT INTO EMPLOYEES VALUES
('Jones','Davy','1970-10-10',
'Boston',8,45000);
INSERT INTO EMPLOYEES VALUES
('Jones','Indiana','1992-02-01',
'Chicago',NULL,NULL);
在最后一项中,我们不知道Jones先生的工薪级别和年薪,所以我们输入NULL(不要引号)。NULL是SQL中的一种特殊情况,我们以后将进行详细的讨论。现在我们只需认为NULL表示一种未知的值。
有时,像我们刚才所讨论的情况,我们可能希望对某一些而不是全部的列进行赋值。除了对要省略的列输入NULL外,还可以采用另外一种INSERT语句,如下:
INSERT INTO EMPLOYEES(
FIRST_NAME, LAST_NAME,
HIRE_DATE, BRANCH_OFFICE)
VALUE(
'Indiana','Jones',
'1992-02-01','Indianapolis');
这样,我们先在表名之后列出一系列列名。未列出的列中将自动填入缺省值,如果没有设置缺省值则填入NULL。请注意我们改变了列的顺序,而值的顺序要对应新的列的顺序。如果该语句中省略了FIRST_NAME和LAST_NAME项(这两项规定不能为空),SQL操作将失败。
让我们来看一看上述INSERT语句的语法图:
INSERT INTO table
[(column { ,column})]
VALUES
(columnvalue [{,columnvalue}]);
和前一篇文章中一样,我们用方括号来表示可选项,大括号表示可以重复任意次数的项(不能在实际的SQL语句中使用这些特殊字符)。VALUE子句和可选的列名列表中必须使用圆括号。
SELECT语句
SELECT语句可以从一个或多个表中选取特定的行和列。因为查询和检索数据是数据库管理中最重要的功能,所以SELECT语句在SQL中是工作量最大的部分。实际上,仅仅是访问数据库来分析数据并生成报表的人可以对其他SQL语句一窍不通。
SELECT语句的结果通常是生成另外一个表。在执行过程中系统根据用户的标准从数据库中选出匹配的行和列,并将结果放到临时的表中。在直接SQL(direct SQL)中,它将结果显示在终端的显示屏上,或者将结果送到打印机或文件中。也可以结合其他SQL语句来将结果放到一个已知名称的表中。
SELECT语句功能强大。虽然表面上看来它只用来完成本文第一部分中提到的关系代数运算“选择”(或称“限制”),但实际上它也可以完成其他两种关系运算—“投影”和“连接”,SELECT语句还可以完成聚合计算并对数据进行排序。
SELECT语句最简单的语法如下:
SELECT columns FROM tables;
当我们以这种形式执行一条SELECT语句时,系统返回由所选择的列以及用户选择的表中所有指定的行组成的一个结果表。这就是实现关系投影运算的一个形式。
让我们看一下使用图1中EMPLOYEES表的一些例子(这个表是我们以后所有SELECT语句实例都要使用的。而我们在图2和图3中给出了查询的实际结果。我们将在其他的例子中使用这些结果)。
假设你想查看雇员工作部门的列表。那下面就是你所需要编写的SQL查询:
SELECT BRANCH_OFFICE FROM EMPLOYEES;
以上SELECT语句的执行将产生如图2中表2所示的结果。
由于我们在SELECT语句中只指定了一个列,所以我们的结果表中也只有一个列。注意结果表中具有重复的行,这是因为有多个雇员在同一部门工作(记住SQL从所选的所有行中将值返回)。要消除结果中的重复行,只要在SELECT语句中加上DISTINCT子句:
SELECT DISTINCT BRANCH_OFFICE
FROM EMPLOYEES;
这次查询的结果如表3所示。
现在已经消除了重复的行,但结果并不是按照顺序排列的。如果你希望以字母表顺序将结果列出又该怎么做呢?只要使用ORDER BY子句就可以按照升序或降序来排列结果:
SELECT DISTINCT BRANCH_OFFICE
FROM EMPLOYEES
ORDER BY BRANCH_OFFICE ASC;
这一查询的结果如表4所示。请注意在ORDER BY之后是如何放置列名BRANCH _OFFICE的,这就是我们想要对其进行排序的列。为什么即使是结果表中只有一个列时我们也必须指出列名呢?这是因为我们还能够按照表中其他列进行排序,即使它们并不显示出来。列名BRANCH_ OFFICE之后的关键字ASC表示按照升序排列。如果你希望以降序排列,那么可以用关键字DESC。
同样我们应该指出ORDER BY子句只将临时表中的结果进行排序;并不影响原来的表。
假设我们希望得到按部门排序并从工资最高的雇员到工资最低的雇员排列的列表。除了工资括号中的内容,我们还希望看到按照聘用时间从最近聘用的雇员开始列出的列表。以下是你将要用到的语句:
SELECT BRANCH_OFFICE,FIRST_NAME,
LAST_NAME,SALARY,HIRE_DATE
FROM EMPLOYEES
ORDER BY SALARY DESC,
HIRE_DATE DESC;
这里我们进行了多列的选择和排序。排序的优先级由语句中的列名顺序所决定。SQL将先对列出的第一个列进行排序。如果在第一个列中出现了重复的行时,这些行将被按照第二列进行排序,如果在第二列中又出现了重复的行时,这些行又将被按照第三列进行排序……如此类推。这次查询的结果如表5所示。
将一个很长的表中的所有列名写出来是一件相当麻烦的事,所以SQL允许在选择表中所有的列时使用*号:
SELECT * FROM EMPLOYEES;
这次查询返回整个EMPLOYEES表,如表1所示。
下面我们对开始时给出的SELECT语句的语法进行一下更新(竖直线表示一个可选项,允许在其中选择一项。):
SELECT [DISTINCT]
(column [{, columns}])| *
FROM table [ {, table}]
[ORDER BY column [ASC] | DESC
[ {, column [ASC] | DESC }]];
定义选择标准
在我们目前所介绍的SELECT语句中,我们对结果表中的列作出了选择但返回的是表中所有的行。让我们看一下如何对SELECT语句进行限制使得它只返回希望得到的行:
SELECT columns FROM tables [WHERE predicates];
WHERE子句对条件进行了设置,只有满足条件的行才被包括到结果表中。这些条件由断言(predicate)进行指定(断言指出了关于某件事情的一种可能的事实)。如果该断言对于某个给定的行成立,该行将被包括到结果表中,否则该行被忽略。在SQL语句中断言通常通过比较来表示。例如,假如你需要查询所有姓为Jones的职员,则可以使用以下SELECT语句:
SELECT * FROM EMPLOYEES
WHERE LAST_NAME = 'Jones';
LAST_NAME = 'Jones'部分就是断言。在执行该语句时,SQL将每一行的LAST_NAME列与“Jones”进行比较。如果某一职员的姓为“Jones”,即断言成立,该职员的信息将被包括到结果表中(见表6)。
使用最多的六种比较
我们上例中的断言包括一种基于“等值”的比较(LAST_NAME = 'Jones'),但是SQL断言还可以包含其他几种类型的比较。其中最常用的为:
等于 =
不等于 <>
小于 <
大于 >
小于或等于 <=
大于或等于 >=
下面给出了不是基于等值比较的一个例子:
SELECT * FROM EMPLOYEES
WHERE SALARY > 50000;
这一查询将返回年薪高于$50,000.00的职员(参见表7)。
逻辑连接符
有时我们需要定义一条不止一种断言的SELECT语句。举例来说,如果你仅仅想查看Davy Jones的信息的话,表6中的结果将是不正确的。为了进一步定义一个WHERE子句,用户可以使用逻辑连接符AND,OR和NOT。为了只得到职员Davy Jones的记录,用户可以输入如下语句:
SELECT * FROM EMPLOYEES
WHERE LAST_NAME = 'Jones' AND FIRST_NAME = 'Davy';
在本例中,我们通过逻辑连接符AND将两个断言连接起来。只有两个断言都满足时整个表达式才会满足。如果用户需要定义一个SELECT语句来使得当其中任何一项成立就满足条件时,可以使用OR连接符:
SELECT * FROM EMPLOYEES
WHERE LAST_NAME = 'Jones' OR LAST_NAME = 'Smith';
有时定义一个断言的最好方法是通过相反的描述来说明。如果你想要查看除了Boston办事处的职员以外的其他所有职员的信息时,你可以进行如下的查询:
SELECT * FROM EMPLOYEES
WHERE NOT(BRANCH_OFFICE = 'Boston');
关键字NOT后面跟着用圆括号括起来的比较表达式。其结果是对结果取否定。如果某一职员所在部门的办事处在Boston,括号内的表达式返回true,但是NOT操作符将该值取反,所以该行将不被选中。
断言可以与其他的断言嵌套使用。为了保证它们以正确的顺序进行求值,可以用括号将它们括起来:
SELECT * FROM EMPLOYEES
WHERE (LAST_NAME = 'Jones'
AND FIRST_NAME = 'Indiana')
OR (LAST_NAME = 'Smith'
AND FIRST_NAME = 'Bessie');
SQL沿用数学上标准的表达式求值的约定—圆括号内的表达式将最先进行求值,其他表达式将从左到右进行求值。
以上对逻辑连接符进行了说明,在对下面的内容进行说明之前,我们再一次对SELECT语句的语法进行更新:
SELECT [DISTINCT]
(column [{, column } ] )| *
FROM table [ { , table} ]
[ORDER BY column [ASC] | [DESC
[{ , column [ASC] | [DESC } ] ]
WHERE predicate [ { logical-connector predicate } ];
NULL和三值逻辑
在SQL中NULL是一个复杂的话题,关于NULL的详细描述更适合于在SQL的高级教程而不是现在的入门教程中进行介绍。但由于NULL需要进行特殊处理,并且你也很可能会遇到它,所以我们还是简略地进行一下说明。
首先,在断言中进行NULL判断时需要特殊的语法。例如,如果用户需要显示所有年薪未知的职员的全部信息,用户可以使用如下SELECT语句:
SELECT * FROM EMPLOYEES
WHERE SALARY IS NULL;
相反,如果用户需要所有已知年薪数据的职员的信息,你可以使用以下语句:
SELECT * FROM EMPLOYEES
WHERE SALARY IS NOT NULL;
请注意我们在列名之后使用了关键字IS NULL或IS NOT NULL,而不是标准的比较形式:COLUMN = NULL、COLUMN <> NULL或是逻辑操作符NOT(NULL)。
这种形式相当简单。但当你不明确地测试NULL(而它们确实存在)时,事情会变得很混乱。
例如,回过头来看我们图1中的EM-PLOYEES表,可以看到Indiana Jones的工薪等级或年薪值都是未知的。这两个列都包含NULL。可以想象运行如下的查询:
SELECT * FROM EMPLOYEES
WHERE GRADE <= SALARY;
此时,Indiana Jones应该出现在结果表中。因为NULL都是相等的,所以可以想象它们是能够通过GRADE小于等于SALARY的检查的。这其实是一个毫无疑义的查询,但是并没有关系。SQL允许进行这样的比较,只要两个列都是数字类型的。然而,Indiana Jones并没有出现在查询的结果中,为什么?
正如我们早先提到过的,NULL表示未知的值(而不是象某些人所想象的那样表示一个为NULL的值)。对于SQL来说意味着这个值是未知的,而只要这个值为未知,就不能将其与其他值比较(即使其他值也是NULL)。所以SQL允许除了在true 和false之外还有第三种类型的真值,称之为“非确定”(unknown)值。
如果比较的两边都是NULL,整个断言就被认为是非确定的。将一个非确定断言取反或使用AND或OR与其他断言进行合并之后,其结果仍是非确定的。由于结果表中只包括断言值为“真”的行,所以NULL不可能满足该检查。从而需要使用特殊的操作符IS NULL和IS NOT NULL。
UPDATE语句
UPDATE语句允许用户在已知的表中对现有的行进行修改。
例如,我们刚刚发现Indiana Jones的等级为16,工资为$40,000.00,我们可以通过下面的SQL语句对数据库进行更新(并清除那些烦人的NULL)。
UPDATE EMPLOYEES
SET GRADE = 16, SALARY = 40000
WHERE FIRST_NAME = 'Indiana'
AND LAST_NAME = 'Jones';
上面的例子说明了一个单行更新,但是UPDATE语句可以对多行进行操作。满足WHERE条件的所有行都将被更新。如果,你想让Boston办事处中的所有职员搬到New York,你可以使用如下语句:
UPDATE EMPLOYEES
SET BRANCH_OFFICE = 'New York'
WHERE BRANCH_OFFICE = 'Boston';
如果忽略WHERE子句,表中所有行中的部门值都将被更新为'New York'。
UPDATE语句的语法流图如下面所示:
UPDATE table
SET column = value [{, column = value}]
[ WHERE predicate [ { logical-connector predicate}]];
DELETE语句
DELETE语句用来删除已知表中的行。如同UPDATE语句中一样,所有满足WHERE子句中条件的行都将被删除。由于SQL中没有UNDO语句或是“你确认删除吗?”之类的警告,在执行这条语句时千万要小心。如果决定取消Los Angeles办事处并解雇办事处的所有职员,这一卑鄙的工作可以由以下这条语句来实现:
DELETE FROM EMPLOYEES
WHERE BRANCH_OFFICE = 'Los Angeles';
如同UPDATE语句中一样,省略WHERE子句将使得操作施加到表中所有的行。
DELETE语句的语法流图如下面所示:
DELETE FROM table
[WHERE predicate [ { logical-connector predicate} ] ];
现在我们完成了数据操作语言(DML)的主要语句的介绍。我们并没有对SQL能完成的所有功能进行说明。SQL还提供了许多的功能,如求平均值、求和以及其他对表中数据的计算,此外SQL还能完成从多个表中进行查询(多表查询,或称之为连接)的工作。这种语言还允许你使用GRANT和REVOKE命令控制使用者的数据访问权限。
㈤ sql 语句 获取最大值
sql 语句 获取一列中的最大值使用MAX() 函数
一、MAX 函数功能:返回一列中的最大值。NULL 值不包括在计算中。
二、SQL MAX() 语法:
SELECT MAX(column_name) FROM table_name
注释:MIN 和 MAX 也可用于文本列,以获得按字母顺序排列的最高或最低值。
三、检索aid字段的最大值语句:
selectmax(aid)as'最大值'fromaaa;
结果如图:
(5)漫谈一条sql语句的一生扩展阅读:
SQL语言,是结构化查询语言(StructuredQueryLanguage)的简称。SQL语言是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统;同时也是数据库脚本文件的扩展名。
SQL语言,是结构化查询语言(Structured Query Language)的简称。SQL语言是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统;同时也是数据库脚本文件的扩展名。
写从什么事得到什么启示的作文
这是我原来写的:下五子棋的启示人们在生活中,会遇到许多难忘的事,也会从这些难忘的事中获得启示,我就给大家讲一讲我从下五子棋中所获得的启示吧! 记得有一天晚上,我和爸爸正下着五子棋,当时爸爸的白棋把我的黑棋堵死了,这时我便灵机一动,去棋盘上另一个地方下了一颗棋子。
在我不经意中把棋子东拼西凑后,竟然不可思议地和老地方的棋子连了起来。
原来还正得意一定赢的爸爸结果输了。
多亏了我的灵活机动,才扭转了这局面。
真是“山重水复疑无路,柳暗花明又一村”。
爸爸拉着我的手,亲切地说:“幺儿,你赢了爸爸呢!” 晚上睡觉时,我仔细回忆了整个下棋的过程,有了几条心得:一、学习时,如果遇到了困难,也要坚持不懈。
二、不懂的地方要反复去想、读、看,把题目里面所蕴藏的韵味读透了,自然就能够懂了。
三、平时要多看书,书中的好词、佳句要记下来,可以引用于自己的作文中。
早上一起床,我就把晚上所想到的心得体会告诉了爸爸。
爸爸高兴地说:“孩子,你说得很对!写作文也是这样的,先要有一个主题思想,再东拼一点儿好词,西借一点儿佳句。
再往作文中‘添油加醋’,等把作文写通顺了,再用自己的语言把它‘变’美观,就是一篇好的文章了。
”爸爸接着说:“写作文就好比一棵树,它的主干(中心句)‘长’好了,然后再把叶子、枝干(好词、佳名)添进去,这棵树(作文)是不是就会很好了呢?”我点了点头。
这个早上,虽然它永远地过去了,但是爸爸的话却永远深深地印在我的脑海里,怎么也抹不去。
...
关于发生在身边的事得到启示的作文
展开全部 大自然的启示仙人掌,蚂蚁,这些自然的事物随处可见,因此它们并不稀奇,但你可别小看它们. 你是否看过一群小小的蚂蚁,在墙壁爬动着 它们时时抬着像沙子一般小的食物,成群结队的走动.那细小的身材,生命十分柔弱,只要被人一压,它的一生,可能就这样结束.蚂蚁虽然渺小,但非常团结.一只蚂蚁找到食物,由于食物的体积太大,自己无法搬运,它便立刻回巢,通知伙伴,大家一起团结起来,就能成功了.我们也是一样,如果不能团结,像一盘散沙一样,一点力量都没有;如果能合作,在做人处世上就能屹立不摇. 仙人掌生活在沙漠地区,那里酷热无比,还有许多恶毒的猛兽,处境十分危险.但是仙人掌生活在那里许久,却不见它绝种,这是因为它为了适应险恶的环境,长出了尖锐的刺,使动物们无可奈何.这似乎告诉我们,必须克服困难,外在艰苦的环境,要靠自己坚强的毅力去解决.俗语说:“天下无难事,只怕有心人.”就是这个道理. 大自然中,给我们的启示实在太多了,只要用心体会,都能让我们对生命有更深一层的体认,像仙人掌,蚂蚁,不都是很好的例子吗 大自然对人类的启示 大自然是美丽的大自然,我们因该保护大自然,不能丢垃圾、吐啖、砍树.接着,我给大家讲个故事. 从前有一个村,他不爱保护大自然就砍树,拿树做成椅子和桌子,不久,哪个村里人觉的房子旧了该换新的。
人们都去砍木做房,房子做好了,那里村字的人都高兴的叫了起来,有的骄傲到比谁的房子美就这样子人们天天都砍树。
不久洪水来了,洪水把村庄全毁了,越漂亮的房子都给凶猛的洪水冲走了因为没有数的阻挡下着些房子都被冲走了,这里都变成废区,这个故事给大家不要乱采地。
大自然这么好为什么还要有人破坏呢?让我说吧!因为有人没地方丢,没办法就丢到地下,有的人以为丢垃圾就这么一丢多没家教,还有在我们的班里有人把苹果不吃在上面画画多可恶,还有的吃香口绞吃了吐在地下让值日生添麻烦,在这么好的环境下学习听,那一群一群的蚂蚁帮的小骨头是教我们团结,那蜜蜂去采蜜是教我们勤劳,你看大自然多么美好,去破坏它舍得吗? 《生活的启示》生活中的每一件事,都让我有所收获,因为我得到了生活的启示。
我喜欢下围棋,叔叔是爸爸的朋友,也住在我家的隔壁,他经常来教我下棋,我的棋艺越来越好,兴趣也越来越浓厚了。
后来慢慢地,叔叔把我介绍给我们这里经常下棋的老爷爷们一起下棋,久而久之,老爷爷们下不过我,我的心里很高兴,也非常得意,总想让更多的人知道我会下象棋。
然而我却为自己的不知天高地厚付出了代价,那就是过于注重别人的评价,而且输不起棋。
有一天,叔叔让我和一个比我小几岁的我不认识的伙伴下棋,我看看了他,足足比我矮一个头。
我轻蔑地笑了笑,漫不经心和他比试起来。
渐渐,我惊讶了。
看着他那自信的笑脸。
我开始自暴自弃,果然不出我所料,他赢了。
回到家,我生气的大叫一声,引来了妈妈,妈妈问我出什么事了?我把事情的经过从头到尾的告诉妈妈。
妈妈顿时语重心长的对我说:“强中自有强中手,你现在知道了吧。
人外有人,天外有天。
俗话说:‘一分勤劳,一分回报。
’因为你不肯努力,而别人的付出比你多,自然回报也很多,他也就赢得了你。
” 夜深了,静悄悄的夜晚让我的心无法平静下来。
这个夜晚,给我留下了太多的回忆和永久的启示。
无论在学习生活还是竞技方面,都应该保持谦虚,而且要努力做到胜不骄败不馁。
那天中午,家里只有我和爷爷俩人,奶奶去菜市场买菜了,爸爸和妈妈都去上班了,现在家里就好象一个大南瓜里面没有了南瓜籽一样,空荡荡的。
我和爷爷因为感觉闷得慌,就准备一起收拾屋子。
我发现了厨房冰箱里鸡蛋快没有了,就跑下楼去超市买鸡蛋。
超市里的东西虽然是应有尽有,但是价格太昂贵了。
我拿过袋子,小心翼翼地装鸡蛋,心里祈祷着:千万不能有任何的差错呀。
可是事与愿违,正当我在拿最后一个鸡蛋时,可能是由于心里如释重负,一放松,手一滑,手中的鸡蛋就如一块巨大的石头一般重重地砸在了另外一个鸡蛋上面,破天慌的,一块大石头无缘无故地砸在你的头上面,你还不得委屈死了?鸡蛋委屈,可是我也一样委屈,自认倒霉,我得赔钱呀。
于是,我就跑过去,去问售货员阿姨一个鸡蛋大概几元钱,她说:"一个鸡蛋大概五角钱吧。
"我松了一口气,幸好我付了鸡蛋原来的钱还多剩下五角钱,真是不幸中的万幸呀,如果一个鸡蛋是一元钱的话,那我就是双悲临门哪。
我告诉了给我结帐的那位阿姨,她也没有责怪我,只是让我赔了五角钱。
回到家,爷爷问我怎么这么晚才回来,我告诉了爷爷那件事情,他说:"你呀真是太老实了,换成别人哪,没准还会贼人喊贼呢。
"我在想:如果我当时没有赔那五角钱,可能现在我还在耿耿于怀,没准还会惭愧呢。
现在我又想到:何必呢,五角钱就能够换来一个"清白身"和一个"自由身"不是挺值的嘛,何必那么吝啬呢。
老老实实地踏踏实实地过日子不是更舒坦的吗?最起码我是这么认为的。
这件事使我明白了许多道理,令我难忘。
2和往常不同的是,今天放学一回到家没看电视而是...
因为一件事得到启发的作文
从一件事得到的启示 失败乃成功之母是啊,做每件事都要经历过失败,才能成功.在我的记忆深处,有一件学骑车的事情,让我从这件事得到了一个启示.在我四岁时,就在骑自行车,那时候的自行车是有四个轮子的,骑上去不会摔跤.十岁那年 有一天,爸爸突然地对我说:''孩子,你不能总是骑四轮车,应该练练单车吧!''我想了想说:''好吧!''正好该我过生日了,所以我的生日礼物爸爸给我买了一台凤凰的折叠自行车。
刚开始学的时候,别提多难了!一跨上车,车子就像喝醉了酒,摇摇晃晃的,有时候车头怎么也扭不过来,让我连人带车的重重地摔在地上,摔得我四脚朝天,搞得别人哈哈大笑. 有时候我连车都骑不上来,有时候爸爸推我走但是爸爸一松手我就摔倒了,但我看见院里的其他小朋友和我一样老摔跤却一点也不服输,继续努力地练习.于是我也和他们一样继续努力地练习。
过了几天后又经过几次摔跤后,我渐渐地发现,车子像被我驯服的一匹骏马,终于能让我潇洒自如地驾驶了.那一天晚上,我正在回味着白天学自行车的事,并从中我悟出了一个启示:做什么事,不可能一下子就会成功,一定要经历过失败,然后再通过不懈的努力,最终才会取得成功,正所谓失败是成功之母.要从失败中吸取教训,总结经验,成功之母才会再进一步.
受到启示的作文
一件事给我的启示 在生活中,每天会发生许多事情。
有的像过眼云烟,很快就忘得一干二净。
而有些事情,却会深深的印在脑海里,挥之不去。
一个暑假的早晨,我捧着一本书坐在阳台上。
抬头仰望低沉昏暗的天空,好像是要下大雨了。
再看楼下不远处的一棵大树下,蚂蚁正在忙碌着搬家呢,它们排的可真整齐!母鸡咯咯地叫唤着,似乎在召唤她的孩子们回家。
邻居家的小狗似乎也躁动不安起来,低声地呜呜叫着,像被低压压得喘不过气来。
远处的池塘里冒着一串串泡儿,荷花也垂着头。
路上的行人匆匆忙忙的,还是没躲过这场突如其来的大雨。
我急忙站起来去关窗子,在不经意间,墙角一只蜘蛛闯进了我的视线——它正在结网。
我仔细盯着它“工作”,甚至忘了关窗子的事。
只见蜘蛛来回穿梭,很快就结好了大半张网。
可就在这时,一阵暴风吹来,细细的蛛网无力地飘摇了两下,忽地断裂了。
我不禁伸出手去,真想帮它挽救那辛苦结好的捕食工具,可是在无能为力。
蜘蛛似乎也听了一下,它大概被这突如其来的灾难吓了一跳,恐怕心里还在抱怨这不合时宜的一阵风吧。
看它细小的爪勉强挂在残存的蛛网上,似乎在盘算着下一步该怎么办。
不知道它是不是也动摇过或犹豫过,过了半晌,出乎我的意料,它竟又踏踏实实地重新结起网来了。
好不容易结到一半时,暴风好像和它作对一样,又将它的心血挥之而去。
这下它仿佛没有惊讶也没有犹豫了,甚至不肯休息片刻,继续结着。
就这么努力着,终于结出大半张网了,我想,这次大概足够牢固了,应该可以成功了。
我刚刚微笑着暗自为它高兴时,老天竟像要故意考验它一样,又把网吹破了。
我一下子像泄了气的皮球,仿佛比蜘蛛还灰心,想,唉,可怜的蜘蛛,这下一定要放弃了,这该死的风怎么能如此故意和它作对呢?但让我吃惊的是它竟然像什么都没发生过一样,一如既往地织啊织啊……这次,它终于织成了一张结实的网,我也长出了一口气。
忽然间,我觉得自己应该向蜘蛛学习,做事要持之以恒,坚持到底,就算困难再大也要勇于面对,不要灰心丧气,不要轻言放弃。
我要像蜘蛛一样,对目标有着坚定的信念,只有这样,成功才会最终属于自己。
我相信我也能结一张比那蜘蛛更大,更坚固,更结实的网,网住一个成功的明天!参考资料:呵呵,希望对你有所帮助!...
什么什么受到的启示作文100字
星期天的早晨,天气晴朗,阳光明媚,碧空万里无云,我正在逍遥自在地玩耍。
这时候,妈妈走过来对我说:“这里有一把生绣的菜刀,请你把它磨利。
”我心直口快地答应了。
俗语说:“看事容易做事难。
”我觉得这话一点也不假,刚磨了一会儿刀,双手就累得筋疲力尽,气得我哭笑不得。
我本来想要放弃磨刀,得过且过,顶多被妈妈骂一顿。
可是望着生锈的刀口,它好像在沾沾自喜地嘲笑我:“真弱智,做事半途而废。
” 这时,我的脑海里又清清楚楚地浮现了老师在课堂上讲的磨杵成针地故事。
说得是李白小时候经常贪玩逃学,一次,李白逃学途中看见河边有一个老太太在磨铁杵。
好奇心使他身不由己地上前去,李白问老太太:“您为什么没事找事,磨起铁杵来了,这不是白费力气吗?”老太太语重心长地说:“孩子,我不是没事找事,我正用这根铁杵磨一根绣花针。
”李白听了,不由得哈哈大笑,还对老太太说:“这是不可能的,铁杵那么粗大,绣花针那么细小,要磨到何年何月呢?”老太太一本正经地说:“只要有耐心,坚持不懈,天大的事情也能做到。
所谓冰冻三尺,非一日之寒。
”李白听了,觉得很惭愧,因为他以前做什么事都没有耐心。
些后,他每天都奋发图强,春去秋来,终于成为了唐代着名的诗人。
从小狗得到什么启示的作文
狗是人类最忠诚的朋友,它能帮助我们看家,很安全,但是,狗也有不同种类的狗,也有不同特点的狗,就让我来给你说一说我姥姥家的狗吧!暑假里,我去我姥姥家玩,姥姥家养了一只小狗,他在天热的时候总是不停的伸舌头,这点让我有些迷惑不解。
于是我就查理查资料。
原来,狗是很不耐热的动物.因为狗不会出汗,也不会因为热而停止活动;狗的身体不能自我调节温度,狗也不会自己照顾自己及时补水;狗的汗腺全在舌头上,所以看到狗吐出舌头喘气说明狗很热,需要喝水降温或静下来停止活动;短鼻子的狗比长鼻子狗更怕热,更不容易散热。
因此,我想到了可以发明一种汽车。
因为现在的汽车在停车时总是被太阳晒,晒后再进去会非常非常热。
所以,我们可以采用够用舌头散热的原理,发明一个汽车散热器,这样,就再也不用为汽车内太热而烦恼了。
但要是车内的东西丢了怎么办呢?没有关系,我们可以根据狗的嗅觉灵敏的特征,发明一个细胞存储器,每个放入车内的东西都会被细胞存储器所存储,其实,它就如同汽车的“大脑”,当你丢东西时,给他下达指令,他就会接收到,这时,细胞存储器成千上万的嗅觉细胞便会发挥作用啦!他会靠着灵敏的嗅觉带你去找到丢失的物品。
那么如果在路上汽油没了,又没有加油站怎么办呢?不要担心,我们会根据狗腿骨骼结构,弄一个隐藏的“机器腿”当没有汽油时,汽车轮子便会自己收缩起来,不耗油的“机器腿”便会出来,可以很快的带你到目的地了。
现在的科学越来越发达,在现代化的科技社会中,相信人们会创造出更多的奇迹啊!另一篇小狗是我们常见的动物,它能帮主人管好家,不让小偷近来偷东西,它可是家庭里最忠实的“保安”了。
我想,这个“保安”它会累吗?我希望它该快活的时候就应该像人一样快活自在;但是,该认真的时候,就应该认真。
所以,我想发明一种机器狗,机器狗跟哈巴狗没什么两样,但是,它的功能跟哈巴狗可大有区别啊!请听听我的详细介绍吧!机器狗的头上有一个微型小按钮,只要轻轻按一下那个按钮,机器狗就会二十四个小时为您服务。
当您觉的郁闷时,机器狗还会陪您聊天、玩游戏呢!机器狗会说人话,你叫它说什么,它就说什么;它还会为你解答难题,它可以算是一位“小老师”了。
在遇见陌生人时,它不会乱叫,它只会对你闻一闻。
它的背上有两盏灯:一盏红灯,一盏绿灯。
如果你不是小偷,那盏绿灯就会亮;如果你是小偷,它的那盏红灯就会亮。
你们应该会问:如果小偷是“飞毛腿”怎么办呢?别急,机器狗会出色地完成这项任务的。
你看,机器狗的四只脚都出现了四个“风火轮”,“风火轮”飞起来啊,那可是比风还快啊,三下五除二的就可以把小偷顺利抓起来。
你们看,这就是我想发明的机器狗,它还有好多好多的神奇功能呢,等我长大了,发明出了机器狗,你们肯定会大吃一惊的!
我从什么得到了启发作文600字
我从生活中的启发 生活,宛如情节曲折的故事,永远是精彩的。
可以说我是生活的一位受益者,因为我得到了生活的启示,改变完善了我自己。
记得有一天放学,我像平常一样背着书包独自回家。
当我走出城铁站走到小区门口的时候,看到一群人围在小区门口,我走过去一看,原来,一位老爷爷骑着电动三轮车不小心把一个大约一年级的小孩撞着了,看小孩站在那里的样子也不像受伤了,但却在哭。
可能因为小孩年龄小,没经历过这样的事,吓哭的吧! 这个小孩的家长正在冲那位爷爷嚷嚷: 看你,怎么把我家孩子撞了?! 老爷爷连忙赔礼道: 对不起,对不起。
小孩的家长不依不饶的说: 你这么大岁数了,走路不长眼呀! 老爷爷又说: 对不起,怨我,都怨我。
小孩的家长又接着说: 怨你?你把我孩子撞了,不怨你怨谁?还怨我呀?! 说着,还推了一下老爷爷,差点把老爷爷推倒在地。
看到这里,我就匆匆进了小区的大门。
在路上,我想: 既然那个小孩没受伤,只是身上有些灰尘,人家也道歉了还不如这件事就这样算了。
何必弄得谁都不高兴呢?那个小孩的家长心胸怎么那么狭小呢? 通过这件事,我明白了:一个人的一生中可能会遇到很多不愉快的事,也难免会犯错误,当我们遇到不愉快或犯了错误的时候,我们要心胸宽阔些,以乐观的态度去对待自己对待他人、宽容他人。
只有这样,我们的社会才会变得更美好、更和谐。
我从生活中的启发 在生活中,有许多事给了我启示,让我终身难忘的是这一件事。
有一天,我和妈妈去买菜。
半路上,我突然感到口渴,舌头热得发红,我哀求着对妈妈说: 妈妈,我好渴,你给我买瓶水,行不行? 妈妈给了我五块钱,叫我自己去买。
我跑到商店,是一为老奶奶在柜台,我挑了一瓶三元的可乐,然后把钱给老奶奶,老奶奶本应该找回我两块钱,却找给我三块钱,竟多找了一块钱。
我欢天喜地,心里想:这个老太婆,真是老花眼了,多找了我一块钱都不知道。
我接过钱,飞快跑回妈妈身边,悄悄对妈妈说: 妈妈,我今天真是撞上好运气了,一个老太婆找钱时多找了我一块,哈哈 哈哈 妈妈听了,气怒地批评我:你知道吗?你这种行为是 *** 的,多找了一块就应该还给人家,你这是占别人便宜,没有道得修养,没有素质! 我听了,赶快跑回原处,把钱还给了老婆婆,老婆婆摸摸我的头说: 你真是个好孩子 我的脸却红彤彤的。
我回到妈妈身边,妈妈语重心长地对我说: 浩宇,诚实,是做人之根本,不诚实就等于失去了一切! 我羞愧地点点头。
我一直把这句话当做自己的座右铭,这句话在我的生活中也起了很大的做用。
有一次考试,卷子发下来,我考了一百分,但在讲题的时候,我发现自己一个题没答对,老师却打了钩,我向老师报告了这件事,老师给我扣了两分,并且表扬了我诚恳的态度。
回去妈妈也表扬了我,说我做到了 诚实 。
妈妈的话让我知道了做人的道理,我会把它牢记在我心中,永久不会忘记。
关于在生活得到的启示的作文怎么写?
“宝剑锋从磨砺出,梅花香自苦寒来”,每当我经过楼下,看到墙角那一株盛开的梅花时,便不由自主想到了这句诗,心里充满着深深的敬意。
曾经的我喜欢放弃,总是为自己寻找各种冠冕堂皇的借口,对于自己的惰性视而不见。
那天800米测验,我以身体不适为借口,企图蒙混过关,却被老师逮个正着,不得已站在了起跑线上。
途中我气喘吁吁,呼进的空气像是一把冰刀,钝钝地割在我的心上,生疼。
看着前方渐远的大部队,我再一次放弃,倒在地上再也不肯起来。
老师忍无可忍找来了家长。
爸爸沉默着,没有表情地点点头,带我回家。
经过那一株梅,爸爸突然开口:“你知道么,什么事情都没有借口。
成功,向来只是你想不想的问题。
”我停下脚步,怔怔地盯着爸爸刚才站立的地方,沉思着。
空气像是被冰冻成了固体,连呼吸都是那么困难。
冷风拂过,我吐出一口白雾,脖子往衣服里缩了缩。
又一阵风吹过,竟带来了些许冷香,萦绕在鼻尖,说不出的好闻。
我蓦然回首,却见那株梅凌寒而立。
雨,打不倒她倔强的身影;风,带不走她清雅的芬芳。
我突然感到有些可惜,要是她生长在春天,那该是真正的“百花齐放竞芳华”了。
但转念一想,不,正是因为她生长在万物尽凋的冬季,才历来为人称道。
陶渊明爱菊,挥笔写下“采菊东篱下,悠然见南山”的千古绝句;周敦颐喜莲,是欣赏“出淤泥而不染,濯清涟而不妖”的高洁;而陆游好梅,就应该爱的是“雪虐风饕愈凛然,花中气节最高坚”的坚强与不屈!梅花告诉了我坚强。
在逆境中,她不屈服,不因为天气寒冷而选择放弃。
我站在梅下,渐渐有所领悟。
第二天,我请求老师帮我重新测一次成绩。
还是与先前一样的气喘吁吁,但是一种新的力量流淌在我的血脉中,它促使我前进再前进,在我想放弃的时候给我以勇气与信心。
㈥ sql常用语句,帮我归纳出来,谢谢
SQL语句先前写的时候,很容易把一些特殊的用法忘记,我特此整理了一下SQL语句操作。
一、基础
1、说明:创建数据库
CREATE DATABASE database-name
2、说明:删除数据库
drop database dbname
3、说明:备份sql server
--- 创建 备份数据的 device
USE master
EXEC sp_admpdevice 'disk', 'testBack', 'c:\mssql7backup\MyNwind_1.dat'
--- 开始 备份
BACKUP DATABASE pubs TO testBack
4、说明:创建新表
create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..)
根据已有的表创建新表:
A:create table tab_new like tab_old (使用旧表创建新表)
B:create table tab_new as select col1,col2... from tab_old definition only
5、说明:删除新表
drop table tabname
6、说明:增加一个列
Alter table tabname add column col type
注:列增加后将不能删除。DB2中列加上后数据类型也不能改变,唯一能改变的是增加varchar类型的长度。
7、说明:添加主键: Alter table tabname add primary key(col)
说明:删除主键: Alter table tabname drop primary key(col)
8、说明:创建索引:create [unique] index idxname on tabname(col....)
删除索引:drop index idxname
注:索引是不可更改的,想更改必须删除重新建。
9、说明:创建视图:create view viewname as select statement
删除视图:drop view viewname
10、说明:几个简单的基本的sql语句
选择:select * from table1 where 范围
插入:insert into table1(field1,field2) values(value1,value2)
删除:delete from table1 where 范围
更新:update table1 set field1=value1 where 范围
查找:select * from table1 where field1 like '%value1%' ---like的语法很精妙,查资料!
排序:select * from table1 order by field1,field2 [desc]
总数:select count as totalcount from table1
求和:select sum(field1) as sumvalue from table1
平均:select avg(field1) as avgvalue from table1
最大:select max(field1) as maxvalue from table1
最小:select min(field1) as minvalue from table1
11、说明:几个高级查询运算词
A: UNION 运算符
UNION 运算符通过组合其他两个结果表(例如 TABLE1 和 TABLE2)并消去表中任何重复行而派生出一个结果表。当 ALL 随 UNION 一起使用时(即 UNION ALL),不消除重复行。两种情况下,派生表的每一行不是来自 TABLE1 就是来自 TABLE2。
B: EXCEPT 运算符
EXCEPT 运算符通过包括所有在 TABLE1 中但不在 TABLE2 中的行并消除所有重复行而派生出一个结果表。当 ALL 随 EXCEPT 一起使用时 (EXCEPT ALL),不消除重复行。
C: INTERSECT 运算符
INTERSECT 运算符通过只包括 TABLE1 和 TABLE2 中都有的行并消除所有重复行而派生出一个结果表。当 ALL 随 INTERSECT 一起使用时 (INTERSECT ALL),不消除重复行。
注:使用运算词的几个查询结果行必须是一致的。
12、说明:使用外连接
A、left outer join:
左外连接(左连接):结果集几包括连接表的匹配行,也包括左连接表的所有行。
SQL: select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c
B:right outer join:
右外连接(右连接):结果集既包括连接表的匹配连接行,也包括右连接表的所有行。
C:full outer join:
全外连接:不仅包括符号连接表的匹配行,还包括两个连接表中的所有记录。
二、提升
1、说明:复制表(只复制结构,源表名:a 新表名:b) (Access可用)
法一:select * into b from a where 1<>1
法二:select top 0 * into b from a
2、说明:拷贝表(拷贝数据,源表名:a 目标表名:b) (Access可用)
insert into b(a, b, c) select d,e,f from b;
3、说明:跨数据库之间表的拷贝(具体数据使用绝对路径) (Access可用)
insert into b(a, b, c) select d,e,f from b in '具体数据库' where 条件
例子:..from b in '"&Server.MapPath(".")&"\data.mdb" &"' where..
4、说明:子查询(表名1:a 表名2:b)
select a,b,c from a where a IN (select d from b ) 或者: select a,b,c from a where a IN (1,2,3)
5、说明:显示文章、提交人和最后回复时间
select a.title,a.username,b.adddate from table a,(select max(adddate) adddate from table where table.title=a.title) b
6、说明:外连接查询(表名1:a 表名2:b)
select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c
7、说明:在线视图查询(表名1:a )
select * from (SELECT a,b,c FROM a) T where t.a > 1;
8、说明:between的用法,between限制查询数据范围时包括了边界值,not between不包括
select * from table1 where time between time1 and time2
select a,b,c, from table1 where a not between 数值1 and 数值2
9、说明:in 的使用方法
select * from table1 where a [not] in ('值1','值2','值4','值6')
10、说明:两张关联表,删除主表中已经在副表中没有的信息
delete from table1 where not exists ( select * from table2 where table1.field1=table2.field1 )
11、说明:四表联查问题:
select * from a left inner join b on a.a=b.b right inner join c on a.a=c.c inner join d on a.a=d.d where .....
12、说明:日程安排提前五分钟提醒
SQL: select * from 日程安排 where datediff('minute',f开始时间,getdate())>5
13、说明:一条sql 语句搞定数据库分页
select top 10 b.* from (select top 20 主键字段,排序字段 from 表名 order by 排序字段 desc) a,表名 b where b.主键字段 = a.主键字段 order by a.排序字段
14、说明:前10条记录
select top 10 * form table1 where 范围
15、说明:选择在每一组b值相同的数据中对应的a最大的记录的所有信息(类似这样的用法可以用于论坛每月排行榜,每月热销产品分析,按科目成绩排名,等等.)
select a,b,c from tablename ta where a=(select max(a) from tablename tb where tb.b=ta.b)
16、说明:包括所有在 TableA 中但不在 TableB和TableC 中的行并消除所有重复行而派生出一个结果表
(select a from tableA ) except (select a from tableB) except (select a from tableC)
17、说明:随机取出10条数据
select top 10 * from tablename order by newid()
18、说明:随机选择记录
select newid()
19、说明:删除重复记录
Delete from tablename where id not in (select max(id) from tablename group by col1,col2,...)
20、说明:列出数据库里所有的表名
select name from sysobjects where type='U'
21、说明:列出表里的所有的
select name from syscolumns where id=object_id('TableName')
22、说明:列示type、vender、pcs字段,以type字段排列,case可以方便地实现多重选择,类似select 中的case。
select type,sum(case vender when 'A' then pcs else 0 end),sum(case vender when 'C' then pcs else 0 end),sum(case vender when 'B' then pcs else 0 end) FROM tablename group by type
显示结果:
type vender pcs
电脑 A 1
电脑 A 1
光盘 B 2
光盘 A 2
手机 B 3
手机 C 3
23、说明:初始化表table1
TRUNCATE TABLE table1
24、说明:选择从10到15的记录
select top 5 * from (select top 15 * from table order by id asc) table_别名 order by id desc
三、技巧
1、1=1,1=2的使用,在SQL语句组合时用的较多
"where 1=1" 是表示选择全部 "where 1=2"全部不选,
如:
if @strWhere !=''
begin
set @strSQL = 'select count(*) as Total from [' + @tblName + '] where ' + @strWhere
end
else
begin
set @strSQL = 'select count(*) as Total from [' + @tblName + ']'
end
我们可以直接写成
set @strSQL = 'select count(*) as Total from [' + @tblName + '] where 1=1 安定 '+ @strWhere
2、收缩数据库
--重建索引
DBCC REINDEX
DBCC INDEXDEFRAG
--收缩数据和日志
DBCC SHRINKDB
DBCC SHRINKFILE
3、压缩数据库
dbcc shrinkdatabase(dbname)
4、转移数据库给新用户以已存在用户权限
exec sp_change_users_login 'update_one','newname','oldname'
go
5、检查备份集
RESTORE VERIFYONLY from disk='E:\dvbbs.bak'
6、修复数据库
ALTER DATABASE [dvbbs] SET SINGLE_USER
GO
DBCC CHECKDB('dvbbs',repair_allow_data_loss) WITH TABLOCK
GO
ALTER DATABASE [dvbbs] SET MULTI_USER
GO
7、日志清除
SET NOCOUNT ON
DECLARE @LogicalFileName sysname,
@MaxMinutes INT,
@NewSize INT
USE tablename -- 要操作的数据库名
SELECT @LogicalFileName = 'tablename_log', -- 日志文件名
@MaxMinutes = 10, -- Limit on time allowed to wrap log.
@NewSize = 1 -- 你想设定的日志文件的大小(M)
-- Setup / initialize
DECLARE @OriginalSize int
SELECT @OriginalSize = size
FROM sysfiles
WHERE name = @LogicalFileName
SELECT 'Original Size of ' + db_name() + ' LOG is ' +
CONVERT(VARCHAR(30),@OriginalSize) + ' 8K pages or ' +
CONVERT(VARCHAR(30),(@OriginalSize*8/1024)) + 'MB'
FROM sysfiles
WHERE name = @LogicalFileName
CREATE TABLE DummyTrans
(DummyColumn char (8000) not null)
DECLARE @Counter INT,
@StartTime DATETIME,
@TruncLog VARCHAR(255)
SELECT @StartTime = GETDATE(),
@TruncLog = 'BACKUP LOG ' + db_name() + ' WITH TRUNCATE_ONLY'
DBCC SHRINKFILE (@LogicalFileName, @NewSize)
EXEC (@TruncLog)
-- Wrap the log if necessary.
WHILE @MaxMinutes > DATEDIFF (mi, @StartTime, GETDATE()) -- time has not expired
AND @OriginalSize = (SELECT size FROM sysfiles WHERE name = @LogicalFileName)
AND (@OriginalSize * 8 /1024) > @NewSize
BEGIN -- Outer loop.
SELECT @Counter = 0
WHILE ((@Counter < @OriginalSize / 16) AND (@Counter < 50000))
BEGIN -- update
INSERT DummyTrans VALUES ('Fill Log')
DELETE DummyTrans
SELECT @Counter = @Counter + 1
END
EXEC (@TruncLog)
END
SELECT 'Final Size of ' + db_name() + ' LOG is ' +
CONVERT(VARCHAR(30),size) + ' 8K pages or ' +
CONVERT(VARCHAR(30),(size*8/1024)) + 'MB'
FROM sysfiles
WHERE name = @LogicalFileName
DROP TABLE DummyTrans
SET NOCOUNT OFF
8、说明:更改某个表
exec sp_changeobjectowner 'tablename','dbo'
9、存储更改全部表
CREATE PROCEDURE dbo.User_ChangeObjectOwnerBatch
@OldOwner as NVARCHAR(128),
@NewOwner as NVARCHAR(128)
AS
DECLARE @Name as NVARCHAR(128)
DECLARE @Owner as NVARCHAR(128)
DECLARE @OwnerName as NVARCHAR(128)
DECLARE curObject CURSOR FOR
select 'Name' = name,
'Owner' = user_name(uid)
from sysobjects
where user_name(uid)=@OldOwner
order by name
OPEN curObject
FETCH NEXT FROM curObject INTO @Name, @Owner
WHILE(@@FETCH_STATUS=0)
BEGIN
if @Owner=@OldOwner
begin
set @OwnerName = @OldOwner + '.' + rtrim(@Name)
exec sp_changeobjectowner @OwnerName, @NewOwner
end
-- select @name,@NewOwner,@OldOwner
FETCH NEXT FROM curObject INTO @Name, @Owner
END
close curObject
deallocate curObject
GO
10、SQL SERVER中直接循环写入数据
declare @i int
set @i=1
while @i<30
begin
insert into test (userid) values(@i)
set @i=@i+1
end
小记存储过程中经常用到的本周,本月,本年函数
Dateadd(wk,datediff(wk,0,getdate()),-1)
Dateadd(wk,datediff(wk,0,getdate()),6)
Dateadd(mm,datediff(mm,0,getdate()),0)
Dateadd(ms,-3,dateadd(mm,datediff(m,0,getdate())+1,0))
Dateadd(yy,datediff(yy,0,getdate()),0)
Dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate())+1, 0))
上面的SQL代码只是一个时间段
Dateadd(wk,datediff(wk,0,getdate()),-1)
Dateadd(wk,datediff(wk,0,getdate()),6)
就是表示本周时间段.
下面的SQL的条件部分,就是查询时间段在本周范围内的:
Where Time BETWEEN Dateadd(wk,datediff(wk,0,getdate()),-1) AND Dateadd(wk,datediff(wk,0,getdate()),6)
而在存储过程中
select @begintime = Dateadd(wk,datediff(wk,0,getdate()),-1)
select @endtime = Dateadd(wk,datediff(wk,0,getdate()),6)
㈦ sql 基础知识 语句解释 select fieldname from tablename where pkfield = pkvalue
select fieldname from tablename where pkfield = pkvalue
sql语句可以直接翻译:
选择 fieldname 从tablename 哪里的 pkfield = pkvalue
上面的翻译整理下就是:
从tablename中选择那些pkfield字段的值为pkvlaue的行中的字段fieldname的值。
例如,表t_test有如下结构和数据,其中pkfield为主键:
pkfield fieldname elsefield
1 f1 e1
2 f2 e2
3 f3 e3
4 f4 e4
sql: select fieldname from t_test where pkfield = 2
含义:从t_test中选择那些pkfield字段的值为2的行中的字段fieldname的值。
那么返回结果就是:
fieldname
f2
如果sql为:sql: select fieldname from t_test where pkfield > 2,则返回结果为:
fieldname
f3
f4
从你给的这条sql语句来看,这不是具体的表,而是一个概括性的sql文。因为主键的英文是primary key,从pkfield这个来看,应该是主键域(主键字段),而pkvalue则为主键值。这条sql需要将其中的关键字部分(如tablename、fieldname、pkvalue等)替换后才能应用于其他表。由于主键字段的取值唯一性,这样的sql语句是最多只能得到一条数据。
字段名和列名其实没有区别,甚至可以说是同一种东西,就像表格的表头。比如说如下表结构:
表名:西游记
id 姓名 性别
1 孙悟空 男
2 猪八戒 男
3 唐三藏 女
在上面的表结构中,id、姓名、性别这三个都是字段名,也可以说是列名。自然这是纵向看的,纵向看表,会看到相似的东西,比如id,如果定义的表id为int型,则id列的值都必须是int型数据。那么横向来看,1 孙悟空 男,这组数据成为行,行之间也是有关系的,一行通常对应一个对象,行也称作元组。每个元组的每一个元素,都是该元素所在列的一个取值而已。字段名通常确定后不会变,而值不同,它是数据库表的作用所在,一定会伴随数据值的增删改等操作,所以字段或者说是列,在表中的数目是有限的,是固定的,数据值或者是行,是不确定的,是随时可以增删改的。
至于fieldname和pkvalue,只是一种假设性的代名词,比如上面的表结构有如下sql:
select 姓名 from 西游记 where id = 2
就是将你所提供的sql:
select fieldname from tablename where pkfield = pkvalue
中的某些关键字替换后的结果,其中:
fieldname(字段域)被姓名代替,即这条sql文选择的是姓名这一列的值;
tablename(表名)被西游记代替,即数据来源是表西游记;
pkfield(主键域)被id代替,即选择条件是id;
pkvalue(主键值)被2代替,即选择条件的值为2的数据;
另外,pkfield可以不是主键,可以是任何列名,条件和条件的值之间也不必是=,可以是<>(不等于),<小于,>大于等等运算符。