软件测试 —— 数据库常用SQL语句

目录

一、数据操作

1.增加数据

1)增加一行数据——增加全部值

2)增加一行数据——增加部分值

3)增加多行数据

2.修改数据

1)修改数据

3.删除数据

1)删除数据

2)逻辑删除

4.查询语句

1)基本查询

2)条件查询

3)其他复杂查询

5.连接查询

1)内连接

 2)左连接(左外连接)

3)右连接(右外连接)

4)全连接

 6.子查询语句充当查询条件或数据源

1)子查询语句充当查询条件

2)子查询语句充当数据源

二、数据类型和约束

1.数据类型

1)整数: int

2)⼩数: decimal

3)字符串: varchar

4)⽇期时间: datetime

2.约束

1)主键(primary key)

2)⾮空(not null)

3)唯⼀(unique)

4)默认值(default)

5) 外键(foreign key)

6)索引


一、数据操作

1.增加数据

1)增加一行数据——增加全部值

insert into 表名 values(…);

注意:

a)数据值需要和表的字段完全对应(数据个数和数据类型)

b)主键列是自动增长,插入时需要占位,通常使用0或者default或者null来占位

举例:

insert into students values(0,'张三',28,1.78);

2)增加一行数据——增加部分值

insert into 表名(字段1,…) values(值1,…);

举例:

insert into students values(0,'张三',28,1.78);

insert into students(name,height) values('李四',1.68);

3)增加多行数据

a)方法一:多句执行单行插入语句,以分号隔开

举例:

insert into students values(0,'王五',23,1.67);

insert into students(name,height) values ('赵六',1.82);

b)方法二:在插入单行数据的语句上,value后边的数据进行多组化处理

insert into 表名 vaues(…),(…);

insert into 表名(列1,…)values(值1,…),(值1,…)…;

举例:

insert into students values(0,'张一',21,1.81),(1,'张二',30,1.65);

insert into students(name,height) values('李三',1.54),(李四'',1.87);

2.修改数据

1)修改数据

update 表名 set 列1=值1,列2=值2… where 条件;

注意:where如果省略,代表修改整列数据,不建议省略where

举例:update students set age=48 where id=9;

3.删除数据

1)删除数据

delete from 表名  where 条件;

注意:where如果省略,代表删除全部数据,不建议省略where

举例:delete from students where id=6;

2)逻辑删除

对于重要的数据,不能轻易执行delete删除语句,因为一旦删除,数据无法回复,这时会用到逻辑删除。表中增加字段isdelete,0代表未删除,1代表删除,默认值0,当需要删除某条数据时,设置该条数据的isdelete字段为1

举例:

update students set isdelete=1 where id=4;

select *from students where isdelete=0;

3)其他删除方法

delete from 表名 ——删除所有数据,但是不重置主键字段的计数

truncate table 表名 ——删除所有数据,并重置主键字段的计数

drop table 表名 ——删掉表(字段和数据均不再存在)

举例:

delete from students;

truncate table students;

drop table students;

4.查询语句

1)基本查询

a)查询表内所有数据

select *from 表名;

举例:select *from students;

b)查询表内部分字段

select 字段名1,字段名2 from 表名;

举例:select name,age from students;

c)字段起别名查询

select 字段名 as '别名' from 表名;    (引号可以省略,as也可以省略)

select name as '姓名' from students;

起别名的作用:1)美化数据结果的显示效果 2)可以起到隐藏真正字段名的作用

d)去重查询

select distinct(字段名) from 表名;

举例:select distinct(company) from goods;

2)条件查询

a)逻辑运算符

select *from goods where price >30 and company != ''PDD;

b)模糊查询

like %

举例:

select *from goods where remark like '%一次性%';          ——关键词在中间

select *from goods where remark like '%一次性';               ——关键词在末尾

selects *from goods where remark like '一次性%';             ——关键词在开头

c)范围查询

查询价格范围在30-100的商品信息

举例:select *from goods where price between 30 and 100;

d)判断空查询

i)查询描述为空的所有商品

select *from goods where remark is null;

ii)查询有描述信息的所欲商品

select *from goods where remark is not null;

3)其他复杂查询

a)排序

查询说明:查询所有商品信息,按照价格从大到小排序,价格相同时,按照数量由少到多排序

select *from 表名 order by 列1 asc|desc ,列2 asc|desc,…

说明:order by ——排序;asc ——升序 ;desc ——降序

select *from goods order by price desc,count asc;   

默认排序为升序,上面的asc可以省略,修改为:select *from goods order by price desc,count;

b)聚合函数

i)统计记录总数

select count(*) from goods;

扩展:可以增加筛选条件,如:select count(*) from goods where name = '矿泉水';

ii)其他

select max(price) from goods;                                                             ——最高商品价格

select min(price) from goods;                                                              ——最低商品价格

select avg(price) from goods;                                                              ——商品平均价格

select sum(amount) from goods where remark like '%一次性%';        ——一次性商品的总金额

c)分组

i)分组查询

select 字段1,字段2,聚合… from 表名 group by 字段1,字段2…

select sum(amount) from goods group by company; ——按照公司名称分组统计各个公司的金额总数

还可以分组统计数量:select count(*) from goods group by company;

ii)分组后加条件过滤

select 字段1,字段2,聚合… from 表名 where 条件 group by 字段 having 条件;

举例:显示每个地区的总人口数和总面积,仅显示那些面积超过1000000的地区

select region,sum(population),sum(area) from bbc group by region having sum(area)>1000000;

where 和having的区别

  • where是对from后面指定的表进行数据筛选,属于对原始数据的筛选
  • having是对group by 的结果进行筛选
  • having后面的条件中可以用聚合函数,where后面不可以

4)分页查询

select *from 表名 limit start,count;

举例:

select *from goods limit 0,5;          ——获取前5条数据

select *from goods limit 5;             ——默认从一条取值,0可以省略

扩展:

select *from goods order by price desc limit 1;             ——查询商品价格最贵的一条数据信息

select *from goods order by price desc limit 3;            ——查询商品价格最贵的前三条数据信息

5.连接查询

1)内连接

select *from 表1 inner join 表2 on 表1.列=表2.列

内连接查询,按照图表表示如下:取的值是A和B的交集,也就是A和B都有的数据才能查出来

A表和B表结构如下:

select *from A inner join B on A.id=B.id;

还可以写成:select *from A join B on A.id=B.id; 或者select *from A , B where A.id=B.id;

取出来的数据是id为1,2,3

2)左连接(左外连接)

select *from 表1 left join 表2 on 表1.列=表2.列

左连接查询,按照图表表示如下:取的值是A的全部加上A和B的交集部分

select *from A left join B on A.id=B.id;

还可以写成:select *from A left outer join B on A.id=B.id;

取出来的数据是id为1,2,3,4

3)右连接(右外连接)

select *from 表1 right join 表2 on 表1.列=表2.列

右连接查询,按照图表表示如下:取的值是B的全部加上A和B的交集部分

select *from A right join B on A.id=B.id;

还可以写成:select *from A right outer join B on A.id=B.id;

取出来的数据是id为1,2,3

4)全连接

取的是A和B两个表的全部

select *from A left join B on A.id=B.id union select *from A right join B on A.id=B.id;

或者select *from A full join B on A.id=B.id;

 6.子查询语句充当查询条件或数据源

1)子查询语句充当查询条件

select *from goods where price > (select avg(price)from goods);          ——查询价格高于平均价的商品信息

2)子查询语句充当数据源

select *from (select *from goods go left join category ca on go.typeid=ca.typeid) new where new.company = ''PDD;                             ——查询所有来自PDD的商品信息,包含商品分类

其中,goods  别名go              category别名ca    

二、数据类型和约束

1.数据类型

1)整数: int

有符号范围(-2147483648 ~2147483647),⽆符号 (unsigned)范围(0 ~ 4294967295)

2)⼩数: decimal

例如:decimal(5,2) 表示共存5位数,⼩数占2位,整数占3 位

3)字符串: varchar

范围(0~65533),例如:varchar(3) 表示最多存3个字 符,⼀个中⽂或⼀个字 ⺟都占⼀个字符

4)⽇期时间: datetime

范围(1000-01-01 00:00:00 ~ 9999-12-31 23:59:59),例如:'2020-0101 12:29:59'

2.约束

1)主键(primary key)

能唯⼀标识表中的每⼀条记录的属性组

2)⾮空(not null)

此字段不允许填写空值

3)唯⼀(unique)

此字段的值不允许重复

4)默认值(default)

当不填写此值时会使⽤默认值,如果填写时以填写为准

5) 外键(foreign key)

⼀个表中的⼀个字段引⽤另⼀个表的主键

说明: 通过外部数据表的字段, 来控制当前数据表的数据内容变更, 以避免单⽅⾯移除数据, 导致关联表数据产⽣垃圾数据的⼀种⽅法。

注意: 如果⼤量增加外键设置, 会严重影响除数据查询操作以外的其他操作(增/ 删/改)的操作效率。

6)索引

说明: 为字段添加索引,可以⼤幅度提⾼查询语句的执⾏效率。

注意: 如果⼤量增加索引设置, 会严重影响除数据查询操作以外的其他操作(增/ 删/改)的操作效率, 故不⽅便过多添加。

引申:如果测试过程中,需要查询数据库表中是否使用了索引,可以使用show index from 表名;语句,该语句会返回该表的所有索引信息,包括索引名、索引类型、索引包含的列等。字段含义见下表:

字段名含义
Non_unique表示该索引是否是唯一索引,0代表是唯一,1代表不是唯一
Seq_in_index表示该列在索引中的位置,如果索引是单列,则值为1;如果索引是组合索引,则该列的值为每列在索引中的顺序
Column_name表示定义索引的列字段
Collation表示列以何种顺序存储在索引中。在Mysql中国,A代表升序,若显示NULL,则表示无分类
Cardinality索引中唯一值数目的估计值
Sub_part表示列中被编入索引的字符的数量。若列只是部分被编入索引,则该列的值为被编入索引的字符的数目;若整列被编入索引,则该列的值为 NULL
Packed指示关键字如何被压缩,若没有被压缩,值为 NULL
Null用于显示索引列中是否包含 NULL。若列含有 NULL,该列的值为 YES。若没有,则该列的值为 NO
Index_type显示索引使用的类型和方法(BTREE、FULLTEXT、HASH、RTREE)
Comment显示评注

  • 2
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是一个基于 Flink SQL API 的单元测试代码示例,该代码测试了一个简单的 Flink SQL 查询: ```java import org.apache.flink.api.common.typeinfo.Types; import org.apache.flink.api.java.ExecutionEnvironment; import org.apache.flink.api.java.tuple.Tuple2; import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment; import org.apache.flink.table.api.Table; import org.apache.flink.table.api.bridge.java.BatchTableEnvironment; import org.apache.flink.table.api.bridge.java.StreamTableEnvironment; import org.apache.flink.table.api.EnvironmentSettings; import org.apache.flink.types.Row; import org.junit.Test; import static org.junit.Assert.assertEquals; public class FlinkSqlUnitTest { @Test public void testFlinkSql() throws Exception { // 创建执行环境 StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); StreamTableEnvironment tEnv = StreamTableEnvironment.create(env); // 创建测试数据 env.setParallelism(1); env.fromElements(Tuple2.of("Alice", 23), Tuple2.of("Bob", 35), Tuple2.of("Charlie", 40)) .toTable(tEnv, "name, age"); // 执行测试任务 Table result = tEnv.sqlQuery("SELECT * FROM name_age WHERE age > 30"); // 验证测试结果 tEnv.toRetractStream(result, Row.class) .returns(Types.TUPLE(Types.BOOLEAN, Types.ROW_NAMED(new String[]{"name", "age"}, Types.STRING, Types.INT))) .map(tuple -> tuple.f1) .returns(Types.ROW_NAMED(new String[]{"name", "age"}, Types.STRING, Types.INT)) .addSink(new StreamSinkFunction<>()); // 执行测试任务 env.execute(); } } ``` 该代码使用 Flink 的 StreamTableEnvironment,创建了一个简单的表,然后执行了一个 Flink SQL 查询,查询年龄大于 30 的人的信息。最后,使用 Flink 的 TestingUtils 工具类来验证测试结果是否正确。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值