SQL 数据库完全教程

从零基础到数据分析 —— 掌握研究生必备的数据库技能

🗄️

欢迎来到数据的世界

SQL(Structured Query Language)是数据分析、金融科技、学术研究的核心技能。无论你使用 Excel、Python、R 还是 Stata,理解 SQL 都能让你的数据处理能力上一个台阶。

🎓

研究生必备: 90% 的数据分析师职位要求 SQL 技能;学术论文中处理大型数据集的首选工具;金融行业数据仓库的标准语言。

❓

什么是 SQL?

SQL(Structured Query Language,结构化查询语言)是一种专门用于管理关系型数据库的标准编程语言。

📊
声明式语言:告诉计算机"要什么",而不是"怎么做"
🔄
关系型数据库:基于关系模型,用表格存储数据
⚡
高效查询:专为数据检索和操作优化
🌐
标准语言:ISO/ANSI 标准,跨平台通用

🔍 SQL 的应用场景

银行交易系统、电商订单管理、学生信息管理、科研数据分析、日志数据处理、财务报表生成...

⚖️

为什么使用数据库而不是数据文件?

很多同学习惯使用 Excel 或 CSV 文件存储数据,但数据量增大时问题就出现了:

❌ Excel/CSV 文件的局限

  • 行数限制(Excel 仅 104 万行)
  • 多用户同时编辑容易冲突
  • 查询速度慢,没有索引优化
  • 数据安全性低,容易损坏
  • 难以建立复杂的表关系
  • 版本控制和备份困难
  • 内存占用大

✅ 数据库的优势

  • 存储海量数据(TB/PB 级别)
  • 支持多用户并发访问
  • 查询高效,支持索引优化
  • 事务支持,保证数据一致性
  • 主键外键建立表关系
  • 完善的权限管理
  • 自动备份和恢复
📷 数据规模对比示意 Excel ~100万行 CSV 文件 ~1000万行 SQL 数据库 数十亿行+
⭐

SQL 的核心特点

声明式查询 描述"要什么"而非"怎么做" SELECT * FROM users 集合操作 一次处理多行数据 UPDATE users SET active=1 关系模型 表与表之间建立关联 JOIN / FOREIGN KEY ACID 特性 原子性、一致性、隔离性、持久性 BEGIN / COMMIT / ROLLBACK 标准可扩展 ISO/ANSI 标准,跨平台 存储过程、触发器、视图 优化执行 查询优化器自动选择最优方案 索引、缓存、并行查询
🗄️

主流 SQL 数据库系统

虽然 SQL 是标准语言,但不同的数据库系统有其特点和适用场景:

MySQL

  • 最受欢迎的开源数据库
  • Web 应用首选(WordPress, Facebook)
  • 社区活跃,文档丰富
  • 适合中小型应用
LAMP架构
Web开发

PostgreSQL

  • 最先进的开源数据库
  • 支持复杂查询、JSON、GIS
  • ACID 完整支持
  • 适合企业级应用
数据分析
企业级

SQL Server

  • Microsoft 商业数据库
  • 与 Windows 生态深度集成
  • 强大的 BI 工具支持
  • 适合企业数据中心
商业软件
.NET生态

Oracle

  • 大型商业数据库
  • 银行、金融行业首选
  • 功能最强大,价格昂贵
  • 适合超大规模企业应用
金融行业
大型企业
💡

选择建议: 对于学习和研究,推荐 PostgreSQL(功能强大、开源免费)或 MySQL(简单易用、社区庞大)。如果使用 Stata,两者都支持良好。

🍃

NoSQL 数据库简介

NoSQL(Not Only SQL)是相对于传统关系型数据库的新一代数据库系统,主要用于处理海量数据和高并发场景。

📊 SQL(关系型)

  • 结构化数据,固定表结构
  • 强调数据一致性和事务
  • 适合复杂查询和关联分析
  • 垂直扩展(增加服务器性能)
  • MySQL, PostgreSQL, Oracle

📄 NoSQL(非关系型)

  • 灵活的数据模型
  • 强调高可用和分区容错
  • 适合大数据和高并发场景
  • 水平扩展(增加服务器数量)
  • MongoDB, Redis, Cassandra

🍃 MongoDB 简介

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 适合学习大数据技术时再深入了解。

🔌

数据库连接基础概念

要使用数据库,首先需要建立客户端程序与数据库服务器之间的连接。理解以下概念非常重要:

客户端程序 (Stata/Python/R) 数据库驱动 连接参数 🖥️ 服务器地址 (Host) 🔢 端口号 (Port) 👤 用户名 (Username) 🔑 密码 (Password) 🗄️ 数据库名 (Database) 数据库服务器 (MySQL/PostgreSQL) 客户端通过驱动程序 使用连接参数建立网络连接

📋 连接参数详解

1

服务器地址(Host / Server Address)

数据库服务器在网络中的位置,可以是 IP 地址或域名:

# 本地计算机(同一台机器)
localhost # 或 127.0.0.1

# 远程服务器
192.168.1.100 # 局域网 IP
db.example.com # 域名
2

端口号(Port)

数据库服务监听的端口号,不同数据库有默认端口:

数据库默认端口
MySQL3306
PostgreSQL5432
SQL Server1433
Oracle1521

💡 如果使用默认端口,连接时通常可以省略

3

用户名和密码(Username & Password)

数据库的身份验证凭据:

# 常见数据库用户名
root # MySQL 默认管理员账户
postgres # PostgreSQL 默认管理员账户
sa # SQL Server 系统管理员
⚠️

安全提示: 生产环境中不要使用默认密码,密码中应包含大小写字母、数字和特殊字符。

4

数据库名(Database Name)

要连接的具体数据库(一个服务器可以有多个数据库):

# 示例数据库名
company_db # 公司数据库
sales_data # 销售数据
research # 研究项目数据
5

数据库驱动(Driver)

驱动程序是客户端程序与数据库通信的"翻译器":

Stata ODBC 驱动 PostgreSQL 驱动负责转换协议

每个数据库系统都有自己的通信协议,驱动程序负责将这些协议转换成客户端程序能理解的格式。

🐘

PostgreSQL 连接方法

PostgreSQL 是功能最强大的开源数据库,以下是各种连接方式:

方式一:命令行工具 psql

# 基本语法
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
psql (14.5, server 15.1)
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384)
Type "help" for help.

company_db=#

方式二:Python 连接(使用 psycopg2)

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)形式的数据,存储在操作系统或用户配置中。

你的应用程序 读取环境变量 操作系统环境变量 PGDATABASE company_db PGPASSWORD •••••• PGHOST localhost PGUSER postgres

📂 环境变量存储在哪里?

1

临时环境变量(当前会话)

在终端中使用 export 命令设置,只在当前终端窗口有效:

# Linux/macOS
export PGDATABASE=company_db
export PGUSER=postgres
export PGPASSWORD=mypassword

# Windows
set PGDATABASE=company_db
set PGUSER=postgres
set PGPASSWORD=mypassword
2

永久环境变量(配置文件)

将环境变量写入配置文件,每次打开终端时自动加载:

Linux/macOS: ~/.bashrc 或 ~/.zshrc
# PostgreSQL 环境变量
export PGDATABASE=company_db
export PGHOST=localhost
export PGPORT=5432
export PGUSER=postgres
# 注意:密码通常不写入配置文件
Windows: 系统环境变量

系统设置 → 高级系统设置 → 环境变量

🔍 如何查看隐藏文件?

以点(.)开头的文件是隐藏文件,如 .bashrc、.env:

# 列出所有文件(包括隐藏文件)
ls -la

# 查看特定配置文件
cat ~/.bashrc

# 编辑配置文件
nano ~/.bashrc
# 或
vim ~/.bashrc
3

.env 文件(推荐做法)

创建一个 .env 文件存储敏感信息,并添加到 .gitignore:

.env PGDATABASE=company_db PGUSER=postgres PGPASSWORD=***secret***
# .env 文件内容
PGDATABASE=company_db
PGHOST=localhost
PGPORT=5432
PGUSER=postgres
PGPASSWORD=mypassword

⚠️ 重要: 将 .env 添加到 .gitignore 文件中,防止提交到 Git!

🔍 如何在代码中读取环境变量?

Python (推荐使用 python-dotenv)

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)

* 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 连接方法

MySQL 是最受欢迎的开源数据库,连接方式与 PostgreSQL 类似:

方式一:命令行工具 mysql

# 基本语法
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
Enter password: [输入密码后回车]

Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.32 MySQL Community Server

mysql>

方式二:Python 连接(使用 mysql-connector)

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()

方式三:Python 使用 SQLAlchemy(推荐)

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 连接数据库

Stata 可以通过 OBC 接口连接各种 SQL 数据库,非常适合数据分析工作流程。

配置 ODBC 数据源

1

安装数据库驱动

下载并安装对应数据库的 ODBC 驱动:

2

配置数据源(Windows)

打开 ODBC 数据源管理器:

控制面板 → 管理工具 → ODBC 数据源 (64位) 用户 DSN | 系统 DSN | 文件 DSN | 驱动程序 | 跟踪 | 连接池

添加系统 DSN,填写连接信息

3

在 Stata 中连接

使用 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 数据库分析流程

* ===========================================================
* 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")

📌 Stata ODBC 常用命令

命令说明
odbc load从数据库加载数据到 Stata
odbc insert将 Stata 数据插入数据库
odbc sql执行 SQL 语句(不加载到 Stata)
odbc list列出可用的 DSN
🏗️

数据库 vs 数据表

理解数据库和数据表的关系对于有效组织数据至关重要。

数据库服务器 (Database Server) 192.168.1.100:5432 company_db research_db

📊 层级关系

🖥️
数据库服务器:物理或虚拟服务器,运行数据库软件(如 PostgreSQL)
🗄️
数据库(Database):服务器的逻辑分区,用于组织相关数据(如 company_db)
📋
数据表(Table):数据库中的具体表格,存储实际数据(如 employees 表)
📝
记录(Record/Row):表中的一行,代表一个完整的数据项
🔢
字段(Field/Column):表中的一列,定义数据的属性

🎯 类比理解

数据库服务器 就像一座图书馆大楼
数据库 就像阅览室(有社科阅览室、科技阅览室等)
数据表 就像书架(每个书架放一类书)
记录 就像每一本书
字段 就像书名、作者、ISBN号等属性

🛠️

数据库可视化工具:DBeaver

除了命令行工具,使用图形界面的数据库管理工具可以让你的学习更加高效。我们推荐使用 DBeaver —— 一款免费开源的通用数据库管理工具。

📷 DBeaver 主界面 File Edit Database SQL Editor Database Navigator 🐘 PostgreSQL ├ company_db ├ research_db │ ├ employees │ └ sales SQL Editor SELECT * FROM employees WHERE salary > 50000; Execute Results id name salary 1 张三 85000 2 李四 92000

🌟 为什么推荐 DBeaver?

🆓
免费开源:社区版完全免费,功能强大,无需付费
🗄️
支持几乎所有数据库:MySQL、PostgreSQL、Oracle、SQL Server、SQLite 等
🖥️
跨平台:Windows、macOS、Linux 全平台支持
📊
可视化界面:图形化查询表结构、浏览数据、编辑记录
🔍
智能提示:SQL 自动补全、语法高亮、错误提示
📈
数据导出:轻松导出为 CSV、Excel、JSON 等格式

📥 下载和安装

1

访问官网下载

访问 DBeaver 官网:dbeaver.io/download/

DBeaver Community Edition ✓ 免费开源 支持所有主流数据库 下载
2

选择你的操作系统

DBeaver 支持 Windows、macOS 和 Linux,选择对应版本下载安装包

Windows (EXE)
macOS (DMG)
Linux (DEB/RPM)
3

安装和启动

下载后双击安装程序,一路"下一步"即可完成安装。启动后看到主界面。

🔗 创建数据库连接

📷 新建连接对话框 连接到数据库 🐘 PostgreSQL 🐬 MySQL 🔴 SQL Server More... Host: localhost Port: 5432 Database: Username: postgres Password: ••••••• 测试连接
1

点击"新建数据库连接"

在左上角工具栏点击数据库图标(或按 Ctrl+Shift+N)

2

选择数据库类型

例如选择 PostgreSQL,DBeaver 会自动填充默认端口号(5432)

3

填写连接信息

输入服务器地址、端口、数据库名、用户名和密码

4

测试并连接

点击"测试连接"按钮,确认配置正确后点击"完成"

🎯 DBeaver 实用技巧

  • F5:刷新数据库连接
  • Ctrl+Enter:执行当前 SQL 语句
  • 双击表名:查看表结构和数据
  • 右键表名 → 生成 SQL:自动生成 SELECT/INSERT/UPDATE 语句
  • 结果网格右键:导出数据为 CSV/Excel
💡

学习建议: 对于 SQL 初学者,强烈建议使用 DBeaver 这样的可视化工具!你可以实时看到查询结果,图形化地浏览表结构,智能提示帮你减少错误,大大提高学习效率。等熟练后,再学习命令行操作。

🔍

数据查询:SELECT 语句

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 = '销售部';

销售部高薪员工

高级查询功能

1

排序(ORDER BY)

SELECT name, salary FROM employees
ORDER BY salary DESC;

按薪资降序排列(DESC=降序,ASC=升序)

2

限制结果数量(LIMIT)

SELECT * FROM employees
ORDER BY salary DESC
LIMIT 10;

只返回前 10 条记录(常用于分页)

3

聚合函数

SELECT
  COUNT(*) AS total,
  AVG(salary) AS avg_salary,
  MAX(salary) AS max_salary
FROM employees;

统计员工数量、平均薪资、最高薪资

4

分组统计(GROUP BY)

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

  1. 查询所有销售额大于 1000 的记录
  2. 统计每个销售员的销售总额
  3. 找出销售日期在 2024 年的前 10 笔订单
🔨

创建和删除数据表

管理数据库结构的基本操作。

创建表(CREATE TABLE)

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)

简单删除

DROP TABLE employees;

⚠️ 直接删除,如果表不存在会报错

安全删除

DROP TABLE IF EXISTS employees;

✅ 表存在才删除,推荐使用

⚠️

重要警告: DROP TABLE 会永久删除表及其所有数据,无法恢复(除非有备份)。执行前务必确认!

修改表结构(ALTER 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 教程!

掌握 SQL 是数据分析的重要技能。继续练习,尝试连接真实的数据库,处理实际的数据问题,你会发现 SQL 强大的威力!

🌟

下一步: 尝试下载一个公开数据集,导入到本地数据库,使用 SQL 进行探索性数据分析!