~
二进制补码运算符是一元运算符,具有"翻转"位效应,即0变成1,1变成0。
(~A ) 将得到 -61,即为 1100 0011,一个有符号二进制数的补码形式。
<<
二进制左移运算符。左操作数的值向左移动右操作数指定的位数。
A << 2 将得到 240,即为 1111 0000
>>
二进制右移运算符。左操作数的值向右移动右操作数指定的位数。
A >> 2 将得到 15,即为 0000 1111
1、GLOB
在平时我们的sql中,并不常用GLOB,GLOB的作用与LIKE基本一致,最大的不同是GLOB区分大小写。星号(*)代表零个、一个或多个数字或字符。问号(?)代表一个单一的数字或字符。
与LIKE对比:GLOB的*与LIKE的%作用一致
GLOB的?与LIKE的_作用一致
2、HAVING
指定条件过滤,就这样看来我们可能就会联想到WHERE,那么WHERE与HAVING有什么不同呢?其实二者区别其实挺大的。
(1)HAVING 子句允许指定条件来过滤将出现在最终结果中的分组结果。
(2)WHERE 子句在所选列上设置条件,而 HAVING 子句则在由 GROUP BY 子句创建的分组上设置条件。
(3)HAVING只能与SELECT语句一起使用。
(4)HAVING通常在GROUPBY子句中使用。
(5)如果不使用GROUPBY子句,则HAVING的行为与WHERE子句一样。
(6)在一个查询中,HAVING 子句必须放在 GROUP BY 子句之后,必须放在 ORDER BY 子句之前。
--举例子说明:查询table表查询每一个班级中年龄大于20,性别为男的人数
selectCOUNT(*)as'>20岁人数',classidfromTable1wheresex='男'groupbyclassid,agehavingage>20
--需要注意说明:当同时含有where子句、groupby子句、having子句及聚集函数时,执行顺序如下:
--执行where子句查找符合条件的数据;
--使用groupby子句对数据进行分组;对groupby子句形成的组运行聚集函数计算每一组的值;最后用having子句去掉不符合条件的组。
--having子句中的每一个元素也必须出现在select列表中。有些数据库例外,如oracle.
--having子句和where子句都可以用来设定限制条件以使查询结果满足一定的条件限制。
--having子句限制的是组,而不是行。where子句中不能使用聚集函数,而having子句中可以。
SQLite 的 DISTINCT 关键字与 SELECT 语句一起使用,来消除所有重复的记录,并只获取唯一一次记录。
有可能出现一种情况,在一个表中有多个重复的记录。当提取这样的记录时,DISTINCT 关键字就显得特别有意义,它只获取唯一一次记录,而不是获取重复记录。
约束是在表的数据列上强制执行的规则。这些是用来限制可以插入到表中的数据类型。这确保了数据库中数据的准确性和可靠性。
约束可以是列级或表级。列级约束仅适用于列,表级约束被应用到整个表。
以下是在 SQLite 中常用的约束。
· NOT NULL 约束:确保某列不能有 NULL 值。
· DEFAULT 约束:当某列没有指定值时,为该列提供默认值。
· UNIQUE 约束:确保某列中的所有值是不同的。
· PRIMARY Key 约束:唯一标识数据库表中的各行/记录。
· CHECK 约束:CHECK 约束确保某列中的所有值满足一定条件。
SQLite 的 Joins 子句用于结合两个或多个数据库中表的记录。JOIN 是一种通过共同值来结合两个表中字段的手段。
SQL 定义了三种主要类型的连接:
· 交叉连接 - CROSS JOIN
· 内连接 - INNER JOIN
· 外连接 - OUTER JOIN
1、交叉连接CROSS JOIN
交叉连接(CROSSJOIN)没有WHERE 子句,它返回连接表中所有数据行的笛卡尔积,其结果集合中的数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。由于交叉连接(CROSS JOIN)有可能产生非常大的表,使用时必须谨慎,只在适当的时候使用它们。
2、内连接inner join
内连接的结果是从两个或者两个以上的表的组合中挑选出符合连接条件的数据。如果数据无法满足连接条件则将其丢弃。在内连接中,参与连接的表的地位是平等的。
内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。内连接分三种:
1)等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接表中的所有列,包括其中的重复列。
2)不等连接: 在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些运算符包括>、>=、<=、<、!>、!<和<>。
3)自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询结果集合中所包括的列,并删除连接表中的重复列。
3、外连接
外连接(OUTERJOIN)是内连接(INNER JOIN)的扩展。虽然 SQL标准定义了三种类型的外连接:LEFT、RIGHT、FULL,但 SQLite 只支持 左外连接(LEFT OUTER JOIN)。外连接(OUTER JOIN)声明条件的方法与内连接(INNER JOIN)是相同的,使用 ON、USING 或 NATURAL 关键字来表达。最初的结果表以相同的方式进行计算。一旦主连接计算完成,外连接(OUTER JOIN)将从一个或两个表中任何未连接的行合并进来,外连接的列使用 NULL值,将它们附加到结果表中。
1、SQLite的 UNION 子句/运算符用于合并两个或多个 SELECT 语句的结果,不返回任何重复的行。
为了使用UNION,每个 SELECT 被选择的列数必须是相同的,相同数目的列表达式,相同的数据类型,并确保它们有相同的顺序,但它们不必具有相同的长度。
2、UNIONALL 子句
UNION ALL 运算符用于结合两个 SELECT 语句的结果,包括重复行。
适用于UNION 的规则同样适用于 UNION ALL 运算符。
SQLite 触发器(Trigger)是数据库的回调函数,它会在指定的数据库事件发生时自动执行/调用。以下是关于 SQLite 的触发器(Trigger)的要点:
SQLite 的触发器(Trigger)可以指定在特定的数据库表发生 DELETE、INSERT 或 UPDATE 时触发,或在一个或多个指定表的列发生更新时触发。
SQLite 只支持 FOR EACH ROW 触发器(Trigger),没有 FOR EACH STATEMENT 触发器(Trigger)。因此,明确指定 FOR EACH ROW 是可选的。
WHEN 子句和触发器(Trigger)动作可能访问使用表单 NEW.column-name 和 OLD.column-name 的引用插入、删除或更新的行元素,其中 column-name 是从与触发器关联的表的列的名称。
如果提供 WHEN 子句,则只针对 WHEN 子句为真的指定行执行 SQL 语句。如果没有提供 WHEN 子句,则针对所有行执行 SQL 语句。
BEFORE 或 AFTER 关键字决定何时执行触发器动作,决定是在关联行的插入、修改或删除之前或者之后执行触发器动作。
当触发器相关联的表删除时,自动删除触发器(Trigger)。
要修改的表必须存在于同一数据库中,作为触发器被附加的表或视图,且必须只使用 tablename,而不是 database.tablename。
一个特殊的 SQL 函数 RAISE() 可用于触发器程序内抛出异常。
示例:
SELECT name FROM sqlite_master WHEREtype = 'trigger';可查看所有的触发器
for each row 是操作语句每影响到一行的时候就触发一次,也就是删了 10 行就触发 10 次,而 for each state 一条操作语句就触发一次,有时没有被影响的行也执行。sqlite 只实现了 for each row 的触发。when 和 for each row 用法是这样的:
CREATETRIGGER trigger_name
AFTERUPDATE OF id ON table_1
FOR EACHROW
WHEN new.id>30
BEGIN
UPDATEtable_2 SET id=new.id WHEREtable_2.id=old.id;
END;
上面的触发器在 table_1 改 id 的时候如果新的 id>30 就把 表table_2 中和表table_1 id 相等的行一起改为新的 id
索引(Index)是一种特殊的查找表,数据库搜索引擎用来加快数据检索。索引有助于加快 SELECT 查询和WHERE 子句,但它会减慢使用 UPDATE 和INSERT 语句时的数据输入。索引可以创建或删除,但不会影响数据。
单列索引是一个只基于表的一个列上创建的索引。基本语法如下:
CREATE INDEX index_name
ON table_name (column_name);
使用唯一索引不仅是为了性能,同时也为了数据的完整性。唯一索引不允许任何重复的值插入到表中。基本语法如下:
CREATE UNIQUE INDEX index_name
on table_name (column_name);
组合索引是基于一个表的两个或多个列上创建的索引。基本语法如下:
CREATE INDEX index_name
on table_name (column1, column2);
是否要创建一个单列索引还是组合索引,要考虑到您在作为查询过滤条件的 WHERE 子句中使用非常频繁的列。
如果值使用到一个列,则选择使用单列索引。如果在作为过滤的 WHERE 子句中有两个或多个列经常使用,则选择使用组合索引。
隐式索引是在创建对象时,由数据库服务器自动创建的索引。索引自动创建为主键约束和唯一约束。
SELECT * FROM sqlite_master WHEREtype = 'index';查看数据库中的所有索引
DROP INDEX index_name;一个索引可以使用 SQLite 的 DROP 命令删除
什么情况下要避免使用索引?
虽然索引的目的在于提高数据库的性能,但这里有几个情况需要避免使用索引。使用索引时,应重新考虑下列准则:
· 索引不应该使用在较小的表上。
· 索引不应该使用在有频繁的大批量的更新或插入操作的表上。
· 索引不应该使用在含有大量的 NULL 值的列上。
· 索引不应该使用在频繁操作的列上。
Indexed By
"INDEXEDBY index-name" 子句规定必须需要命名的索引来查找前面表中值。
如果索引名 index-name 不存在或不能用于查询,然后 SQLite 语句的准备失败。
"NOTINDEXED" 子句规定当访问前面的表(包括由 UNIQUE 和 PRIMARYKEY 约束创建的隐式索引)时,没有使用索引。
然而,即使指定了 "NOT INDEXED",INTEGER PRIMARY KEY仍然可以被用于查找条目。
INDEXED BY可以与 DELETE、UPDATE 或SELECT 语句一起使用:
SELECT(北联网教程,专业提供视频软件下载)
……