码迷,mamicode.com
首页 > 数据库 > 详细

20150103--SQL连接查询+视图-01

时间:2016-04-20 23:44:47      阅读:342      评论:0      收藏:0      [点我收藏+]

标签:

技术分享

 

回顾

列属性:注释和唯一键

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

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

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

高级数据操作:增删改查

查询操作

完整语法

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

group by分组

分组语法

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

语法:group by 字段

技术分享

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

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

统计函数

(分组统计函数)

max:求最大值

min:最小值

avg:平均值

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

sum:求和

技术分享

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

技术分享

分组统计原理

技术分享

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

技术分享

多字段分组

group by字段1,字段2….

技术分享

分组排序

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

技术分享

回溯统计

注:能理解就去花时间

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

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

技术分享

having子句

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

区别1

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

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

技术分享

区别原理

技术分享

区别2

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

技术分享

区别3

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

技术分享

order by子句

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

语法

order by 字段 [asc|desc];

技术分享

多字段排序

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

技术分享

limit子句

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

技术分享

limit标准使用语法

limit offset,length;

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

技术分享

limit的应用:分页

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

length:长度

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

联合查询

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

语法

select 语句

union union选项

select 语句

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

技术分享

注意

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

技术分享

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

技术分享

union意义

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

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

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

order by使用

(select 语句 order by子句)

union

(select 语句 order by 子句);

技术分享

技术分享在union中使用order by必须搭配limit

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

union

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

技术分享

需求:

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;

技术分享

交叉连接:cross join

技术分享

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

内连接

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

语法:

l_table [inner] join r_table on 连接条件

没有连接条件的内连接

技术分享

内连接

技术分享

内连接原理

技术分享

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

技术分享

外连接

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

语法:

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

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

左连接

技术分享

右连接

技术分享

左连接转右连接

技术分享

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

技术分享

自然连接

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

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

语法:

l_table natural [left/right] join r_table;

技术分享

自然内连接

修改student表的name字段之后

技术分享

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

自然外连接

技术分享

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

语法:using(字段列表)

内连接模拟

技术分享

外连接模拟

技术分享

using模拟多字段自然连接

技术分享

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

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

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

技术分享

需求:

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 = ?;

20150103--SQL连接查询+视图-01

标签:

原文地址:http://www.cnblogs.com/lifushan/p/5414759.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!