MySQL基本操作

基本操作

1.数据库连接

mysql -u用户名 -p
$ 输入密码
mysql > 

2.数据库备份/恢复

# 备份
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 # 数据库需事先创建

mysql数据类型

  1. 数值

    # 整型
    tinyint 
    smallint
    int
    bigint
    #小数
    float
    double
    decimal(M,D)
    
  2. 字符串

    char(n) 0 - 255
    varchar(n) 0 - 65535
    text 65535
    longtext 4 294 967 295
    
  3. 时间

    DATE YYYY-DD-MM
    TIME HH:MM:SS
    YEAR YYYY
    DATETIME YYYY-MM-DD HH:MM:SS
    TIMESTAMP YYYYMMDD HHMMSS
    

基本sql语句

  1. 创建数据库

    create database db_name default char set utf8;
    
  2. 创建表

    create table table_name (
        id int primary key auto_increment,
        字段 数据类型 其它约束,
        ...
    )
    
  3. 插入数据

    insert into table_name(字段1, 字段2, ...) 
    values (字段1值, 字段2值, ...) (字段1值,字段2值, ...) ...
    
  4. 查询数居

    • select 语句结构

      3 select 字段列表
      2 from 表名列表
      1 where 查询条件
      4 group by 分组条件
      5 having  对分组进行过滤
      6 order by 排序 desc
      7 limit n m
      
  5. 修改数据

    update table_name set 字段=值,字段=值,... where 条件;
    
  6. 删除数据

    delete from table where 条件;
    
  7. 修改表结构 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;
    
  8. 分页 limit

    limit [offset ,] rows # 从第offset行开始 要 rows行
    
  9. 索引

  10. 为何要使用索引

    使用用btree减少i/o操作,加快查询速度

  11. 索引分类

    index
    unique
    
  12. 创建索引

  • 建表时指定

    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='吴国';

mysql函数

字符串相关函数

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 条件
...
# 将所有的表连起来组成一张超表,然后再对这张超执行查询操作

ifnull函数

# 左连接或右连接时常有null值出现,可以用 ifnull 将 null 换成其它值
select ifnull(字段,val) from ...

用pymysql操作数据库

# 安装 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()

pymysql常用方法

#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

你可能感兴趣的:(mysql,mysql,pymysql)