后端#SQL#数据库

SQL 基础速查

SQL 查询、聚合、连接与子查询常用语法


基本查询

SELECT column1, column2
FROM table_name
WHERE condition
ORDER BY column1 DESC
LIMIT 10 OFFSET 5;

条件过滤

-- 比较
WHERE age > 18 AND status = 'active'

-- 范围
WHERE price BETWEEN 10 AND 100

-- 列表
WHERE category IN ('tech', 'science')

-- 模糊匹配
WHERE name LIKE 'J%'          -- 以 J 开头
WHERE email LIKE '%@gmail.com' -- 以 @gmail.com 结尾

-- NULL
WHERE deleted_at IS NULL
WHERE deleted_at IS NOT NULL

聚合函数

SELECT
  category,
  COUNT(*) AS count,
  AVG(price) AS avg_price,
  MAX(price) AS max_price,
  SUM(quantity) AS total
FROM products
GROUP BY category
HAVING COUNT(*) > 5
ORDER BY count DESC;

连接

-- 内连接
SELECT o.id, u.name
FROM orders o
INNER JOIN users u ON o.user_id = u.id;

-- 左连接
SELECT u.name, o.id
FROM users u
LEFT JOIN orders o ON u.id = o.user_id;

-- 全外连接
SELECT a.name, b.value
FROM table_a a
FULL OUTER JOIN table_b b ON a.id = b.a_id;

子查询

-- WHERE 中的子查询
SELECT name FROM users
WHERE id IN (SELECT user_id FROM orders WHERE total > 100);

-- EXISTS
SELECT name FROM users u
WHERE EXISTS (
  SELECT 1 FROM orders o WHERE o.user_id = u.id
);

-- FROM 中的子查询
SELECT category, avg_price
FROM (
  SELECT category, AVG(price) AS avg_price
  FROM products
  GROUP BY category
) AS stats
WHERE avg_price > 50;

常用函数

-- 字符串
CONCAT(first_name, ' ', last_name)
LENGTH(text)
LOWER(email)
TRIM(text)

-- 日期
NOW()
CURRENT_DATE
DATE_FORMAT(created_at, '%Y-%m')
EXTRACT(YEAR FROM created_at)

-- 条件
COALESCE(nickname, username, 'Anonymous')
CASE WHEN score >= 90 THEN 'A' WHEN score >= 80 THEN 'B' ELSE 'C' END