自学内容网 自学内容网

【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 BYHAVING

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)!