相关信息在/etc/my.cnf中
# 进入本机mysql
mysql -u 用户名 -p密码 # mysql -u root -proot p后直接跟密码
mysql -h localhost -u root -proot
mysql -h 127.0.0.1 -u root -proot
#连接到远程主机上的mysql
mysql -h 远程主机地址 -u test -p123
'''
-h 有三种参数
%:任意主机
localhost:仅本地可以登录(比127.0.0.0更优)
localhost和127.0.0.1大致下一样,区别:
localhost:
无需联网
不适用网卡,不受网络防火墙和网卡的限制,不会解析成ip,不占网卡、网络资源。
本机访问
127.0.0.1:
无需联网
网卡传输,受网络防火墙和网卡限制
本机访问
本机ip
联网
网卡传输,受防火墙和网卡限制
本机或外部访问
Ip地址:指定的ip可登录
'''
# 退出mysql
mysql> quit;
# 查看数据文件存放路径
mysql> show variables like '%datadir%';
# 查看用户使用端口
mysql> show variables like 'port';
#查看每个库所使用的编码
mysql> show variables like 'character%';
# 查看表中的索引,两种方式:
mysql> show index from 表名;
mysql> desc 表名;(看哪个是主键 PRI)
# 查看现在所使用的用户名
mysql> select user();
# 查看所有的用户的信息,(有个库加mysql,里有个表叫user,里有用户的信息)
mysql> select User,Host,Password from mysql.user;
# 创建用户
mysql> create user '用户名'@'ip地址' identified by '密码';
# ip地址:
# %:任意主机;localhost:仅本地可以登录;Ip地址:指定的ip可登录
# 若无需密码
# identified 及其后面可以不用写
# 一般形式
mysql> create user 'test'@'%' identified by '123'
# 查看某个用户的权限
mysql> show grants for '用户'@'ip';
eg: show grants for 'test'@'%';
# 给某个用户的授权
mysql> grant 权限 on 数据库.表 to '用户'@'ip';
eg: grant all privileges on 库名.表名 to 'test'@'%';
grant select,insert,update,delete on
'''
数据库名.* 数据库中的所有表
数据库名.表 指定数据库中的某张表
数据库名.存储过程 指定数据库中的存储过程
*.* 所有数据库中的所有表
usage 无访问权限
select 查看权限
insert 插入权限
alter 更改表权限
create 创建表权限
create user 创建用户权限
drop 删除表权限
update
delect
'''
# 给某个用户取消某个权限
mysql> revoke 权限 on 数据库.表 from '用户'@'ip'
# 修改用户密码
mysql> set password for '用户名'@'ip地址' = password('新密码')
# 删除用户
mysql> drop user '用户名'@'ip地址'
# mysql> drop user 'test'@'%';
# 显示有几个库
mysql> show databases;
# 进入gao库
mysql> use gao;
# 查看当前使用的是哪个数据库
mysql> select database();
# 查看gao库中有几个表
mysql> show tables;
# 查看表的某个表的结构
mysql> desc one_table;
# 查看表中的所有数据
mysql> select * from biao1;
# 查看表中的某些列的数据
mysql> select name,age from ku1.biao1;
eg: select User,Host from mysql.user;#数据库中mysql库下的user表
# 查看表中sex=0的所有的数据
mysql> select * from biao1 where sex=0;
# 查看表中sex=0的所有的数据的某些列
mysql> select name,age from biao1 where sex=0;
# explain:可看是否通过主键索引进行查询,显示了 mysql 如何使用索引来处理 select 语句以及连接表
mysql> explain select name,age from biao1 where sex=0;
mysql> select * from biao1 where id>1 and name != 'mign' and sex=0 and age between 5 and 14 and num in (3,6,8) and count not in (3,12);
# 限制查看
mysql> select * from biao1 limit 5; #前5行
mysql> select * from biao1 limit 4,5;#从第4行开始的前5行
# 规则查看
# 查看biao1中所有name='li'+字符串的数据 eg: lie,liaing
mysql> select * from biao1 where name like 'li%';
#查看biao1中所有name='li'+一个字符 的数据 eg: lie,lia
mysql> select * from biao1 where name like 'li_';
# 排序查看
mysql> select * from biao1 order by name asc; #根据name列,从小到大排列
mysql> select * from biao1 order by name desc; #根据name列,从大到小排列
mysql> select * from biao1 order by name asc,age desc; #根据name从小到大排,若相同,按age从大到下排
# 显示河南省有多少个市,此时列名是count(city_name)
mysql> select count(city_name) from city where city_province='河南省';
# 显示河南省有多少个市,使得列名为num
mysql> select count(city_name) as num from city where city_province='河南省';
# 显示各省份分别有多少个市
mysql> select city_province,count(city_name) as num from city group by city_province;
# 显示超过10个市的省份都有多少的市
mysql> select city_province,count(city_name) from city group by city_province having count(city_name)>10;
# 创建表 一定要设置主键(是索引,当数据库中量大时,可加快查找速度)。null:可为空,not null:不可为空
# 数据类型
# 数字 int(n) 存储时占4个字节 ,n表明了默认存的数的长度下限为n,不够n的会在前面补0,-2 147 483 648~2 147 483 647,或者 0~4 294 967 295(无符号,2^32-1)
# 字符串 使用varchar(n)存储时占空间更小
# char(n) 存储时占n个字节,输入最大为n个字符,长度为 0~255 个字符 2^8-1
#varchar(n) 存储时占String长度+1个字节,最大为n个字符,长度为 0~65 535 个字符 2^16-1
mysql> create table biaoming(
#默认自增(一表最多一个,做主键),插入数据时,可不用管它,primary key主键,一列的唯一索引,可有多列组合而成复合主键,此时每个字段都是索引
id int not null auto_increment primary key,
name varchar(3) not null default 'hua',
age int(3) null default 18,
sex int(1) null,
primary key(name,sex) #复合主键,每个字段都是索引,为之后加快查找
)default charset=utf8;
# 在初始未设置主键,表中有数据情况下,如果此时再设置主键(复合主键),两种情况:
1. 把表中的主键部分重复的删掉,再设置主键(但一般不现实)
2. 新建一张表,设置主键,把原来表中的数据插进来。
# 删除表
mysql> drop table biao1;
#修改列名
mysql> alter table biao1 modify column 列名 修改后的类型;
mysql> alter table biao1 change 原列名 新列名 修改后的类型;
#添加一列
mysql> alter table biao1 add 列名 类型;
#删除一列
mysql> alter table biao1 drop column 列名;
# 添加主键
alter table biao1 add primary key(列名);
# 删除主键
alter table biao1 drop primary key;#为主键的该列并不会消失,只是不再作为主键了,但当自增的id作为主键时,该命令无法执行,因为自增就意味着是主键
# 向表中插入一条数据
mysql> insert into biao1 values('li',32,0);#每个字段都插入
mysql> insert into biao1(name,age) values('li',22); #个别字段插入
# 向表中插入几条数据
mysql> insert into biao1 values
('ling',2,0),
('dsf',321,0),
('lsa',323,0);
# 删除一行
mysql> delete from biao1 where name='dalian';
# 删除所有行,将biao1清空,列名还在
mysql> delete from biao1;
# 更新数据,将biao中所有sex=0的行中的name改为'hua',age改为18
mysql> update biao1 set name='hua',age=18 where sex=0;
# 事务操作(批处理:不用插入一次就提交一次浪费时间;也不是所有的插入后再提交,以免中间出错,前面的都操作失败,即便该次未提交成功,也只是该批次失败,未殃及全部):ACID 原子性(Atomicity),一致性(Consistency),隔离性(Isolation),持久性(Durability)
mysql> begin;#开启事务
mysql> insert into biao1 values('li',32,0);
mysql> mysql> insert into biao1 values
('ling',2,0),
('dsf',321,0),
('lsa',323,0);
mysql> rollback;#此时上面的操作不算数。若是commit;事务确认
import pymysql
# 连接数据库-执行命令(事务提交)-》关闭游标-》关闭连接
#执行一个任务,返回的是影响的行数row_count
affect_rows = cur.execute('sql语句',缺省args)
# 占位符都用 %s
mysql> ret = cur.execute('insert into biao1(name,age) value(%s,%s)',('hua',12))
或 ret=cur.execute('insert into biao1(name,age) values('li',12)');
或 cur.execute('insert into biao1(name,age) values("%s",%d)'%('xiaoming',18))
# 一下执行多条同样任务
cur.executemany('sql语句',缺省args)
# 占位符都用 %s ,第二个参数用[[],[]]或[(),()]
mysql> sql_insert = 'insert into biao1(name,age) values(%s,%s)'
mysql> param = [('hua',12),('peng',13),('ji',19)]
mysql> cur.execute(sql_insert,param)
cur.execute('select name,age from person')
#从当前光标把之下的全取了,最开始光标不在数据库里,故可以取出所有
res = cur.fetchall()# 根据cur的设置返回字典或元组,此时返回的是字典,所有的字典组成列表
# 从当前光标下取3条
res = cur.fetchmany(3)
# 从当前光标下取一条
res = cur.fetchone()
#在 fetch 数据时按照顺序进行,可以使用 cursor.scroll (num,mode) 来移动游标位置
# 主
cur.scroll (1,mode='relative') # 相对当前位置移动【1:表示向下移动一行,-1:表示向上移动一行】
cur.scroll (2,mode='absolute') # 相对绝对位置移动 【2:表示向上移动两行,-1:表示向下移动一行】
# 对批次插入,更新,删除等改变数据库的任务,进行提交,是事务操作
conn.commit()
# 最后
# 关闭指针对象
cur.close()
# 关闭连接对象
conn.close()
import pymysql
def connect_db(host,db,user,passwd,port=3306):
# 建立数据库的连接
conn = pymysql.connect(
host=host,#要连接的主机地址。在本地时,host='localhost'或'127.0.0.1'。
port=port,
user=user,#用户名
passwd=passwd, #密码
db=db, #mysql中的哪个数据库
charset='utf8'
)
# 获取游标(类型设置为字典形式)
cur = conn.cursor(cursor=pymysql.cursors.DictCursor)
return cur,conn
cur,conn=connect_db('114.115.121.345','Movie','Movie','HLSiC',3306)
def creat_table(cur,conn):
'''
建新表 keyword_syn
:param cur:
:param conn:
:return:
'''
sql_create = 'create table keyword_syn(
keyword varchar(100) not null,
syn varchar(100) not null,
primary key(keyword,syn)# 复合主键
)default charset=utf8'
cur.execute(sql_create)
conn.commit()
# 返回新建表的情况
cur.execute('desc keyword_syn')
res = cur.fetchall()
for i in range(len(res)):
a = res[i]
print('字段:%s 类型 %s'%(a['Field'],a['Type']))
def insert_to_keyword_syn(cur,conn,sql,data,one_commit_num):
'''
:param cur:
:param conn:
:param data: 列表,cur.executemany(sql,data)的data的形式
:param one_commit_num: 一次事务提交的条目数
:return:
'''
a = len(data)
b = a/one_commit_num
c = a/one_commit_num
# 批次提交,一次是one_commit_num个,其中最后一次提交的数据的开始下标为begin_index_num
begin_index_num = b if a>b else b-1
i = 0
while(i <= begin_index_num):
if i == begin_index_num:
args = data[one_commit_num*i:]
try:
cur.execute(sql,args)
conn.commit() #事务提交
except Exception as e:
conn.rollback() #事务回滚
print('下标%d处上传失败'%(i*one_commit_num),e)
else:
print('全部提交成功')
i += 1 # 进行下一个批处理
else:
scale_begin = one_commit_num*i
scale_end = one_commit_num*(i+1)
args = data[scale_begin:scale_end] # eg: 1000*i~1000*i+999
try:
cur.executemany(sql,args)
conn.commit() #事务提交
except Exception as e:
conn.rollback() #事务回滚
print('下标%d处上传失败'%(i*one_commit_num),e)
else:
print('下标%d~%d提交成功'%(scale_begin,scale_end))
i += 1 # 进行下一个批处理
登录服务器后,登录创建的mysql账户时:ERROR 1045 (28000): Access denied for user ‘test’@‘localhost’ (using password: YES)
#第一种原因,密码错了 #第二种原因,数据库有一个匿名用户(''@'localhost'或''@'127.0.0.1'),mysql会先匹配它,这样你的密码就一直是错的 # 删掉该匿名账户 drop user ''@'localhost'; # 刷新 flush privileges;
远程登录服务器的mysql服务器时:OperationalError: (2003, “Can’t connect to MySQL server on ‘62.234.53.229’ (timed out)”)
# 原因 宝塔防火墙的3306端口没有看开放
插入时遇到:1062, "Duplicate entry ‘茶馆-茶馆’ for key ‘PRIMARY’
在该表有两个字段 key_word, movie_name都是主键
问题是说:表中已经存在茶馆-茶馆了
解决方法:
- insert ignore into biao1 xx # ignore 保留表中的数据
- insert replace into biao1 xx # replace 替换掉表中的相同数据