山山未迟

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

image

 

回顾

列属性:注释和唯一键

关系:一对一,多对一,多对多

范式:规范数据表设计的方式

外键:外键约束(严格,置空,级联)

高级数据操作:增删改查

查询操作

完整语法

select select选项 表达式 from子句 where子句 group by子句 having子句 order by子句 limit子句

group by分组

分组语法

group by就是根据某个条件对数据进行分组。

语法:group by 字段

clip_image002

分组之后,会对数据进行取第一条。

分组主要是用来进行数据统计。

统计函数

(分组统计函数)

max:求最大值

min:最小值

avg:平均值

count:总记录数,如果使用count(*)那么是统计记录数,如果count(字段)其实也是统计记录数,如果改字段某个值为null,那么不统计。

sum:求和

clip_image004

count不统计为空的字段(以字段为统计单位)

clip_image006

分组统计原理

clip_image008

group_concat:将分组统计中的某个字段的所有数据进行连接操作

clip_image010

多字段分组

group by字段1,字段2….

clip_image012

分组排序

语法:group by 字段 [asc|desc]

clip_image014

回溯统计

注:能理解就去花时间

系统根据分组的情况,逐层向上回溯,最终直到顶层。

语法:在所有的分组字段之后使用 with rollup;

clip_image016

having子句

having子句与where子句一样,都是用于条件判断的。

区别1

where是判断数据从磁盘读入内存的时候

having是判断分组统计之前的所有条件

clip_image018

区别原理

clip_image020

区别2

having子句中可以使用字段别名,而where不能使用

clip_image022

区别3

having能够使用统计函数,但是where不能使用

clip_image024

order by子句

排序子句,对对应的字段进行排序。排序依赖校对集。

语法

order by 字段 [asc|desc];

clip_image026

多字段排序

order by 字段 [asc|desc],字段2 [asc|desc];

clip_image028

limit子句

limit的基本使用用于限制数据的访问量。

clip_image030

limit标准使用语法

limit offset,length;

从指定位置(offset)开始,获取对应长度(length)条记录

clip_image032

limit的应用:分页

分页必须知道的条件:页码,每页显示的数据长度

length:长度

offset:(页码 – 1) * length 开始位置

联合查询

联合查询:将多个查询的结果,进行纵向的联合,而不改变字段数,只改变记录数。

语法

select 语句

union union选项

select 语句

union选项:与select选项完全一致,union选项默认的是distinct(去重)

clip_image034

注意

1. union使用的时候,必须保证多条查询语句之间的字段数要求一致

clip_image036

2. union使用的时候,没有数据的类型的概念,只有列数相同的概念。

clip_image038

union意义

1. 合并不同表的数据(数据量太大,导致一张表存不下),往往是用于数据的统计

2. 对同一张表进行数据的不同形式的展示。

需求:将学生表中1班的学生按照年龄升序排序,2班的学生按照年龄降序排序

order by使用

(select 语句 order by子句)

union

(select 语句 order by 子句);

clip_image039

clip_image040在union中使用order by必须搭配limit

(select 语句 order by子句 limit子句)

union

(select 语句 order by 子句 limit子句);

clip_image042

需求:

1. 获取1班的所有学生

select * from student where c_id = 1;

2. 获取1班的所有学生,还要获取对应的班级信息

3. select * from student as s left join class c on s.c_id = c.id where c_id = 1;

连接查询

连接查询:将两个表中的数据,进行字段上的拼接,字段数一定会增加。

连接查询分为几类:内连接,外连接,交叉连接,自然连接

连接关键字:join

左表:join关键字左边的表是左表

右表:join关键字右边的表是右表

交叉连接

select * from 表1,表2;

clip_image044

交叉连接:cross join

clip_image046

交叉连接得到的结果是笛卡尔积,所以应该尽量避免笛卡尔积出现。

内连接

内连接:左表中出现的数据,在右表中也同样存在,那么记录保存,如果不存在就不需要该记录。

语法:

l_table [inner] join r_table on 连接条件

没有连接条件的内连接

clip_image048

内连接

clip_image050

内连接原理

clip_image052

内连接的条件匹配可以使用where,on可以用where代替

clip_image054

外连接

外连接:以某一张表为主表,拿着表中的所有记录去另外的一张表中匹配,如果匹配成功,保留全部记录,如果匹配失败,那么未匹配成功的字段全部置空。

语法:

左(外)连接:左表为主表,右表为副表,l_table left [out] join r_table on 连接条件

右(外)连接:右表为主表,左表为副表,l_table right [out] join r_table on 连接条件

左连接

clip_image056

右连接

clip_image058

左连接转右连接

clip_image060

需求:获取学生以及对应的班级信息,要求只获取1班的所有的学生

clip_image062

自然连接

自然连接:在连接表的时候,不需要指定连接条件,系统自动匹配。

自然连接包括:自然内连接,自然外连接

语法:

l_table natural [left/right] join r_table;

clip_image064

自然内连接

修改student表的name字段之后

clip_image066

自然连接在匹配之后,只会保留一个同名字段(保留的是左表)

自然外连接

clip_image068

内连接和外连接模拟自然连接:使用同名字段作为连接条件,并且合并同名字段。

语法:using(字段列表)

内连接模拟

clip_image070

外连接模拟

clip_image072

using模拟多字段自然连接

clip_image074

注意:实际项目开发中,需求上的满足通常是使用内连接和外连接,很少使用自然连接和交叉连接。

多表连接:与两张表完全一样

A join B on A.字段 = B.字段 join C on A.字段 = C.字段 …

clip_image076

需求:

1. 查出所有1班的学生;

select * from student where c_id =1;

2. 查出所有PHP141115班的学生

解决方案1:select * from student s left join class c on s.c_id = c.id where c.name = ‘PHP141115’;

解决方案2:

找出php141115对应的班级id:select id from class where name = ‘PHP141115’;

通过id找出所有该班级学生:select * from student where id = ?;

posted on 2016-04-20 22:26  山山未迟  阅读(363)  评论(0编辑  收藏  举报