mysql基本操作命令+高级操作
(一)mysql基本操作命令
一、数据库操作
1.新增数据库
create database 数据库名字 [数据库选项];
数据库选项:规定数据库内部该用什么进行规范
字符集:charset 具体字符集(utf8)
校对集:collate 具体校对集(依赖字符集)
2.查看数据库
2.1查看所有的数据库
show databases;
匹配查询:
show databases like 'pattern'; #pattern可以使用通配符
_:下划线匹配,表示匹配单个任意字符,如:_s,表示任意字符开始,但是以s结尾的数据库
%:百分号匹配,表示匹配任意个数的任意字符,如:student%,表示以student开始的所有数据库
2.2查看数据库的创建语句
show create database 数据库名字;
3.修改数据库
数据库名字在mysql高版本中不允许修改,所以只能修改数据库的库选项(字符集和校对集)
alter database 数据库名字 [数据库选项];
eg:alter database stu charset utf8;
4.删除数据库
对于数据库的删除要谨慎考虑,是不可逆的。
drop database 数据库名字;
4.选择数据库
use 数据库名字;
二、数据表操作(字段)
1.新增数据表
create table 表名(
字段名1 数据类型 comment '备注...',
字段名2 数据类型 comment '备注...',
.... #最后一行不需要逗号
)[表选项];
表选项:
1)字符集:charset/character set(可以不写,默认采用数据库的)
2)校对集:collate
3)存储引擎:engine = innodb(默认的):存储文件的格式(数据如何存储)
注意:创建数据表的时候,需要指定要在哪个数据库下创建。创建方式有隐式创建和显式创建
1)显式创建:create table 数据库名字.数据表名字
2)隐式创建:use 数据库名字;
2.查看数据表
2.1查看所有的数据表
show tables;
2.2查看表使用匹配查询
Show tables like ‘pattern’; #与数据库的pattern一样:_和%两个通配符
2.3查看数据表的创建语句
show create table 数据表名字;
2.4查看数据表的结构
desc 数据表名字;
3.修改数据表
3.1修改表名字
rename table 旧表名 to 新表名;
3.2修改表选项(存储引擎,字符集和校对集)
alter table 表名 [表选项];
3.3修改字段(新增字段,修改字段名字,修改西段类型,删除字段)
新增字段:alter table 表名 add [column] 字段名字 数据库类型 [位置first/after];
位置选项:first 在第一个字段
after 在某个字段之后,默认就是在最后一个字段后面
修改字段名称:alter table 表名 change 旧字段名字 新字段名字 字段数据类型 [位置];
eg:alter table student name fullname varchar(30) after id;
修改字段的数据类型:alter table 表名 modify 字段名字 数据类型 [位置];
删除字段:alter table 表名 drop 字段名字;
4.删除数据表
drop table 表名;
三、数据操作
1. 新增数据
inser into table 表名 [(字段列表)] values (值列表);
2.查看数据
select */字段列表 from 表名 [where条件];
3.修改数据
update 表名 set 字段名 = 值 where 条件;
注意:使用update操作最好配合limit 1使用,避免操作大批量数据更新错误.
4.删除数据
delete from 表名 where 条件;
注意:没有where 条件 就是默认删除全部数据.
四、列属性(字段)
1.删除主键:alter table 表名 drop primary key;
2.增加主键:alter table 表名 add primary key(字段列表); #可以是复合主键
3.删除自增长:只能通过修改字段属性的方法操作.
4.删除唯一键:alter table 表名 drop index 索引名字; #默认的唯一键名字就是字段的本身
5.增加唯一键:alter table 表名 add unique key (字段列表); #可以是复合唯一索引
五、外键约束
1.创建表的时候增加外键
constraint 外键名字 foreign key(外键字段) references 父表(主键字段);
eg:
-- 创建父表(班级表)
create table class(
id int primary key auto_increment,
name varchar(10) not null comment '班级名字',
room varchar(10) not null comment '教室号'
)charset utf8;
-- 创建子表(外键表)
create table student(
id int primary key auto_increment,
number char(10) not null unique comment '学号:itcast + 四位数',
name varchar(10) not null comment '姓名',
c_id int comment '班级ID',
-- 增加外键
foreign key(c_id) references class(id)
)charset utf8;
2.创建表之后增加外键
alter table 表名 add constraint 外键名字 foreign key(外键字段) references 父表(主键字段);
eg:
-- 增加外键
alter table student add constraint student_class_fk foreign key(c_id) references class(id);
3.删除外键
alter table 表名 drop foreign key 外键名字; #查看外键名字需要通过表创建语句来查询.
eg:
-- 删除外键
alter table student drop foreign key student_ibfk_1;
(二)mysql高级操作
一、新增数据
1.蠕虫复制:从已经存在的数据表中复制一份,重新插入到数据表中
insert into 表名[(字段列表)] select 字段列表 from 表名;
2.主键重复:
2.1方法一:向一张表中插入数据,但又不确定对应的主键是否存在。如果没有冲突执行插入操作,发生冲突执行更新操作。
insert into 表名[(字段列表)] values(值列表) on duplicate key update 字段 = 值;
2.2方法二:直接使用replace替换(先删除数据,然后执行插入数据)
replace into 表名[(字段列表)] values(值列表);
3.从已经存在的表创建表:复制原来的表结构
create table 表名 like 表名; #可以复制在不同数据库下的数据表
二、更新数据
1.标准语法:
update 表名 set 字段 = 值 where 条件;
2.高级语法:
update 表名 set 字段 = 值 where 条件 [limit 数量];
三、删除数据
1.标准语法:
delete from 表名 where 条件;
2.高级语法:
delete from 表名 where 条件 limit 长度;
注意:delete 删除数据 不会充值自增长
3.清空表数据,表结构依然存在
truncate 表名;
四、查询数据
1.标准语法:
select */字段列表 from 表名 where 条件;
2.完整语法:
select [select选项] */字段列表[字段别名] from 表名 [where子句] [group by子句] [having子句] [order by 子句] [limit 子句];
select选项:
all:保留所有的记录(默认)
distinct:去掉重复的记录
字段别名:字段名字 as 别名
eg:name as 姓名
where子句:用来在数据进入内存之前筛选数据
1)比较表达式:=,>,>=,<,<=,!=,<>
2)判断字段是否为空:is null/is not null
3)区间范围:between A and B
4)逻辑表达式:&& (与) ||(或) !(非、取反)
where子句的筛选原理:从磁盘上读取一条记录,马上进行where条件判断,判断结果成立,存放在内存中,反之,不存放在内存中。等所有记录都读取结束之后,返回内存中的数据.
where子句之后的所有操作都是基于内存中的数据操作。
group by 子句:分组子句,按照某个字段,讲所有的结果进行分组存放,最终显示数据的时候,按组进行合并。
group by 分组原理:先根据某个字段进行分组,但是在分组之后合并数据返回时,系统自动选取每组中的第一条记录。
group by 常用的统计函数:
count():统计记录数,参数可以是*或者某个字段名,不统计未null字段
sum():求某个字段的和
max():求某个字段的最大值
min():求某个字段的最小值
avg():求某个字段的平均值
group by默认是升序:group by 字段名 [asc/desc];
having 子句:用来筛选数据。
注意:1)having 子句是对内存中的数据进行筛选,where子句是对磁盘的数据进行筛选。
2)having 能够使用group by的统计结果,而where不能使用。
order by 子句:order by 字段[asc/desc];默认asc升序
limit 子句:
1)单纯的限制数据:limit length;
2) 可以限定获取数据的起始位置以及长度:limit offect length;默认的offect是0开始。
3.联合查询:将多个的查询结果,联合起来横向的相加。
select 语句1 union [联合查询选项] select 语句2;
联合查询选项:1)all:保留所有的结果
2)distinct:去重(默认)
注意:1)联合查询只要求查询语句的字段数一样,并不要求任何数据类型。
2)如果要在union联合查询中使用order by,那么必须给select语句使用()包裹,Order by不能生效:order by在union中使用必须搭配limit。
eg:
(select * from stu_student where c_id = 1 order by height asc limit 999999)
union
(select * from stu_student where c_id = 2 order by height desc limit 999999);