测试学 SQL,简单用法

发布于 更新于
本文目录
  1. 前言
  2. 1、数据准备
  3. 2、基本查询
  4. 查询所有字段
  5. 查询指定字段
  6. 使用 as 给字段起别名
  7. 可以通过 as 给表起别名
  8. 在select后面列前使用distinct可以消除重复的行
  9. 3、条件查询
  10. 1、比较运算符
  11. 2、逻辑运算符
  12. 3、模糊查询
  13. 4、范围查询
  14. 5、空判断
  15. 6、优先级说明
  16. 4、排序
  17. 5、聚合函数
  18. 1、计数
  19. 2、最大值
  20. 3、最小值
  21. 4、求和
  22. 5、平均值
  23. 6、分组查询
  24. 1、group by
  25. 2、group by + group_concat()
  26. 3、group by + 聚合函数
  27. 4、group by + having
  28. 5、group by + with rollup
  29. 5、分页
  30. 7、子查询
  31. 8、连接查询
  32. 1、内连接:
  33. 语法
  34. 例:使用左连接查询班级表与学生表
  35. 2、右连接:
  36. 语法
  37. 例:使用右连接查询班级表与学生表
  38. 3、左连接:
  39. 语法
  40. 例:查询学生姓名及班级名称

技术文章Linux与数据库

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

前言

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

1、数据准备

创建数据库、数据表

-- 创建数据库
createdatabasetest1charset=utf8;

-- 使用数据库
usetest1;

-- 创建students表
createtablestudents(
idintunsignedprimarykeyauto_incrementnotnull,
namevarchar(20)default'',
agetinyintunsigneddefault0,
heightdecimal(5,2),
genderenum('男','女','中性','保密')default'保密',
cls_idintunsigneddefault0,
is_deletebitdefault0
);

学生表字段说明

字段

说明

id

主键id

name

学生姓名

age

学生年龄

height

学生身高

gender

学生性别

cls_id

所属班级id(外键)

is_delete

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

-- 创建classes表
createtableclasses(
idintunsignedauto_incrementprimarykeynotnull,
namevarchar(30)notnull
);

班级表字段说明

字段

说明

id

主键id

name

班级名称

准备数据

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

2、基本查询

  • 查询所有字段

select*from表名;
例:
select*fromstudents;
  • 查询指定字段

select列1,列2,...from表名;
例:
selectnamefromstudents;
  • 使用 as 给字段起别名

selectidas序号,nameas名字,genderas性别fromstudents;
  • 可以通过 as 给表起别名

-- 如果是单表查询 可以省略表明
selectid,name,genderfromstudents;

-- 表名.字段名
selectstudents.id,students.name,students.genderfromstudents;

-- 可以通过 as 给表起别名
selects.id,s.name,s.genderfromstudentsass;
  • 消除重复行

  • 在select后面列前使用distinct可以消除重复的行

selectdistinct列1,...from表名;
例:
selectdistinctgenderfromstudents;

3、条件查询

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

  • 语法如下:

select*from表名where条件;
例:
select*fromstudentswhereid=1;
  • where后面支持多种运算符,进行条件的处理

    • 比较运算符

    • 逻辑运算符

    • 模糊查询

    • 范围查询

    • 空判断

1、比较运算符

  • 等于: =

  • 大于: >

  • 大于等于: >=

  • 小于: <

  • 小于等于: <=

  • 不等于: != 或 <>

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

select*fromstudentswhereid>3;

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

select*fromstudentswhereid<=4;

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

select*fromstudentswherename!='关羽';

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

select*fromstudentswhereis_delete=0;

2、逻辑运算符

  • and

  • or

  • not

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

select*fromstudentswhereid>3andgender=0;

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

select*fromstudentswhereid<4oris_delete=0;

3、模糊查询

  • like

  • %表示任意多个任意字符

  • _表示一个任意字符

例7:查询姓黄的学生

select*fromstudentswherenamelike'黄%';

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

select*fromstudentswherenamelike'黄_';

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

select*fromstudentswherenamelike'刘%'ornamelike'%飞';

4、范围查询

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

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

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

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

select*fromstudentswhereidbetween3and8;

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

select*fromstudentswhere(idbetween3and8)andgender=1;

5、空判断

  • 注意:null与''是不同的

  • 判空is null

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

select*fromstudentswhereheightisnull;
  • 判非空is not null

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

select*fromstudentswhereheightisnotnull;

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

select*fromstudentswhereheightisnotnullandgender=1;

6、优先级说明

  • 优先级由高到低的顺序为:小括号,not,比较运算符,逻辑运算符

  • and比or先运算,如果同时出现并希望先算or,需要结合()使用

4、排序

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

语法:

select*from表名orderby列1asc|desc

说明

  • 将行数据按照列1进行排序,如果某些行列1的值相同时,则按照列2排序,以此类推

  • 默认按照列值从小到大排列(asc)

  • asc从小到大排列,即升序

  • desc从大到小排序,即降序

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

select*fromstudentswheregender=1andis_delete=0orderbyiddesc;

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

select*fromstudentswhereis_delete=0orderbyname;

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

select*fromstudentsorderbyagedesc,heightdesc;

5、聚合函数

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

1、计数

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

例1:查询学生总数

selectcount(*)fromstudents;

2、最大值

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

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

selectmax(id)fromstudentswheregender=2;

3、最小值

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

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

selectmin(id)fromstudentswhereis_delete=0;

4、求和

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

例4:查询男生的总年龄

selectsum(age)fromstudentswheregender=1;

-- 平均年龄
selectsum(age)/count(*)fromstudentswheregender=1;

5、平均值

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

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

selectavg(id)fromstudentswhereis_delete=0andgender=2;

6、分组查询

1、group by

  1. group by的含义:将查询结果按照1个或多个字段进行分组,字段值相同的为一组

  2. group by可用于单个字段分组,也可用于多个字段分组

select*fromstudents;

#按性别进行分组
selectgenderfromstudentsgroupbygender;

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

2、group by + group_concat()

  1. group_concat(字段名)可以作为一个输出字段来使用,

  2. 表示分组之后,根据分组结果,使用group_concat()来放置每一组的某字段的值的集合

selectgenderfromstudentsgroupbygender;

#显示分组后,每个组的名字
selectgender,group_concat(name)fromstudentsgroupbygender;


#显示分组后,每个组的id
selectgender,group_concat(id)fromstudentsgroupbygender;

3、group by + 聚合函数

  1. 通过group_concat()的启发,我们既然可以统计出每个分组的某字段的值的集合,那么我们也可以通过集合函数来对这个值的集合做一些操作

#分组后显示年龄
selectgender,group_concat(age)fromstudentsgroupbygender;


#分别统计性别为男/女的人年龄平均值
selectgender,avg(age)fromstudentsgroupbygender;
+--------+----------+
|gender|avg(age)|
+--------+----------+
|男|32.6000|
|女|23.2857|
|中性|33.0000|
|保密|28.0000|
+--------+----------+

#分别统计性别为男/女的人的个数
selectgender,count(*)fromstudentsgroupbygender;
+--------+----------+
|gender|count(*)|
+--------+----------+
|男|5|
|女|7|
|中性|1|
|保密|1|
+--------+----------+

4、group by + having

  1. having 条件表达式:用来分组查询后指定一些条件来输出查询结果

  2. having作用和where一样,但having只能用于group by

selectgender,count(*)fromstudentsgroupbygenderhavingcount(*)>2;
+--------+----------+
|gender|count(*)|
+--------+----------+
|男|5|
|女|7|
+--------+----------+

5、group by + with rollup

  1. with rollup的作用是:在最后新增一行,来记录当前列里所有记录的总和

selectgender,count(*)fromstudentsgroupbygenderwithrollup;
+--------+----------+
|gender|count(*)|
+--------+----------+
|男|5|
|女|7|
|中性|1|
|保密|1|
|NULL|14|
+--------+----------+


selectgender,group_concat(age)fromstudentsgroupbygenderwithrollup;
+--------+-------------------------------------------+
|gender|group_concat(age)|
+--------+-------------------------------------------+
|男|29,59,36,27,12|
|女|18,18,38,18,25,12,34|
|中性|33|
|保密|28|
|NULL|29,59,36,27,12,18,18,38,18,25,12,34,33,28|
+--------+-------------------------------------------+

5、分页

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

语法

select*from表名limitstart,count

说明

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

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

select*fromstudentswheregender=1limit0,3;

示例:分页

  • 已知:每页显示m条数据,当前显示第n页

  • 求总页数:此段逻辑后面会在python中实现

    • 查询总条数p1

    • 使用p1除以m得到p2

    • 如果整除则p2为总数页

    • 如果不整除则p2+1为总页数

  • 求第n页的数据

select*fromstudentswhereis_delete=0limit(n-1)*m,m

7、子查询

子查询

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

子查询分类

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

  • 列子查询: 返回的结果是一列(一列多行)

  • 行子查询: 返回的结果是一行(一行多列)

标量子查询

  1. 查询班级学生平均年龄

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

查询班级学生的平均年龄

select*fromstudentswhereage>(selectavg(age)fromstudents);

列级子查询

  • 查询还有学生在班的所有班级名字

  • 1. 找出学生表中所有的班级 id 2. 找出班级表中对应的名字

selectnamefromclasseswhereidin(selectcls_idfromstudents);

行级子查询

  • 需求: 查找班级年龄最小,身高最矮的学生

  • 行元素: 将多个字段合成一个行元素,在行级子查询中会使用到行元素

select*fromstudentswhereheight=(selectmin(height)fromstudentswhereage=(selectmin(age)fromstudents));

子查询中特定关键字使用

  • in 范围

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

8、连接查询

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

  • 1、内连接:

    查询的结果为两个表匹配到的数据

    • 语法

    select*from表1innerjoin表2on表1.列=表2.列
    • 例:使用左连接查询班级表与学生表

    selects.name,c.namefromstudentsassinnerjoinclassesascons.cls_id=c.id;
  • 2、右连接:

    查询的结果为两个表匹配到的数据,右表特有的数据,对于左表中不存在的数据使用null填充

    • 语法

    select*from表1rightjoin表2on表1.列=表2.列
    • 例:使用右连接查询班级表与学生表

    select*fromstudentsassrightjoinclassesascons.cls_id=c.id;
  • 3、左连接:

    查询的结果为两个表匹配到的数据,左表特有的数据,对于右表中不存在的数据使用null填充

    • 语法

    select*from表1leftjoin表2on表1.列=表2.列
    • 例:查询学生姓名及班级名称

    select*fromstudentsassleftjoinclassesascons.cls_id=c.id;

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

*

数据库

** 34 引用 • 23 回帖 **

来源:testingpai

继续阅读