SQL语句
单表查询:select * from tablename where filedname(=<> like @ _ )''
and /or group by (max/mix/sum/avg/count) order by (汉语排序)?
学习SQL:
在数据库中进行功能验证
接口自动化测试数据存储
数据安全方面测试-sql注入
性能数据准备及测试准备
数据库性能监控与调优
sql作业
查询出平均月薪最高的部门编号和名字
SELECT * from (SELECT e.department_id,department_name,avg(salary)ss from departments d join employee e on d.department_id=e.department_id GROUP BY e.department_id )tt ORDER by ss desc LIMIT 1
查询出所有程序员的姓名和他所在的地区
SELECT CONCAT_WS(’
',e.last_name,e.FIRST_name),e.department_id,l.city from employee e join departments d on e.department_id=d.department_id join locations l on d.location_id=l.location_id WHERE e.job_id=‘程序员’
查询jim所在的部门名称
SELECT city from locations WHERE location_id in(SELECT location_id from departments WHERE department_id in(SELECT department_id from employee WHERE FIRST_name=‘jim’))
查询所有在北京上班的员工姓名
SELECT FIRST_name from employee WHERE department_id in (SELECT department_id from departments WHERE location_id in (SELECT location_id from locations WHERE city=‘北京’))
查询软件部所有员工姓名
SELECT FIRST_name from employee WHERE department_id in (SELECT department_id from departments WHERE department_name=‘软件部’)
查询出所有北京市海淀区所有员工的最大、最小和平均工资
SELECT MAX(salary),min(salary),avg(salary) from employee WHERE department_id in (SELECT department_id from departments WHERE location_id in(SELECT location_id from locations WHERE street_address=‘北京市海淀区’))
查询所有员工的部门名称、部门管理者名称
SELECT e.FIRST_name 员工,d.department_name 部门名称,em.first_name 管理者 from employee e JOIN departments d on e.department_id=d.department_id join employee em on d.manager_id=em.employee_id
查询月薪在5000以上的、在北京的程序员
SELECT * from employee WHERE salary >5000 and department_id in (SELECT department_id from departments WHERE location_id in (SELECT location_id from locations WHERE city='北京'))
SELECT * from employee1, departments1,locations1 WHERE salary >5000
and employee1.department_id =departments1.department_id
and departments1.location_id = locations1.location_id
and locations1.city='北京'
and employee1.job_id='程序员'
查询所有员工姓名、该员工管理者的姓名、该员工工作地点、该员工管理者所在城市
SELECT e.FIRST_name 员工,l.city 员工工作地点,em.first_name 管理者, l.city 管理者工作地点 from employee e JOIN departments d on e.department_id=d.department_id join employee em on d.manager_id=em.employee_id join locations l on d.location_id=l.location_id
查询工资高于平均工资的人
SELECT * from employee WHERE salary >(SELECT avg(salary) from employee)
sql常用语句
1、修改表字段类型
ALTER TABLE users MODIFY age date ;
2、修改字段名和类型
ALTER TABLE users change age birthday date ; SHOW TABLES;
3、重命名表
RENAME TABLE users TO pay_users;
4、删除表 DROP
TABLE IF EXISTS users;
5、删除所有信息
TRUNCATE users;
1、添加记录数据
insert into employee1 (字段名1,字段名2)
values (100, 'tom',);
3、delete from tables where =
删除表中的符合条件数据
4、update tables set
字段名=value; 更新表中的数据
把job_grade 表中grade_level字段的名改成g_level,类型改成int
ALTER TABLE job_grades1 change grade_level g_level int;
备份:
mysqldump -u root -p --databases mary > mary.sql
恢复:
mysql -uroot -p < mary.sql source mary.sql;
sql文件格式
data 文件 夹下。 一个 数据库 是一个目录,目录下一个表对应三个 文件 , 文件 名是表名,
扩展名分别是.frm、.MYD、.MYI ( (数据 文件 :.myd)、 (索引 文件 :.MYI)、 (表定义 文件 :.frm))。
在bug模块中查询“test”,页面会有结果,2条,还要数据库中 ,找到相应表,zt_bug,编写sql查询一下标题中带‘test’。
select * from zt_bug where title like '%test%'
and product=12 and deleted <>'1';
测试过程中,添加标题python是产品1,但保存到产品12中了。请问,是前端 工程师还是后端工程师。
如何区分前端Bug与后端Bug?
1、查日志-手段
2、前端问题(发的对 1-1不对1-0 ,收后解释和插入位置是否正确0-0,)
抓包截断-查看请求对不对。
3、后端-数据库—存错字段,类型,没存上,报错。
中间有问题—网络 丢包,劫持篡改。
1、通过抓包或者开发者模式过滤信息定位bug
a、传入参数错误(缺参、错参等),导致的问题往往是前端bug;
b、传入的参数与接口文档一致,数据返回正确,界面显示错误(字段取错),往往是前端的bug;
c、传入参数正确,数据返回错误,往往是后端的bug。
d、根据响应状态码:404客户端请求路径错误,500服务器内部错误
2、根据前后端的bug特点来定位问题
a、前端bug特点:界面相关(文本问题可能是html产生的bug)、布局相关(样式问题可能是css产生的bug,图片尺寸分辨率等)、兼容性相关
b、后端bug特点:业务逻辑相关(排序、分页)、数据相关、性能相关、安全性相关。
3、查询系统日志
如果查不到错误日志前端的问题概率大,反之后台的问题。
4、通过sql语句查询数据,是否有数据入库。
有些项目接口与接口之间存在相互调用,不同的接口是不同的开发人员负责,我们可以通过查询数据的方式来区分哪个接口问题。比如:在A模块添加一条数据,但是在B模块没有展示,这时我们 通过查询数据库的数据来确认,是A模块没有插入数据,还是B模块没有查询到数据来缩小问题的范围。
5、根据测试经验确定谁的bug
软件测试人员应不断精进自己的技能,负责的项目多了,自然对功能的实现过程有了解,也就明白如何分类BUG了。再就是与开发人员多沟通,熟悉业务,每个模块是哪个开发负责的。
前端是用户看得见摸得着的东西,主要体现在页面的视觉效果以及交互设计上。比如说一个网站的页面风格、页面跳转等,最简单的例子就是一个注册界面:前端设计界面风格,约束输入的字符类型、长度以及合法性校验等,不涉及到与数据库之间的信息交流。
**后台,则侧重于更深层面的东西,关于逻辑,关于数据,关于平台的稳定性与性能。后台主要负责实现具体的功能,**举个例子,还是那个注册界面,前端写好了界面,规定了你能输入哪些数据,不能输入哪些数据,而后台则会把你输入的信息与数据库进行比对,如果是新用户,则顺势在数据库中插入一条信息。
当然,关于数据的校验,不同项目情况不同,有些是由前端进行校验,有些是后台,有些是前后台都需要校验。
知道了前后台的区别,就大致能够进行bug的判断了。
case1:文本框输入不合法的内容,点击提交按钮, 如果不合法的内容提交成功, 那应该是前后台没有做校验, 前后台都有这个bug
case2:文本框输入合法的内容,点击提交按钮, 查看数据库中的数据和输入的内容不一致,这个时候需要看前台传的数据是否正确,使用fiddler抓包, 查看请求头里面的数据是否和输入一致,如果一致就是后台的问题, 如果不一致,就是前台的bug
case3:界面展示不友好, 重复提交 这些都是前台的bug
前端问题来源
首先必备工具Firefox debug工具(fiddler也是一个相当好用的工具)
可以考虑检查标签的排查工具 idea.exe
如何区分页面的bug问题归属:前端or后端
前端bug主要分为3个类别:HTML,CSS,Javascript三类问题
给个最大的区别方式方法:
- 出现样式的问题基本都是CSS的bug
- 出现文本的问题基本都是html的bug
- 出现交互类的问题基本都是Javascript的bug
判断前后台问题的区分方法:
FF, 打开错误控制台
区分前后台交互:查看网络请求
a) Html中如果有链接,有相应的情况下,基本可以定位到是属于前端的问题
b) 如果为空,或者有出现error错误信息,我们就可以定位到属于后台开发的问题
TMS对应的VM模板,出现的一些截断控制,转换功能都属于前端的问题
一、HTML
最常见的HTML的问题—就是标签的问题了,最常见的排查和解决办法就是查看页面源代码,然后通过检查标签的工具,现在暂时提供idea.exe进行检查,有其他更好的工具再进行推荐。
常见问题类别:
标签闭合—表象,页面中出现大范围的混乱,就是少了标签的情况,导致标签未闭合
标签浮出—例如鼠标移动到文本位置,浮出全名的这种浮出形式都属于标签浮出的问题
标签在不同的浏览器的一种解析方式的不同导致的前端bug例如如下结构
该部分可以看做为一个大的框即是标签 内嵌标题的标签
,里面再有这些个内容,那么在不同的浏览器中,可能ie和FF的解析会产生不同,假设IE解析为<a><p><img></img></a></p>
的一种形式,但在FF下可能解析为
<a><img></img></a>
<p></p>
的两行的形式从而导致前端在复古鞋/板鞋这块ing里面的格式产生混乱
结构可看为:
页面定点的问题:最明显的前端功能,在于点击某个链接将页面位置定位到对应的位置
a) 我们可以通过右键,查看元素的工具进行定位到毛点所定位到的位置,如果出现问题这种问题很直观,并且能通过这种方法直接定位到问题
页面的跳转,也属于html的问题,大家在出现点击未跳转或者跳转方式不正确的问题,直接可以定位到跳转属性的问题,找到对应的跳转对应的块提供给开发人员即可
二、CSS,产生样式问题。例如:排版,布局,颜色,背景等
css的bug主要分为:兼容型bug 、业务性bug 和 内容型bug
兼容型bug
a) 表现:仅在少数几个浏览器上出现
b) 原因:浏览器的解析不一致
c) 解决:根据实际情况进行前端代码的通用性
d) 类别:
脚本兼容型问题:在出现对应交互的问题就基本可以定位到脚本兼容型bug,例如DIV的显示和层结构。实际可以参考聚划算的几个商品鼠标移动到小图的时候,对应大图展示的功能。
页面样式兼容型问题:直接表象在样式上,都是基于框架的页面展示错误,很容易定位
业务性bug
a) 表现:在所有浏览器下都有该问题
b) 原因:对业务不熟悉
c) 解决:根据需求进行修改达到业务要求
该类型的定位,主要在和实现的要求不一致,最直接表现在页面的友好型,用户的可用性的bug,可以定位为该类型
内容型bug
a) 表现: 前端自测正确,但在填入内容后,出现的错误,内容消失等
b) 原因: 扩展性未考虑周全
c) 解决: 进行overflow test
输入内容的长度限制等功能可定位为内容型bug
三、Javascript
最直接的判断方法,刷新页面,出现滞后显示的一些模块基本都为脚本的输出块。该部分的一些问题可以参照兼容型bug中类别的脚本兼容型bug。
有产生交互类的问题,大多数都可以定位到是属于javascript产生的问题,该部分大多不会报错
有错误提示类的。页面左下方有出现javascript的错误提示;有弹出错误信息提示的bug;浏览器返回的一些错误弹出框都属于javascript的bug。
删除信息数据有多少种方法,每一种有什么不一样?
1、drop table table_name : 删除表全部数据和表结构,立刻释放磁盘空间,不管是 Innodb 和 MyISAM;
实例,删除学生表:
drop table student;
2、truncate table table_name : 删除表全部数据,保留表结构,立刻释放磁盘空间 ,不管是 Innodb 和 MyISAM;
实例,删除学生表:
truncate table student;
3、delete from table_name : 删除表全部数据,表结构不变,对于 MyISAM 会立刻释放磁盘空间,InnoDB 不会释放磁盘空间;
实例,删除学生表:
delete from student;
4、delete from table_name where xxx : 带条件的删除,表结构不变,不管是 innodb 还是 MyISAM 都不会释放磁盘空间;
实例,删除学生表中姓名为 “张三” 的数据:
delete from student where T_name = “张三”;
5、delete 操作以后,使用 optimize table table_name 会立刻释放磁盘空间,不管是 innodb 还是 myisam;
实例,删除学生表中姓名为 “张三” 的数据:
delete from student where T_name = “张三”;
实例,释放学生表的表空间:
optimize table student;
6、delete from 表以后虽然未释放磁盘空间,但是下次插入数据的时候,仍然可以使用这部分空间。
总结
1、当你不再需要该表时, 用 drop;
2、当你仍要保留该表,但要删除所有记录时, 用 truncate;
3、当你要删除部分记录时, 用 delete。
mysql truncate、delete与drop区别
相同点:
1.truncate和不带where子句的delete、以及drop都会删除表内的数据。
2.drop、truncate都是DDL语句(数据定义语言),执行后会自动提交。
不同点:
1. truncate 和 delete 只删除数据不删除表的结构(定义)
drop 语句将删除表的结构被依赖的约束(constrain)、触发器(trigger)、索引(index);依赖于该表的存储过程/函数将保留,但是变为 invalid 状态。
2. delete 语句是数据库操作语言(dml),这个操作会放到 rollback segement 中,事务提交之后才生效;如果有相应的 trigger,执行的时候将被触发。
truncate、drop 是数据库定义语言(ddl),操作立即生效,原数据不放到 rollback segment 中,不能回滚,操作不触发 trigger。
3.delete 语句不影响表所占用的 extent,高水线(high watermark)保持原位置不动
drop 语句将表所占用的空间全部释放。
truncate 语句缺省情况下见空间释放到 minextents个 extent,除非使用reuse storage;truncate 会将高水线复位(回到最开始)。
4.速度,一般来说: drop> truncate > delete
5.安全性:小心使用 drop 和 truncate,尤其没有备份的时候.否则哭都来不及
使用上,想删除部分数据行用 delete,注意带上where子句. 回滚段要足够大.
想删除表,当然用 drop
想保留表而将所有数据删除,如果和事务无关,用truncate即可。如果和事务有关,或者想触发trigger,还是用delete。
如果是整理表内部的碎片,可以用truncate跟上reuse stroage,再重新导入/插入数据。
6.delete是DML语句,不会自动提交。drop/truncate都是DDL语句,执行后会自动提交。
7、TRUNCATE TABLE 在功能上与不带 WHERE 子句的 DELETE 语句相同:二者均删除表中的全部行。但 TRUNCATE TABLE 比 DELETE 速度快,且使用的系统和事务日志资源少。DELETE 语句每次删除一行,并在事务日志中为所删除的每行记录一项。TRUNCATE TABLE 通过释放存储表数据所用的数据页来删除数据,并且只在事务日志中记录页的释放。
8、TRUNCATE TABLE 删除表中的所有行,但表结构及其列、约束、索引等保持不变。新行标识所用的计数值重置为该列的种子。如果想保留标识计数值,请改用 DELETE。如果要删除表定义及其数据,请使用 DROP TABLE 语句。
9、对于由 FOREIGN KEY 约束引用的表,不能使用 TRUNCATE TABLE,而应使用不带 WHERE 子句的 DELETE 语句。由于 TRUNCATE TABLE 不记录在日志中,所以它不能激活触发器。
10、TRUNCATE TABLE 不能用于参与了索引视图的表。
sql数据类型
在MySQL中,选择正确的数据类型,对于性能至关重要。
一般应从以下两个方面考量:
确定合适的大类型:数值、字符串、时间、二进制;
确定具体的类型:有无符号、取值范围、变长定长等。
在MySQL数据类型设置方面,尽量采用更小的数据类型,因为它们占用的存储空间更小,通常有更好的性能,花费更少的硬件资源。并且,尽量把字段定义为NOT NULL,避免使用NULL。
数值类型
(1)整数类型
整数类型的数,默认情况下既可以表示正整数又可以表示负整数(此时称为有符号数)。如果只希望表示零和正整数,可以使用无符号关键字“unsigned”对整数类型进行修饰。
各个类别存储空间及取值范围。
类型 | 大小 | 范围(有符号) | 范围(无符号) | 用途 |
---|---|---|---|---|
TINYINT | 1 bytes | (-128,127) | (0,255) | 小整数值 |
SMALLINT | 2 bytes | (-32 768,32 767) | (0,65 535) | 大整数值 |
MEDIUMINT | 3 bytes | (-8 388 608,8 388 607) | (0,16 777 215) | 大整数值 |
INT或INTEGER | 4 bytes | (-2 147 483 648,2 147 483 647) | (0,4 294 967 295) | 大整数值 |
BIGINT | 8 bytes | (-9,223,372,036,854,775,808,9 223 372 036 854 775 807) | (0,18 446 744 073 709 551 615) | 极大整数值 |
(2)小数类型
decimal(length, precision)用于表示精度确定(小数点后数字的位数确定)的小数类型,length决定了该小数的最大位数,precision用于设置精度(小数点后数字的位数)。
例如: decimal (5,2)表示小数取值范围:999.99~999.99 decimal (5,0)表示: -99999~99999的整数。
各个类别存储空间及取值范围。
类型 | 大小 | 范围(有符号) | 范围(无符号) | 用途 |
---|---|---|---|---|
FLOAT | 4 bytes | (-3.402 823 466 E+38,-1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38) | 0,(1.175 494 351 E-38,3.402 823 466 E+38) | 单精度 |
DOUBLE | 8 bytes | (-1.797 693 134 862 315 7 E+308,-2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) | 0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) | 双精度 |
DECIMAL | 对DECIMAL(M,D) ,如果M>D,为M+2否则为D+2 | 依赖于M和D的值 | 依赖于M和D的值 | 小数值 |
日期和时间类型
表示时间值的日期和时间类型为DATETIME、DATE、TIMESTAMP、TIME和YEAR。
每个时间类型有一个有效值范围和一个"零"值,当指定不合法的MySQL不能表示的值时使用"零"值。
TIMESTAMP类型有专有的自动更新特性,将在后面描述。
类型 | 大小(bytes) | 范围 | 格式 | 用途 |
---|---|---|---|---|
DATE | 3 | 1000-01-01/9999-12-31 | YYYY-MM-DD | 日期值 |
TIME | 3 | ‘-838:59:59’/‘838:59:59’ | HH:MM:SS | 时间值或持续时间 |
YEAR | 1 | 1901/2155 | YYYY | 年份值 |
DATETIME | 8 | 1000-01-01 00:00:00/9999-12-31 23:59:59 | YYYY-MM-DD HH:MM:SS | 混合日期和时间值 |
TIMESTAMP | 4 | 1970-01-01 00:00:00/2038 结束时间是第 2147483647 秒,北京时间 2038-1-19 11:14:07,格林尼治时间 2038年1月19日 凌晨 03:14:07 | YYYYMMDD HHMMSS | 混合日期和时间值,时间戳 |
字符串类型
字符串类型指CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET。该节描述了这些类型如何工作以及如何在查询中使用这些类型。
类型 | 大小 | 用途 |
---|---|---|
CHAR | 0-255 bytes | 定长字符串 |
VARCHAR | 0-65535 bytes | 变长字符串 |
TINYBLOB | 0-255 bytes | 不超过 255 个字符的二进制字符串 |
TINYTEXT | 0-255 bytes | 短文本字符串 |
BLOB | 0-65 535 bytes | 二进制形式的长文本数据 |
TEXT | 0-65 535 bytes | 长文本数据 |
MEDIUMBLOB | 0-16 777 215 bytes | 二进制形式的中等长度文本数据 |
MEDIUMTEXT | 0-16 777 215 bytes | 中等长度文本数据 |
LONGBLOB | 0-4 294 967 295 bytes | 二进制形式的极大文本数据 |
LONGTEXT | 0-4 294 967 295 bytes | 极大文本数据 |
注意:char(n) 和 varchar(n) 中括号中 n 代表字符的个数,并不代表字节个数,比如 CHAR(30) 就可以存储 30 个字符。
CHAR 和 VARCHAR 类型类似,但它们保存和检索的方式不同。它们的最大长度和是否尾部空格被保留等方面也不同。在存储或检索过程中不进行大小写转换。
BINARY 和 VARBINARY 类似于 CHAR 和 VARCHAR,不同的是它们包含二进制字符串而不要非二进制字符串。也就是说,它们包含字节字符串而不是字符字符串。这说明它们没有字符集,并且排序和比较基于列值字节的数值值。
BLOB 是一个二进制大对象,可以容纳可变数量的数据。有 4 种 BLOB 类型:TINYBLOB、BLOB、MEDIUMBLOB 和 LONGBLOB。它们区别在于可容纳存储范围不同。
有 4 种 TEXT 类型:TINYTEXT、TEXT、MEDIUMTEXT 和 LONGTEXT。对应的这 4 种 BLOB 类型,可存储的最大长度不同,可根据实际情况选择。
bug判断属于前端,还是后端?
将整个运行系统,分为三个部分。
1.前端(网页)
2.中间件(负载均衡等服务器,功能性插件依赖)
3.后端(分为应用服务器,数据库)
首先,在前端通过发送测试案例请求,使用工具截获请求对比前端原数据(包括标签ID,css的按钮id),判断是不是从前端发送请求数据出现误差。
其次,检查从前端发出的请求数据在网络传输过程中,没有被拦截篡改,没有丢包数据丢失。
再次,检查中间件的服务程序,没有遗漏,破坏对数据的协议和接口。保证从前端而来的数据没有变化和完整的传输到后端。
最后,检查后端。查看请求数据进入服务器没有损害和完整性,确定服务器输入没有问题,使用sql语句检查数据库的数据是否正常增加和响应使用的数据在数据库中是否正确,如果数据库输出的数据正确,检查数据从服务器加工输出是否被替换。