导出:先对数据库进行备份,然后提取备份文件中的sql语句
导入:
方法1:创建和原始数据库同名的数据,然后执行从备份文件中导出的sql语句【此方法不需要修改导出sql语句】
方法2:在数据库中直接运行导出的sql语句【此方法往往需要先修改数据库文件】
测试用的数据库:hellodb
students:学生表
classes:班级表
courses:课程表
socres:成绩表
teachers:老师表
coc:班级和开设的课程的对照关系表
mysql的查询操作
单表查询:也就是从一个表中找数据,也叫做 简单查询
多表查询:联合多个表查询数据,也叫做 链接查询
联合查询
格式1:查看表中的全部数据
select * from 表名 where 条件
案例:查询hellodb库中students表中的全部数据
use hellodb; # 选择库
select * from students ; #查询students中的全部数据
格式2:查看表中字段名的全部数据
select 字段名 from 表名 where 条件
案例:查询students表中的数据,但仅仅显示姓名和年龄
select name ,age from students
条件的写法
> 大于
< 小于
<> 不等于
!= 不等于
>= 大于等于
<= 小于等于
is null 是空
is not null 不是空
like 模糊查询
in 判断某个字段是否在给定的集合中
between ... and ... 判断范围
条件写法举例
# age字段大于20
where age > 20# id字段小于等于3
where id <=3# age字段不是15
where age != 15# age字段是15
where age = 15# name字段为空
where name is null# name字段不为空
where name is not null# name字段是以q为开头
where name like "q%"# name字段中包含q
where name like "%q%"# name字段以q为结尾
where name like "%q"# age是3 或者5 或7
where age in (3,5,7)
where age = 3 or age = 5 or age = 7;# age大于等于3且小于等于5
where age>=3 and age<=5
where age between 3 and 5
组合条件的方法
and 多个条件同时满足
or 多个条件满足任意一个即可
排序:
order by 字段 : 根据指定的字段进行排序
asc:升序【默认是】
desc:降序
指定输出几条记录
默认输出所有符合条件的记录
limit 数字
案例:
#1 查询students表中的全部数据
select * from students
#2查询所有学员的姓名、性别、年龄
select name,age,gender from students;
#3 查询年龄小于20的用户
select * from students where age<20;
#4 查询年龄在20-30之间的用户
select * from students where age>=20 and age<=30;
select * from students where age between 20 and 30; #俩种方法都可以
#5 查询students表中的数据,但是仅仅显示姓名和年龄和id
select age,stuid,name from students;
#6 查询年龄是100或者20或者25的用户
select * from students where age=20 or age=100 or age=25;
select * from students where age in (20,100,25); #俩种方法都可以
#7 查看姓名是以r为开头的用户
select * from students where name like "r%";
#8 将所有的用户按照年龄进行排序
select * from students order by age;
#9 将所有的用户按照年龄进行排序,而且用将用降序排序
select * from students order by age desc;
#10 将所有的用户按照stuid的降序排序
select *from students order by stuid desc;
#11 将所有的男性学生按照降序排序
#第一步 先在表中找到所有的男性
select * from students where gender='m';
#第二步 将找的男性按照age进行排序
select * from students where gender='m' order by age;
#第三步 按照降序排序
select * from students where gender='m' order by age desc;
#12 查询姓名是否以及r为开头 或者年龄大于50的用户 , 结构按照id降序进行排序
解题思路:
select * from students where name like "r%" or age>50 order by stuid desc;
#13 查看年龄最大的用户的姓名
解题思路:
select name from students order by age desc limit 1;
#14 查看年龄最小的用户姓名
解题思路:
select name from students order by age limit 1;
#15 查询姓名是以r开头或者年龄大于50的用户中 id最大的用户姓名
解题思路:
select name from students where name like "r%" or age>50 order by stuid desc limit 1;
#16查询姓名是以r为开头或者年龄大于50的用户中id最大的用户的性别
select gender from students where name like "r%" or age>50 order by stuid desc limit 1;
#17 查询姓名是以r为开头或者年龄大于50的用户中id最大的用户的姓名和性别
select name,gender from students where name like "r%" or age>50 order by stuid desc limit 1;
#1 计算所有学生的平均年龄
select avg(age) from students;
#2 查询最大的年龄
方法一:
select max(age) from students;
方法二:
select age from students order by age desc limit 1;
#3 查询最小的年龄
方法一:
select min(age) frim students;
方法二:
select age from students order by age limit 1;
#4 计算所有学生的年龄之和
select sum(age) from students;
#5 计算一共有多少条记录(一条记录就是一个用户)
select count(*) from students;
#6 计算年龄大于50的用户个数
select count(*) from students where age >50;
# 7 计算年龄大于50的用户的年龄和
select sum(age) from students wheree age>50;
# 8 计算年龄大于50用户的平均年龄
select avg (age) from students where age>50;
简单查询的基本格式
select ... from ... where ... order by limit ...
1,update的格式:
# 格式:update 表名 set 字段 = 值 where 条件
案例:将年龄大于50的用户的年龄修改120
update students set age=120 where age>50;
2,delete的格式:
# 格式:delete from 表名 where 条件;
案例:将id>23的用户删除
delete from students where id>23;
distinct 格式:
select distinct .... from .... where 条件
案例1:去除重复的年龄(相同的年龄仅显示一个)
select distinct age from students;
案例2: 将年龄小于50的用户,按照年龄排序 并且去除重复的年龄
select distinct age from students where age<50 oder by age;
#案例1 按照性别进行分组,分别统计m 和 f有多少个学员
select count(gender),gender from students group by gender;
#案例2 分别计算男性和女性的平均年龄
select avg(age),gender from students group by gender;
#案例3 统计年龄大于20的学员中,男性和女性分别有多少人
select gender,count(gender) from students where age>20 group by gender;
#案例4 统计各个班级中,分别有多少个学员
select count(classid),classid from students group by classid;
#案例5 统计各个班级中,分别有多少个学员,要求只显示班级人数大于3的班级
select classid,count(classid) from students group by classid having count(classid)>3;
完整查询的基本格式:
select ... from ... where ... order by ... limit ... group by ... having ...
链接查询
子查询
联合查询
将两张或者多张表联合起来进行查询,这就是链接查询【join】,有两种
交叉链接:
表中每一行,分别和其他表的每一行,组成一个新的行
新表的行数是两个表的行数相乘,列数是两个表的列数相加
自然链接【内链接、等值链接】
将多个表中,符合条件行进行链接
得到交叉连接的结果
select * from 表1,表2;
得到自然连接的结果
select * from 表1,表2 where 表1.字段=表2.字段;
案例:
use hellodb;
select coc.ClassID ,students.ClassID from coc,students where coc.ClassID=students.ClassID;
案例:
##1 查询显示学生的班级名称、学生姓名、班级id
select name, class, classes.classid from students,classes where students.classid = classes.classid;
#2 查询显示学生的姓名和老师的姓名
#表1:学生表:students,关键有两个字段:学生姓名和老师的id,字段名name teacherid
#表2:老师表:teachers,关键有两个字段:老师姓名和老师的id,字段名name tid
select s.name,t.name from students as s,teachers as t where s.teacherid=t.tid;
#3 查询各个班级所开设的课程名,结果显示班级名和课程名
# 首先分析三张表的关联关系
#表1,班级表:classes,表中有班级id和班级名称,字段名classid和class
#表2,课程表:courses,表中有课程id和课程名,字段名courseid和course
#表3,班级课程关联关系表:coc,表中班级id和课程id,字段名classid和courseid
select class,course from classes,courses,coc where classes.classid=coc.classid and Courses.CourseID=coc.courseID;
字段别名
给字段去一个新的名字
显示结果中,字段名会直接用新的名字显示出来
格式:
select 字段名 as 新名字 from 表名 ...
案例:查看学员的的姓名和年龄,显示结果中字段分别是学员姓名和学员年龄
select name as "学员姓名",age as "学员年龄" from students;
注意:
格式:
select 字段 from 表名 as 新名
案例:在进行联合查询的时候,为表定义别名
为students表取别名叫做s
为classes表取别名叫做c
select name, c.classid from students as s,classes as c where s.classid=c.classid;
使用自然链接存在问题:
会导致数据缺失
解决方法:用左外链接、右外链接
左表:前面的
右表:后面的
左外链接
显示结果以左表为准,左表中的数据会全部出现,右边中的数据,有就显示,没有的显示为空
左表 left join 右表 on 条件
右外链接
显示结果以右表为准,右表中的数据会全部出现,左边中的数据,有就显示,没有的显示为空
左表 right join 右表 on 条件
案例:显示每个学生的姓名和班级名【没有班级的学生也要显示出来】
select name,class from students left join classes on students.classid=classes.classid;
在查询语句中,使用另外一个语句的查询结果
··
案例:查询所有年龄大于平均年龄的学生
select * from students where age>(select avg(age) from students);
ER模型:表和表的关联关系
关系的类别:
一对一
一对多
多对多
概念
主键:唯一标识表中的一条记录
外键:用于将两张表建立关系
案例:
1:创建tb2
create table tb2(
classid int primary key, # 第一个字段是id,是主键
name char(30)) # 第二个字段是name,
# 创建表tb1
create table tb1(
id int primary key,# 第一个字段id,是主键
name char(30),# 第二个字段是name,
classid int,# 第三个字段是classid,是整数
foreign key(classid) references tb2(classid));# 将classid这字段转换成外键,指向表tb2的classid这个字段
视图:view
视图也可以认为是一张表
但是这个表存在与内存中的虚表
作用:
通过视图,可以让用户只能访问数据库中的一部分数据【给用户授权】
格式:
create view 视图名 as select 语句
案例:给用户tom进行授权,让用户可以访问id小于5的数据
# 第一步:创建视图,视图中包含的是id小于5的数据
create view v1 as select * from students where stuid<5;# 第二步:查看当前系统中的表,会发现多一个叫做v1的表,这个表其实就是视图
show tables;# 第三步:给用户tom授权,让tom仅仅可以访问视图中的数据
# 授权的格式:grant 权限 on 库名.表名 to 用户名@主机 identified by 密码;
grant all on hellodb.v1 to "tom"@"localhost" identified by "123";
flush privileges;
概念:
类似于书前面的哪个目录,通过索引可以实现快速的在数据库中找到目标数据
通过使用索引,在查询数据的时候,就变得更快了
注意:
索引是针对某一列数据做的,比如针对id左索引、针对name做索引
#创建索引得格式:
create index 索引名 on 表名(字段)
#查看表中哪个字段上有索引的格式:
show index from 表名
# 删除索引得格式:
drop index 索引名 on 表名
案例:将students表的name字段做成索引
create index n1 on students(name);
在测试工作中,经常需要向数据库中填充进去大量的测试数据,同存储过程,可以将一部分有逻辑的代码批量填充到我们的数据库中【快速的生成测试数据】
作用:快速向数据库写入大量的测试数据
定义存储过程格式:
delimiter // # 存储过程的开头,定义一个符号,标识存储过程的结尾
create procedure 存储过程名(参数) # 定义存储过程的名字
begin # 存储过程中要执行的代码从这里开始
sql语句
end // # 存储过程的结尾
调用/使用存储的过程格式:
call 存储过程名()
案例:通过存储过程批量向数据库hellodb的tb2写入数据
# 第一步:创建用于测试的表
use hellodb;
create table tb9(id int primary key auto_increment,num int);# 第二步:创建存储过程
delimiter // # 定义开头
create procedure myprod() # 创建存储过程,名字叫做myprod()
begin # 开始存储过程
declare i int; # declare定义一个变量i,类型是整型
set i = 0; # set将i中的值设置位0
while i<1000 do # 当i中的值小于1000的时候,执行循环
insert into tb9(num) values(i); # 向tb9表中写入数据
set i = i + 1; # 将i的值加1
end while; # 循环结尾
end // # 定义结尾
delimiter ;# 第三步:调用存储过程
call myprod()
事务:
将多个sql语句,组合成一个整体,要么都执行,要么都不执行
在执行事务的过程中,如果有部分语句没有正常执行,那么已经执行过的语句会 回滚
通过使用事务,可以保证数据的一致性
回滚事务:
恢复到执行语句之前的状态
提交事务:
让事务中多个语句,真正的生效
如果使用了事务,那么在事务提交之前,其他用户是看不到事务中的操作的
格式:
案例:演示事务的用法
开启两个链接
在第一个链接启动事务,并执行sql语句
在第二个链接读数据
#在第一个链接,启动事务,并插入几个数据
#在第二个链接,执行查看操作,会发现看不到在第一个链接插入的数据
#在第一个链接提交事务
#在第二个链接才可以看到插入的数据