添加用户:
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,这样就添加了一个新的用户,不会出以上的错误了。
(2)mysql> CREATE DATABASE library;
Query OK, 1 row affected (0.00 sec)
(3)检查是否创建成功:
(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;
drop 是直接删除表信息,速度最快,但是无法找回数据
例如删除 user 表:
drop table user;
truncate 是删除表数据,不删除表的结构,速度排第二,但不能与where一起使用
例如删除 user 表:
truncate table user;
delete 是删除表中的数据,不删除表结构,速度最慢,但可以与where连用,可以删除指定的行
例如删除user表的所有数据
delete from user;
删除user表的指定记录
delete from user where user_id = 1;
truncate和不带where子句的delete,drop都会删除表内的数据;
drop,truncate都是DDL语句(数据定义语言),执行后会自动提交;
语句类型: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);
delete 与 delete from 区别
如果只针对一张表进行删除,则效果一样;如果需要联合其他表,则需要使用from
delete tb1 from tb1 m where id in (select id from tb2);
希望删除表结构时,用 drop;
希望保留表结构,但要删除所有记录时, 用 truncate;
希望保留表结构,但要删除部分记录时, 用 delete。
下面这个语句会拷贝数据到新表中。
注意:这个语句其实只是把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;
注意:前一种方式是不会复制主键类型,索引的,而后一种方式是把旧表的所有字段类型都复制到新表。
如果两个表结构一样
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;
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()