MySQL数据分析入门:从零掌握SQL查询与实战案例
🚀 30+款热门AI模型一站整合,DeepSeek/GLM/Qwen 随心用,限时 5 折。 👉 点击领海量免费额度
很多同学想入门数据分析,但面对海量数据无从下手,第一步就卡在了数据库操作上。无论是处理业务报表、分析用户行为,还是做毕业设计,掌握数据库查询都是最核心的基础技能。MySQL作为最流行的开源关系型数据库,是数据分析师、后端开发乃至产品经理的必备工具。本教程将从零开始,带你系统掌握MySQL的核心操作与数据分析思维,全程干货,没有废话,确保你学完就能上手实战。
1. 数据分析与MySQL:为什么是黄金组合?
在开始敲代码之前,我们需要先理解数据分析的本质以及MySQL在其中扮演的角色。数据分析并非简单的“看数字”,而是通过系统性地收集、清洗、处理和解释数据,来发现规律、支持决策的过程。一个典型的数据分析流程包括:明确分析目标 -> 数据获取 -> 数据清洗与整理 -> 数据建模与分析 -> 结果可视化与报告。
在这个流程中,数据获取、清洗与整理往往占据了70%以上的时间,而这正是数据库,特别是SQL语言的用武之地。MySQL作为一个关系型数据库管理系统(RDBMS),其核心优势在于:
- 结构化存储:数据以行和列的形式存储在表中,结构清晰,便于理解和管理。
- 强大的查询能力:通过SQL(结构化查询语言),可以用简洁的语句完成复杂的数据筛选、聚合、连接操作。
- 事务支持:保证数据操作的原子性、一致性、隔离性和持久性(ACID),这对于业务数据的准确性至关重要。
- 广泛的应用生态:与Python(pandas, SQLAlchemy)、Java、BI工具(Tableau, Power BI)等都能无缝集成。
无论是分析电商平台的销售趋势、评估营销活动效果,还是研究用户留存,数据都存储在类似MySQL的数据库中。因此,学好MySQL和SQL,就等于拿到了数据分析的“钥匙”。本教程将聚焦于使用SQL进行数据分析的实战技能,而非数据库管理员的运维知识。
2. 环境准备:快速搭建你的MySQL学习环境
工欲善其事,必先利其器。对于初学者,我强烈推荐使用集成安装包,它能避免单独配置的繁琐和兼容性问题。
2.1 选择并安装MySQL
目前最主流且对新手友好的选择是MySQL Installer(Windows)或直接使用Docker(跨平台)。这里以Windows下的MySQL Installer为例。
- 访问官网:前往MySQL官方网站的下载页面。
- 选择版本:对于学习和大多数应用,选择MySQL Community Server的稳定版即可,如8.0.x系列。注意,8.0版本在性能、安全性和功能上比5.7有显著提升。
- 运行安装程序:下载MySQL Installer并运行。在安装类型(Choosing a Setup Type)中,选择“Developer Default”,它会安装MySQL Server、MySQL Workbench(图形化管理工具)以及其他有用的组件。
- 配置过程:
- 产品配置(Product Configuration):选择“Standalone MySQL Server”。
- 类型和网络(Type and Networking):保持默认的“Development Computer”和端口3306。
- 认证方法(Authentication Method):务必选择强密码加密方式 “Use Strong Password Encryption for Authentication (RECOMMENDED)”。这是MySQL 8.0的默认且更安全的方式。
- 设置root密码:为root账户设置一个强密码并牢记。切记:不要设置空密码或过于简单的密码。
- 后续步骤保持默认即可,直到安装完成。
2.2 验证安装与初步连接
安装完成后,可以通过两种方式验证:
方式一:命令行连接打开命令提示符(CMD)或PowerShell,输入以下命令:
mysql -u root -p系统会提示你输入密码,输入你刚才为root账户设置的密码。如果成功,你将看到MySQL的命令行提示符mysql>。
方式二:使用MySQL Workbench连接这是更推荐新手的图形化方式。打开MySQL Workbench,你会看到一个“MySQL Connections”区域。点击“+”号新建连接。
- Connection Name: 任意取名,如
Local MySQL。 - Hostname:
127.0.0.1或localhost - Port:
3306 - Username:
root - 点击“Store in Vault...”输入你的root密码。 点击“Test Connection”,如果显示成功,即可连接。连接后,你就进入了Workbench的SQL编辑界面。
2.3 创建练习数据库与用户(安全最佳实践)
在生产或团队协作中,直接使用root账户是不安全的。我们应该为数据分析项目创建专属的数据库和用户。
在MySQL Workbench的查询编辑器或命令行中,执行以下SQL语句:
-- 1. 创建一个专门用于数据分析练习的数据库 CREATE DATABASE IF NOT EXISTS data_analysis_demo CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -- 2. 创建一个新用户,并设置密码 CREATE USER 'analyst'@'localhost' IDENTIFIED BY 'YourStrongPassword123!'; -- 3. 授予该用户对练习数据库的所有权限 GRANT ALL PRIVILEGES ON data_analysis_demo.* TO 'analyst'@'localhost'; -- 4. 刷新权限,使授权立即生效 FLUSH PRIVILEGES; -- 5. 切换到新创建的数据库 USE data_analysis_demo;重要提示:请将'YourStrongPassword123!'替换为你自己的强密码。完成后,你就可以使用analyst用户连接data_analysis_demo数据库进行后续所有练习了。
3. SQL核心语法精讲:从增删改查到数据分析
SQL是数据分析的基石。我们将按照数据分析的常见工作流来学习:先定义结构(DDL),再操作数据(DML),最后进行复杂查询(DQL)。
3.1 数据定义语言(DDL):搭建你的数据舞台
DDL用于创建、修改、删除数据库对象,如数据库、表、索引等。
创建表(CREATE TABLE)分析数据前,需要有表来存放数据。设计表结构是数据分析的第一步。
-- 创建一个‘销售订单’表,模拟电商业务数据 CREATE TABLE sales_orders ( order_id INT PRIMARY KEY AUTO_INCREMENT, -- 订单ID,主键,自增长 customer_id INT NOT NULL, -- 客户ID,非空 product_name VARCHAR(100) NOT NULL, -- 产品名称 category VARCHAR(50), -- 产品类别 quantity INT DEFAULT 1, -- 购买数量,默认为1 unit_price DECIMAL(10, 2) NOT NULL, -- 单价,10位数字,2位小数 order_date DATE NOT NULL, -- 订单日期 city VARCHAR(50) -- 收货城市 ); -- 创建一个‘客户信息’表,用于关联分析 CREATE TABLE customers ( customer_id INT PRIMARY KEY, -- 客户ID,主键 customer_name VARCHAR(100) NOT NULL, signup_date DATE, tier VARCHAR(20) DEFAULT 'Standard' -- 客户等级 );关键点解析:
PRIMARY KEY:主键,唯一标识每一行,且不能为NULL。AUTO_INCREMENT:常用于主键,自动生成递增的整数。VARCHAR(n):可变长度字符串,n是最大字符数。DECIMAL(p, s):精确小数类型,p是总位数,s是小数位数,非常适合存储金额。NOT NULL和DEFAULT:约束数据完整性,确保业务逻辑正确。
修改与删除表(ALTER TABLE, DROP TABLE)
-- 为sales_orders表添加一列,记录订单状态 ALTER TABLE sales_orders ADD COLUMN status VARCHAR(20) DEFAULT 'Pending'; -- 修改列的数据类型(谨慎操作,可能导致数据丢失) ALTER TABLE sales_orders MODIFY COLUMN product_name VARCHAR(150); -- 删除表(危险操作!仅用于演示,练习时慎用) -- DROP TABLE IF EXISTS customers;3.2 数据操作语言(DML):填充与维护数据
DML用于对表中的数据进行增、删、改。
插入数据(INSERT INTO)没有数据,分析就是无米之炊。我们插入一些模拟数据。
-- 向 customers 表插入数据 INSERT INTO customers (customer_id, customer_name, signup_date, tier) VALUES (1, '张三', '2023-01-15', 'VIP'), (2, '李四', '2023-03-22', 'Standard'), (3, '王五', '2023-05-30', 'VIP'), (4, '赵六', '2023-08-10', 'Standard'); -- 向 sales_orders 表插入数据 INSERT INTO sales_orders (customer_id, product_name, category, quantity, unit_price, order_date, city, status) VALUES (1, '智能手机X', '电子产品', 1, 5999.00, '2024-01-10', '北京', 'Completed'), (1, '蓝牙耳机', '电子产品', 2, 399.00, '2024-01-15', '北京', 'Completed'), (2, '编程书籍', '图书', 1, 89.90, '2024-01-12', '上海', 'Completed'), (3, '办公椅', '家具', 1, 1200.00, '2024-01-05', '广州', 'Shipped'), (3, '笔记本电脑', '电子产品', 1, 8999.00, '2024-01-18', '广州', 'Processing'), (4, '咖啡豆', '食品', 3, 68.00, '2024-01-20', '深圳', 'Pending'), (1, '运动外套', '服装', 1, 450.00, '2024-02-01', '北京', 'Completed'), (2, '马克杯', '家居', 4, 25.50, '2024-02-02', '上海', 'Completed');更新与删除数据(UPDATE, DELETE)警告:执行UPDATE和DELETE语句时,必须使用WHERE子句指定条件,否则会更新或删除整张表的数据!
-- 更新:将订单ID为6的订单状态改为‘Shipped’ UPDATE sales_orders SET status = 'Shipped' WHERE order_id = 6; -- 删除:删除状态为‘Pending’且订单日期在2024年之前的订单(示例,我们的数据中没有) -- DELETE FROM sales_orders WHERE status = 'Pending' AND order_date < '2024-01-01';3.3 数据查询语言(DQL):数据分析的灵魂
这是数据分析师最常用的部分,核心是SELECT语句。
基础查询与过滤(SELECT, WHERE)
-- 1. 查询所有订单的所有信息 SELECT * FROM sales_orders; -- 2. 只查询特定的列(推荐,节省网络和内存开销) SELECT order_id, product_name, quantity, unit_price FROM sales_orders; -- 3. 使用WHERE进行条件过滤 -- 查找所有已完成的订单 SELECT * FROM sales_orders WHERE status = 'Completed'; -- 查找单价超过1000元的订单 SELECT * FROM sales_orders WHERE unit_price > 1000; -- 查找北京或上海在1月份的订单 SELECT * FROM sales_orders WHERE city IN ('北京', '上海') AND order_date BETWEEN '2024-01-01' AND '2024-01-31'; -- 查找产品名称包含‘手机’的订单(模糊查询) SELECT * FROM sales_orders WHERE product_name LIKE '%手机%';排序与限制(ORDER BY, LIMIT)
-- 按订单日期降序排列(最新的在前) SELECT * FROM sales_orders ORDER BY order_date DESC; -- 按销售额(单价*数量)降序排列,只看前3名 SELECT order_id, product_name, quantity, unit_price, (quantity * unit_price) AS sales_amount -- 使用AS创建别名 FROM sales_orders ORDER BY sales_amount DESC LIMIT 3;聚合函数与分组(GROUP BY, HAVING)聚合分析是数据分析的核心,用于计算总和、平均值、计数等。
-- 1. 基础聚合:计算总订单数、总销售件数、总销售额 SELECT COUNT(*) AS total_orders, -- 计数 SUM(quantity) AS total_quantity, -- 求和 SUM(quantity * unit_price) AS total_sales, -- 求和(表达式) AVG(unit_price) AS avg_unit_price -- 平均值 FROM sales_orders; -- 2. 分组聚合:按城市统计销售额 SELECT city, COUNT(*) AS order_count, SUM(quantity * unit_price) AS city_sales FROM sales_orders GROUP BY city ORDER BY city_sales DESC; -- 3. 分组后过滤:使用HAVING子句筛选出总销售额大于1000的城市 -- WHERE在分组前过滤行,HAVING在分组后过滤组 SELECT city, SUM(quantity * unit_price) AS city_sales FROM sales_orders GROUP BY city HAVING city_sales > 1000;表连接(JOIN):关联分析的利器真实的数据分散在多张表中,JOIN操作能将它们关联起来。
-- 内连接(INNER JOIN):获取有客户信息的订单详情 -- 连接条件是两张表的customer_id相等 SELECT o.order_id, o.order_date, o.product_name, o.quantity * o.unit_price AS amount, c.customer_name, c.tier FROM sales_orders o -- 为表起别名‘o’,简化书写 INNER JOIN customers c ON o.customer_id = c.customer_id; -- 左连接(LEFT JOIN):获取所有订单,即使没有对应的客户信息(本例中都有) -- 如果想查看哪些订单的客户ID在客户表中不存在,可以用LEFT JOIN SELECT o.*, c.customer_name FROM sales_orders o LEFT JOIN customers c ON o.customer_id = c.customer_id;子查询:查询嵌套查询子查询将一个查询的结果作为另一个查询的条件或数据源。
-- 1. 作为条件:找出销售额高于平均销售额的订单 SELECT * FROM sales_orders WHERE (quantity * unit_price) > ( SELECT AVG(quantity * unit_price) FROM sales_orders ); -- 2. 作为派生表:找出每个城市销售额最高的订单 SELECT city, MAX(order_sales) AS max_sale FROM ( SELECT city, order_id, (quantity * unit_price) AS order_sales FROM sales_orders ) AS sales_by_order GROUP BY city;4. 实战案例:电商销售数据分析全流程
现在,我们综合运用以上知识,完成一个完整的电商销售数据分析案例。目标是生成一份销售报告,包含:月度销售趋势、热门商品类别、高价值客户分析。
4.1 数据准备与清洗检查
在分析前,先检查数据质量。
-- 检查是否有重复的订单ID(主键应唯一) SELECT order_id, COUNT(*) FROM sales_orders GROUP BY order_id HAVING COUNT(*) > 1; -- 检查关键字段是否有NULL值 SELECT * FROM sales_orders WHERE customer_id IS NULL OR order_date IS NULL OR unit_price IS NULL; -- 检查是否有异常数据(如负单价或数量) SELECT * FROM sales_orders WHERE unit_price <= 0 OR quantity <= 0;如果发现数据问题,需要使用UPDATE或DELETE进行清洗。本例中数据是干净的,我们继续。
4.2 核心指标计算:月度销售仪表板
-- 计算核心月度指标:订单数、客户数、销售额、客单价 SELECT DATE_FORMAT(order_date, '%Y-%m') AS sales_month, -- 将日期格式化为‘年-月’ COUNT(DISTINCT order_id) AS monthly_orders, -- 月度订单数(去重) COUNT(DISTINCT customer_id) AS monthly_customers, -- 月度消费客户数 SUM(quantity * unit_price) AS monthly_sales, -- 月度总销售额 ROUND(SUM(quantity * unit_price) / COUNT(DISTINCT customer_id), 2) AS avg_customer_value -- 客单价 FROM sales_orders WHERE status = 'Completed' -- 通常只分析已完成的订单 GROUP BY sales_month ORDER BY sales_month;预期结果分析:这个查询能清晰地展示每个月业务的整体表现,是监控业务健康度的基础。
4.3 商品维度分析:哪些类别和商品最赚钱?
-- 按商品类别分析销售额和销量 SELECT category, COUNT(*) AS order_count, SUM(quantity) AS total_quantity_sold, SUM(quantity * unit_price) AS total_sales, ROUND(AVG(unit_price), 2) AS avg_unit_price FROM sales_orders GROUP BY category ORDER BY total_sales DESC; -- 分析具体商品的销售表现(Top 5) SELECT product_name, category, SUM(quantity) AS total_quantity_sold, SUM(quantity * unit_price) AS product_sales FROM sales_orders GROUP BY product_name, category ORDER BY product_sales DESC LIMIT 5;4.4 客户维度分析:识别高价值客户
RFM分析是经典的客户价值分析模型(Recency-最近购买时间, Frequency-购买频率, Monetary-消费金额)。我们用SQL实现一个简化版。
-- 假设分析截止日期是‘2024-02-05’ WITH customer_rfm AS ( SELECT customer_id, -- Recency: 计算最近一次购买距离分析日期的天数 DATEDIFF('2024-02-05', MAX(order_date)) AS recency_days, -- Frequency: 购买次数(订单数) COUNT(DISTINCT order_id) AS frequency, -- Monetary: 总消费金额 SUM(quantity * unit_price) AS monetary FROM sales_orders WHERE status = 'Completed' GROUP BY customer_id ) SELECT customer_id, recency_days, frequency, monetary, -- 简单分段:根据值的大小赋予‘高’‘中’‘低’标签 CASE WHEN recency_days <= 30 THEN '高' WHEN recency_days <= 90 THEN '中' ELSE '低' END AS R_segment, CASE WHEN frequency >= 3 THEN '高' WHEN frequency = 2 THEN '中' ELSE '低' END AS F_segment, CASE WHEN monetary >= 5000 THEN '高' WHEN monetary >= 1000 THEN '中' ELSE '低' END AS M_segment FROM customer_rfm ORDER BY monetary DESC;这个分析结果可以帮助市场部门针对不同价值的客户(如“高价值客户”、“需唤醒客户”)制定不同的运营策略。
4.5 将分析结果落地:创建视图供后续使用
如果某个分析查询需要频繁使用,可以将其保存为视图(View),它就像一张虚拟表。
-- 创建一个月度销售汇总视图 CREATE VIEW monthly_sales_summary AS SELECT DATE_FORMAT(order_date, '%Y-%m') AS sales_month, city, category, COUNT(*) AS order_count, SUM(quantity * unit_price) AS total_sales FROM sales_orders WHERE status = 'Completed' GROUP BY sales_month, city, category; -- 之后就可以像查询普通表一样查询这个视图 SELECT * FROM monthly_sales_summary WHERE sales_month = '2024-01' ORDER BY total_sales DESC;5. 进阶技巧与性能优化
当数据量变大后,查询效率变得至关重要。以下是一些关键优化点。
5.1 索引:加速查询的魔法
索引就像书的目录,能极大加快WHERE、JOIN、ORDER BY等操作的查询速度。
-- 为经常用于查询条件的列创建索引 -- 单列索引 CREATE INDEX idx_order_date ON sales_orders(order_date); CREATE INDEX idx_city ON sales_orders(city); CREATE INDEX idx_status ON sales_orders(status); -- 复合索引:如果经常同时按city和order_date查询 CREATE INDEX idx_city_date ON sales_orders(city, order_date); -- 查看表的索引 SHOW INDEX FROM sales_orders;注意:索引不是免费的,它会降低数据插入、更新、删除的速度,并占用额外磁盘空间。通常只为高频查询的条件列和连接列创建索引。
5.2 查询优化建议
- **避免 SELECT ***:只选择需要的列,减少数据传输和内存消耗。
- 善用EXPLAIN:在复杂查询前加上
EXPLAIN关键字,可以查看MySQL的执行计划,判断是否用上了索引。
关注EXPLAIN SELECT * FROM sales_orders WHERE city = '北京' AND order_date > '2024-01-01';type列(访问类型,最好达到ref或range)、key列(使用的索引)、rows列(预估扫描行数)。 - JOIN优化:确保JOIN条件上有索引。小表驱动大表(将数据量小的表放在JOIN前面)。
- 合理使用子查询 vs JOIN:现代MySQL优化器对两者处理都很好,但复杂的相关子查询可能效率较低,可尝试改写为JOIN。
5.3 窗口函数:高级分析必备(MySQL 8.0+)
窗口函数允许你对一组行(一个“窗口”)进行计算,而不必将结果聚合成单一行。这对于排名、移动平均、累计求和等分析非常强大。
-- 计算每个订单的销售额,以及该订单在其所在城市的销售额排名 SELECT order_id, city, product_name, quantity * unit_price AS sales_amount, RANK() OVER (PARTITION BY city ORDER BY quantity * unit_price DESC) AS sales_rank_in_city, SUM(quantity * unit_price) OVER (PARTITION BY city) AS total_sales_of_city FROM sales_orders ORDER BY city, sales_rank_in_city; -- 计算每个客户的累计消费金额(按订单日期排序) SELECT customer_id, order_date, quantity * unit_price AS order_amount, SUM(quantity * unit_price) OVER (PARTITION BY customer_id ORDER BY order_date) AS cumulative_spending FROM sales_orders ORDER BY customer_id, order_date;6. 常见问题与排查指南
在学习和使用MySQL过程中,你一定会遇到各种错误。这里列出一些典型问题及解决方法。
| 问题现象 | 可能原因 | 排查与解决思路 |
|---|---|---|
| ERROR 1045 (28000): Access denied for user... | 用户名或密码错误;用户没有从该主机连接的权限。 | 1. 检查用户名和密码是否输入正确。 2. 检查连接的主机名(localhost, %, 特定IP)。 3. 用root用户登录,执行 GRANT语句重新授权。 |
| ERROR 1146 (42S02): Table ‘xxx’ doesn’t exist | 表名拼写错误;数据库选择错误;表确实不存在。 | 1. 使用SHOW TABLES;确认当前数据库有哪些表。2. 检查SQL语句中的数据库名和表名是否正确,注意大小写(取决于系统设置)。 3. 确认是否使用了正确的数据库 USE database_name;。 |
| 查询速度非常慢 | 表数据量大且没有索引;查询写法不佳(如 SELECT *, 函数处理索引列);硬件资源不足。 | 1. 使用EXPLAIN分析查询计划。2. 为WHERE、JOIN、ORDER BY涉及的列添加索引。 3. 优化查询语句,避免全表扫描。 |
| 插入中文数据变成乱码(???) | 数据库、表、连接字符集不统一,通常不是UTF-8。 | 1. 创建数据库时指定字符集:CREATE DATABASE ... CHARSET=utf8mb4;2. 创建表时指定: CREATE TABLE ... CHARSET=utf8mb4;3. 在连接字符串或客户端设置连接字符集为 utf8mb4。 |
| Lost connection to MySQL server during query | 查询超时;服务器端断开连接(如wait_timeout设置过小);网络不稳定。 | 1. 优化慢查询。 2. 在MySQL配置文件中增大 wait_timeout和interactive_timeout。3. 检查网络连接。 |
| DELETE 或 UPDATE 语句影响了太多行 | 忘记写WHERE条件或WHERE条件过于宽泛。 | 立即警惕!这是最危险的错误之一。操作前务必先使用SELECT确认WHERE条件是否准确。对于重要数据,务必先备份。可以考虑开启事务,误操作后可以回滚:BEGIN; DELETE ...; ROLLBACK;(确认无误后再COMMIT;)。 |
7. 最佳实践与学习路线建议
7.1 数据分析SQL编写最佳实践
- 格式化与注释:保持SQL语句的缩进和换行,对复杂逻辑添加注释。这能极大提高代码的可读性和可维护性。
- 使用别名:为表和列起简短的别名,尤其是在多表连接和子查询中。
- 先过滤,后聚合:尽量在WHERE子句中先过滤掉不需要的数据,再进行GROUP BY和聚合计算,以提高性能。
- 测试与验证:对于复杂的UPDATE/DELETE操作,先写成SELECT语句验证结果集是否正确。
- 理解业务:最好的SQL来自于对业务逻辑的深刻理解。在写查询前,先明确你要回答的业务问题是什么。
7.2 从入门到精通的学习路线
第一阶段:基础夯实(本教程内容)
- 熟练使用 SELECT, INSERT, UPDATE, DELETE。
- 掌握 WHERE, ORDER BY, GROUP BY, HAVING, JOIN。
- 理解聚合函数(COUNT, SUM, AVG, MAX, MIN)。
- 能在单库单表上进行常规的数据查询和报表制作。
第二阶段:进阶提升
- 深入理解索引:原理、类型(B-Tree,哈希,全文)、创建策略、执行计划分析(EXPLAIN)。
- 掌握子查询和派生表:灵活运用IN, EXISTS, 相关子查询。
- 学习窗口函数:RANK, DENSE_RANK, ROW_NUMBER, LAG, LEAD, 累计计算等。
- 了解常用函数:字符串函数(CONCAT, SUBSTRING)、日期函数(DATE_ADD, DATEDIFF)、条件函数(CASE WHEN, IFNULL)。
第三阶段:实战与扩展
- 复杂业务逻辑建模:编写多步骤、嵌套的复杂查询解决实际业务问题(如用户漏斗分析、留存计算)。
- 性能调优:针对千万级以上数据量的表进行查询优化和索引设计。
- 结合编程语言:学习使用Python(pandas + SQLAlchemy)或Java(JDBC, MyBatis)连接和操作MySQL,将数据分析流程自动化。
- 了解数据库设计:学习三大范式、表关系设计(一对一、一对多、多对多)、主外键约束,能设计合理的数据库结构来支撑分析需求。
掌握MySQL和SQL,是你数据职业生涯中回报率最高的一项投资。它不仅是技术工具,更是一种结构化的数据思维。不要停留在看懂示例,打开你的MySQL客户端,创建自己的练习库,导入一些感兴趣的公开数据集(如Kaggle数据集),从提出一个具体问题开始,用SQL去寻找答案。
🚀 30+款热门AI模型一站整合,DeepSeek/GLM/Qwen 随心用,限时 5 折。 👉 点击领海量免费额度
