IE盒子

搜索
查看: 148|回复: 0

软件测试mysql学习,赶紧点赞收藏吧

[复制链接]

3

主题

7

帖子

15

积分

新手上路

Rank: 1

积分
15
发表于 2023-1-17 11:52:56 | 显示全部楼层 |阅读模式

  • 数据库简介
  • 数据:用来保存信息的符号
  • 数据库:用来保存数据的仓库,在计算机里面就是一个文件夹,硬盘上是使用文件来存放数据
  • 数据库管理系统:用来管理数据库的软件系统,如:MySql,Oracle等
  • 数据库应用系统:基于数据库研发的应用软件。
  • 数据库的三范式
第一范式(1NF):属性不可分割,即每个属性都是不可分割的原子项。(实体的属性即表中的列)
例如:一张学生表里面,将学生姓名和学号写在一起。违反了第一范式属性列中不能有可以再分的列
第二范式(2NF):满足第一范式;且不存在部分依赖,即非主属性必须完全依赖于主属性。(主属性即主键;完全依赖是针对于联合主键的情况,非主键列不能只依赖于主键的一部分)
例如:第二范式主要是针对联合索引


比如这个表里,学生编号和课程编号建立联合索引,学生分数依赖于这两个索引才能查出,而课程名称只依赖于课程编号就可以查出,这样是不符合第二范式的。
第三范式(3NF):满足第二范式;且不存在传递依赖,即非主属性不能与非主属性之间有依赖关系,非主属性必须直接依赖于主属性,不能间接依赖主属性。(A -> B, B ->C, A -> C)
简单来说表中不能有循环依赖:即B列依赖于A列,而C列依赖与B列

  • 操作数据库
  • 连接数据库
  • 使用navicat来连接数据库#官网上下载有14天免费试用,或者网上找破解版的



  • 使用cmd命令来连接数据库
--连接本地的mysql数据库:mysql -uroot -p
--连接本地的非默认端口的Mysql数据库如:mysql -uroot -p -P3307
--连接远程服务器上面的mysql数据库如:mysql -uroot -p -h192.168.1.1
--连接远程服务器上面的非默认端口的MySQL数据库如:mysql -uroot -p -h192.168.1.1 -P3307

  • 库操作
  • 建库:CREATE DATABASE 数据库名charset = ‘utf-8’
  • 模糊查询:show DATABASE  like ‘%a%’
  • 查看创建了哪些数据库:show databases
  • 删除数据库:drop database 数据库名;
  • 查看数据库的版本和状态select VERSION();
  • 查看mysql实例当前进程:show processlist;
  • 表操作
  • 创建表
    Create table 表名(
    列名1  char(32),
    列名2  varchar(64)

    例如:
    CREATE TABLE class1(
    name CHAR(32), #字符类型、字符长度
    age INT(3)
    );
    #mysql数据类型:
    #现在是讲一些基础的mysql知识。这一块主要是了解,mysql不同的类型存储不同的数据。因为在测试过程中测试工程师基本没有权限去建表的,做接口测试的时候
    字符长度和字符类型都会在接口文档中标记清楚。后面会再出一期对字符类型数据类型进行深入研究。现在先凑合看吧。
    1、 数值类型
    整数类型包括 TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT,浮点数类型包括 FLOAT 和 DOUBLE,定点数类型为 DECIMAL。
    2、日期/时间类型
    包括 YEAR、TIME、DATE、DATETIME 和 TIMESTAMP。
    3、字符串类型
    包括 CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM 和 SET 等。
    4、二进制类型
    包括 BIT、BINARY、VARBINARY、TINYBLOB、BLOB、MEDIUMBLOB 和 LONGBLOB。
    #约束
    约束就是在建表的时候对每一列填入的数据做出规定。比如不能为空、必须唯一等等。
    1、非空约束(not null):约束的字段不能为null
    2、唯一约束(unique):约束的字段不能重复
    3、唯一且非空(unique not null)
    例子:
    CREATE TABLE student3(
    num int(11) UNIQUE not null ,#列的唯一约束,学号不能重复
    name VARCHAR(255) not null,#非空约束
    age int,
    birth char(10)
    );
    4、主键约束(primary key):约束的字段既不能为null,也不能重复。
    主键特点:主键字段中的数据不能为null,也不能重复。
    例子:
    CREATE TABLE student4(
    num int(11)PRIMARY KEY,#主键约束唯一且不重复
    name VARCHAR(255) not null,#非空约束
    age int,
    birth char(10)
    );
    5、主键自增长(auto_increment):
    填入数据的时候主键栏可以不用填写,自动增长
    例子:
    CREATE TABLE student5(
    num int(11)PRIMARY KEY auto_increment,#主键约束唯一且不重复,主键自增长
    name VARCHAR(255) not null,#非空约束
    age int,
    birth char(10)
    );
    6、外键约束(foreign key):
    将本表的某个字段与外表的某个字段相关联,外键不一定是主键,且可以为空,但一定要有unique约束
    语法:foreign key(本表的值) references 外表名(外表的值)
    例如以学生表和班级表为例:
    CREATE TABLE student_1(
    num int(11) PRIMARY KEY auto_increment,#主键约束唯一且不重复,主键自增长
    name VARCHAR(255) not null,#非空约束
    s_cno int,
    foreign key(s_cno) references class_1(cno),
    age int
    );
    CREATE TABLE class_1(
    cno int PRIMARY KEY,
    cname VARCHAR(255)
    )
  • 显示所有表
    show tables;
  • 查看表结构
    desc 表名;
  • 给表新增一列
    ALTER TABLE 表名 ADD 新列名 数据类型 约束条件
  • 给表删除一列
    ALTER TABLE 表名 DROP 列名
  • 删除表
#删除表
drop table student1

  • 表数据的增删改查(CRUD)
  • 新增数据
    Insert into 表名(列1,列2,列3)values(值1,值2,值3)
    例如:INSERT INTO student5(num,name,age) VALUES(3,'李小狼',12);
  • 删除数据
  • 清空表数据
    #清空表数据
    truncate table 表名
  • 清空表数据
    DELETE FROM 表名
  • 按条件删除表数据
DELETE FROM 表名 where 条件
DELETE FROM student5 where num = 3

  • 修改表数据
    UPDATE 表名 set 列名=值where 条件
    UPDATE student5 set num=1 where num=3
  • 查询表数据
  • 全表查询
    Select * from 表名
  • 查询固定的字段
    Select 列名1,列名2... from 表名
  • 查询表里有多少条数据
    Select count(1) from 表名
  • 排序
    Select * from 表名 order by 列名1 desc(降序)#根据列名1进行排序后面可以继续接列名二,第一遍排序之后再进行第二遍排序
    Select * from 表名 order by 列名 asc(升序)#不写asc和desc默认升序
  • 区间查询
    Select * from 表名 limit 5,3 #从第6列开始查,查询3行
    Select * from 表名 age betwee 0 and 100 #年龄从0到100岁之间的人
  • 条件查询
    Select * from 表名 where 条件
    例如 select * from student where name =‘张三’
    =等于 < ,>,<=,>=,!=不等于
  • 去重
    Select distinct 列名 from 表名
    Select distinct name from student5
  • 模糊查询
    Select * from 表名 where 列名 like ‘%字符%”
    %三 匹配 张三、张四三等
    三% 匹配 三千、三万
    %三% 匹配 张三风 刘三姐姐 等
  • In
例如查询表中年龄为12、24、33的人
Select * from 表名 where age in(12,24,33)

  • 数据库中的函数使用
  • 取绝对值ABS
    Select ABS(列名) from 表名
  • 取整foolr、ceil
  • 取比原值小的整数
    Select foolr(列名) from 表名; 例如3.9->3 ,-3.9->-4
  • 取比原值大的整数
Select ceil(列名) from 表名; 例如:3.9->3,-3.9->-3

  • 取四舍五入ROUND、TRUNCATE
    ROUND(列名)  #取四舍五入值
    例如:SELECT ROUND(birth) from student5;
    ROUND(列名,2)#取字段后的2位小数,但要四舍五入
    例如:SELECT ROUND(birth,2) from student5;
    TRUNCATE(列名,2))#取字段后的2位小数,不会四舍五入
  • 查询字符=x的字段,LENGTH
    select * from 表名 where length(字段名)=x
    例如:
    SELECT * from student5 where LENGTH(name)=9;#查询字符长度为9的数据
    SELECT LENGTH(name) from student5;#查询字符长度
  • 字符串长度截取substring、substr
    Substring(列名,x,y)莫列从第x位截取长度为y的字段
  • 时间查询
    SELECT CURDATE();#查询当前时间
    #计算两段时间相差多少天TIMESTAMPDIFF
    SELECT TIMESTAMPDIFF(day,'2023-12-11','2023-12-01');
  • MD5加密
SELECT MD5(name) FROM student5;

  • 聚合函数
只能在select中出现

  • 基础
  • COUNT(X) 统计个数
  • Max(x)取最大值
  • Min(x)取最小值
  • Sum(x)求和x只能为数字型
  • Avg(x) 求平均值
  • 分组
    Group by 根据表中的某个元素进行分组
    SELECT * FROM student5 GROUP BY age;



这样我们只能知道年龄包含有11,12,13但是这些年龄具体都有谁就不知道了这就要用到下面的函数
Group_concat
SELECT age,GROUP_CONCAT(name,num) FROM student5 GROUP BY age;




  • having 二次筛选


筛选出不同年龄姓李的同学
Select * from student5 group by age having name like ‘李%’


#having在mysql中也是可以单独使用的,用法作用和where一样
Select * from student5 having name like '张%'

  • 多表查询
  • 简单连表查询
    Select * from A表,B表 where A.字段=B.字段
  • 连接查询
  • 内连接
    Select * from 表A inner join表B on A.字段=B.字段 where 条件
  • 左外连接
    以A表为基础
    Select * from 表A left join 表B on A.字段=B.字段 where 条件
  • 右外连接
    以B表为基础
    Select * from 表A right join 表B on A.字段=B.字段 where 条件
  • 直连
    Select * from 表A join 表B on A.字段=B.字段 where 条件
  • 自连接
    Select * from A as a ,A as b where a.n=b.n
  • 非等值连接



Select * from ranking a,grade b where b.grade between a.min and a.max

  • 全连接
    A 表有,B 表没有的数据(显示为 null),同样 B 表有,A 表没有的显示为 null。
    select * from 表A full join 表B on 判断条件;
  • 交叉连接笛卡尔积(cross join)


Select * from 表a cross join 表b

  • 视图
将你sql执行的结果生成一张虚拟的表

  • 创建视图
    Create view 视图名 as sql语句
  • 查询
    Select * from 视图名
  • 修改
    Alter view 视图名 as 修改后的sql语句
  • 删除
Drop view 视图名
#mysql线上编辑:http://mysql.jsrun.net

  • 常见面试题
  • sql语句执行顺序
    SQL语句执行顺序:FROM、ON 、JOIN、WHERE、GROUP BY、AGG_FUNC、WITH、HAVING、SELECT、UNION、DISTINCT 、ORDER BY、LIMIT。
    1、FROM:选择FROM后面跟的表,产生虚拟表1。
    2、ON:ON是JOIN的连接条件,符合连接条件的行会被记录在虚拟表2中。
    3、JOIN:如果指定了LEFT JOIN,那么保留表中未匹配的行就会作为外部行添加到虚拟表2中,产生虚拟表3。如果有多个JOIN链接,会重复执行步骤1~3,直到处理完所有表。
    4、WHERE:对虚拟表3进行WHERE条件过滤,符合条件的记录会被插入到虚拟表4中。
    5、GROUP BY:根据GROUP BY子句中的列,对虚拟表4中的记录进行分组操作,产生虚拟表5。
    6、AGG_FUNC:常用的 Aggregate 函数包涵以下几种:(AVG:返回平均值)、(COUNT:返回行数)、(FIRST:返回第一个记录的值)、(LAST:返回最后一个记录的值)、(MAX: 返回最大值)、(MIN:返回最小值)、(SUM: 返回总和)。
    7、WITH 对虚拟表5应用ROLLUP或CUBE选项,生成虚拟表 6。
    8、HAVING:对虚拟表6进行HAVING过滤,符合条件的记录会被插入到虚拟表7中。
    9、SELECT:SELECT到一步才执行,选择指定的列,插入到虚拟表8中。
    10、UNION:UNION连接的两个SELECT查询语句,会重复执行步骤1~9,产生两个虚拟表9,UNION会将这些记录合并到虚拟表10中。
    11、DISTINCT 将重复的行从虚拟表10中移除,产生虚拟表 11。DISTINCT用来删除重复行,只保留唯一的。
    12、ORDER BY: 将虚拟表11中的记录进行排序,虚拟表12。
    13、LIMIT:取出指定行的记录,返回结果集。
    2、数据库的三范式
    详见文章开头
    3、sql优化
    1、查询的时候避免全表扫描,考虑在where以及order by 设计的列上建立索引。
    #索引是为了加速对表中数据行的检索而创建的一种分散的存储结构。这里先记住就是提高检索效率的一种方式就好了,这块涉及到数据结构比如hash,b+树,后面有时间再出这块笔记。Java面试问到数据库这块也会问道索引失效怎么解决。
  • 应尽量避免在where子句中使用!=或<>,or连接,模糊查询,in和not in(能用between就少用in)否则将视为放弃索引,进行全表扫描
  • 尽量避免select * 这种操作,最好具体到字段
#后面面试了对与这块的面试题再补充
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表