百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

数据库学习技术路线

toyiye 2024-06-21 12:15 9 浏览 0 评论

微信公众号:云计算通俗讲义

持续输出技术干货,欢迎关注!


MySQL技术路线


1. 入门

数据库入门首选要学会基本环境搭建,然后选择一款顺手的图形界面工具,学习各种SQL语句,包括基本建库建表的DDL语句,然后增删改查语句,再掌握了基本的操作之后,需要学会使用一些高级特性,比如视图、存储过程、游标、自定义函数等。

1.1 安装配置

1.2 数据库设计

设计步骤

E-R图

三大范式

1.3 SQL基础

DDL

数据类型

1、整值类型:

整数类型:TINYINT、SMALLINT、MEDIUMINT、INT、INTEGER、BIGINT

浮点数类型:FLOAT、DOUBLE

定点数类型:DEC、DECIMAL

位类型:BIT

2、字符串类型:

CHAR/VARCHAR

BINARY、VARBINARY

TEXT、BLOB

ENUM、SET

3、日期类型选择

DATE、DATETIME、TIMESTAMP、TIME、YEAR

字符集

1、概述

2、Unicode

3、汉字编码

4、字符集选择

5、MySQL字符集

表类型选择

1、存储引擎概述

2、各种存储引擎基本特性

3、如何选择存储引擎

约束

主键约束

<字段名> <数据类型> PRIMARY KEY [默认值]

主键自增长

字段名 数据类型 AUTO_INCREMENT

外键约束

[CONSTRAINT <外键名>] FOREIGN KEY 字段名 [,字段名2,…]

REFERENCES <主表名> 主键列1 [,主键列2,…]

唯一约束

<字段名> <数据类型> UNIQUE

检查约束

CHECK <表达式>

默认值

<字段名> <数据类型> DEFAULT <默认值>;

非空约束

<字段名> <数据类型> NOT NULL;

查看约束

SHOW CREATE TABLE <数据表名>;

CREATE

建库:

CREATE DATABASE [IF NOT EXISTS] <数据库名>

[[DEFAULT] CHARACTER SET <字符集名>]

[[DEFAULT] COLLATE <校对规则名>];

建表:

CREATE TABLE <表名> ([表定义选项])[表选项][分区选项];

DROP

DROP DATABASE [ IF EXISTS ] <数据库名>

DROP TABLE [IF EXISTS] 表名1 [ ,表名2, 表名3 ...]

ALTER

修改库:

ALTER DATABASE [数据库名] {

[ DEFAULT ] CHARACTER SET <字符集名> |

[ DEFAULT ] COLLATE <校对规则名>}

修改表:

ALTER TABLE <表名> [修改选项]

字段:

ALTER TABLE <表名> CHANGE <旧字段名> <新字段名> <新数据类型>;

DML

INSERT

INSERT INTO <表名> [ <列名1> [ , … <列名n>] ]

VALUES (值1) [… , (值n) ];

INSERT…SELECT 语句向表中插入其他表的数据

UPDATE

UPDATE <表名> SET 字段 1=值 1 [,字段 2=值 2… ] [WHERE 子句 ]

[ORDER BY 子句] [LIMIT 子句]

DELETE

DELETE FROM <表名> [WHERE 子句] [ORDER BY 子句] [LIMIT 子句]

TRUNCATE

TRUNCATE [TABLE] 表名

DQL

基本查询

SELECT

{* | <字段列名>}

[

FROM <表 1>, <表 2>…

[WHERE <表达式>

[GROUP BY <group by definition>

[HAVING <expression> [{<operator> <expression>}…]]

[ORDER BY <order by definition>]

[LIMIT[<offset>,] <row count>]

]

别名

<表名> [AS] <别名>

条件查询

WHERE 查询条件

查询条件可以是:

带比较运算符和逻辑运算符的查询条件

带 BETWEEN AND 关键字的查询条件

带 IS NULL 关键字的查询条件

带 IN 关键字的查询条件

带 LIKE 关键字的查询条件

模糊查询

[NOT] LIKE '字符串'

范围查找

[NOT] BETWEEN 取值1 AND 取值2

空值查询

IS [NOT] NULL

分组/聚合

GROUP BY <字段名>

过滤分组

HAVING <查询条件>

排序

ORDER BY <字段名> [ASC|DESC]

去重

SELECT DISTINCT <字段名> FROM <表名>;

分页

LIMIT 初始位置,记录数

表连接

内连接

SELECT <字段名> FROM <表1> INNER JOIN <表2> [ON子句]

外连接

左外连接

SELECT <字段名> FROM <表1> LEFT OUTER JOIN <表2> <ON子句>

右外连接

SELECT <字段名> FROM <表1> RIGHT OUTER JOIN <表2> <ON子句>

交叉连接

SELECT <字段名> FROM <表1> CROSS JOIN <表2> [WHERE子句]

SELECT <字段名> FROM <表1>, <表2> [WHERE子句]

并集

子查询

WHERE <表达式> <操作符> (子查询)

其中,操作符可以是比较运算符和 IN、NOT IN、EXISTS、NOT EXISTS 等关键字。

1)IN | NOT IN

当表达式与子查询返回的结果集中的某个值相等时,返回 TRUE,否则返回 FALSE;若使用关键字 NOT,则返回值正好相反。

2)EXISTS | NOT EXISTS

用于判断子查询的结果集是否为空,若子查询的结果集不为空,返回 TRUE,否则返回 FALSE;若使用关键字 NOT,则返回的值正好相反。

正则表达式

运算符

算数运算符

加(+)、减(-)、乘(*)、除(/,DIV)和模运算(%,MOD)

比较运算符

=、<>/!=、<=>、<、<=、>、>=、BETWEEN、IN、IS NULL、IS NOT NULL、LIKE、REGEXP、RLIKE

逻辑运算符

NOT/!、AND/&&、OR/||、XOR

位运算符

&、|、^、~、>>、<<

运算符优先级

常用函数

字符串函数

CONCAT()、INSERT()、LOWER()、UPPER()、LEFT()、RIGHT()、LPAD()、RPAD()、LTRIM()、RTRIM()、REPEAT()、REPLACE()、STRCMP()、TRIM()、SUBSTRING()

数值函数

ABS()、CEIL()、FLOOR()、MOD()、RAND()、ROUND()、TRUNCATE()

日期和时间函数

CURDATE()、CURTIME()、NOW()、UNIX_TIMESTAMP()、FROM_UNIXTIME()、WEEK()、YEAR()、HOUR()、MINUTE()、MONTHNAME()、DATE_FORMAT()、DATE_ADD()、DATEDIFF()

流程函数

IF、IFNULL、CASE WHEN

其他函数

DATABASE()、VERSION()、USER()、INET_ATON()、INET_NTOA()、PASSWORD()、MD5()

DCL

用户管理

创建用户

CREATE USER <用户> [ IDENTIFIED BY [ PASSWORD ] 'password' ] [ ,用户 [ IDENTIFIED BY [ PASSWORD ] 'password' ]]

修改用户

RENAME USER <旧用户> TO <新用户>

其中:

<旧用户>:系统中已经存在的 MySQL 用户账号。

<新用户>:新的 MySQL 用户账号。

删除用户

DROP USER <用户1> [ , <用户2> ]…

其中,用户用来指定需要删除的用户账号。

查看用户权限

在 MySQL 中,可以通过查看 mysql.user 表中的数据记录来查看相应的用户权限,也可以使用 SHOW GRANTS 语句查询用户的权限。

mysql 数据库下的 user 表中存储着用户的基本权限,可以使用 SELECT 语句来查看。SELECT 语句的代码如下:

SELECT * FROM mysql.user;

除了使用 SELECT 语句之外,还可以使用 SHOW GRANTS FOR 语句查看权限。其语法格式如下:

SHOW GRANTS FOR 'username'@'hostname';

其中,username 表示用户名,hostname 表示主机名或主机 IP。

GRANT

GRANT priv_type [(column_list)] ON database.table

TO user [IDENTIFIED BY [PASSWORD] 'password']

[, user[IDENTIFIED BY [PASSWORD] 'password']] ...

[WITH with_option [with_option]...]

REVOKE

REVOKE priv_type [(column_list)]...

ON database.table

FROM user [, user]...

密码管理

修改密码

SET PASSWORD FOR 'username'@'hostname' = PASSWORD ('newpwd');

重置密码

DPL

BEGIN TRANSACTION

COMMIT

ROLLBACK

1.4 高级特性

MySQL分区

1、什么是分区?

2、分区类型:Range、List、Columns、Hash、Key、子分区

3、分区管理

4、分区与性能

视图

1、什么是视图?

2、视图基本操作:

创建视图

CREATE VIEW <视图名> AS <SELECT语句>

修改视图

ALTER VIEW <视图名> AS <SELECT语句>

删除视图

DROP VIEW <视图名1> [ , <视图名2> …]

查看视图

DESCRIBE 视图名;

或简写成:

DESC 视图名;

存储过程

1、什么是存储过程

2、存储过程基本操作

创建存储过程

CREATE PROCEDURE <过程名> ( [过程参数[,…] ] ) <过程体> [过程参数[,…] ] 格式

[ IN | OUT | INOUT ] <参数名> <类型>

修改存储过程

ALTER PROCEDURE 存储过程名 [ 特征 ... ]

删除存储过程

DROP PROCEDURE [ IF EXISTS ] <过程名>

查看存储过程

SHOW PROCEDURE STATUS LIKE 存储过程名;

游标

声明游标

DECLARE cursor_name CURSOR FOR select_statement;

打开游标

OPEN cursor_name;

使用游标

FETCH cursor_name INTO var_name [,var_name]...

关闭游标

CLOSE cursor_name;

绑定变量

定义变量

DECLARE var_name[,...] type [DEFAULT value]

为变量赋值

SET var_name = expr[,var_name = expr]...

自定义函数

CREATE FUNCTION sp_name ([func_parameter[...]])

RETURNS type

[characteristic ...] routine_body

触发器

1、什么是触发器

2、触发器基本操作:

创建触发器

CREATE <触发器名> < BEFORE | AFTER >

<INSERT | UPDATE | DELETE >

ON <表名> FOR EACH Row<触发器主体>

删除触发器

DROP TRIGGER [ IF EXISTS ] [数据库名] <触发器名>

查看触发器

SHOW TRIGGERS;

全文索引

SQLMode

1、什么是SQL Mode?

2、常见SQL Mode

3、数据迁移中使用SQL Mode


2. 进阶

了解基本SQL操作和高级特性可以基本满足平时开发的需要,但是如果真正从事数据库底层开发,还需要了解这些SQL语句背后的算法,这就涉及索引实现及优化,锁的使用,事务控制,SQL优化。

如果需要掌握一个庞大的数据库系统的操作和运维,还需要掌握主从复制、备份恢复、高可用、基准测试。

2.1 索引

基本操作

创建索引

CREATE (UNIQUE) INDEX indexName ON table_name (column_name);

添加索引

ALTER table tableName ADD (UNIQUE) INDEX indexName(columnName);

删除索引

DROP (UNIQUE) INDEX [indexName] ON mytable;

显示索引

SHOW INDEX FROM table_name;

底层数据结构

二叉树

B树

B+树

索引失效

索引设计原则及优化

锁分类

读锁/写锁

表锁/行锁/页锁

共享锁/排它锁

乐观锁/悲观锁

锁与并发控制

无锁:MVCC

死锁

日志

错误日志

二进制日志

查询日志

慢查询日志

备份恢复

备份恢复策略

逻辑备份与恢复

物理备份与恢复

导入导出

导入

SELECT ... INTO OUTFILE

mysqldump

导出

mysql

mysql -u用户名 -p密码 < 要导入的数据库数据(runoob.sql)

source

source /home/abc/abc.sql # 导入备份数据库

LOAD DATA

LOAD DATA LOCAL INFILE 'dump.txt' INTO TABLE mytbl;

mysqlimport

mysqlimport -u root -p --local mytbl dump.txt

事务

什么是事务?

ACID实现原理

事务控制

分布式事务

SQL优化

SQL优化的基本步骤

常用优化策略

服务器优化

磁盘存储优化

应用优化

架构

主从复制

1、主从复制原理

2、启动参数

3、主从切换

MySQL Cluster

高可用

词法解析/语法解析

词语解析

语法解析

语义分析

Lex/yacc

InnoDB存储引擎

体系架构

内存结构

Buffer pool

缓冲池缓存的数据包括Page Cache、Change Buffer、Data Dictionary Cache等,通常 MySQL 服务器的 80% 的物理内存会分配给 Buffer Pool。

Change Buffer

Change buffer 的主要目的是将对 非唯一 辅助索引页的操作缓存下来,以此减少辅助索引的随机IO,并达到操作合并的效果。

Adaptive Hash Index

自适应哈希索引(AHI)查询非常快,一般时间复杂度为 O(1),相比 B+ 树通常要查询 3~4次,效率会有很大提升。innodb 通过观察索引页上的查询次数,如果发现建立哈希索引可以提升查询效率,则会自动建立哈希索引,称之为自适应哈希索引,不需要人工干预,可以通过 innodb_adaptive_hash_index 开启,MySQL5.7 默认开启。

Log Buffer

磁盘结构

段/区/页

表空间

系统表空间

数据字典

Checkpoint

Double Write

Undo

InnoDB File-Per-Table表空间

redo log

事务

隔离级别

ACID

测试

学习数据库,必要的测试工具还是需要掌握的。比如压力测试、稳定性测试等等。

基准测试

测试工具


3. 拓展

学习关系型数据库MySQL,其实还是需要对比着学习一些其他关系型和非关系型数据库,对比它们底层实现原理不同,算法,事务以及应用场景。

这其中包括数据库巨头产品Oracle,因为现在市场占有率还是非常大,如果想要迁移到MySQL,还是需要对Oracle有一个比较系统的了解。而对于现在比较流行的NoSQL,也是需要重点关注的,主要是因为关系型数据库在某些场景不适用,此时Redis等内存数据库可以有效解决,同时二者在应用场景等方面也存在诸多不同。

3.1 Redis

什么是NoSQL?

数据类型

基本操作

持久化

事务

主从复制

集群

3.2 MongoDB

索引

事务

3.3 Hive SQL

4. 推荐书籍

目前我读过质量比较高的MySQL入门和深入学习的书籍有几个,你可以大概参考一下:

编译原理:

龙书,编译器原理的经典之作,但是不需要每个章节都需要深入了解,当作工具书使用就行,大概原理弄懂即可,深究可能很容易糊涂。

词法解析:

这个是市面上不多的讲解词法解析和语法解析的书,介绍的是flex和bison,贴近实际开发,这本书比龙叔要更贴近实践也更易懂。

数据库入门:

网易数据库大牛的著作,讲解比较全面细致,设计基本SQL,索引,锁,备份恢复,主从复制等等。

数据库提升:

这本书讲解的涉及基本语句的实现原理以及应用场景,非常好,可以作为提升。

数据库提升的经典之作,涉及非常知识面非常广泛,包括TPCC测试,主从复制原理,备份恢复,高可用,高并发等等。

存储引擎:

姜承尧老师经典著作,存储引擎底层原理介绍,非常全面详细,对于了解ACID实现原理,MVCC,redo、undo log等等实现原理非常有用,了解存储引擎必备书籍。

索引:

专门讲解索引的原理,优化,讲解的非常好也很实用。

相关推荐

为何越来越多的编程语言使用JSON(为什么编程)

JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

何时在数据库中使用 JSON(数据库用json格式存储)

在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)

前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...

JSON对象花样进阶(json格式对象)

一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...

深入理解 JSON 和 Form-data(json和formdata提交区别)

在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...

JSON 语法(json 语法 priority)

JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...

JSON语法详解(json的语法规则)

JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...

MySQL JSON数据类型操作(mysql的json)

概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...

JSON的数据模式(json数据格式示例)

像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...

前端学习——JSON格式详解(后端json格式)

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...

什么是 JSON:详解 JSON 及其优势(什么叫json)

现在程序员还有谁不知道JSON吗?无论对于前端还是后端,JSON都是一种常见的数据格式。那么JSON到底是什么呢?JSON的定义...

PostgreSQL JSON 类型:处理结构化数据

PostgreSQL提供JSON类型,以存储结构化数据。JSON是一种开放的数据格式,可用于存储各种类型的值。什么是JSON类型?JSON类型表示JSON(JavaScriptO...

JavaScript:JSON、三种包装类(javascript 包)

JOSN:我们希望可以将一个对象在不同的语言中进行传递,以达到通信的目的,最佳方式就是将一个对象转换为字符串的形式JSON(JavaScriptObjectNotation)-JS的对象表示法...

Python数据分析 只要1分钟 教你玩转JSON 全程干货

Json简介:Json,全名JavaScriptObjectNotation,JSON(JavaScriptObjectNotation(记号、标记))是一种轻量级的数据交换格式。它基于J...

比较一下JSON与XML两种数据格式?(json和xml哪个好)

JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...

取消回复欢迎 发表评论:

请填写验证码