MySQL
- 登录:mysql -uroot -p
- 退出:exit;
- 启动:/etc/inint.d/mysqld start
- 停止:/etc/inint.d/mysqld stop
- 重启:/etc/inint.d/mysqld restart
用户增删查、授权
# 修改当前登录用户密码
set password = password('新密码');
# 查看用户
select user,host from mysql.user;
# 创建用户
create user '用户名'@'loaclhost' identified by '密码';
# 授权
grant all on 数据库名.* to '用户名'@'loaclhost';
# 授权root权限[ with grant option ] 代表此用户可以给其他用户授权
grant all on *.* to '用户名'@'localhost' with grant option;
# 修改用户密码
set password for 用户名@localhost = password('新密码')
# 删除用户
drop user 用户名@'%';
# 刷新
flush privileges;
数据定义语言(DDL)
- 查看库:
show databases;
,会显示当前服务器上所有的数据库 - 创建库:
create database test charset=utf8;
,创建数据库test,指定字符集 - 删除库:
drop database test;
,删除数据库test - 选择库:
use test;
,选择数据库test- 查看当前使用的数据库
show tables;
select database();
- 查看当前使用的数据库
- 查看所有表:
show tables;
,查看当前数据库下的所有数据表 - 创建表:
create table user(username varchar(20), password char(32));
- 查看表结构:
desc user;
- 查看创建方式:
- 查看库:
show create database test;
- 查看表:
show create table user;
- 查看库:
- 删除表:
drop table user;
- 指定字符集:
- 创建时指定:
create table xxx() charset=utf8;
- 创建时指定:
- 修改字段:
alter table user modify username varchar(30);
,不能修改字段名alter table user change email em varchar(32);
,可以修改字段名
- 添加字段:
- 默认在最后添加:
alter table user add age int(3);
- 在指定字段后添加:
alter table user add email varchar(60) after password;
- 在开头添加字段:
alter table user add id int(11) first;
- 默认在最后添加:
- 删除字段:
alter table user drop age;
- 修改字段位置及名称:add/modify/change
alter tablr user modify em varchar(32) first;
- 修改表名:
alter table user rename new_user;
数据操作语言(DML)
-
说明:在大多数的操作中,使用的都是增删改查操作(CURD)。
-
准备:一张用于测试的表
mysql> create table tb_name( -> id int auto_increment, -> name varchar(20) not null, -> money float not null, -> province varchar(20) default null, -> age tinyint unsigned not null, -> sex tinyint not null, -> primary key(id) -> )engine=innodb default charset=utf8;
-
插入数据:
- 方式1:不指定字段,添加数据时需要写完整所有的字段
insert into tb_name values(1, '刘亦菲', 20000000, '武汉', 28, 1);
可以一次性插入多条数据,一条数据需要使用一个()包括起来。
- 方式2:指定字段,只需要传递指定字段的值
insert into tb_name(name, money, age, sex, province) values('赵丽颖', 8000000, 31, 1, '河北');
插入数据的顺序与前面指定的字段名要一致。
- 注意:插入数据时可以不传值的字段
- 自增的字段
- 有默认值的
- 可以为空的
- 说明:插入数据时,第二种方式使用的比较多。
-
查询数据:
select * from tb_name;
-
查询指定数据:
select * from tb_namewhere id=1;
-
修改数据:
update tb_nameset age=31, money=10000000 where id=1;
- 警告:修改操作一定不要忘了指定条件,否则后果自负。
-
删除数据:
delete from tb_namewhere id=2;
- 警告:删除操作一定不要忘了指定条件,否则后果自负。
查询数据语言(DQL)
-
基础查询:
select * from tb_name;
-
指定字段查询:
select name, money, province from tb_name;
-
删除重复记录:
select distinct province, sex from tb_name;
- 使用distinct指定的字段不能重复,指定多个字段时,字段组合不能重复
-
指定条件查询:
-
- 示例:
select * from tb_name where age > 30; select * from tb_name where age > 30 and sex=1; select * from tb_name where age > 30 or province='河南'; select * from tb_name where age [not] between 30 and 40; select * from tb_name where id [not] in(1,3,5); select * from tb_name where province like '%北%'; # 包含北 的地区 select * from tb_name where province like '北_'; # 北x 的地区 select * from tb_name where province like '*北'; # 以北 开头的地区 select * from tb_name where length(name)<6;
-
通配符:like模糊查询使用
- %:表示任意个字符,可匹配任意类型和长度的字符
- _:表示单个任意字符,常用来限制表达式的字符长度语句(可以代表一个中文字符)
- *:以某个字符开头或结尾
-
结果集排序:
- 示例:
select * from tb_name order by age asc; select * from tb_name order by money desc;
-
- 多字段排序:当前面字段值一样时,按照后面指定的字段进行排序
select * from tb_name order by sex asc, age desc;
-
限制结果集:
- limit:用于限制结果集的数量
-
示例:
select * from tb_name limit 5; # 取前5条数据 select * from tb_name limit 5 offset 2; # 偏移2条,取5条数据 select * from tb_name limit 2, 5; # 功能同上 省略offset的写法 就是将偏移量放到前面 将限制每页条数的放在后面
- 分页查询:
每页10条数据,用pageSize,page是当前页面,请写出对于页码的查询条件 第一页:limit 10 第二页:limit 10, 10 第三页:limit 20, 10 page页:limit (page-1) * pageSize, pageSize
-
常用聚合函数:
函数 说明 count 统计个数 sum 求和 avg 平均值 max 最大值 min 最小值 -
示例:
select count(*) as c from tb_name;
select max(money) as max_money from tb_name;
as可以给查询结构字段起别名
-
分组及过滤:
- 示例:
select * from tb_name group by sex; # 只分组,结果集中每个组中只有一条数据 select count(*) as c, sex from tb_name group by sex; # 分组并统计信息 select count(*) as c, province from tb_name group by province having c>1; having后面做的是分组后的显示过滤 # 分组后条件不能使用where,只能使用having
创建多表关系:
foreign key(o_buyer_id)references s_user(u_id),
foreign key(o_seller_id)references s_user(u_id)
alter table emp add constraint foreign key emp(deptno) refetences dept(deptno);
FOREIGN KEY(o_buyer_id) REFERENCES s_user(u_id),
FOREIGN KEY(o_seller_id) REFERENCES s_user(u_id)
ALTER TABLE EMP ADD CONSTRAINT FOREIGN KEY EMP(DEPTNO) REFERENCES DEPT (DEPTNO);
多表联合查询
select distinct
:清楚查询
-
隐式内连接:没有出现
join
关键字- 示例:
select username, name from user, goods where user.gid=goods.gid;
- 说明:查看哪个用户购买了哪个商品
- 示例:
-
显式内连接:SQL语句中出现了
join
关键字- 示例:
select username,name from user join goods on user.gid=goods.gid;
- 说明:功能同上
- join前可以添加
inner
或cross
关键字,可以省略
- 示例:
-
左外连接:以左表为主,
left outer
- 示例:
select username, name from user left outer join goods on user.gid=goods.gid;
- 说明:显示左表所有数据,右表有对应就显示数据,没有对应显示NULL
- 示例:
-
右外连接:以右表位住,
right outer
- 示例:
select username, name from user right outer join goods on user.gid=goods.gid;
- 说明:显示有表所有数据,左表有对应就显示数据,没有对应显示NULL
- 示例:
-
子(嵌套)查询
select * from user where gid in (1,3,5); select * from user where gid in (select gid from goods);
-
记录联合
- 语法:
select 语句1 union select 语句2
- 说明:
- union all:将两边查询结果直接拼在一起
- union:是union all的去重结果
- 语法:
-
联合更新数据
- 示例:
update user u, goods g set u.gid=0, g.price=g.price-200 where u.gid=g.gid and u.id=7;
- 说明:可以给操作的表起别名,还可以对字段的原有只进行运算
- 示例:
事务处理语言(DTL)
-
说明:测试的表的存储引擎要支持事务(InnoDB)
-
开启事务:禁止自动提交
set autocommit=0;
-
操作回滚:通常在出现操作异常时使用
rollback;
-
提交操作:整个事务过程中没有问题
commit;
开启事务:
start transaction
提交事务:
commit
回滚操作:
rollback
数据控制语言(DCL)
-
查看授权:
- 格式:
show grants [for 'user'@'host'];
- 示例:
show grants for 'root'@'localhost';
- 说明:查看当前登录用户授权时可以不指定用户及主机
- 格式:
-
创建用户:
- 格式:
create user 'user'@'host' identified by 'password';
- 示例:
create user 'test'@'10.8.156.%' identified by '123456';
- 说明:%表示通配符,任意的
- 格式:
-
用户授权:
- 格式:
grant 权限 privileges on 库名.表名 to 'user'@'host' identified by 'password';
- 示例:
grant all privileges on *.* to 'test'@'10.8.156.%' identified by '123456';
- 说明:权限可以是select、delete、insert、update等,all表示所有权限;*表示所有
- 格式:
-
刷新权限:
flush privileges;
-
取消授权:
- 格式:
revoke 权限 privileges on 库名.表名 from 'user'@'host';
- 示例:
revoke delete privileges on test.* from 'test'@'10.8.156.%';
- 说明:收回当前局域网内的test用户在test库下所有的表的删除权限
- 格式:
-
删除用户:
- 格式:
drop user 'user'@'host';
- 示例:
drop user 'test'@'10.8.156.%';
- 格式:
-
linux下远程登录:
- 修改 /etc/mysql/mysql.conf.d/mysqld.cnf文件,
将bind-address=127.0.0.1
改为:
bind-address=0.0.0.0- 添加指定用户在指定主机的操作权限:
grant all privileges on *.* to 'root'@'%' identified by '123456';
备份与恢复
- 备份:
- 说明:就是将数据库中的数据(SQL语句)保存到一个文件中
- 示例:
mysqldump -uroot -p test > test.sql
- 恢复:
- 说明:将保存SQL语句的文件解析,挨个执行其中的SQL语句
- 示例:
mysql -uroot -p test < test.sql
python操作MySQL
- 安装扩展:
pip install pymysql
- 查看安装包:
pip list
import MySQLdb # sqlite3
# 打开数据库连接
db = MySQLdb.connect("localhost", "testuser", "test123", "TESTDB", charset='utf8' )
# 使用cursor()方法获取操作游标
cursor = db.cursor()
# 使用execute方法执行SQL语句
cursor.execute("SELECT VERSION()")
# 使用 fetchone() 方法获取一条数据;fetchall()获取全部;fetchmany()获取一条,返回列表
data = cursor.fetchone()
print("Database version : %s " % data)
# 关闭数据库连接
db.close()
Redis
Redis简介
- Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。
- 非关系型数据库的一种,经常用作缓存数据库服务器。
- 官网:http://www.redis.io/ 中文网:http://www.redis.cn/
- 具有丰富的数据类型:字符串、哈希、列表、集合、有序集合
- 端口:6379
redis的特点:
Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
Redis支持数据的备份,即master-slave模式的数据备份
性能极高 支持每秒读的次数为110000次/s,写的速度是81000次/s
redis常用命令
-
常用管理命令:
sudo service mongod start:重启服务 mongo:连接redis ping:测试连接情况,默认恢复'PONG' quit/exit:退出客户端 auth:密码认证 config:配置命令,可以查看和设置配置信息,参考密码查看与设置 info:查看服务器信息,可以指定具体模块查看 command:查看支持的命令 select:选择库,总共16个,默认为0数据库;提示符后会有库号的提示,没有就是默认的库(0) dbsize:查看当前库key的数量 flushdb:清空当前库 flushall:清空所有库 save:前台执行持久化存储 bgsave:后台执行持久化存储
-
键(keys):
exists:判断指定的键是否存在 del:删除指定的键值对 keys *:查看指定样式的键,keys *表示查看所有 ttl:查看指定键的剩余有效时间,单位为秒,不存在键返回-2,永久返回-1 expire:设置指定键的生存时间 persist:移除指定键的生存时间,之后该键永久有效 move:移动指定的键到指定的库 rename:修改指定键的名字
-
字符串(string)
set:设置,存在就修改,不存在就添加 get:获取,获取指定键的值 mset:同时设置多个键值对 mget:同时获取多个键对应的值 getset:设置新值,同时返回旧值 setex:设置值及过期时间,单位为秒 incr:数字值加1 decr:数字值减1 incrby:数字值加上指定值 decrby:数字值减去指定值 incrbyfloat:数字值加上一个浮点数 append:键存在,值为字符串,追加指定的内容到原值的末尾 strlen:返回键对应值的字符长度
-
哈希(hash)
hset:设置单个属性 hget:获取单个属性 hmset:设置多个属性 hmget:获取多个属性 hgetall:获取所有属性 hexists:判断指定键是否有指定的字段 hdel:删除指定键的指定字段 hkeys:获取指定键的所有字段 hvals:获取指定键的所有字段值 hlen:获取指定键的字段个数 hincrby:在指定键的指定字段上增加一个整数 hincrbyfloat:在指定键的指定字段上增加一个浮点数
-
列表(list)
lpush:从左边(头部)插入数据 lpop:从左边(头部)删除并返回数据 lrange:获取区间内的数据,0 -1通常可以表示所有范围 lindex:根据索引获取元素 llen:统计列表中元素个数 lset:设置指定索引的元素值 lrem:删除指定数量的元素 linsert:在指定元素的前/后插入元素(before) ltrim:修剪列表元素(保留指定范围内地,删除其他) rpop:从右边(尾部)删除并返回数据 rpush:从右边(尾部)插入数据
-
集合
sadd: 向集合中添加一个元素 scard: 获取集合中的成员数 smembers:返回集合中的所有成员 spop:移除并返回集合中的一个随机元素
redis的发布订阅:
Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。
Redis 客户端可以订阅任意数量的频道。
当有新消息通过 PUBLISH 命令发送给频道 channel1 时, 这个消息就会被发送给订阅它的三个客户端:
创建订阅频道名
subscribe name
通过publish name去往频道名字里面推送信息
然后客户端就能收到此订阅信息
数据类型
-
字符串、哈希、列表
-
集合(set)
sadd:向集合中添加元素(集合不存在会自动创建) scard:统计集合中元素的个数 smembers:返回所有元素 sismember:判断某个元素是否是集合的成员 spop:随机删除并返回指定个数的元素,不指定个数默认一个元素 srandmember:随机获取指定个数的元素 srem:移除指定元素 smove:将指定的元素从一个集合移动到另一个集合中 sinter:求交集 sinterstore:求交集并保存到一个集合中 sdiff:求差集 sdiffstore:求差集并保存到一个集合中 sunion:求并集 sunionstore:求并集并保存到一个集合中
-
有序集合(sorted set)
zadd:添加元素 zcard:统计元素个数 zcount:指定分数区间统计 zrange:返回指定索引范围内的元素(升序),zrevrange:降序 zrangebyscore:返回指定分数区间的元素(升序),zrevrangebyscore:降序 zrank:返回指定元素的索引(升序),zrevrank:降序 zrem:移除元素 zscore:返回元素的分数 zincrby:将元素的分数增加一个值 zinterstore:求交集并保存 zunionstore:求并集并保存
Python操作Redis
-
安装扩展:
pip install redis
-
简介:
redis扩展库中有两个类,Redis和StrictRedis;StrictRedis实现了官方的命令,Redis是它的子类,兼容老版本。扩展中没有提供select方法,可以在连接时通过参数指定库。
-
操作:
- 简单连接:导入类库,创建Redis对象,然后所有的命名都是Redis对象的方法
- 连接池:多个Redis使用同一个连接池连接,减少了频繁的连接、断开数据库的开销
- 使用管道:可以先记录多条命令,然后一次性发送到服务器,避免了多次操作服务器的开销
redis的安装:
第一种方法:
1.首先在官网上下载redis最新的版本,命令如下:
wget http://download.redis.io/releases/redis-4.0.8.tar.gz
2.解压下载的redis压缩包
tar -vxzf redis-4.0.8.tar.gz
3.进入src目录并make
make
4.编译完成后可以使用如下命令进行测试
make test
注:如果make过程中出现了如下错误:
error: jemalloc/jemalloc.h: No such file or directory
就执行make MALLOC=libc 就OK了,不过在执行这一句之前最好先执行
make clean清理一下。
启动方法 在src目录下 ./redis-server
第二种方法:
sudo apt-get update
sudo apt-get install redis-server
启动 Redis
redis-server
查看 redis 是否启动?
redis-cli
以上命令将打开以下终端:
redis 127.0.0.1:6379>
127.0.0.1 是本机 IP ,6379 是 redis 服务端口。现在我们输入 PING 命令。
redis 127.0.0.1:6379> ping
PONG
有时候会有中文乱码 连接的时候需要 redis-cli --raw
MongoDB
MongoDB简介
-
MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。
-
是一个介于关系型数据库和非关系型数据库之间的产品,是非关系型数据库中最像关系型数据库的一种,是功能最丰富的非关系型数据库。
-
安装和卸载:
1.导入软件源的公钥sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv EA312927
2.为mongodb创建软件源list文件 ubuntu12.04: echo "deb http://repo.mongodb.org/apt/ubuntu precise/mongodb-org/3.2 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.2.list ubuntu14.04: echo "deb http://repo.mongodb.org/apt/ubuntu trusty/mongodb-org/3.2 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.2.list ubuntu16.04: echo "deb http://repo.mongodb.org/apt/ubuntu xenial/mongodb-org/3.2 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.2.list 3.更新软件源并安装mongodb sudo apt-get update sudo apt-get install -y mongodb-org 如果想要安装特定的版本,使用下面命令: sudo apt-get install -y mongodb-org=3.2.9 mongodb-org-server=3.2.9 mongodb-org-shell=3.2.9 mongodb-org-mongos=3.2.9 mongodb-org-tools=3.2.9 4.配置启动文件 如果是ubuntu16.04的版本,需要手动新建/lib/systemd/system/mongod.service文件,并写入下面内容: [Unit] Description=High-performance, schema-free document-oriented database After=network.target Documentation=https://docs.mongodb.org/manual [Service] User=mongodb Group=mongodb ExecStart=/usr/bin/mongod --quiet --config /etc/mongod.conf [Install] WantedBy=multi-user.target
5.启动、重启和关闭命令
sudo service mongod start
sudo service mongod restart
sudo service mongod stop
6.mongodb的完全卸载
先停止运行mongodb
sudo service mongod stop
再卸载软件
sudo apt-get purge mongodb-org*
删除数据库和日志文件
sudo rm -r /var/log/mongodb
sudo rm -r /var/lib/mongodb
如果想要使用远程连接mongo 那么需要
sudo vim /etc/mongo.conf
找到net 将 127.0.0.1 改为0.0.0.0即可
连接到mongodb
直接在终端输入 mongo
MySQL与MongoDB对比
-
相关概念
MySQL MongoDB database(数据库) db(数据库) table(数据表) collection(集合) row(行) document(文档) column(列) field(域/字段)
db操作
- 查看所有数据库:
show dbs
,若数据库中没有数据,则不会显示出来 - 查看当前数据库:
db
或db.getName()
- 创建并切换数据库:
use python1806
- 数据库存在直接切换,不存在创建后再切换
- 当数据库中没有数据时,
show dbs
不会显示
- 删除当前数据库:
db.dropDatabase()
- 查看帮助:
help
- 退出:
exit
或quit()
collection操作
- 查看当前数据库下的所有集合:
show collections
- 创建集合:
- 单纯创建:
db.createCollection('user')
,会创建一个空集合 - 按需创建:
db.stu.insert({name:'shuorui', age:30})
,直接操作不存在的集合,系统会自动创建
- 单纯创建:
- 删除集合:
db.stu.drop()
document操作
-
增加文档:
- insert
# 插入一条数据 db.user.insert({name:'jiwei', age:29, height:175, isDelete:0}) # 插入多条数据 db.user.insert([{name:'zhihui',age:18, height:168, isDelete:0},{name:'minghui', age:28, height: 173, isDelete:0}])
- save
# 保存的数据没有_id字段,会插入一个新的文档 db.user.save({name:'wenke', age:40, height:178, isDelete:0}) # 保存的数据有_id字段,会修改对应的数据 db.user.save({_id:ObjectId("5be3ecf105c088a265a0b578"), name:'wenke',age:30, height: 178, isDelete:0})
-
更新文档
- save
# 保存的数据有_id字段,会修改对应的数据,就相当于更新操作 db.user.save({_id:ObjectId("5be3ecf105c088a265a0b578"), name:'wenke',age:25, height: 178, isDelete:0})
- update:
db.集合.update(query, update, {upsert:<boolean>, multi:<boolean>})
- query:表示查询条件
- update:表示更新设置的内容
- $set:表示设置
- $inc:表示增加
- upsert:更新的查询结果不存在,是否作为新数据插入,默认为false
- multi:符合条件的数据是否全部更新;true表示全部更新,false表示更新一条,默认为false
db.user.update({age: 25}, {$set:{age:26}}) # 只会更新一条 db.user.update({height:175}, {$inc:{height: 1}}, {multi: true}) # 会更新全部 db.user.updateMany({isDelete: 1}, {$set:{isDelete: 0}}) # 更新全部
-
删除文档
- remove:
db.集合.remove(query,{justOne:<boolean>})
db.user.remove({height: 176}) # 默认删除所有数据 db.user.remove({isDelete:0}, {justOne:true}) # 只会删除一条数据
- delete:官方推荐
db.user.deleteOne({isDelete: 0}) # 删除一条数据 db.user.deleteMany({isDelete: 0}) # 删除所有数据
- remove:
-
查询文档
- 格式:
db.集合.find(query, {key1:0/1, key2:0/1, keyn:0/1})
- query:查询条件
- key:表示字段名
- 第二个参数要么同时为1表示显示的字段,要么同时为0表示排除的字段
db.user.find({},{name:1, age:1}).pretty() # 只显示name和age db.user.find({},{name:0, age:0}).pretty() # 不显示name和age
- pretty():格式化显示数据(类似于字典形式显示)
db.user.find().pretty()
- findOne
db.user.findOne({isDelete:0}) # 只返回条数据
- 格式:
虚拟环境
什么是虚拟环境:
一个隔离了外界干扰的,独立的环境
虚拟环境的搭建:
1.pip install virtualenv
2.pip install virtualenvwrapper
3.whereis virtualenvwrapper.sh
4.source 上面的路径信息
5.source ~/.bashrc
mkvirtualenv name 创建虚拟环境名称(name就是自定义的虚拟环境名字)
rmvirtualenv name 删除虚拟环境名称
workon name 使用某个虚拟环境
deactivate 退出虚拟环境
6.重新打开终端 然后 sudo vim ~/.bashrc
export=/home/huguanyu/.virtualenvs
source /usr/share/virtualenvwrapper
然后强制保存
7.重新source ~/.bashrc
pip install --user virtualenv