数据库基础整理

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前可以添加innercross关键字,可以省略
  • 左外连接:以左表为主,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,若数据库中没有数据,则不会显示出来
  • 查看当前数据库:dbdb.getName()
  • 创建并切换数据库:use python1806
    • 数据库存在直接切换,不存在创建后再切换
    • 当数据库中没有数据时,show dbs不会显示
  • 删除当前数据库:db.dropDatabase()
  • 查看帮助:help
  • 退出:exitquit()

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})		# 删除所有数据
    
    
  • 查询文档

    • 格式: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

发布了52 篇原创文章 · 获赞 34 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_43789195/article/details/103906134