MySQL是常用的关系型数据库,查询操作是使用频率最高的功能,掌握常用查询示例能快速应对大部分基础数据获取需求。下面通过具体场景和代码演示常见查询的写法。

基础全表查询
最基础的查询是获取表中所有数据,使用SELECT *语法即可,星号代表所有字段。假设我们有一个用户表user,结构如下:
-- 创建用户表示例
CREATE TABLE user (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50) NOT NULL,
age INT,
city VARCHAR(50),
salary DECIMAL(10,2)
);
-- 插入测试数据
INSERT INTO user (name, age, city, salary) VALUES
('张三', 25, '北京', 8000.00),
('李四', 30, '上海', 12000.00),
('王五', 22, '北京', 6500.00),
('赵六', 35, '广州', 15000.00),
('钱七', 28, '上海', 10000.00);
查询所有用户数据的SQL如下:
-- 全表查询 SELECT * FROM user;
指定字段查询
如果只需要获取部分字段,可以把星号替换成具体的字段名,多个字段用逗号分隔:
-- 查询用户的姓名和城市 SELECT name, city FROM user;
带WHERE条件过滤查询
实际场景中往往需要筛选符合条件的数据,使用WHERE子句添加过滤条件,支持等于、大于、小于、不等于、模糊匹配等操作。
等值条件查询
查询城市为北京的用户:
-- 查询北京的用户 SELECT * FROM user WHERE city = '北京';
范围条件查询
查询年龄大于25岁的用户:
-- 查询年龄大于25的用户 SELECT * FROM user WHERE age > 25;
模糊匹配查询
查询姓名中包含三的用户,使用LIKE关键字配合百分号通配符:
-- 查询姓名包含三的用户 SELECT * FROM user WHERE name LIKE '%三%';
排序查询
查询到的数据默认是无序的,使用ORDER BY子句可以对结果排序,ASC代表升序,DESC代表降序,默认是升序。
查询所有用户,按照工资从高到低排序:
-- 按工资降序排序 SELECT * FROM user ORDER BY salary DESC;
也可以先按城市升序排序,同城市的再按年龄升序排序:
-- 多字段排序 SELECT * FROM user ORDER BY city ASC, age ASC;
分组统计查询
使用GROUP BY子句可以对数据进行分组,结合聚合函数实现统计需求,常见的聚合函数有COUNT统计数量、SUM求和、AVG求平均值、MAX求最大值、MIN求最小值。
统计每个城市的用户数量:
-- 按城市分组统计用户数 SELECT city, COUNT(*) AS user_count FROM user GROUP BY city;
统计每个城市的平均工资:
-- 按城市分组统计平均工资 SELECT city, AVG(salary) AS avg_salary FROM user GROUP BY city;
如果需要对分组后的结果进行过滤,要使用HAVING子句,而不是WHERE,WHERE是在分组前过滤数据,HAVING是在分组后过滤。
查询用户数量大于1的城市:
-- 分组后过滤 SELECT city, COUNT(*) AS user_count FROM user GROUP BY city HAVING user_count > 1;
分页查询
当数据量很大时,需要分页展示数据,使用LIMIT子句实现分页,第一个参数表示偏移量,第二个参数表示每页的数据条数。
查询前3条用户数据:
-- 查询前3条数据 SELECT * FROM user LIMIT 0, 3;
查询第2页的数据,每页3条:
-- 查询第2页数据,偏移量为3 SELECT * FROM user LIMIT 3, 3;
多表关联查询
实际业务中数据往往分布在多个表中,需要通过关联查询获取完整数据。假设我们有一个订单表order_info,存储用户的订单信息:
-- 创建订单表
CREATE TABLE order_info (
order_id INT PRIMARY KEY AUTO_INCREMENT,
user_id INT,
product_name VARCHAR(100),
amount DECIMAL(10,2),
FOREIGN KEY (user_id) REFERENCES user(id)
);
-- 插入测试订单数据
INSERT INTO order_info (user_id, product_name, amount) VALUES
(1, '手机', 2999.00),
(1, '耳机', 399.00),
(2, '电脑', 6999.00),
(3, '平板', 3999.00);
查询用户和对应的订单信息,使用内连接INNER JOIN:
-- 内连接查询用户和订单 SELECT u.name, u.city, o.product_name, o.amount FROM user u INNER JOIN order_info o ON u.id = o.user_id;
如果需要查询所有用户,即使没有订单也显示用户信息,可以使用左连接LEFT JOIN:
-- 左连接查询所有用户及订单 SELECT u.name, u.city, o.product_name, o.amount FROM user u LEFT JOIN order_info o ON u.id = o.user_id;