重蔚自留地php学习第三十八天——高级数据操作

having子句:having子句也是用来判断条件,与where子句基本一致。

区别

  1. where是对数据源的数据进行操作
  2. having是对临时数据(where操作完,group by操作之后)进行操作

对别名的使用:只有having能够使用,而where只能操作数据源中的原始字段

重蔚自留地php学习第三十八天——高级数据操作

对合计函数的使用:只有having可以,having出现在group by之后,而where在group by之前

重蔚自留地php学习第三十八天——高级数据操作

使用字段别名

重蔚自留地php学习第三十八天——高级数据操作

order by子句:排序,对字段进行排序,使用校对集进行比较

语法:order by 字段 [排序方式],字段 [排序方式],… 默认的是升序排序

重蔚自留地php学习第三十八天——高级数据操作

多字段排序

重蔚自留地php学习第三十八天——高级数据操作

limit子句:限制获取的条数

限制获取数据的位置和数目

语法:limit offset,number

offset:起始位置,偏移量

number:限制的获取记录的数量

简单使用

重蔚自留地php学习第三十八天——高级数据操作

复合使用

重蔚自留地php学习第三十八天——高级数据操作

limit通常用于数据获取的数量控制以及位置控制。

limit用于分页。

联合查询

将表与表之间(或者表内不同的记录)进行纵向的合并

为什么要使用联合查询?

当大数据量存在的时候,一张表往往不够存储。

语法:select语句 union[union选项] select 语句

重蔚自留地php学习第三十八天——高级数据操作

注意

  1. union的使用,要满足两个select语句得到的字段数必须一样

重蔚自留地php学习第三十八天——高级数据操作

  1. union的使用,字段类型可以对应不上,所以数据显示的时候也会对应不上

重蔚自留地php学习第三十八天——高级数据操作

原因:union是对两个select语句的结果进行合并,结果是临时数据(全部都是字符数据,没有数据类型),合并后的结果没有数据类型的概念,全部都是字符串数据。

union选项:与select选项一致,有all和distinct(默认),不管是all还是distinct都是对union之后的最终结果进行操作。

重蔚自留地php学习第三十八天——高级数据操作

在union(联合查询中)如果需要使用order by对语句进行排序,必须使用括号将select语句进行括起来。

(select 语句 order by子句 )

union

(select 语句 order by子句 )

语法正常,却没有实现排序

重蔚自留地php学习第三十八天——高级数据操作

如果在联合查询中想正常使用order by记性排序,必须配合使用limit,但是因为limit使用前不知道表中有多少记录,所以一般limit 后面跟最大值 999999

重蔚自留地php学习第三十八天——高级数据操作

联合查询不仅限于同一张表,多表之间也可以联合,只要保证字段数量一致即可。

连接查询join

将多个表对应的数据进行拼接(在字段上横向进行拼接)。

因为表的存在不是独立的。通过外键进行连接操作。

连接查询:内连接,外连接,自然连接,交叉连接

内连接

记录在两张表都存在,才能够连接成功。

语法:[inner] join

左表 inner join 右表 on 条件

在join关键字左边的表称之为左表

在join关键字右边的表称之为右表

没有连接条件的内连接是一个笛卡尔积(交叉连接)

重蔚自留地php学习第三十八天——高级数据操作

正确的内连接

重蔚自留地php学习第三十八天——高级数据操作

内连接原理

重蔚自留地php学习第三十八天——高级数据操作

正确的内连接语法

重蔚自留地php学习第三十八天——高级数据操作

内连接的使用?

要求两张表组合出数据,要求数据必须要完整的情况下使用内连接。

外连接

跟内连接相似,外连接会将一张表中数据在另外一张表不存在时的记录也给保存下来。

语法:outer join

外连接分为两种:左外连接,右外连接,没有直接的外连接

左外连接:left [outer] join

右外连接:right [outer] join

左外与右外的唯一区别是:以谁为主表,左外连接以左表为主,右外连接以右表为主,但是数据的显示顺序,只跟左右表有关系,跟谁是主表没有任何关系。

重蔚自留地php学习第三十八天——高级数据操作

外连接原理

重蔚自留地php学习第三十八天——高级数据操作

什么时候使用外连接?

想要知道某个表的全部数据,同时还要将对应其他表的数据给显示出来,如果不存在则提示没有。

左右外连接的区别

重蔚自留地php学习第三十八天——高级数据操作

左右区分

重蔚自留地php学习第三十八天——高级数据操作

交叉连接

没有条件的连接,生成一个笛卡尔积

语法:左表 cross join 右表

重蔚自留地php学习第三十八天——高级数据操作

自然连接

自然连接其实就是自动连接,不需要指定连接条件的连接。

语法:左表 natural [left/right/inner]join 右表

如果想使用自然内连接,那么不能使用关键字inner

重蔚自留地php学习第三十八天——高级数据操作

正确使用:不使用inner

重蔚自留地php学习第三十八天——高级数据操作

1.自然连接是自动判断条件,自动寻找两张表里名字相同的字段作为连接条件。

重蔚自留地php学习第三十八天——高级数据操作

2.自然连接在连接之后,会将相同的字段进行合并。

自然外连接:左和右

语法:左表 natural left join 右表

重蔚自留地php学习第三十八天——高级数据操作

语法:左表 natural right join 右表

重蔚自留地php学习第三十八天——高级数据操作

注意:自然连接是主动判断两张表是否有同名字段,如果有多个同名字段,就会将多个字段组合起来进行比较。

重蔚自留地php学习第三十八天——高级数据操作

如何使用内连接和外连接来模拟自然内外连接?

语法:using (字段名) 该字段名指的是在两张表名字相同的字段名

  1. 到连接的两张表找对应的字段
  2. 将第二张表的同名字段给隐藏了(合并)

重蔚自留地php学习第三十八天——高级数据操作

证明自然连接是会用多个同名字段做连接条件

重蔚自留地php学习第三十八天——高级数据操作

报表的时候特别多的应用了连接查询。

子查询

如果一条查询语句中包含另外一条查询语句,那么该被包含的查询语句就称之为子查询。

子查询根据在一条查询语句中出现的位置分为三种

from子查询

where子查询

exists子查询

子查询根据查询返回的结果分为四类:

标量子查询:子查询的结果是一个具体的值(字段的值)

列子查询:子查询的结果得到是某个字段全部或者部分值

行子查询:返回的结果是一张表,一般有多个字段,不管记录数多少,记录数>+1

表子查询:返回的结果是一张表,一般有多个字段,不管记录数多少,记录数>+1

表子查询和行子查询的区别:是两个子查询出现的位置不一样,表子查询出现在from后面,行子查询出现在where后面。

标量子查询

获取PHP1405班的所有学生

  1. 找到班级ID,select id from pro_class where name =‘PHP1405’;
  2. 通过班级ID找学生,select * from pro_student where c_id =‘’;

标量子查询

重蔚自留地php学习第三十八天——高级数据操作

列子查询

获取所有有班级的学生(假设学生表与班级表没有外键约束)

有外键约束:select * from pro_student where c_id is not null

  1. 找出当前存在的班级,select id from pro_class where 1
  2. 找出在当前查询出来的班级ID里存在的所有学生

列子查询

重蔚自留地php学习第三十八天——高级数据操作

any,some和all的使用

any:任意一个

some:任意一些

all:全部

正向使用,都采用肯定形势

重蔚自留地php学习第三十八天——高级数据操作

负向使用,都采用否定形势

重蔚自留地php学习第三十八天——高级数据操作

行子查询

找出班上年龄最大,且身高最高的同学

select * from pro_student order by age desc,height desc limit 1;

缺点是不能保证找出所有的满足条件的信息。

  1. 找出班级里最大的年龄和最高的身高:select max(age),max(height) from pro_student;
  2. 匹配学生的年龄和身高信息。只能通过行子查询

行子查询:通过构建行来进行行比较,如果子查询返回的结果是2个字段,那么就需要构建一个2个字段的行,使用()构建

语法:(字段1,字段2,…) = (行:子查询返回)

重蔚自留地php学习第三十八天——高级数据操作

表子查询

要获取每个班的年龄最小的一个同学

  1. 如何获得每个班的第一个学生,使用按照班级分组
  2. 要在第一步分组之前,先将学生按照年龄升序排序

表子查询

重蔚自留地php学习第三十八天——高级数据操作

exists子查询

判断子查询的结果是否为真

重蔚自留地php学习第三十八天——高级数据操作

视图

视图就是一张虚拟表

视图是有结构但是没数据的表。

语法

create View 视图名字 as select语句

视图本身没有数据,数据的来源全依赖于select语句从各个数据表中获取。

重蔚自留地php学习第三十八天——高级数据操作

上述语句执行之后发生了什么?

  1. 产生了一个结构文件

重蔚自留地php学习第三十八天——高级数据操作

  1. 产生表

重蔚自留地php学习第三十八天——高级数据操作

  1. 会在视图表中产生一条记录,在information_schema库里的VIEWS表里。

重蔚自留地php学习第三十八天——高级数据操作

mysql的语句结束符以及含义

默认是分号:“;”一条语句结束

\g:与分号作用一致

\G:将结果记录按照一个字段一行显示

视图是为了查询数据

如何查看视图?语法:select * from 视图名字,与操作表一样

重蔚自留地php学习第三十八天——高级数据操作

调用视图的原理:select * from student_class_v

  1. 找到视图定义的语句
  2. 找出其中的SQL查询语句
  3. 使用SQL语句进行查询操作

注意:视图的每次调用,都是去执行对应的SQL语句得到结果。

视图的维护

修改视图

语法:alter View 视图名字 as select语句

重蔚自留地php学习第三十八天——高级数据操作

删除视图

语法:drop View 视图名字

重蔚自留地php学习第三十八天——高级数据操作

以上语句做了哪些操作?

  1. 删除表(视图名)
  2. 删除视图结构文件
  3. 删除Views表里的记录

删除视图,并不会对原来的表有任何影响。

视图的数据操作

可以对视图的数据进行更新或者插入

对单表视图进行更新操作

重蔚自留地php学习第三十八天——高级数据操作

对多表视图进行更新操作

重蔚自留地php学习第三十八天——高级数据操作

对单表视图插入数据:视图的字段要么与原表字段一样,要么视图的字段之前的其他字段在对应的表的设计过程中有默认值或者可以为空。

重蔚自留地php学习第三十八天——高级数据操作

对多表视图插入数据:不可以

视图的使用

  1. 可以节省SQL语句的工作量,不用每次都写复杂的SQL语句
  2. 数据安全性,可以将不想给外部看到的表字段给隐藏
  3. 友好性,用户感觉都在操作一张独立的表

以后可以方便的对视图进行权限控制。

视图算法

视图算法指的一个视图在于外部SQL语句组合使用的时候,服务器来处理整个SQL语句的过程中所使用的算法。

视图算法有三种:merge,temptable,undefined

merge:将外部SQL语句与视图的SQL语句进行合并之后,在执行

temptable:先执行视图的SQL语句得到一个临时表,外部SQL语句对该临时表进行操作

undefined:未定义,系统不知道使用哪种,系统会自动去判断使用哪种,这是系统默认的视图算法,通常基于效率考虑,会更多的使用merge来处理。

重蔚自留地php学习第三十八天——高级数据操作

因为以上语句使用了merge算法,导致order by子句被放到了group by子句之后,从而导致数据错乱。

在定义视图的时候,指定算法为temptable。

语法:create view algorithm = temptable 视图名 as select

重蔚自留地php学习第三十八天——高级数据操作

视图算法对比(merge和temptable)

重蔚自留地php学习第三十八天——高级数据操作

本文来自投稿,不代表重蔚自留地立场,如若转载,请注明出处https://www.cwhello.com/10373.html

如有侵犯您的合法权益请发邮件951076433@qq.com联系删除

(0)
重蔚的头像重蔚管理团队
上一篇 2018年10月16日
下一篇 2018年10月18日

相关推荐

  • 关于如何建立数据库。

    建立数据库的过程可以根据不同的需求和数据库类型有所变化。如果你使用的是Access,你可以先创建一个空数据库,然后导入已有的Excel数据,或者新建一个表并定义字段名,如编号、姓名、性别等。接着,用SQL语句或查…

    2024年7月16日
    00
  • 聊聊Android内置SQLite的使用详细介绍。

    Android内置了SQLite数据库,可以通过SQLiteOpenHelper类来创建和操作数据库。 Android内置SQLite的使用详细介绍 SQLite是一个轻量级的数据库,它被广泛应用在各种移动设备上,在Android中,我们可以直接使用SQLite…

    2024年7月9日
    00
  • 重蔚自留地php学习第三十五天——mysql基础1

    文件操作:目录操作,文件操作 目录操作步骤: 准备一个目录(路径) 判断一个路径是否是一个目录 打开目录opendir,返回一个目录资源,包含当前目录下所有的文件 遍历目录资源,循环+readdir,每次获得一个文件名…

    2018年3月26日 PHP自学教程
    0288
  • 教你MySQL如何使用一对多关系创建XML文件。

    在MySQL中,我们可以使用一对多关系创建XML文件,一对多关系是指一个表中的记录可以与另一个表中的多个记录相关联,在这种情况下,我们需要创建一个包含主表和从表数据的XML文件,以下是如何使用一对多关系创建XML…

    2024年6月20日
    00
  • 关于织梦安装错误,织梦程序安装教程。

    织梦程序是一款非常流行的内容管理系统,它可以帮助用户快速搭建网站,在安装过程中,可能会遇到一些错误,本文将详细介绍织梦程序的安装教程,帮助大家顺利安装织梦程序。 一、环境配置 1. 确保你的服务器支持PHP …

    2024年6月30日
    00
  • 小编教你服务器安装mysql。

    在这篇文章中,我们将讨论如何在服务器上安装MySQL,MySQL是一个开源的关系型数据库管理系统,它被广泛用于Web应用程序和大型数据仓库,本文将分为以下几个部分:准备工作、安装MySQL、配置MySQL和优化MySQL性能。 …

    2024年6月20日
    00
  • 关于自建服务器可以用来干什么。

    自建服务器可以用来干什么 随着互联网的普及和发展,越来越多的企业和个人开始关注到服务器的重要性,服务器作为网络的核心设备,承担着存储、处理和传输数据的重要任务,自建服务器可以用来干什么呢?本文将从以下…

    2024年7月6日
    00
  • 教你云服务器数据库使用的方法是什么意思。

    云服务器是一种基于互联网的计算资源共享模式,它可以提供可扩展、高可用、高性能的计算服务。云服务器上的数据库是指在云服务器上运行的数据库,可以通过网络访问。使用云服务器上的数据库,可以实现数据的备份、…

    2024年7月13日
    00

联系我们

QQ:951076433

在线咨询:点击这里给我发消息邮件:951076433@qq.com工作时间:周一至周五,9:30-18:30,节假日休息