美文网首页
mysql 联合查询 day5 (2019.4.27)

mysql 联合查询 day5 (2019.4.27)

作者: 满天繁星_28c5 | 来源:发表于2019-04-27 18:31 被阅读0次

    一、联合查询

    1.使用场景

    当数据量比较大的时候,我们一般有可能将数据表拆开存储。这种拆分是由一定原则的,所有的拆分出来的表在表结构上完全一致,除了表名不一致,表名称也是按照一定的规则进行命名的,比如说以数字结尾。我们如若要查询某个时间段所有的短信信息。就不能依靠一个表去查询,而是将所有表结果组合起来作为最终的结果。
    如果说有一种新的情况,我们查询的是同一张表,但是查询的排序方式不一样。比如说我希望男生按照身高升序排列,女生按照身高降序排列。
    像这种最终结果是多个结果的物理组合,我们就可以使用联合查询。

    2.基本语法:

    select 语句1
    union [union选项]
    select 语句2;
    注意:如果是在不同的表查询,那么的字段和查询的字段顺序一定要一致,否则无法进行物理喷【拼接。
    union选项:
    all:所有的数据,默认是也是all
    distinct:去除重复数据,取出数据重复一定是按照查询出来的字段 进行比较,如果字段的内容为null,忽略你不进行比较。


    image.png

    3.联合查询结果集排序

    如果查询的第二个语句中具有排序:
    看图说话:如果查询语句后面的子句中具有排序,那么整个查询结果会按照后面的排序进行。


    image.png

    解决办法:
    加(),起别名,重复一次查询:


    image.png

    二、连接查询

    数据库的表一般指保存一方面的内容,包括类实体的信息,比如学生表只保存学生的信息,老师表只保存老师的信息。班级表只保存班级的信息。我们有时候需要查询不同数据表中的内容。这种情况我们可以将多张表建立联系一起查询,这种查询称为连接查询。
    问题:如何去查询已经知道学生姓名的学生所在班级的位置和老师的姓名。
    学生表A


    QQ截图20190427182222.jpg

    select 班级.位置,teacher.name from a,b,c,d,e where a.sid=e.sid and c.tid=e.tid and b.cid=d.cid and c.tid=d.tid and a.name=’值’;
    连接查询的基本语法:
    左表 join 右表
    左表:左边的表,写在左边的表。
    右表:右边的表,写在右边的表。

    连接查询的分类:
    SQL中将连接查询分为四类:
    内连接,外链接,自然连接,交叉连接。
    需求:查询一下某个学生的所有班级信息。

    1.交叉连接

    cross join:交叉连接。
    原理:从第一张表中取出一条数据,然后与第二张表中的每一条数据进行匹配(无条件匹配),每一条结果都会保留,连接之后的字段也会保留。
    这种结果叫笛卡尔积。
    基本语法:
    左表 cross join 右表。


    image.png
    image.png

    看图说话:
    cross join 与没有where的多表查询结果是一样的,都是笛卡尔积查询。

    2.内连接

    内连接 :[ inner] join;
    从左表中取出一条记录,去与右表中的每一条记录进行匹配,匹配的结果必须是某个条件在左表中与在右表中相同再回最终保留这条匹配结果。
    基本语法:左表 【inner 】 join 右边 on 左表.字段 = 右表.字段
    on表示连接条件。左表的字段与右表的字段表示相同的业务意义。


    image.png
    image.png

    当两个表右相同字段的时候:


    image.png
    select a.name as aname ,b.name as bname  from class as a innern join my_student1 as b; 
    

    当出现重复字段,或者表的名称比较长度额时候,可以对表字段以及表的名称起别名。

    如果内连接也没有on条件:
    相当于进行笛卡尔积运算。可以适应where条件代替on条件。


    image.png
    image.png

    但是尽量不要使用where,因为从实现机制上on的速率要高于where。

    3.外链接

    外链接:以某张表为准,取出表中的所有字段然后与另一张表中的每一条记录进行匹配,不管能不能匹配上连接条件,最终都会保存。如果能够匹配上匹配条件,正确保存,如果不能匹配,那另一张表的字段全部为null值。
    外链接有两种:以某个表作为准,那个表作为主表进行关联。主表的字段都是有值得。
    左外连接(左连接):left join 以左表为主表
    右外连接(右连接):right join 以右表为主表
    基本语法:
    左表 left/right join 右表 on 左表.字段 = 右表.字段;

    image.png
    image.png

    4.自然连接

    自然连接:natural join :自动连接,自动匹配连接条件。
    系统以字段的名称作为匹配的条件(同名的字段作为连接条件,多个同名字段都会作为条件)


    image.png

    因为ID与class都是共同的字段,所以能够匹配到的结果只有一条数据。

    自然连接与内连接:
    本质上自然连接与内连接是相同的,只不过自然连接是系统自动匹配相同字段作为连接条件,而内连接是使用指定的字段作为连接条件。

    自然连接与外链接:
    自然连接在匹配的时候是使用完全匹配的方式,只有匹配成功才会保留,而外链接不管是否匹配成功都会保留自己的数据部分,没有匹配成功的部分值为 null、

    三、php 操作MySQL基本原理

    PHP本身是不能操作MySQL的。但是PHP具有扩展可以操作MySQL。
    mysql扩展:面向过程的,全部是函数形式的。以及在PHP7之后全部弃用


    image.png

    mysqli扩展:面向对象+面向过程。又函数的实现方式也有类的实现方式。可以选用任何方式。
    PDO扩展:纯面向对象的方式,只能使用类实现。
    PHP操作MySQL的扩展已经在装环境的时候已经启用了。可以使用PHPinfo查看一下。
    当PHP来操作MySQL的时候,相对于MySQL来说,PHP就是一个MySQL的客户端。

    1.MySQL天龙八步:

    1)连接MySQL数据库

    数据库的连接:返回的是一个数据的链接资源。


    image.png

    如果连接信息是错误的:


    image.png
    image.png
    PHP连接MySQL的基本语法:

    mysqli_connect(主机包括端口号(端口号可以省略),数据库用户名,数据库密码);


    image.png
    同时在mysqli扩展至还有一个函数能够实现数据库的连接,mysqkli_real_connect

    mysqli_real_connect 操作的必须是一个mysqli对象。也就是必须是经过mysqli_init()初始化以及mysqli_options()设置完参数的mysqli对象。而且mysqli_real_connect 返回的是一个布尔值。表示是否已经能够连接上MySQL数据库。


    image.png

    如果参数错误的话(用户名或者密码错误)


    image.png

    2)判断是否连接成功

    判断数据库是否连接成功。连接失败的情况下打印出错误信息。


    image.png

    3)选择数据库

    保证数据库的连接之后需要选择对应的数据库进行操作。

    use database_name;
    
    image.png

    选择数据库的返回值是bool类型。所以也要进行一次判断。


    image.png

    当选则数数据库不存在的时候:


    image.png

    4)设置字符集

    set names gbk;
    

    5)准备SQL语句

    $sql = ‘select * from student’;
    

    6)发送执行SQL语句

    image.png

    mysqli_query 返回的结果又三种情况:
    bool值true:这种结果表示SQL语句没有错误,同时SQL语句执行没有返回结果。


    image.png

    bool值false:这种返回值表示SQL语句的语法是错误的。


    image.png
    resource 结构的对象:SQL语句操作的返回值是结果集。主要是增删改查。
    image.png

    7)处理结果集

    PHP是没有办法解析数据库返回的结果集的。只能依靠mysqli 提供的一系列函数
    mysqli_fetch系列函数:
    mysqli_fetch_row()
    mysqli_fetch_array()
    mysqli_fetch_assoc()
    mysqli_fetch_all()


    image.png

    当需要处理结果的时候一般都是查询结果,更新,删除,插入的结构是没有必要进行处理的。

    image.png

    需要注意的是,这个系列的函数每次只会处理结果集中的一条数据。也就是说要想全部处理所有的结果集。最好的办法是使用循环匹配。


    image.png

    使用循环匹配结果集:


    image.png
    mysqli_fetch_array():返回的是关联数组与索引数组的组合。
    image.png
    可以使用第二个参数设置返回值的类型:有三种

    MYSQLI_ASSOC:返回的是关联数组
    MYSQLI_NUM:返回的是索引数组
    MYSQLI_BOTH:默认值,返回的是关联数组与索引数组


    image.png
    mysqli_fetch_assoc():直接获取关联数组
    image.png
    mysqli_fetch_row():直接获取索引数组
    image.png
    但是最终不管是哪种fetch,当指针移动到最后的时候,返回的结果都是null。也就是没有匹配到数据。
    image.png
    当指针移动到数据的最后的之后,如果还想对结果在进行一次操作,需要重置指针位置。可以使用函数mysqli_data_seek().
    image.png

    8)释放资源,关闭数据库

    mysql资源一般不需要释放。因为MySQL的资源是伴随着脚本的整个执行过程的。而且脚本的执行过程一般都比较快。但是由于并发等服务器原因,还是要尽可能的进行处理。


    image.png

    2.PHP操作MySQL增删改查

    从计算机的角度来说增删改是写,查是读操作。

    1)写操作

    写操作又分为两种,增加操作是一种,删改是一种。
    新增操作:通常新增加的数据我们需要获取插入的ID号,也就是自增ID,一般使用mysqli_insert_id()获取,这样可以直接获取到上调数据插入的ID。如果没有ID的值或者0 表示没有插入。


    image.png

    删改操作:通常删除和修改操作没有办法通过结果来判断执行的成功或者失败。因为对于mysqli_query()来说。返回值TRUE 只是表示SQL语句没有错误。FALSE表示的是SQL语句有问题。那么可以通过受影响的行数来判断SQL是否执行成功。也就是使用mysqli_affected_rows()函数获取上一次执行过程受影响的函数。当然对于新增的操作来说,这个函数也是可以返回的,但是没法获取到插入的ID号。


    image.png
    2)读操作
    读操作比较简单就是select操作。如操作使用上面提到过的函数进行结果集的处理。

    相关文章

      网友评论

          本文标题:mysql 联合查询 day5 (2019.4.27)

          本文链接:https://www.haomeiwen.com/subject/fwaknqtx.html