【MySQL 查询语句详解】
文章目录
一、MySQL 查询语法
在 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
:限制返回的行数,可用于分页查询。
二、常见查询操作
1. 查询所有列
查询表中的所有数据:
SELECT * FROM employees;
✅ 使用 *
查询所有列,但在实际项目中不建议使用,效率较低,且容易导致冗余数据传输。
2. 查询指定列
查询指定的列:
SELECT name, age, salary FROM employees;
✅ 只查询所需的列,提高查询效率。
3. 使用别名
使用 AS
给列或表起别名:
SELECT name AS 姓名, age AS 年龄 FROM employees;
✅ 别名在查询结果中显示为指定名称。
三、条件查询(WHERE
)
WHERE
子句用于指定查询条件。
1. 使用比较运算符
=
:等于!=
/<=>
:不等于<
、>
:小于、大于<=
、>=
:小于等于、大于等于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
。
2. 逻辑运算符
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
)
1. 分组查询
GROUP BY
将查询结果按指定字段进行分组:
-- 按性别分组统计人数
SELECT gender, COUNT(*) AS 总人数
FROM employees
GROUP BY gender;
2. 分组过滤(HAVING
)
HAVING
对分组后的结果进行过滤:
-- 查询人数大于5的性别
SELECT gender, COUNT(*) AS 总人数
FROM employees
GROUP BY gender
HAVING COUNT(*) > 5;
✅ 与 WHERE
区别:
WHERE
是在分组前过滤数据。HAVING
是在分组后过滤数据。
七、多表连接查询
1. 内连接(INNER JOIN
)
查询两个表中匹配的记录:
SELECT e.name, d.dept_name
FROM employees e
INNER JOIN departments d ON e.dept_id = d.id;
2. 左连接(LEFT JOIN
)
查询左表所有记录,右表没有匹配时以 NULL
补充:
SELECT e.name, d.dept_name
FROM employees e
LEFT JOIN departments d ON e.dept_id = d.id;
3. 右连接(RIGHT JOIN
)
查询右表所有记录,左表没有匹配时以 NULL
补充:
SELECT e.name, d.dept_name
FROM employees e
RIGHT JOIN departments d ON e.dept_id = d.id;
八、子查询
子查询即嵌套查询,常用于复杂查询。
1. 在 WHERE
中使用子查询
-- 查询工资高于平均工资的员工
SELECT * FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees);
2. 在 FROM
中使用子查询
-- 查询部门人数
SELECT dept_id, COUNT(*) AS 人数
FROM (SELECT * FROM employees WHERE age > 30) AS older_employees
GROUP BY dept_id;
原文地址:https://blog.csdn.net/qq_66726657/article/details/147138154
免责声明:本站文章内容转载自网络资源,如侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!