zoukankan      html  css  js  c++  java
  • MySQL数据库命令下的常用操作方法演示与介绍,pymsql使用方法。

    数据库mysql

    安装mysql请移步百度教程,此文章不再详述。

    启动数据库
    cmd下 mysql -u root -p自己设置的密码
    命令
    show databases;看mysql数据库管理系统的数据库列表
    use 数据库名;选择要操作的mysql数据库,使用该命令所有mysql命令都只针对该数据库
    show columns from 数据表; 显示数据表的属性,属性类型,主键信息,是否为Null(空),默认值等其他信息
    create database testdb charset "utf8"; 创建一个叫testdb的数据库,且让其支持中文。
    drop database testdb;删除数据库testdb
    show index from 数据表; 显示数据表的详细索 引信息,包括PRIMARY(主键)

    创建一个数据表
    create table table_name(column_name【列名】 column_type【列类型】); #数据库中分号很重要

    例如:
    mysql> create table student(
    -> id int auto_increment,#【auto_increment表示每插入一条数据自增1】
    -> name char(32) not null,
    -> age int not null,
    -> register_date date not null,
    -> primary key(id));
    如此便创建了一个student的数据表

    MySQL数据表中插入新数据
    insert into table_name(field1,field2,...fieldN)values(value1,value2,...valueN)
    使用上面创建的表例子
    mysql> insert into student(name,age,register_date)values("zhangyang",3,"2018-1-1")
    mysql> insert into student(name,age,register_date)values('zhangyang',3,'2018-5-5')# 单引号和双引号也无区别
    如此便于数据表中插入了数据
    mysql查询数据
    select命令可以读取一条或者多条数据
    *号代替其他字段
    select * from student;代表看数据表所有字段的详情

    运行结果如下
    +----+-----------+-----+---------------+
    | id | name | age | register_date |
    +----+-----------+-----+---------------+
    | 1 | zhangyang | 3 | 2018-01-01 |
    | 2 | zhangyang | 3 | 2018-05-05 |
    +----+-----------+-----+---------------+
    一般语法:
    select column_name,column_name from table_name;

    可以使用offset n来设置偏移量,说白了就是从第n+1条数据读取,必须配合limit使用,默认为0
    limit n代表只读取n条数据的意思。如select * from student limit 2 offset 3;#offset 必须在limit后面
    where子句:
    可以使用where语句来包含任何条件:
    如:select * from student where id>3;输出是第三条以后的数据

    select * from student where id=4;输出第四条数据
    也可以多条件查询:
    select * from student where id>3 and age>5;查询并输出第三条后年龄大于5的数据。
    还能模糊查询:
    select * from student where register_date like '2018-05%'; 记得要用like和%


    mysql修改数据

    使用update语句
    语法:update table_name set field1 = new-value1,field2 = new-value2 where clause;
    例如:
    update student set name='韩梅梅' where name='zhangyang';#只改一个列名中的东西,还可以改多个

    mysql删除数据
    delete语句
    delete from table_name where clause; 设置删除条件后,精准删除数据
    例如:
    delete from student where name = '韩梅梅'; 名字为韩梅梅的数据全部删除。

    数据排序:
    select from table_name order by fieldn;
    select from table_name order by fieldn desc;
    按第n列来排序,默认为升序,加一个desc就是降序。

    group by 用来分组统计
    直接上例子
    select name,count(*) from student group by name;
    此时会用name来计数
    mysql> select * from student;#之前使用过delete 删了前面两条,id数字增加到哪里还是哪里
    +----+------+-----+---------------+
    | id | name | age | register_date |
    +----+------+-----+---------------+
    | 3 | 陆毅 | 31 | 2018-11-05 |
    | 4 | x毅 | 31 | 2048-01-05 |
    | 5 | x毅 | 31 | 2017-05-05 |
    +----+------+-----+---------------+
    3 rows in set (0.00 sec)

    mysql> select name,count(*) from student group by name;
    +------+----------+
    | name | count(*) | #count(*)也能赋值出去换一个新的名称,也是使用as **。
    +------+----------+
    | x毅 | 2 |
    | 陆毅 | 1 |
    +------+----------+
    2 rows in set (0.07 sec)

    -----------------------我是分割符------------------------------------------
    mysql> select name,count(*) as count_name from student group by name;
    +------+------------+
    | name | count_name |
    +------+------------+
    | x毅 | 2 |
    | 陆毅 | 1 |
    +------+------------+
    2 rows in set (0.27 sec)
    注意 前面的name 是显示name列,后面的name 是显示[by]name计数的结果!

    group by的合计功能:
    mysql> select name,sum(age) from student group by name;
    +--------+----------+
    | name | sum(age) |
    +--------+----------+
    | x毅 | 62 |
    | 张嘉译 | 45 |
    | 草清华 | 15 |
    | 陆毅 | 31 |
    +--------+----------+
    4 rows in set (0.04 sec)

    最后统计所有人年龄相加(这里可以是别的东西计数相加,我只是举例子),只需要在分号前加入with rollup既可
    mysql> select name,sum(age)as age_count from student group by name with rollup;
    +--------+-----------+
    | name | age_count |
    +--------+-----------+
    | x毅 | 62 |
    | 张嘉译 | 45 |
    | 草清华 | 15 |
    | 陆毅 | 31 |
    | NULL | 153 |
    +--------+-----------+
    5 rows in set (0.00 sec)
    不想要NULL的话,也能使用coalesce语法来给NULL换成想要的名字
    mysql> select coalesce(name,'合计'),sum(age)as age_count from student group by name with rollup;
    +-----------------------+-----------+
    | coalesce(name,'合计') | age_count |
    +-----------------------+-----------+
    | x毅 | 62 |
    | 张嘉译 | 45 |
    | 草清华 | 15 |
    | 陆毅 | 31 |
    | 合计 | 153 |
    +-----------------------+-----------+
    5 rows in set (0.00 sec)

    修改数据表本身而不是数据,比如修改name age这个表头
    mysql alter语句
    alter table student add sex enum('M','W') not null;增加sex这个字段,字段类型设置为enum('M','W')

    alter table student drop age;从student中删除age整个字段(age对应的整列)
    修改字段类型及名称 需要用change子句
    mysql> alter table student change sex gender char(32) default 'X'; #change后接旧字段名,马上跟新字段名,然后新字段类型既可,默认值看情况是否需要设置。
    Query OK, 5 rows affected (0.84 sec)
    Records: 5 Duplicates: 0 Warnings: 0

    查询两个表之间的交集并集差集
    innerjoin 交集 left join 差集(左对右) right join也是差集(右对左)

    full join 并集:mysql并不直接支持full join,可以联合left和right一起输出就成。
    语法如下:
    create table A (a int not null);
    create table B (b int not null);
    insert into A (a)values(i);#这里简写,i为1-5
    insert into B (b)values(i);#这里简写,i为3-7
    select * from A inner join B on A.a=B.b;此时输出A与B的交集
    +---+---+
    | a | b |
    +---+---+
    | 3 | 3 |
    | 4 | 4 |
    | 5 | 5 |
    +---+---+
    select * from A left join B on A.a=B.b;此时输出 B 于 A中的差集,先显示交集,后面出现的是差集
    +---+------+
    | a | b |
    +---+------+
    | 3 | 3 |
    | 4 | 4 |
    | 5 | 5 |
    | 1 | NULL |
    | 2 | NULL |
    +---+------+
    根据字面意思不难看出 right join其实就是把结果翻过来显示。

    并集由于mysql不直接支持,可以使用union语句把left join 和right join放一起输出折合显示:
    select * from A left join B on A.a=B.b union select * from A right join B on A.a=B.b;
    mysql事务:
    其实就是一开始输入begin;#开始事务,
    然后各种骚操作,如果程序这个时候蹦了,那么无论是插入数据还是修改或者干啥,不会记录下来,但是如果那个id序号是自增的,这个序号其实还是会变的,就如操作后再输入rollback;的效果是一样的
    如果输入了commit; 那么操作过的数据都会保留下来

    mysql索引
    如果说加了索引的mysql是飞机的话,那么没加索引的mysql就是一辆共享单车~,速度的差异很大,当然数据量很小的话体现不出来,但是数据量大了,就有非常大的区别,但索引也有缺点,表的查询速度提升了,但是如果对表进行update,insert,和delete等操作,mysql不仅要保存数据还要保存索引,建立索引会占用磁盘空间的索引文件。
    创建索引
    create index index_name on table_name(x(length));#index_name索引名(看自己喜欢写什么),table_name要索引的表,x要成为索引的字段,length该字段的长度,不超过字段本身的长度,一般字段多少,他就填多少

    、、、
    注意:主键自动就是索引。
    、、、

    删除索引:
    drop index index_name on table_name;#删除table_name表中的index_name索引。

     

    python 使用mysql接口
    MySQL-python在python3上没有实现,各种安装失败,无论怎么装c++没用,建议大家使用pymysql。
    安装 pip install pymysql
    用法基本一样

    !!!与redis一样,utf8中间不能加‘-’,必须连着写,否则会出错。

    上代码:

    import pymysql
    #创建与本机数据库的连接,端口默认3306,db就是自己命令行设置的数据库名(不是数据表)
    conn = pymysql.connect(host='127.0.0.1',port=3306,user='root',password='123456',db='slkdb',charset='utf8')#不写charset这句话,汉字输出全是问号
    #创建 光标,相当于mysql> | 这个东西
    cursors = conn.cursor()
    
    #执行mysql语句,模拟有光标的那个命令,所以要cursor对象
    result_row = cursors.execute('select * from student')#返回的是数据行数并不是数据
    print(result_row)
    print(cursors.fetchall())#把数据都打印出来,fetchone()只打印一条,读取数据原理与读取文件的read一样,前面如果读取过的数据,后面就不会再显示
    
    
    '''插入多条数据,executemany()'''
    data = [('N1',15,'2014-6-13','M'),
    ('N2', 13, '2014-6-3', 'M'),
    ('N3', 17, '2014-4-1', 'F')]
    cursors.executemany("insert into student (name,age,register_date,gender)values(%s ,%s ,%s,%s)",data)
    conn.commit()#不写这个提交命令,数据不会插入数据表中,就类似于mysql的事务。
    cursors.close()#先关闭光标,一样 顺序关闭有始有终
    conn.close()#关闭连接

     

  • 相关阅读:
    思源:秒级体验百亿级数据量监控钻取
    禧云Redis跨机房双向同步实践
    谈谈数据中台技术体系
    RCA:收单设备调用云端接口频繁超时排查总结
    技术上的“深淘滩,低作堰”
    企业私有源代码上传github致入侵之大疆案判决了
    那些年我们一起犯过的错
    异地双活的四个误区
    没有预见性你凭什么晋升
    中国IT史上两大严重事故对我们的警醒及预防措施
  • 原文地址:https://www.cnblogs.com/Jason504327775/p/8512953.html
Copyright © 2011-2022 走看看