当前位置:   article > 正文

做测试不会 SQL?超详细的 SQL 查询语法教程来啦!_业务流程测试 查询sql

业务流程测试 查询sql

前言

作为一名测试工程师,工作中在对测试结果进行数据比对的时候,或多或少要和数据库打交道的,要和数据库打交道,那么一些常用的sql查询语法必须要掌握。最近有部分做测试小伙伴表示sql查询不太会,问我有没有sql查询语法这一块的文档可以学习,于是小编就整理了这篇超详细的SQL查询语法教程,来给大家参考学习!

1、数据准备

创建数据库、数据表

  1. -- 创建数据库
  2. create database test1 charset=utf8;
  3. -- 使用数据库
  4. use test1;
  5. -- 创建students表
  6. create table students(
  7. id int unsigned primary key auto_increment not null,
  8. name varchar(20) default '',
  9. age tinyint unsigned default 0,
  10. height decimal(5,2),
  11. gender enum('男','女','中性','保密') default '保密',
  12. cls_id int unsigned default 0,
  13. is_delete bit default 0
  14. );

学生表字段说明

字段

说明

id

主键id

name

学生姓名

age

学生年龄

height

学生身高

gender

学生性别

cls_id

所属班级id(外键)

is_delete

逻辑删除(,默认为0,1表示删除)

  1. -- 创建classes表
  2. create table classes (
  3. id int unsigned auto_increment primary key not null,
  4. name varchar(30) not null
  5. );

班级表字段说明

字段

说明

id

主键id

name

班级名称

准备数据

  1. -- 向classes表中插入数据
  2. insert into classes values (6, "python01"), (0, "python02");
  3. -- 向students表中插入数据
  4. insert into students values
  5. (0,'小明',18,180.00,2,1,0),
  6. (0,'小月',18,180.00,2,2,1),
  7. (0,'项羽',29,185.00,1,1,0),
  8. (0,'刘刘',59,175.00,1,2,1),
  9. (0,'王老麻子',38,160.00,2,1,0),
  10. (0,'老李',28,150.00,4,2,1),
  11. (0,'老张',18,172.00,2,1,1),
  12. (0,'老牛',36,NULL,1,1,0),
  13. (0,'张飞',58,181.00,1,2,0),
  14. (0,'关羽',74,166.00,2,2,0),
  15. (0,'刘备',66,162.00,3,3,1),
  16. (0,'孙权',77,180.00,2,4,0),
  17. (0,'曹操',66,170.00,1,4,0),
  18. (0,'周瑜',55,176.00,2,5,0);

2、基本查询

  • 查询所有字段
  1. select * from 表名;
  2. 例:
  3. select * from students;
  • 查询指定字段
  1. select1,列2,... from 表名;
  2. 例:
  3. select name from students;
  • 使用 as 给字段起别名
select id as 序号, name as 名字, gender as 性别 from students;
  • 可以通过 as 给表起别名
  1. -- 如果是单表查询 可以省略表明
  2. select id, name, gender from students;
  3. -- 表名.字段名
  4. select students.id,students.name,students.gender from students;
  5. -- 可以通过 as 给表起别名
  6. select s.id,s.name,s.gender from students as s;
  • 消除重复行
  • 在select后面列前使用distinct可以消除重复的行
  1. select distinct1,... from 表名;
  2. 例:
  3. select distinct gender from students;

3、条件查询

使用where子句对表中的数据筛选,结果为true的行会出现在结果集中

  • 语法如下:
  1. select * from 表名 where 条件;
  2. 例:
  3. select * from students where id=1;
  • where后面支持多种运算符,进行条件的处理 比较运算符 逻辑运算符 模糊查询 范围查询 空判断

1、比较运算符

  • 等于: =
  • 大于: >
  • 大于等于: >=
  • 小于: <
  • 小于等于: <=
  • 不等于: != 或 <>

例1:查询编号大于3的学生

select * from students where id > 3;

例2:查询编号不大于4的学生

select * from students where id <= 4;

例3:查询姓名不是“关羽”的学生

select * from students where name != '关羽';

例4:查询没被删除的学生

select * from students where is_delete=0;

2、逻辑运算符

  • and
  • or
  • not

例5:查询编号大于3的女同学

select * from students where id > 3 and gender=0;

例6:查询编号小于4或没被删除的学生

select * from students where id < 4 or is_delete=0;

3、模糊查询

  • like
  • %表示任意多个任意字符
  • _表示一个任意字符

例7:查询姓黄的学生

select * from students where name like '黄%';

例8:查询姓黄并且“名”是一个字的学生

select * from students where name like '黄_';

例9:查询姓刘或叫飞的学生

select * from students where name like '刘%' or name like '%飞';

4、范围查询

  • in表示在一个非连续的范围内

例10:查询编号是1或3或8的学生

select * from students where id in(1,3,8);
  • between ... and ...表示在一个连续的范围内

例11:查询编号为3至8的学生

select * from students where id between 3 and 8;

例12:查询编号是3至8的男生

select * from students where (id between 3 and 8) and gender=1;

5、空判断

  • 注意:null与''是不同的
  • 判空is null

例13:查询没有填写身高的学生

select * from students where height is null;
  • 判非空is not null

例14:查询填写了身高的学生

select * from students where height is not null;

例15:查询填写了身高的男生

select * from students where height is not null and gender=1;

6、优先级说明

  • 优先级由高到低的顺序为:小括号,not,比较运算符,逻辑运算符
  • and比or先运算,如果同时出现并希望先算or,需要结合()使用

4、排序

为了方便查看数据,可以对数据进行排序

语法:

select * from 表名 order by1 asc|desc 

说明

  • 将行数据按照列1进行排序,如果某些行列1的值相同时,则按照列2排序,以此类推
  • 默认按照列值从小到大排列(asc)
  • asc从小到大排列,即升序
  • desc从大到小排序,即降序

例1:查询未删除男生信息,按学号降序

select * from students where gender=1 and is_delete=0 order by id desc;

例2:查询未删除学生信息,按名称升序

select * from students where is_delete=0 order by name;

例3:显示所有的学生信息,先按照年龄从大-->小排序,当年龄相同时 按照身高从高-->矮排序

select * from students  order by age desc,height desc;

5、聚合函数

为了快速得到统计数据,经常会用到如下5个聚合函数

1、计数

  • count(*)表示计算总行数,括号中写星与列名,结果是相同的

例1:查询学生总数

select count(*) from students;

2、最大值

  • max(列)表示求此列的最大值

例2:查询女生的编号最大值

select max(id) from students where gender=2;

3、最小值

  • min(列)表示求此列的最小值

例3:查询未删除的学生最小编号

select min(id) from students where is_delete=0;

4、求和

  • sum(列)表示求此列的和

例4:查询男生的总年龄

  1. select sum(age) from students where gender=1;
  2. -- 平均年龄
  3. select sum(age)/count(*) from students where gender=1;

5、平均值

  • avg(列)表示求此列的平均值

例5:查询未删除女生的编号平均值

select avg(id) from students where is_delete=0 and gender=2;

6、分组查询

1、group by

  1. group by的含义:将查询结果按照1个或多个字段进行分组,字段值相同的为一组
  2. group by可用于单个字段分组,也可用于多个字段分组
  1. select * from students;
  2. #按性别进行分组
  3. select gender from students group by gender;

根据gender字段来分组,gender字段的全部值有4个'男','女','中性','保密',所以分为了4组 当group by单独使用时,只显示出每组的第一条记录, 所以group by单独使用时的实际意义不大

2、group by + group_concat()

  1. group_concat(字段名)可以作为一个输出字段来使用,
  2. 表示分组之后,根据分组结果,使用group_concat()来放置每一组的某字段的值的集合
  1. select gender from students group by gender;
  2. #显示分组后,每个组的名字
  3. select gender,group_concat(name) from students group by gender;
  4. #显示分组后,每个组的id
  5. select gender,group_concat(id) from students group by gender;

3、group by + 聚合函数

  1. 通过group_concat()的启发,我们既然可以统计出每个分组的某字段的值的集合,那么我们也可以通过集合函数来对这个值的集合做一些操作
  1. #分组后显示年龄
  2. select gender,group_concat(age) from students group by gender;
  3. #分别统计性别为男/女的人年龄平均值
  4. select gender,avg(age) from students group by gender;
  5. +--------+----------+
  6. | gender | avg(age) |
  7. +--------+----------+
  8. | 男 | 32.6000 |
  9. | 女 | 23.2857 |
  10. | 中性 | 33.0000 |
  11. | 保密 | 28.0000 |
  12. +--------+----------+
  13. #分别统计性别为男/女的人的个数
  14. select gender,count(*) from students group by gender;
  15. +--------+----------+
  16. | gender | count(*) |
  17. +--------+----------+
  18. | 男 | 5 |
  19. | 女 | 7 |
  20. | 中性 | 1 |
  21. | 保密 | 1 |
  22. +--------+----------+

4、group by + having

  1. having 条件表达式:用来分组查询后指定一些条件来输出查询结果
  2. having作用和where一样,但having只能用于group by
  1. select gender,count(*) from students group by gender having count(*)>2;
  2. +--------+----------+
  3. | gender | count(*) |
  4. +--------+----------+
  5. | 男 | 5 |
  6. | 女 | 7 |
  7. +--------+----------+

5、group by + with rollup

  1. with rollup的作用是:在最后新增一行,来记录当前列里所有记录的总和
  1. select gender,count(*) from students group by gender with rollup;
  2. +--------+----------+
  3. | gender | count(*) |
  4. +--------+----------+
  5. | 男 | 5 |
  6. | 女 | 7 |
  7. | 中性 | 1 |
  8. | 保密 | 1 |
  9. | NULL | 14 |
  10. +--------+----------+
  11. select gender,group_concat(age) from students group by gender with rollup;
  12. +--------+-------------------------------------------+
  13. | gender | group_concat(age) |
  14. +--------+-------------------------------------------+
  15. | 男 | 29,59,36,27,12 |
  16. | 女 | 18,18,38,18,25,12,34 |
  17. | 中性 | 33 |
  18. | 保密 | 28 |
  19. | NULL | 29,59,36,27,12,18,18,38,18,25,12,34,33,28 |
  20. +--------+-------------------------------------------+

5、分页

当数据量过大时,在一页中查看数据是一件非常麻烦的事情,这个时候就需要多数据进行分页,下面来看看sql分页查询

语法

select * from 表名 limit start,count

说明

  • 从start开始,获取count条数据

例1:查询前3行男生信息

select * from students where gender=1 limit 0,3;

示例:分页

  • 已知:每页显示m条数据,当前显示第n页
  • 求总页数:此段逻辑后面会在python中实现 查询总条数p1 使用p1除以m得到p2 如果整除则p2为总数页 如果不整除则p2+1为总页数
  • 求第n页的数据
select * from students where is_delete=0 limit (n-1)*m,m

7、子查询

子查询

在一个 select 语句中,嵌入了另外一个 select 语句, 那么被嵌入的 select 语句称之为子查询语句

子查询分类

  • 标量子查询: 子查询返回的结果是一个数据(一行一列)
  • 列子查询: 返回的结果是一列(一列多行)
  • 行子查询: 返回的结果是一行(一行多列)

标量子查询

  1. 查询班级学生平均年龄
  2. 查询大于平均年龄的学生

查询班级学生的平均年龄

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

列级子查询

  • 查询还有学生在班的所有班级名字
  • 找出学生表中所有的班级 id 找出班级表中对应的名字
select name from classes where id in (select cls_id from students);

行级子查询

  • 需求: 查找班级年龄最小,身高最矮的学生
  • 行元素: 将多个字段合成一个行元素,在行级子查询中会使用到行元素
  1. select * from students where height=(select min(height) from students where age=(select min(age) from students));

子查询中特定关键字使用

  • in 范围 格式: 主查询 where 条件 in (列子查询)

8、连接查询

当查询结果的列来源于多张表时,需要将多张表连接成一个大的数据集,再选择合适的列返回,这中情况下就需要使用到连接查询了,下面给大家介绍一下常用的3中连接查询语法:

  • 1、内连接:
  • 查询的结果为两个表匹配到的数据
    • 语法
  • select * from 表1 inner join 表2 on 表1.列 = 表2.列
    • 例:使用左连接查询班级表与学生表
  • select s.name,c.name from students as s inner join classes as c on s.cls_id = c.id;
  • 2、右连接:
  • 查询的结果为两个表匹配到的数据,右表特有的数据,对于左表中不存在的数据使用null填充
    • 语法
  • select * from 表1 right join 表2 on 表1.列 = 表2.列
    • 例:使用右连接查询班级表与学生表
  • select * from students as s right join classes as c on s.cls_id = c.id;
  • 3、左连接:
  • 查询的结果为两个表匹配到的数据,左表特有的数据,对于右表中不存在的数据使用null填充
    • 语法
  • select * from 表1 left join 表2 on 表1.列 = 表2.列
    • 例:查询学生姓名及班级名称
  • select * from students as s left join classes as c on s.cls_id = c.id;

常用的连接查询语法就给大家介绍到这里了,更多的连接查询语法大家可以扩展学习

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小舞很执着/article/detail/795719
推荐阅读
相关标签
  

闽ICP备14008679号