学习前提

本章可作为该语言的起点,不要求先学网页开发。

本课完成后你能做什么

创建独立练习数据库,理解关系表并读取指定列。

先理解机制

SQL用于描述希望数据库得到什么结果,而不是逐行编写循环。表由列定义结构、由行保存记录;主键唯一标识一行,不等同于界面上的第几行。

CREATE TABLE定义结构,INSERT加入记录,SELECT读取结果。将课程编号与课程名分开,使名字变化不必改变记录身份。本系列每章从空数据库开始,避免旧数据影响推演。

没有ORDER BY的结果没有顺序保证。显式选择id和name比SELECT *更能表达接口需要,也不会因为将来加列而悄悄改变结果列数。

可运行示例

本系列使用SQLite 3方言。打开一个全新的内存练习数据库,例如终端执行 sqlite3 :memory:,再执行本课整段SQL。每章都自带建表和样例数据,不连接网站业务数据库。

CREATE TABLE courses (
  id INTEGER PRIMARY KEY,
  name TEXT NOT NULL,
  minutes INTEGER NOT NULL
);
INSERT INTO courses(id, name, minutes) VALUES
  (1, 'Python', 25), (2, 'Java', 40), (3, 'SQL', 20);
SELECT id, name FROM courses ORDER BY id;

推演与验证

结果按id依次为1 Python、2 Java、3 SQL,共三行两列。minutes已经存储,但没有被本次查询选择。

常见错误与边界

SQLite类型规则与MySQL、PostgreSQL不同,后续章节会用约束补足业务规则。不要把本系列脚本直接运行在网站业务库。

动手练习

只查询name和minutes,并按minutes从少到多排序。

参考解法与理由

使用SELECT name, minutes FROM courses ORDER BY minutes ASC, id ASC;,结果SQL20、Python25、Java40。id作为同值时的确定次序。

进一步阅读