MySQL表的数据检索:从基础到精通

一、基本SELECT查询语句格式

1.1 SELECT语句的基本结构

SELECT语句是MySQL中最核心的查询命令,用于从一个或多个表中检索数据。其基本语法格式如下:

bash 复制代码
sql
SELECT 
    [ALL | DISTINCT | DISTINCTROW]
    select_expr [, select_expr ...]
FROM 
    table_references
[WHERE where_condition]
[GROUP BY {col_name | expr | position}]
[HAVING where_condition]
[ORDER BY {col_name | expr | position} [ASC | DESC]]
[LIMIT {[offset,] row_count | row_count OFFSET offset}];

1.2 最简查询示例

sql

bash 复制代码
-- 查询表中所有数据的所有列
SELECT * FROM employees;

-- 查询表中特定列
SELECT id, name, department FROM employees;

-- 查询并给列起别名
SELECT 
    id AS '员工编号',
    name AS '员工姓名',
    salary AS '基本工资'
FROM employees;

1.3 查询执行顺序说明

FROM:指定数据来源的表

WHERE:对记录进行筛选

GROUP BY:对结果进行分组

HAVING:对分组结果进行筛选

SELECT:选择显示的列

ORDER BY:对结果进行排序

LIMIT:限制返回的记录数

二、单表查询:SELECT子句和FROM子句详解

2.1 SELECT子句的丰富功能

2.1.1 查询所有列

sql

bash 复制代码
-- 使用星号(*)查询所有列
SELECT * FROM products;

2.1.2 查询特定列

bash 复制代码
sql
-- 选择特定列,提高查询效率
SELECT 
    product_id,
    product_name,
    price,
    category
FROM products;

2.1.3 使用表达式和函数

bash 复制代码
sql
-- 使用算术表达式
SELECT 
    product_name,
    price,
    price * 0.9 AS '折扣价',
    stock_quantity
FROM products;

-- 使用字符串函数
SELECT 
    CONCAT(last_name, ' ', first_name) AS '员工全名',
    UPPER(department) AS '部门',
    LENGTH(email) AS '邮箱长度'
FROM employees;

-- 使用日期函数
SELECT 
    order_id,
    customer_name,
    order_date,
    DATE_ADD(order_date, INTERVAL 7 DAY) AS '预计发货日',
    YEAR(order_date) AS '订单年份'
FROM orders;

2.1.4 使用DISTINCT去重

bash 复制代码
sql
-- 获取唯一的部门列表
SELECT DISTINCT department FROM employees;

-- 多个列的组合去重
SELECT DISTINCT department, job_title FROM employees;

2.1.5 使用CASE表达式

bash 复制代码
sql
SELECT 
    student_id,
    student_name,
    score,
    CASE
        WHEN score >= 90 THEN '优秀'
        WHEN score >= 80 THEN '良好'
        WHEN score >= 60 THEN '及格'
        ELSE '不及格'
    END AS '成绩等级'
FROM exam_results;

2.2 FROM子句的灵活运用

2.2.1 基本表查询

sql

bash 复制代码
-- 查询单个表
SELECT * FROM customers;

-- 为表指定别名(提高可读性)
SELECT 
    c.customer_id,
    c.customer_name,
    c.join_date
FROM customers AS c;

2.2.2 虚拟表(子查询作为表)

bash 复制代码
sql
-- 子查询作为数据源
SELECT 
    sub.dept_name,
    sub.avg_salary
FROM (
    SELECT 
        department AS dept_name,
        AVG(salary) AS avg_salary
    FROM employees
    GROUP BY department
    HAVING AVG(salary) > 5000
) AS sub
ORDER BY sub.avg_salary DESC;

2.2.3 使用DUAL虚拟表

bash 复制代码
sql
-- DUAL是MySQL中的虚拟表,用于计算表达式
SELECT 
    'MySQL数据检索' AS title,
    NOW() AS current_time,
    10 * 20 AS calculation,
    VERSION() AS mysql_version
FROM DUAL;

2.3 实用查询示例集合

bash 复制代码
示例1:基础数据检索
sql
-- 查询员工基本信息
SELECT 
    emp_id AS '编号',
    CONCAT(first_name, ' ', last_name) AS '姓名',
    department AS '部门',
    FORMAT(salary, 2) AS '月薪',
    DATE_FORMAT(hire_date, '%Y-%m-%d') AS '入职日期'
FROM employees
WHERE department = '技术部'
ORDER BY salary DESC;
示例2:数据统计分析
sql
-- 统计各部门人数和平均薪资
SELECT 
    department AS '部门名称',
    COUNT(*) AS '员工人数',
    FORMAT(AVG(salary), 2) AS '平均薪资',
    FORMAT(MAX(salary), 2) AS '最高薪资',
    FORMAT(MIN(salary), 2) AS '最低薪资',
    SUM(salary) AS '薪资总额'
FROM employees
GROUP BY department
HAVING COUNT(*) > 5
ORDER BY AVG(salary) DESC;
示例3:数据筛选与格式化
sql
-- 高级数据筛选和格式化
SELECT 
    p.product_id AS '产品ID',
    p.product_name AS '产品名称',
    p.category AS '产品类别',
    CASE 
        WHEN p.price > 1000 THEN '高端'
        WHEN p.price > 500 THEN '中端'
        ELSE '入门'
    END AS '价格分类',
    p.stock_quantity AS '库存',
    IF(p.stock_quantity > 100, '充足', '需补货') AS '库存状态'
FROM products AS p
WHERE p.price BETWEEN 100 AND 5000
  AND p.stock_quantity > 0
ORDER BY p.price DESC, p.stock_quantity ASC;

2.4 性能优化建议

**避免使用SELECT ***:明确指定需要的列

合理使用别名:提高查询可读性

WHERE子句优化:尽量使用索引列进行筛选

LIMIT分页:大数据量时使用分页查询

减少函数使用:WHERE子句中避免对列使用函数

总结

MySQL的SELECT查询是数据库操作的基础,掌握SELECT和FROM子句的灵活使用是进行高效数据检索的关键。通过合理的列选择、表达式使用和表引用,可以构建出既高效又易于维护的查询语句。在实际开发中,建议根据具体需求选择合适的查询方式,并注意查询性能的优化。

相关推荐
Database_Cool_1 小时前
阿里云 RDS MySQL 降本增效实战:从规格选型到成本优化,月成本降低64%全攻略
mysql·阿里云·云计算
java_logo1 小时前
Apache Doris Docker 部署指南:实时分析数据库实战
数据库·docker·apache·doris·apache doris·轩辕镜像·docker部署doris
广州灵眸科技有限公司9 小时前
xfce桌面触摸校准:基于灵眸科技EASY-EAl-Orin-Nano
数据库·windows·科技
Cloud云卷云舒11 小时前
云卷云舒:从Oracle/MySQL迁移到HaishanDB:迁移评估工具核心技术拆解
mysql·oracle·ai-native·haishandb·信创数据库替换
憧憬成为web高手11 小时前
皮卡丘靶场速通--sql 2
数据库·sql·mybatis
段一凡-华北理工大学12 小时前
向量数据库实战:选型、调优与落地~系列文章12:文本分块策略实战:chunk_size 怎么选?重叠多少?
开发语言·数据库·后端·oracle·rust·工业智能体·高炉智能化
oradh14 小时前
Oracle XTTS实现跨版本迁移和升级(Oracle 11g单库升级至19C RAC集群)
数据库·oracle·11g升级19c·xtts跨版本迁移和升级
用户713335851562414 小时前
MySQL - 事务、redo/undo 日志与 MVCC
mysql
z1234567898615 小时前
2026最新两款AI编程工具深度对比实测
java·数据库·ai编程
程序猿DD15 小时前
一个 API Key,统一调用大模型、生图和联网搜索
数据库·网关