从零基础到数据分析 —— 掌握研究生必备的数据库技能
SQL(Structured Query Language)是数据分析、金融科技、学术研究的核心技能。无论你使用 Excel、Python、R 还是 Stata,理解 SQL 都能让你的数据处理能力上一个台阶。
研究生必备: 90% 的数据分析师职位要求 SQL 技能;学术论文中处理大型数据集的首选工具;金融行业数据仓库的标准语言。
SQL(Structured Query Language,结构化查询语言)是一种专门用于管理关系型数据库的标准编程语言。
银行交易系统、电商订单管理、学生信息管理、科研数据分析、日志数据处理、财务报表生成...
很多同学习惯使用 Excel 或 CSV 文件存储数据,但数据量增大时问题就出现了:
虽然 SQL 是标准语言,但不同的数据库系统有其特点和适用场景:
选择建议: 对于学习和研究,推荐 PostgreSQL(功能强大、开源免费)或 MySQL(简单易用、社区庞大)。如果使用 Stata,两者都支持良好。
NoSQL(Not Only SQL)是相对于传统关系型数据库的新一代数据库系统,主要用于处理海量数据和高并发场景。
MongoDB 是最流行的 NoSQL 数据库,使用文档模型存储数据(类似 JSON 格式):
SQL
CREATE TABLE users (
id INT,
name VARCHAR(50),
age INT
);
MongoDB
db.users.insertOne({
name: "张三",
age: 25,
hobbies: ["读书", "旅游"]
})
学习建议: 对于金融科技和数据分析,SQL 仍然是首选。大多数数据分析工具(如 Stata、Python pandas)都可以直接连接 SQL 数据库。NoSQL 适合学习大数据技术时再深入了解。
要使用数据库,首先需要建立客户端程序与数据库服务器之间的连接。理解以下概念非常重要:
数据库服务器在网络中的位置,可以是 IP 地址或域名:
# 本地计算机(同一台机器)
localhost # 或 127.0.0.1
# 远程服务器
192.168.1.100 # 局域网 IP
db.example.com # 域名
数据库服务监听的端口号,不同数据库有默认端口:
| 数据库 | 默认端口 |
|---|---|
| MySQL | 3306 |
| PostgreSQL | 5432 |
| SQL Server | 1433 |
| Oracle | 1521 |
💡 如果使用默认端口,连接时通常可以省略
数据库的身份验证凭据:
# 常见数据库用户名
root # MySQL 默认管理员账户
postgres # PostgreSQL 默认管理员账户
sa # SQL Server 系统管理员
安全提示: 生产环境中不要使用默认密码,密码中应包含大小写字母、数字和特殊字符。
要连接的具体数据库(一个服务器可以有多个数据库):
# 示例数据库名
company_db # 公司数据库
sales_data # 销售数据
research # 研究项目数据
驱动程序是客户端程序与数据库通信的"翻译器":
每个数据库系统都有自己的通信协议,驱动程序负责将这些协议转换成客户端程序能理解的格式。
PostgreSQL 是功能最强大的开源数据库,以下是各种连接方式:
# 基本语法
psql -h 主机地址 -p 端口 -U 用户名 -d 数据库名
# 示例 1:连接本地数据库
psql -U postgres -d mydb
# 示例 2:连接远程数据库
psql -h 192.168.1.100 -p 5432 -U dbuser -d company_db
# 示例 3:使用连接字符串
psql postgresql://dbuser:password@192.168.1.100:5432/company_db
import psycopg2
# 建立连接
conn = psycopg2.connect(
host="localhost",
port=5432,
database="company_db",
user="postgres",
password="your_password"
)
# 创建游标
cur = conn.cursor()
# 执行查询
cur.execute("SELECT * FROM employees LIMIT 10")
results = cur.fetchall()
# 关闭连接
cur.close()
conn.close()
推荐使用连接字符串: 为了代码更清晰,可以使用连接字符串格式:postgresql://user:password@host:port/database
硬编码(Hardcoding)是指将敏感信息(如密码)直接写在代码中。这是非常危险的做法!
conn = psycopg2.connect(
host="localhost",
database="mydb",
user="postgres",
password="mypassword123" # ⚠️ 危险!
)
密码直接写在代码里,任何能访问代码的人都能看到!
# 提交到 Git 仓库...
git add config.py
git commit -m "Add database config"
git push
包含密码的代码被推送到 GitHub,全世界都能看到!
硬编码的风险: 1) 代码泄露会暴露密码 2) 无法在不同环境使用不同配置 3) 更换密码需要修改代码 4) 容易误提交到版本控制系统
环境变量(Environment Variables)是操作系统中存储配置信息的一种机制。它们是键值对(Key-Value)形式的数据,存储在操作系统或用户配置中。
在终端中使用 export 命令设置,只在当前终端窗口有效:
# Linux/macOS
export PGDATABASE=company_db
export PGUSER=postgres
export PGPASSWORD=mypassword
# Windows
set PGDATABASE=company_db
set PGUSER=postgres
set PGPASSWORD=mypassword
将环境变量写入配置文件,每次打开终端时自动加载:
# PostgreSQL 环境变量
export PGDATABASE=company_db
export PGHOST=localhost
export PGPORT=5432
export PGUSER=postgres
# 注意:密码通常不写入配置文件
系统设置 → 高级系统设置 → 环境变量
以点(.)开头的文件是隐藏文件,如 .bashrc、.env:
# 列出所有文件(包括隐藏文件)
ls -la
# 查看特定配置文件
cat ~/.bashrc
# 编辑配置文件
nano ~/.bashrc
# 或
vim ~/.bashrc
创建一个 .env 文件存储敏感信息,并添加到 .gitignore:
# .env 文件内容
PGDATABASE=company_db
PGHOST=localhost
PGPORT=5432
PGUSER=postgres
PGPASSWORD=mypassword
⚠️ 重要: 将 .env 添加到 .gitignore 文件中,防止提交到 Git!
import os
from dotenv import load_dotenv
# 加载 .env 文件
load_dotenv()
# 读取环境变量
conn = psycopg2.connect(
host=os.getenv("PGHOST", "localhost"),
port=os.getenv("PGPORT", "5432"),
database=os.getenv("PGDATABASE"),
user=os.getenv("PGUSER"),
password=os.getenv("PGPASSWORD")
)
使用 os.getenv() 的第二个参数作为默认值
* Stata 会自动读取系统环境变量
odbc load, dsn("PostgreSQL") exec("SELECT * FROM employees")
配置 ODBC 数据源时,可以引用环境变量
| 做法 | 安全性 | 便利性 |
|---|---|---|
| 硬编码密码 | ❌ 非常危险 | ✅ 最方便 |
| 终端 export 命令 | ✅ 相对安全 | ⚠️ 需要重复输入 |
| .bashrc/.zshrc 配置 | ✅ 安全 | ✅ 自动加载 |
| .env 文件 | ✅ 最安全 | ✅ 一次配置,多处使用 |
| 密钥管理服务 | ✅✅ 企业级安全 | ⚠️ 需要额外配置 |
# 设置环境变量(在终端中)
export PGDATABASE=company_db
export PGHOST=localhost
export PGPORT=5432
export PGUSER=postgres
export PGPASSWORD=your_password
# 然后可以简化连接
psql # 自动使用环境变量
安全建议: 不要在代码中硬编码密码!使用环境变量、配置文件或密钥管理服务来存储敏感信息。
MySQL 是最受欢迎的开源数据库,连接方式与 PostgreSQL 类似:
# 基本语法
mysql -h 主机地址 -P 端口 -u 用户名 -p 数据库名
# 示例 1:连接本地数据库
mysql -u root -p mydb
# 示例 2:连接远程数据库
mysql -h 192.168.1.100 -P 3306 -u dbuser -p company_db
import mysql.connector
# 建立连接
conn = mysql.connector.connect(
host="localhost",
port=3306,
database="company_db",
user="root",
password="your_password"
)
# 创建游标
cur = conn.cursor()
# 执行查询
cur.execute("SELECT * FROM employees LIMIT 10")
results = cur.fetchall()
# 关闭连接
cur.close()
conn.close()
from sqlalchemy import create_engine
import pandas as pd
# 创建连接字符串
connection_string = (
"mysql+mysqlconnector://root:password@localhost:3306/company_db"
)
# 创建引擎
engine = create_engine(connection_string)
# 使用 pandas 直接读取数据
df = pd.read_sql("SELECT * FROM employees", engine)
# 写入数据到数据库
df.to_sql("new_table", engine, if_exists="replace")
推荐使用 SQLAlchemy: 它提供了数据库无关的接口,切换数据库只需要修改连接字符串,代码无需改动。
Stata 可以通过 OBC 接口连接各种 SQL 数据库,非常适合数据分析工作流程。
打开 ODBC 数据源管理器:
添加系统 DSN,填写连接信息
使用 odbc load 命令加载数据:
* 方式1:使用 DSN 名称
odbc load, dsn("PostgreSQLDSN") exec("SELECT * FROM employees")
* 方式2:直接指定连接字符串
odbc load, connstr("DRIVER={PostgreSQL Unicode};SERVER=localhost;PORT=5432;DATABASE=company_db;UID=postgres;PWD=mypassword") exec("SELECT * FROM employees")
* 将数据保存到 Stata 数据集
save employees_data
* ===========================================================
* Stata 数据库分析完整流程
* ===========================================================
* 1. 连接数据库并加载数据
odbc load, dsn("company_db") exec("SELECT * FROM sales WHERE year >= 2020")
* 2. 查看数据基本信息
describe
summarize
* 3. 进行数据分析
regress sales_price advertising_cost
* 4. 创建新变量
generate log_sales = ln(sales_price)
* 5. 将结果写回数据库(需要创建目标表)
odbc insert, dsn("company_db") table(analysis_results) create
* 6. 执行 SQL 查询并显示结果
odbc sql, dsn("company_db") exec("SELECT COUNT(*) FROM sales WHERE sales_price > 1000")
| 命令 | 说明 |
|---|---|
odbc load | 从数据库加载数据到 Stata |
odbc insert | 将 Stata 数据插入数据库 |
odbc sql | 执行 SQL 语句(不加载到 Stata) |
odbc list | 列出可用的 DSN |
理解数据库和数据表的关系对于有效组织数据至关重要。
数据库服务器 就像一座图书馆大楼
数据库 就像阅览室(有社科阅览室、科技阅览室等)
数据表 就像书架(每个书架放一类书)
记录 就像每一本书
字段 就像书名、作者、ISBN号等属性
除了命令行工具,使用图形界面的数据库管理工具可以让你的学习更加高效。我们推荐使用 DBeaver —— 一款免费开源的通用数据库管理工具。
DBeaver 支持 Windows、macOS 和 Linux,选择对应版本下载安装包
下载后双击安装程序,一路"下一步"即可完成安装。启动后看到主界面。
在左上角工具栏点击数据库图标(或按 Ctrl+Shift+N)
例如选择 PostgreSQL,DBeaver 会自动填充默认端口号(5432)
输入服务器地址、端口、数据库名、用户名和密码
点击"测试连接"按钮,确认配置正确后点击"完成"
学习建议: 对于 SQL 初学者,强烈建议使用 DBeaver 这样的可视化工具!你可以实时看到查询结果,图形化地浏览表结构,智能提示帮你减少错误,大大提高学习效率。等熟练后,再学习命令行操作。
SELECT 是 SQL 中最常用的语句,用于从数据库中检索数据。
SELECT 列名1, 列名2, ... FROM 表名 WHERE 条件;
SELECT * FROM employees;
返回 employees 表的所有数据
SELECT name, salary FROM employees;
只返回姓名和薪资列
SELECT * FROM employees
WHERE salary > 50000;
返回薪资大于 50000 的员工
SELECT * FROM employees
WHERE salary > 50000
AND department = '销售部';
销售部高薪员工
SELECT name, salary FROM employees
ORDER BY salary DESC;
按薪资降序排列(DESC=降序,ASC=升序)
SELECT * FROM employees
ORDER BY salary DESC
LIMIT 10;
只返回前 10 条记录(常用于分页)
SELECT
COUNT(*) AS total,
AVG(salary) AS avg_salary,
MAX(salary) AS max_salary
FROM employees;
统计员工数量、平均薪资、最高薪资
SELECT
department,
COUNT(*) AS emp_count,
AVG(salary) AS avg_salary
FROM employees
GROUP BY department;
按部门统计员工人数和平均薪资
假设有一张 sales 表包含以下字段:id, product_name, sale_date, amount, sales_person
管理数据库结构的基本操作。
CREATE TABLE employees (
id INT PRIMARY KEY,
name VARCHAR(50) NOT NULL,
email VARCHAR(100) UNIQUE,
age INT CHECK (age >= 18),
salary DECIMAL(10, 2),
department VARCHAR(50),
hire_date DATE DEFAULT CURRENT_DATE,
active BOOLEAN DEFAULT TRUE
);
| 类型 | 描述 | 示例 |
|---|---|---|
INT | 整数 | 100, -50 |
DECIMAL(m,d) | 精确小数 | 12345.67 |
VARCHAR(n) | 可变长度字符串 | 'Hello World' |
TEXT | 长文本 | 文章内容 |
DATE | 日期(年-月-日) | '2024-01-15' |
TIMESTAMP | 日期时间 | '2024-01-15 14:30:00' |
BOOLEAN | 布尔值 | TRUE, FALSE |
DROP TABLE employees;
⚠️ 直接删除,如果表不存在会报错
DROP TABLE IF EXISTS employees;
✅ 表存在才删除,推荐使用
重要警告: DROP TABLE 会永久删除表及其所有数据,无法恢复(除非有备份)。执行前务必确认!
-- 添加新列
ALTER TABLE employees ADD COLUMN phone VARCHAR(20);
-- 删除列
ALTER TABLE employees DROP COLUMN phone;
-- 修改列类型
ALTER TABLE employees ALTER COLUMN salary TYPE DECIMAL(12,2);
-- 重命名表
ALTER TABLE employees RENAME TO staff;
以下是一些高质量的 SQL 学习资源,适合课外深入学习:
最完整的 PostgreSQL 参考,包含教程和 SQL 命令参考
MySQL 官方文档,包含 SQL 语法和函数参考
微软官方 SQL Server 文档和教程
适合初学者的交互式 SQL 教程,包含在线练习环境
免费交互式 SQL 学习网站,循序渐进的练习
通过编程练习提升 SQL 技能,从简单到困难都有
免费开源的通用数据库管理工具,支持几乎所有数据库
PostgreSQL 官方图形化管理工具
MySQL 官方可视化工具,支持设计、开发和数据管理
1. 边学边练:安装一个本地数据库,跟着教程实际操作
2. 用真实数据:下载公开数据集(如 Kaggle、政府公开数据)练习
3. 从简单到复杂:先掌握 SELECT/WHERE/GROUP BY,再学习 JOIN 和子查询
4. 结合专业:思考 SQL 如何应用于你的研究课题或数据分析任务
掌握 SQL 是数据分析的重要技能。继续练习,尝试连接真实的数据库,处理实际的数据问题,你会发现 SQL 强大的威力!
下一步: 尝试下载一个公开数据集,导入到本地数据库,使用 SQL 进行探索性数据分析!