mysql的用户创建,数据库创建和使用,和python的交互--(2)

3.创建用户

添加用户:
mysql> INSERT INTO user (host, user, authentication_string, select_priv, insert_priv, update_priv) VALUES (‘localhost’, ‘guest’, password(‘guest123’),‘Y’,‘Y’,‘Y’);

报以下的错误 ERROR 1364 (HY000): Field ‘ssl_cipher’ doesn’t have a default value错误
mysql5.1以上版本,我是在5.6版本上操作的

错语原因:

mysql用户表的中某些字段不能为空,没有默认值,其实是操作错误,mysql添加用户是不能这样直接insert user表的。

解决方法:
正确的添加用户方法:
mysql> GRANT USAGE ON . TO ‘user01’@‘localhost’ IDENTIFIED BY ‘123456’ WITH GRANT OPTION;

用户:user01,密码:123456,这样就添加了一个新的用户,不会出以上的错误了。

在这里插入图片描述
在这里插入图片描述

4.创建数据库

(1)mysql> show databases;
在这里插入图片描述

(2)mysql> CREATE DATABASE library;
Query OK, 1 row affected (0.00 sec)
在这里插入图片描述

(3)检查是否创建成功:

在这里插入图片描述
(4)mysql> use library;

在这里插入图片描述

(5)检查数据库里的表

在这里插入图片描述
(6)创建表
mysql> CREATE TABLE book(name char(20),author char(20));

在这里插入图片描述
在这里插入图片描述

(7)向表中插入数据
mysql> INSERT INTO book VALUES(‘c language’, ‘skama’);

mysql> INSERT INTO book VALUES(‘java’, ‘harry’);

mysql> INSERT INTO book VALUES(‘python’, ‘houder’);

mysql> INSERT INTO reader VALUES(‘KUMATA’, 20180530,‘man’);

mysql> INSERT INTO reader(name, sex) VALUES(‘kusada’,‘man’);

mysql> INSERT INTO reader(name, date) VALUES(‘looper’,20180430);
在这里插入图片描述

(8)查看表中的数据
mysql> select * from book;

mysql> select * from reader;

在这里插入图片描述

5.删除表的三种方式

5.1.drop table

drop 是直接删除表信息,速度最快,但是无法找回数据
例如删除 user 表:
drop table user;

5.2.truncate (table)

truncate 是删除表数据,不删除表的结构,速度排第二,但不能与where一起使用
例如删除 user 表:
truncate table user;

5.3.delete from

delete 是删除表中的数据,不删除表结构,速度最慢,但可以与where连用,可以删除指定的行

例如删除user表的所有数据
delete from user;
删除user表的指定记录

delete from user where user_id = 1;

5.4.三种方式的区别

5.4.1.相同点

truncate和不带where子句的delete,drop都会删除表内的数据;
drop,truncate都是DDL语句(数据定义语言),执行后会自动提交;

5.4.2.不同点

语句类型:delete语句是数据库操作语言(DML),truncate,drop是数据库定义语言(DDL);
效率:一般来说 drop > truncate> delete;

是否删除表结构:truncate和delete 只删除数据不删除表结构,truncate 删除后将重建索引(新插入数据后id从0开始记起),而 delete不会删除索引 (新插入的数据将在删除数据的索引后继续增加),drop语句将删除表的结构包括依赖的约束,触发器,索引等;

安全性:drop和truncate删除时不记录MySQL日志,不能回滚,delete删除会记录MySQL日志,可以回滚;

返回值:delete 操作后返回删除的记录数,而 truncate 返回的是0或者-1(成功则返回0,失败返回-1);

5.5.小知识

delete 与 delete from 区别

如果只针对一张表进行删除,则效果一样;如果需要联合其他表,则需要使用from

delete tb1 from tb1 m where id in (select id from tb2);

5.6.用法总结

希望删除表结构时,用 drop;

希望保留表结构,但要删除所有记录时, 用 truncate;

希望保留表结构,但要删除部分记录时, 用 delete。

6.MySQL复制表的三种方式

6.1.复制表结构及其数据

下面这个语句会拷贝数据到新表中。

注意:这个语句其实只是把select语句的结果建一个表,所以新表不会有主键,索引。

create table table_name_new as (select * from table_name_old);

只复制表结构

create table table_name_new as select * from table_name_old where 1=2;
或者

create table table_name_new like table_name_old;
注意:前一种方式是不会复制主键类型,索引的,而后一种方式是把旧表的所有字段类型都复制到新表。

6.2.只复制表数据

如果两个表结构一样

insert into table_name_new select * from table_name_old;
如果两个表结构不一样

insert into table_name_new(column1,column2…) select column1,column2… from table_name_old;
注意:很多文章说可以通过如下语句进行数据复制,table_name_new表可以不存在,会在执行的过程中自动创建。其实该SELECT … INTO形式是使查询结果存储在变量或将其写入文件,即table_name_new是一个变量或者文件。

select column1,column2,… into table_name_new from table_name_old;

7.python和mysql的交互

在这里插入图片描述

import pymysql

from pymysql import *

def select_fun():
    # 创建Connection连接
    conn = connect(host='localhost',port=3306,database='library',user='test01',password='123456',charset='utf8')
    # 获得Cursor对象
    cs1 = conn.cursor()
    # 执行insert语句,并返回受影响的行数:添加一条数据
    # 增加
    count = cs1.execute('select * from reader;')
    # 打印受影响的行数
    print(count)
    for i in range(count):
        # 获取查询的结果
        result = cs1.fetchone()
        # 打印查询的结果
        print(result)
        # 获取查询的结果

    # 关闭Cursor对象
    cs1.close()
    # 关闭Connection对象
    conn.close()


def insert_fun():
    # 创建Connection连接
    conn = connect(host='localhost',port=3306,database='library',user='test01',password='123456',charset='utf8')
    # 获得Cursor对象
    cs1 = conn.cursor()
    # 执行insert语句,并返回受影响的行数:添加一条数据
    # 增加
    count = cs1.execute('insert into reader values("shelley", 20130305, "women")')
    #打印受影响的行数
    print(count)

    count = cs1.execute('insert into reader values("obama", 20160230, "man")')
    print(count)

    # # 更新
    # count = cs1.execute('update goods_cates set name="机械硬盘" where name="硬盘"')
    # # 删除
    # count = cs1.execute('delete from goods_cates where id=6')

    # 提交之前的操作,如果之前已经之执行过多次的execute,那么就都进行提交
    conn.commit()

    # 关闭Cursor对象
    cs1.close()
    # 关闭Connection对象
    conn.close()

def sql_param():
    find_name = input("请输入读者名称:")

    # 创建Connection连接
    conn = connect(host='localhost', port=3306, user='test01', password='123456', database='library', charset='utf8')
    # 获得Cursor对象
    cs1 = conn.cursor()

    # # 非安全的方式
    # # 输入 " or 1=1 or "   (双引号也要输入)
    # sql = 'select * from goods where name="%s"' % find_name
    # print("""sql===>%s<====""" % sql)
    # # 执行select语句,并返回受影响的行数:查询所有数据
    # count = cs1.execute(sql)

    # 安全的方式
    # 构造参数列表
    params = [find_name]
    # 执行select语句,并返回受影响的行数:查询所有数据
    count = cs1.execute('select * from reader where name=%s', params)
    # 注意:
    # 如果要是有多个参数,需要进行参数化
    # 那么params = [数值1, 数值2....],此时sql语句中有多个%s即可

    # 打印受影响的行数
    print(count)
    # 获取查询的结果
    # result = cs1.fetchone()
    result = cs1.fetchall()
    # 打印查询的结果
    print(result)
    # 关闭Cursor对象
    cs1.close()
    # 关闭Connection对象
    conn.close()

if __name__ == '__main__':
    sql_param()

猜你喜欢

转载自blog.csdn.net/qq_27009517/article/details/107162930
今日推荐