SQL 基础教程
欢迎来到 SQL 基础教程!SQL(Structured Query Language)是一种用于管理关系数据库的标准化语言。通过本教程,您将学会如何使用 SQL 进行数据查询、分析和操作。
什么是 SQL?
SQL 是一种声明式语言,用于:
- 📊 查询数据:从数据库中检索所需信息
- 📈 数据分析:统计、汇总和分析数据
- 🔗 关联数据:连接多个表格获取完整信息
- 📋 数据管理:筛选、排序和组织数据
为什么学习 SQL?
SQL 是数据分析的核心技能!无论您是数据分析师、产品经理还是开发者,SQL 都是必备技能。它能帮您快速从海量数据中获取洞察。
本教程特色
- 🎯 实战导向:每个概念都配有实际示例
- 📊 真实数据:使用企业员工管理系统数据
- 🚀 循序渐进:从基础到高级,逐步深入
- 💡 最佳实践:分享实用技巧和注意事项
数据库结构介绍
在开始学习 SQL 之前,让我们先了解本教程使用的数据库结构。我们使用一个模拟的企业管理系统,包含员工、部门和项目信息。
数据表概览
employees(员工表)
字段名 | 数据类型 | 描述 | 示例 |
---|---|---|---|
id | INTEGER | 员工ID(主键) | 1, 2, 3... |
name | TEXT | 员工姓名 | 张三, 李四 |
department | TEXT | 所属部门 | 技术部, 销售部 |
salary | INTEGER | 月薪(元) | 8000, 9500 |
hire_date | DATE | 入职日期 | 2022-01-15 |
departments(部门表)
字段名 | 数据类型 | 描述 | 示例 |
---|---|---|---|
id | INTEGER | 部门ID(主键) | 1, 2, 3... |
name | TEXT | 部门名称 | 技术部, 销售部 |
manager_id | INTEGER | 部门经理ID | 3, 2 |
projects(项目表)
字段名 | 数据类型 | 描述 | 示例 |
---|---|---|---|
id | INTEGER | 项目ID(主键) | 1, 2, 3... |
name | TEXT | 项目名称 | 网站重构 |
department_id | INTEGER | 负责部门ID | 1, 2 |
budget | INTEGER | 项目预算(元) | 50000 |
status | TEXT | 项目状态 | 进行中, 已完成 |
表关系图
表关系说明:
在练习场查看数据 →
- employees.department → departments.name(员工属于部门)
- departments.manager_id → employees.id(部门经理是员工)
- projects.department_id → departments.id(项目属于部门)
基础查询 - SELECT
SELECT 是 SQL 中最基本也是最重要的语句,用于从数据库表中检索数据。
查询所有数据
使用 SELECT *
可以查询表中的所有列和所有行:
SELECT * FROM employees;
查询结果:
id | name | department | salary | hire_date |
---|---|---|---|---|
1 | 张三 | 技术部 | 8000 | 2022-01-15 |
2 | 李四 | 销售部 | 6000 | 2022-03-20 |
3 | 王五 | 技术部 | 9500 | 2021-12-10 |
... 更多数据 |
查询指定列
通常我们不需要所有列的数据,可以指定需要的列:
SELECT name, salary FROM employees;
查询结果:
name | salary |
---|---|
张三 | 8000 |
李四 | 6000 |
王五 | 9500 |
去重查询
使用 DISTINCT
关键字可以去除重复的数据:
SELECT DISTINCT department FROM employees;
查询结果:
department |
---|
技术部 |
销售部 |
人事部 |
财务部 |
最佳实践:
练习基础查询 →
- 避免使用 SELECT * 在生产环境中,明确指定需要的列
- 列名顺序会影响结果显示顺序
- DISTINCT 会对性能有一定影响,谨慎使用
条件查询 - WHERE
WHERE 子句用于筛选满足特定条件的数据行,是数据查询中最常用的功能之一。
基本条件查询
使用 WHERE 子句筛选特定条件的数据:
SELECT * FROM employees WHERE department = '技术部';
查询结果:只显示技术部的员工
id | name | department | salary | hire_date |
---|---|---|---|---|
1 | 张三 | 技术部 | 8000 | 2022-01-15 |
3 | 王五 | 技术部 | 9500 | 2021-12-10 |
6 | 周八 | 技术部 | 8800 | 2021-11-30 |
比较运算符
SQL 支持多种比较运算符:
数值比较
-- 查询薪资大于8000的员工
SELECT name, salary FROM employees WHERE salary > 8000;
-- 查询薪资在6000到9000之间的员工
SELECT name, salary FROM employees WHERE salary BETWEEN 6000 AND 9000;
文本比较
-- 查询不是技术部的员工
SELECT name, department FROM employees WHERE department != '技术部';
-- 查询特定部门的员工
SELECT name FROM employees WHERE department IN ('技术部', '销售部');
逻辑运算符
使用 AND、OR、NOT 组合多个条件:
-- AND:同时满足多个条件
SELECT name, department, salary
FROM employees
WHERE department = '技术部' AND salary > 8500;
-- OR:满足任一条件
SELECT name, department, salary
FROM employees
WHERE department = '技术部' OR salary > 9000;
-- NOT:不满足条件
SELECT name, department
FROM employees
WHERE NOT department = '技术部';
模糊查询
使用 LIKE 进行模糊匹配:
-- 查询姓名包含"王"的员工
SELECT name FROM employees WHERE name LIKE '%王%';
-- 查询2022年入职的员工
SELECT name, hire_date FROM employees WHERE hire_date LIKE '2022%';
-- 查询姓名以"张"开头的员工
SELECT name FROM employees WHERE name LIKE '张%';
LIKE 通配符说明:
%
:匹配任意长度的字符(包括0个字符)_
:匹配单个字符- 例如:
'张%'
匹配所有以"张"开头的姓名
注意事项:
练习条件查询 →
- 字符串比较区分大小写(取决于数据库设置)
- LIKE 查询可能影响性能,避免在大表上频繁使用
- NULL 值需要使用 IS NULL 或 IS NOT NULL 判断