mysql -u用户名 -p $ 输入密码 mysql >
# 备份 mysqldump -h主机名 -P端口 -u用户名 -p密码 数据库名 > 文件.sql # 备份 + 压缩 mysqldump -h主机名 -P端口 -u用户名 -p密码 数据库名 | gzip > 文件.sql.gz # 多表备份 mysqldump -h主机名 -P端口 -u用户名 -p密码 数据库名 表1 表2 ... > 文件.sql # 多库备份 mysqldump -h主机名 -P端口 -u用户名 -p密码 --databases 库1 库2 ... > 文件.sql # 备份数据 --- 表结构 mysqldump -h主机名 -P端口 -u用户名 -p密码 --no-data 库1 库2 ... > 文件.sql # 恢复数据库 mysql -u用户名 -p密码 库名 < xxx.sql # 数据库需事先创建
数值
# 整型 tinyint smallint int bigint #小数 float double decimal(M,D)
字符串
char(n) 0 - 255 varchar(n) 0 - 65535 text 65535 longtext 4 294 967 295
时间
DATE YYYY-DD-MM TIME HH:MM:SS YEAR YYYY DATETIME YYYY-MM-DD HH:MM:SS TIMESTAMP YYYYMMDD HHMMSS
创建数据库
create database db_name default char set utf8;
创建表
create table table_name ( id int primary key auto_increment, 字段 数据类型 其它约束, ... )
插入数据
insert into table_name(字段1, 字段2, ...) values (字段1值, 字段2值, ...) (字段1值,字段2值, ...) ...
查询数居
select 语句结构
3 select 字段列表
2 from 表名列表
1 where 查询条件
4 group by 分组条件
5 having 对分组进行过滤
6 order by 排序 desc
7 limit n m
修改数据
update table_name set 字段=值,字段=值,... where 条件;
删除数据
delete from table where 条件;
修改表结构 alter table
alter table table_name add new_filed type 约束 [first|after 已存在的字段名] alter table table_name modify filed_name type alter table table_name drop filed_name alter table table_name old_name new_name type; alter old_table_name rename new_table_name;
分页 limit
limit [offset ,] rows # 从第offset行开始 要 rows行
索引
为何要使用索引
使用用btree减少i/o操作,加快查询速度
索引分类
index
unique
创建索引
建表时指定
create table table_name( id int primary key auto_increment, name varchar(32), phone char(11), index(name), unique(phone) );
在已有表中创建
create index name_index on table_name(filed) alter table table_name add unique / index (字段名)
删除索引
drop index index_name on table_name; # 获取index_name show create table table_name;
max
min
count
avg
....
select count(id) from table_name where xxx;
select country, count(id) from table_name where xxx
group by country
select country, count(id) from table_name where xxx
group by country
having country='吴国';
字符串相关函数
ASCII(s)
select ascii('my name is xxx') from table_name limit 1; 返回m的ascii 值 109
CHAR_LENGTH(s)
select char_length('my name is xxx') from table_name limit 1; 返回 'my name is xxx'的长度 14
CONCAT(s1, s2, s3, ...)
select contact('a', 'b' , 'c') from table_name limit 1;
CONCAT_WS(x,s1,s2,s3,...)
select concat_ws('-','a','b','c') from table_name limit 1; # a-b-c
时间相前函数
ADDDATE(d,n) # 起始日期d 加上 n 天后的日期
select adddate('2019-10-7', 10) from table_name limit 1;
ADDTIME(t,n) # t加上n秒后的时间
CURDATE() # 返回当前日期
CURTIME() # 返回当前时间
DATE(d) # 从日期 或 时间表达式中提取日期 DATE("2017-06-15") -> 2017-06-15
DATEDIFF(d1,d2) # d1->d2之间相隔天数 如果d1 早于 d2 返回 负数
DATE_ADD(d, interval expr type) # type DAY YEAR HOUR MINUTE SECOND
DATE_SUB(d, interval expr type) # type DAY YEAR HOUR MINUTE SECOND
DATE_FORMAT(d,f) # SELECT DATE_FORMAT('2011-11-11 11:11:11','%Y-%m-%d %r')
DAY(d) # SELECT DAY("2017-06-15") -> 15
DAYNAME(d) # d是星期几 SELECT DAYNAME('2011-11-11 11:11:11')->Friday
DAYOFWEEK(d) # d是星期几 1 星期日,2 星期一,以此类推 SELECT DAYOFWEEK('2011-11-11 11:11:11')->6
DAYOFYEAR(d) # 计算日期 d 是本年的第几天 SELECT DAYOFYEAR('2011-11-11 11:11:11')->315
EXTRACT(type FROM d) #从日期 d 中获取指定的值,type 指定返回的值
#SELECT EXTRACT(MINUTE FROM '2011-11-11 11:11:11')-> 11
FROM_DAYS(n) # 计算从 0000 年 1 月 1 日开始 n 天后的日期
HOUR(t) # 返回 t 中的小时值
LAST_DAY(d)# 返回给给定日期的那一月份的最后一天
MAKEDATE(year, day-of-year) # year 第 day-of-year 的日期
MAKETIME(hour, minute, second) # 合时间,参数分别为小时、分钟、秒
select ... from ... where xxx (select xxx)
有A表和B表
A
id | 姓名 | 工资 |
---|---|---|
1 | 张三 | 8000 |
2 | 李四 | 9000 |
3 | 王五 | 20000 |
B
id | aid | 职位 |
---|---|---|
1 | 3 | XX |
2 | 2 | XX |
3 | 3 | XX |
A为主表
B为从表
关联条件 : A.id = B.aid
B.aid 为 B 指向 A 的外键 (B表可以通过aid字段关联到A表并获取信息)
# 建表时
create table A(id int primary key auto_increment, name varchar(20), money float(5,2) default 0.0);
create table B(id int primary key auto_increment, int aid, site varchar(20),
foreign key (aid)
references A(id)
on delete cascade delete/set null
on update cascade cascade
);
# 在已有表中添加
alter table 从表表名 add foreign key (从表外键) references 主表名(id);
# 也可以在创建外键时指定外键名,但是感觉没什么用,用系统给的就好了。
alter table 从表表名 drop foreign key 外键名;
# 外键名可以通过
show create table 表名; # 查看
select 字段列表
from #{表1
inner / left / right join 表2 on 连接条件
inner / left / right join 表3 on 连接条件
...# } 可以把这一部分看成是一张超表
where 条件
...
# 将所有的表连起来组成一张超表,然后再对这张超执行查询操作
# 左连接或右连接时常有null值出现,可以用 ifnull 将 null 换成其它值
select ifnull(字段,val) from ...
# 安装 pymysql
pip install pymysql
# 操作数据库基本流程
import pymysql
# 获取数据库的连接
db = pymysql.connect(
host='主机ip',
user='用户名',
passwd='密码',
db = '数据库名'
port=3306,
charset='utf6'
)
# 获取游标, 数据库的增删改都是通过它来执行的
cur = db.cursor()
# 数据库操作
cur.excute('sql 命令')
# 如果 sql 为查询语句
for row in cur.fetchall():
pass
# 如果 sql 为修改 或删除 需要 commit()
db.commit()
cur.close()
db.close()
#1. cur.excute(query, args=None) -> 返回影响的行数
sql = 'insert into Student(s_id, s_name, s_sex, s_birth) values(%s,%s,%s,%s)'
cur.excute(sql, ['10', '张三丰', 'm', '1882-9-10'])
# 2. cur.excutemany(query, args=None) -> 返回影响的行数
cur.excutemany(sql, [('10', '张三丰', 'm', '1882-9-10'),('12', '张四丰', 'm', '1872-9-10')])
# 3 db.commit() / db.rollback()
# 4. cur.fetchall / cur.fetchmany / cur.fetchone