left join, right join , inner join, join, union的意义

数据库在连接两张或以上的表来返回数据时,都会生成一张中间的临时表,然后再将临时表返回给用户
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 的字段中
原文地址:https://www.cnblogs.com/lin3615/p/3543618.html