讲解

关系型数据库把数据组织成一张张「表」:表有列(字段),每一行是一条记录。SQL(Structured Query Language,结构化查询语言)就是和这些表打交道的标准语言——你描述「想要什么数据」,数据库负责「怎么找出来」。这种「只说结果、不说步骤」的风格叫声明式编程,也是 SQL 和大多数编程语言最大的不同。

主流的关系型数据库有 MySQL、PostgreSQL、SQLite、SQL Server 等,它们都支持 SQL 标准,但各自有一些扩展和差异(叫「方言」)。本教程的示例基于 SQLite:它无需安装服务器、单个文件就是一个数据库,是学习 SQL 最轻便的选择。教程中学到的 SELECT、WHERE、JOIN、GROUP BY 等核心语法在所有数据库里都通用;遇到方言差异较大的地方,文中会特别说明。

本教程围绕一个虚构的在线课程平台展开,全篇使用同一套三张表:students(学生,含姓名、年龄、城市、班级、注册日期)、courses(课程,含标题、分类、价格)、orders(订单,含学生 id、课程 id、金额、状态、下单日期)。部分字段刻意留了空值(NULL),方便演示真实的查询场景。你可以安装 SQLite 后在终端输入 sqlite3 跟着练习,也可以在任何在线 SQLite 环境里运行这些示例。

示例

第一条 SQL:查看当前 SQLite 的版本,再列出学生表的全部内容。SELECT 是查询的关键字,FROM 后面跟表名,星号表示「所有列」:

SELECT sqlite_version();

SELECT * FROM students;

再看看课程表和订单表,记住这三张表,后面的章节会一直用它们:

SELECT * FROM courses;

SELECT * FROM orders;

常见坑

  • 把 SQL 和数据库软件混为一谈:SQL 是语言,MySQL、SQLite 是实现这种语言的软件,就像「英语」和「说英语的人」的关系。说「我在用 SQL 数据库」通常指某个具体的关系型数据库。
  • 以为 SQL 关键字区分大小写:select 和 SELECT 效果相同,关键字不区分大小写(社区习惯大写关键字以便阅读);但字符串值是区分的,'北京' 和 'beijing' 是两个值。
  • 忽视方言差异:标准 SQL 到处通用,但分页写法、日期函数、字符串拼接等细节各数据库不同。学的时候以标准为主,用时查目标数据库的文档。
  • 只看不动手:SQL 是练出来的。每条示例都亲自敲一遍、改改条件再看结果,比读十遍教程有效。

小结

关系型数据库用表存数据,SQL 是查询这些表的声明式标准语言;本教程基于 SQLite,围绕 students、courses、orders 三张表演示。下一节正式开始查询:SELECT 基础。