Post

sql简介

sql简介
自学SQL的小网站,使用小猫神力展开领域!

https://www.w3schools.com/sql/

第一部分:SQL 概述

1.1 什么是 SQL?

SQL 是结构化查询语言的缩写,是用于管理和操作关系型数据库的标准语言。

1.2 SQL 的特点

  • 声明式语言:只需描述”要什么”,不需要描述”怎么做”
  • 标准化:遵循 ANSI/ISO 标准
  • 功能完备:包含数据定义、查询、更新、控制等功能

1.3 SQL 语言分类

  1. DDL - 数据定义语言
  2. DQL - 数据查询语言
  3. DML - 数据操作语言
  4. DCL - 数据控制语言

仅有 9 个动词:CREATE, DROP, ALTER; SELECT; INSERT, UPDATE, DELETE; GRANT, REVOKE

1.4 可以独立完成数据库生命周期中的全部活动:

  • 创建和删除数据库模式
  • 创建基本表,创建视图
  • 使用数据库,包括查询和增删改数据、事务处理等
  • 数据库控制,包括安全性控制、完整性控制和并发控制等
  • 数据库维护和重构,如修改和删除基本表、数据库备份与恢复等

1.5 SQL与关系数据库三级模式

image-20251020141728576


  • 外模式 = 视图 + 用户有权访问的基本表子集

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 - 默认值

截屏2025-10-20 14.59.34


第三部分:数据查询(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 视图的优点

  1. 简化复杂查询:将复杂查询封装成视图
  2. 数据安全:只暴露必要字段
  3. 逻辑独立性:底层表结构变化不影响应用
  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 = '王五';
This post is licensed under CC BY 4.0 by the author.

Trending Tags