mysql菜鸟教程

首页 >> mysql菜鸟教程

5.2 查询数据:SELECT基础

      如果说 INSERT 是为数据库注入血液,那么 SELECT 就是让数据“开口说话”的神奇咒语。它是 SQL 语言中使用最频繁、功能最强大的语句,负责从数据库中检索、筛选、计算和呈现数据。掌握 SELECT,是你从数据库“保管员”变为“探索者”的关键一步。

一、SELECT 语句的核心:你想要什么?从哪里拿?

SELECT 语句最基础的形式,清晰地回答了这两个问题:

SELECT 列名1, 列名2, ...  -- 你想要什么数据(哪些列)?
FROM 表名                 -- 从哪里拿(哪张表)?
[WHERE 条件];             -- 有什么要求(哪些行)?

我们可以将其视作一个清晰的查询流程:

SELECT 语句一个非常关键的内在逻辑:执行顺序。数据库引擎在内部处理你的查询请求时,并非严格按照你书写的顺序(SELECT -> FROM -> WHERE)来执行。它通常先通过 FROM 子句定位数据所在的表,然后利用 WHERE 子句进行筛选,最后才根据 SELECT 子句的指定,将所需的数据列呈现给你。理解这一点,对于后续编写复杂查询和进行性能优化至关重要。

二、基础查询实战

让我们基于一张 products (产品)表来学习,它的结构如下:

CREATE TABLE products (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(100) NOT NULL,
    category VARCHAR(50),
    price DECIMAL(10, 2),
    stock INT DEFAULT 0,
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);

1. 检索所有列 (*)

使用星号 * 作为通配符,可以快速查看表里的所有数据。

-- 查看products表中的所有记录的所有字段
SELECT * FROM products;

使用场景:快速浏览、数据调试。在正式代码或复杂查询中应尽量避免,因为它会返回不必要的数据,降低性能且使结果不明确。

2. 检索特定列

明确指定你需要的列名,这是推荐的做法。

-- 只查看产品的名称和价格
SELECT name, price FROM products;

3. 使用WHERE子句筛选行

WHERE 子句是你的“数据过滤器”,它根据指定的条件返回满足条件的行。

-- 查找所有‘电子产品’类别的产品
SELECT id, name, price FROM products WHERE category = ‘电子产品’;

-- 查找价格低于1000元的产品
SELECT name, price, stock FROM products WHERE price < 1000;

-- 查找库存大于0的‘食品’类产品
SELECT * FROM products WHERE category = ‘食品’ AND stock > 0;

-- 查找价格在50到200元之间的产品
SELECT name, price FROM products WHERE price BETWEEN 50 AND 200;

-- 查找名称中包含‘手机’的产品(模糊查询)
SELECT name, price FROM products WHERE name LIKE ‘%手机%’;

4. 为列起别名 (AS)

别名可以让查询结果中的列标题更易读,或在计算时使用。

-- 将`price`列在结果中显示为‘售价’
SELECT name, price AS ‘售价’, stock AS ‘库存’ FROM products;

-- 别名用于计算(假设查询一个8折后的价格)
SELECT name, price, price * 0.8 AS ‘折后价’ FROM products;

三、初识函数与简单计算

你可以在 SELECT 列表中直接使用表达式和函数。

常用函数示例

-- 1. 文本函数
SELECT 
    name,
    UPPER(name) AS ‘大写名称’,  -- 转换为大写
    LENGTH(name) AS ‘名称长度’  -- 计算字符长度
FROM products;

-- 2. 数学函数与计算
SELECT 
    name,
    price,
    ROUND(price * 1.1, 2) AS ‘加税后价格’ -- 四舍五入保留2位小数
FROM products;

-- 3. 聚合函数(先有个概念,后面章节详解)
SELECT 
    COUNT(*) AS ‘产品总数’,       -- 统计行数
    AVG(price) AS ‘平均价格’,     -- 计算平均值
    MAX(price) AS ‘最高价格’,     -- 找出最大值
    MIN(price) AS ‘最低价格’,     -- 找出最小值
    SUM(stock) AS ‘总库存’       -- 计算总和
FROM products;

四、去重与简单排序

DISTINCT:消除重复行

-- 查看所有不重复的产品类别
SELECT DISTINCT category FROM products;

-- 查看不重复的类别和品牌组合(如果表有brand列)
SELECT DISTINCT category, brand FROM products;

ORDER BY:对结果排序

-- 按价格从低到高排序(默认ASC升序)
SELECT name, price FROM products ORDER BY price;

-- 按价格从高到低排序(DESC降序)
SELECT name, price FROM products ORDER BY price DESC;

-- 先按类别排序,同类中再按价格降序排序
SELECT name, category, price FROM products ORDER BY category, price DESC;

LIMIT:限制返回行数

这在分页或只想看前几条记录时非常有用。

-- 查看最贵的5个产品
SELECT name, price FROM products ORDER BY price DESC LIMIT 5;

-- 分页查询:跳过前10条,取接下来的5条(常用于第3页,每页5条)
SELECT name, price FROM products LIMIT 10, 5;
-- 注意:第一个参数是偏移量(offset),第二个是行数(row_count)

五、综合实战练习

让我们将上面的知识点串联起来,完成一个综合查询。

需求:查询“电子产品”类别中,库存大于10的产品,按价格升序排列,只显示产品名称、价格和库存,并将价格列重命名为“零售价”,最后只查看前10条记录。

SELECT 
    name,
    price AS ‘零售价’,
    stock
FROM products
WHERE category = ‘电子产品’ AND stock > 10
ORDER BY price ASC
LIMIT 10;

六、最佳实践与常见错误

最佳实践

原因

避免使用 SELECT *

明确列出所需字段,提高查询效率、网络传输效率和代码可读性。

WHERE 条件尽量使用索引列

如主键、唯一键或经常用于查询的列,可极大提升查询速度。

为表和列起有意义的名字

让 

SELECT name FROM products

 这样简单的语句也一目了然。

常见错误

示例(错误)

纠正

字符串未加引号

WHERE category = 电子产品

WHERE category = ‘电子产品’

列名或表名拼写错误

SELECT nmae FROM prodcts;

SELECT name FROM products;

WHERE 条件中使用别名

SELECT price AS p WHERE p > 100

别名不能在 

WHERE

 中使用,只能用原列名:

WHERE price > 100

SELECT 语句是通往数据世界的大门。本章介绍的基础是你构建所有复杂查询的基石。请务必在数据库环境中反复练习,尝试组合不同的子句,观察结果的变化。


发表评论

昵称:
联系方式:
评论内容:

所有评论

关于我 备案号:蜀ICP备2023042032号-1