在 MySQL 中,查询语句以 SELECT
开头,基本语法结构如下:
SELECT 列名1, 列名2, ...
FROM 表名
WHERE 条件
GROUP BY 列名
HAVING 条件
ORDER BY 列名 [ASC|DESC]
LIMIT 偏移量, 行数;
解释:
SELECT
:指定要查询的列,如果查询所有列可用 *
代替。FROM
:指定数据来源的表。WHERE
:指定筛选条件。GROUP BY
:对结果进行分组。HAVING
:对分组后的结果进行过滤。ORDER BY
:对结果进行排序,默认升序 ASC
,降序为 DESC
。LIMIT
:限制返回的行数,可用于分页查询。查询表中的所有数据:
SELECT * FROM employees;
✅ 使用 *
查询所有列,但在实际项目中不建议使用,效率较低,且容易导致冗余数据传输。
查询指定的列:
SELECT name, age, salary FROM employees;
✅ 只查询所需的列,提高查询效率。
使用 AS
给列或表起别名:
SELECT name AS 姓名, age AS 年龄 FROM employees;
✅ 别名在查询结果中显示为指定名称。
WHERE
)WHERE
子句用于指定查询条件。
=
:等于!=
/ <=>
:不等于<
、>
:小于、大于<=
、>=
:小于等于、大于等于BETWEEN
:在某个范围内IN
:在指定集合内LIKE
:模糊匹配IS NULL
/ IS NOT NULL
:判断是否为空示例:
-- 查询年龄大于30的员工
SELECT * FROM employees
WHERE age > 30;
-- 查询工资在5000到10000之间
SELECT * FROM employees
WHERE salary BETWEEN 5000 AND 10000;
-- 查询姓张的员工
SELECT * FROM employees
WHERE name LIKE '张%';
-- 查询员工姓名为 null 的记录
SELECT * FROM employees
WHERE name IS NULL;
✅ BETWEEN
是包含边界值的,如 BETWEEN 10 AND 20
等同于 >=10 AND <=20
。
AND
:与(所有条件都成立)OR
:或(任一条件成立)NOT
:取反示例:
-- 查询年龄大于30且工资超过8000的员工
SELECT * FROM employees
WHERE age > 30 AND salary > 8000;
-- 查询年龄小于25或工资小于5000的员工
SELECT * FROM employees
WHERE age < 25 OR salary < 5000;
-- 查询不是30岁的人
SELECT * FROM employees
WHERE NOT age = 30;
ORDER BY
)ORDER BY
用于对查询结果进行排序:
ASC
:升序(默认)DESC
:降序-- 按年龄升序排序
SELECT * FROM employees
ORDER BY age ASC;
-- 按工资降序排序
SELECT * FROM employees
ORDER BY salary DESC;
✅ 可以按多个字段排序:
-- 先按年龄升序,再按工资降序
SELECT * FROM employees
ORDER BY age ASC, salary DESC;
LIMIT
)LIMIT
用于限制查询结果的行数,常用于分页。
LIMIT 偏移量, 行数;
-- 查询前5条数据
SELECT * FROM employees
LIMIT 0, 5;
-- 查询第6到第10条数据
SELECT * FROM employees
LIMIT 5, 5;
✅ LIMIT
分页公式:
page
pageSize
(page - 1) * pageSize
GROUP BY
和 HAVING
)GROUP BY
将查询结果按指定字段进行分组:
-- 按性别分组统计人数
SELECT gender, COUNT(*) AS 总人数
FROM employees
GROUP BY gender;
HAVING
)HAVING
对分组后的结果进行过滤:
-- 查询人数大于5的性别
SELECT gender, COUNT(*) AS 总人数
FROM employees
GROUP BY gender
HAVING COUNT(*) > 5;
✅ 与 WHERE
区别:
WHERE
是在分组前过滤数据。HAVING
是在分组后过滤数据。INNER JOIN
)查询两个表中匹配的记录:
SELECT e.name, d.dept_name
FROM employees e
INNER JOIN departments d ON e.dept_id = d.id;
LEFT JOIN
)查询左表所有记录,右表没有匹配时以 NULL
补充:
SELECT e.name, d.dept_name
FROM employees e
LEFT JOIN departments d ON e.dept_id = d.id;
RIGHT JOIN
)查询右表所有记录,左表没有匹配时以 NULL
补充:
SELECT e.name, d.dept_name
FROM employees e
RIGHT JOIN departments d ON e.dept_id = d.id;
子查询即嵌套查询,常用于复杂查询。
WHERE
中使用子查询-- 查询工资高于平均工资的员工
SELECT * FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees);
FROM
中使用子查询-- 查询部门人数
SELECT dept_id, COUNT(*) AS 人数
FROM (SELECT * FROM employees WHERE age > 30) AS older_employees
GROUP BY dept_id;