sql之dql语句,语法和思路

这些都是我自学时手打到文本文档,在复制粘贴到博客的,有一些命令格式不对,但全部百分百原创,如果有疑问或者不对的地方,欢迎评论区指正,也可以加q群592383030来探讨(我就是自学的普通人,不卖课,不涉及补习机构)

我会出一整套mysql的学习过程,从基础的sql语句,约束,函数,事务。到进阶的存储引擎,sql优化,索引,存储过程,锁,触发器,视图甚至lnnoDB引擎的详解和一些运维方面的比如,mha主从,读写分离;mmm双主,pxc MySQL高可用,zabbix,elk监控MySQL。如果有需要来我主页,有帮助到您就关注我,点个赞,感谢


                                                  一  DQL语句基础查询

1,单表查询多个字段
select  字段1,字段2,from  表名;
2,单表查询所有字段
select  *  from  表名;
3,设置别名
select  字段1  AS‘别名1’,字段2  AS’别名2‘  from  表名;
4,去除重复记录
select  distinct  字段列表  from  表名;

                                                  二  DQL语句条件查询

1,单表指定字段后条件查询
select  字段列表  from  表名  where  条件列表
2,where条件有两种,比较运算符和逻辑运算符,where条件主体是比较运算符,但多个比较运算符就需要逻辑运算符整合,连接。可以通过多个逻辑运算符连接多个比较运算符,只要搞清比较运算符之间的关系,用对逻辑运算符就行。
比如查有身份证号的,直接 ‘身份证号  !is null’就行了
比较运算符有
>,大于
>=,大于等于
<,小于
<=,小于等于
=,等于
<>或!= ,不等于

between.....and....,在某个范围内(between后跟最小,and后跟最大值)
例子;查年龄在15到20之间的员工(包含15和20,但是不用写比较符,默认就是大于等于和小于等于),后面的条件应该写:年龄  between  15 and  20

in(...),在in之后列表中的值,多选一,符合任意一个就行
例子;查年龄18或20或40的员工,按理说应该用or一个一个码字,但是我在年龄后面加个in(18,20,40)就直接可以了,方便

like占位符,模糊查询用的到(_匹配单个字符,%匹配任意个字符)
例子;查询名字为两个字的员工,where like ‘_ _’;查询身份证号以x结尾的员工,where  like‘%x’
还蛮复杂的,%x  以x结尾;x%  以x开头;%x%内容含x
再说_的应用,x_  以x开始后面只有一个任意字符;_x 以x结尾前面只有一个任意字符;%x_包含x以任意数量字符开头,但最多一个字符结尾;_x%包含x最多一个字符开头,但以任意数量字符结尾。

is null,判断一个字段是不是空的

逻辑运算符有
and或&&,并且的意思(多个条件同时成立)
or或||,或者的意思(多个条件任意成立一个)
not或!,非,不是的意思。

                                                  三,DQL聚合函数
聚合函数是在表中以列(字段)为整体的纵向计算(排序)。
1,常见聚合函数
count  统计数量
max  最大值
min  最小值
avg  平均值
sum  求和
2,使用聚合函数语法
select  聚合函数(字段列表) from  表名;(所有的null值不参加聚合函数运算)

                                                  四  DQL分组查询

1,分组查询语法
select  字段列表  from  表名【where条件】 group by 分组字段名 【having分组后过滤条件】
但是不是按照语法走的,执行顺序在第八章
例子;根据性别分组,统计男女员工各自数量。
第一步先写基本查询,select  *(所有字段的意思) form  表名
第二部加上分组,select  *(所有字段的意思) form  表名  group by  性别
第三步,因为要统计男女数量,就加上聚合函数count,select  count(*)(统计所有男女员工数量的意思,因为分组执行在函数前面,通过性别分组了,所以可以直接*全部统计) form  表名  group by  性别
在这一步就出现问题了,按现在的sql语句,就是查询这个表,通过性别分组,统计平均数量。执行完就发现,分没分组,分了。统计没统计,统计了各自数量。但归根结底只是两组数,有问题吗,没问题,因为这句sql语句就这意思,所有要改进才能满足需求。
第四步,上面做完发现有两组数,但不显示那个是男,那个是女,所以在前面基础查询加一个性别,得出完全状态:select  性别  count(*)form  表名  group by  性别
把这条命令分开看,先基础查询性别,就显示了男女;在把性别分组,各自统计数量,就完整了,符合需求了。所以破解方法就是在前面的基础查询加需要的字段,就行了。
所以前面加这个性别,就是为了让得出的两组数显示具体的性别。而且分组查询中,只有函数和分组能指定字段,前面的基础查询字段必须和分组字段统一,写别的无效。

例子二,根据性别分组,统计男女员工平均年龄
就第三部跟上面不同
上面可以直接count(*)是因为分的组和需要统计的一样,但这里要求平均年龄,聚合函数就是avg,但是不能照搬avg(*),因为分组执行在函数之前,按性别分的组,分出来的只有男女,不是年龄,不能直接求平均值,所以需要自己括号里指定年龄
select  性别  avg(年龄)form  表名  group by  性别。
如果分组是根据年龄,那也就可以直接avg(*),可是并不是,所以需要自己指定到年龄字段。
而且为什么前面基础查询要加性别呢,是因为第八章执行顺序仔细说。说白了,先看不加基础查询字段的sql语句。
select  avg(年龄)form  表名  group by  性别。 那这句sql语句的含义就是:查询这个表,通过性别分组,统计平均年龄。那执行结果就是,分组了没错,统计了没错,但是只有两组数。函数指定的年龄字段不需要在基础查询写出是因为,函数执行在分组之后,它分别统计两个组直接显示就够了,不需要区分开来。
所以基础查询加上性别再看:select  性别  avg(年龄)form  表名  group by  性别。那这句的意思就是,查询这个表的性别(直接解决两组数不显示男女的问题),再以性别分组统计平均年龄。(满足需求)
而且问到了男女员工平均年龄,平均年龄用函数指出来了,那男女就需要在基础查询写出来。而且这个前面的字段,必须和分组字段统一,决定性在分组字段。


!!!!前两个例子是基础,都没涉及到where和having过滤条件,先执行where,让后分组,分组过程中执行聚合函数,聚合分组完执行having。
真正能指定字段的只有函数和分组,前面基础查询字段必须和分组字段统一,基础查询中写其他字段可以执行成功,但毫无意义。
第一个就等于select    性别  form  表名是基础查询。count(*)是聚合函数,记住能不能直接*统计全部,就看分组和聚合函数对应的字段一不一样,如果一样,聚合函数就直接*
第二个的情况就是有时候不一样,以性别分组统计年龄,就必须在聚合函数count后用括号写出具体字段。
并且查询语句中,只有聚合函数和分组能指定字段,比如以性别分组统计平均年龄,性别分组正常写 group by   性别,聚合函数就写avg  平均值(括号里指定字段  年龄  );如果聚合函数和分组对应一个字段,那么分组一样写,聚合函数就可以直接(括号里写*而不用指定字段了)
前面的基础查询部分也会有指定字段,但是这里指定的必须跟着分组走,分组依据什么字段,这里就写什么字段。


例子三,统计年龄小于45岁员工,并且以员工工作地址分组,统计大于等于3个员工的工作地址。
涉及到where和having
第一步,写的是基础查询select  工作地址  from  表名;+where  age<45;+聚合函数count(*);+分组group  by  工作地址。
结论:select  工作地址  count(*) from  表名  where  age<45  group  by  工作地址
因为where条件是第一个生效的过滤,所以不符合条件的,不参与聚合函数和分组与having。可是现在的结论只能体现45岁以上在各地工作员工数量,并不能统计大于3个员工的工作地址。
所以 加上having在基于第一步的结论。选出大于等于三的工作地点。
得出:select  工作地址  count(*) from  表名  where  age<45  group  by  工作地址  having     count(*)>=3
           

                                                  五,排序查询
1,排序查询语法
select  字段列表  form  表名  order  by  字段1  排序方式1,字段2 排序方式2;(order  by就是配置排序查询的固定格式后面指定具体字段名和排序方式)
排序方式有asc:升序 (默认,所以只配置一个升序时也可以不写);desc:降序
而且order  by后面的:字段1 排序方法,字段2 排序方法
他的原理是先对字段1用相应排序,如果没有相同值就结束;但比如年龄相同,有相同值才会采取第二个排序方法,根据其他字段在继续排名之前相同的值。

例子:根据年龄对公司员工进行升序排序,如果年龄相同,就按入职时间降序排序。
select  *  from  表名  order  by  年龄  asc,入职时间  desc;


                                                  六  DQL分页查询

1,分页查询语法
select  字段列表  from  表名  limit   起始索引,查询记录数
注意:起始索引从0开始,起始索引等于(先用查询页数减一),在乘以每页显示记录数。
分页查询类似于数据库的方言,不同数据库命令不同,MySQL中是limit
如果查询的是第一页数据,起始索引可以省略,直接简写为limit  每页显示数量。

例子1:查询第一页员工数据,每页展示10条
select  *  from  表名  limit  0(起始索引,第一页为0,也可以直接省略),10(每页展示条数);
因为是第一页,起始索引可以省略:select  *  from  表名  limit  ,每页展示条数;

例子2:查询第二页员工数据,每页展示10条记录
select  *  form  表名  limit  10(起始索引,通过公式算出为10),10(每页展示数);
用到上面提到的计算起始索引公式得出值为10,每页展示10条,所以10,10。


                                                  七  DQL语句编写案例课

1,查询年龄为20,21,22,23岁女性员工信息
select  *  from  表名    where  性别=’女‘   and  年龄  in(20,21,22,23)


2,查询性别为男,并且年龄在20-40岁(含20,40)并且名字三个字的员工。
select  *  form   表名   where  性别=’男‘and  年龄  between  20  and  40  and  name  like   '_ _ _'


3,统计年龄小于60的男,女员工分别多少人。
select  性别  form  count(*) 表名  where  年龄  <  60  group  by  gender


4,查询所有年龄小于等于35岁员工的姓名和年龄,并对查询结果做升序排序,如果年龄相同按入职时间做降序排序。
select  姓名,年龄  from  表名  where  年龄<=35  order  by  年龄  asc,entrydate  desc;


5,查询性别为男,且年龄在20-40岁(含20,40)以内的前五个员工,对查询结果做按年龄的升序排序,年龄相同按入职时间做降序排序。
select  *  form  表名  where  性别=男  and  年龄 between  20  and  40  order  by  年龄  asc,entrydate  asc  limit  5;

                                                  八  DQL执行顺序
一、编写顺序
1,select  字段列表 通过这一步决定对哪一个或一些字段操作
2,from    指定表,通过这一步决定对那一张表操作
3,where   条件列表,可以用多个逻辑运算符连接多个比较运算符实现多条where条件生效
4,group  by   分组关键字,用来指分组的字段
5,having    分组后的条件列表
6,order  by  排序字段列表,排序关键字
7,limit   MySQL特有的分页关键字,后面写分页参数

但是这些只是编写顺序,并不是sql语句的执行顺序,请看下面详解
举个例子,可能会好奇,根据性别分组,统计男女员工各自数量,要在前面加上性别才能显示具体男女数量
select  count(*)form  表名  group by  性别
到这应该就行了,但是执行完,只显示两组数,并不显示那个是男那个是女。
select  性别  count(*)form  表名  group by  性别
这样在前面加个性别字段,在执行就发现,两组数都显示出了代表的性别,这是为什么呢?为什么在前面加个字段就显示了
是因为执行顺序。

二、执行顺序(只是顺序不同,含义一样就不在细写含义了)
from  表名列表
where   分组和聚合函数前条件列表
group  by  分组关键字
having   分组后的条件列表
select   字段列表
order  by   排序关键字
limit  分页关键字


回到问题,你会发现,select字段列表,写在前面,但生效却在后面。
而且不写它,就等于通过一大堆条件查询数据,只能回报数据
所以要在前面字段列表详细写出字段,就等于查询了这个字段
所以查了字段,在加上算出的数据,一结合就完整了,这就是为什么在前面加字段名就能看出具体性别。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值