02 SQL数据检索入门 - SELECT语句详解
本文是MySQL数据库系列教程的第二篇,将详细讲解如何使用SELECT语句检索数据。
上一篇: MySQL数据库基础入门指南
目录
一、SELECT语句基础
1.1 什么是SELECT语句
1.2 基本语法结构
二、检索单个列
2.1 基本用法
2.2 实战示例
三、检索多个列
3.1 指定多个列名
3.2 列的顺序
四、检索所有列
4.1 使用通配符*
4.2 使用场景与注意事项
五、去除重复值
5.1 DISTINCT关键字
5.2 多列去重
六、限制结果集
6.1 LIMIT子句
6.2 OFFSET偏移量
七、综合实战
一、SELECT语句基础
1.1 什么是SELECT语句
SELECT语句是SQL中最常用的命令,用于从数据库表中检索数据。
SELECT的作用:
- 从一个或多个表中查询数据
- 指定要返回哪些列
- 对结果进行过滤、排序和限制
- 是数据查询的核心工具
1.2 基本语法结构
SELECT 列名
FROM 表名;
语法说明:
SELECT
- 关键字,表示要检索数据列名
- 指定要查询的列FROM
- 关键字,指定数据来源表名
- 数据所在的表
二、检索单个列
2.1 基本用法
检索单个列是最简单的查询操作。
语法:
SELECT column_name FROM table_name;
2.2 实战示例
假设我们有一个员工表employees
:
-- 创建示例表
CREATE TABLE employees (emp_id INT PRIMARY KEY,emp_name VARCHAR(50),department VARCHAR(50),salary DECIMAL(10, 2),hire_date DATE
);-- 插入测试数据
INSERT INTO employees VALUES
(1, '张伟', '技术部', 8000.00, '2023-01-15'),
(2, '李娜', '市场部', 7000.00, '2023-02-20'),
(3, '王强', '技术部', 9000.00, '2023-03-10'),
(4, '赵敏', '人事部', 6500.00, '2023-04-05'),
(5, '刘洋', '市场部', 7500.00, '2023-05-12');
查询所有员工姓名:
SELECT emp_name FROM employees;
结果:
+----------+
| emp_name |
+----------+
| 张伟 |
| 李娜 |
| 王强 |
| 赵敏 |
| 刘洋 |
+----------+
查询所有员工的部门:
SELECT department FROM employees;
结果:
+------------+
| department |
+------------+
| 技术部 |
| 市场部 |
| 技术部 |
| 人事部 |
| 市场部 |
+------------+
三、检索多个列
3.1 指定多个列名
当需要查询多个列时,用逗号分隔列名。
语法:
SELECT column1, column2, column3 FROM table_name;
示例:查询员工姓名、部门和薪资
SELECT emp_name, department, salary
FROM employees;
结果:
+----------+------------+---------+
| emp_name | department | salary |
+----------+------------+---------+
| 张伟 | 技术部 | 8000.00 |
| 李娜 | 市场部 | 7000.00 |
| 王强 | 技术部 | 9000.00 |
| 赵敏 | 人事部 | 6500.00 |
| 刘洋 | 市场部 | 7500.00 |
+----------+------------+---------+
3.2 列的顺序
SELECT语句中列的顺序决定了结果显示的顺序。
示例:调整列的显示顺序
-- 先显示薪资,再显示姓名和部门
SELECT salary, emp_name, department
FROM employees;
结果:
+---------+----------+------------+
| salary | emp_name | department |
+---------+----------+------------+
| 8000.00 | 张伟 | 技术部 |
| 7000.00 | 李娜 | 市场部 |
| 9000.00 | 王强 | 技术部 |
| 6500.00 | 赵敏 | 人事部 |
| 7500.00 | 刘洋 | 市场部 |
+---------+----------+------------+
四、检索所有列
4.1 使用通配符*
使用星号*
可以检索表中的所有列,而不需要逐个列出列名。
语法:
SELECT * FROM table_name;
示例:查询员工表的所有信息
SELECT * FROM employees;
结果:
+--------+----------+------------+---------+------------+
| emp_id | emp_name | department | salary | hire_date |
+--------+----------+------------+---------+------------+
| 1 | 张伟 | 技术部 | 8000.00 | 2023-01-15 |
| 2 | 李娜 | 市场部 | 7000.00 | 2023-02-20 |
| 3 | 王强 | 技术部 | 9000.00 | 2023-03-10 |
| 4 | 赵敏 | 人事部 | 6500.00 | 2023-04-05 |
| 5 | 刘洋 | 市场部 | 7500.00 | 2023-05-12 |
+--------+----------+------------+---------+------------+
4.2 使用场景与注意事项
适合使用*
的场景:
- 快速查看表的所有数据
- 不确定表有哪些列
- 临时调试和测试
不建议使用*
的场景:
- 生产环境的应用程序
- 只需要部分列的数据
- 表中列很多但只需要少数几列
原因:
- 性能问题:检索不需要的列浪费资源
- 可维护性:明确列名使代码更清晰
- 应用兼容性:表结构变化可能导致问题
最佳实践:除非确实需要所有列,否则明确指定列名。
五、去除重复值
5.1 DISTINCT关键字
使用DISTINCT
关键字可以去除结果集中的重复行。
语法:
SELECT DISTINCT column_name FROM table_name;
示例:查询有哪些部门(不重复)
SELECT DISTINCT department FROM employees;
结果:
+------------+
| department |
+------------+
| 技术部 |
| 市场部 |
| 人事部 |
+------------+
对比:不使用DISTINCT
SELECT department FROM employees;
结果:
+------------+
| department |
+------------+
| 技术部 |
| 市场部 |
| 技术部 | -- 重复
| 人事部 |
| 市场部 | -- 重复
+------------+
5.2 多列去重
DISTINCT
作用于所有列,只有当所有指定列的组合完全相同时才会被去重。
示例:
-- 添加更多测试数据
INSERT INTO employees VALUES
(6, '孙丽', '技术部', 8000.00, '2023-06-15');-- 查询部门和薪资的组合(去重)
SELECT DISTINCT department, salary
FROM employees;
结果:
+------------+---------+
| department | salary |
+------------+---------+
| 技术部 | 8000.00 |
| 市场部 | 7000.00 |
| 技术部 | 9000.00 |
| 人事部 | 6500.00 |
| 市场部 | 7500.00 |
+------------+---------+
注意:虽然"技术部"出现多次,但因为薪资不同,所以不会被去重。
六、限制结果集
6.1 LIMIT子句
LIMIT
子句用于限制返回的行数,在处理大量数据时非常有用。
语法:
SELECT column_name
FROM table_name
LIMIT number;
示例:查询前3名员工
SELECT emp_name, salary
FROM employees
LIMIT 3;
结果:
+----------+---------+
| emp_name | salary |
+----------+---------+
| 张伟 | 8000.00 |
| 李娜 | 7000.00 |
| 王强 | 9000.00 |
+----------+---------+
6.2 OFFSET偏移量
OFFSET
指定从哪一行开始返回数据,常用于分页查询。
语法:
SELECT column_name
FROM table_name
LIMIT number OFFSET offset_value;-- 或者简写形式
SELECT column_name
FROM table_name
LIMIT offset_value, number;
示例:跳过前2条,返回3条数据
-- 方式1
SELECT emp_name, salary
FROM employees
LIMIT 3 OFFSET 2;-- 方式2(简写)
SELECT emp_name, salary
FROM employees
LIMIT 2, 3;
结果:
+----------+---------+
| emp_name | salary |
+----------+---------+
| 王强 | 9000.00 |
| 赵敏 | 6500.00 |
| 刘洋 | 7500.00 |
+----------+---------+
分页查询示例:
-- 第1页:每页显示2条
SELECT emp_name, department
FROM employees
LIMIT 2 OFFSET 0; -- 或 LIMIT 0, 2-- 第2页
SELECT emp_name, department
FROM employees
LIMIT 2 OFFSET 2; -- 或 LIMIT 2, 2-- 第3页
SELECT emp_name, department
FROM employees
LIMIT 2 OFFSET 4; -- 或 LIMIT 4, 2
注意:LIMIT后面的数字表示返回的行数,OFFSET后面的数字表示跳过的行数。
七、综合实战
让我们创建一个商品表,综合运用本文学到的知识:
-- 创建商品表
CREATE TABLE products (product_id INT PRIMARY KEY,product_name VARCHAR(100),category VARCHAR(50),brand VARCHAR(50),price DECIMAL(10, 2),stock_quantity INT
);-- 插入测试数据
INSERT INTO products VALUES
(1, 'iPhone 14 Pro', '手机', '苹果', 7999.00, 50),
(2, 'MacBook Pro', '电脑', '苹果', 12999.00, 30),
(3, '小米13', '手机', '小米', 3999.00, 100),
(4, '华为MateBook', '电脑', '华为', 5999.00, 45),
(5, 'iPad Air', '平板', '苹果', 4799.00, 60),
(6, '小米平板5', '平板', '小米', 1999.00, 80),
(7, 'iPhone 13', '手机', '苹果', 5999.00, 70),
(8, '华为P60', '手机', '华为', 4999.00, 55);-- 1. 查询所有商品名称
SELECT product_name FROM products;-- 2. 查询商品名称和价格
SELECT product_name, price FROM products;-- 3. 查询所有商品的完整信息
SELECT * FROM products;-- 4. 查询有哪些品牌(去重)
SELECT DISTINCT brand FROM products;-- 5. 查询有哪些商品类别(去重)
SELECT DISTINCT category FROM products;-- 6. 查询前5个商品
SELECT product_name, price
FROM products
LIMIT 5;-- 7. 查询第3到第6个商品(分页)
SELECT product_name, category, price
FROM products
LIMIT 4 OFFSET 2;-- 8. 查询苹果品牌有哪些产品类别(去重)
SELECT DISTINCT category
FROM products
WHERE brand = '苹果';-- 9. 综合查询:查询前3个不重复的商品类别
SELECT DISTINCT category
FROM products
LIMIT 3;
总结
本文详细介绍了SELECT语句的基础用法:
- 检索单个列:
SELECT column FROM table;
- 检索多个列:用逗号分隔列名
- 检索所有列:使用
*
通配符(谨慎使用) - 去除重复:使用
DISTINCT
关键字 - 限制结果:使用
LIMIT
和OFFSET
实现分页
掌握这些基础查询技巧后,你就可以从数据库中灵活地提取所需数据了。下一篇我们将学习如何对查询结果进行排序。
下一篇: 数据排序技巧 - ORDER BY详解