
起因
某日抽烟,产品焦大帅问我,sql难不难学?
焦大帅认为:
1. 分析数据时,每次找开GG调数据太麻烦了,特别是我司开发MM比较多,当成性骚扰就不好了。
2. 产品设计阶段,对数据库的了解,能避免瞎几把设计页面,乱几把提需求,节约沟通成本。
我一直认为,懂技术的产品才是更好的产品。于是果断推荐了两本关于sql的书籍。。。。
当然,现实总是骨感的,焦大帅看了书,并不知道如何下手。当时我就打了鸡血,吹出了牛皮:我来给你写教程,跟着来半小时教会你写查询。
好吧,牛皮是吹出去了,但咱是带把的爷们,不能耸,一个字干!
需求分析
原谅我的习惯,我分析了一下焦大帅的需求,只有一点:暂时只需要会查询就行了。(建表这些与他目前没有毛关系)
那么焦大帅需要知道的:
1. 数据库的概念,表的概念和字段的概念,工具的使用。
2. 简单的查询,条件查询和联表查询(感觉这里就可以满足百分之八十的需求了)
3. 查询模型,后续知识点补充。
基本概念
产品对于excel肯定不陌生,那我们就从它开始,首先看下面的一张excel表和数据库的表:

美女表.png

数据库表.png
图一是excel表,图二是数据库的表,看出什么来了吗?
表: 没错,其实excel的表和数据库的表一个概念,都是用来存储同一类数据的集合,并且是由行和列组成的二维表,表也称实体
列: 姓名(name),等级(level)就是一列,平常叫字段
行: 张柏芝,7,香港,36就是一行(条)数据
主键: id(1,2,3)叫做主键,用来标识表中每一行值,通常用primary key来约束,当然,现在你不用理解primary key的含义,你只需要知道,程序GG建表时,一张表中只会有一个primary key约束,同时它是自动增长的,一般都是用ID字段。跟你在excel中每插入一条信息前面都会自动新增一个ID效果一样。
数据库: 那什么是数据库呢?数据库就是存储表的仓库。
SQL: 专为数据库而建立的操作命令集,结构化查询语言(英语:Structural Query Language)
以上就是一些基本的概念,是不是很简单?下面来介绍一下数据库的安装和辅助工具的使用。
数据库的安装和工具的使用
我这里用mysql做为示例,mac下工具使用sequel pro,windows下可以用navicat for mysql,但它是收费的,就不提供下载址了,聪明的你肯定有办法。
下载地址:
mysql
sequel pro
先安装mysql再安装sequel pro,至于安装过程,这个我觉的没太大必要说了吧。
mysql建议安装5.6版本的,选择dmg格式的。5.7会随机生成一个默认密码。
安装完成后:

连接界面.png
如图,输入相关信息,host:127.0.0.1或者localhost,Username:一般默认用root,Password:安装时填的密码,有时为空。点Connet。连接成功后。如图记住这个界面:

query.png
空白处就是以后要写sql的地方啦,是不是迫不及待了,自已安装来试下吧。选择test数据库,复制下面代码,放在空间处运行看下,具体看动态图:
CREATE TABLE `beauty` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(10) NOT NULL DEFAULT '' COMMENT '姓名', `level` tinyint(4) NOT NULL DEFAULT '0' COMMENT '等级', `province` char(10) NOT NULL DEFAULT '' COMMENT '省份', `age` int(11) NOT NULL COMMENT '年龄',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `beauty` (`id`, `name`, `level`, `province`, `age`)
VALUES
(1,'张伯芝',7,'香港',36),
(2,'林志玲',9,'台湾',42),
(3,'柳岩',8,'湖南',36);

操作图.gif
怎么样?操作完了吗?到这里你已经学会最简单的查询了。下面再深入讲查询。
以下所有的查询语句,符号都要用英文
基本查询和查询模型
还记得上篇最后的练习吗?
select * from beauty;
这就是最简单的查询,我们一起来分析下:
select代表查询的意思。
* 代表查出所有列,也就是字段。
from 后面接要查询的表名。
上面这句话的意思就是,查出beauty表所有的信息。是不是一目了然?
但是我们觉的信息太多了,不想要这么多,只想查出表中所有美女的名字和等级
那么我们要怎么来思考并写出语句呢?这里我给出一个思维模型。写语句前我们先问自己两个问题:
我要查询那张表?
我需要什么信息(字段或者说列)
想明白了吗?好,我们跟着这思路来:
select 列1,列2,...列n from 表名我要查的表是beauty,想查出的名字(name)和等级(level)。那么套进去,语句如下:
select name,level from beauty;运行一下,是不是出现自己想要的结果了?趁热我们再来一句:
我们现在想查出表中所有美女的名字,年纪和等级
想一想,我们怎么来做?练习一下吧。
where子句
这时,是不是有疑问了?为什么都是查出所有的行?我们只想查出一行信息怎么查呢?那我们把上面的模型更新一下:
select 列1,列2,...列n from 表名 where 列 运算符 值;
where接的就是要查询的条件。
比如:我们要查出第二行所有信息,那么语句如下:
select * from beauty where id = 2;运行一下,是不是已经把第二条信息查出来了?那我们来介绍下运算符有什么?
= 等于
<> 不等于
> 大于
< 小于
= 大于等于
<= 小于等于
直接试验吧:
查出名字是张柏芝的所有信息。
查出id大于2的所有信息。
试着写下吧。
where子句之模糊查询
记得google搜索查询东西吗?所有的条件都是不准确的,但信息我们依然能搜索出来,他是怎么做到的?
我们可以在where字句中使用like关键字,它主要是用于检索与特定字符串匹配的数据,我们来试下:
1.现在我们要查询出名字中包含玲的所有信息:
select * from beauty where name linke '%玲%'结果如何?%我们叫做通配符,必须被单引号括起来。通配符的作用就是在通配符的位置配备任意字符。上面这语句的意思就是,不管前后,只要包含玲就查出来。
但是通配符除了%号还有其他的,试着google下:
查出都有些什么通配符?
试着每个通配符都用下,看看效果。
where之IN子句
是不是觉得where字句很有意思?现在我们有一个需求:
假设,beauty里有一千条美女的数据,而我们只需要筛选出其中几条不连续ID的(必需ID为1,99,199)的数据,怎么办呢?
按照上面我们学习的东西,如果要查出来,我们是不是的写三条
select * from beauty where id = 1;
select * from beauty where id = 99;
select * from beauty where id = 199;是不是感觉特别费劲?有没有发现一个规律?前面语句都一样只是后面的ID不同?要是能把ID都包含起来就好了。IN 子句的意思就包含,试下查询出beauty 表中id 为1,和3的数据:
select * from beauty where id in(1,3)IN除了可以写具体值,还有包含一条其他的查询语句。不过这个后面在说。对了,不要忘记加逗号。
where之复合查询
不知你有没有发现,前面的where都只讲了一个条件,要是我们有多个条件呢?比如:查询等级为7,且年龄等于36的美女名字。怎么办?我们来试下下面语句:
select name from beauty where level = 7 and age = 36执行结果如何?在查询条件中,多个条件可以使用逻辑运算符连接。上面语句and 就逻辑运算符。总共有三:
and ,not,or
分别查下是什么意思?并且写写试试。
统计函数
现在来个比较好玩儿的,身为产品,是不是经常要统计一些平均值,总数量之类的?哈,先来一个例子吧:
计算出等级的平均值。
思路依旧如上,只是在列上要加点小东西,先认识一下:
count()计算行数
avg()求平均函数
sum()求总和
min()求最小
max() 求最大
有疑惑先放着,跟着来,我们查的表(beauty),要查出的字段(level),语句如下:
select level from beauty;要查出平均值,函数为avg(),只需加在需要的列上,如下:
select avg(level) from beauty;结果出来了吧?接下来,查一查下面的:
查出等级的总和。
查出表里有多少行。
order by子句
学了统计函数调节下胃口,现在来学习下排序:
首先我们先查出所有信息,然后突然想按照等级给他们排序下,怎么办?
执行下面这语句试下:
select * from beauty order by level如果想倒着来呢?试着在level后再加个desc试下。
练完后,换一下 desc 和 asc都试下,有没有发现什么?

↓点击下方「阅读原文」查看更多精彩文章

