MySQL
1.数据持久化
数据库是数据持久化的一种工具,如果想要做到数据持久化必须将数据通过文件保存到硬盘中
当我们做数据持久化操作时不仅仅是希望能够把数据长久的保存起来,更为重要的是我们希望很方便的管理数据,在需要数据的时候能够很方便的把需要的数据取出来。数据库比起一般的文件,在数据管理有明显的优势,这也是为什么程序中数据的持久化绝大部分都采用的是数据库
2.数据库发展史
目前数据库主要分两种:关系型数据库和NoSQL数据库。
这周主要学习了MySQL(关系型数据库)和Redis(NoSQL数据库)。
数据库的编程语言:结构化查询语言(SQL)
3.SQL(结构化查询语言)具体操作详解
通常SQL分为三类:DDL(数据定义语言)、DML(数据操作语言)、DCL(数据控制语言)
DDL — 主要负责创建表、删除表和修改表,涉及指令有:create、drop、alter
DML — 主要负责数据的增(insert)、删(delete)、改(update)、查(select)
DCL — 通常用于授权(grant)和召回授权(revoke)
注意:SQL语句中关键字不区分大小写,并且一条语句结束后必须写分号
1.DDL(数据定义语言)
1.1创建数据库(create)
1. create database 数据库名;—— 创建指定数据库;如果数据库已经存在会报错。
2. create database if not exists 数据库名; —— 当指定数据库不存在的时候会创建数据库;如果存在就不创建,也不会报错。
3. create database if not EXISTS 数据库名 default charset utf8; ——创建数据库的时候设置字符集编码方式为utf8,让数据库支持中文数据的存储。
1.2删除数据库
1. drop database 数据库名; —— 删除指定数据库,如果数据库不存在会报错。
2. drop databese if exists 数据库名; —— 当指定数据库存在的时候删除数据库,如果数据库不存在不会报错。
1.3 使用/切换数据库
use 数据库名 —— 使用/切换到指定数据库。
1.4 创建表
1. create table if not exists 表名(字段名1 类型1 约束1 comment 描述1,字段2 类型2 约束名2 comment 描述2,...);
---说明:
1)表名 — 程序员自己命名,但是一般以t或者tb作为前缀表示表名; 而且要见名知义。
2)字段名 — 程序员自己命名,要求见名知义。
3)类型 — 类型必须是当前数据库支持的类型名,mysql中常见的类型有: int(整数), float(小数),char/varchar/text(字符串),bit(布尔),date(日期)等。
4)约束 — not null(不为空),default(设置默认值),unique(值唯一),primary key(主键约束),auto_increment(自动增长)。
注意:主键约束中主键的值可以确定列表中唯一一条记录(通过一个主键值可以找到表中的唯一一条记录),所以一般每张表都需要设置一个字段为主键,主键的值也必须是唯一的;一般需要可以通过auto_increment约束让整型主键自动增加。
5)comment — 添加字段说明。
1.5删除表
1. drop table if exists 表名; — 删除指定表
1.6 修改表
添加字段/列
1. alter table 表名 add column 字段名 字段类型 约束 comment 描述 —— 在指定表中添加指定字段
删除字段/列
2. alter table 表名 drop column 字段名; —— 删除指定表中的指定字段
2. DML(数据操作语言)
2.1 增(添加记录)
1. insert into 表名 values(值1,值2,值3,...); —— 按照表中字段的顺序依次给每个字段赋值
2. insert into 表名(字段1,字段2,字段3,...)values(值1,值2,值3,...); ——按照指定顺序给指定字段赋值
---注意:值得问题——sql中是数字对应的值直接写,字符串需要使用引号引起来,bit类型的值只有0或者1, 时间可以用内容是满足时间格式字符串也可以是通过时间函数获取的值。
---时间函数:now() - 当前时间 date(now()) - 当前日期 year(now()) - 当前年 month(now()) - 当前月 ....
2.2 删(删除记录)
1. delete from 表名; —— 删除指定表中所有的记录
2. delete from 表名 where 条件语句;——删除满足条件的记录
---条件语句的写法:
1)比较运算符:=(等于), <>(不等于),>(大于), <(小于),>=(大于等于), <=(小于等于)
2)逻辑运算符:and(并且), or(或者), not(非)
3)是否为空: is null(为空), is not null(不为空)
4)范围:between x and y(在x到y之间), not between x and y(不在x到y之间)
5)字符串匹配:like 字符串(like后面的字符串可以使用%表示任意个任意字符, _表示任意一个字符)
6)指定集合元素: in (值1,值2,...)(结果是集合中的元素)
2.3 改(修改数据/记录)
1. update 表名 set 字段1=新值1,字段2=新值2,... ——将指定表中所有的行的指定列/字段的值赋值为新值
2. update 表名 set 字段1=新值1, 字段2=新值2,... where 条件语句; —— 将表中满足条件的行中指定字段的值赋值为新值
2.4 查(获取数据)
2.4.1 直接查询
1. select * from 表名; —— 获取指定表中的所有数据
2.(映射)select 字段1,字段2,... from 表名;—— 获取指定表中所有行指定的列
3. select * from 表名 where 条件;—— 获取指定表中所有满足条件的数据
2.4.2 列重命名
1. select 字段1 as 新字段1,字段2 as 新字段2,... from 表名;—— 给指定表中的列字段名重命名。
---注意:这的as可以省略
2.4.3 对查询结果重新赋值(一般对布尔数据)
1. select if(字段名,值1,值2)from 表名;—— 查询指定字段,并且判断字段对应的值是0还是1,如果是1结果为值1,否则为值2
---注意:这的if的用法是MySQL专有
---通用写法:case 字段 when 值 then 新值1 else 新值2 end
2.4.4 对列进行合并
1. select concat(字段1,字段2,...)from 表名;
---注意:数字和字符串可以合并,bit类型的数据不可以合并
2.4.5 排序(先按之前的任何语法进行查询再排序)
1. select * from 表名 order by 字段; —— 对查询结果按照指定字段的值进行升序排序
2. select * from 表名 order by 字段 asc;——对查询结果按照指定字段的值进行升序排序(从小到大)
3. select * from 表名 order by 字段 desc;——对查询结果按照指定字段的值进行降序排序(从大到小)
2.4.6 去重
1. select distinct 字段 from 表名; ——获取指定字段的值并且去重
2.4.7 限制和分页
1. select * from 表名 limit 数量;—— 获取指定数量的查询结果
2. select * from 表名 limit M offset N; ——跳过前N条数据获取M条数据
3. select * from 表名 limit M,N; ——跳过前M条数据获取N条数据
3. 外键与E.R图
3.1约束管理
3.1.1添加约束
添加普通约束的方式有两种,一种是创建表的时候直接给字段添加相应的约束,另一种是通过修改表的方式添加约束
1. 创建表的时候添加约束
建表的时候可以在字段类型后面加一个或者多个约束
2.通过添加约束索引的方式添加约束
alter table 表名 add constraint 索引名 约束(字段);
-- 说明: 索引名 - 自己随便命名; 约束 - 当前想要添加的约束(但是只支持唯一约束、主键约束和外键约束)
-- 示例:
alter table t_teacher add constraint uni_tel UNIQUE(teatel);
3.1.2删除约束
alter table 表名 drop index 约束索引;
-- 示例:
alter table t_teacher drop index uni_tel;
3.2 外键约束
1.什么是外键:表中的某个字段的值是根据其他表中主键的值来确定的。那么这个字段就是外键
1.1 不同类型的外键添加方法:
多对一的外键的添加: 将外键添加到多的一方对应的表中
一对一的外键的添加: 将外键随便添加到哪一方,同时添加值唯一约束
多对多的外键的添加: 关系型数据库中,两张表没法实现多多的关系,需要一个中间表。(中间表有两个外键分别参照 多多的两个表的主键)
1.2 添加外键约束语法:
alter table 表名1 add constraint 外键约束索引名 foreign key (字段1) references 表名2 (字段2);
-- 将表1中的字段1设置为外键,并且让这个外键的值参照表2中的字段2
1.3 删除外键约束
alter table 表名 drop foreign key 外键索引名;
3.3高级查询
3.3.1聚合:max()/mian()/ sum() / avg() / count()
3.3.2 分组:
SELECT 字段操作 FROM 表名 WHERE 条件 GROUP BY(字段2);
-- 将指定表中满足条件的记录按照字段2的进行分组(值是一样的在一个组里面), 然后再讲每个分组作为整体按照指定字段进行指定聚合操作
-- 注意:a.字段操作的位置除了分组字段不用聚合,其他字段都必须聚合 b.分组的时候where要放到分组前对需要分组的数据进行筛选
-- having: 分组的时候,在分组后用having代替where来对分组后的数据进行筛选
3.3.3 子查询
-- 将一个查询的结果作为另外一个查询的条件或者查询对象
-- 第一种子查询: 将查询结果作为另外一个查询的条件
-- 获取成绩大于90分的学生姓名
select stuname from tb_student where stuid in
(select stuid from tb_score where score>90);
-- 第二种子查询:将一个查询的结果作为查询对象提供给另外一个查询。但是第一个查询结果需要重命名
select score from (SELECT stuid,score from tb_score where score>80) as t2;
3.3.4 连接查询—同时查询多张表
1. 直接连接
select * from 表名1,表名2,表名3 连接条件 查询条件;
-- 注意: 如果既有连接条件又有查询条件,查询条件必须放在连接条件的后面
-- 查询所有学生的名字和学院名字
select stuname, collname from tb_student, tb_college where tb_student.colid=tb_college.collid;
2.内连接
SELECT * FROM 表1 inner join 表2 on 表2的连接条件 inner join 表3 on 表3的连接条件 ...;
-- 注意: 中间表写在最前面(存在关联其他表外键的表)
3.外连接
-- 外连接分为左外连接、右外连接和全连接, 但是在MySQL中支持左外连接和右外连接
-- 左外连接:将左表中对应字段的所有数据取出,然后再对应的右表中字段的值,如果右表对应的值不存在结果就为null
-- 右外连接:将右表中对应字段的所有数据取出,然后再对应的左表中字段的值,如果左表对应的值不存在结果就为null
select * from 表1 left join 表2 on 连接条件;
select * from 表1 right join 表2 on 连接条件;
-- 获取所有学生的成绩
select stuname, score from tb_student left join tb_score on tb_student.stuid=tb_score.sid;
4.DCL(数据控制语言)
DCL主要提供grant和revoke来授权和召回权限
4.1用户管理
1. 添加用户
create user 用户名@登录地址; -- 创建数据用户,登录不需要密码
-- 登录地址 - 限制用户能够登录MySQL的主机地址,可以赋值为: ip地址(指定地址)、localhost(数据库本机)、%(任何位置)
create user 用户名@登录地址 identified by 密码; -- 创建数据用户,登录需要输入指定密码密码
-- 示例:
create user zhangsan@localhost;
create user lisi@localhost identified by '123456';
2. 删除用户
drop user 用户名;
drop user zhangsan;
4.2 权限管理
1. 授权
grant 权限类型 on 数据库.对象 from 用户名;
-- 常见权限类型: delete(删除权限), select(查询权限),update(更新权限),insert(插入权限), all PRIVILEGES(所有权限)
2.召回授权
revoke 权限类型 on 数据库.对象 from 用户名;
4.3事务
完成一个任务需要执行多条sql,但是要求这多个操作中只要有一个操作失败,这个任务就失败,数据全部还原;所有的操作都成功,整个任务才成功的时候就使用事务
-- 开启事务环境
begin;
需要执行的多个操作对应的sql语句
-- 提交事务(只有begin到commit之间的所有的sql都执行成功,才会执行commit; 否则执行rollback)
COMMIT;
-- 事务回滚(放弃beigin到commit之间执行成功的所有sql语句的结果)
ROLLBACK;
5. 视图
视图是关系型数据库中将一组查询指令构成的结果集组合成可查询的数据表的对象。简单的说,视图就是虚拟的表,但与数据表不同的是,数据表是一种实体结构,而视图是一种虚拟结构,你也可以将视图理解为保存在数据库中被赋予名字的SQL语句。
使用视图可以获得以下好处:
1. 可以将实体数据表隐藏起来,让外部程序无法得知实际的数据结构,让访问者可以使用表的组成部分而不是整个表,降低数据库被攻击的风险。
2. 在大多数的情况下视图是只读的(更新视图的操作通常都有诸多的限制),外部程序无法直接透过视图修改数据。
3. 重用SQL语句,将高度复杂的查询包装在视图表中,直接访问该视图即可取出需要的数据;也可以将视图视为数据表进行连接查询。
4. 视图可以返回与实体数据表不同格式的数据,
1. 创建视图
create view 视图名 as sql查询语句;
2. 使用视图 - 视图在用的时候可以直接当成表来使用
-- 示例:
select * FROM vw_student;
select stuname, collname from vw_student, tb_college where vw_student.colid=tb_college.collid;
6. 索引
索引相当于书本的目录,为表创建索引可以加速查询(用空间换时间)。
索引虽然很好,但是不能滥用:
- 索引会占用额外的空间
- 索引会让增删改变得更慢
如果哪个列经常被用于查询的筛选条件那么就应该在这个列上建立索引。
主键上有默认索引(唯一索引)
1. 创建索引
-- 如果使用模糊查询,查询条件不以%开头,那么索引有效
-- 如果使用模糊查询,查询条件以%开头,那么索引无效(尽量避免)
create index 索引名 on 表名 (字段); -- 给指定表的指定字段添加索引
create unique index 索引名 on 表名 (字段); -- 给指定表的指定字段添加唯一索引
-- 示例:
create index idx_stuname on tb_student(stuname);
create unique index idx_stuname on tb_student(stuname);
2. 删除索引
alter table 表名 drop index 索引名; -- 删除指定索引,唯一索引也是这样删
-- 示例:
alter table tb_student drop index idx_stuname;
注意: 可以通过explain来查看sql的执行计划
Redis
1. redis简介
Redis 是完全开源免费的,遵守BSD协议,是一个高性能的NoSQL数据库。
Redis 与其他 NoSQL 缓存产品有以下三个特点:
Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
Redis支持数据的备份,即master-slave模式的数据备份
2. 安装Redis官方最新版本(源代码构建安装)
~ wget http://download.redis.io/releases/redis-5.0.7.tar.gz
~ gunzip redis-5.0.7.tar.gz
~ tar -xvf redis-5.0.7.tar
~ cd redis-5.0.7
~ make && make install
3.使用redis
~ redis-server --requirepass 123456 >> redis & (使用redis并且设置密码并后台运行)
~ redis-cli(启动redis)
4. redis一些命令操作
redis-cli -p 端口 -h 主机 --->启动指定主机指定端口的redis
> netstat -ntlp ---> 查看端口进程
> set username luohao ex 120 ---> 添加键值对
> get username ---> 通过键查找值
> ttl username ---> 查看键过期时间
> expire username 300 ---> 设置键过期时间
> keys * ---> 查看所有键
> dbsize ---> 查看数据库大小(键值对数量)
ps -ef | grep "redis-server" | grep -v "grep" | awk '{print $2}' | xargs kill -->杀死有redis的所有进程
> save --->保存数据
> bgsave ---> 后台保存数据
> select 编号 --->切换数据库
> flushdb ---> 清空当前数据库的数据
> flushall ---> 清空所有数据库的数据
> jobs ---> 查看后台运行的命令
> fg %编号 ---> 将后台命令放到前台运行
> Ctrl+z ---> 将前台命令暂停并放到后台
> bg %编号 ---> 将暂停的命令在后台运行
> 命令 & ---> 将命令放到后台运行
5.Redis的核心数据类型
5.1字符串
set key value ---> 添加键值对
get key ---> 通过键查看值
strlen key ---> 获取字符串长度
append key value2 ---> 给字符串追加内容
mset key1 value1 key2 value2 ---> 添加多组键值对
mget key1 key2 ---> 查看多个键对应的值
incr key ---> 值加1
incrby key value ---> 值加上value
decr key ---> 值减1
decrby key value ---> 值减去value
getrange key start end ---> 获取字符串指定范围的子串
setrange key offset value ---> 修改字符串指定位置的内容
5.2哈希(表)— hash
hset key field value ---> 添加hash类型键值对
hmset key field1 value1 field2 value2 ---> 添加多组hash类型键值对
hget key field ---> 获取hash类型字段对应的值
hmget key field1 field2 ---> 获取hash类型多个字段对应的值
hgetall key ---> 获取hash类型所有的字段和对应的值
hkeys key ---> 获取hash类型所有的字段
hvals key ---> 获取hash类型所有字段的值
hexists key field ---> 判断hash类型某个字段是否存在
5.3 列表-list
lpush key value1 value2 value3 ---> 在左边添加元素
rpush key value1 value2 value3 ---> 在右边添加元素
lpop key ---> 从左边移除一个元素
rpop key ---> 从右边移除一个元素
lrange key start end ---> 查看列表指定范围的元素
llen key ---> 查看列表元素个数
lindex key index ---> 查看列表指定位置元素
lrem key count value ---> 删除列表中指定元素
5.4集合-set
sadd key value1 value2 value3 ---> 添加元素
srem key value ---> 删除元素
spop ---> 获取随机元素
scard key ---> 查看元素个数
smembers key ---> 查看所有元素
sismember key value ---> 查看集合中有没有指定元素
sinter key1 key2 ---> 交集
sunion key1 key2 ---> 并集
sdiff key1 key2 ---> 差集
5.5有序合并-zset
zadd key score1 mem1 score2 mem2 ---> 添加元素
zrem key mem ---> 删除元素
zrange key start end ---> 按score的升序查看元素
zrevrange key start end ---> 按score的降序查看元素
zscore key mem ---> 查看元素对应的score
zincrby key value mem ---> 修改元素的score值
5.5补充:Linux系统启停服务
~ 启动:systemctl start nginx
service nginx start
~ 停止:systemctl stop nginx
service nginx stop
~ 重启:systemctl restart nginx
~ 查看状态:systemctl status nginx
~ 开机自启:systemctl enable nginx
~ 禁用自启:systemctl disable nginx