最简可用的select语句必须包含select和from两部分;表名需存在且有权限,字段需显式指定(避免select *),where筛选需注意null处理、字符串加引号、逻辑优先级加括号,order by应配合limit并考虑重复值排序稳定性。

SELECT 查询不是“写出来就行”,关键在于明确你要什么、从哪取、要不要筛——写错一个关键字或漏掉分号,整条语句就执行失败。
SELECT 语句的基本结构长什么样
最简可用的 SELECT 必须包含 SELECT 和 FROM 两部分,缺一不可。数据库不会猜你想要哪张表,也不会默认返回所有列(除非你显式写 *)。
-
SELECT *看起来省事,但生产环境应避免——字段顺序可能变、传输冗余数据、影响后续 JOIN 或 ORDER BY 的可读性 - 表名必须存在且当前用户有查询权限,否则报错
table not found或permission denied - SQL 语句结尾的分号
;在多数客户端(如 psql、MySQL CLI)是必需的,少写会卡住不执行
WHERE 条件里常见的坑
WHERE 是筛选行的唯一入口,但它对 NULL 值完全失效:任何与 NULL 的比较(=、!=、>)结果都是 UNKNOWN,不满足条件,所以查不到。
- 查 NULL 要用
IS NULL或IS NOT NULL,不能写column = NULL - 字符串匹配别忘了引号:
WHERE name = 'Alice',漏掉单引号会当成列名报错column "Alice" does not exist - 多个条件用
AND/OR连接时,优先级容易出错;不确定就加括号,比如WHERE status = 'active' AND (score > 80 OR score IS NULL)
ORDER BY 和 LIMIT 怎么配合用才安全
ORDER BY 不带 LIMIT 可能返回几万行,拖慢查询甚至卡死客户端;而只写 LIMIT 不加 ORDER BY,结果顺序是不确定的——数据库不保证物理存储顺序就是返回顺序。
-
LIMIT 10在 PostgreSQL 中写法相同,MySQL 也支持;但 SQL Server 要用TOP 10,注意方言差异 - 排序字段如果有重复值(比如多个用户同为 25 岁),
ORDER BY age后再LIMIT 5每次执行可能返回不同用户——需要加二级排序,如ORDER BY age, id - 别在
WHERE里用函数操作字段来匹配(如WHERE UPPER(name) = 'ALICE'),这会让索引失效;优先用大小写不敏感的 collation 或建函数索引
实际写 SELECT 时,最容易被忽略的是隐式类型转换:比如把字符串 '2023-01-01' 和日期字段比较,某些数据库会自动转,有些直接报错;与其依赖行为,不如显式用 CAST(date_str AS DATE) 或日期字面量 DATE '2023-01-01'。










