内连接(inner join):取得两张表中满足存在连接匹配关系的记录。
外连接(outer join):不只取得两张表中满足存在连接匹配关系的记录,还包括某张表(或两张表)中不满足匹配关系的记录。
交叉连接(cross join):显示两张表所有记录一一对应,没有匹配关系进行筛选,它是笛卡尔积在 SQL 中的实现,如果 A 表有 m 行,B 表有 n 行,那么 A 和 B 交叉连接的结果就有 m*n 行。
笛卡尔积:是数学中的一个概念,例如集合 A={a,b},集合 B={1,2,3},那么 A✖️B={,,,,,,}。
MySQL 的连接主要分为内连接和外连接,外连接常用的有左连接、右连接。
三大范式的作用是为了控制数据库的冗余,是对空间的节省,实际上,一般互联网公司的设计都是反范式的,通过冗余一些数据,避免跨表跨库,利用空间换时间,提高性能。
**
**
char:
varchar:
日常的设计,对于长度相对固定的字符串,可以使用 char,对于长度不确定的,使用 varchar 更合适一些。
**
相同点:
区别:
DATETIME 和 TIMESTAMP 的区别
MySQL 中的 in 语句是把外表和内表作 hash 连接,而 exists 语句是对外表作 loop 循环,每次 loop 循环再对内表进行查询。我们可能认为 exists 比 in 语句的效率要高,这种说法其实是不准确的,要区分情景:
货币在数据库中 MySQL 常用 Decimal 和 Numric 类型表示,这两种类型被 MySQL 实现为同样的类型。他们被用于保存与货币有关的数据。
例如 salary DECIMAL(9,2),9(precision)代表将被用于存储值的总的小数位数,而 2(scale)代表将被用于存储小数点后的位数。存储在 salary 列中的值的范围是从-9999999.99 到 9999999.99。
DECIMAL 和 NUMERIC 值作为字符串存储,而不是作为二进制浮点数,以便保存那些值的小数精度。
之所以不使用 float 或者 double 的原因:因为 float 和 double 是以二进制存储的,所以有一定的误差。
MySQL 可以直接使用字符串存储 emoji。
但是需要注意的,utf8 编码是不行的,MySQL 中的 utf8 是阉割版的 utf8,它最多只用 3 个字节存储字符,所以存储不了表情。那该怎么办?
需要使用 utf8mb4 编码。
alter table blogs modify content text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci not null;
三者都表示删除,但是三者有一些差别:
因此,在不再需要一张表的时候,用 drop;在想删除部分数据行时候,用 delete;在保留表而删除所有数据的时候用 truncate。
参考书籍(访问密码: 6798):
深入浅出MySQL++数据库开发、优化与管理维护+第2版+唐汉明.pdf: https://url31.ctfile.com/f/40632231-735785515-c1ff5b?
高性能MySQL(第3版).pdf: https://url31.ctfile.com/f/40632231-735785459-780d3e?
SQL查询的艺术.pdf: https://url31.ctfile.com/f/40632231-735785297-8c1d65?
MySQL技术内幕 InnoDB存储引擎 第2版.pdf:https://url31.ctfile.com/f/40632231-735784839-1a2df2?
SQLite 权威指南.pdf: https://url31.ctfile.com/f/40632231-735784840-d76185?
MySQL必知必会.pdf:https://url31.ctfile.com/f/40632231-735784664-7f7ca8?
MongoDB权威指南.pdf:https://url31.ctfile.com/f/40632231-735784624-2dafdf?