SQL简介
SQL简介
想象你走进一家大型图书馆,想借一本特定的书。你需要和图书管理员沟通——告诉她书名、作者或者分类号,她就能帮你找到目标。SQL(Structured Query Language,结构化查询语言)就是你和数据库"管理员"之间的通用语言。无论数据库里存了几百万条数据,只要你会用SQL,就能精确地查询、添加、修改或删除你想要的信息。
1. 核心概念
什么是SQL?
SQL是一种专门用来与关系数据库(Relational Database)沟通的标准语言。它诞生于1970年代,由IBM的研究员提出,如今已经成为全球最广泛使用的数据库查询语言。
为什么学SQL?
- 市场需求大:后端开发、数据分析、数据科学等岗位几乎都要求掌握SQL
- 通用性强:学会SQL后可以在MySQL、PostgreSQL、SQLite、SQL Server等多种数据库之间无缝切换
- 逻辑清晰:SQL语句接近自然语言,入门门槛低,但功能极其强大
- 经久不衰:SQL已经流行了50多年,至今仍是数据领域的核心技能
关系数据库核心概念
关系数据库用表(Table)来组织数据,就像Excel表格一样直观:
| 概念 | 说明 | 类比 |
|---|---|---|
| 表(Table) | 存储数据的集合 | Excel中的一个工作表 |
| 行(Row) | 一条具体的数据记录 | Excel中的一行 |
| 列(Column) | 数据的某个属性/字段 | Excel中的一列 |
| 主键(Primary Key) | 唯一标识每一行的列 | 身份证号码 |
举例来说,一个employees(员工)表:
| id | name | department | salary |
|---|---|---|---|
| 1 | 张三 | 技术部 | 15000 |
| 2 | 李四 | 市场部 | 12000 |
- 每一行代表一个员工
id列是主键,确保每个员工有唯一标识name、department、salary是描述员工信息的列
SQL vs NoSQL
| 对比项 | SQL(关系型) | NoSQL(非关系型) |
|---|---|---|
| 数据结构 | 表(行和列) | 文档、键值对、图等 |
| 模式 | 固定模式(Schema) | 灵活/无模式 |
| 事务支持 | 强一致性(ACID) | 最终一致性 |
| 扩展方式 | 垂直扩展 | 水平扩展 |
| 典型场景 | 银行、电商订单 | 日志、社交数据 |
| 代表产品 | MySQL、PostgreSQL | MongoDB、Redis |
主流数据库对比
| 数据库 | 特点 | 适用场景 |
|---|---|---|
| MySQL | 开源、生态成熟、性能优秀 | Web应用、中小型项目 |
| PostgreSQL | 功能最强、支持JSON、扩展性好 | 复杂查询、地理数据、大型项目 |
| SQLite | 轻量级、无需服务器、单文件存储 | 移动端、嵌入式、本地测试 |
| SQL Server | 微软出品、与.NET集成好 | 企业级应用、Windows生态 |
2. 基本语法/用法
SQL语法基础
SQL语句以分号;结尾,关键字不区分大小写(但建议大写以提高可读性)。
SELECT name, salary FROM employees WHERE salary > 10000;
上面这条语句的含义:从employees表中,查询工资超过10000的员工的name和salary。
SQL命令分类
SQL命令按功能分为四大类:
| 分类 | 全称 | 用途 | 常用命令 |
|---|---|---|---|
| DDL | Data Definition Language | 定义数据库结构 | CREATE、ALTER、DROP |
| DML | Data Manipulation Language | 操作数据(增删改查) | SELECT、INSERT、UPDATE、DELETE |
| DCL | Data Control Language | 权限控制 | GRANT、REVOKE |
| TCL | Transaction Control Language | 事务管理 | COMMIT、ROLLBACK |
SELECT、FROM、WHERE)是保留字,不能用作表名或列名。
示例:查询所有数据(难度⭐)
最基础的查询——获取表中所有数据:
-- 查询所有员工信息
SELECT * FROM employees;
执行结果示例:
id name department_id salary hire_date
1 张三 1 15000.00 2023-01-15
2 李四 2 12000.00 2023-03-20
3 王五 1 18000.00 2022-06-01
*表示"所有列"。在生产环境中建议明确写出列名,避免返回不必要的数据。
示例:创建表并插入数据(难度⭐)
使用DDL创建一张简单的表,然后用DML插入数据:
-- 创建学生表
CREATE TABLE students (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
age INTEGER,
grade TEXT
);
-- 插入两条数据
INSERT INTO students (name, age, grade) VALUES ('小明', 18, '高三');
INSERT INTO students (name, age, grade) VALUES ('小红', 17, '高二');
-- 查询验证
SELECT * FROM students;
执行结果:
id name age grade
1 小明 18 高三
2 小红 17 高二
3. 常见应用场景
场景一:电商网站数据管理
一个电商平台需要管理商品、用户、订单等数据。SQL可以轻松完成:
-- 查询库存不足的商品
SELECT name, stock FROM products WHERE stock < 10;
-- 统计本月订单总额
SELECT SUM(quantity * price) AS total_revenue
FROM orders
JOIN products ON orders.product_id = products.id
WHERE order_date >= '2026-06-01';
场景二:员工管理系统
企业HR系统需要管理员工信息、部门、薪资等:
-- 查询各部门平均薪资
SELECT department_id, AVG(salary) AS avg_salary
FROM employees
GROUP BY department_id;
-- 查询2023年入职的员工
SELECT name, hire_date FROM employees
WHERE hire_date BETWEEN '2023-01-01' AND '2023-12-31';
❓ 常见问题
Q:SQL难学吗? A: 不难。SQL语法接近英语,核心命令只有几个(SELECT、INSERT、UPDATE、DELETE),掌握基本用法只需要几天时间。
Q:需要先安装数据库才能学吗? A: 推荐先用SQLite入门,它不需要安装服务器,只需要一个文件即可运行。本教程第02课会教你如何搭建环境。
Q:SQL和MySQL有什么区别? A: SQL是一种语言标准,MySQL是使用SQL语言的具体数据库产品。就像"英语"和"美国人"的关系一样。
Q:学SQL能找到什么工作? A: 后端开发工程师、数据分析师、数据工程师、BI工程师、DBA(数据库管理员)等岗位都离不开SQL。
📖 小节
- SQL是与关系数据库沟通的标准语言,已有50多年历史
- 关系数据库用表、行、列来组织数据,主键唯一标识每一行
- SQL命令分为DDL(定义结构)、DML(操作数据)、DCL(权限控制)、TCL(事务管理)
- 主流数据库有MySQL、PostgreSQL、SQLite、SQL Server,初学推荐SQLite
- SQL适合大多数业务场景,NoSQL适合特殊需求(超大规模、灵活结构)
📝 作业
作业1(⭐):用自己的话解释什么是主键(Primary Key),为什么每张表都需要主键?
作业2(⭐⭐):假设你要设计一张"图书"表(books),包含书名、作者、价格、出版日期,请写出CREATE TABLE语句。
作业3(⭐⭐⭐):对比SQL和NoSQL,列出各自3个优点和3个缺点,并说明什么场景下应该选择哪种数据库。
统一示例数据库
以下是后面27课会用到的数据,先有个印象,第02课装好环境后可以复制执行:
-- 部门表
CREATE TABLE departments (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
location TEXT
);
-- 员工表
CREATE TABLE employees (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
department_id INTEGER,
salary DECIMAL(10,2),
hire_date DATE,
FOREIGN KEY (department_id) REFERENCES departments(id)
);
-- 产品表
CREATE TABLE products (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
category TEXT,
price DECIMAL(10,2),
stock INTEGER DEFAULT 0
);
-- 订单表
CREATE TABLE orders (
id INTEGER PRIMARY KEY AUTOINCREMENT,
customer_name TEXT NOT NULL,
product_id INTEGER,
quantity INTEGER,
order_date DATE,
FOREIGN KEY (product_id) REFERENCES products(id)
);
下一课
👉 02 - 环境搭建:安装数据库工具,配置学习环境,运行你的第一条SQL语句!



