MySQL查询语句书写顺序技巧总结(一遍必会版)

0. 前言

MySQL的查询语句语法虽然是描述性语言,但是在使用的时候,我发现如果语句书写顺序不正确的话,还是很容易发生报错的,如果您已经学了查询语句的概念(没学可以看下面的回顾~),但是写代码的时候有些模糊,那我后面写的可能会对您有所帮助!
在这里插入图片描述
我在这里分享一下我对语句书写的理解~


1.回顾

首先我们对SQL查询语句中的关键字进行回顾下:
select:选择某一列待展示的数据
distinct:独一无二的,表示一种限定,指的是查询结果中的数据不出现重复
from:从某个数据表中进行xx操作
as:为from中选择的表进行取别名
where:在选中的数据表中进行一定条件的筛选,有点类似于java中的if条件判断
group by:根据某一字段进行分组
having:根据group by选择的字段,进行条件筛选
order by:根据升序/降序显示某个字段(列)数据
limit:限制查询结果的条数

2.SQL语句书写顺序

我们要理解SQL代码书写的顺序,应该考虑查询中我会遇到哪些需要考虑的事情(暂时不考虑优化器改变真正执行顺序)
考虑的事情顺序说明

STEP1: from 考虑选择某数据表 [as] 取别名
STEP2: where 在选中的数据表后进行一定条件的筛选
STEP3:group by 筛选完后的数据可能需要进行分组
STEP4:having 分完组后的数据可能需要进行组内筛选
STEP5:order by 组也分完了,数据也根据分组筛选完毕,可能需要进行排序准备待展示了
STEP6:limit 排序过后,就是展示出来了,但是如果一个数据表几万条记录需要展示,难道全部显示吗,此时就需要限制展示条数了
STEP0: select 选择某些列进行数据展示 [distinct] 需要对结果做独一无二的限定
值得注意的是,在查询的时候,并不是每一步都会需要,如果需求没有那么多,那不用的语步骤直接跳过就行。比如有时候只需要分组并限制显示页数,不用进行排序,那排序这步可以直接跳过不写,在分组后直接写limit即可

  • select个人理解:select虽然写在最前面,我个人认为是告诉程序我要进行选择了,所以会写在代码最前面,其作用是选择某些列进行数据展示。

了解需要考虑的事情后,自然书写顺序容易写出来了(记得把step0放到前面去)

  • 注意:查询语句的语法是有顺序的。第一步先确定选择select某些列进行数据展示,第二步from确定需要查询的表,第三步从某表中用where进行条件筛选,第四步筛选完后的数据可能需要进行分组group by第五步在分组好的基础上可能需要进行组内筛选,即追加条件having第六步组也分完了,数据也根据分组筛选完毕,可能需要进行排序order by准备等待展示了,第七步limit限制查询条数,写在语句的最后面。这个顺序是比较好理解的,思考下就会写了,但是不能写反(除了select写在最前面),否则程序会报错

如果我上面的描述还是没法让您理解的话,先别着急,继续看看我写的例子,应该能帮助您更好的理解我上面的话~

先创建后表格

在这里插入图片描述

3 简单查询

  • 练习

    -- 查询所有的商品. 
    SELECT * from product;
    -- 查询商品名和商品价格.
    select pname,price from product;
    -- 查询价格,去掉重复值.
    select DISTINCT price from product;
    -- 查询结果是表达式(运算查询):将所有商品的价格+10元进行显示. 
    select pname,price+10 from product;
    -- 对查询后的列进行重命名,使用的关键字是as(as可以省略的).
    select pname,price+10 as '价格' from product;
    select pname,price+10 '价格' from product;
    -- 别名查询.使用的关键字是as(as可以省略的).表别名
    select * from product as p;
    select * from product p;
    

4 条件查询

比较运算符< <= > >= = <>大于、小于、大于(小于)等于、不等于
BETWEEN …AND…显示在某一区间的值(含头含尾)
IN(列表)显示包含在in(列表)中的值,例:in(100,200)
LIKE ‘字符’模糊查询,like语句中,% 代表零个或多个任意字符,_ 代表一个字符, 例如:first_name like '_a%';
IS NULL判断是否为空
逻辑运行符and多个条件同时成立
or多个条件任一成立
not不成立,例:where not(salary>100);
  • 练习

    #查询商品名称为“花花公子”的商品所有信息:
    select * from product where pname='花花公子';
    #查询价格为800商品
    select * from product where price=800;
    #查询价格不是800的所有商品
    select * from product where price<>800;	-- sql标准语法
    select * from product where price!=800; -- mysql特有的符号
    #查询商品价格大于60元的所有商品信息
    select * from product where price>60;
    #查询商品价格在200到1000之间所有商品
    select * from product where price>=200 and price<=1000;
    select * from product where price between 200 and 1000;
    #查询商品价格是200或800的所有商品
    select * from product where price=200 or price=800;
    select * from product where price in(200,800);
    # LIKe 中的 %代表匹配任意长度的任意字符; _代表匹配一个任意字符
    #查询商品名称含有'霸'字的所有商品
    select * from product where pname like '%霸%';
    #查询商品名称以'香'开头的所有商品
    select * from product where pname like '香%';
    #查询商品名称第二个字为'想'的所有商品
    select * from product where pname like '_想%';
    #商品没有分类id的商品
    select * from product where category_id is NULL;
    #查询有分类id的商品
    select * from product where category_id is NOT NULL;
    

5 排序查询

通过order by语句,可以将查询出的结果进行排序。

  • 格式:
SELECT * FROM 表名 ORDER BY 排序字段 ASC|DESC;
#ASC 升序 (默认), 从小到大排序
#DESC 降序, 从大到小排序
  • 练习

    #使用价格排序(降序)
    select * from product order by price desc;
    #在价格排序(降序)的基础上,以分类排序(降序)
    select * from product order by price desc,category_id desc;
    #显示商品的价格(去重复),并排序(降序)
    select DISTINCT price from product order by price desc;
    

5 聚合查询

之前我们做的查询都是横向查询,它们都是根据条件一行一行的进行判断,而使用聚合函数查询是纵向查询,它是对一列的值进行计算,然后返回一个单一的值;另外聚合函数会忽略空值。

我们学习如下五个聚合函数:

  • count(列名):统计指定列不为NULL的记录行数;

  • sum(列名):计算指定列的数值和,如果指定列类型不是数值类型,那么计算结果为0;

  • max(列名):计算指定列的最大值,如果指定列是字符串类型,那么使用字符串排序运算;

  • min(列名):计算指定列的最小值,如果指定列是字符串类型,那么使用字符串排序运算;

  • avg(列名):计算指定列的平均值,如果指定列类型不是数值类型,那么计算结果为0;

  • 练习:

    #查询商品的总条数
    select count(*) from product; -- 不推荐
    select count(pid) from product;-- 查询主键
    select count(category_id) from product;
    
    #查询价格大于200商品的总条数
    select count(*) from product where price>200;
     
    #查询分类为'c001'的所有商品的价格总和
    select sum(price) from product where category_id='c001';
    
    #查询分类为'c002'所有商品的平均价格
    select avg(price) from product where category_id='c002';
    
    #查询商品的最大价格和最小价格
    select max(price),min(price) from product;
    

6 分组查询

分组查询是指使用group by...having...字句对查询信息进行分组。

  • 格式:
SELECT 字段1,字段2FROM 表名 where 条件 GROUP BY 分组字段 HAVING 分组条件;

分组操作中的having子语句,是用于在分组后对数据进行过滤的,作用类似于where条件。

  • having与where的区别:

    • having是在分组操作执行后, 对分组后的数据进行过滤.(临时数据表进行过滤)

      where是在分组操作执行前, 对分组前的数据 只能使用表原始列进行条件过滤(真实数据表进行过滤)

    • having后面可以使用 聚合函数

      where后面不可以使用 聚合函数。

    • 当一条SQL语句中, 既有where 又有 group by \ having时, 先执行 where, 再执行 group by, 最后执行having

  • 练习

    #统计各个分类商品的个数
    select category_id,count(pid) from product group by category_id;
    
    #统计各个分类商品的个数,且只显示个数大于1的信息
    SELECT category_id,count(pid) from product GROUP BY category_id HAVING count(*)>1;
    
    #统计价格>200元的 各个分类商品的个数,且只显示个数大于1的信息
    select category_id,count(pid) from product where price>200 group by category_id HAVING count(pid)>1;
    

7 条数限制查询

LIMIT是MySQL内置函数,其作用是用于限制查询结果的条数,放置在select语句的最后。

MySQL默认限制条数是1000条

格式: select * from 表名 limit m,n
/*其中: m索引,n显示多少条
m是指记录开始的index,从0开始,表示第一条记录  n是取n条。*/

#例如:
    select * from tablename limit 2,4 -- 即取出第3条至第6条,4条记录    

我按照自己的理解写了一下这个书写顺序问题,但是不知道能否讲述清楚,如果有不明白的。欢迎留言与我讨论,我会完善这篇文章的~

  • 13
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值