SQLite基本函数
目录
1 核心函数和聚合函数
1.1 核心函数
1.2 聚合函数
2 字符串函数
3 日期和时间函数
4 数学函数
5 JSON函数 (SQLite 3.9.0+)
6 窗口函数 (SQLite 3.25.0+)
7 加密和安全函数
8 其他实用函数
9 C#代码示例:使用SQLite函数
9.1 准备工作
9.2 代码实现
SQLite提供了丰富的内置函数,可用于数据操作、转换和计算。下面将分类详细介绍这些函数,并
通过一个C#代码示例展示如何在应用中使用它们。
1 核心函数和聚合函数
1.1 核心函数
函数 | 描述 | 示例 |
---|---|---|
abs(X) | 返回X的绝对值 | SELECT abs(-10) → 10 |
coalesce(X,Y,...) | 返回第一个非NULL值 | SELECT coalesce(NULL, 0, 5) → 0 |
ifnull(X,Y) | 如果X为NULL返回Y,否则返回X | SELECT ifnull(NULL, 'Default') → ‘Default’ |
length(X) | 返回字符串X的长度 | SELECT length('SQLite') → 6 |
max(X,Y,...) | 返回参数中的最大值 | SELECT max(5, 9, 3) → 9 |
min(X,Y,...) | 返回参数中的最小值 | SELECT min(5, 9, 3) → 3 |
nullif(X,Y) | 如果X=Y返回NULL,否则返回X | SELECT nullif(5, 5) → NULL |
random() | 返回随机整数 | SELECT random() → [随机整数] |
round(X) | 四舍五入到最接近的整数 | SELECT round(4.6) → 5 |
round(X,Y) | 四舍五入到Y位小数 | SELECT round(5.678, 1) → 5.7 |
1.2 聚合函数
函数 | 描述 | 示例 |
---|---|---|
avg(X) | 返回X的平均值 | SELECT avg(salary) FROM employees |
count(X) | 计数非NULL的X值 | SELECT count(email) FROM users |
count(*) | 计数行数 | SELECT count(*) FROM orders |
group_concat(X) | 将所有X值连接为一个字符串 | SELECT group_concat(name) FROM users |
max(X) | 返回X列中的最大值 | SELECT max(price) FROM products |
min(X) | 返回X列中的最小值 | SELECT min(age) FROM users |
sum(X) | 返回X列的总和 | SELECT sum(amount) FROM transactions |
total(X) | 返回X列的总和(float) | SELECT total(amount) FROM transactions |
2 字符串函数
函数 | 描述 | 示例 |
---|---|---|
lower(X) | 将X转换为小写 | SELECT lower('SQLite') → ‘sqlite’ |
upper(X) | 将X转换为大写 | SELECT upper('sqlite') → ‘SQLITE’ |
trim(X) | 去除X两端的空白 | SELECT trim(' sqlite ') → ‘sqlite’ |
ltrim(X) | 去除X左侧的空白 | SELECT ltrim(' sqlite') → ‘sqlite’ |
rtrim(X) | 去除X右侧的空白 | SELECT rtrim('sqlite ') → ‘sqlite’ |
substr(X,Y) | 截取X从位置Y开始的子串 | SELECT substr('sqlite', 2) → ‘qlite’ |
substr(X,Y,Z) | 截取X从位置Y开始长度为Z的子串 | SELECT substr('sqlite', 2, 3) → ‘qli’ |
replace(X,Y,Z) | 将X中的Y替换为Z | SELECT replace('sqlite', 'lite', 'BIG') → ‘sqBIG’ |
instr(X,Y) | 返回Y在X中首次出现的位置 | SELECT instr('sqlite', 'it') → 3 |
char(X1,X2...) | 返回ASCII码对应的字符 | SELECT char(83, 81, 76) → ‘SQL’ |
hex(X) | 返回X的十六进制表示 | SELECT hex('SQL') → ‘53514C’ |
quote(X) | 将X包裹在引号中,转义特殊字符 | SELECT quote('O''Brien') → ‘O’‘Brien’ |
glob(X,Y) | 如果Y匹配通配模式X返回1,否则返回0 | SELECT glob('*.txt', 'file.txt') → 1 |
like(X,Y) | 如果Y匹配SQL LIKE模式X返回1 | SELECT like('%lite%', 'sqlite') → 1 |
unicode(X) | 返回X第一个字符的Unicode码点 | SELECT unicode('A') → 65 |
3 日期和时间函数
函数 | 描述 | 示例 |
---|---|---|
date(timestring, modifier...) | 返回日期格式 | SELECT date('now') → ‘2023-05-15’ |
time(timestring, modifier...) | 返回时间格式 | SELECT time('now') → ‘15:30:45’ |
datetime(timestring, modifier...) | 返回日期时间格式 | SELECT datetime('now') → ‘2023-05-15 15:30:45’ |
julianday(timestring, modifier...) | 返回儒略日 | SELECT julianday('2023-05-15') → 2460079.5 |
strftime(format, timestring, modifier...) | 按格式化字符串返回日期时间 | SELECT strftime('%Y-%m-%d', 'now') → ‘2023-05-15’ |
常用格式化符号:
%Y
- 年(四位数)
%m
- 月(01-12)
%d
- 日(01-31)
%H
- 小时(00-23)
%M
- 分钟(00-59)
%S
- 秒(00-59)
%W
- 星期几名称
%w
- 星期几数字(0-6,0是星期日)
常用修饰符:
+N days
- 增加N天
+N hours
- 增加N小时
+N minutes
- 增加N分钟
+N months
- 增加N月
+N years
- 增加N年
start of month
- 月初
start of year
- 年初
weekday N
- 最近的星期N(0=星期日)
4 数学函数
函数 | 描述 | 示例 |
---|---|---|
abs(X) | 返回X的绝对值 | SELECT abs(-10) → 10 |
random() | 返回随机整数 | SELECT random() → [随机整数] |
round(X) | 四舍五入到最接近的整数 | SELECT round(4.6) → 5 |
round(X,Y) | 四舍五入到Y位小数 | SELECT round(5.678, 1) → 5.7 |
ceil(X) | 向上取整 | SELECT ceil(4.1) → 5 |
floor(X) | 向下取整 | SELECT floor(4.9) → 4 |
power(X,Y) | X的Y次方 | SELECT power(2, 3) → 8 |
sqrt(X) | X的平方根 | SELECT sqrt(9) → 3 |
exp(X) | e的X次方 | SELECT exp(1) → 2.71828… |
log(X) | X的自然对数 | SELECT log(10) → 2.30258… |
log10(X) | X的以10为底的对数 | SELECT log10(100) → 2 |
mod(X,Y) | X除以Y的余数 | SELECT mod(10, 3) → 1 |
pi() | 返回圆周率π | SELECT pi() → 3.14159… |
sign(X) | X的符号(-1, 0, 或 1) | SELECT sign(-15) → -1 |
cos(X) | X的余弦(X为弧度) | SELECT cos(0) → 1 |
sin(X) | X的正弦(X为弧度) | SELECT sin(pi()/2) → 1 |
tan(X) | X的正切(X为弧度) | SELECT tan(0) → 0 |
acos(X) | X的反余弦 | SELECT acos(1) → 0 |
asin(X) | X的反正弦 | SELECT asin(1) → 1.5707… |
atan(X) | X的反正切 | SELECT atan(1) → 0.7853… |
atan2(Y,X) | Y/X的反正切 | SELECT atan2(1, 1) → 0.7853… |
5 JSON函数 (SQLite 3.9.0+)
函数 | 描述 | 示例 |
---|---|---|
json(X) | 验证X是否为有效JSON | SELECT json('{"name":"John"}') → ‘{“name”:“John”}’ |
json_array(X,Y...) | 创建JSON数组 | SELECT json_array(1, 2, 'three') → ‘[1,2,“three”]’ |
json_object(K,V,...) | 创建JSON对象 | SELECT json_object('name', 'John') → ‘{“name”:“John”}’ |
json_extract(X,P) | 从JSON中提取值 | SELECT json_extract('{"name":"John"}', '$.name') → ‘John’ |
json_type(X,P) | 返回JSON值的类型 | SELECT json_type('{"name":"John"}', '$.name') → ‘text’ |
json_insert(X,P,V,...) | 如果路径不存在则插入 | SELECT json_insert('{"a":2}', '$.b', 5) → ‘{“a”:2,“b”:5}’ |
json_replace(X,P,V,...) | 如果路径存在则替换 | SELECT json_replace('{"a":2}', '$.a', 5) → ‘{“a”:5}’ |
json_set(X,P,V,...) | 插入或替换值 | SELECT json_set('{"a":2}', '$.a', 5) → ‘{“a”:5}’ |
json_remove(X,P,...) | 移除指定路径 | SELECT json_remove('{"a":2,"b":3}', '$.a') → ‘{“b”:3}’ |
json_valid(X) | 检查X是否为有效JSON | SELECT json_valid('{"a":2}') → 1 |
json_array_length(X) | 返回JSON数组长度 | SELECT json_array_length('[1,2,3]') → 3 |
json_each(X) | 枚举JSON对象中的每个键值对 | SELECT * FROM json_each('{"a":1,"b":2}') |
json_tree(X) | 迭代JSON结构的每个元素 | SELECT * FROM json_tree('{"a":1,"b":[2,3]}') |
6 窗口函数 (SQLite 3.25.0+)
函数 | 描述 | 示例 |
---|---|---|
row_number() | 返回结果集中行的序号 | SELECT row_number() OVER (ORDER BY name) |
rank() | 返回排名(有间隔) | SELECT rank() OVER (ORDER BY score DESC) |
dense_rank() | 返回排名(无间隔) | SELECT dense_rank() OVER (ORDER BY score DESC) |
percent_rank() | 返回百分比排名 | SELECT percent_rank() OVER (ORDER BY score) |
first_value(X) | 返回窗口框架第一行的X值 | SELECT first_value(name) OVER (ORDER BY score DESC) |
last_value(X) | 返回窗口框架最后一行的X值 | SELECT last_value(name) OVER (ORDER BY score DESC) |
nth_value(X,N) | 返回窗口框架第N行的X值 | SELECT nth_value(name, 2) OVER (ORDER BY score DESC) |
lead(X,N,DEFAULT) | 返回当前行后N行的X值 | SELECT lead(score, 1, 0) OVER (ORDER BY score) |
lag(X,N,DEFAULT) | 返回当前行前N行的X值 | SELECT lag(score, 1, 0) OVER (ORDER BY score) |
ntile(N) | 将行分为N个等分组 | SELECT ntile(4) OVER (ORDER BY score) |
7 加密和安全函数
函数 | 描述 | 示例 |
---|---|---|
randomblob(N) | 返回N字节的随机BLOB | SELECT hex(randomblob(4)) |
zeroblob(N) | 返回N字节的零值BLOB | SELECT length(zeroblob(10)) → 10 |
hex(X) | 返回X的十六进制表示 | SELECT hex('ABC') → ‘414243’ |
unhex(X) | 将十六进制字符串转换为BLOB | SELECT unhex('414243') → ‘ABC’ |
sha1(X) | 返回X的SHA1哈希 | SELECT hex(sha1('password')) |
sha256(X) | 返回X的SHA256哈希 | SELECT hex(sha256('password')) |
sha512(X) | 返回X的SHA512哈希 | SELECT hex(sha512('password')) |
md5(X) | 返回X的MD5哈希 | SELECT hex(md5('password')) |
注意:某些哈希函数可能需要SQLite扩展支持。
8 其他实用函数
函数 | 描述 | 示例 |
---|---|---|
typeof(X) | 返回X的数据类型 | SELECT typeof(123) → ‘integer’ |
changes() | 返回最近修改的行数 | SELECT changes() |
total_changes() | 返回自连接以来修改的总行数 | SELECT total_changes() |
last_insert_rowid() | 返回最后一次插入的ROWID | SELECT last_insert_rowid() |
sqlite_version() | 返回SQLite库版本 | SELECT sqlite_version() |
9 C#代码示例:使用SQLite函数
9.1 准备工作
首先,你需要安装SQLite的C#驱动。在Visual Studio中,通过NuGet包管理器安装
System.Data.SQLite
或Microsoft.Data.Sqlite
包。
// 使用NuGet包管理器控制台安装
// Install-Package System.Data.SQLite
// 或者
// Install-Package Microsoft.Data.Sqlite
9.2 代码实现
下面通过C#示例展示如何在代码中使用这些SQLite函数:
1.SetupExampleData() 创建数据表,并添加与插入内容
2.DemoCoreAndAggregateFunctions() 创建核心和聚合函数
3.DemoStringFunctions() 创建字符串函数
4.DemoDateTimeFunctions() 创建日期时间函数
5.DemoMathFunctions() 创建基本的数学函数
6.DemoJsonFunctions() 创建JSON函数
using System;
using System.Data.SQLite;
using System.IO;namespace SQLiteFunctionsDemo
{class Program{private static string dbFile = "functions_demo.db";private static string connectionString = $"Data Source={dbFile};Version=3;";static void Main(string[] args){try{// 确保数据库文件存在if (!File.Exists(dbFile)){SQLiteConnection.CreateFile(dbFile);}// 创建示例数据SetupExampleData();// 演示不同类型的函数DemoCoreAndAggregateFunctions();DemoStringFunctions();DemoDateTimeFunctions();DemoMathFunctions();DemoJsonFunctions();DemoWindowFunctions();DemoCustomFunctions();Console.WriteLine("所有函数演示已完成!");}catch (Exception ex){Console.WriteLine($"发生错误: {ex.Message}");}Console.ReadKey();}static void SetupExampleData(){using (var connection = new SQLiteConnection(connectionString)){connection.Open();// 创建产品表ExecuteNonQuery(connection, @"CREATE TABLE IF NOT EXISTS Products (ProductId INTEGER PRIMARY KEY,Name TEXT NOT NULL,Category TEXT,Price REAL,Stock INTEGER,LastUpdated TEXT DEFAULT CURRENT_TIMESTAMP,Metadata TEXT)");// 创建销售表ExecuteNonQuery(connection, @"CREATE TABLE IF NOT EXISTS Sales (SaleId INTEGER PRIMARY KEY,ProductId INTEGER,Quantity INTEGER,SaleDate TEXT,Total REAL,FOREIGN KEY (ProductId) REFERENCES Products(ProductId))");// 清空数据以便重复运行ExecuteNonQuery(connection, "DELETE FROM Sales");ExecuteNonQuery(connection, "DELETE FROM Products");// 插入产品数据ExecuteNonQuery(connection, @"INSERT INTO Products (ProductId, Name, Category, Price, Stock, Metadata) VALUES(1, '苹果手机', '电子产品', 6999.00, 100, '{"color":"black","storage":"128GB","warranty":"1年"}'),(2, '笔记本电脑', '电子产品', 5999.00, 50, '{"color":"silver","cpu":"i5","ram":"8GB"}'),(3, '蓝牙耳机', '配件', 299.00, 200, '{"color":"white","battery":"20小时","type":"TWS"}'),(4, '智能手表', '电子产品', 1999.00, 75, '{"color":"black","screen":"AMOLED","battery":"5天"}'),(5, '移动电源', '配件', 99.00, 300, '{"capacity":"10000mAh","ports":2,"fastCharge":true}')");// 插入销售数据ExecuteNonQuery(connection, @"INSERT INTO Sales (ProductId, Quantity, SaleDate, Total) VALUES(1, 2, '2023-01-15', 13998.00),(3, 5, '2023-01-20', 1495.00),(2, 1, '2023-02-05', 5999.00),(4, 3, '2023-02-10', 5997.00),(5, 10, '2023-02-15', 990.00),(1, 1, '2023-03-01', 6999.00),(3, 2, '2023-03-10', 598.00),(2, 2, '2023-03-15', 11998.00),(4, 1, '2023-03-20', 1999.00),(5, 5, '2023-03-25', 495.00)");}}static void DemoCoreAndAggregateFunctions(){Console.WriteLine("\n=== 核心和聚合函数 ===");using (var connection = new SQLiteConnection(connectionString)){connection.Open();// 核心函数Console.WriteLine("核心函数示例:");DisplayValue(connection, "SELECT abs(-15)", "abs(-15)");DisplayValue(connection, "SELECT coalesce(NULL, 'N/A', 'Data')", "coalesce(NULL, 'N/A', 'Data')");DisplayValue(connection, "SELECT max(10, 5, 20, 15)", "max(10, 5, 20, 15)");DisplayValue(connection, "SELECT round(123.456, 1)", "round(123.456, 1)");// 聚合函数Console.WriteLine("\n聚合函数示例:");DisplayValue(connection, "SELECT count(*) FROM Products", "产品总数");DisplayValue(connection, "SELECT avg(Price) FROM Products", "平均价格");DisplayValue(connection, "SELECT sum(Total) FROM Sales", "销售总额");DisplayValue(connection, "SELECT max(Price) FROM Products", "最高产品价格");DisplayValue(connection, "SELECT min(Price) FROM Products", "最低产品价格");DisplayValue(connection, "SELECT group_concat(Name, ', ') FROM Products", "所有产品名称");// 分组聚合Console.WriteLine("\n分组聚合示例:");string groupByQuery = @"SELECT Category, count(*) AS ProductCount, avg(Price) AS AvgPrice,sum(Stock) AS TotalStockFROM ProductsGROUP BY Category";DisplayQueryResults(connection, groupByQuery);}}static void DemoStringFunctions(){Console.WriteLine("\n=== 字符串函数 ===");using (var connection = new SQLiteConnection(connectionString)){connection.Open();Console.WriteLine("字符串函数示例:");DisplayValue(connection, "SELECT upper('sqlite')", "upper('sqlite')");DisplayValue(connection, "SELECT lower('SQLite')", "lower('SQLite')");DisplayValue(connection, "SELECT length('SQLite数据库')", "length('SQLite数据库')");DisplayValue(connection, "SELECT substr('SQLite数据库', 7, 3)", "substr('SQLite数据库', 7, 3)");DisplayValue(connection, "SELECT replace('SQLite是很好的数据库', '很好', '非常优秀')", "replace('SQLite是很好的数据库', '很好', '非常优秀')");DisplayValue(connection, "SELECT instr('SQLite数据库', '数据')", "instr('SQLite数据库', '数据')");DisplayValue(connection, "SELECT trim(' SQLite ')", "trim(' SQLite ')");// 在表数据上使用字符串函数Console.WriteLine("\n在表数据上使用字符串函数:");string stringFuncQuery = @"SELECT Name, upper(Category) AS CategoryUpper,length(Name) AS NameLength,substr(Name, 1, 2) AS NamePrefixFROM Products";DisplayQueryResults(connection, stringFuncQuery);// 字符串模式匹配Console.WriteLine("\n字符串模式匹配:");DisplayQueryResults(connection, "SELECT Name FROM Products WHERE Name LIKE '%手%'");}}static void DemoDateTimeFunctions(){Console.WriteLine("\n=== 日期时间函数 ===");using (var connection = new SQLiteConnection(connectionString)){connection.Open();Console.WriteLine("当前日期时间:");DisplayValue(connection, "SELECT date('now', 'localtime')", "今天日期");DisplayValue(connection, "SELECT time('now', 'localtime')", "当前时间");DisplayValue(connection, "SELECT datetime('now', 'localtime')", "当前日期时间");DisplayValue(connection, "SELECT strftime('%Y年%m月%d日 %H:%M', 'now', 'localtime')", "格式化日期时间");Console.WriteLine("\n日期计算:");DisplayValue(connection, "SELECT date('now', '+7 days', 'localtime')", "7天后");DisplayValue(connection, "SELECT date('now', '+1 month', 'localtime')", "1个月后");DisplayValue(connection, "SELECT date('now', '+1 year', 'start of month', 'localtime')", "明年当月第一天");DisplayValue(connection, "SELECT strftime('%w', 'now', 'localtime')", "今天是星期几(0=周日)");DisplayValue(connection, "SELECT (julianday('now') - julianday('2023-01-01'))", "今年已过天数");// 日期时间查询Console.WriteLine("\n日期时间查询示例:");string dateQuery = @"SELECT strftime('%Y-%m', SaleDate) AS Month, sum(Total) AS MonthlyTotalFROM SalesGROUP BY MonthORDER BY Month";DisplayQueryResults(connection, dateQuery);// 计算两个日期之间的销售额Console.WriteLine("\n2023年第一季度销售额:");string salesQuery = @"SELECT sum(Total) AS Q1SalesFROM SalesWHERE SaleDate BETWEEN '2023-01-01' AND '2023-03-31'";DisplayQueryResults(connection, salesQuery);}}static void DemoMathFunctions(){Console.WriteLine("\n=== 数学函数 ===");using (var connection = new SQLiteConnection(connectionString)){connection.Open();Console.WriteLine("基本数学函数:");DisplayValue(connection, "SELECT abs(-42)", "abs(-42)");DisplayValue(connection, "SELECT round(3.14159, 2)", "round(3.14159, 2)");DisplayValue(connection, "SELECT floor(9.8)", "floor(9.8)");DisplayValue(connection, "SELECT ceil(9.2)", "ceil(9.2)");DisplayValue(connection, "SELECT power(2, 10)", "power(2, 10)");DisplayValue(connection, "SELECT sqrt(144)", "sqrt(144)");Console.WriteLine("\n三角函数:");DisplayValue(connection, "SELECT sin(radians(30))", "sin(30°)");DisplayValue(connection, "SELECT cos(radians(60))", "cos(60°)");DisplayValue(connection, "SELECT tan(radians(45))", "tan(45°)");Console.WriteLine("\n应用于表数据的数学函数:");string mathQuery = @"SELECT Name,Price,round(Price * 0.9, 2) AS DiscountPrice,round(Price * 1.13, 2) AS PriceWithTax,Stock,Stock * Price AS Inventory ValueFROM Products";DisplayQueryResults(connection, mathQuery);// 随机数应用Console.WriteLine("\n随机数应用示例:");DisplayValue(connection, "SELECT random()", "random()");DisplayValue(connection, "SELECT abs(random()) % 100", "随机数(0-99)");// 随机选择产品string randomProductQuery = @"SELECT Name FROM ProductsORDER BY random()LIMIT 1";DisplayValue(connection, randomProductQuery, "随机产品");}}static void DemoJsonFunctions(){Console.WriteLine("\n=== JSON函数 ===");using (var connection = new SQLiteConnection(connectionString)){connection.Open();try{// 基本JSON函数Console.WriteLine("基本JSON函数:");DisplayValue(connection, "SELECT json_valid('{\"name\":\"John\"}')", "json_valid检查");DisplayValue(connection, "SELECT json_extract('{\"name\":\"John\",\"age\":30}', '$.name')", "提取name值");DisplayValue(connection, "SELECT json_extract('{\"name\":\"John\",\"age\":30}', '$.age')", "提取age值");// 使用 -> 运算符简化JSON提取DisplayValue(connection, "SELECT '{\"name\":\"John\",\"age\":30}' -> '$.name'", "使用->运算符");// JSON数组处理DisplayValue(connection, "SELECT json_array_length('[1,2,3,4]')", "JSON数组长度");DisplayValue(connection, "SELECT json_extract('[1,2,3,4]', '$[1]')", "提取数组元素
代码建立了一个SQLite数据库,创建了产品和销售表,用示例数据填充它们,然后通过几个方法演
示了不同类型的SQLite函数。
主要由以下构成:
- 数据库设置:创建SQLite数据库文件和必要的表
- 示例数据创建:用产品和销售数据填充表
- 函数演示:单独的方法来展示不同类别的SQLite函数:
- 核心和聚合函数(COUNT、AVG、SUM等)
- 字符串操作函数
- 日期/时间函数
- 数学函数
- JSON函数
以上就是SQLite函数的相关内容,内容不全,大家相互补充!!下一节将为大家介绍如何使用
C#.NET操作 SQLite基本使用示例,敬请期待吧。