自学SQL的小网站,使用小猫神力展开领域!
https://www.w3schools.com/sql/
第一部分:SQL 概述
1.1 什么是 SQL?
SQL 是结构化查询语言的缩写,是用于管理和操作关系型数据库的标准语言。
1.2 SQL 的特点
- 声明式语言:只需描述”要什么”,不需要描述”怎么做”
- 标准化:遵循 ANSI/ISO 标准
- 功能完备:包含数据定义、查询、更新、控制等功能
1.3 SQL 语言分类
- DDL - 数据定义语言
- DQL - 数据查询语言
- DML - 数据操作语言
- DCL - 数据控制语言
仅有 9 个动词:CREATE, DROP, ALTER; SELECT; INSERT, UPDATE, DELETE; GRANT, REVOKE
1.4 可以独立完成数据库生命周期中的全部活动:
- 创建和删除数据库模式
- 创建基本表,创建视图
- 使用数据库,包括查询和增删改数据、事务处理等
- 数据库控制,包括安全性控制、完整性控制和并发控制等
- 数据库维护和重构,如修改和删除基本表、数据库备份与恢复等
1.5 SQL与关系数据库三级模式
1.6层次化的数据库对象命名机制
- 一个关系数据库管理系统的实例(Instance)中可以建立多个数据库
- 一个数据库中可以建立多个模式
- 一个模式下通常包括多个表、视图和索引等数据库对象
第二部分:数据定义(DDL)
2.1 数据库操作
1
2
3
4
5
6
7
8
| -- 创建数据库
CREATE DATABASE company;
-- 使用数据库
USE company;
-- 删除数据库
DROP DATABASE company;
|
2.2 表操作
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| -- 创建表
CREATE TABLE employees (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50) NOT NULL,
age INT,
department VARCHAR(50),
salary DECIMAL(10,2),
hire_date DATE
);
-- 修改表结构
ALTER TABLE employees ADD COLUMN email VARCHAR(100);
ALTER TABLE employees MODIFY COLUMN name VARCHAR(100);
ALTER TABLE employees DROP COLUMN age;
-- 删除表
DROP TABLE employees;
|
2.3 约束类型
PRIMARY KEY - 主键FOREIGN KEY - 外键NOT NULL - 非空UNIQUE - 唯一CHECK - 检查条件DEFAULT - 默认值
第三部分:数据查询(DQL)
3.1 基础查询
1
2
3
4
5
6
7
8
| -- 查询所有列
SELECT * FROM employees;
-- 查询特定列
SELECT name, department, salary FROM employees;
-- 列别名
SELECT name AS 姓名, salary AS 薪资 FROM employees;
|
3.2 WHERE 条件筛选
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| -- 比较运算符
SELECT * FROM employees WHERE salary > 5000;
SELECT * FROM employees WHERE department = '技术部';
-- 逻辑运算符
SELECT * FROM employees
WHERE salary > 5000 AND department = '技术部';
SELECT * FROM employees
WHERE department = '技术部' OR department = '销售部';
-- BETWEEN, IN, LIKE
SELECT * FROM employees WHERE salary BETWEEN 4000 AND 8000;
SELECT * FROM employees WHERE department IN ('技术部', '销售部');
SELECT * FROM employees WHERE name LIKE '张%'; -- 张开头
SELECT * FROM employees WHERE name LIKE '%三%'; -- 包含"三"
|
3.3 排序和限制
1
2
3
4
5
6
7
8
9
10
11
| -- 排序
SELECT * FROM employees ORDER BY salary DESC; -- 降序
SELECT * FROM employees ORDER BY hire_date ASC; -- 升序
-- 多列排序
SELECT * FROM employees
ORDER BY department ASC, salary DESC;
-- 限制结果数量
SELECT * FROM employees LIMIT 10; -- 前10条
SELECT * FROM employees LIMIT 5, 10; -- 从第5条开始的10条
|
3.4 聚合函数和分组
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| -- 常用聚合函数
SELECT COUNT(*) FROM employees; -- 计数
SELECT AVG(salary) FROM employees; -- 平均值
SELECT MAX(salary) FROM employees; -- 最大值
SELECT MIN(salary) FROM employees; -- 最小值
SELECT SUM(salary) FROM employees; -- 求和
-- 分组统计
SELECT department, AVG(salary) as avg_salary
FROM employees
GROUP BY department;
-- HAVING 筛选分组结果
SELECT department, AVG(salary) as avg_salary
FROM employees
GROUP BY department
HAVING AVG(salary) > 5000;
|
3.5 多表连接
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| -- 内连接
SELECT e.name, d.department_name
FROM employees e
INNER JOIN departments d ON e.department_id = d.id;
-- 左连接
SELECT e.name, d.department_name
FROM employees e
LEFT JOIN departments d ON e.department_id = d.id;
-- 右连接
SELECT e.name, d.department_name
FROM employees e
RIGHT JOIN departments d ON e.department_id = d.id;
|
3.6 子查询
1
2
3
4
5
6
7
8
9
10
| -- 在 WHERE 中使用子查询
SELECT name, salary
FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees);
-- 在 FROM 中使用子查询
SELECT dept, avg_sal
FROM (SELECT department as dept, AVG(salary) as avg_sal
FROM employees
GROUP BY department) as temp;
|
第四部分:数据更新(DML)
4.1 插入数据
1
2
3
4
5
6
7
8
9
10
11
12
13
| -- 插入完整记录
INSERT INTO employees (name, department, salary, hire_date)
VALUES ('张三', '技术部', 8000, '2023-01-15');
-- 插入多条记录
INSERT INTO employees (name, department, salary, hire_date)
VALUES
('李四', '销售部', 7000, '2023-02-20'),
('王五', '技术部', 9000, '2023-03-10');
-- 插入查询结果
INSERT INTO temp_employees (name, salary)
SELECT name, salary FROM employees WHERE salary > 5000;
|
4.2 更新数据
1
2
3
4
5
6
7
8
9
| -- 更新特定记录
UPDATE employees
SET salary = salary * 1.1 -- 涨薪10%
WHERE department = '技术部';
-- 更新多个字段
UPDATE employees
SET salary = 8500, department = '高级技术部'
WHERE name = '张三';
|
4.3 删除数据
1
2
3
4
5
6
7
8
9
| -- 删除特定记录
DELETE FROM employees
WHERE salary < 4000;
-- 清空表(谨慎使用!)
DELETE FROM employees;
-- 更快的清空表(不可回滚)
TRUNCATE TABLE employees;
|
第五部分:视图
大多数情况下,我们想应用视图,只是为了查询
5.1 视图的概念
视图是基于 SQL 语句的结果集的虚拟表,不存储实际数据。
5.2 创建和使用视图
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| -- 创建视图
CREATE VIEW high_salary_employees AS
SELECT name, department, salary, hire_date
FROM employees
WHERE salary > 7000;
-- 使用视图
SELECT * FROM high_salary_employees
WHERE department = '技术部';
-- 创建带条件的视图
CREATE VIEW department_stats AS
SELECT
department,
COUNT(*) as employee_count,
AVG(salary) as avg_salary,
MAX(salary) as max_salary
FROM employees
GROUP BY department;
|
5.3 修改和删除视图
1
2
3
4
5
6
7
8
| -- 修改视图定义
CREATE OR REPLACE VIEW high_salary_employees AS
SELECT name, department, salary, hire_date
FROM employees
WHERE salary > 8000; -- 修改了条件
-- 删除视图
DROP VIEW high_salary_employees;
|
5.4 视图的优点
- 简化复杂查询:将复杂查询封装成视图
- 数据安全:只暴露必要字段
- 逻辑独立性:底层表结构变化不影响应用
- 访问控制:对不同用户提供不同视图
5.5 可更新视图
满足以下条件的视图可以执行 INSERT、UPDATE、DELETE:
- 来自单一表
- 包含表的所有非空列
- 没有使用聚合函数、GROUP BY、DISTINCT 等
1
2
3
4
5
6
7
8
9
| CREATE VIEW editable_employee_view AS
SELECT id, name, department, salary
FROM employees
WHERE department = '技术部';
-- 可以通过视图更新数据
UPDATE editable_employee_view
SET salary = 9500
WHERE name = '王五';
|