# DB/DBS/DBMS

区分数据库 / 数据库系统 / 数据库管理系统

# 1NF/2NF/3NF/BCNF

原子性越来越高

# DDl/DML

数据库定义 / 操作语言

# 索引

B tree/ B+ tree/ Hashing 的优缺点
覆盖索引
联合索引最左匹配、是否命中、什么时候停止

# 事务的隔离级别

  • 读未提交 (READ_UNCOMMITTED):可能发生脏读、幻读、不可重复读
  • 读已提交 (READ_COMMITTED):可能发生幻读、不可重复读(解决了脏读)
  • 可重复读 (REPEATABLE_READ):可能发生幻读
  • 可串行化 (SERIALIZABLE):满足 ACID

# log

  • binlog
  • redo
  • undo

# 并发控制

  • 共享锁 (S)
  • 排他锁 (X)
  1. MVCC 多版本并发控制
    隐藏字段,read view, undo, 快照

# SQL 怎么写

  • SELECT
1
2
3
4
SELECT column_name(s)
FROM table_name
WHERE condition
ORDER BY column_name [ASC|DESC]
  • INSERT
1
2
INSERT INTO table_name (column1, column2, column3, ...)
VALUES (value1, value2, value3, ...)
  • UPDATE
1
2
3
UPDATE table_name
SET column1 = value1, column2 = value2, ...
WHERE condition
  • DELETE
1
2
DELETE FROM table_name 
WHERE condition
  • CREATE TABLE
1
2
3
4
5
CREATE TABLE table_name (
column1 data_type constraint,
column2 data_type constraint,
...
)
  • ALTER TABLE
1
2
3
4
5
ALTER TABLE table_name
ADD column_name datatype

ALTER TABLE table_name
DROP COLUMN column_name
  • DROP TABLE
1
DROP TABLE table_name
  • CREATE INDEX
1
2
CREATE INDEX index_name
ON table_name (column_name)
  • DROP INDEX
1
2
DROP INDEX index_name
ON table_name
  • WHERE
  • ORDER BY: 用于对结果集进行排序
1
2
3
4
SELECT column_name(s)
FROM table_name
WHERE condition
ORDER BY column_name [ASC|DESC]
  • GROUP BY: 用于将结果集按照一个或多个列进行分组,通常与聚合函数一起使用
1
2
3
4
SELECT column_name(s), aggregate_function(column_name)
FROM table_name
WHERE condition
GROUP BY column_name
  • HAVING: 用于对分组后的结果集进行筛选
1
2
3
4
5
SELECT column_name(s), aggregate_function(column_name)
FROM table_name
WHERE condition
GROUP BY column_name
HAVING aggregate_function(column_name) condition
  • JOIN: 用于将多个表进行连接,并返回满足条件的行
1
2
3
4
SELECT column_name(s)
FROM table_name1
JOIN table_name2
ON table_name1.column_name = table_name2.column_name
  • UNION: 用于将多个查询结果集进行合并
1
2
3
SELECT column_name(s) FROM table_name1
UNION
SELECT column_name(s) FROM table_name2
  • INTERSECT: 用于返回两个查询结果集的交集
1
2
3
SELECT column_name(s) FROM table_name1
INTERSECT
SELECT column_name(s) FROM table_name2
  • EXCEPT: 用于返回第一个查询结果集中存在但在第二个查询结果集中不存在的行
1
2
3
SELECT column_name(s) FROM table_name1
EXCEPT
SELECT column_name(s) FROM table_name2
  • DISTINCT: 用于返回唯一不同的值
1
2
3
SELECT DISTINCT column_name(s)
FROM table_name
WHERE condition
  • BETWEEN: 用于筛选在某个范围内的值
  • IN: 用于筛选在某个列表中的值
1
2
3
SELECT * FROM Websites
WHERE (alexa BETWEEN 1 AND 20)
AND country NOT IN ('USA', 'IND');
  • CREATE DATABASE
1
CREATE DATABASE database_name
  • DROP DATABASE
1
DROP DATABASE database_name
  • LIKE: 用于在 WHERE 子句中搜索列中的指定模式,要求整个字段的内容都匹配模式
1
2
3
SELECT column1, column2, ...
FROM table_name
WHERE column_name LIKE pattern;

pattern 可以包含以下通配符:

  • %:表示任意数量的字符(包括零个字符)
  • _:表示单个字符

WHERE name LIKE ‘Admin’:只会找名字刚好就是 “Admin” 的人。
WHERE name LIKE ‘% Admin%’:才能找到包含 “Admin” 的人。

  • REGEXP: 用于在 WHERE 子句中搜索列中的指定正则表达式模式,部分匹配(只要字符串里包含模式即可)
1
2
3
SELECT column1, column2, ...
FROM table_name
WHERE column_name REGEXP pattern;

WHERE name REGEXP ‘Admin’:会找到 “Admin”, “SuperAdmin”, “Admin123” 等所有包含这五个字母的记录。
如果你想让 REGEXP 像 LIKE 那样精确匹配开头和结尾,必须加符号:REGEXP ‘^Admin$’。
SELECT * FROM Websites WHERE name REGEXP '^[^A-H]'; 会找到所有名字以 A-H 以外的字母开头的网站。第一个表示匹配开头,第二个表示取反。

JOIN 的类型:

  • 内连接 (INNER JOIN):返回两个表中都存在的行
  • 外连接 (OUTER JOIN):返回两个表中至少有一个存在的行
    • 左外连接 (LEFT OUTER JOIN):返回左表中的所有行以及右表中匹配的行,如果右表没有匹配的行,则结果中对应的列为 NULL
    • 右外连接 (RIGHT OUTER JOIN):返回右表中的所有行以及左表中匹配的行,如果左表没有匹配的行,则结果中对应的列为 NULL
    • 全外连接 (FULL OUTER JOIN):返回两个表中的所有行,如果某个表没有匹配的行,则结果中对应的列为 NULL
    • Self JOIN: 用于将一张表与自身连接,从而实现多表查询
    • CROSS JOIN: 用于将两张表进行交叉连接,返回两张表中的每一行都出现的所有组合
1
2
3
4
5
6
7
8
9
10
SELECT * FROM table1
JOIN table2 ON table1.column_name = table2.column_name;
SELECT * FROM table1
LEFT JOIN table2 ON table1.column_name = table2.column_name;
SELECT * FROM table1
RIGHT JOIN table2 ON table1.column_name = table2.column_name;
SELECT * FROM table1
FULL JOIN table2 ON table1.column_name = table2.column_name;
SELECT * FROM table1
CROSS JOIN table2 ON table1.column_name = table2.column_name;

不能写 = NULL,要写 IS NULL

  • 约束
    • NOT NULL: 确保字段不能为空,如果不向字段添加值,就无法插入新记录或者更新记录
    • UNIQUE: 确保字段值唯一,不允许重复值出现,可以在多个字段上使用 UNIQUE 约束,组合起来保证唯一性
    • PRIMARY KEY: 作为表的主键,唯一标识每一行数据,不允许 NULL 值,自动创建唯一索引
    • FOREIGN KEY: 作为外键,引用另一个表的主键,确保数据的完整性和一致性,防止在子表中插入不存在于父表中的值
    • CHECK: 确保字段的值满足指定的条件
    • DEFAULT: 为字段设置默认值,当插入新记录时,如果没有为该字段提供值,就会使用默认值
    • INDEX: 创建索引以提高查询性能
1
2
3
4
5
6
7
8
CREATE TABLE Students (
StudentID INT NOT NULL PRIMARY KEY,
LastName VARCHAR(50) NOT NULL,
FirstName VARCHAR(50) NOT NULL,
Age INT CHECK (Age >= 18),
Email VARCHAR(100) UNIQUE,
EnrollmentDate DATE DEFAULT GETDATE()
);
  • 别名
    AS

# SQL 执行流程

Edited on

Give me a cup of [coffee]~( ̄▽ ̄)~*

NoResponse WeChat Pay

WeChat Pay

NoResponse Alipay

Alipay

NoResponse PayPal

PayPal