数据库查询方式

连接查询

基本含义

连接就是指两个或2个以上的表(数据源)“连接起来成为一个数据源”。

实际上,两个表的完全的连接是这样的一个过程:

左边的表的每一行,跟右边的表的每一行,两两互相“横向对接”后所得到的所有数据行的结果。

注意:连接之后,并非形成了一个新的数据表,而只是一种“内存形态”。

连接语法的基本形式

from 1  [连接方式]  join 2  [on 连接条件]

连接的结果可以当作一个“表”来使用。常用有以下几种连接方式:

交叉连接:

实际上,交叉连接是将两个表不设定任何条件的连接结果。

交叉连接通常也被叫做“笛卡尔积”——数学上可能比较多。

语法:

from  1  join  2  ; //可见交叉连接只是没有on条件而已。

内连接:

语法:

from  1   join  2  on  1.字段1=2.字段2

含义:找出(过滤)在交叉连接的结果表中的表1的字段1的值等于表2的字段2的值

的那些行。

 

左[外]连接:

形式:

from  1  left  [outer]  join   2   on  连接条件。

说明:

1,这里,left是关键字。

2,连接条件跟内连接一样。

3,含义是:内连接的结果基础上,加上左边表中所有不符合连接条件的数据,相应本应放右边表的字段的位置就自动补为“null”值。

右[外]连接:

右连接跟左连接恰恰相反:

形式:

from  1  right  [outer]  join   2   on  连接条件。

说明:

1,这里,right是关键字。

2,连接条件跟内连接一样。

3,含义是:在内连接的结果基础上,加上右边表中所有不符合连接条件的数据,相应本应放左边表的字段的位置就自动补为“null”值。

全[外]连接:

形式:

from  1  full  [outer]  join  2  on  连接条件;

说明:

1,含义:其实是左右连接的“并集”(消除重复项),即内连接的结果,加上左表中不满足条件的所有行(右边对应补null),再加上,右表中不满足条件的所有行(左边对应补null)。

2mysql中其实不认识全[]连接语法,即mysql这个软件本身不支持全连接的语法。

3,此概念在其他数据库有的存在,了解就可以。

子查询

什么叫子查询

一个查询,通常就是一个select语句(即出现一次select关键字)

但,如果在一个select查询语句中,又出现了select查询语句,此时就称后者为“子查询”,前者就是“主查询”

形式:

selelct 字段或表达式或(子查询1) [as 别名] from 表名或(子查询2) where 字段或表达式或(子查询3) 的条件判断

注意:

每个位置所放置的子查询结果,应该符合该位置的数据需求。

通常:

子查询1应该是一个“数据结果”。

子查询2可以是“任意结果”,此位置的查询结果,通常作为数据源,可以给一个别名

子查询3可以是一个数据或一列数据甚至是一行数据

 

子查询按结果分类:

表子查询 一个子查询返回的结果理论上是多行多列”的时候。此时可以当做一个“表”来使用,通常是放在from后面。

行字查询 一个子查询返回的结果理论上是一行多列”的时候。此时可以当做一个“行”来使用,通常放在“行比较语法”中。

列子查询 一个子查询返回的结果理论上是多行一列”的时候。此时可以当做“多个值”使用,类似这种:(5, 17, 8, 22)。

标量子查询:一个子查询返回的结果理论上是一行一列”的时候。此时可以当做“一个值”使用,类似这种:select 5 as c1; 或select ...where a = 17,或select ... where b > 8;

按使用场合分:

作为主查询的结果数据select c1,(select f1 from tab2) as f11 from tab1; #这里子查询应该只有一个数据(一行一列,标量子查询)

作为主查询的条件数据select c1 from tab1 where c1 in (select f1 from tab2); #这里子查询可以是多个数据(多行一列,列子查询以及标量子查询,实际上行子查询也可能,但极少

作为主查询的来源数据select c1 from (select f1 as c1, f2 from tab2) as t2; #这里子查询可以是任意查询结果(表子查询)。

posted @ 2018-08-16 09:02  Strif  阅读(176)  评论(0编辑  收藏  举报