Mysql


杂记

tinyint 跟布尔型类似
注释方法:
# --

bin是二进制的缩写

encrypted是否加密

存储过程

触发器

事件

事务

ER模型

备份

日志

左连接,左边的表无论如何都能显示,右连接同理

走进Mysql

(SQL语句的大小写无所谓)

1.1.1: Mysql的启动和停止

启动Mysql服务的sql命令如下:
NET START mysql55

停止Mysql服务的命令如下:
NET STOP mysql55


1.1.2: 登录Mysql数据库

在命令执行窗口,执行连接并登录Mysql的命令行格式如下:
mysql -h hostname -u username-p
-h hostname:主机地址,可以用localhost或127.0.0.1
-u username:用户名
-p表示后面的参数为指定用户的密码
ps:不写-h hostname好像也行


1.1.3: Mysql的相关命令:

查看Mysql命令帮助:mysql>help
如图所示:


1.1.4:查看Mysql字符集

mysql>SHOW CHARACTER SET;


1.1.5:设置Mysql字符集

1.描述字符集的系统变量

系统变量名:character_set_server
character_set_client
character_set_connection
character_set_results
character_set_database
character_set_system
说明:
(character_set_server) 默认的内部操作字符集,标识服务器的字符集。服务器启动时通过该变量设置字符集,当未设置值时,系统默认为latin1.该变量为create database命令提供的默认值。

(character_set_client) 客户端来源数据使用的字符集,该变量用来决定Mysql如何解释客户端发到服务端的SQL命令。

(character_set_connection) 连接层字符集。用来决定MYSQL如何处理客户端发来的SQL命令

(character_set_results) 查询结果字符集。当SQL返回结果时,该变量的值决定了发给客户端的字符编码。

创建数据库过程

小tips

字符串

char 写定长度
varchar 分配空间可变

时间类型

datatime 写死
timestamp 时间戳(加时区)

union

约束

primary key,foreign key,not null,unique,default,ckeck,auto_increament

1.创建库

CREATE DATABASE 库名;
USE 库名;

删除库

DROP DATABASE 库名;

2.建表

CREATE TABLE 表名(
字段定义(字段名 数据类型 约束)
)

删除表

DROP TABLE 表明;

3.插入表

INSERT INTO 表名(字段列表) VALUES(值列表),

删除

DELETE FROM 表名 WHERE 条件
TRUNCATE 表名;(删了又创建)

修改

UPDATE 表名 SET 字段名 = 新值/表达式 WHERE 条件

查询

单表查询

SELECT 字段名/*/表达式 AS 别名 FROM 表名 WHERE 条件

多表查询

SELECT 字段名/*/表达式 AS 别名 FROM 表名1 JOIN 表名2 ON 共同点 WHERE 条件

触发器

CREATE TRIGGER trigger_name trigger_time trigger_event
ON tbl_name FOR EACH ROW trigger_stmt

事件

什么时间 调用

操作周期 做什么


打开Mysql服务器事件调度器

1
SET GLOBAL EVENT_SCHEDULER = 1;
1
2
3
4
5
6
7
8
9
10
11
12
13
CREATE EVENT_OVERDUE (注:事件名)

ON SCHEDULE(注:行程表)

EVERY 1 DAY

STARTS '2021-11-04 01:00:00'

AT NOW()(注:现在执行,只执行一次)

DO (注:DO后面只有一句直接写,多条语句要用BEGIN和END包起来)

CALL proc_overdue();
1
2
3
4
5
CREATE PROCEDURE proc_overdue() 

BEGIN

END

事务

start transaction

update …

commit

isolaction隔离等级

read-uncommitted 脏读

read-committed 不可重复读

repeatable-read(默认,可重复读取)幻读

serializable 一次只允许一个事务进行读写操作

deadlock死锁

两个或两个以上进程因争夺资源,而造成的相互等待现象。若无外力作用,系统将无法推进。

事务在对一个数据对象(表、记录)进行操作之前向系统发出请求,对其上锁

排他锁/写锁/X锁 以行为单位

共享锁/读锁/S锁

意向排他/意向共享锁 以整表为单位,只阻塞对全表的操作

备份

1
mysqldump -uroot -p 库名 >文件绝对路径

热备份

冷备份(完全备份、差异备份、增量备份)

还原

1
source 文件绝对路径

日志

二进制日志

DDL: Data Definition Language

DML: Date Manipulation Language

错误日志

通用日志

慢查询日志

CAP原则

Consisteacy一致性

Availability可用性

Partitiontolerance分区容错性

NOSQL

  • 大数据的四个特点:四个V
    • Volume
    • Variety
    • Velocity
    • Value/Veracity

索引原理

本质都是:通过不断地缩小想要获取数据的范围来筛选出最终想要的结果,同时把随机的事件变成顺序的事件,也就是说,有了这种索引机制,我们可以总是用同一种查找方式来锁定数据。

B+树

B+树是通过二叉查找树,再由平衡二叉树,B树演化而来


在数据库中,B+树的高度一般都在24层,这也就是说查找某一个键值的行记录时最多只需要2到4次IO,这倒不错。因为当前一般的机械硬盘每秒至少可以做100次IO,24次的IO意味着查询时间只需要0.02~0.04秒。

数据库中的B+树索引可以分为聚集索引(clustered index)和辅助索引(secondary index),

聚集索引与辅助索引相同的是:不管是聚集索引还是辅助索引,其内部都是B+树的形式,即高度是平衡的,叶子结点存放着所有的数据。

聚集索引与辅助索引不同的是:叶子结点存放的是否是一整行的信息


创建/删除索引的语法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#方法一:创建表时
  CREATE TABLE 表名 (
字段名1 数据类型 [完整性约束条件…],
字段名2 数据类型 [完整性约束条件…],
[UNIQUE | FULLTEXT | SPATIAL ] INDEX | KEY
[索引名] (字段名[(长度)] [ASC |DESC])
);


#方法二:CREATE在已存在的表上创建索引
CREATE [UNIQUE | FULLTEXT | SPATIAL ] INDEX 索引名
ON 表名 (字段名[(长度)] [ASC |DESC]) ;


#方法三:ALTER TABLE在已存在的表上创建索引
ALTER TABLE 表名 ADD [UNIQUE | FULLTEXT | SPATIAL ] INDEX
索引名 (字段名[(长度)] [ASC |DESC]) ;

#删除索引:DROP INDEX 索引名 ON 表名字;

实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#方式一
create table t1(
id int,
name char,
age int,
sex enum('male','female'),
unique key uni_id(id),
index ix_name(name) #index没有key
);
create table t1(
id int,
name char,
age int,
sex enum('male','female'),
unique key uni_id(id),
index(name) #index没有key
);


#方式二
create index ix_age on t1(age);


#方式三
alter table t1 add index ix_sex(sex);
alter table t1 add index(sex);

#查看
mysql> show create table t1;
| t1 | CREATE TABLE `t1` (
`id` int(11) DEFAULT NULL,
`name` char(1) DEFAULT NULL,
`age` int(11) DEFAULT NULL,
`sex` enum('male','female') DEFAULT NULL,
UNIQUE KEY `uni_id` (`id`),
KEY `ix_name` (`name`),
KEY `ix_age` (`age`),
KEY `ix_sex` (`sex`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1


MangoDB

基本指令

  • show dbs 查看数据库
  • use 库名 //如果没有,创建再切换库,有就直接切换
  • db 查看当前数据库
  • db.createCollection(键值对)创建集合
  • show collections 查看集合
  • db.集合名.insert({键值对},{}…) //插入数据
  • db.集合名.find() //查看集合所有内容
  • pretty() //格式化查询
  • db.集合.drop() //删除集合
  • db.dropDatabase() //删除库
  • db.collection_name.update(criteria,odjNew,upsert,multi)
  • upsert:判断是否匹配,匹配不到直接新建一条数据(默认关闭
  • multi:多行判断,多行执行(默认关闭)
  • db.集合名.update({条件:},{$set:{key:value}}) !–修改语句
  • db.集合名.deleteOne({<条件>:<>}) !–删除语句
  • db.集合名.daletemany({条件:}) !—删除多行
  • db.集合名.find(“条件”) !—-指定查询(条件中格式:{“age”:{$gte:”20”}})其中条件符号将使用
    • $lte(小于等于)
    • $gt(大于)
    • $lt(小于)
    • $ne(不等于)
    • $in(包含)
    • $nin(not in)
  • db.集合名称.find({“userid”:{$lte:”1004”},”age”:{$gte:”20”}}).pretty() !–多条件查询,默认and 同时满足
  • db.集合名称.find({&or:[“条件”:<>],{“条件”:<>}}).pretty !–查询只需满足一个条件的数据
  • db.集合名称。find({“uesr”:{$in:[“1005”,”1006”]}}) !—查询满足一个条件的数据

常见聚合管道操作

  • $group:将集合中的文档进行分组
  • $limit:用于限制MongoDB聚合管道返回的文档数
  • $match:用于过滤数据,只输出符合条件的文档
  • $sort:将输入的文档先进行排序,再输出
  • $project:用于修改输入文档的结构(增加、删除字段等)和名称
  • $skip:在聚合管道中跳过指定数量的文档,并返回剩余数量恶的文档

具体语法

1
2
# $group操作符
db.COLLECTION_NAME.aggregate([{$group:{<key1>:"$<key2>"}]).pretty()

常见管道表达式

  • $sum:计算总和

  • $avg:计算平均值

  • $min:获取集合中所有文档对应值的最小值

  • $max:获取集合中所有文档对应值的最大值

  • $push:在结果文档中插入值到一个数组中

  • $first:获取分组文档中的第一个文档

  • $last:获取分组文档中的最后一个文档

Redis

服务器启动

1
redis-server.exe redis.windows.conf

image-20211220105715978

客户端启动

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
redis-cli.exe -h 地址 -p 端口号
#也可以直接redis-cli.exe

select index #切换数据库

set key value #插入值

get key #查询值

dbsize #查询数据库数据大小

del key #删除数据

keys *#查看库里面的所有key

flushdb #清除当前库下所有数据

flushall #清除服务器下所有库的数据

image-20211220111046648

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 操作字符串
#设置多个键值对
mset key1 value1 key2 value2...
# 获取多个键值对
mget key1 key2
#自增
incr key
#自减
decr key
#增加、减少指定的值
incrby key increment
decrby key decrement
#获取指定字符串键的旧值并设置新值
getset key value
#获取字符串值得字节长度
strlen key
#获取指定区间得字符串
substr key startIndex endIndex#index从0开始
#获取字符串键指定索引范围内的值内容
getrange key startIndex endIndex#index从0开始
#为字符串键的指定索引位置设置值
setrange key offset value
#追加新内容到值的末尾
append key value

操作键

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#序列化指定的键,并返回被序列化的值
dump key
#判断指定键是否存在
exists key...
#查看指定键的类型
type key
#删除指定键的值
rename key newkey #将旧值赋给新键
#设置指定键的生存时间,以秒为单位
expire key seconds
#返回指定键的剩余生存时间
ttl key
#移除指定键的生存时间
persist key
#在键存在时,删除键
del key ...

事务

1
2
3
4
#开启事务
multi
#执行事务
exec

image-20211222111919533

操作列表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 将一个元素或多个元素推入到列表的右端
rpush key value
# 将一个或多个元素推入到列表的左端
lpush key value
# 获取列表指定索引范围内的元素
lrange key start stop
# 获取列表指定索引位置上的元素
lindex key index
# 弹出列表最右端的元素
rpop key
# 弹出列表最左端的元素
lpop key
# 获取指定列表的长度
llen key
# 移除列表中的指定元素
lrem key count value -- count以 "-" 开头,移除几个,value是指从哪个值开始
# 截取字符串,直接对串进行修改
ltrim key start stop
# 查看列表全部数据
lrange key 0 -1

操作集合

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 将一个或多个元素添加到集合中
sadd key member ...
# 获取集合中的元素数量
scard key
# 获取集合中的所有元素
smembers key
# 检查指定元素是否存在于集合中
sismember key member
# 移除集合中的一个或多个已存在的元素
srem key member...
# 将元素从一个集合移动到另一个集合
smove source(元素所在集合) destination(目标集合) member
# 求两个或多个集合的交集
sinter key...
# 求两个或多个集合的并集
sunion key...
# 求两个或多个集合的差h
sdiff key...

操作有序集合

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 为有序集合添加一个或多个键值对
zadd key score member
# 获取有序集合中元素的个数
zcard key
# 统计有序集合中指定分值范围内得元素个数
zcount key min max
# 获取有序集合中指定索引范围内的元素
zrange key start stop
# 获取有序集合中指定元素的分值
zscore key member
# 移除有序集合中的指定元素
zrem key member# 返回为1删除成功
# 反向获取有序集合中指定索引范围内的元素
zrevrange key start stop
# 获取有序集合中指定元素的排名
zrank key member
# 反向获取有序集合中指定元素的排名
zrevrank key memeber
# 删除指定范围内的元素
zremrangebyrank key start stop
# 给指定元素增加或删
减值
zincrby key increment member

操作散列

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 为散列中的指定键设置值
hset key field value
# 为散列中多个键设置值
hmset key key field value ...
# 获取散列中指定键的值
hget key field
# 获取散列中多个键的值
hmget key field ...
# 获取散列中所有键值对
hgetall key
# 获取散列中的所有键
hkeys key
# 获取散列中的所有键的值
hvals key
# 删除散列中指定键及其相对应的值
hdel key field
# 获取散列中键值对的个数
hlen key

文章作者: Water monster
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Water monster !
评论
  目录