前言
记录一下常用的Sqlite语句,防止以后需要的时候忘记!~
要注意的地方
- 文本类型的值要加单引号,数值可以不用加
- 清空数据库后文件大小不变怎么解决,清空后执行下面语句即可
没错,就是这个单词,执行一下就好了
vacuum
增
在末尾插入每一列数据
INSERT INTO 表名 VALUES (值1, 值2,....)
在末尾插入指定列数据
INSERT INTO 表名 (列1, 列2,...) VALUES (值1, 值2,....)
删
删除指定行语句
DELETE FROM 表名 WHERE 字段名 = 值
清空表语句
DELETE FROM 表名
删除重复字段内容保留一条
delete from 表名 where rowid not in(select max(rowid) from 表名 group by 要检查的字段名)
或
delete from 表名 where 唯一ID字段名 not in(select max(唯一ID字段名) from 表名 group by 要检查的字段名)
SQLite中每个表都默认包含一个隐藏列rowid,使用WITHOUT ROWID定义的表除外。通常情况下,rowid可以唯一的标记表中的每个记录。表中插入的第一个条记录的rowid为1,后续插入的记录的rowid依次递增1。即使插入失败,rowid也会被加一。所以,整个表中的rowid并不一定连续,即使用户没有删除过记录。
由于唯一性,所以rowid在很多场合中当作主键使用。在使用的时候,select from tablename 并不能获取rowid,必须显式的指定。例如,select rowid, from tablename 才可以获取rowid列。查询rowid的效率非常高,所以直接使用rowid作为查询条件是一个优化查询的好方法。
但是rowid列作为主键,在极端情况下存在隐患。由于rowid值会一直递增,如果达到所允许的最大值9223372036854775807后,它会自动搜索没有被使用的值,重新使用,并不会提示用户。这时,使用rowid排序记录,会产生乱序,并引入其他的逻辑问题。所以,如果用户的数据库存在这种可能的情况,就应该使用AUTOINCREMENT定义主键,从而避免这种问题。使用AUTOINCREMENT设置自增主键,虽然也会遇到9223372036854775807问题,但是它会报错,提示用户,避免产生rowid所引发的问题。
改
修改单条
UPDATE 表名 SET 字段名 = 新值 WHERE 字段名 = 旧值
修改多条
UPDATE 表名 SET 字段名 = 新值,字段名 = 新值,.... WHERE 字段名 = 旧值
查
取出单列或多列字段
SELECT 字段名1,字段名2,字段名3 FROM 表名
取出所有字段
SELECT * FROM 表名
取出某列包含某值的字段
SELECT * FROM 表名 WHERE 列标题='某值'
排除包含关键词的字段
SELECT * FROM 表名 WHERE 字段名 NOT LIKE '%关键词%'
排除多个包含关键词的字段
SELECT * FROM 表名 WHERE 字段名 NOT LIKE '%关键词%' AND 字段名 NOT LIKE'%关键词%'
取出包含关键词的字段
SELECT * FROM 表名 WHERE 字段名 LIKE '%关键词%'
取出值为关键词的字段
SELECT * FROM 表名 WHERE INSTR ('关键词',字段名)>0
随机取出一行数据
limit 1表示只取一条记录
SELECT * FROM 表名 ORDER BY RANDOM() limit 1
现在功能实现了,但是这样效率比较低,我们对sql语句改造如下:
SELECT * FROM 表名 WHERE id in (SELECT id FROM 表名 order by RANDOM() limit 10)
如果只想取其中的一条记录也可以把WHERE id in替换成WHERE id=,如下所示:
SELECT * FROM 表名 WHERE id = (SELECT id FROM 表名 order by RANDOM() limit 10)
另外在MySQL中也有一个RAND()函数可以实现类似功能,在MSSQL中可以通过order by GUID来实现
查找表中多余的重复记录
SELECT * FROM 表名 group by 字段名 having count(*) > 1;
查找表中多字段多余的重复记录
SELECT * FROM 表名 GROUP BY 字段名1, 字段名2, 字段名3,... HAVING (count(要检查的字段或唯一ID字段) > 1)
查找表中多字段多余的重复记录2
select * from 表名 where 要检查的字段名 in (select content from 表名 group by 要检查的字段名 having count(要检查的字段或唯一ID字段) > 1)
多表查询
SELECT * FROM 表名1 AS A JOIN 表名2 AS B WHERE A.id = 99 AND B.id =99
意思是将表1作为A代替 表2作为B代替 查询表1与表2值为99的字段
取出数据库中的总行数
SELECT Count(*) FROM 表名
取出某字段为空的数据
SELECT * FROM 表名 WHERE 字段名 is null
取出某字段不为空的数据
SELECT * FROM 表名 WHERE 字段名 is NOT null
其它
自增时间字段(建议使用例1)
例1
创建表:
create table Account( username char, password char, date timestamp NOT null default (datetime('now','localtime')))
添加数据:
insert into Account ("username","password") VALUES('13201544054','aa123456')
例2
创建表:
create table Accounts( username char, password char, date DATETIME NOT null default CURRENT_TIMESTAMP)
添加数据:
insert into Accounts ("username","password") VALUES('13201544054','aa123456')