12 MYSQL进阶

代码强化

select 列名1,列名2 .. from 表名           我们之前说的查询表指定列的语句

比如对students表,我们可以select students.id,students.name from students;(代表students的属性。用点连接,当然不如省略)

其实我们也可以给表起名而让上句得到简写,select s.id,s.name from students as s;

图1

比如我们现实students的性别列如上,如果我们想得到不重复的结果显示怎么办呢

图2

使用select distinct 列名 from 表名;   去重效果如上

我们也可以在distinct后加多列,所有唯一组合会显示在结果上

where比较运算

图3

我们查询(或更新或删除)后面可以接where 条件

条件判断有如上图几种

比较运算符

图4

等于=      (和python不一样,用一个=)

小于<              大于>      小于等于<=        大于等于>=      不等于!= 或<>   (没有><)

代码例子如上图,

我们还可以玩select * from students where id%2=0;查询偶数号信息

select * from students where id%2;也会查询奇数信息和python有点像

where逻辑运算

图5

与或非and or not 和python一样

我们写语句需要注意的是where a<5 and >1;这种是错误的,必须写全成where a<5 and a>1;

我们也支持python的连式where 1<a<5;

where模糊查询

我们之前使用的都是条件查询,现在我们使用like实现模糊查询,有点类似正则匹配

图6

使用like %表示任意多个字符串(可以是0个),_表示任意一个字符(匹配必须全部内容)

where范围查询

图7

in 指定数量内容 如 where id in (1,2,3);  (只能用小括号)

where x between a and b;表示x在[a,b]的连续区间

同理判断不在范围可以用where a not in (x,xx,xxx);

where a not  between A and B;

where空值判断

我们有的数据如果没有设置非空或主键,那可能会有Null值,不管他本来占据字符串或者数值类型,他是个专门的类型,不等于‘’空字符串

图8

我们可以使用where 列名 is null;判断为空

使用where 列名 is not null;判断非空                

这里我们还可以使用where 列名;(注意类比判断非空没有where not 列名)

order by排序

图9

常见order by 列名 asc|desc;(asc升序,desc降序)  

如果表示升序可以直接order by 列名;

按多组列名排序order by 列名1 asc|desc, 列名2 asc|desc...;  优先按照列1的排序,然后相同的依次按照后续列名内容排列

聚合函数

图10

用于统计,如求平均,最值,求和,数量(默认是不统计NULL,若想统计,需要使用ifnull函数对null值做转换),聚合函数不允许嵌套

图11

select count(列名) from 表名;    统计数量

select max(列名) from 表名;     求该列最大值

select min(列名) from 表名;     求该列最小值

select sum(列名) from 表名;     对该列求和

select avg(列名) from 表名;     求该列平均值

可以和之前的where嵌套,如统计男生人数select count(gender) from students where gender='男';

还可以使用一定程度的组合(非嵌套)如统计平均年龄不用avg

select sum(age)/count(*) from students;

我们这里顺带学习下round函数,round(a,b)把数值a四舍五入,保留小数点后b位,和python一样,

上式求小数点后一位可以写成select round(sum(age)/count(*),1) from students;


group分组

图12

分组,将数据集划分为多干小区域

图13

GROUP BY

图14
图15

如上图,我们可以显示gender列的几个出现过的值显示出来

select gender from students group by gender; (select distinct gender from students效果一样)

如果我们select * from students group by gender;会提示错误(select 后面的内容只能是group by后面出现过或者聚合函数使用过)

group by 还可以和聚合函数结合,比如我们想显示按性别分组后各组的人数:

select gender,count(*) from students group by gender;

更多和where组合,比如获得男女性别的最大年龄:

select gender,max(age) from students where gender in ('男','女') group by gender;


group_concat()+group by  拼接

图16

我们可以通过select gender ,avg(age) from students group by gender;实现按性别分组的平均年龄

图17

如果我们想查询平均值超过三十的性别呢,这时候就需要进一步加条件筛选了,这里我们需要明确的是,where条件是查询的同时进行筛选,而group by是在查询完后进行的分组,如果我们想对分组的结果进行条件筛选,就不能再多用一个where了,而是用having

图18

如上图select gender,avg(age) from students group by gender having avg(age)>30;

最后avg(age)是图17的一个字段,所以我们要把它来和30比较

with rollup统计汇总

图19

比如我们统计性别分组的数量最后加上with rollup会在最后一行多了一个名称null,参数值为总和的数据

select gender,count(*) from students group by gender with rollup;


最后记得分组的字段要出现在select后面


LIMIT限制记录

图20

limit限制取出记录的数量,而且要写在sql语句最后

limit 起始索引,记录条数              (0位默认第一条,起始索引和逗号省略的情况下默认是0)   

如上图取出前三条数据

省略起始索引即select * from students limit 3;

图21

所以我们就有了如上的一般查询写法


分页查询

就是上节limit显示的继续

比如我们每2行显示一页select * from students limit 2;

下一页select * from students limit 2,2;

再下一页select * from students limit 4,2;

会得到通项第p页,select * from students limit 2*(p-1),2;但是我们实际使用不能用算式写上面

需要根据p给出具体的数值

select * from 表名 limit m*(p-1),m;        来实现每页m项第p页显示(需要根据p给出具体的数值)


连接查询

图22

使用场景,比如实际项目中,经常多张表,可能需要从多张表共同检索出一些信息,就需要使用连接查询

图23

连接查询有3种,1内连接,两个表匹配的交集部分(通过查找2表相同字段)

2右外连接,两个表的交集和右表特有的数据(数据结构字段以右表基准)

3左外连接,两个表的交集和左表特有的数据(数据结构字段以左表基准)

对于2,3不存在的字段值自动使用null填充

图24

内连接

我们之前有表格students 16行数据7列;

图25

还有表classes数据3行2列

图26

我们使用select * from students inner join classes; 就会发现生成了48行数据9列数据,为什么是这种效果呢?我们看下图

图27

我们使用第一行小明的数据去匹配3次classes数据,其他行同理,最终A inner join B的效果就是A的字段加上B的字段,然后A的行数×B的行数的新表格

我们把2个表的每个数据都互相做关联成为笛卡尔积

图28

之前的48行数据显然不是我们最终想要的,比如我们想把students的cls_id和classes的id对应上,写如上代码select * from students inner join classes where students.cls_id=classes.id;

图29

再比如我们想只获得人名和班级名,可以使用如上代码

select students.name,classes.name from students inner join classes where students.cls_id=classes.id;

其实内连接的where条件的where可以替换为on

图30

比如我们想获得学生所有信息,班级的名字使用

select students.*,classes.name from students inner join classes on students.cls_id = classes.id;

图31

比如我们想获得所有信息按班级名id排序

select * from students inner join classes on students.cls_id = classes.id order by classes.id;

图32

比如我们想按班级id排序再按学号id排序

select * from students inner join classes on studens.cls_id = classes.id order by classes.id,students.id;


外连接

外连接分为左外连接和右外连接

左外连接

主表 left join 从表

图33

一张图用于解释,我们通过cls_id和id匹配,左外连接就会把对应到相同的部分连接起来,没有id匹配到的用null填充

右外连接

从表 right join 主表 on 连接条件 (从表没有对应的内容要填null)

图34

如上图8序号没有对应,需要从表填充null

图35

比如我们students表cls_id有3,4,5,我们使用左外连接会出现上图的几个null

select * from students left join classes on students.cls_id = classes.id;

最后我们分析下,我们学了几种连接,我们什么情况下使用什么连接呢,如果获得2个表都有的信息部分使用内连接,我们想保留左表全部信息,就使用左外连接,同理保留右表使用右外连接


自连接查询(了解)

自连接,表自己和自己连接查询

图36

如上表,存储所有的省市县,aid为其实际id,pid为其父id,比如4广州市属于广东省,那pid就是1

图37

我们想准备如上数据,需要从视频获得一个sql文件,先创建表格结构

图38

这个sql文件并没有创建语句,只是一堆插入,所以我们之前需要创建表结构

图39

我们进入mysql命令行,可以很LOW的复制粘贴如上sql内容,,但是我们有更简便的方法,

输入source areas.sql  (不用加逗号),即实现了数据的导入(和我们之前的mysql命令行以外的导入不一样语句)

创建完毕,我们可以统计一共多少个省

select count(*) from areas where pid is null;

如果我们想查询山西省的所有城市

select city.* from areas city inner join areas province on city.pid = province.aid where province.artitle='山西省';

这里我们使用了对重复使用同一个表的不同重命名


子查询

图40
图41

一个查询里又嵌入了一个查询,前者为主查询,后者为子查询

图42

子查询分三类,标量子查询,列子查询,行子查询

标量子查询

图43

我们查询结果是个标量,即一行一列的数据是个值,比如上图子查询avg(age)就得到一个值,值就可以判断等于或者比较

列子查询

图44

返回的是一列数据,子查询就是单独差一列,如上图返回列的话就可以in

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350

推荐阅读更多精彩内容

  • 1.数据库简介 人类在进化的过程中,创造了数字、文字、符号等来进行数据的记录,但是承受着认知能力和创造能力的提升,...
    大熊_7d48阅读 517评论 0 1
  • 目录 一、查询准备 二、条件查询 三、排序 四、聚合函数 五、分组 六、分页 七、连接查询 八、自关联 九、子查询...
    梦里才是真阅读 565评论 0 3
  • -- 基本查询 -- 查询所有字段 -- select * from 表名; select * from stud...
    pure璞嵘阅读 2,006评论 0 2
  • 数据库分类 关系型数据库库:Relational Database Management System (RDBM...
    Stay_Hungry_Fly阅读 617评论 0 0
  • ”自私"和"爱自己"不是近义词,是反义词。 自私的人恐惧、焦虑、贪婪、嫉妒、控制、抓取……他们有永远填不满的欲望。...
    宇宙的女儿妮子阅读 428评论 0 5