




已阅读5页,还剩22页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
ALTER TABLEsql-statement :=ALTER TABLE database-name . table-name alterationalteration :=RENAME TO new-table-namealteration :=ADD COLUMN column-defSQLite版本的的ALTER TABLE命令允许用户重命名或添加新的字段到已有表中,不能从表中删除字段。 RENAME TO语法用于重命名表名 database-name.table-name到new-table-name。这一命令不能用于在附加数据库之间移动表,只能在同一个数据库中对表进行重命名。若需要重命名的表有触发器或索引,在重命名后它们依然属于该表。但若定义了视图,或触发器执行的语句中有提到 表的名字,则它们不会被自动改为使用新的表名。若要进行这一类的修改,则需手工撤销并使用新的表名重建触发器或视图。ADD COLUMN语法用于在已有表中添加新的字段。新字段总是添加到已有字段列表的末尾。 Column-def可以是CREATE TABLE中允许出现的任何形式,且须符合如下限制: 字段不能有主键或唯一约束。 字段不能有这些缺省值:CURRENT_TIME, CURRENT_DATE 或CURRENT_TIMESTAMP 若定义了NOT NULL约束,则字段必须有一个非空的缺省值。 ALTER TABLE语句的执行时间与表中的数据量无关,它在操作一个有一千万行的表时的运行时间与操作仅有一行的表时是一样的。 在对数据库运行ADD COLUMN之后,该数据库将无法由SQLite 3.1.3及更早版本读取,除非运行VACUUM命令。ANALYZEsql-statement :=ANALYZEsql-statement :=ANALYZE database-namesql-statement :=ANALYZE database-name . table-nameANALYZE命令令集合关于索引的统计信息并将它们储存在数据库的一个特殊表中,查询优化器可以用该表来制作更好的索引选择。 若不给出参数,所有附加数据库中的所有索引被分析。若参数给出数据库名,该数据库中的所有索引被分析。若给出表名 作参数,则只有关联该表的索引被分析。最初的实现将所有的统计信息储存在一个名叫sqlite_stat1的表中。未来的加强版本中可能会创建名字类似的其它表, 只是把1改为其它数字。sqlite_stat1表不能够被撤销,但其中的所有内容可以被删除,这是与撤销该表等效的行为。ATTACH DATABASEATTACH DATABASE语句将一个已存在的数据库添加到当前数据库连接。若文件名含标点符号,则应用引号引起来。 数据库名main和temp代表主数据库和用于存放临时表的数据库,它们不能被拆分。拆分数据库使用 DETACH DATABASE语句。你可以读写附加数据库,或改变其结构。这是SQLite3.0提供的新特性。在SQLite 2.8中,改变附加数据库的结构是不允许的。在附加数据库中添加一个与已有表同名的表是不允许的。但你可以附加带有与主数据库中的表同名的表的数据库。也可以多次附加同一数据库。使用database-name.table-name来引用附加数据库中的表。若附加数据库中的表与主数据库的表不重名,则不需加数据库名作为前缀。当数据库被附加时,它的所有不重名的表成为该名字指向的缺省表。之后附加的任意与之同名的表需要加前缀。若“缺省”表被拆分, 则最后附加的同名表变为“缺省”表。若主数据库不是:memory:,多附加数据库的事务是原子的。若主数据库是:memory:则事务在每个独立文件中依然是原子的。 但若主机在改变两个或更多数据库的COMMIT语句进行时崩溃,则可能一部分文件被改变而其他的保持原样。附加数据库的原子性的提交 是SQLite 3.0的新特性。在SQLite 2.8中,所有附加数据库的提交类似于主数据库是:memory:时的情况。对附加数据库的数目有编译时的限制,最多10个附加数据库。BEGIN TRANSACTIONsql-statement :=BEGIN DEFERRED | IMMEDIATE | EXCLUSIVE TRANSACTION namesql-statement :=END TRANSACTION namesql-statement :=COMMIT TRANSACTION namesql-statement :=ROLLBACK TRANSACTION name从2.0版开始,SQLite支持带有回退和原子性的提交的事务处理。可选的事务名称会被忽略。SQLite目前不允许嵌套事务。在事务之外,不能对数据库进行更改。如果当前没有有效的事务,任何修改数据库的命令(基本上除了SELECT以外的所有SQL命令)会自动启动一个事务。命令结束时,自动启动的事务会被提交。 可以使用BEGIN命令手动启动事务。这样启动的事务会在下一条COMMIT或ROLLBACK命令之前一直有效。但若数据库关闭 或出现错误且选用ROLLBACK冲突判定算法时,数据库也会ROLLBACK。查看ON CONFLICT子句 获取更多关于ROLLBACK冲突判定算法的信息。 在SQLite 3.0.8或更高版本中,事务可以是延迟的,即时的或者独占的。“延迟的”即是说在数据库第一次被访问之前不获得锁。 这样就会延迟事务,BEGIN语句本身不做任何事情。直到初次读取或访问数据库时才获取锁。对数据库的初次读取创建一个SHARED锁 ,初次写入创建一个RESERVED锁。由于锁的获取被延迟到第一次需要时,别的线程或进程可以在当前线程执行BEGIN语句之后创建另外的事务 写入数据库。若事务是即时的,则执行BEGIN命令后立即获取RESERVED锁,而不等数据库被使用。在执行BEGIN IMMEDIATE之后, 你可以确保其它的线程或进程不能写入数据库或执行BEGIN IMMEDIATE或BEGIN EXCLUSIVE. 但其它进程可以读取数据库。 独占事务在所有的数据库获取EXCLUSIVE锁,在执行BEGIN EXCLUSIVE之后,你可以确保在当前事务结束前没有任何其它线程或进程 能够读写数据库。有关SHARED, RESERVED, 和EXCLUSIVE锁可以参见这里。SQLite 3.0.8的默认行为是创建延迟事务。SQLite 3.0.0 到3.0.7中延迟事务是唯一可用的事务类型。SQLite 2.8或更早版本中,所有的事务 都是独占的。 COMMIT命令在所有SQL命令完成之前并不作实际的提交工作。这样若两个或更多个SELECT语句在进程中间而执行COMMIT时,只有全部SELECT 语句结束才进行提交。执行COMMIT可能会返回SQLITE_BUSY错误代码。这就是说有另外一个线程或进程获取了数据库的读取锁,并阻止数据库被改变。当COMMIT获得该错误代码时,事务依然是活动的,并且在COMMIT可以在当前读取的线程读取结束后再次试图读取数据库。END TRANSACTIONsql-statement :=BEGIN DEFERRED | IMMEDIATE | EXCLUSIVE TRANSACTION namesql-statement :=END TRANSACTION namesql-statement :=COMMIT TRANSACTION namesql-statement :=ROLLBACK TRANSACTION name从2.0版开始,SQLite支持带有回退和原子性的提交的事务处理。可选的事务名称会被忽略。SQLite目前不允许嵌套事务。在事务之外,不能对数据库进行更改。如果当前没有有效的事务,任何修改数据库的命令(基本上除了SELECT以外的所有SQL命令)会自动启动一个事务。命令结束时,自动启动的事务会被提交。 可以使用BEGIN命令手动启动事务。这样启动的事务会在下一条COMMIT或ROLLBACK命令之前一直有效。但若数据库关闭或出现错误且选用ROLLBACK冲突判定算法时,数据库也会ROLLBACK。查看ON CONFLICT子句获取更多关于ROLLBACK冲突判定算法的信息。 在SQLite 3.0.8或更高版本中,事务可以是延迟的,即时的或者独占的。“延迟的”即是说在数据库第一次被访问之前不获得锁。这样就会延迟事务,BEGIN语句本身不做任何事情。直到初次读取或访问数据库时才获取锁。对数据库的初次读取创建一个SHARED锁,初次写入创建一个RESERVED锁。由于锁的获取被延迟到第一次需要时,别的线程或进程可以在当前线程执行BEGIN语句之后创建另外的事务写入数据库。若事务是即时的,则执行BEGIN命令后立即获取RESERVED锁,而不等数据库被使用。在执行BEGIN IMMEDIATE之后,你可以确保其它的线程或进程不能写入数据库或执行BEGIN IMMEDIATE或BEGIN EXCLUSIVE. 但其它进程可以读取数据库。独占事务在所有的数据库获取EXCLUSIVE锁,在执行BEGIN EXCLUSIVE之后,你可以确保在当前事务结束前没有任何其它线程或进程能够读写数据库。有关SHARED, RESERVED, 和EXCLUSIVE锁可以参见这里。 SQLite 3.0.8的默认行为是创建延迟事务。SQLite 3.0.0 到3.0.7中延迟事务是唯一可用的事务类型。SQLite 2.8或更早版本中,所有的事务都是独占的。 COMMIT命令在所有SQL命令完成之前并不作实际的提交工作。这样若两个或更多个SELECT语句在进程中间而执行COMMIT时,只有全部SELECT 语句结束才进行提交。执行COMMIT可能会返回SQLITE_BUSY错误代码。这就是说有另外一个线程或进程获取了数据库的读取锁,并阻止数据库被改变。当COMMIT获得该错误代码时,事务依然是活动的,并且在COMMIT可以在当前读取的线程读取结束后再次试图读取数据库。 注释comment :=SQL-comment | C-commentSQL-comment :=- single-lineC-comment :=/* multiple-lines */注释不是SQL命令,但会出现在SQL查询中。它们被解释器处理为空白部分。它们可以在任何空白可能存在的地方开始 ,即使是在跨越多行的表达式中。SQL风格的注释仅对当前行有效。C风格的注释可以跨越多行。若没有结束符号,注释的范围将一直延伸到输入末尾,且不会引起报错。 新的SQL语句可以从多行注释结束的地方开始。C风格注释可以嵌入任何空白可以出现的地方,包括表达式内,或其他SQL语句中间, 并且C风格的注释不互相嵌套。SQL风格的注释出现在C风格注释中时将被忽略。 COPYsql-statement :=COPY OR conflict-algorithm database-name . table-name FROM filename USING DELIMITERS delim COPY命令在SQLite 2.8及更早的版本中可用。SQLite 3.0 删除了这一命令,因为在混合的UTF-8/16环境中对它进行支持是很复杂的。 在3.0版本中,命令行解释器包含新的.import命令,用以替代COPY。 COPY命令是用于将大量数据插入表的一个插件。它模仿PostgreSQL中的相同命令而来。事实上,SQLite的COPY 命令就是为了能够读取PostgreSQL的备份工具pg_dump的输出从而能够将PostgreSQL的数据轻松转换到SQLite中而设计的。table-name是将要导入数据的一个已存在的表的名字。filename是一个字符串或标识符,用于说明作为数据来源的文件。 filename可以使用STDIN从标准输入流中获取数据。输入文件的每一行被转换成一条单独的记录导入表中。字段用制表符分开。若某个字段的数据中出现制表符, 则前面被添加反斜线符号。数据中的反斜线则被替换为两条反斜线。可选的USING DELIMITERS子句可给出一个与制表符不同 的分界符。若字段由N组成,则被赋以空值NULL.使用这一命令时,利用可选的ON CONFLICT子句可以定义替代的约束冲突判定算法。更多信息,参见 ON CONFLICT。当输入数据源是STDIN,输入将终止于一行仅包含一个反斜线和一个点的输入: .CREATE INDEXsql-statement :=CREATE UNIQUE INDEX IF NOT EXISTS database-name . index-name ON table-name ( column-name , column-name* )column-name :=name COLLATE collation-name ASC | DESC CREATE INDEX命令由CREATE INDEX关键字后跟新索引的名字,关键字ON,待索引表的名字,以及括弧内的用于索引键的字段列表构成。每个字段名可以跟随ASC或DESC关键字说明排序法则,但在当前版本中排序法则被忽略。排序总是按照上升序。每个字段名后跟COLLATE子句定义文本记录的比较顺序。缺省的比较顺序是由CREATE TABLE语句说明的比较顺序。 若不定义比较顺序,则使用内建的二进制比较顺序。附加到单个表上的索引数目没有限制,索引中的字段数也没有限制。若UNIQUE关键字出现在CREATE和INDEX之间,则不允许重名的索引记录。试图插入重名记录将会导致错误。每条CREATE INDEX语句的文本储存于sqlite_master或sqlite_temp_master表中,取决于被索引的表是否临时表。 每次打开数据库时,所有的CREATE INDEX语句从sqlite_master表中读出,产生SQLite的索引样式的内部结构。若使用可选的IF NOT EXISTS子句,且存在同名索引,则该命令无效。使用DROP INDEX命令删除索引。CREATE TABLEsql-command :=CREATE TEMP | TEMPORARY TABLE IF NOT EXISTS table-name (column-def , column-def*, constraint*)sql-command :=CREATE TEMP | TEMPORARY TABLE database-name. table-name AS select-statementcolumn-def :=name type CONSTRAINT name column-constraint*type :=typename |typename ( number ) |typename ( number , number )column-constraint :=NOT NULL conflict-clause |PRIMARY KEY sort-order conflict-clause AUTOINCREMENT |UNIQUE conflict-clause |CHECK ( expr ) |DEFAULT value |COLLATE collation-nameconstraint :=PRIMARY KEY ( column-list ) conflict-clause |UNIQUE ( column-list ) conflict-clause |CHECK ( expr )conflict-clause :=ON CONFLICT conflict-algorithmCREATE TABLE语句基本上就是CREATE TABLE关键字后跟一个新的表名以及括号内的一堆 定义和约束。 表名可以是字符串或者标识符。以sqlite_开头的表名是留给数据库引擎使用的。 每个字段的定义是字段名后跟字段的数据类型,接着是一个或多个的字段约束。字段的 数据类型并不限制 字段中可以存放的数据。可以查看SQLite3的数据类型获取 更多信息。 UNIQUE约束为指定的字段创建索引,该索引须含有唯一键。COLLATE子句说明在比较字段的 文字记录时所使用的排序函数。缺省使用内嵌的BINARY排序函数。 DEFAULT约束说明在使用INSERT插入字段时所使用的缺省值。 该值可以是NULL,字符串常量或一个数。从3.1.0版开始,缺省值也可以是以下特殊的与事件无关的关键字CURRENT_TIME, CURRENT_DATE或CURRENT_TIMESTAMP.若缺省值为NULL,字符串常量或数,在执行未指明字段值的INSERT语句的时候它被插入字段。 若缺省值是CURRENT_TIME, CURRENT_DATE或CURRENT_TIMESTAMP,则当前UTC日期和/或时间被插入字段。CURRENT_TIME的 格式为HH:MM:SS,CURRENT_DATE为YYYY-MM-DD,而CURRENT_TIMESTAMP是YYYY-MM-DD HH:MM:SS. 正常情况下定义PRIMARY KEY只是在相应字段上创建一个UNIQUE索引。然而,若主键定义在单一的INTEGER类型的字段上, 则该字段在内部被用作表的B-Tree键。这即是说字段仅能容纳唯一整数值。(在除此之外的其它情况下,SQLite忽略数据类型的说明 ,允许任何类型的数据放入字段中,不管该字段被声明为什么数据类型。) 若一个表中不含一个INTEGER PRIMARY KEY字段,则B-Tree键 为自动产生的整数。一行的B-Tree键可以通过如下特殊的名字ROWID, OID, 或 _ROWID_进行访问,不论是否有INTEGER PRIMARY KEY存在。INTEGER PRIMARY KEY字段可以使用关键字AUTOINCREMENT声明。AUTOINCREMENT关键字修改了B-Tree键自动产生的方式。B-Tree键的生成的其它信息可以在这里找到。若TEMP或TEMPORARY关键字出现在CREATE和TABLE之间,则所建立的表仅在当前数据库连接可见,并在断开连接时自动被删除。在临时表上建立的任何索引也是临时的。临时表和索引单独存储在与主数据库文件不同的文件中。若说明了,则表在该数据库中被创建。同时声明和TEMP关键字会出错,除非 是temp.若不声明数据库名,也不使用TEMP关键字,则表创建于主数据库中。在每个约束后跟可选的ON CONFLICT子句可以定义替代的约束冲突判定算法。 缺省为ABORT。同一个表中的不同约束可以使用不同的缺省冲突判定算法。若一条COPY, INSERT, 或 UPDATE 命令指定了不同的冲突判定算法,则该算法将替代CREATE TABLE语句中说明的缺省算法。 更多信息,参见ON CONFLICT.3.3.0版支持CHECK约束。在3.3.0之前,CHECK约束被解析但不执行。表中的字段数或约束数没有任何限制。在2.8版中,单行数据的总数被限制为小于1 megabytes。而在3.0中则消除了限制。CREATE TABLE AS形式定义表为一个查询的结果集。表的字段名字即是结果中的字段名字。每条CREATE TABLE语句的文本都储存在sqlite_master表中。每当数据库被打开,所有的CREATE TABLE语句从 sqlite_master表中读出,构成表结构的SQLite内部实现。若原始命令为CREATE TABLE AS则合成出等效的 CREATE TABLE语句并储存于sqlite_master表中代替原命令。CREATE TEMPORARY TABLE语句文本储存于 sqlite_temp_master表中。 若在命令中使用可选的IF NOT EXISTS子句且存在同名的另一个表,则当前的命令无效。删除表可以使用DROP TABLE语句。CREATE TRIGGERsql-statement :=CREATE TEMP | TEMPORARY TRIGGER trigger-name BEFORE | AFTER database-event ON database-name . table-nametrigger-actionsql-statement :=CREATE TEMP | TEMPORARY TRIGGER trigger-name INSTEAD OFdatabase-event ON database-name . view-nametrigger-actiondatabase-event :=DELETE | INSERT | UPDATE | UPDATE OF column-listtrigger-action := FOR EACH ROW | FOR EACH STATEMENT WHEN expression BEGIN trigger-step ; trigger-step ; *ENDtrigger-step :=update-statement | insert-statement | delete-statement | select-statementCREATE TRIGGER语句用于向数据库schema中添加触发器。触发器是一些在特定的数据库事件(database-event) 发生时自动进行的数据库操作(trigger-action). 触发器可由在特殊表上执行的DELETE, INSERT, UPDATE等语句触发,或UPDATE表中特定的字段时触发。现在SQLite仅支持FOR EACH ROW触发器,不支持FOR EACH STATEMENT触发。因此可以不用明确说明FOR EACH ROW .FOR EACH ROW的意思是由trigger-steps说明的SQL语句可能在(由WHEN子句决定的)数据库插入,更改或删除的每一行触发trigger.WHEN子句和trigger-steps可以使用NEW.column-name和OLD.column-name的引用形式访问正在被插入,更改或 删除的行的元素,column-name是触发器关联的表中的字段名。OLD 和 NEW 引用只在触发器与之相关的trigger-event处可用,例如:INSERTNEW可用UPDATENEW和OLD均可用DELETEOLD可用当使用WHEN子句,trigger-steps只在WHEN子句为真的行执行。不使用WHEN时则在所有行执行。trigger-time决定了trigger-steps执行的时间,它是相对于关联行的插入,删除和修改而言的。作为的一部分trigger-step的UPDATE 或 INSERT可以使用ON CONFLICT子句。 但若触发trigger的语句使用了ON CONFLICT子句,则覆盖前述的ON CONFLICT子句所定义的冲突处理方法。关联表被撤销时触发器被自动删除。不仅在表上,在视图上一样可以创建触发器,在CREATE TRIGGER语句中使用INSTEAD OF即可。 若视图上定义了一个或多个ON INSERT, ON DELETE, ON UPDATE触发器,则相应地对视图执行INSERT,DELETE 或UPDATE语句 不会出错,而会触发关联的触发器。视图关联的表不会被修改。(除了由触发器进行的修改操作)。Example:假设customers表存储了客户信息,orders表存储了订单信息,下面的触发器确保当用户改变地址时所有的 关联订单地址均进行相应改变: CREATE TRIGGER update_customer_address UPDATE OF address ON customers BEGIN UPDATE orders SET address = new.address WHERE customer_name = ; END; 定义了该触发器后执行如下语句: UPDATE customers SET address = 1 Main St. WHERE name = Jack Jones; 会使下面的语句自动执行: UPDATE orders SET address = 1 Main St. WHERE customer_name = Jack Jones; 注意,目前在有INTEGER PRIMARY KEY域的表上触发器可能工作不正常。若BEFORE触发器修改了一行的 INTEGER PRIMARY KEY域,而该域将由触发该触发器的语句进行修改,则可能根本不会修改该域。 可以用PRIMARY KEY字段代替INTEGER PRIMARY KEY字段来解决上述问题。一个特殊的SQL函数RAISE()可用于触发器程序,使用如下语法:raise-function :=RAISE ( ABORT, error-message ) | RAISE ( FAIL, error-message ) | RAISE ( ROLLBACK, error-message ) | RAISE ( IGNORE )当触发器程序执行中调用了上述前三个之一的形式时,则执行指定的ON CONFLICT进程(ABORT, FAIL或者ROLLBACK) 且终止当前查询,返回一个SQLITE_CONSTRAINT错误并说明错误信息。当调用RAISE(IGNORE),当前触发器程序的余下部分,触发该触发器的语句和任何之后的触发器程序被忽略并且 不恢复对数据库的已有改变。 若触发触发器的语句是一个触发器程序本身的一部分,则原触发器程序从下一步起继续执行。 使用DROP TRIGGER删除触发器。CREATE VIEWsql-command :=CREATE TEMP | TEMPORARY VIEW database-name. view-name AS select-statementCREATE VIEW命令为一个包装好的SELECT语句命名。当创建了一个视图,它可以用于其他SELECT的FROM字句中代替表名。 若TEMP或TEMPORARY关键字出现在CREATE和VIEW之间,则创建的视图仅对打开数据库的进程可见,且在数据库关闭时自动删除。若指定了则视图在指定的数据库中创建。同时使用和TEMP关键字会导致错误,除非是 temp.若不声明数据库名,也不使用TEMP关键字,则视图创建于主数据库中。你不能对视图使用COPY, DELETE, INSERT 或 UPDATE,视图在SQLite中是只读的。多数情况下你可以在视图上创建TRIGGER来达到相同目的。用DROP VIEW 命令来删除视图。DELETEsql-statement :=DELETE FROM database-name . table-name WHERE exprDELETE命令用于从表中删除记录。命令包含DELETE FROM关键字以及需要删除的记录所在的表名。 若不使用WHERE子句,表中的所有行将全部被删除。否则仅删除符合条件的行。DETACH DATABASEsql-command :=DETACH DATABASE database-name该语句拆分一个之前使用ATTACH DATABASE语句附加的数据库连接。可以使用不同的名字多次附加同一数据库,并且拆分一个连接不会影响其他连接。若SQLite在事务进行中,该语句不起作用。DROP INDEXsql-command :=DROP INDEX IF EXISTS database-name . index-nameDROP INDEX语句删除由CREATE INDEX 语句创建的索引。索引将从数据库结构和磁盘文件中完全删除,唯一的恢复方法是重新输入相应的CREATE INDEX命令。DROP TABLE语句在缺省模式下不减小数据库文件的大小。空间会留给后来的INSERT语句使用。要释放删除产生的空间,可以使用VACUUM命令。若AUTOVACUUM模式开启,则空间会自动被DROP INDEX释放。DROP TABLEsql-command :=DROP TABLE IF EXISTS database-name. table-nameDROP TABLE语句删除由 CREATE TABLE语句创建的表。表将从数据库结构和磁盘文件中完全删除,且不能恢复。该表的所有索引也同时被删除。DROP TABLE语句在缺省模式下不减小数据库文件的大小。空间会留给后来的INSERT语句使用。要释放删除产生的空间,可以使用 VACUUM 命令。若AUTOVACUUM模式开启,则空间会自动被DROP TABLE释放。若使用可选的IF EXISTS子句,在删除的表不存在时就不会报错。DROP TRIGGERsql-statement :=DROP TRIGGER database-name . trigger-nameDROP TRIGGER语句删除由 CREATE TRIGGER创建的触发器。触发器从数据库的schema中删除。注意当关联的表被撤消时触发器自动被删除。DROP VIEWsql-command :=DROP VIEW view-nameDROP VIEW语句删除由CREATE VIEW 创建的视图。视图从数据库的schema中删除,表中的数据不会被更改。EXPLAINsql-statement :=EXPLAIN sql-statementEXPLAIN命令修饰语是一个非标准的扩展功能,灵感来自PostgreSQL中的相同命令,但操作完全不同。若EXPLAIN关键字出现在任何SQLite SQL命令之前,则SQLite库返回不加EXPLAIN时执行该命令所需要使用的虚拟机指令序列,而不是真正执行该命令。关于虚拟机指令的更多信息参见系统结构描述或关于虚拟机的可用代码。表达式expr :=expr binary-op expr |expr NOT like-op expr ESCAPE expr |unary-op expr |( expr ) |column-name |table-name . column-name |database-name . table-name . column-name |literal-value |parameter |function-name ( expr-list | * ) |expr ISNULL |expr NOTNULL |expr NOT BETWEEN expr AND expr |expr NOT IN ( value-list ) |expr NOT IN ( select-statement ) |expr NOT IN database-name . table-name |EXISTS ( select-statement ) |CASE expr ( WHEN expr THEN expr )+ ELSE expr END |CAST ( expr AS type )like-op :=LIKE | GLOB | REGEXP这一节与其它的各节有所不同。我们讨论的不是一个单一的SQL命令,而是作为其他大部分命令的一部分的表达式。SQLite支持如下的二元运算符,按优先级由高至低排列:|* / %+ - & | = = != INAND OR所支持的一元运算符:- + ! 注意等号和“不等”号的两个变种。等号可以是 =或=. “不等”号可以是!=或. |为“连接符”它将两个字符串连接起来。 %输出左边部分以右边部分为模取模得到的余数。二元运算符的结果均为数字,除了|连接符,它给出字符串结果。文本值(literal value)是一个整数或浮点数。可以使用科学计数法。.符号总是被当作小数点即使本地设定中用,来表示小数点 用,表示小数点会造成歧义。字符串常量由字符串加单引号()构成。字符串内部的单引号可像Pascal 中一样用两个单引号来表示。C风格的加反斜线的表示法由于不是标准SQL而不被支持。 BLOB文本是以x或X开头的含有十六进制文本信息的文本值 For example:X53514697465文本值同样可以为NULL. 表达式中插入文本值占位符的参数可以使用 sqlite3_bind API函数在运行时插入。参数可以是如下几种形式: ?NNN问号跟随数字NNN为第NNN个参数占位。NNN需介于1和999之间。?不加数字的问号为下一个参数占位。:AAAA冒号带一个标识符名称为一个名为AAAA的参数占位。命名的参数同样可以使用序号占位,被赋予的参数序号为下一个尚未被使用的序号。建议不要混合使用命名代表的参数和序号代表的参数以免引起混淆。$AAAA$符号带一个标识符名称也可以为一个名为AAAA的参数占位。在这一情况下标识符名称可以包括一个或更多的: 以及包含任何文本的(.)后缀。该语法是Tcl编程语言中的一个可变形式。不使用sqlite3_bind赋值的参数被视为NULL.LIKE运算符进行模式匹配比较。运算符右边为进行匹配的模式而左边为需进行匹配的字符串。 模式中的百分号%匹配结果中的零或任意多个字符。下划线 _匹配任意单个字符。其他的任意字符匹配本身或等同的大/小写字符。 (即不区分大小写的匹配)。 (一个bug: SQLite仅对7-bit拉丁字符支持不区分大小写匹配。这是由于 LIKE运算符对8-bit iso8859字符或UTF-8字符是大小写敏感的。例如,表达式a LIKE A 的值为真而 LIKE 为假)。如果使用可选的ESCAPE子句,则跟随ESCAPE关键字的必须是一个有一个字符的字符串。这一字符(逃逸字符)可用于LIKE模式中,以代替百分号或下划线。逃逸字符后跟百分号,下划线或它本身代表字符串中的百分号,下划线或逃逸字符。插入的LIKE运算符功能通过调用用户函数 like(X,Y)来实现。当使用可选的ESCAPE子句,它对函数给出第三个参数,LIKE的功能可以通过重载SQL函数like()进行改变。 GLOB运算符与LIKE相似,但它使用Unix文件 globbing 语法作为通配符。还有一点不同是GLOB对大小写敏感。 GLOB和LIKE都可以前缀NOT关键字构成相反的意思。插入的GLOB运算符功能通过调用用户函数 glob(X,Y) 可以通过重载函数改变GLOB的功能。REGEXP运算符是用户函数regexp()的一个特殊的代表符号。缺省情况下regexp()函数不被定义,所以使用REGEXP运算符会报错。当运行时存在用户定义的regexp函数的定义,则调用该函数以实现REGEXP运算符功能。字段名可以是CREATE TABLE语句定义的任何名字或如下几个特殊标识符之一ROWID, OID, 以及_ROWID_.这些特殊标识符均代表每个表每一行关联的那个唯一随机整数键(row key)。仅仅在CREATE TABLE语句没有对这些特殊标识符的真实字段予以定义的情况下,它们才代表row key。它们与只读字段类似,可以像任何正常字段一样使用,除了在UPDATE或INSERT语句中(即是说你不能添加或更改row key)。 SELECT * .不返回row key.SELECT语句可以在表达式中出现,作为IN运算符的右边运算量,作为一个纯量,或作为EXISTS运算符的运算量。当作纯量或IN的运算量时,SELECT语句的结果仅允许有一个字段,可以使用复合的SELECT(用UNION或 EXCEPT等关键字连接)。作为EXISTS运算符的运算量时,SELECT结果中的字段被忽略,在结果为空时表达式为假,反之为真。若SELECT表达式代表的查询中不含有引用值的部分,则它将在处理其它事务之前被计算,并且结果在必要时会被重复使用。若SELECT表达式含从其它查询中得到的变量,在每一次使用时该表达式均被重新计算。当SELECT作为IN运算符的右运算量,在左边的运算量是SELECT产生的任意一个值时,表达式返回TRUE。IN运算符前可以加NOT 构成相反的意思。当SELECT与表达式一同出现且不在IN的右边,则SELECT结果的第一行作为表达式中使用的值。SELECT返回的结果在第一行以后的部分被忽略。返回结果为空时SELECT语句的值为NULL.CAST表达式将的数据类型改为声明的类型。 可以是CREATE TABLE语句字段定义部分定义的对该字段有效的任意非空数据类型。表达式支持简单函数和聚集函数。简单函数直接从输入获得结果,可用于任何表达式中。聚集函数使用结果集中的所有行计算结果,仅用于SELECT语句中。T下面这些函数是缺省可用的。可以使用C语言写出其它的函数然后使用sqlite3_create_function() API函数添加到数据库引擎中。abs(X)返回参数X的绝对值。coalesce(X,Y,.)返回第一个非空参数的副本。若所有的参数均为NULL,返回NULL。至少2个参数。glob(X,Y)用于实现SQLite的 X GLOB Y语法。可使用 sqlite3_create_function() 重载该函数从而改变GLOB运算符的功能。ifnull(X,Y)返回第一个非空参数的副本。 若两个参数均为NULL,返回NULL。与上面的 coalesce()类似。last_insert_rowid()返回当前数据库连接最后插入行的ROWID。sqlite_last_insert_rowid() API函数同样可用于得到该值。length(X)返回X的长度,以字符计。如果SQLite被配置为支持UTF-8,则返回UTF-8字符数而不是字节数。like(X,Y ,Z)用于实现SQL语法X LIKE Y ESCAPE Z.若使用可选的ESCAPE子句,则函数被赋予三个参数,否则只有两个。可使用sqlite3_create_function() 重载该函数从而改变LIKE运算符的功能。lower(X)返回X字符串的所有字符小写化版本。这一转换使用C语言库的tolower()函数,对UTF-8字符不能提供好的支持。max(X,Y,.)返回最大值。参数可以不仅仅为数字,可以为字符串。大小顺序由常用的排序法则决定。注意,max()在有2个或更多参数时为简单函数,但当仅给出一个参数时它变为聚集函数。min(X,Y,.)返回最小值。与max()类似。nullif(X,Y)当两参数不同时返回X,否则返回NULL.quote(X)返回参数的适于插入其它SQL语句中的值。字符串会被添加单引号,在内部的引号前会加入逃逸符号。 BLOB被编码为十六进制文本。当前的VACUUM使用这一函数实现。在使用触发器实现撤销/重做功能时这一函数也很有用。 random(*)返回介于-2147483648和 +2147483647之间的随机整数。round(X)round(X,Y)将X四舍五入,保留小数点后Y位。若忽略Y参数,则默认其为0。soundex(X)计算字符串X的soundex编码。参数为NULL时返回字符串?000.缺省的SQLite是不支持该函数的,当编译时选项 -DSQLITE_SOUNDEX=1 时该函数才可用。sqlite_version(*)返回所运行的SQLite库的版本号字符串。如 2.8.0。substr(X,Y,Z)返回输入字符串X中以第Y个字符开始,Z个字符长的子串。 X最左端的字符序号为1。若Y为负,则从右至左数起。若SQLite配置支持UTF-8,则“字符”代表的是UTF-8字符而非字节。typeof(X)返回表达式X的类型。返回值可能为null, integer, real, text, 以及 blob. SQLite的类型处理参见SQLite3的数据类型.upper(X)返回X字符串的所有字符大写化版本。这一转换使用C语言库的toupper()函数,对UTF-8字符不能提供好的支持。以下是缺省可用的聚集函数列表。可以使用C语言写出其它的聚集函数然后使用sqlite3_create_function() API函数添加到数据库引擎中。在单参数聚集函数中,参数可以加前缀DISTINCT。这时重复参数会被过滤掉,然后才穿入到函数中。例如,函数count(distinct X)返回字段X的
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 老年人的居家护理
- 神经纤维瘤病病例汇报
- 公司法课件小结
- 辐射监测系统规程解读
- 科研调研工作汇报
- 2025重型设备购买协议书
- 广东省阳江市江城区2022-2023学年高三下学期高考第三次模拟考试语文试卷及答案
- 《琵琶行并序》课件
- 房屋租赁合同印花税5篇
- 知识题库-驾校岗位知识竞赛试题及答案
- 2025年电梯检验员资格考试历年真题及答案试题试卷(含解析)
- 眼整形课件教学课件
- 公司法务知识培训会课件
- 2025年药企QA人员岗位职责培训考核试题及答案
- 浙教版2025-2026学年八年级上科学第1章 对环境的察觉 单元测试卷
- 纤维素基包装生物力学性能-洞察及研究
- 工程施工队课件
- 桥梁施工技术创新路径与工程应用研究综述
- 肺结核患者护理课件
- 食管恶性肿瘤护理查房
- 2025年江苏高考地理真题(原卷版)
评论
0/150
提交评论