SQL 查询语法笔记

2025-01-25 · 数据库

整理一下关系型数据库中常用的 SELECT 查询语法,以便日常需要时快速翻看。例子都用一个虚构的学生表 students

基本查询

SELECT * FROM students;
SELECT id, name, age FROM students;
SELECT name AS student_name FROM students;

条件筛选(WHERE)

SELECT * FROM students WHERE age > 18;
SELECT * FROM students WHERE name = '小明';
SELECT * FROM students WHERE age BETWEEN 18 AND 22;
SELECT * FROM students WHERE name LIKE '王%';
SELECT * FROM students WHERE city IN ('北京', '上海');
SELECT * FROM students WHERE age IS NULL;

注意 NULL 不能用 = NULL 判断,必须用 IS NULL

排序(ORDER BY)

SELECT * FROM students ORDER BY age;        -- 升序(默认)
SELECT * FROM students ORDER BY age DESC;   -- 降序
SELECT * FROM students ORDER BY age DESC, name ASC;  -- 多字段

限制条数(LIMIT)

SELECT * FROM students LIMIT 10;          -- 前 10 条
SELECT * FROM students LIMIT 10 OFFSET 20;-- 跳过 20 条取 10 条

聚合与分组

SELECT COUNT(*) FROM students;
SELECT AVG(age), MAX(age), MIN(age) FROM students;
SELECT city, COUNT(*) FROM students GROUP BY city;
SELECT city, COUNT(*) AS n FROM students
  GROUP BY city
  HAVING n > 5;

WHERE 在分组前过滤,HAVING 在分组后过滤。这是初学时最容易搞混的点。

联接(JOIN)

假设有两张表:students(学生) 和 scores(成绩),通过 student_id 关联。

-- 内连接(只保留两边都有的)
SELECT s.name, sc.subject, sc.score
FROM students s
INNER JOIN scores sc ON s.id = sc.student_id;

-- 左连接(保留左表全部,右表没匹配的为 NULL)
SELECT s.name, sc.score
FROM students s
LEFT JOIN scores sc ON s.id = sc.student_id;

去重

SELECT DISTINCT city FROM students;

子查询

-- 查比平均年龄大的学生
SELECT * FROM students
WHERE age > (SELECT AVG(age) FROM students);

-- 查在 scores 表里有记录的学生
SELECT * FROM students
WHERE id IN (SELECT student_id FROM scores);

常用约定

  • SQL 关键字习惯大写,字段和表名小写,提高可读性。
  • 每条 SQL 末尾加分号;多条语句拼一起时是必须的。
  • 注释:-- 单行/* 多行 */
  • 不同数据库(MySQL / PostgreSQL / SQLite)在分页、字符串拼接、日期函数等细节上有差异,具体场景查对应文档。

小结

SELECT 的执行顺序大致是 FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY → LIMIT。理解这个顺序对写复杂查询很有帮助,尤其是当出现"无法在 WHERE 里用别名"这类错误时,记住这个顺序就能避免。

← 返回笔记列表