数据库在连接两张或以上的表来返回数据时,都会生成一张中间的临时表,然后再将临时表返回给用户
left join,right join,inner join, join 与 on
配合用

select
col_name.. from tablename1 [inner | left | right] join tablename2 on
on_condition

select col_name.. from
tablename1 left join tablename2 on on_condition

CREATE TABLE IF NOT EXISTS `name`(
    pid int(11) unsigned auto_increment,
    name varchar(40) NOT NULL,
    primary key(`pid`)
) ENGINE = MYISAM DEFAULT CHARSET = UTF8;

CREATE TABLE IF NOT EXISTS `sname`(
    id int(11) unsigned NOT NULL AUTO_INCREMENT,
    spid int(11) NOT NULL,
        firstname varchar(40),
    primary key(`id`)
)ENGINE = MYISAM DEFAULT CHARSET=UTF8;

name与sname 中,name.pid 与 sname.spid 相关联

name 表数据:

sname 表数据

执行时当tablename1[(如果在后面单独附加有条件时)符合条件时]全部选择,在tablename2时如果没有相应的数据,则其列都显示为NULL

right
join类似,只是角色反过来了

inner join (与 join 相同)
表示两个表都有的数据行

相当于 from tabname1,tabname2 where ? = ?

具体实例如下:

其实就是两表的笛卡尔积
用一个表的一行去乘另一个表的所有行,然后再换到一下行,重复相乘另一个表的所有行,直接这个表结尾
$sql = "select * from name, sname";
$result = mysql_query($sql, $link);
$i = 0;
echo '<table border="1" width="550">';
echo '<tr>';
echo '<th width="40">行号</th>';
echo '<th width="80">name表pid</th>';
echo '<th width="80">name表name</th>';
echo '<th width="80">sname表id</th>';
echo '<th width="100">sname表spid</th>';
echo '<th width="140">sname表firstname</th>';
echo '</tr>';
while($row = mysql_fetch_assoc($result))
{
    $i++;
    echo '<tr>';
    echo '<td>'.$i.'</td>';
    echo '<td>'.$row['pid'].'</td>';
    echo '<td>'.$row['name'].'</td>';
    echo '<td>'.$row['id'].'</td>';
    echo '<td>'.$row['spid'].'</td>';
    echo '<td>'.$row['firstname'].'</td>';
    echo '</tr>';
}
echo '</table>';

结果为:

其实就是选择两边都有的字段,且满足 where 条件
$sql = "select * from name, sname where name.pid = sname.spid";
$result = mysql_query($sql, $link);
$i = 0;
echo '<table border="1" width="550">';
echo '<tr>';
echo '<th width="40">行号</th>';
echo '<th width="80">name表pid</th>';
echo '<th width="80">name表name</th>';
echo '<th width="80">sname表id</th>';
echo '<th width="100">sname表spid</th>';
echo '<th width="140">sname表firstname</th>';
echo '</tr>';
while($row = mysql_fetch_assoc($result))
{
    $i++;
    echo '<tr>';
    echo '<td>'.$i.'</td>';
    echo '<td>'.$row['pid'].'</td>';
    echo '<td>'.$row['name'].'</td>';
    echo '<td>'.$row['id'].'</td>';
    echo '<td>'.$row['spid'].'</td>';
    echo '<td>'.$row['firstname'].'</td>';
    echo '</tr>';
}
echo '</table>';

如果用 join,inner join 结果是一样的,即

$sql = "select * from name (inner) join sname on name.pid = sname.spid"

以下是用 left join

其实就是选择左边所有的数据,如果右边没有与左边相关的就为NULL

$sql = "select * from name left join sname on name.pid = sname.spid";
$result = mysql_query($sql, $link);
$i = 0;
echo '<table border="1" width="550">';
echo '<tr>';
echo '<th width="40">行号</th>';
echo '<th width="80">name表pid</th>';
echo '<th width="80">name表name</th>';
echo '<th width="80">sname表id</th>';
echo '<th width="100">sname表spid</th>';
echo '<th width="140">sname表firstname</th>';
echo '</tr>';
while($row = mysql_fetch_assoc($result))
{
    $i++;
    echo '<tr>';
    echo '<td>'.$i.'</td>';
    echo '<td>'.$row['pid'].'</td>';
    echo '<td>'.$row['name'].'</td>';
    echo '<td>'.$row['id'].'</td>';
    echo '<td>'.$row['spid'].'</td>';
    echo '<td>'.$row['firstname'].'</td>';
    echo '</tr>';
}
echo '</table>';

right join 正好相反

其实就选择右表的所有数据,如果左边没有相关的就为NULL

$sql = "select * from name right join sname on name.pid = sname.spid";
$result = mysql_query($sql, $link);
$i = 0;
echo '<table border="1" width="550">';
echo '<tr>';
echo '<th width="40">行号</th>';
echo '<th width="80">name表pid</th>';
echo '<th width="80">name表name</th>';
echo '<th width="80">sname表id</th>';
echo '<th width="100">sname表spid</th>';
echo '<th width="140">sname表firstname</th>';
echo '</tr>';
while($row = mysql_fetch_assoc($result))
{
    $i++;
    echo '<tr>';
    echo '<td>'.$i.'</td>';
    echo '<td>'.$row['pid'].'</td>';
    echo '<td>'.$row['name'].'</td>';
    echo '<td>'.$row['id'].'</td>';
    echo '<td>'.$row['spid'].'</td>';
    echo '<td>'.$row['firstname'].'</td>';
    echo '</tr>';
}
echo '</table>';

union把选择的数据组合返回
AS:

select colname1...
union [ALL |
DISTINCT]
select colname2....

union 一般要求选择的字段数目相同,对应的字段类型也得相同.

在mysql
5.1版本中
如果union连接的字段数不相等,则报错,如果字段数相同,字段类型不同,以返回的结果全部填充在第一个 select 的字段中

left join, right join , inner join, join, union的意义的更多相关文章

  1. 【Transact-SQL】SQL Server自动把left join自动转化为inner join、以及关联时的数据重复问题

    原文:[Transact-SQL]SQL Server自动把left join自动转化为inner join.以及关联时的数据重复问题 1.SQL Server自动把left join自动转化为inn ...

  2. 数据库中的左连接(left join)和右连接(right join)区别

    Left Join / Right Join /inner join相关 关于左连接和右连接总结性的一句话: 左连接where只影向右表,右连接where只影响左表. Left Join select ...

  3. MySQL的JOIN(四):JOIN优化实践之快速匹配

    这篇博文讲述如何优化扫描速度.我们通过MySQL的JOIN(二):JOIN原理得知了两张表的JOIN操作就是不断从驱动表中取出记录,然后查找出被驱动表中与之匹配的记录并连接.这个过程的实质就是查询操作 ...

  4. MySQL的JOIN(五):JOIN优化实践之排序

    这篇博文讲述如何优化JOIN查询带有排序的情况.大致分为对连接属性排序和对非连接属性排序两种情况.插入测试数据. CREATE TABLE t1 ( id INT PRIMARY KEY AUTO_I ...

  5. Python3 join函数和os.path.join用法

    Python3  join函数和os.path.join用法 os.path.join()连接两个文件名地址的时候,就比os.path.join("D:\","test. ...

  6. Python join() 方法与os.path.join()的区别

    Python join() 方法与os.path.join()的区别 pythonJoinos.path.join 今天工作中用到python的join方法,有点分不太清楚join() 方法与os.p ...

  7. “,”、“natural join”、“natural left outer join”、“natural right outer join”的用法总结

    “,”:代表笛卡尔积: “natural join”:代表自然连接,即同名列等值连接: “natural left outer join”:表示左外连接: “natural right outer j ...

  8. hive 包含操作(left semi join)(left outer join = in)迪卡尔积

    目前hive不支持 in或not in 中包含查询子句的语法,所以只能通过left join实现. 假设有一个登陆表login(当天登陆记录,只有一个uid),和一个用户注册表regusers(当天注 ...

  9. left join on and和left join on where条件的困惑[转]

    外连接:left join(左联接) left outer join 返回包括左表中的所有记录和右表中联结字段相等的记录right join(右联接) right outer join返回包括右表中的 ...

  10. Oracle数据库,join多表关联方式、union结果集合并

    join on :   多表关联 内连接 :与其他表连接 from 表1 t join 表2 s on t.字段1 =s.字段2 join 表3 n on n.字段3=t.字段1 或 from 表1 ...

随机推荐

  1. windows蓝屏代码大全及常见蓝屏解决方案

    对于以下的代码查询建议使用ctrl+F查询,而且很多蓝屏与黑屏的问题多是最近操作引起的,例如更新驱动,安装新的硬件.软件--把相关的配置调到最近的正常状况大多可以解决,确实不行时方可考虑重装系统,解决 ...

  2. CCS样式表小结

    CSS(Cascading Style Sheet,叠层样式表),作用是美化HTML网页. /*注释区域*/    此为注释语法 一.样式表 (一)样式表的分类 1.内联样式表 和HTML联合显示,控 ...

  3. JDK之jstat的用法

    http://www.51testing.com/html/92/77492-203728.html jstat的用法 用以判断JVM是否存在内存问题呢?如何判断JVM垃圾回收是否正常?一般的top指 ...

  4. TreeMap 排序

    一.TreeMap TreeMap 默认排序规则:按照key的字典顺序来排序(升序) 当然,也可以自定义排序规则:要实现Comparator接口. 用法简单,先看下下面的demo public cla ...

  5. UML建模系列文章总结

    本文转载:http://www.cnblogs.com/ywqu/tag/UML建模/ 本人总结: UML类图按照关系分为三大类:继承关系.拥有关系.整体与部分的关系. 继承关系:泛化.实现 拥有关系 ...

  6. 理解C# Lazy<T>

    1.Lazy<T>解决什么问题? 考虑下面的需求,有个对象很大,创建耗时,并且要在托管堆上分配一大块空间.我们当然希望,用到它的时候再去创建.也就是延迟加载,等到真正需要它的时候,才去加载 ...

  7. Linux环境进程间通信

    http://www.ibm.com/developerworks/cn/linux/l-ipc/part2/index2.html http://bbs.chinaunix.net/forum.ph ...

  8. 从BAE到SAE,从SAE又回到BAE

    版权声明:本文为博主原创文章,未经博主允许不得转载. [很久以后] 这段话是很久之后补充的,发现错误要勇于改正,以下红色字体是对以前观点的改正, 大概总结下: 1.bae最大缺点是需要备案,不过现在看 ...

  9. [Erlang]怎样加入自己的BIF

    步骤 1. 执行configure 2. 将你的bifs加入至erts/emulator/beam/bif.tab bif re:grep/2 bif re:compile/1 3. 创建一个C代码文 ...

  10. oracle数据库导入导出的dmp(转)

    window下: imp必须要dba用户,所以用sysdba用户登陆,然后给予chnlmgr用户dba权限 grant connect,resource,dba to chnlmgr; 全部导入 im ...