作为一名产品经理,在日常工作中会经常面临查问题、查数据、分析数据的事情,奈何我经历的每个研发团队手里的事情都很多、很杂,一方面自己想要的数据不能即时拿到,另一方面也会给我们的研发大佬们增加工作上的负担。基于这样的考虑,我们作为产品经理也就有必要掌握一些基本的数据库查询语句(SQL-DQL)来为产品和研发的工作赋能减重,完成产品的自我救赎,实现获取数据的“小康生活”。那么,在接下来的两到三篇文章我们着重就SQL中的查询语句做一个梳理和分享。大家不要慌,SQL查询相关没有那么恐怖,只要连接好数据库,保证一小时上手,满满的成就感。那我们进入正题~
概述

1. 什么是数据库:英文Data Base,简称DB。顾名思义就是存储数据的仓库,是按照一定格式存储数据的一些文件的组合,其基本单元是表(table)。
2. 什么是数据库管理系统:英文Data Base Managment system,简称DBMS。是专门用来管理数据库中数据的,可以对数据进行增删改查。常见的数据库管理系统有:Mysql、Oracle、MS、Sql Server、DB2、Sybase等
3. 什么是SQL:英文Structured Query Language,简称。是一种结构化语言,是关系型数据库管理系统处理数据的标准语言,可以通过数据库管理系统对数据库和数据进行增删改查操作。
4. 他们之间的关系是什么:数据库管理系统通过执行SQL语句来实现对数据库的增删改查的操作,即:
DBMS——执行——>SQL——操作——>DB
补充:数据库的基本单元是表(table),任何一张表都有行(row,即数据/记录)、列(column,即字段)。每个字段都有字段名、数据类型、约束等属性
SQL的分类
SQL语句有很多种类型,分为DQL、DML、DDL、TCL、DCL。
DQL:数据查询语言,是对数据库的数据通过语句进行查询,凡是带有select关键字的都是查询DQL。
DML:数据操作语言,是通过语句对表中的数据(行row)进行增(insert)删(delete)改(update)的都是DML。
DDL:数据定义语言,是通过语句对表中的结构(列column)进行增(create)删(drop)改(alter)的都是DDL。
TCL:事务控制语言,主要是包括事务的提交(commit)及事务的回滚(rollback)。
DCL:数据控制语言,主要是对数据进行授权(grant)、撤销权限(revoke)...
其中DQL(数据查询语言)是我想分享的重点,毕竟产品经理在平常工作中查询居多,其他的类型我们就不做过多赘述了。
select 语句
select 语句用于从数据库中选取数据。结果被存储在一个结果表中,称为结果集。
语法:
select 字段名 from 表名;
其中select和from都是关键字,字段名和表名都是标识符,“;”是SQL语句的结尾。如果要查询多个字段名则在字段名和字段名之间加“,”,如果要查询表中的所有字段,则可以直接用“*”表示( * 表示全部)。注意:SQL语句中不区分大小写。
示例:
select
column_name1,column_name2
from
table_name;
select
*
from
table_name;
where 条件查询
where 条件查询
where是SQL中的关键字,是对表中的数据进行按照条件查询,用于提取那些满足指定条件的记录。而不需要将所有数据都查出来。
语法:
select 字段名 from 表名 where 条件;
一般where的条件运算符:
注意:
1. 在一条SQL语句中既有and,也有or时,过滤条件会优先过滤and,再过滤or,如果要先过滤or,需要在or的条件中添加小括号。
2. 通配符说明:
%为替代 0 个或多个字符,如找出名字中包含“小”的:where name like ’%小%’。
_为替代一个字符,如找出名字中第三个字是“小”的:where name like ’_ _小’。
3. Null,是空值,没有任何值,要和0做区分。
4. 在SQL中使用单引号来环绕文本值(大部分数据库系统也接受双引号),如果是数值字段,请不要使用引号。条件查询的条件值同样适用于该规则。
order by 排序
order by是SQL中的关键字,是用于对结果集进行排序,其可以用于对结果集按照一个列或者多个列进行排序,默认按照升序对记录进行排序。如果需要按照降序对记录进行排序,可以使用 DESC 关键字。当然如果要指定升序也可以使用ASC关键字。
如果需要多个字段排序,则使用“,”隔开,此时,排序按照多个字段从左往右的优先级依次排序。
语法:
select 字段名 from 表名 where 条件 order by 字段名 desc|asc;
示例:
select
column_name1,column_name2,column_name3
from
table_name
where
age > 20
order by
column_name1,column_name2
desc;
翻译:
从table_name中找到年龄大于20的column_name1,column_name2,column_name3,然后按照column_name1进行降序排列,如果两条数据的column_name1一样,则按照column_name2对这两条相同的数据进行排序。
函数
SQL中拥有很多可用于计数和计算的内建函数,分为单行处理函数和多行处理函数
1. 单行处理函数(Scalar):基于输入值,返回一个单一的值,对数据一条一条的处理,处理多少条,返回多少条。与其相对的是多行处理函数。
2. 多行处理函数(Aggregate):计算从列中取得的值,返回一个单一的值,对多条数据进行一次处理,最终输出一条数据。多行处理函数也称为分组函数。
注意:
1. 多行处理函数在执行的时候会自动忽略null,无需像单行处理函数一样需要对null进行处理。
2. 多行处理函数不能直接使用在where子句中,原因是在执行where关键字时还没有对数据进行分组,未分组的情况下使用多行处理函数会报错。(和SQL的关键字执行顺序有关系。)
3. 因为多行处理函数最终只能输出一条数据,所以所有的分组函数可以组合起来一起用。
group by 分组查询
group by分组查询时根据一个或多个列对结果集进行分组,分组函数在使用时必须先进行分组,然后才能使用。如果没有对数据进行分组,整张表默认为一组。group by支持多个字段同时分组,多个字段之间用“,”隔开。
语法:
select 字段名 from 表名 where 条件 group by 字段名;
示例:
select
column_name1,column_name2,sum(column_name3)
from
table_name
where
age > 20
group by
column_name1,column_name2;
注意:
在一条SQL语句中,如果有group by关键字的话,select后只能跟[参加分组的字段]、[分组函数],其他的字段不能加入,加入也没有任何意义。
having 子句
在 SQL 中增加 HAVING 子句原因是,WHERE 关键字无法与聚合函数一起使用。having子句可以对分完组的数据进行进一步筛选过滤,having 子句不能单独使用,必须和group by联合使用。一般在SQL语句中如果可以用where进行过滤的尽量先使用where,having的使用一般是对where的过滤进行辅助过滤,最好不用。
语法:
select 字段名 from 表名 where 条件 group by 字段名 having 条件;
示例:
select
column_name1,column_name2,avg(column_name3)
from
table_name
where
age > 20
group by
column_name1
having
avg(age) > 50;
综合
综合来看下语法:
select 字段名 from 表名 where 条件 group by 字段名 having 条件 order by 字段名 desc|asc;
以上关键字的执行顺序为:
第一步:from
第二步:where
第三步:group by
第四步:having
第五步:select
第六步:order by
即:from某张表中经过where条件进行过滤,然后根据某些字段进行group by分组,如果条件不够,再经过having过滤一些,然后查询出数据,最后根据字段进行排序。
OK,以上内容为单表查询的内容,下一篇介绍分享多表连接查询。期间我有表述不清楚的或者有问题的大家可以一起讨论,感谢大家,大家一起进步~