mysql 联合查询 day5 (2019.4.27)

一、联合查询

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操作。如操作使用上面提到过的函数进行结果集的处理。
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,425评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,058评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,186评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,848评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,249评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,554评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,830评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,536评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,239评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,505评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,004评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,346评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,999评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,060评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,821评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,574评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,480评论 2 267

推荐阅读更多精彩内容

  • MYSQL 基础知识 1 MySQL数据库概要 2 简单MySQL环境 3 数据的存储和获取 4 MySQL基本操...
    Kingtester阅读 7,648评论 5 116
  • 今天看到一位朋友写的mysql笔记总结,觉得写的很详细很用心,这里转载一下,供大家参考下,也希望大家能关注他原文地...
    信仰与初衷阅读 4,699评论 0 30
  • MySQL数据库 课程目标:1.如何使用MySQL数据库,主要是讲解基本的语法2.如何设计数据库? 第一章 数据库...
    我爱开发阅读 1,271评论 1 4
  • MySQL技术内幕:SQL编程 姜承尧 第1章 SQL编程 >> B是由MySQL创始人之一Monty分支的一个版...
    沉默剑士阅读 2,355评论 0 3
  • 天气愈发凉了,路边法国梧桐的树叶也变得金黄。一场雨打下来,地上便铺了一层金黄的树叶。阴冷潮湿的天气,随风纷...
    梧桐听雨00阅读 229评论 0 0