1. SQL基础语句全景指南
作为与数据打交道的开发者,SQL就像我们手中的瑞士军刀。无论你是需要快速查询某个用户信息,还是处理百万级数据的分析报表,掌握基础SQL语句都能让你事半功倍。我在金融、电商等多个行业的数据库实践中发现,80%的日常操作其实都围绕着20%的核心语法展开。下面就来系统梳理这些真正高频使用的SQL语句。
提示:所有示例基于标准SQL语法,在MySQL、PostgreSQL、SQL Server等主流数据库中均可运行,部分语法可能需要微调
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 数据查询基础
2.1 SELECT语句核心用法
SELECT是SQL中使用频率最高的语句,没有之一。它的基础结构如下:
sql复制SELECT 列名1, 列名2
FROM 表名
WHERE 条件
ORDER BY 排序字段
LIMIT 返回行数;
实际案例:查询用户表中年龄大于18岁的用户姓名和电话,按注册时间倒序排列,只返回前10条
sql复制SELECT username, mobile
FROM users
WHERE age > 18
ORDER BY register_time DESC
LIMIT 10;
关键技巧:
- 使用
AS给列设置别名:SELECT username AS 用户名 - 合并多列数据:
SELECT CONCAT(last_name, first_name) AS full_name - 在WHERE中避免使用函数计算,会导致索引失效
2.2 条件查询进阶
WHERE子句支持多种条件组合方式:
sql复制-- 基本比较
WHERE price > 100
-- 范围查询
WHERE age BETWEEN 18 AND 30
-- 枚举查询
WHERE status IN ('active', 'pending')
-- 模糊查询
WHERE name LIKE '张%' -- 张开头
WHERE name LIKE '%小明%' -- 包含小明
WHERE name LIKE '王_' -- 王开头且两个字
-- 逻辑组合
WHERE (age > 18 OR vip = 1) AND status = 'active'
注意:LIKE查询中
%表示任意多个字符,_表示单个字符。前导百分号(%xxx)会导致全表扫描
3. 数据操作语句
3.1 增删改查完整流程
插入数据的三种方式:
sql复制-- 指定列插入
INSERT INTO users(username, email)
VALUES ('张三', 'zhangsan@example.com');
-- 全列插入(需提供所有字段)
INSERT INTO users VALUES(1, '张三', 'zhangsan@example.com',...);
-- 批量插入(性能最优)
INSERT INTO users(username, email) VALUES
('李四', 'lisi@example.com'),
('王五', 'wangwu@example.com');
更新数据的注意事项:
sql复制UPDATE products
SET price = price * 0.9, -- 打9折
stock = stock - 1
WHERE product_id = 100
AND stock > 0; -- 重要:避免库存为负
删除数据的安全做法:
sql复制-- 先查询确认要删除的数据
SELECT * FROM logs WHERE create_time < '2020-01-01';
-- 实际删除(建议添加LIMIT防止误操作)
DELETE FROM logs
WHERE create_time < '2020-01-01'
LIMIT 1000;
3.2 事务处理实例
银行转账的典型事务示例:
sql复制BEGIN TRANSACTION;
UPDATE accounts
SET balance = balance - 1000
WHERE user_id = 'A' AND balance >= 1000;
UPDATE accounts
SET balance = balance + 1000
WHERE user_id = 'B';
COMMIT;
-- 如果任一UPDATE失败会自动回滚
4. 高级查询技巧
4.1 聚合函数实战
常用聚合函数及使用场景:
sql复制-- 基础统计
SELECT
COUNT(*) AS total_users,
AVG(age) AS avg_age,
MAX(balance) AS max_balance,
SUM(amount) AS total_amount
FROM users;
-- 分组统计
SELECT
department,
COUNT(*) AS emp_count,
AVG(salary) AS avg_salary
FROM employees
GROUP BY department
HAVING COUNT(*) > 5; -- 过滤分组结果
易错点:
- WHERE在分组前过滤,HAVING在分组后过滤
- GROUP BY的列必须出现在SELECT中(除非是聚合函数)
4.2 多表连接查询
三种连接方式的对比:
sql复制-- 内连接(只返回匹配行)
SELECT o.order_id, u.username
FROM orders o
INNER JOIN users u ON o.user_id = u.user_id;
-- 左连接(返回左表所有行)
SELECT u.username, o.order_id
FROM users u
LEFT JOIN orders o ON u.user_id = o.user_id;
-- 全连接(返回所有行)
SELECT u.username, o.order_id
FROM users u
FULL OUTER JOIN orders o ON u.user_id = o.user_id;
性能优化建议:
- 连接字段必须建立索引
- 大表连接时先过滤再连接
- 避免连接超过3个表,考虑拆分为多个查询
5. 实用语句合集
5.1 数据定义语句
sql复制-- 创建表
CREATE TABLE employees (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50) NOT NULL,
salary DECIMAL(10,2) DEFAULT 0,
hire_date DATE,
INDEX idx_name (name) -- 创建索引
);
-- 修改表结构
ALTER TABLE employees
ADD COLUMN department VARCHAR(30),
MODIFY COLUMN salary DECIMAL(12,2);
-- 创建视图
CREATE VIEW active_users AS
SELECT * FROM users WHERE status = 'active';
5.2 数据库维护语句
sql复制-- 备份表
CREATE TABLE users_backup AS SELECT * FROM users;
-- 清空表(不可回滚)
TRUNCATE TABLE logs;
-- 分析表(优化查询)
ANALYZE TABLE users;
-- 查看执行计划
EXPLAIN SELECT * FROM users WHERE age > 18;
6. 面试常见问题解析
6.1 高频面试题精解
问题1:找出每个部门薪资最高的员工
sql复制SELECT e.*
FROM employees e
WHERE e.salary = (
SELECT MAX(salary)
FROM employees
WHERE department = e.department
);
问题2:计算连续登录天数
sql复制WITH login_dates AS (
SELECT DISTINCT user_id, login_date
FROM user_logins
)
SELECT user_id, MAX(streak) AS max_streak
FROM (
SELECT
user_id,
COUNT(*) OVER (
PARTITION BY user_id, date_group
) AS streak
FROM (
SELECT
user_id,
login_date,
login_date - INTERVAL ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY login_date) DAY AS date_group
FROM login_dates
) t
) t2
GROUP BY user_id;
6.2 SQL优化要点
-
索引使用原则:
- 为WHERE、JOIN、ORDER BY的列建索引
- 避免在索引列上使用函数
- 使用覆盖索引(查询列都在索引中)
-
查询优化技巧:
sql复制-- 反例:全表扫描 SELECT * FROM users WHERE YEAR(create_time) = 2023; -- 正例:范围查询 SELECT * FROM users WHERE create_time BETWEEN '2023-01-01' AND '2023-12-31'; -
分页查询优化:
sql复制-- 低效写法 SELECT * FROM logs LIMIT 1000000, 10; -- 高效写法(使用索引列过滤) SELECT * FROM logs WHERE id > 1000000 ORDER BY id LIMIT 10;
7. 安全注意事项
7.1 SQL注入防护
危险写法:
php复制$sql = "SELECT * FROM users WHERE username = '$username'";
防护方案:
-
使用参数化查询:
python复制# Python示例 cursor.execute("SELECT * FROM users WHERE username = %s", (username,)) -
输入验证:
java复制// Java示例 if (!username.matches("[a-zA-Z0-9_]+")) { throw new IllegalArgumentException("Invalid username"); } -
最小权限原则:数据库用户只授予必要权限
7.2 生产环境操作规范
- 所有DELETE/UPDATE语句必须先SELECT确认
- 重要操作前先备份数据
- 大表操作在低峰期进行
- 使用事务保证数据一致性
我在处理电商促销系统时曾遇到过这样的案例:凌晨批量更新商品价格时,因为没有限制WHERE条件,导致全表商品被打1折。幸亏有事务机制及时回滚,否则将造成上千万元损失。这个教训让我深刻理解到SQL操作安全的重要性。
