讲解

SELECT 是 SQL 里使用频率最高的语句,作用是「从表里取出数据」。最基本的形式是 SELECT 列名列表 FROM 表名:SELECT name, age FROM students 表示只要姓名和年龄两列。想取全部列可以用星号 SELECT * FROM students,星号是「所有列」的通配写法,自己探索数据时很方便。

SELECT 后面不只能写列名,还能写表达式:对列做四则运算、拼接常量,数据库会对每一行算出结果。比如 SELECT title, price, price * 0.8 FROM courses 会在结果里多出一列「打八折后的价格」。这个表达式列没有名字时显示会很丑,可以用 AS 给它起别名(后面有专门一章讲别名)。

SELECT 甚至可以不查任何表:SELECT 1 + 1 直接返回 2。这个特性常用来测试数据库连接是否正常,也可以用来计算纯表达式的值。要注意查询只是「读」数据——无论执行多少次 SELECT,表里的内容都不会变,可以放心大胆地试。

示例

指定列查询,只要名字和年龄:

SELECT name, age FROM students;

在 SELECT 里做计算:给每门课算一个八折价,顺便用 AS 起个好看的列名:

SELECT title, price, price * 0.8 AS sale_price FROM courses;

不查表的纯表达式查询,常用于验证连接:

SELECT 1 + 1 AS result, '你好,SQL' AS greeting;

常见坑

  • **在生产环境滥用 SELECT ***:星号会把不需要的列也查出来,浪费网络传输,还会让代码在表结构变化时行为改变。探索阶段随便用,写进程序的查询要列出明确列名。
  • 列名拼写错误:SELECT naem FROM students 会直接报错「no such column」。报错信息里列出了出错的列名,照着改即可。
  • 命令行里忘记分号:在 sqlite3 等命令行工具里,语句要以分号结尾才会执行;少了分号会一直停在续行提示符,像「卡住了」。在程序代码里调用则通常不需要分号。
  • 担心查询改坏数据:SELECT 是只读操作,执行一万次也不会动数据。真正会改数据的是 INSERT、UPDATE、DELETE,后面有专门章节。

小结

SELECT 列 FROM 表 是最基本的查询;星号取全部列,表达式可以对每行做计算,纯表达式查询不依赖任何表。下一节学习用 WHERE 筛选出想要的行。