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.SQLiteMicrosoft.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 TotalStock
                    FROM Products
                    GROUP 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 NamePrefix
                    FROM 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 MonthlyTotal
                    FROM Sales
                    GROUP BY Month
                    ORDER BY Month";
                
                DisplayQueryResults(connection, dateQuery);
                
                // 计算两个日期之间的销售额
                Console.WriteLine("\n2023年第一季度销售额:");
                string salesQuery = @"
                    SELECT sum(Total) AS Q1Sales
                    FROM Sales
                    WHERE 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 Value
                    FROM 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 Products
                    ORDER 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函数。

主要由以下构成:

  1. 数据库设置:创建SQLite数据库文件和必要的表
  2. 示例数据创建:用产品和销售数据填充表
  3. 函数演示:单独的方法来展示不同类别的SQLite函数:
    • 核心和聚合函数(COUNT、AVG、SUM等)
    • 字符串操作函数
    • 日期/时间函数
    • 数学函数
    • JSON函数

 以上就是SQLite函数的相关内容,内容不全,大家相互补充!!下一节将为大家介绍如何使用

C#.NET操作 SQLite基本使用示例,敬请期待吧。


你可能感兴趣的:(SQLite合集:从原理到实战,sqlite,数据库,sql,json,c#)