适用产品同学的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;


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

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值