您的位置 首页 > 数码极客

‘sql如何设置范围’sql设置日期范围!

对产品岗的同学来说,现在越来越多的企业开始要求我们熟练掌握sql语句,尤其是一些数据产品经理,一些招聘的硬性要求就是要懂sql。我个人对这种现象的看法还好,懂一些基本的sql查询,对于数据服务部门或者研发同学是大大节省了时间,而且能力是自己的,学了又不吃亏。

SQL的基本理解


学习之前,我们可以简单地理解一下sql的基本定义。首先sql的定义就是结构化查询语言,不要看它的功能很强大,但基本语法和操作很简洁,基本上接近英语口语,学习起来还是比较容易的。

我们日常和研发同学沟通的时候,常常会听到‘表’这样一个概念。基本上数据和业务属性都会存储在一张张的表里。用常用的视角来定义下这些概念就很好理解:

一个数据库就类似一个excel文件;
数据库中的一张表可以理解成excel文件中的一张sheet表;
字段或者标题可以理解成sheet中的列表头;

SQL基本书写规则


1. 一条sql语句可以写成多行,要以分号(;)结尾,分号标志着一条sql语句结束;

2. sql语句不区分大小写;

3. 单词间以空格分隔;

4. 字符串用单引号括起来;

5. 查询时间用形如 '2021-12-30 23:59:59' 或者 '2021-12-30' 的格式;


SQl基本使用场景


查看表结构:
在查询数据之前,我们大概看下表结构,提前知晓下自己所能查找的数据

show create table tablename;

确定数据来源:

from 关键字后面可以跟一张“表”,表示我们要查的数据的来源。这里说的“表”可以是数据库已经存在的普通表,例如

from shop_login_log;

也可以是由一条sql查出来的“结果集”,这种放在from后面的临时结果集可以称为“派生表”。派生表要用小括号()包裹,表示一个整体,例如

select * from (select * from shop_login_log);


筛选列
select column1, column2, ... 选取指定列。如果想取全部字段,可以用*星号表示,不推荐使用,尽量写明指定列,例如, select * from ...
自定义列
例如在结果集第一列显示今天的日期:

select '2022-01-01', app_id from shop_login_log;

select 子句也可以对列加以各种函数处理,变成自己想要的样式例如在显示买家的时候加上前缀称呼:

select concat(login_date,' ',login_hour) from shop_login_log;

当想要查的数据没有数据来源时,可以只需要select 关键字例如想计算1+1的值:select 1+1;例如想查看当前时间:select now();


筛选行
where 关键字的作用就是筛选出符合条件的行;例如只查看卖家是华为旗舰店:where app_id = 1
where 后面跟的筛选条件可以是各种条件的组合,只有整个where的筛选条件都满足记录才能被筛选出来。常见的条件有 - 算术运符(加减乘除) - 比较运算符(>大于、<小于、<>不等于) - 逻辑运算符(and并且、or或者、not 否定),and运算符比or运算符的优先级高,所以注意用小括号来表示逻辑先后顺序例如 where status = '已签收' and (saler = '华为旗舰店' or saler = '荣耀旗舰店');


在查找字符串类型的数据时,有时候不确定具体值是多少,那么可以使用 like 来表示模糊搜索例如找出商品充电宝:where sku like '%充电宝%';表中有些字段的值可能是空的,空或者不空,可以用 is null 和 is not null 来表示(= null 或者 <> null 都是错的)例如找出创建时间为空的订单:where order_created is null;当我们想要范围查询时,可以用between and 来限定范围;和 >= and <= 等价例如查找价格在1000 到 3000 之间的商品:where total_pay_fee between 1000 and 3000;等价于:where total_pay_fee >=1000 and total_pay_fee <=3000;


对结果集排序
order by 按照指定字段顺序对结果集进行排序,desc 表示倒序,asc 表示正序(默认)例如按照下单时间倒序展示订购记录:

select * from vas_order order by order_created desc;

order by 还可以指定多个字段来排序,每个字段都可以指定排序方向。排序规则是先按第一个字段排序,第一个字段值相同的情况下,再按第二个字段排序例如按应用id正排序,付款金额倒排序:

select app_id, total_pay_fee from vas_order order by app_id, total_pay_fee desc;


对结果集去重

去除结果集中重复的行
例如查看某个店铺哪些天登录过:

select distinct login_date from shop_login_log where app_id = 1 and shop_id=30530;


复杂查询

常用的复杂查询会涉及到子查询(in , exists)、表关联(join)、表联合(union);涉及到两个或多个表来源时,可以使用关键字as定义表别名 来区分每个表,as 关键字也可以省略,表别名的作用有两点:表名太长时,用表别名更方便;有时候两个表有同名的字段,用 **表别名.字段名** 可以表示字段是属于哪个表的。
最后给大家举两个例子作为结尾

电商场景举例:
‘登录查询’
要求:某一个店铺的 首次登录时间,最晚登录时间,登录天数

select min(login_date), max(login_date), count(distinct login_date) from shop_login_log where app_id = 1 and shop_id=30530;


‘所有用户或者某一些店铺的 首次登录时间,最晚登录时间,登录天数’

select shop_id, min(login_date), max(login_date), count(distinct login_date) from shop_login_log where app_id = 1 -- and shop_id in (30530,860140) group by shop_id;


某段时间范围内,每一种登陆客户端的登录次数统计,并按登录次数倒排序

select client_type, count(*) from shop_login_log where app_id = 1 and login_date>='2021-11-01' and login_date<'2021-12-01' group by client_type order by count(*) desc;


我是红尘,我们下期见!
公众号:都市摆渡人

责任编辑: 鲁达

1.内容基于多重复合算法人工智能语言模型创作,旨在以深度学习研究为目的传播信息知识,内容观点与本网站无关,反馈举报请
2.仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证;
3.本站属于非营利性站点无毒无广告,请读者放心使用!

“sql如何设置范围,sql设置日期范围,sql设置取值范围,sql如何设置默认值,sql如何设置自增,sql如何设置约束”边界阅读