廖雪峰SQL教程学习笔记
Posted Spring-_-Bear
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了廖雪峰SQL教程学习笔记相关的知识,希望对你有一定的参考价值。
原文链接:SQL教程 - 廖雪峰的官方网站
博文推荐:参考第 24 章零基础学MySQL
一、关系型数据库概述
- NoSQL 的发展历史
- 1970:NoSQL = We have no SQL
- 1980:NoSQL = Know SQL
- 2000:NoSQL = No SQL!
- 2005:NoSQL = Not only SQL
- 2013:NoSQL = No,SQL!
- 层次模型
- 网状模型
- 关系模型
- 各个数据库支持的各自扩展的功能,通常我们把它们称之为“方言”
二、安装 mysql
三、关系模型
- NULL 表示字段数据不存在,通常情况下,字段应该避免允许为NULL。不允许为NULL可以简化查询条件,加快查询速度,也利于应用程序读取数据后无需判断是否为NULL
主键
- id 的全局唯一 GUID 类型:使用一种全局唯一的字符串作为主键,类似
8f55d96b-8acc-4636-8cb8-76bf8abc2f57
。GUID 算法通过网卡 MAC 地址、时间戳和随机数保证任意计算机在任意时间生成的字符串都是不同的,大部分编程语言都内置了GUID算法,可以自己预算出主键
外键
- 由于外键约束会降低数据库的性能,大部分互联网应用程序为了追求速度,并不设置外键约束,而是仅靠应用程序自身来保证逻辑的正确性
索引
- 索引的效率取决于索引列的值是否散列,即该列的值如果越互不相同,那么索引效率越高
- 索引的优点是提高了查询效率,缺点是在插入、更新和删除记录时,需要同时修改索引,因此,索引越多,插入、更新和删除记录的速度就越慢
- 给字段添加唯一索引:
ALTER TABLE table_name ADD UNIQUE INDEX uni_name (name);
- 给字段添加唯一约束:
ALTER TABLE table_name ADD CONSTRAINT uni_name UNIQUE (name);
四、在线 SQL
五、查询数据
基本查询
- 不带 FROM 子句的 SELECT 语句有一个有用的用途,就是用来判断当前到数据库的连接是否有效。许多检测工具会执行一条 SELECT 1; 来测试数据库连接
条件查询
投影查询
- 投影查询:只选取数据库表中指定的列
排序
分页查询
聚合查询
- 如果聚合查询的 WHERE 条件没有匹配到任何行,COUNT() 会返回 0,而 SUM()、AVG()、MAX() 和 MIN()会 返回 NULL
多表查询
连接查询
- 连接查询对多个表进行 JOIN 运算,简单地说,就是先确定一个主表作为结果集,然后,把其他表的行有选择性地 “连接” 在主表结果集上
- INNER JOIN 是选出两张表都存在的记录
- LEFT OUTER JOIN 是选出左表存在的记录
- RIGHT OUTER JOIN 是选出右表存在的记录
- FULL OUTER JOIN 则是选出左右表都存在的记录
六、修改数据
INSERT
UPDATE
DELETE
七、MySQL
- MySQL Client 的可执行程序是 mysql,MySQL Server 的可执行程序是 mysqld
管理 MySQL
实用 SQL 语句
- 插入或替换
REPLACE INTO students (id, class_id, name, gender, score) VALUES (1, 1, '小明', 'F', 99);
- 插入或更新
INSERT INTO students (id, class_id, name, gender, score) VALUES (1, 1, '小明', 'F', 99) ON DUPLICATE KEY UPDATE name='小明', gender='F', score=99;
- 插入或忽略
INSERT IGNORE INTO students (id, class_id, name, gender, score) VALUES (1, 1, '小明', 'F', 99);
- 强制指定索引:在查询的时候,数据库系统会自动分析查询语句,并选择一个最合适的索引。但是很多时候,数据库系统的查询优化器并不一定总是能使用最优索引。如果我们知道如何选择索引,可以使用 FORCE INDEX 强制查询使用指定的索引
SELECT * FROM students FORCE INDEX (idx_class_id) WHERE class_id = 1 ORDER BY id DESC;
八、事务
- 数据库事务的 ACID 特性
名称 | 描述 |
---|---|
原子性(atomic) | 将所有 SQL 作为原子工作单元执行,要么全部执行,要么全部不执行 |
一致性(consistency) | 事务操作成功,所有数据的状态都是一致的 |
隔离性(isolation) | 如果有多个事务并发执行,事务之间必须隔离执行 |
持久性(duration) | 事务操作成功,对数据的修改被持久化存储 |
- MySQL 隔离级别
MySQL隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
读未提交(read uncommintted) | Y | Y | Y |
读已提交(read committed) | N | Y | Y |
可重复读(repeatable read) | N | N | Y |
可串行化(serializable) | N | N | N |
Read Uncommitted
- 读未提交,可能会遇到脏读问题(dirty read)。所谓脏读也即一个事务会读到另一个事务更新但尚未提交的数据,如果另一个事务回滚,那么当前事务督导的数据就是脏数据
Read Committed
- 读已提交,可能会遇到不可重复读问题。不可重复读是指,在一个事务内,多次读同一个数据,在当前事务还未结束时,若另一个事务恰好修改了这个数据并提交,那么,当前事务两次读取到的数据就可能不一致
Repeatable Read
- 可重复读,可能会遇到幻读问题。所谓幻读是指,在一个事务中读取到了另一个事务的插入数据操作。也即当前事务第一次查询某条记录时未查询到,同时另一个事务往相同的表中插入数据并提交,当前事务第二次读取同一条记录时,读取到了记录
Serializable
-
所有事务按照次序依次执行,因此,脏读、不可重复读、幻读都不会出现。但由于事务是串行执行,所以效率会大大下降,应用程序的性能会急剧降低。如果没有特别重要的情景,一般都不会使用 Serializable 隔离级别
-
在 MySQL 中,如果使用 InnoDB,默认的隔离级别是 Repeatable Read
九、开发集成
十、期末总结
以上是关于廖雪峰SQL教程学习笔记的主要内容,如果未能解决你的问题,请参考以下文章