zoukankan      html  css  js  c++  java
  • 20150103--SQL连接查询+视图-01

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

  • 相关阅读:
    SqlServer禁用启用触发器、外键约束
    解决Windows Server2008R2中导入Excel不能使用Jet 4.0
    C#读写配置文件
    C#后台如何获取客户端访问系统型号
    Flex在Win10,Chrome浏览器上汉字乱码的问题
    flex lineChart 显示所有的数据节点
    HTTP状态码大全
    zabbix使用sendEmail发送邮件报警
    zabbix安装
    Samba服务器搭建配置
  • 原文地址:https://www.cnblogs.com/lifushan/p/5414759.html
Copyright © 2011-2022 走看看