软件测试第一阶段:web前端技术基础-7- mysql数据库中的简单查询

一丶查询

1、数据的备份还原

  • 导出:先对数据库进行备份,然后提取备份文件中的sql语句

  • 导入:

    • 方法1:创建和原始数据库同名的数据,然后执行从备份文件中导出的sql语句【此方法不需要修改导出sql语句】

    • 方法2:在数据库中直接运行导出的sql语句【此方法往往需要先修改数据库文件】

测试用的数据库:hellodb

  • students:学生表

  • classes:班级表

  • courses:课程表

  • socres:成绩表

  • teachers:老师表

  • coc:班级和开设的课程的对照关系表

2、简单查询

mysql的查询操作

  • 单表查询:也就是从一个表中找数据,也叫做 简单查询

  • 多表查询:联合多个表查询数据,也叫做 链接查询

  • 联合查询

3,查询的格式:

格式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降序进行排序

解题思路:

  • 第一步 先找到符合以r开头的 或者年龄大于50的用户的数据
  • 第二步 按照id进行排序
  • 第三步 实现降序排序

select * from students where name like "r%" or age>50 order by stuid desc;

#13 查看年龄最大的用户的姓名

解题思路:

  1. 查询所有的用户
  2. 让用户按照年龄进行排序
  3. 实现降序排序 (也就是将年龄最大的放到第一个)
  4. 输出第一条记录(此时年龄最大的用户就是第一个记录)
  5. 修改语句 ,指定只显示姓名字段的数据

select name from students order by age desc limit 1;

#14 查看年龄最小的用户姓名

解题思路:

  1. 查询所有的用户
  2. 让用户按照年龄进行排序
  3. 输出第一条记录(此时第一条记录就是年龄最小的用户)
  4. 修改语句,指定只显示姓名段

select name from students order by age limit 1;

#15 查询姓名是以r开头或者年龄大于50的用户中 id最大的用户姓名

解题思路:

  1. 查询符合条件的用户(以r开头或者年龄大于50)
  2. 让用户按照id进行排序
  3. 实现降序排序 (也就是将id最大的放到第一个)
  4. 输出第一条记录(此时id最大的用户就是第一个记录)
  5. 修改语句 ,指定只显示姓名字段的数据

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;

4丶聚合函数

  • sum()   求和
  • avg()     求平均值
  • max()        求最大值
  • min()         求最小值
  • count()      统计记录条数

#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 ...

补充:在update和delete使用条件

    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;

分组

  •     group by 字段

分组后加条件

  • having 条件

#案例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 ...

查询进阶

  • 链接查询

  • 子查询

  • 联合查询

1、链接查询

  • 将两张或者多张表联合起来进行查询,这就是链接查询【join】,有两种

    • 交叉链接:

      • 表中每一行,分别和其他表的每一行,组成一个新的行

      • 新表的行数是两个表的行数相乘,列数是两个表的列数相加

    • 自然链接【内链接、等值链接】

      • 将多个表中,符合条件行进行链接

得到交叉连接的结果

select * from 表1,表2;

得到自然连接的结果

select * from 表1,表2 where 表1.字段=表2.字段;

案例:

软件测试第一阶段:web前端技术基础-7- mysql数据库中的简单查询_第1张图片

 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;

2、子查询

  • 在查询语句中,使用另外一个语句的查询结果

 ··

案例:查询所有年龄大于平均年龄的学生

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

视图

1、数据库设计方法【了解】

  • 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语句,组合成一个整体,要么都执行,要么都不执行

  • 在执行事务的过程中,如果有部分语句没有正常执行,那么已经执行过的语句会 回滚

  • 通过使用事务,可以保证数据的一致性

回滚事务:

  • 恢复到执行语句之前的状态

提交事务:

  • 让事务中多个语句,真正的生效

  • 如果使用了事务,那么在事务提交之前,其他用户是看不到事务中的操作的

格式:

  • 启动事务:begin
  • 提交事务:commit
  • 回滚事务:rollback

案例:演示事务的用法

  • 开启两个链接

    • 在第一个链接启动事务,并执行sql语句

    • 在第二个链接读数据

#在第一个链接,启动事务,并插入几个数据
#在第二个链接,执行查看操作,会发现看不到在第一个链接插入的数据
#在第一个链接提交事务
#在第二个链接才可以看到插入的数据

你可能感兴趣的:(软件工程师,数据库,mysql)