MySQL入门 | 二
一.SQL是什么?MySQL是什么?
什么是SQL?SQL(Structured Query Language)是结构化查询语言的缩写,用来访问和操作数据库系统。SQL语句既可以查询数据库中的数据,也可以添加、更新和删除数据库中的数据,还可以对数据库进行管理和维护操作。不同的数据库,都支持SQL,这样,我们通过学习SQL这一种语言,就可以操作各种不同的数据库。–廖雪峰<SQL教程>
MySQL是目前应用最广泛的开源关系数据库(RDBMS)。MySQL最早是由瑞典的MySQL AB公司开发,该公司在2008年被SUN公司收购,紧接着,SUN公司在2009年被Oracle公司收购,所以MySQL最终就变成了Oracle旗下的产品。–廖雪峰<SQL教程>
注意:下面所有sql语句用法都是基于这张students表生成,且基于Mysql这个数据库系统.
二.查询语句
1.基本
查询语句(即select 语句)是用来从一个或多个表中检索信息。为了使用SELECT 检索表数据,必须至少给出两条信息——想选择什么,以及从什么地方选择。现在我们来举个例子,比如我们想从上表中检索name列,也就是筛选出name列进行观看.那么我们将用以下代码
Select name
from students;
结果展示:
我们可以看到在展示区,只出现了name列,也就是我们筛选成功了.Select后面跟我们需要筛选列的名称,如果需要多个列,添加逗号(即
Select name,id,gender).from 后面跟我们筛选列所在的表名
2.去重语句
我们发现gender列中只有M,F两个属性,也就是只有男和女,然后我们现在想筛选gender列,但是不需要每行数据都予以显示,就是我们只想要知道这几个人中有几个性别就行了,重复的数据只需要出现一次.那么这时候我们就需要对我们之前的Select进行改进,如下
Select Distinct gender
From students;
结果如下:
3.前N个语句
现在我们又对这张表有了新的要求,比如我们只想要观察前3行的成绩(注意不是前3名,就列表的前3行),而不是观察所有学生的成绩,这时候又应该怎么操作呢.我们需要添加Limit 语句,如下:
Select score
From students
Limit 3;
输出结果:
当然这里我们也可以指定行数 比如我们想看3,4,5行的成绩这时候我们需要在后面加上offset,先写代码:
Select score
From students
Limit 3 Offset 2;
输出结果:
这里我们对代码解读一下limit后面跟的数据代表我们需要几行数据,3,也就是意味着我们最终需要输出3条数据.后面的Offset则是告诉我们数据从第几行开始取(注意这里行数是从第0行开始计算,第0行也就是我们平常所说的第1行,跟python的语句用法一致),然后取行数的时候是包含了这一起始行的.我们需要第3,4,5行,也就是第3行是起始行,所以offset后面我们跟上了数字2
4.CASE…END判断语句
现在我们考虑这样一种需求,学生成绩是有评分的,大于等于90分的学生是A,小于90分大于等于60分的学生是B, 其余的学生是C,那么我们可以使用 case when 语句实现,写起来也很简单,看看下面的sql语句就知道了!
Select
(Case
when score>=90 then 'A'
when score< 60 then 'C'
when 60<= score < 90 then 'B'
End) as "评分"
from students;
输出结果:
注意一下 这里我们 新增一个语法 as, as 后面跟上自己想要新取的列名,就可以生成新的列.这里我们发现 when 后面跟上我们需要添加的限制条件, then后面跟上在满足此条件下的输出结果.(也就是if函数)
三.筛选语句
1.where用法
现在假设我们需要对列进行筛选,比如我们希望观测到所有大于85分成绩的行,这里我们需要加入where 这个新用法(注意where应该放在From后面)如下:
Select score, name
From students
Where score>85;
输出结果:
需要注意的是如果使用order by 需要将其放在where后面.在SELECT 语句中,数据根据WHERE 子句中指定的搜索条件进行过滤。
2.运算符/通配符/操作符
上图来自<SQL必知必会>
关于通配符:最常使用的通配符是百分号(%)。在搜索串中,%表示任何字符出现任意次数(类似于excel中*)。另一个有用的通配符是下划线(_)。下划线的用途与%一样,但它只匹配单个字符,而不是多个字符(类似于excel中?)。方括号([])通配符用来指定一个字符集,它必须匹配指定位置(通配符的位置)的一个字符。若要使用通配符,我们需要在where句子中间加入 Like,如下
Select *
From students
where name like '%[小大]_'
输出结果:
这里我们解释一下,首先%匹配任意字符且是任意数量,所以0数量也是可以匹配的,然后[]通配符是匹配方括号中任意一个字符,它也只能匹配单个字符,也就是在 小大 2个之间满足任意一个即可(类似于or),最后_匹配任意字符但是数量为1,也就是说[小大]后面必须再跟有任意一个字符才能匹配, 如果name=小, 那么则不成立.
四.分组语句 GROUP BY
1.聚集函数
在讲group by 之前我们先说一下聚集函数.聚集函数就是对某些行运行的函数,计算并返回一个值。
上图来自<SQL必知必会>
我一般的理解也就是sql自带的一些内置函数,可以简单实现一些运算.下面我们对sum函数进行举例:
Select SUM(score) as totalscore
From students
输出:
注意as就是代表我们新增了一列.
2.Group by 分组
现在我们来讲group by 的用法,上面我们已经学会了聚合函数,现在比如我们想知道 所有女生的总分 和 所有男生的总分各是多少,这时候应该怎么操作呢.也就是我们对gender进行了分组,分成了男,女两组,然后在对这个分组后的数据进行求和,代码如下:
Select gender, SUM(score) as totalscore
From students
Group by gender
输出:
3.Having子句
有了上面的分组数据之后,我们希望对分组数据进行筛选.之前我们对已有的列进行筛选用的是where函数,但是在引入group by之后,也就是生成了分组之后,再在分组后面用where函数是不行的,这时候我们需要引入新的函数也就是Having,来替代where的功能.下面还是看例子,比如分组之后,我们希望筛选出总分大于420的性别,这时候我们需要这样操作:
Select gender, SUM(score) as totalscore
From students
Group by gender
Having SUM(score)> 420
输出:
注意:Having的时候需要放在Group by 后面
上图来自<SQL必知必会>
作业
项目一
CREATE TABLE email
(
ID INT NOT NULL PRIMARY KEY,
Email VARCHAR(255)
);
INSERT INTO email VALUES('1','a@b.com');
INSERT INTO email VALUES('2','c@d.com');
INSERT INTO email VALUES('3','a@b.com');
SELECT Email
FROM
email
GROUP BY Email
HAVING COUNT(Email) > 1;
项目二
CREATE TABLE World
(
name VARCHAR(50) NOT NULL,
continent VARCHAR(50) NOT NULL,
area INT NOT NULL,
population INT NOT NULL,
gdp INT NOT NULL
);
INSERT INTO World
VALUES('Afghanistan','Asia',652230,25500100,20343000);
INSERT INTO World
VALUES('Albania','Europe',28748,2831741,12960000);
INSERT INTO World
VALUES('Algeria','Africa',2381741,37100000,188681000);
INSERT INTO World
VALUES('Andorra','Europe',468,78115,3712000);
INSERT INTO World
VALUES('Angola','Africa',1246700,20609294,100990000);
Select name, population, area
From World
Where area > 3000000 Or (population > 25000000 AND gdp > 20000000);