SQL 查询语句是数据库操作中最基本也是最常用的部分,主要用于从数据库中检索数据。
1. 基本查询语法
语法结构:
SELECT column1, column2, ...
FROM table_name
WHERE condition
GROUP BY column_name
HAVING condition
ORDER BY column_name [ASC|DESC]
LIMIT number;
2. 语法分解和案例
1. 简单查询
从表中查询指定列的数据。
SELECT name, age
FROM users;
解释:查询表 users 中的 name 和 age 列。
2. 条件查询
通过 WHERE 子句筛选满足条件的数据。
SELECT name, age
FROM users
WHERE age > 25 AND city = 'New York';
解释:查询 users 表中 age 大于 25 且 city 为 ‘New York’ 的记录。
3. 去重查询
使用 DISTINCT 去掉重复数据。
SELECT DISTINCT city
FROM users;
解释:查询 users 表中所有不重复的 city。
4. 排序查询
通过 ORDER BY 子句对查询结果排序。
SELECT name, age
FROM users
ORDER BY age DESC;
解释:查询 users 表中的 name 和 age,并按年龄从大到小排序。
5. 分组查询
通过 GROUP BY 子句对数据分组。
SELECT city, COUNT(*) AS user_count
FROM users
GROUP BY city;
解释:统计 users 表中每个城市的用户数量。
6. 分组过滤
通过 HAVING 子句筛选分组后的数据。
SELECT city, COUNT(*) AS user_count
FROM users
GROUP BY city
HAVING user_count > 10;
解释:只显示用户数量大于 10 的城市及其统计值。
7. 分页查询
使用 LIMIT 实现分页。
SELECT name, age
FROM users
ORDER BY age DESC
LIMIT 5;
解释:查询年龄最大的前 5 个用户。
8. 联表查询
(1) 内连接
SELECT u.name, o.order_id, o.amount
FROM users u
INNER JOIN orders o ON u.id = o.user_id;
解释:查询用户及其订单信息。
(2) 左连接
SELECT u.name, o.order_id
FROM users u
LEFT JOIN orders o ON u.id = o.user_id;
解释:查询所有用户及其对应订单(无订单的用户也会显示)。
(3) 右连接
SELECT u.name, o.order_id
FROM users u
RIGHT JOIN orders o ON u.id = o.user_id;
解释:查询所有订单及其对应用户(无用户的订单也会显示)。
(4) 全连接(部分数据库支持)
SELECT u.name, o.order_id
FROM users u
FULL JOIN orders o ON u.id = o.user_id;
解释:显示所有用户和订单信息,包括不匹配的记录。
3. 注意事项
1. SQL 区分大小写:
SQL 关键字对大小写不敏感(如 SELECT 和 select 等效)。
表名、列名是否区分大小写,取决于数据库设置。
2. NULL 值处理:
NULL 不等于 0 或空字符串。
使用 IS NULL 或 IS NOT NULL 检查 NULL 值。
SELECT name FROM users WHERE phone_number IS NULL;
3. 防止 SQL 注入:
永远不要将用户输入直接拼接到 SQL 查询中。
使用参数化查询代替拼接字符串。
4. 性能优化:
避免 SELECT *,只查询需要的列。
对经常查询的列添加索引(如主键、外键、条件列)。
使用 EXPLAIN 分析查询性能。
5. 表别名的使用:
使用别名使 SQL 更简洁易读,特别是在联表查询时。
SELECT u.name, o.amount
FROM users AS u
JOIN orders AS o ON u.id = o.user_id;
6. 分组和排序的顺序:
如果使用了 GROUP BY,ORDER BY 应作用于分组后的数据。
7. 避免笛卡尔积:
联表时如果忘记指定 ON 条件,可能会导致笛卡尔积,查询结果数据量急剧膨胀。
4. 综合案例
需求:
查询年龄大于 30 岁的用户,统计每个城市的用户数量,按用户数量降序排序,只显示用户数量大于 5 的城市前 3 个。
SQL 实现:
SELECT city, COUNT(*) AS user_count
FROM users
WHERE age > 30
GROUP BY city
HAVING user_count > 5
ORDER BY user_count DESC
LIMIT 3;
解释:
1. WHERE 筛选年龄大于 30 的用户。
2. GROUP BY 按城市分组。
3. HAVING 筛选用户数量大于 5 的城市。
4. ORDER BY 按用户数量降序排序。
5. LIMIT 返回前 3 个结果。
掌握这些基础语法后,可以根据需求组合使用不同语句,完成复杂的查询任务。