黑窗口输入 mysql -u root -p
输入密码进入
#展示数据库:
show databases;
#注意:
#数据库名不能是中文
#数据库名不能重复
#新建数据库:
语法: create database 数据库名 charset utf8;
案例:create database data1 charset utf8;
#删除数据库:
语法:drop database 数据库名;
案例:drop database data1;
选择某一个库(进入某一个库):
语法:use 数据库名
案例:use H211a
注意:
出现 Database changed,就说明数据库已经被选择;
展示所有的表:
show tables;
注意:
Empty 空的
#创建表:
#语法:create table 表名(字段名1 类型 [约束],
字段名2 类型 [约束],字段名3 类型 [约束])
#表中数据类型:
#数值型:
整数:tinyint int int(11) 指定几位
小数:decimal float decimal(5,2) 五位数中有两位是小数
#字符串:
char:固定长度 char(11) 存放两个字符,多余的位置由空格占位
varchar: 可变长度 varchar(20) 剩下多余的位置释放掉
#时间
date:年月日 2020-01-01
time:时分秒 12:29:59
datetime :年月日时分秒 2021-01-01 12:29:59
year:年 2022
#枚举
enum:单选 enum("男","女","中性")
#集合
set:多选 set("游泳","下棋","唱歌")
# 案例:
create table t1(
name varchar(10),
gender enum("男","中性","女"),
age tinyint,
address varchar(20)
);
#注意:
对表进行操作之前需要先选择库,进入库 use 库名
尽量将一个字段放在一行
字段与字段之间需要用逗号隔开,
最后一个字段后面不能跟逗号
sql语句写完以后需要写分号;
#查看表结构
语法:desc 表名;
案例:desc t1;
#删除表
语法:drop table 表名;
案例:drop table t1;
select * from 表名;
完整写法————一次添加一条数据
语法:
insert into 表名(name,gender,age,address) values(数据1,数据2,数据3,数据4);
案例:
insert into t1(name,gender,age,address) values("玛卡巴卡","男",8,"花园");
简单写法————一次添加一条数据
语法:
insert into 表名 values(数据1、数据2、数据3、数据4);
案例:
insert into t1 values("无锡底细","男",9,"花园");
完整写发————一次性添加多条数据
语法:
insert into 表名(字段1,字段2,字段3)values(值1,值2,值3),(值1,值2,值3),(值1,值2,值3);
案例:
insert into t1(name,gender,age,address)values("喜羊羊","男",6,"青青草原"),("灰太狼","男",6,"狼堡");
简单写法————一次添加多条数据
语法:
insert into 表名 values(值1,值2,值3),(值1,值2,值3),(值1,值2,值3);
案例:
insert into t1 values("喜羊羊","男",6,"青青草原"),("灰太狼","男",6,"狼堡");
一次增加一条数据
语法:
insert into 表名(字段1,字段2)values(值1,值2);
案例:
insert into t1(name,gender)values("王洋","女");
#不填加数据的字段用null填充
一次添加多条数据
语法:
insert into 表名(字段1,字段2)values(值1,值2),(值1,值2);
案例:
insert into t1(name,age)values("沸羊羊",9),("慢羊羊",10);
非空约束
指定某一个字段中数据不能为空(不添加或者添加null都是不可以的)
not null 非空 null 空的
create table t2(
id int not null,
name varchar(10)
);
default()
默认约束
如果给字段设置默认值,如果传值的时候直接使用default就会自动使用默认值
如果没有给字段设置默认值,如果传值的时候直接使用default就会用null填充
create table t2(
name varchar(20),
gender enum("男","女","中性") default "男"
);
unique
唯一约束
给某个字段增加唯一约束 在这张表中这个字段不能有重复的值
create table t2(
id tinyint unique,
name varchar(20)
);
primary key
主键约束
主键必须非空 主键值必须唯一
一张表只能有一个主键
保证表中的每一条数据的该字段都是表格中的唯一值,用这个值来标识表中的每一行数据
primary == not null + unique
auto_increment
自增约束
自动增长,每次加一
跟主键或者唯一约束 一起被设置
注意:
如果字段设置了自增,占位时通常用空值(0或null或default) 这是的字符段自动加1
案例:create table stu3(
id int primary key auto_increment
);
注意:
对所有表中字段的操作(修改表结构)都需要用到alter
对表结构进行修改
语法:
alter table 表名 add/drop/modify/change 字段名 类型[约束];
修改表名
语法:alter table 原表名 rename 新表名;
案例:alter table embloy rename employ;
给表中增加字段
语法:alter table 表名 add 字段名 类型 [约束];
案例:alter table employ add isdelete int;
删除表中字段
语法:alter table 表名 drop 字段名;
案例:alter table employ drop hobby;
修改字段类型 and 约束
语法:alter table 表名 modify 字段名 类型[约束];
案例:alter table employ modify name varchar(32);
案例:alter table employ modify id int primary kay;
案例:alter table employ modify enumb int unique;
修改字段名
语法:alter table 表名 change 原字段名 新字段名 类型[约束];
案例:alter table employ change gender sex varchar(3);
insert into 表名 values(数据),(数据2);
修改表中所有数据
想要将光头强的性别修改成男
语法:updata 表名 set 字段名=新值;
案例:updata people set ssex=“女";
修改表中某一条数据
语法:update 表名 set 字段名=新值 where 条件;
案例:update people set ssex="男" where sname ="光头强";
案例:update people set ssex="男" where sid=1;
物理删除
删除表中某一条数据
语法:delete from 表名 where 条件;
案例:delete from people where sname="玛卡巴卡";
删除表中所有数据
语法:delete from 表名;
案例:delete from people;
逻辑删除
本质是修改数据 相当于给表增加了一个判断是否删除的字段
需要先在表中添加一个字段
语法:alter table 表名 add 字段名 类型[约束];
案例:alter table people add isdelete int default 0;
将某一条数据设置为已删除
字段值为0说明 未删除 值为1说明删除
语法:update 表名 set isdelete=1 where 条件;
案例:update people set isdelete=1 where name="王洋";
要么全部成功要么全部失败
mysql8.0自带事务
只要引擎为innodb的数据库才能使用事务
查看数据引擎
show create table 表名;
案例:show create table person;
会出现一个engine = innodb,这说明引擎为innidb
创建一张表
create table num1(
id int,
num int
);
给表里添加数据
insert into num1 values(1,100),(2,150)
start transaction;
begin;
案例:
在终端1里面开启事务 begin;
第二步:在终端1里面对id为1的数据进行-50
第三步:在终端1里查看数据 id1=50 id2=200 #终端一发生改变
第四步:终端2里查看数据 id1=100 id2=200 #没有改变
原因:在终端1中开启的事务没有被提交
第五步:在终端1提交事务 commit;
第6步:同步数据,终端2里的数据也改变了
原因:终端1里开启的事务已经被提交
commit;
放弃缓存中变更的数据
rollback;
案例步骤
终端1开启事务 begin;
终端1进行数据修改
查看终端1数据修改
终端2里的数据没有修改
原因终端1里没有提交事务
回滚 再提交前回滚 让数据恢复原来的样子 rollback;
在终端1里查看数据 发现数据改回来了
在终端1提交事务commit;
查看终端2所有数据 没有变化
原因:在终端一中进行回滚而放弃更改,相当于没有做任何改变
查询所有的数据
语法:select * from 表名;
查询指定字段
语法:select 字段名1,字段名2 from 表名;
案例:select age,name from stu;
案例:select stu.age,stu.name from stu;
给字段起别名
注意:将字段名起中文,仅在当前这条语句中起作用不会改别原数据
语法:select 字段名 as 别名,字段名 as 别名 from 表名;
案例:select name as 姓名,gender as 性别 from stu;
给表起别名
语法select 别名.字段名1,别名.字段名2 from 表名 as 别名;
查看所有性别的(实现去重) distinct
语法:select distinct 字段1 from 表名
案例:select distinct gender from stu;
查询年龄大于18的信息
select * from stu where age>18
查询年龄小于18的信息
select * from stu where age<18
查询年龄大于等于18的信息
select * from stu where age>=18
查询年龄小于等于18的信息
select * from stu where age<=18
查询年龄不等于18
select * from stu where age!=18;
select * from stu where age <> 18;
and 查询18-28之间的信息
select * from stu where age>18 and age<28;
查询18岁以上的女性
select * from stu where age>18 and gender="女";
select * from stu where age>18 and gender=2; enum第二个是女的
or 18岁以上或者身高超过180的
select * from stu where age>18 or height>180;
not 不是女生的所有信息
select * from stu where not gender="女";
不是18岁以内的女性
select * from stu where not (gender=2 and age<18);
年龄不是小于等于18的 并且是女性
select * from stu where not age<=18 and gender=2;
like
% 匹配0个或者无数个
_ 匹配一个字符
查询姓名中以小开头的信息
select * from stu where name like "小%";
查询名字中有"小"的名字
select * from stu where name like "%小%";
查询名字中含有于的信息
select * from stu where name like "%于%"
查询以香结尾的数据
select * from stu where name like "%香"
查询2个字名字的信息
select * from stu where name like "__";
查询3个字名字的信息
select * from stu where name like "___";
查询至少有两个字的名字
select * from stu where name like "__%";
rlike
. :匹配除\n以外的所有的字符
* :匹配0个或者无数个
查询以周开头的
select * from stu where name rlike "^周.*$";
查询以周开头 以伦结束
select * from stu where name rlike "^周.*伦$"
查询姓小的并且名字只有两个字
select * from stu where name rlike "^小.$";
in 在....里 查询不连续的区间
not in 不在...里
between a and b 在a-b范围内的数据 包括a和b
not between a and b 不在a-b范围的数据 包括a和b
查询18或者35年龄
select * from stu where age in (18,35);
select * from stu where age=18 or age =34;
查询id 是3,5,7 的人
select * from stu where id = 3 or id =5 or id =7;
select * from stu where id in (3,5,7);
查询年龄不在18,34
select * from stu where age not in (18,34);
select * from stu where not (age=18 or age=34);
查询年龄在18-34之间的信息
select * from stu where age>18 and age<34;
select * from stu where age between 18 and 34;
查询年龄不在18-34之间的信息
select * from stu where not(age>18 and age<34);
select * from stu where age not between 18 and 34;
查询id 在不在3和7之间的信息
select * from stu where id not between 3 and 7;
is null:为空
is not null:不为空
身高为空的数据
select * from stu where height is null;
身高不为空
select * from stu where height is not null;
排序 order by
order by 默认从小到大
asc 升序 从小到大
desc 降序 从大到小
# 查询年龄在18-34岁之间的男性
select * frpm stu where(age between 18 and 34)and gender="男";
# 查询18-34岁之间的女性并且身高按照由高到低排序
select * frpm stu where(age between 18 and 34)and gender="女" order by height desc;
#将表中所有人的信息按照身高由高到低排序
select * from stu order by height desc;
#查询表中所有人的年龄和姓名 按照年龄从小到大排序
select age,name from stu order by age;
# 查询年龄在18-34之间的女性,身高从高到低排序,如果身高相同的情况下按照年龄从小到大排序
select * from stu where(age between 18 and 34)and gender="女" order by height desc,age asc;
# 查询年龄在18-34之间的女性,身高从高到低排序,如果身高相同的情况下按照年龄从小到大排序,如果年龄相同按照id从大到小排序
select * from stu where (age between 18 and 34)and gender="女" order by height desc,age asc,id desc;
# 年龄从小到大 身高从大到小排序 如果年龄相同那么身高从大到小排序
select * from stu order by age,height desc;
max()
查询学生中年龄最大的
select max(age) from stu;
找出男生中身高最高
select max(height) from stu where gender="男" ;
min()
找出学生中最小的年龄
select min(age) from stu;
count()
查询学生总数
select count(*) from stu;
sum()
查询学生的年龄总和
select sum(age) from stu;
身高和
select sum(height) from stu;
avg
求平均值
查询学生年龄的平均值
select avg(age) from stu;
身高平均值
select avg(height) from stu;
计算平均数身高保留2位小数
round(小数,保留位数)
如果写0是没有小数,写1保留1位小数
select round(avg(age),2) from stu;
select round(avg(height),2) from stu;
查找平均身高和所有人的名字
select avg(height),group_concat(name) from stu;
因为name有个 平均值就一个 不匹配所以报错
group by 分组
group_concat() 将分组后的结果连接起来
以性别进行分组获取性别
select gender from stu group by gender;
计算每种性别的人数
select gender,count(*) from stu group by gender;
获取每种性别都有谁,统计名字
select gender,group_concat(name) from stu group by gender;
获取每种性别的名字和id
select gender,group_concat(id,name) from stu group by gender;
计算男生的人数
select count(*) from stu where gender="男";
计算男生的人数和姓名
select count(*) ,group_concat(name) from stu where gender="男";
计算性别和平均年龄
select gender,avg(age) from stu group by gender;
having:过滤,对分组后的结果进行筛选 分组在前 过滤在后
查询每种性别的平均年龄
select gender,round(avg(age),2) from stu group by gender;
平均年龄超过30打印出来
select gender,avg(age),group_concat(name) from stu group by gender having avg(age)>30;
查询每种性别人数大于2个
select gender,count(*),group_concat(name) from stu group by gender having count(*)>2;
分页 limit
# limit num 代表展示num条数据
select * from stu limit 5;
# 展示前三条性别为男的信息
select * from stu where gender=1 limit 3;
# limit start,count
# start代表起始值 count代表每一页要展示的数据个数
select * from stu limit 0,5; # id 从1-5
select * from stu limit 5,5; # id 从6-10
select * from stu limit 10,5; # id 从11-15
# 起始值的规律
(n-1)*每页的个数
第一页 (1-1)*5=0
第二页 (2-1)*5=5
第三页 (3-1)*5=10
# 每一页展示3个数据 查询第三页的所有的数据 按照年龄从小到大排序
(3-1)*3=6
select * from stu order by age asc limit 6,3;
# 关键字之间是有优先级的存在 order by > limit
关键字执行
select:查找数据
from:从哪一张表里获取数据
where:查找数据时需要的条件
# 不能改变的关键字
select from where order by group by having limit
# 关键字执行顺序
from > where > group by > having > select > order by >limit
from:找到表
where:选择条件
group by:分组
having:对分组后的结果进行筛选
select:获取数据
order by:对数据进行排序
limit:先排序 在进行最后一次的取值
# 写sql语句的顺序
select * from 表名 where 条件 order by 排序 group by 分组 having 筛选 limit 分页
内连接
概念|作用
内连接查询出两张表中交叉重合的数据,共有的部分
表1的字段放在左边
语法
select 字段 from 表1 inner join 表2 on 连接条件;
连接条件:两张表产生关系的字段
案例
#让学生表和班级表进行内连接查询所有字段
select * from student inner join class on student.cls_id=class.id;
select * from class inner join student on student.cls_id=class.id;
#查询指定字段数据
#如果两张表拥有相同的字段,查询的时候需要标明清楚具体是那一张表里的字段
select name,cls_name from student inner join class on student.cls_id=class.id;
#给表起别名
#如果一旦给表起了别名,就要用这个别名,如果仍然写之前的表名就会报错
#可以只给一张表起别名 也可以给多张表起别名
select s.cls_id,s.name,c.id,c.cls_name from student as s inner join class as c on s.cls_id= c.id;
#查询班级名称 学生id 学生姓名 学生年龄 学生性别 ,按照年龄从大到小排序,如果年龄相同按照id由小到大排序
#多表联查时,不影响分组 排序 过滤 聚合函数 分页 关键字的使用
select c.cls_name,s.id,s.name,s.age,s.gender from student as s inner join class as c on s.cls_id=c.id order by age desc,id asc;
#查询不用性别的人数,姓名以及对应的班级名称
select gender,count(*),group_concat(s.name,c.cls_name) from student as s inner join class as c on s.cls_id=c.id group by gender;
自关联
概念
一张表 自己关联自己
案例准备工作
create table area(
id int primary key auto_increment,
name varchar(20) not null,
pid int
);
insert into area values
(1,"河南省",null),
(2,"山东省",null),
(3,"山西省",null),
(4,"郑州市",1),
(5,"洛阳市",1),
(6,"菏泽市",2),
(7,"运城市",3),
(8,"中牟县",4),
(9,"汝阳市",5),
(10,"曹市",6);
自关联
#查询所有的省份
select name from area where pid is null;
#查询河南省下边的市
———找出河南省的id
select id from area where name="河南省";
———找出pid为1的 也就是河南省下面的市
select name from area where pid=1;
#自关联 本质上用的就是内连接
#语法:select 字段 from 表1 inner join 表2 on 连接条件;
select a1.name,a2.name from area as a1 inner join area as a2 on a1.id=a2.pid where a1.name="河南省";
概念作用
左外连接
左连接和右连接掌握一个即可, 可以通过改变表的位置实现左连接或右连接
作用
left join on
讲表1作为主表,如果关联表中没有对应的信息就用null填充
语法案例
语法:select 字段 from 表1 left join 表2 on 连接条件;
#把学生表当作表1 学生表中的每个数据都存在 如果班级表中没有对应的值 会用null填充
案例:select * from student left join class on student.cls_id=class.id;
#把班级表当作表1 班级表中的每个数据都存在 如果学生表中没有对应的值 会用null填充
select * from class left join student on student.cls_id=class.id;
右外连接
作用
right join on
将表2作为主表,如果关联表中没有对应的信息就用null填充
语法案例
语法:select 字段 from 表1 right join 表2 on 连接条件;
#将班级表当作表2 学生表没有对应的数据 用null填充
案例:select * from student right join class on student.cls_id = class.id;
#把学生表当作表2
案例:select * from class right join student on student.cls_id = class.id;
作用:
外键约束:对外键字段的值进行更新和插入数据时会引用表中字段的数据进行验证,如果数据不合法则更新或插入失败,保证数据的有效性
外键约束在哪一张表里,哪一张表就是从表
因为有外键约束,导致数据不能随便插入,要按照规则添加
添加外键方式:
在创建表的时直接添加外键约束
语法:
foreign key(字段名) references 表名(字段名)
给已经创建好的表增加外键约束
语法:alter table 表名 add foreign key(字段名) references 表名(字段名)
案例:alter table b add foreign key(a_id) references a(id);
注意:
如果表中已经存在不合法数据那么就会添加外键失败
被约束和约束字段的类型要保持一致
否则报3780错误
前面被约束后面是谁来进行约束,
约束谁就在谁那里添加外键约束
找到表中的外键
查看创建表结构:
语法:show create table 表名;
案例:show create table b;
找到系统随机生 成外键字段名(b_ibfk_1)双引号里的
删除语法:
语法:alter table 表名 drop foreign key 字段名;
案例:alter table b drop foreign key b_ibfk_1;
概念
在一个select语句中在嵌入另一个select语句
select * from student;
标量子查询:返回的结果是一个数据(一行一列)
列子查询:返回的结果是一列(一列多行)
行子查询:返回的结果是一行(一行多列)
查询班级身高最高的信息
select * from stu where height=(select max(height) from stu);
查询年龄最大的信息
select * from stu where age=(select max(age) from stu);
in
#查询所有学生的班级 要求显示班级名称和学生姓名
——内连接
select cls_name,name from student as s inner join class as c on s.cls_id=c.id;
——子查询
——查询所有的班级id
select id from class;
——找到有学生的班级里学生的信息
select * from student where cls_id in (1,2,3,4);
——子查询
select * from student where cls_id in (select id from class);
some、any
#some是any的别名 一般情况下使用any any翻译为任意一个
# 查询年龄大于 身高大于175的人的年龄 的人的信息
#身高大于175的人的年龄
select age from stu where height>175;
#查询年龄大于这一部分年龄的人的信息
#报错 more than 1
select * from stu where age>(select age from stu where height>175);
#需要给子查询语句增加一个any条件
#查询出 年龄 比 (身高大于175的人的年龄) 中的任意一个大的都可以
select * from stu where age>any(select age from stu where height>175);
select * from stu where age>some(select age from stu where height>175);
all
#查询出年龄比(身高大于175的人的年龄) 中所有年龄都大的才可以
#身高大于175的人的年龄
select age from stu where height>175;
#查询你那零大于这一部分的年龄的人的信息
select * from stu where age>all(select age from stu where height>175);
#查询身高大于 (年龄小于30岁的身高) 中所有的身高都大才行
select * from stu where height>all(select height from stu where age<30);
exists
只要子查询语句有结果 就会执行主查询语句
如果子查询语句没有结果 就不会执行主查询语句
#查询表中身高高于185的信息
select * from stu where height>185;
#只要表中有身高高于185的人,那就执行查询所有人的信息
select * from stu where exists(select * from stu where height>185);
#年龄大于50岁的人的信息
select * from stu where age>50;
#只要表中有年龄大于50岁的人的信息 就去执行查询表中所有人的姓名和年龄
select name,age from stu where exists(select * from stu where age>50);
概念
是一种特殊文件,它包含着对数据库中所有记录的引用指针,好比一本书的目录,加快查询速度
索引原理以及作用
原理:通过不断缩小范围来筛选结果
作用:加快查询速度
索引分类
mysql常见索引
普通索引 index
唯一索引
unique index
primary key
联合索引
unique(id,name)
全文索引
fulltext ---用于搜索一篇很长的文章
空间索引
spatial 了解即可
索引创建
如果给字符串指定长度,这时候如果索引创建在这个字符串上,索引也需要加长度
第一种方式 在创建表时直接创建索引(索引名跟字段名一样)
语法:create table 表名(字段名 类型 [约束],索引(字段()))
案例:create table test_01(title varchar(20),unique(title(10)));
第二种方式 在已经创建好的表中创建索引(可以自己指定索引名)
语法:create 索引 index 索引名 on 表名(字段名())
案例:create unique index t2 on test_01(title(10));
创建普通索引
案例:create index t1 on test_01(title(10));
第三种方式 在已经创建好的表中创建索引(索引名跟字段名一样)
语法:alter table 表名 add 索引(字段());
案例:alter table test_01 add unique(title(10));
altere table test_01 add index(title(10));
查询索引
语法:show index from 表名;
案例:show index from test_01;
key name 对应的值就是索引名
删除索引
语法:drop index 索引名 on 表名;
案例:drop index title on test_01;
百万数据实战
开启时间检测
set profiling=1;
查看执行时间
show profiles;