php学习day12---数据库(4)数据表的连接查询,子查询和联合查询
今天依然学习了数据表的相关操作,这章主要讲的就是数据表的查询。
一、连接查询
1.基本概念
我们学习连接查询,就要先了解连接查询的概念,那到底什么是连接查询呢?连接查询就是将两个或两个以上的白,连接起来,当做一个数据源,并从中获取所需要的数据。
到底怎么样连接呢?其实就是将两个表的每一行数据对接起来,每次对接的结果就是连接之后的一行数据。
进行连接查询之后:
当然上面没有连接条件的连接,也可以写成以下几种:
select * from 表1,表2;
select * from 表1 join 表2;
select * from 表1 cross join 表2;
以上的连接都可以叫做交叉连接;
2.基本形式
连接的基本形式是:
表1 [连接形式] join 表2 [on 连接条件];
如果是3个表,则可以进一步扩展为:
表1 [连接形式] join 表2 [on 连接条件] [连接形式] join 表3 [on 连接条件]
3.连接的分类
连接的根据连接形式的不同可以分为以下几类:
交叉连接
也就是刚才上面距离的那种连接,它没有条件只是按照连接的基本概念进行连接,将所有可能出现的行全部两两相互组成行,也称为“笛卡尔积”;
对于表1(有n个字段,m行),表2(x个字段,y行)那他们交叉连接的结果就是:有n+x个字段,m*y行;
内连接
形式: select * from 表1 inner join 表2 on 连接条件;
注意:没有条件的内连接就是交叉连接;
我们再查询的时候,一定要注意,查出来的数据要有意义,我们的内连接其目的就是帮我们在多个表中寻找出有意义的数据;
以上表中的数据,info.id = n.id是被称作“连接条件的”,它基本上就是我们之前所学的“外键关系的一种描述”。
注意:
这种的表跟表之间的内连接查询,虽然可以体现为表跟表之间的关系连接——外键关系——但并不是有外键关系才能使用这种连接。
另外也可以使用as取别名。
左外连接
形式:表1(左表) left join 表2(右表) on 连接条件
含义:其实就是将两个表的内连接的结果,再加上左边表的不符合内连接所设定的条件的那些数据的结果选择出来;
右外连接
形式:表1(左表) right join 表2(右表) on 连接条件
含义:就是将连个表的内连接结果,再加上右边表的不符合内连接所设定的条件的那些数据的结果选择出来;
全外连接
形式:mysql 不支持全连接的语法;
含义:两个表的内连接结果,再加上两表中都不符合条件的部分所得出的数据结果。
为了更好的理解连接查询,我们多举几个例子:
二、子查询
1.基本含义
一个select语句就是一个查询语句:
select 字段或者表达式 from 数据源 where XX为判断条件
所谓的子查询,就是在一个查询语句的内部的某些位置又出现的查询语句。同常,子查询是为了主查询而服务的,都是子查询获得结果之后,才会去执行主查询。
子查询的方式:
select 字段||表达式||子查询 [as 别名] from 表明||连接结果||子查询 where 字段||表达式||子查询
以上写 子查询 的位置都可以出现子查询;
子查询按使用位置可以分为:
--作为主查询的结果数据
select c, (select f1 from tabe2)as f11 from tab1;这里的子查询应该只有一个数据。
--作为主查询的数据源
select c from (select f1 form tab2)这里的子查询应该有多个数据。
--作为主查询的条件数据
select c from tab1 where c in(select f1 from tab2) 在这里子查询可以是多个数据。
2.常见的子查询
比较运算符中的子查询
形式: 操作数 比较运算符 (标量子查询)
说明: 操作数,就是一个字段名;
举例:select .... from XXX where id > 5;
找出商品的最高价格:
select * from product where price = (select max(price) from product);
使用in的子查询
形式: XX in (子查询列表);
举例:
select * from product where protype_id in (select protype_id from product_type where protype_name like "%电%");
使用any的子查询
形式: 操作数 比较运算符 any (列子查询);
含义:当某个字段 对于该列子查询的其中任意一个值,满足该比较运算符,则就算是满足条件了,即:只要有一个值满足,则就满足。
举例:
表1
id | age |
1 | 18 |
2 | 19 |
5 | 26 |
13 | 22 |
表2
id | name |
1 | 小红 |
2 | 小花 |
6 | 小草 |
9 | 小明 |
表达式 select * from tab1 where id >any (select id from tab2 where id<6);
则可以输出的结果为:
id | age |
2 | 19 |
5 | 26 |
13 | 22 |
使用all的子查询
形式: 操作数 比较运算符 all (列子查询)
含义: 当某个字段对于该列子查询的所有数据值,都满足该比较运算符,才算满足了条件,即要求全部满足,才算满足;
举例:
表1
id | age |
1 | 18 |
2 | 19 |
5 | 26 |
13 | 22 |
表2
id | name |
1 | 小红 |
2 | 小花 |
6 | 小草 |
9 | 小明 |
表达式: select * from tab1 where id < any (select id from tab2 where id>2);
输出结果为:
id | age |
1 | 18 |
2 | 19 |
5 | 26 |
使用some 子查询
some 是any的同义词,用法与any相同
使用exists查询
形式: where exists(子查询)
含义:该子查询如果“有数据”,则exists的结果是true,否则就是false;
说明:因为,exists子查询的该含义,会造成主查询往往出现全部都取出,或全部不取出 的情况;
在实际应用中,该子查询,往往都不是独立的子查询,而是会需要跟“主查询”的数据源,建立某种关心--通常就是连接关系。建立的方式是“隐士的”,即没有在代码上体现关系,但却在内部有其连接的实质。
连接方式通常就体现在子查询的where条件语句中,使用了主查询表中的数据;
注意:
这种查询语句没有办法独立运行,而是必须跟主查询一起使用;
该子查询中的条件,应该设定为跟主查询的某个字段一顶的关联性判断,通常该判断就是这两个表的“本来就该有的连接条件”;
如果一个查询需求,可以使用连接查询,也可以使用子查询,我们通常是推荐使用连接查询的,这样的效率会更高;
三、联合查询
在mysql手册中,将连接查询翻译为联合查询(join),而联合查询(union)没有明显的翻译;在通常的文章中,join被翻译为连接查询;union才被翻译为联合查询;
1.基本概念
将两个具有相同字段数量的查询语句的结果,以上下堆叠的方式合并为一个查询结果
两个select 语句的查询结果的字段数必须一致,也应该让两个查询语句的字段类型也保持一致,也可以联合更多的查询结果;
2.语法形式
select 语句1 union [all || distinct] select 语句2;
联合查询的语句,默认会“自动消除重复行”,默认为distinct,如果想要将所有的数据显示,就用all,这里,用all才具有意义;
3.细节注意
应该将这个联合查询的结果理解为最终为一个表格数据,且默认使用第一个select 语句中的字段名;
默认情况下,order by子句和limit 子句只能对整个联合之后的结果进行排序 select.....union select......order by xxx limit m,n;
如果第一个select语句中的列有别名,则order by子句中就必须使用别名。
使用联合查询来实现全外查询: