SQL
1 基本概念
DB:database,保存数据的容器,通常是一个文件
DBMS:数据库管理系统,MySQL是DBMS,Navcat是一个可视化工具
table:某种数据的结构化清单
column:列,表中的一个字段
datatype:每个字段都有相应的数据类型,varchar,int,datetime
row:行,表中的一条记录
primary key:主键
SQL:Structured Query Language(结构化查询语言)
2 SELECT 查询
SELECT column1,column2 FROM table
SELECT * FROM table
3 DISTINCT 去重
SELECT DISTINCT column1,column2(column1,column2都不一样)
4 分页
MySQL: limit index, num // index 从0开始
Oracle:WHERE ROWNUM <= 5; // 前5条数据
5 排序
ORDER BY column1,column2
6 降序
默认升序。降序:DESC关键字,用在排序条件后
7 过滤:WHERE
操作符:=,>=,<>不等于,BETWEEN AND含两端,IS NULL为空,只有NULL用IS,其它的用=
8 高级过滤
AND,OR,使用()避免歧义
IN,功能与OR相当,速度更快
NOT:WHERE NOT id = 1;相当于<>
9 LIKE 模糊查询。% 通配符
LIKE ‘A%’。以A开头
10 拼接字段
MySQL:SELECT Concat(column1,‘(’,column2,‘)’) FROM table
Oracle:SELECT column1 || ‘(’ || column2 || ‘)’ FROM table
11 TRIM() 去空格
SELECT TRIM(column1) FROM table
12 别名 AS,Oracle不支持 AS,直接SELECT column1 c1
13 算数运算
SELECT column1*column2 AS total FROM table
14 函数
SELECT UPPER(column1) FROM table // 文本处理
WHERE EXTRACT(year FROM order_date) = 2020 // Oracle 日期处理
WHERE YEAR(year FROM order_date) = 2020 // MySQL 日期处理
15 聚合函数
AVG(),COUNT(),MAX&MIN()
16 分组
GROUP BY
17 过滤分组
HAVING COUNT(*) >= 2 // WHERE在分组前过滤,HAVING在分组后过滤
18 SELECT 子句顺序
SELECT,FROM,WHERE,GROUP BY,HAVING,ORDER BY
19 子查询
优先表子查询
WITH temp AS(
SELECT column1 AS mid
FROM table1
WHERE id = 1
) SELECT column2, mid
FROM table2 t2 LEFT JOIN temp ON t2.mid = temp.mid
WHERE temp.mid IS NOT NULL
20 表连接
LEFT JOIN:以左表为基准(取左表所有记录),右表匹配向左表
INNER JOIN:取得两个表中存在连接匹配关系的记录
21 联合查询
column 的 num 和 datatype 要一致
UNION ALL 直接连接,UNION 去重 DISTINCT
SELECT * FROM table WHERE id>5
UNION ALL
SELECT * FROM table WHERE age>10
22 INSERT 插入
INSERT INTO table(column1, column2) values(value1, value2)
23 UPDATE 更新
UPDATE table SET column1 = value1 WHERE id=5
24 DELETE 删除
DELETE FROM table WHERE column1 = value1 // 注意是DELETE FROM 不是 DELETE * FROM
25 事务处理
事务一组操作的集合,同时成功,同时失败
MySQL事务默认提交,改手动提交
SELECT @@autocommit;
SET @@autocommit=0;
提交事务:COMMIT; 回滚事务:ROLLBACK
26 索引
26-1 什么是数据库索引?
索引是一个带数据结构的存放record的容器
每次crud都会维护索引的数据结构。避免查询时出现全表扫描的情况。
26-2 5阶B树一个节点可以存几个数据?
四个。4个key存数据,5个指针指向5个子节点,key比指针始终少1。
26-3 B+树
所有的元素都会出现在叶子节点,非叶子节点起到索引的作用
叶子节点形成了一条单向链表,MySQl优化成双向链表
相比二叉树层级更少,搜索效率高
相比B树,只有叶子节点保存数据,非叶子节点只保存指针,叶子节点可以保存n个key,不用保存指针,相同数据层级更少。
相比HASH索引,支持范围匹配,HASH索引只支持等值匹配
26-4 B+树和B树
B+树非叶子节点不存储数据,所有数据存储在叶子节点,查询时间复杂度固定为log n。B树查询时间复杂度不固定,与key在树中的位置有关。
B+树叶子节点形成双向链表,支持范围匹配。B树中每个节点含数据和指针,不支持范围匹配。
B+树非叶子节点无数据域,单次IO数据量大。
26-5 索引方法(结构)
BTREE
HASH
26-6 索引类型
主键索引 PRIMARY
唯一索引 UNIQUE 此column数据会去重
常规索引 NORMAL
全文索引 FULLTEXT
空间索引 SPACIAL
26-7 聚集索引和二级索引
前者叶子节点保存record,后者保存主键id,主键索引默认聚集索引
27 存储引擎:InnoDB和MyISAM (MySQL-5.1版本前的引擎)
InnoDB支持事务,支持外键,是聚集索引,没有ROWNUM,支持行级锁
28 设置主键自增
alter table metallography_list modify metallography_list_id int auto_increment primary key
|