学习前提
本章可作为该语言的起点,不要求先学网页开发。
本课完成后你能做什么
创建独立练习数据库,理解关系表并读取指定列。
先理解机制
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作为同值时的确定次序。