Mysql&Redis基本操作

Mysql

1.安装

  • 基本操作

    # 建库
    create database [database name] charset=utf8 ;   (djangomall
    # 新建用户
    create user [user name] identified by [password] ;  (u:xuanRui  p:djangomall
    # 为用户分配数据库权限
    grant all on [database name].* to '[user name]'@'%' ;
    # 刷新权限
    flush privileges ;
    # 清除表中数据
    delete from 表名;
    truncate table 表名;
    不带where参数的delete语句可以删除mysql表中所有内容,使用truncate table也可以清空mysql表中所有内容。
    效率上truncate比delete快,但truncate删除后不记录mysql日志,不可以恢复数据。
    delete的效果有点像将mysql表中所有记录一条一条删除到删完,
    而truncate相当于保留mysql表的结构,重新创建了这个表,所有的状态都相当于新表。
    

2.库操作

- 展示所有数据库
	show databases;
- 创建数据库(默认拉丁1字符集,不支持中文存储)
	create database [dbname] charset=utf8;
- 展示建库语句
	show create database [dbname];
- 查看当前数据库e
	select database();
- 切换数据库
	use [dbname];
- 删除数据库
	drop database [dbname];

3.表结构操作

- 展示所有数据表
	show tables;
- 新建表结构
	create table [tbname](
        [字段名] [数据类型] [字段约束] ,
        ...		...		... 
    );
    - example:
                create table stutends(
                    id int unsigned(无符号) primary key(主键) auto_increment(自增),
                    name varchar(16) not null,
                    age tinyint unsigned default(默认值) 18,
                    gender enum('man','women') default 'unknow',
                );
- 展示建表语句
	show create table [tbname];
- 描述(describe)表结构
	desc [tbname];
- 删除表
	drop table [tbname];
# 修改表结构
- 添加字段
	alter table [tbname] add [字段名] [数据类型] [字段约束];
- 删除字段
	alter table [tbname] drop;
- 修改字段类型
	alter table [tbname] modify [旧字段名] [数据类型] [字段约束];
- 修改字段名
	alter table [tbname] change [旧字段名] [新字段名] [数据类型] [字段约束];

	

4.表数据操作

- 查询表数据
	select [字段名1],[字段名2] from [tbname];
	select * from [tbname]; 查询所有字段,大数据表慎用;
- 插入表数据
	insert into [tbname] (字段名1,...) values(); 字段名与表结构和数据值需对应;
	全列插入数据时,插入字段名可省略:
	insert into [tbname] values();
	同时插入多条数据:
	insert into [tbname] values(),(),();
	- example:
                insert into students (id,name,age) values (1,'xuanRui',18);
                insert into students values(0,'xuanrui',18);
                insert into students values(0,'xuanrui',18),(1,'xuanrui2',19);
# 导入.sql文件数据
	source /home/user/Desktop/areas.sql;
- 修改表数据
	update [tbname] set [字段名]=[数据],[字段名]=[数据] where [条件语句];
- 删除表数据(物理删除,难以恢复)
	delete from [tbname] where [条件语句];
- 删除表数据(逻辑删除,假删,本质是为该条数据添加标识)
	[新建逻辑删除字段,默认值0,删除数据更值为1]
	- example:
                alter table students add is_delete bit default 0;
                update students set is_delete=1 where name = 'xuanrui';

5.查询进阶操作

- as
	[为表名或字段名起别名,仅当前sql语句生效,as关键字可省略;]
	select s.id,s.age form [tbname] as s;
	select id as '编号',age as '年龄' from [tbname]; 
- distinct
	[将查询结果中的重复数据去重]
	select distinct age from [tbname];
- where
	[条件语句关键词,筛选符合条件的数据]
	select * from [tbname] where age > 18; (查询表中年龄大于18的所有用户)
	- 比较运算符
		大于等于:>= 	不等于:!= or <>
	- 逻辑运算符
		and		or		not
- like
	[模糊查询]
	% 表示任意个任意字符
	_ (下划线)表示任意一个字符
- between and
	[连续范围查询]
	select * from [tbname] where age between 18 and 22; (查询表中年龄在18-22岁的用户)
- in / not in
	[非连续范围查询]
	select * from [tbname] where age in (18,20,22); (查询表中年龄为18\20\22岁的用户)
	select * from [tbname] where age not in (18,20,22); (年龄不为18\20\22岁的用户)
- IS NULL / IS NOT NULL
	[判空查询]
	select * from [tbname] where age IS NULL; (查询表中年龄为空的用户)
	select * from [tbname] where age IS NOT NUll; (查询表中年龄不是空的用户)
- order by / ASC(升序;默认) / DESC(降序)
	[排序查询]
	- 单字段排序
        select * from [tbname] order by age; (根据年龄排升序)
        select * from [tbname] order by age DESC; (根据年龄排降序)
    - 多字段排序(根据sql语句中字段的顺序依次进行,相等值则跟据后一字段排)
    	select * from [tbname] order by age,height DESC,id; 
    	(首先根据年龄排升序,年龄相同则根据身高排降序,身高相同则根据id排升序)
- limit
	[分页查询;多用于热搜榜/排行榜,排序+分页;]
	select * from [tbname] limit 5;== select * from [tbname] limit 0,5;
	(查询表中的前5条数据,limit默认起始下标0)
	第n页,每页显示m条数据:limit m*(n-1),m
	
# 聚合函数
  [聚合函数均不计算NULL值]
- sum / avg / count / max / min
  和	/ 平均值 / 数量 / 最大值 / 最小值
	select sum(age) from [tbname]; (表中年龄总和)
	- 如果计算时,NULL值需要计算时:
    	select avg(ifnull(height,180)) from [tbname]; 
    	(计算表中的平均身高,若为NULL值,赋值为180参与计算)
    	
# 分组函数
- group by / group_concat
	- 注意:分组之后的数据不再是二维数据,所以select只能查询分组字段
	select age from [tbmname] group by age;
	- 查询除分组字段之外的字段,需借助关键字group_concat或聚合函数实现
	select age,group_concat(name) from [tbmname] group by age;
- having
	[分组条件]
	- 查询以年龄分组后,组内成员大于3的组数据
	select age,group_concat(name) from [tbmname] group by age having count(*)>3;
- with rollup
	[汇总行]用于显示select查询时聚合函数的统计和计算结果
	select age from [tbmname] group by age with rollup;
	
# 分组函数 + 聚合函数
	select age,group_concat(name),avg(id),avg(age) from [tbmname] group by age;
	

6.查询高级操作

 - 数据准备 :
------------------------------------------------------------------------------------
create table hero(id int unsigned primary key auto_increment,name varchar(64) not null,gongfuid int unsigned not null
);
create table gongfu(id int unsigned primary key auto_increment,name varchar(64) not null
);
insert into hero (name,gongfuid) values ('妲己',2),('李白',1),('程咬金',3),('公孙离',5);
insert into gongfu (name) values ('吟诗作对'),('魅惑'),('三板斧'),('沉默');
------------------------------------------------------------------------------------

# 连接\链接\联合查询
- join on
	select * from hero join gongfu; (笛卡尔积,左右表相应拼接)
- 内连接
	select * from hero inner join gongfu on hero.gongfuid=gongfu.id;
- 左外连接 (outer可省略) [内连接基础上,加上左表数据,右表数据以NULL填充]
	select * from hero left outer join gongfu on hero.gongfuid=gongfu.id; 
- 右外连接 (outer可省略) [内连接基础上,加上右表数据,左表数据以NULL填充]
	select * from hero right join gongfu on hero.gongfuid=gongfu.id; 
- 自连接
	[将同一张表的数据通过起别名的方法以左右表的形式拼接]
	select * from [tbname] [name1] join [tbname] [name2] on name1.字段=name2.字段;

# 子查询
	[查询语句的嵌套使用]
	- 标量子查询:子查询的语句的返回为一个值
		select * from [tbname] where height > (select avg(height) from [tbname]);
	- 列级子查询:子查询的语句返回为一个字段中的多个(行)值
		select name from gonfu where id in (select gonfuid from hero);
	- 行级子查询:子查询的语句的返回为一行中的多个字段
		select * from [tbname] where (height,age)=(select max(height), max(age) from [tbname]); 查询身高和年龄均为最大的数据;

# 外键约束
- 添加外键约束
	alter table [sub_tbname] add foreign key(字段) references [main_tbname](字段);
	example:
		hero表(子表)中的gongfuid字段来自gongfu表(主表)中的id字段 ;
		alter table hero add foreign key(gongfuid) references gongfu(id);

7.SQL执行顺序

(8)SELECT (9)DISTINCT<select_list>
(1)FROM <left_table>
(2)<join_type>JOIN<right_table>
(3)ON <join_condition>
(4)WHERE <where_condition>
(5)GROUP BY <group_by_list>
(6)WITH {CUBE|ROLLUP}
(7)HAVING<having_condition>
(10)ORDER BY<order_by_list>
(11)LIMIT <limit_number>
										语句顺序:由上至下;	执行顺序:编号由小到大

8.pymysql操作

  • 查询操作
import pymyql

if __name__ == '__main__':
    # 建立与数据库的连接
    conn = 
    pymsql.connect(host='127.0.0.1', port=3306, user='root', password='mysql',
                  database='tb_users', charset='utf8'(字符集,建议与数据库一致)
                  )
    # 连接获取游标
    cur = conn.cursor()
    # 游标执行SQL语句
    sql = "select * from tb_users;"
    cur.execute(sql)
    # 获取游标中的一条数据
    cur.fetchone() # 返回值为元组,取完返回None
    ------
    # 获取全部数据
    cur.fetchall()
    # 销毁游标
    cur.close()
    # 关闭连接
    conn.close()
    
  • 数据操作
import pymyql

if __name__ == '__main__':
    # 建立与数据库的连接
    conn = 
    pymsql.connect(host='127.0.0.1', port=3306, user='root', password='mysql',
                  database='tb_users', charset='utf8'(字符集,建议与数据库一致)
                  )
    # 连接获取游标
    cur = conn.cursor()
    # 游标执行SQL语句
    sql = "insert into tb_users VALUES (0,'xuanRui',11)"  # 增删改替换SQL语句
    ****************************************************************************
    * 注意:当SQL语句中需要传入参数时											 *
    *		如:sql = "select * from tb_users where id='%s';" % id 			*
    *											 # %s加引号,表字符串 		 *
    *	  	为防止SQL注入或脱库等安全问题,应将参数以列表的形式传给execute的第二个参数 *
    *       即参数化列表:													  *	
    *       sql = "select * from tb_users where id=%s;" # %s不加引号,仅用于占位   *	
    *        sql_args = [id]												*
    *        cur.execute(sql,sql_args)										 * 
  	*****************************************************************************
    row_count = cur.execute(sql) # 返回值int,表示影响数据表的行数
    # 提交操作 将修改的数据保存至数据库中
    conn.commit()
    # 销毁游标
    cur.close()
    # 关闭连接
    conn.close()

Redis

1.特点

  • 底层是C,性能高;
  • 内存型数据库亦可持久化存储;
  • K:V形式存储;
  • 可用做缓存;

使用场景:

  • 大数据,爬虫;
  • 浏览记录,购物车等;

2.安装

  • window下载地址:https://github.com/MicrosoftArchive/redis/releases

  • 基本操作

    # 下载后进入解压包执行
    redis-server.exe --service-install redis.windows.conf --loglevel verbose
    # 启动redis服务器
    redis-server.exe  --service-start
    # 停止redis服务器
    redis-server.exe  --service-stop
    # 连接redis服务器
    redis-cli.exe -h 127.0.0.1 -p 6379
    

3.基本操作

[Redis数据存储均为 key:value 形式]

# 键指令
- 查看当前库中所有Key - keys *
- 精确查看当前库中所有A开头的Key - keys A*
- 删除 - del k
- 是否存在key - exists k
- 查看kv类型 - type k
- 设置key的过期时间 - expire k t
- 查看过期时间 - ttl            [没有该Key或过期时间到了,返回-2;未设置过期时间返回-1]

- 清空所有数据库[16个] - flushall    
- 清空当前数据库 - flushdb
- 切换数据库 - select dbid      [0-15 共16个数据库,默认0号数据库]

# String
# [字符串; k:键 v:值]
- 增 - set k v
- 增多值 - mset k1 V1 k2 V2
- 删 - del k
- 改 - set k v
- 查 - get k
- 查多值 - mget k1 k2
- 追加 - append k v
- 有效期 - setex k t v

# Hash
# [哈希; 存储对象; o:对象 a:属性 v:值]
- 增 - hset o a v
- 增多值 - hmset o a1 v1 a2 v2
- 删对象 - del o
- 删属性 - hdel o a
- 改 - hset o a v
- 查 - hget o a
- 查多值 - hmget o a1 a2 
- 获取对象的所有属性 - hkeys o
- 获取对象的所有值 - hvals o
- 获取对象的所有属性和值 - hgetall o

# List
# [列表; 可重复; 有序; k:键 v:值 ov:旧值 nv:新值 index:下标 count:个数]
- 增 - lpush/rpush      [左插入lpush,先进后出; 右插入rpush,先进先出]
- 删 - lrem k count v   [-2 A:从右侧开始删除2个A; 3 A:从左侧开始删除3个A;0 A 全部删除A]
- 删 - rpop k  		   [边取边删]
- 改 - lset k index nv
- 查 - lrange k 0 -1    [0 -1 表示下标范围:开头至结尾]
- 插入 - linsert k before/after ov nv  [before前方插入;after后方插入]
- 截取 - ltrim k 0 -1   [0 -1 表示下标范围:开头至结尾;全闭区间]

# Set
# [无序集合; 不可重复; 无序;k:键 v:值]
- 增 - sadd k v
- 删 - srem k v
- 查 - smembers

# zSet
# [有序集合; 不可重复; 有序;k:键 v:值 s:权重值score]
- 增 - zadd k s1 v1 s2 v2
- 删 - zrem k v 
- 获取权重 - zscore k v 
- 根据权重删除 - zremrangebyscore k s1 s2   [权重范围]
- 查 - zrange k 0 -1                       [0 -1 表示下标范围:开头至结尾;全闭区间]
- 根据权重删除 - zrangebyscore k s1 s2      [权重范围]

4.与python的交互

import redis

try:
	# 建立连接
	client = redis.StrictRedis(
        host = '127.0.0.1',
        port = 6379,
        db = 0
    )
    
    save_key = 'python_redis'
    # 增
	add = client.set(save_key,'example')
    # 改
    #modify = client.set(save_key,'example2')
    # 查 [返回值为bytes类型]
    #result = client.get(save_key)
    #print(result.decode())
    # 删
    #delete = client.delete(save_key)
	   
    # 关闭连接
    client.close()
except Exception as e:
    print(e)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值