Sqlite3 使 用 教 程 OS X 自 从 10.4 后 把 SQLite 这 套 相 当 出 名 的 数 据 库 软 件, 放 进 了 作 业 系 统 工 具 集 里 OS X 包 装 的 是 第 三 版 的 SQLite, 又 称 SQLite3 这 套 软 件 有 几 个 特 色 : 软 件 属 于 公 共 财 (public domain),sqlite 可 说 是 某 种 美 德 软 件 (virtueware), 作 者 本 人 放 弃 着 作 权, 而 给 使 用 SQLite 的 人 以 下 的 祝 福 (blessing): o May you do good and not evil. 愿 你 行 善 莫 行 恶 o May you find forgiveness for yourself and forgive others. 愿 你 原 谅 自 己 宽 恕 他 人 o May you share freely, never taking more than you give. 愿 你 宽 心 与 人 分 享, 所 取 不 多 于 你 所 施 予 支 援 大 多 数 的 SQL 指 令 ( 下 面 会 简 单 介 绍 ) 一 个 档 案 就 是 一 个 数 据 库 不 需 要 安 装 数 据 库 服 务 器 软 件 完 整 的 Unicode 支 援 ( 因 此 没 有 跨 语 系 的 问 题 ) 速 度 很 快 目 前 在 OS X 10.4 里,SQLite 是 以 /usr/bin/sqlite3 的 形 式 包 装, 也 就 说 这 是 一 个 命 令 列 工 具, 必 须 先 从 终 端 机 (Terminal.app 或 其 他 程 序 ) 进 入 shell 之 后 才 能 使 用 网 络 上 有 一 些 息 协 助 使 用 SQLite 的 视 觉 化 工 具, 但 似 乎 都 没 有 像 CocoaMySQL( 配 合 MySQL 数 据 库 使 用 ) 那 般 好 用 或 许 随 时 有 惊 喜 也 未 可 知, 以 下 仅 介 绍 命 令 列 的 操 作 方 式 SQLite 顾 名 思 议 是 以 SQL 为 基 础 的 数 据 库 软 件,SQL 是 一 套 强 大 的 数 据 库 语 言, 主 要 概 念 是 由 数 据 库 资 料 表 (table) 查 询 指 令 (queries) 等 单 元 组 成 的 关 联 性 数 据 库 ( 进 一 步 的 概 念 可 参 考 网 络 上 各 种 关 于 SQL 及 关 联 性 数 据 库 的 文 件 ) 因 为 SQL 的 查 询 功 能 强 大, 语 法 一 致 而 入 门 容 易, 因 此 成 为 现 今 主 流 数 据 库 的 标 准 语 言 ( 微 软 Oracle 等 大 厂 的 数 据 库 软 件 都 提 供 SQL 语 法 的 查 询 及 操 作 ) 以 下 我 们 就 建 立 数 据 库 建 立 资 料 表 及 索 引 新 增 资 料 查 询 资 料 更 改 资 料 移 除 资 料 sqlite3 命 令 列 选 项 等 几 个 项 目 做 简 单 的 介 绍 目 录 1 建 立 数 据 库 档 案 2 在 sqlite3 提 示 列 下 操 作 3 SQL 的 指 令 格 式 4 建 立 资 料 表 5 建 立 索 引 6 加 入 一 笔 资 料 7 查 询 资 料 8 如 何 更 改 或 删 除 资 料 9 其 他 sqlite 的 特 别 用 法 10 小 结
建 立 数 据 库 档 案 用 sqlite3 建 立 数 据 库 的 方 法 很 简 单, 只 要 在 shell 下 键 入 ( 以 下 $ 符 号 为 shell 提 示 号, 请 勿 键 入 ): $ sqlite3 foo.db 如 果 目 录 下 没 有 foo.db,sqlite3 就 会 建 立 这 个 数 据 库 sqlite3 并 没 有 强 制 数 据 库 档 名 要 怎 么 取, 因 此 如 果 你 喜 欢, 也 可 以 取 个 例 如 foo.icannameitwhateverilike 的 档 名 在 sqlite3 提 示 列 下 操 作 进 入 了 sqlite3 之 后, 会 看 到 以 下 文 字 : SQLite version 3.1.3 Enter ".help" for instructions sqlite> 这 时 如 果 使 用.help 可 以 取 得 求 助,.quit 则 是 离 开 ( 请 注 意 : 不 是 quit) SQL 的 指 令 格 式 所 以 的 SQL 指 令 都 是 以 分 号 (;) 结 尾 的 如 果 遇 到 两 个 减 号 (--) 则 代 表 注 解,sqlite3 会 略 过 去 建 立 资 料 表 假 设 我 们 要 建 一 个 名 叫 film 的 资 料 表, 只 要 键 入 以 下 指 令 就 可 以 了 : create table film(title, length, year, starring); 这 样 我 们 就 建 立 了 一 个 名 叫 film 的 资 料 表, 里 面 有 name length year starring 四 个 字 段 这 个 create table 指 令 的 语 法 为 : create table table_name(field1, field2, field3,...);
table_name 是 资 料 表 的 名 称,fieldx 则 是 字 段 的 名 字 sqlite3 与 许 多 SQL 数 据 库 软 件 不 同 的 是, 它 不 在 乎 字 段 属 于 哪 一 种 资 料 型 态 :sqlite3 的 字 段 可 以 储 存 任 何 东 西 : 文 字 数 字 大 量 文 字 (blub), 它 会 在 适 时 自 动 转 换 建 立 索 引 如 果 资 料 表 有 相 当 多 的 资 料, 我 们 便 会 建 立 索 引 来 加 快 速 度 好 比 说 : create index film_title_index on film(title); 意 思 是 针 对 film 资 料 表 的 name 字 段, 建 立 一 个 名 叫 film_name_index 的 索 引 这 个 指 令 的 语 法 为 create index index_name on table_name(field_to_be_indexed); 一 旦 建 立 了 索 引,sqlite3 会 在 针 对 该 字 段 作 查 询 时, 自 动 使 用 该 索 引 这 一 切 的 操 作 都 是 在 幕 后 自 动 发 生 的, 无 须 使 用 者 特 别 指 令 加 入 一 笔 资 料 接 下 来 我 们 要 加 入 资 料 了, 加 入 的 方 法 为 使 用 insert into 指 令, 语 法 为 : insert into table_name values(data1, data2, data3,...); 例 如 我 们 可 以 加 入 insert into film values ('Silence of the Lambs, The', 118, 1991, 'Jodie Foster'); insert into film values ('Contact', 153, 1997, 'Jodie Foster'); insert into film values ('Crouching Tiger, Hidden Dragon', 120, 2000, 'Yun-Fat Chow'); insert into film values ('Hours, The', 114, 2002, 'Nicole Kidman'); 如 果 该 字 段 没 有 资 料, 我 们 可 以 填 NULL 查 询 资 料 讲 到 这 里, 我 们 终 于 要 开 始 介 绍 SQL 最 强 大 的 select 指 令 了 我 们 首 先 简 单 介 绍 select 的 基 本 句 型 :
select columns from table_name where expression; 最 常 见 的 用 法, 当 然 是 倒 出 所 有 数 据 库 的 内 容 : select * from film; 如 果 资 料 太 多 了, 我 们 或 许 会 想 限 制 笔 数 : select * from film limit 10; 或 是 照 着 电 影 年 份 来 排 列 : select * from film order by year limit 10; 或 是 年 份 比 较 近 的 电 影 先 列 出 来 : select * from film order by year desc limit 10; 或 是 我 们 只 想 看 电 影 名 称 跟 年 份 : select title, year from film order by year desc limit 10; 查 所 有 茱 蒂 佛 斯 特 演 过 的 电 影 : select * from film where starring='jodie Foster'; 查 所 有 演 员 名 字 开 头 叫 茱 蒂 的 电 影 ('%' 符 号 便 是 SQL 的 万 用 字 符 ): select * from film where starring like 'Jodie%'; 查 所 有 演 员 名 字 以 茱 蒂 开 头 年 份 晚 于 1985 年 年 份 晚 的 优 先 列 出 最 多 十 笔, 只 列 出 电 影 名 称 和 年 份 : select title, year from film where starring like 'Jodie%' and year >= 1985 order by year desc limit 10; 有 时 候 我 们 只 想 知 道 数 据 库 一 共 有 多 少 笔 资 料 : select count(*) from film; 有 时 候 我 们 只 想 知 道 1985 年 以 后 的 电 影 有 几 部 : select count(*) from film where year >= 1985; ( 进 一 步 的 各 种 组 合, 要 去 看 SQL 专 书, 不 过 你 大 概 已 经 知 道 SQL 为 什 么 这 么 流 行 了 : 这 种 语 言 允 许 你 将 各 种 查 询 条 件 组 合 在 一 起 而 我 们 还 没 提 到 跨 数 据 库 的 联 合 查 询 呢!)
如 何 更 改 或 删 除 资 料 了 解 select 的 用 法 非 常 重 要, 因 为 要 在 sqlite 更 改 或 删 除 一 笔 资 料, 也 是 靠 同 样 的 语 法 例 如 有 一 笔 资 料 的 名 字 打 错 了 : update film set starring='jodie Foster' where starring='jodee Foster'; 就 会 把 主 角 字 段 里, 被 打 成 'Jodee Foster' 的 那 笔 ( 或 多 笔 ) 资 料, 改 回 成 Jodie Foster delete from film where year < 1970; 就 会 删 除 所 有 年 代 早 于 1970 年 ( 不 含 ) 的 电 影 了 其 他 sqlite 的 特 别 用 法 sqlite 可 以 在 shell 底 下 直 接 执 行 命 令 : sqlite3 film.db "select * from film;" 输 出 HTML 表 格 : sqlite3 -html film.db "select * from film;" 将 数 据 库 倒 出 来 : sqlite3 film.db ".dump" > output.sql 利 用 输 出 的 资 料, 建 立 一 个 一 模 一 样 的 数 据 库 ( 加 上 以 上 指 令, 就 是 标 准 的 SQL 数 据 库 备 份 了 ): sqlite3 film.db < output.sql 在 大 量 插 入 资 料 时, 你 可 能 会 需 要 先 打 这 个 指 令 : begin; 插 入 完 资 料 后 要 记 得 打 这 个 指 令, 资 料 才 会 写 进 数 据 库 中 : commit;
小 结 以 上 我 们 介 绍 了 SQLite 这 套 数 据 库 系 统 的 用 法 事 实 上 OS X 也 有 诸 于 SQLiteManagerX 这 类 的 图 形 接 口 程 序, 可 以 便 利 数 据 库 的 操 作 不 过 万 变 不 离 其 宗, 了 解 SQL 指 令 操 作,SQLite 与 其 各 家 变 种 就 很 容 易 上 手 了 至 于 为 什 么 要 写 这 篇 教 学 呢? 除 了 因 为 OS X Tiger 大 量 使 用 SQLite 之 外 ( 例 如 :Safari 的 RSS reader, 就 是 把 文 章 存 在 SQLite 数 据 库 里! 你 可 以 开 开 看 ~/Library/Syndication/Database3 这 个 档 案, 看 看 里 面 有 什 么 料 ),OpenVanilla 从 0.7.2 开 始, 也 引 进 了 以 SQLite 为 基 础 的 词 汇 管 理 工 具, 以 及 全 字 库 的 注 音 输 入 法 因 为 使 用 SQLite, 这 两 个 模 块 不 管 数 据 库 内 有 多 少 笔 资 料, 都 可 以 做 到 瞬 间 启 动 以 及 相 当 快 速 的 查 询 回 应 将 一 套 方 便 好 用 的 数 据 库 软 件 包 进 OS X 中, 当 然 也 算 是 Apple 相 当 相 当 聪 明 的 选 择 再 勤 劳 一 点 的 朋 友 也 许 已 经 开 始 想 拿 SQLite 来 记 录 各 种 东 西 ( 像 我 们 其 中 就 有 一 人 写 了 个 程 序, 自 动 记 录 电 池 状 态, 写 进 SQLite 数 据 库 中 再 做 统 计...) 了 想 像 空 间 可 说 相 当 宽 广 目 前 支 援 SQLite 的 程 序 语 言, 你 能 想 到 的 大 概 都 有 了 这 套 数 据 库 2005 年 还 赢 得 了 美 国 O'Reilly Open Source Conference 的 最 佳 开 放 源 代 码 软 件 奖, 奖 评 是 有 什 么 东 西 能 让 Perl, Python, PHP, Ruby 语 言 团 结 一 致 地 支 援 的? 就 是 SQLite 由 此 可 见 SQLite 的 地 位 了 而 SQLite 程 序 非 常 小, 更 是 少 数 打 "gcc -o sqlite3 *", 不 需 任 何 特 殊 设 定 就 能 跨 平 台 编 译 的 程 序 小 而 省, 小 而 美,SQLite 连 网 站 都 不 多 赘 言, 直 指 SQL 语 法 精 要 及 API 使 用 方 法, 原 作 者 大 概 也 可 以 算 是 某 种 程 序 设 计 之 道 (Tao of Programming) 里 所 说 的 至 人 了