mysql命令

数值类型:
tinyint 有符号范围(signed):-128~127 无符号范围(Unsigned):0~255
int -2147483648~2147483647 0~4294967295

字符串:
char 字节大小:0~255 #char(3),如果填充'ab'时会补一个空格为'ab '
varchar 字节大小:0~255 #varchar(3),填充'ab'时就会存储'ab'
text 字节大小:0~65535 #大文本

日期时间类型:
date 字节大小:4 示例:2020-01-01
time 字节大小:3 示例:12:29:59
datetime 字节大小:8 示例:2020-01-01 12:29:59
year 字节大小:1 示例:2017
timestamp 字节大小:4 示例:1970-01-01 00:00:10~2038-01-01 00:00:01

字段类型:
整型:int
小数:decimal #decimal(5,2)表示共存5位数,小数占2位
字符串:varchar,char,text #char(3),如果填充‘ab’会在后面补一个空格
日期:datetime,date,time
布尔:bit
枚举:enum

特别说明的类型如下:
decimal表示浮点数,如decimal(5,2)表示共存5位数,小数占2位
char表示固定长度的字符串,如char(3),如果填充'ab'时会补一个空格为'ab '
varchar表示可变长度的字符串,如varchar(3),填充'ab'时就会存储'ab'
字符串text表示存储大文本,当字符大于4000时推荐使用
对于图片、音频、视频等文件,不存储在数据库中,而是上传到某个服务器上,然后在表中存储这个文件的保存路径

有符号范围:signed 无符号范围:unsigned

约束:
主键:primary key
非空:not null
唯一:unique
默认:default
外键:foreign key

自动增加:auto_increment

===========================================

数据库相关操作:
显示数据库:show databases;
创建数据库:create database 数据库名 charset=utf8;
删除数据库:drop database 数据库名;
选择/切换数据库:use 数据库名;
查看当前数据库:select database();


表相关操作:
查看表里的数据:select * from 表名;
查看表结构:desc 表名
查看数据库所有表:show tables;
查看表的创建语句:show create table 表名 \G;
修改表名:rename table 原表名 to 新表名;
创建表:
create table 表名(列及类型);
如:
create table students(
id int auto_increment primary key not null,
name varchar(10) not null,
age tinyint unsigned default 0,
height decimal(5,2),
gender enum('男','女'),
cls_id int unsigned default 0,
isdelete bit default 0
);

修改表名:rename table 原表名 to 新表名;

添加字段:
在表的末尾添加字段:alter table 表名 add 新的字段名和类型;
在表的指定位置后增加字段:alter table 表名 add 新的字段名和类型 after 字段名;
一次性添加多个字段名:alter table 表名 add (x,x)
删除字段:alter table 表名 drop 字段;

修改字段的排列位置:
字段修改到第一位:alter table 表名 modify 字段名和类型 first;
字段修改到指定位置:alter table 表名 modify 字段名和类型 after 字段名

修改已存在字段的属性: change(翻译:改变)
alter table 表名 change 字段 新字段 属性;
例:alter table a1 change name name varchar(10);
=====================================================================
添加数据:
全列插入:insert into 表名 values(x,x,x);
缺省插入:insert into 表名(字段名) values (数据);
插入多条:insert into 表名 values(数据),(数据)...; #只有mysql有多条插入

修改数据:
单行修改:update 表名 set 字段=新数据 where 条件; #(条件例如:id=3,只修改id=3的数据)
单行多个修改:update 表名 set 字段=新数据,字段=新数据 whrer 条件; #(单行!没有括号)

删除数据:
物理删除所有数据:delete from 表名;
物理删除:delete from 表名 where 条件; #(条件例如:id=3,只删除id=3的数据)
物理删除多条:delete from 表名 where 字段 in(数据);
逻辑删除:is_delete bit数据类型 0(没有删除)和1(逻辑删除)
alter table classers add is_delete bit default 0;

查询数据:
基本语法:select * from 表名;
范围查找:select * from 表名 where 字段名 in(数据1,数据2);
连续范围查找:select * from 表名 where 字段名 between 范围1 and 范围2; #在between前加not,不查找范围数据
消除重复行:select distinct 字段名 from 表名;
条件查找:select * from 表名 where 条件;
模糊查询:select * from 表名 where 字段名 like 'x%'; #(%表示任意多个字符,_表示一个任意字符,后面必须加'')
查找空数据:select * from 表名 where 字段 is null; #(判断用is,不等用=,非空is not null)
查找独立字段:select 字段1,字段2 from 表名; #可以加条件

聚合函数:
计算总行数:select count(*) from 表名; #可以加where
显示字段所有数据:select group_concat(字段) from students;
列的最大值:select max(列) from 表名; #可以加where
列的最小值:select min(列) from 表名; #可以加where
列的和:select sum(列) from 表名; #可以加where
列的平均值:select avg(列) from 表名; #可以加where+
如果查看最小值的数据:
select * from 表名 where 列=(select min(列) from 表名);

分组:
select 列1,列2,聚合 from 表名 group by 列1,列2 having 条件
例:select gender as 性别,count(*) as 总数 from group by gender having is_Delete=1;
where与having:
where是对from后面指定的表进行数据筛选,属于对原始数据的筛选
having是对group by的结果进行筛选

排序:ase:从小到大,即升序 desc:从大到小排序,即降序
基本排序:select * from 表名 order by 列 asc|desc;
条件排序:select * from 表名 where 条件 order by 列 asc|desc; #不写asc|desc默认升序

分页:
select * from 表名 limit 2,3; #从2条开始,向下获取3条,不包含第2条

========================================================================
连接查询:
内连接查询:查询的结果为两个表匹配到的数据
左连接查询:查询的结果为两个表匹配到的数据,左表特有的数据,对于右表中不存在的数据使用null填充
右连接查询:查询的结果为两个表匹配到的数据,右表特有的数据,对于左表中不存在的数据使用null填充

内连接:inner join on #on后面是连接查询条件
左连接:left join on #on后面是连接查询条件
右连接:right join on #on后面是连接查询条件

表A inner join 表B:表A与表B匹配的行会出现在结果中
表A left join 表B:表A与表B匹配的行会出现在结果中,外加表A中独有的数据,未对应的数据使用null填充
表A right join 表B:表A与表B匹配的行会出现在结果中,外加表B中独有的数据,未对应的数据使用null填充

表1建立外键:
连接查询:select 表1.字段,表2.字段 from 表1 inner join 表2 on 表2.字段=表1.id

连接查询三张表:
select scores.score,students.name,subjects.stitle from scores inner join students on scores.stuid=students.id inner join subjects on scores.subid=subjects.id;

select * from scores inner join students on students.id=scores.stuid inner join subjects on scores.subid=subjects.id;

连接查询:
学生名字:students.name 班级名字:classes.name

例:select 学生名字,班级名字 from 学生表 inner join 班级表 on 学生表.cls_id=班级表.id

自关联:
create table areas(
id int primary key auto_increment not null,
title varchar(20),
pid int,
foreign key(pid) references areas(id)
);
自连接查询:
select sheng.id as sid,sheng.title as stitle,shi.id as shiid,shi.title as shititle from areas as sheng inner join areas as shi on sheng.id=shi.pid where sheng.title='河北省'

自连接查询必须给表起别名: as
自连接查询:
select p.name,s.name from 表名 as p inner join 表名 as s on s.pid = p.id where p.name='河北省'

=============================================================================
子查询:
标量子查询:返回的结果是一个数据
列级子查询:返回的结果是一列
行级子查询:返回的结果是一行
表级子查询:返回的多行多列

select * from students where height>(select avg(height) from students);

select classes.name from classes where id in (select cls_id from students);

select * from students where (age,height)=(select max(age),max(height) from students);

select t.sname,t.cname from(select students.name as sname,classes.name as cname from students inner join classes on students.cls_id=classes.id) as t;

===========================================================================

修改表关联id:
update goods as g inner join goods_cates as c on g.cate = c.cate_name set g.cate = c.cate_id

多表查询:
select * from goods as g inner join goods_cates as c on g.cate_id = c.cate_id inner join goods_brands as b on brand_id =b.id

select g.name,c.cate_name,b.brand_name from goods as g inner join goods_cates as c inner join goods_brands as b on g.cate_id=c.cate_id and g.brand_id = b.id

数据库备份与恢复:
备份一个数据库:mysqldump -h -uroot -p 数据库名 >路径\备份名.sql
备份多个数据库:mysqldump -h -uroot -p --datebases 数据库1 数据库2... >路径\备份名.sql
备份所有数据库:mysqldump -h -uroot -p --all-datebases >路径\备份名.sql
恢复数据:mysql -h -uroot -p 数据库名 < 路径\备份名.sql

=========================================================================

外键约束的创建和删除:
建(表1)时创建外键
foreign key(外键字段) references 表2(id)

增加外键,默认外键名字
alter table 表1 add foreign key (外键的字段) references 表2 (id);

增加外键,自定义外键名字
alter table 表1 add constraint 自定义外键名字 foreign key (外键的字段) references 表2 (id);

删除外键:
alter table 表1 drop foreign key 外键名字;
=========================================================================
事务:
begin 开启
commit 提交
roolback 回滚

在Python中用法:
try:
update a set yu_e +=200 where id
update b set yu_e -=200 where id
commit;
except Exception as e:
rollback;
print(e)

可以通过begin手动开启事务,一旦开始事务之后,对于数据的更新操作 不会立即影响到原数据库,等到所有的sql执行成功后 手动commit(提交)才会影响到原数据库,没有手动开启事务的时候 事务也是开启的 不多提交操作是自动执行。大批量更新数据的时候需要手动开启事务,提高更加安全

============================================================
索引
当数据库中数量很大时,查找数据会变得很慢。优化方案:索引

查看索引:show index from 表名; (id(主键)和外键,自动索引)
创建索引:create index 索引名 on 表名(字段(字段长度))
索引名(随便写,例如:nameindex)
==========================================================
查看语句的查询时间:(主要用于查看索引的执行时间)
set profiles=1;
show profiles;
==========================================================
导入数据表:source areas.sql
==========================================================

python操作mysql的包pymysql
python2 -m pip install mysqldb
python3 -m pip install pymysql

python2中调用==>mysqldb
python3中调用==>pymysql

对象方法:
close() 关闭连接
commit() 事务,提交才会生效
rollback() 回滚,放弃之前的操作
cursot () 用于执行sql语句并获得结果
execute() 执行语句,返回影响行数

注意:是双引号里面不能再有双引号,单引号里面也不能再有单引号。

python交互
安装:pip install pymysql

代码:
from pymysql import connect
conn = connect(host='localhost',port=3306,db='aa',user='root',passwd='root',charset='utf8')
cc = conn.cursor() #获取游标
a = cc.execute('select * from goods') #执行sql语句
print(a) #显示多少数据,影响行数

f = cc.fetchone() #读取一条数据
print(f)
fm = cc.fetchone(3) #元组形式读取3条数据,默认读1条
fa = cc.fetchall() #元组形式读取所有数据

查询所有id,名字

count = cc.execute('select id,name from goods')
for i in range(count):
result = cc.fetchone()
print(result)

增加数据

aa = input('增加:')
cc.execute('insert into 表名(字段) values ("%s")'%aa)

更改

aa = input('名字:')

bb = input('更改:')

cc.execute('update 表名 set 更改信息的字段="%s" where 条件="%s"'%(aa,bb))

删除

aa = input('删除:')

cc.execute('delete from 表名 where 条件="%s"'%aa)

rollback()事务的用法

cc.execute('insert into a2(name) values("aa")')

conn.rollback() #回滚,放弃之前的操作

cc.execute('insert into a2(name) values("bb")')

cc.close() #关闭游标
conn.commit() #提交数据

你可能感兴趣的:(mysql命令)