MySQL数据库的查询语句(SQL)是数据操作的核心,其语法结构既简洁又强大,以下是详细的查询语句写法解析:
基本查询结构
-
SELECT子句:指定要检索的列,支持多种表达形式:
- 查询所有列:
SELECT FROM table_name;
- 查询特定列:
SELECT column1, column2 FROM table_name;
- 为列设置别名:
SELECT column1 AS alias1 FROM table_name;
- 查询所有列:
-
FROM子句:指定数据来源的表,支持单表或多表联合查询:
- 单表查询:
SELECT FROM employees;
- 多表连接查询:
SELECT a.name, b.department FROM employees a JOIN departments b ON a.dept_id = b.id;
- 单表查询:
-
WHERE子句:过滤数据,支持逻辑运算符(AND/OR)和通配符:
- 等于条件:
SELECT FROM users WHERE id = 100;
- 模糊匹配:
SELECT name FROM products WHERE name LIKE '%Phone%';
(匹配包含”Phone”的记录) - 空值处理:
SELECT FROM orders WHERE customer_id IS NOT NULL;
- 等于条件:
高级查询功能
-
聚合函数与分组
- 常用聚合函数:
| 函数 | 作用 | 示例 |
|———-|———————-|——————————-|
| COUNT() | 统计行数 |SELECT COUNT() FROM users;
|
| SUM() | 求和 |SELECT SUM(price) FROM orders;
|
| AVG() | 平均值 |SELECT AVG(salary) FROM staff;
|
| MAX() | 最大值 |SELECT MAX(score) FROM students;
|
| MIN() | 最小值 |SELECT MIN(date) FROM logs;
| - 分组查询:
SELECT department, AVG(salary) FROM employees GROUP BY department HAVING AVG(salary) > 5000;
- 常用聚合函数:
-
排序与分页
- 升序/降序:
SELECT FROM products ORDER BY price ASC, name DESC;
- 分页限制:
SELECT FROM users LIMIT 10 OFFSET 20;
(获取第21-30条记录)
- 升序/降序:
-
多表连接查询
- 内连接(INNER JOIN):仅返回匹配记录
SELECT o.order_id, c.name FROM orders o JOIN customers c ON o.customer_id = c.id;
- 左外连接(LEFT JOIN):保留左表全部记录
SELECT e.name, d.department FROM employees e LEFT JOIN departments d ON e.dept_id = d.id;
- 自连接:表与自身关联
SELECT a.name AS Employee, b.name AS Manager FROM employees a JOIN employees b ON a.manager_id = b.id;
- 内连接(INNER JOIN):仅返回匹配记录
复杂查询场景
-
子查询
- 在WHERE子句中使用:
SELECT FROM products WHERE price > (SELECT AVG(price) FROM products);
- 在FROM子句中使用:
SELECT dept, COUNT() FROM (SELECT dept, employee_id FROM employees) AS sub GROUP BY dept;
- 在WHERE子句中使用:
-
动态条件查询
- 使用逻辑运算符组合条件:
SELECT FROM users WHERE (age > 18 AND country = 'US') OR (age > 25 AND status = 'VIP');
- 使用逻辑运算符组合条件:
-
数学运算与字符串处理
- 算术表达式:
SELECT salary 1.2 AS raise FROM employees;
- 字符串拼接:
SELECT CONCAT(first_name, ' ', last_name) AS full_name FROM users;
- 算术表达式:
性能优化建议
-
索引使用:对高频查询字段建立索引,如:
CREATE INDEX idx_users_email ON users(email);
-
避免SELECT :明确指定需要的列,减少数据传输量:
- 低效:
SELECT FROM orders WHERE customer_id = 100;
- 高效:
SELECT id, date, total FROM orders WHERE customer_id = 100;
- 低效:
-
合理设计JOIN:
- 优先使用INNER JOIN代替OUTER JOIN
- 确保连接字段已建立索引
常见错误规避
-
字段名冲突:多表查询时使用表别名:
SELECT a.id, b.name FROM table1 a JOIN table2 b ON a.ref_id = b.id;
-
数据类型匹配:确保比较值与字段类型一致:
- 错误:
WHERE price = '100'
(price为数值类型) - 正确:
WHERE price = 100
或WHERE price = CAST('100' AS UNSIGNED)
- 错误:
FAQs
Q1:如何提升复杂查询的执行速度?
A1:可通过以下方式优化:
- 建立联合索引(如:
CREATE INDEX idx_orders_customer_date ON orders(customer_id, order_date);
) - 分解大查询为多个小查询
- 使用EXPLAIN分析执行计划
- 避免在WHERE子句中使用函数(如:
WHERE YEAR(date) = 2023
改为WHERE date BETWEEN '2023-01-01' AND '2023-12-31'
)
Q2:如何消除查询结果中的重复记录?
A2:使用DISTINCT关键字或GROUP BY:
- 消除完全重复:
SELECT DISTINCT country FROM users;
- 按字段分组去重:`SELECT department, COUNT() FROM employees GROUP BY department;
原创文章,发布者:酷盾叔,转转请注明出处:https://www.kd.cn/ask/68177.html