您所在的位置:首页 > 新闻中心 > 联合查询,分页查询
公司要闻
联合查询,分页查询
发布时间:2020-04-02 17:45
访问量:359

一、 子查询的定义
出现在其他语句中的select语句,称为子查询或者内查询,外部的查询语句称为主查询或者外查询,子查询可以包含普通select可以包含的任何语句。
外部查询:select、insert、update、delete、set等,主要就是在select的应用。
二、 子查询的分类
1.按照子查询出现的位置
①select后面:仅仅支持标量子查询
②from后面:支持表子查询
③where或having后面:支持标量子查询、列子查询、行子查询
④exist后:表子查询
2.结果集的行列数
①标量子查询:结果集一行一列
②列子查询:结果一列多行
③行子查询:一行多列
④表子查询:多行多列
3.子查询的特点
①子查放在小括号内
②子查询一般放在条件右侧
③标量子查询,一般搭配着单行操作符使用[> < >= <= = <>]
④列子查询,一般搭配着多行操作符使用[in、any/some、all]
⑤子查询的执行优先于主查询执行,主查询的条件用到了子查询的结果
澳门新濠天地,3.select后面,仅仅支持标量子查询
澳门新濠天地 1
4.from后面:支持表子查询
其查询结果可以比作一张表,必须给表起别名
澳门新濠天地 2
5.where或having后面
①支持标量子查询、行子查询、列子查询
②in、any、all的理解
in:等于列表中的任意一个,如:a [10,30,60,80,100],a等于5个数中的任意一个,等价于=any
not in:列表中的任意一个都不等于,如a[10,20,30,40,50] a 不等于其中任何一个,等价于<>all
any/some:和子查询返回的某一个值进行比较,<any表示小于任意一个,等价于<max(字段名)
all:和子查询的所有值进行比较,<all表示小于所有的,等价于<min(字段名)
③标量子查询
澳门新濠天地 3
④列子查询(一行多列)
澳门新濠天地 4
⑤行子查询(一行多列)
澳门新濠天地 5
6.exists后面
语法:exists(完整的查询语句),结果为0或者1
澳门新濠天地 6
三、 分页查询
由于数据量较大,一页显示不完整,需要分页查询。
1.基本语法:
Select 查询列表 from 表1
[连接类型 join 表2
on 连接条件
where 筛选条件
group by 分组字段
having 分组后筛选
order by 排序字段
limit 分组条件]
2.limit特点
①放在查询语句的最后面
②limit [index,] size index开始的下标,size每页显示的条目数,省略初始位置,默认为0
③公式:limit (page-1)*size,size;page是要显示的页数
澳门新濠天地 7
四、 联合查询(union)
union: 将多条查询语句的结果合并成一个结果
基本语法:查询语句1 union 查询语句2 union 查询语句3...
基本应用:要查询的结果来自于多个表,且多个表没有直接联系,查询的信息内容一致
①多条查询语句字段数目一致
②要求每一列的类型和顺序尽量一致
③union关键之默认去重,union all可以包含重复项
澳门新濠天地 8

一.外键(foreign key)

外键用于记录表之间的联系
外面的键(键不在自己表中):如果有一张表中有一个字段(非主键)指向另外一张表的主键,那么将该字段称之为外键
(一张表可以有多个外键)

1.增加外键

  • 创建表时候增加外键:
    foreign key(外键字段) reference 外部表 (主键字段);
  • 在新增表之后增加外键:
    alter table 表名 add [constraint 外键名字] foreign key(外键字段) reference 父表(主键字段);

澳门新濠天地 9

创建表时候增加外键

澳门新濠天地 10

在新增表之后增加外键

2.修改外键&&删除外键

外键不能修改,只能删除后新增

删除外键
alter table 表名 drop foreign key 外键名;

一张表中可以有多个外键,但名字不能相同

澳门新濠天地 11

删除外键

外键删除不能通过查看表结构体现,应该通过查看表创建语句查看

3.外键作用

  • 澳门新濠天地娱乐场,1.对父表

对父表的约束:父表数据进行写操作(删和改:都必须涉及到主键本身),如果对应的主键在子表中已经被数据引用,那么不允许操作。

  • 2.对子表(外键字段所在的表)

约束子表数据操作:子表数据进行写操作的时候,如果对应的外键字段在父表中找不到对应的匹配——操作失败

4.外键条件

(1)外键要存在:首先必须保证表的存储引擎innodb,如果不是innodb存储引擎,那么外键可以创建成功但是没有约束效果
(2)外键字段的字段类型(列类型)必须与父类的主键类型完全一致
(3)一张表中的外键名不能重复
(4)增加外键的字段(数据已经存在),必须保证数据与父表主键要求对应

5.外键约束

针对父表的约束

  • district:严格模式(默认的),父表不能删除或者更新一个已经被子表数据引用的记录
  • cascade:级联模式:对父表操作,子表关联的数据也跟着操作
  • set null:置空模式:父表的操作之后,子表对应的数据(外键字段)被置空。

约束模式:删除的时候子表置空,更新的时候子表级联操作指定模式的语法

foreign key(外键字段) references 父表(主键字段) on delete set null on update cascade;

删除置空的前提条件:外键字段允许为空(如果不满足条件,外键无法创建)

mysql查询语句(mysql学习笔记七),

Sql语句

一般顺序GHOL : group by,having ,order by,limit

    如果是分组,应该使用对分组字段进行排序的group by语法

                    Limit start ,length

                   去除重复记录默认为all

Select distinct 字段  from

Select distinct * from 没用(所有字段组合不相同才认为不相同,用在这里基本没用),记录值完全一样时取其一个

Union查询

把两个select 结果union起来

( select 语句1)union(select 语句2)

澳门新濠天地 12

选出英语最高分和数学最高分的学生的id,name ,class

澳门新濠天地 13

澳门新濠天地 14

注意加括号

有重复记录时的合并

按english由高到低和由低到高的结果合并

澳门新濠天地 15

澳门新濠天地 16

澳门新濠天地 17

在符合语句中 order by功能受影响,需加上limit

澳门新濠天地 18

澳门新濠天地 19

子语句的排序

1.将子语句包裹在子括号内

2.子语句的 order by

 中有order by配合Limit使用时才生效。

原因是:union在做子语句时,会对没有limit的order by优化(忽略)

所有结果排序

只需要在最后一个select语句后增加相应排序即可。

子语句括号非必须最后一个排序默认针对所有结果。

Union检索的字段必须个数一样(否者出错),数据类型也一样(发生类型转换) 列名由第一个select检索列名来定

子查询

语句内部的查询语句

表中数据

澳门新濠天地 20

查出英语成绩最高的学生的信息

不用子查询:

澳门新濠天地 21

 

但有2个学生英语成绩最高且一致,这个时候在不知道表里数据的情况下就不能使用这种查询方法

   思路:先找出英语成绩最大的那个值,再找出哪些学生的英语成绩与这个最大的值相等。这样一步一步进行查询。

 澳门新濠天地 22

澳门新濠天地 23

只检索一个字段时可以作为一个值使用,必须只检索一个字段

澳门新濠天地 24

澳门新濠天地 25

子查询分类

不同的分类会有不同的使用方式

分类标准:

子查询出现的位置

子查询的返回值形式

  返回值分类:

   单一值,单列,多列,多行多列(表)

澳门新濠天地 26

出现位置:

Where 型,where 后

From型  from后

Exists型

澳门新濠天地 27

澳门新濠天地 28

使用:

标量的:获得一个值后用关系运算符进行运算(> >=,< <= = <> )

列子查询(只是1列):获得一列通常是对个行的一列值(一个集合)

 使用in,not in运算符

澳门新濠天地 29

查出班级为php101中所有学生的信息

澳门新濠天地 30

澳门新濠天地 31

集合操作符还有

Any(集合)  集合中的任意一个

=any(集合) 等于集合中的任意一个即可

等同于in

=All(集合) 集合中的所有元素

!=all(集合) 不等于集合中的所有元素等同于Not in

澳门新濠天地 32

澳门新濠天地 33

!=any(集合) 不等于集合中的任意一个元素成立即可,即为只要不等于其中的一个元素即为成立的。

澳门新濠天地 34

注意:这种语法不该出现在实际开发中

Some(集合) 集合中的一些

语法上与any一样

总结:

=any  等同于in

!=all 等同于 not  in

Some 和any同义

All,any ,some可以使用除了=,!=之外运算符,比in强大

返回一行

在参与比较时,使用括号可以构建一行

(field1,field2,…)

表中数据

澳门新濠天地 35

现在要查询出和贺8在同样的班级且与他math成绩一样的同学的信息

澳门新濠天地 36

子查询

澳门新濠天地 37

 

澳门新濠天地 38

返回一个表

如果用在from子句内,要求要是一个表

现在是查询结果,必须给这个查询结果起别名

 表中数据

澳门新濠天地 39

查询php103班 english不及格的学生信息

澳门新濠天地 40

必须有别名

澳门新濠天地 41

Exists

如果子查询可以返回数据则返回真,否者返回假

有以下2表

A表 

澳门新濠天地 42

B表

澳门新濠天地 43

在a中查询出id在 b中有的记录

澳门新濠天地 44

澳门新濠天地 45

先获取a表的第一行记录,在子查询中判断a表的id与b表的id比较

连接查询

Join

澳门新濠天地 46

每个实体,一个表

一个业务逻辑,使用多个实体的数据

多张表应该在一起使用,将多个表的记录连接起来

澳门新濠天地 47

Teacher表

澳门新濠天地 48

Teacher_class1表

澳门新濠天地 49

查出代课老师的代课信息

澳门新濠天地 50

澳门新濠天地 51

 

澳门新濠天地 52

澳门新濠天地 53

 

澳门新濠天地 54

 

笛卡尔(交叉)连接

澳门新濠天地 55

澳门新濠天地 56

内连接处理

在连接时,是可以省略连接条件的。意味着,所有的左表数据,都要与右表的记录做一个连接

共存在m*n个连接

称之为交叉连接或笛卡尔集

此时可以使用 cross join代替inner join

Mysql中cross join与inner join相同

Inner join是默认的连接方式(inner 省略)

澳门新濠天地 57

等效的

也可使用

澳门新濠天地 58

表示笛卡尔积

澳门新濠天地 59

结果虽然一样

On数据连接条件

Where数据过滤条件

但 where是先连接成笛卡尔积

然后做筛选,而on 是在连接时就判断

澳门新濠天地 60

澳门新濠天地 61

上表是连接条件2个

下表是 

过滤条件2个

澳门新濠天地 62

 

 

 

下表连接过滤各一个

澳门新濠天地 63

澳门新濠天地 64

Using:要求负责连接的两个实体之间字段名称一致。

澳门新濠天地 65

查询条件与外连接通用 外连接不能用where作为连接条件。

注意:

无论是连接条件还是连接查询多字段列表,都没必要一定要写表名.字段语法,是否写取决于是否发生冲突。建议写上。

别名

  表应该别名,保证简洁清晰。

列别名

澳门新濠天地 66

 

澳门新濠天地 67

外连接:

分类

左外连接

右外连接

全外连接(暂不支持)

左连接

在连接时,如果出现左边表,数据连接不到右边表的情况,则左表的数据在最终结果内保留。而如果出现右表的数据连接不到左标的情况,右表数据被丢弃。

澳门新濠天地 68

澳门新濠天地 69

由于内连接没有左右连接之分,left outer join中outer可以省略。

在外连接中不可以用where做连接条件可用on ,using

表别名可以用在连接条件里,但字段别名不可以。

澳门新濠天地 70

表起别名后,在筛选或者连接条件里必须用别名,原名不能用了

左表teacher里的数据孙武连接不上也保留。

澳门新濠天地 71

澳门新濠天地 72

全外连接左外与右外 union(取并集)

内连接是左外右外交集

Using会去掉结果中重复字段,并放在列首

外连接不能使用没有条件的连接(不像内连接那样形成笛卡尔积)

自然连接

通过mysql自己判断完成连接过程。不需要指定连接条件,mysql会使用多表内相同的字段作为连接条件。

表one数据

澳门新濠天地 73

Two表数据

澳门新濠天地 74

澳门新濠天地 75

 

自然连接也有内外之分

内:natural join

外:左外natural left join ,右外 natural right join

澳门新濠天地 76

澳门新濠天地 77

 

Sql 语句 一般顺序GHOL : group by,having ,order by,limit 如果是分组,应该使用对分组字段进行排序的 group by 语法...

二、联合查询

联合查询:将多次查询(多条select语句),在记录上次进行拼接(字段不会增加)

基本语法:多条select语句构成:每一条select语句获取的字段数必须严格一致(但是字段类型无关)

select 语句1 union [union选项] select 语句2……

union选项

  • all:保留所有
  • distinct:去重(默认的)

澳门新濠天地 78

默认去重

联合查询只要求字段数一样,跟数据类型无关

澳门新濠天地 79

联合查询

1.联合查询的意义

(1)查询同一张表,但是需求不同 eg:查询学生信息,男生身高升序,女生身高降序

(2)多表查询:多张表的结构是完全一样的,保存的数据结构也是一样的。

2.联合查询order by的使用

在联合查询中order by不能直接使用,需要对查询语句使用括号
若要order by生效必须搭配limit;用limit限制显示数量

澳门新濠天地 80

联合查询的应用

三、子查询(sub query)

子查询:就是一个select查询是另一个查询的附属(一条select语句内部包含了另一条select语句)

1.子查询分类

  • 按位置分类:子查询(select语句)在外部查询(select语句)中出现的位置
    • from子查询:子查询跟在from之后
    • where子查询:子查询出现where条件中
    • exists子查询:子查询出现在exists里面

判断某些条件是否满足(跨表),exists是接在where之后
exists返回结果只有0和1。

澳门新濠天地 81

exists子查询

澳门新濠天地 82

exists子查询

  • 按结果查询:根据子查询得到的数据进行分类
    • 标量子查询:子查询得到的结果是一行一列

澳门新濠天地 83

标量子查询

  • 列子查询:子查询得到的结果是一列多行

列子查询返回的结果为一列多行,需要使用in作为条件匹配
还有几个类似的条件:all,some,any

all:就是全部 ,使用时需要在前面加"="
any:就和in是一样的,在使用的时候需要在前面加"="或者"!="
any和some是一样的,即:any==some

澳门新濠天地 84

列子查询

澳门新濠天地 85

all,some,any

  • 行子查询:子查询得到的结果是多行多列(多列一行)

澳门新濠天地 86

行子查询

(以上几个出现位置是在where之后)

  • 表子查询:子查询得到的结果是多行多列(出现位置是在from之后)

澳门新濠天地 87

表子查询