• 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 的字段中
  • 相关阅读:
    国外摄影网站
    网络基础之子网划分
    Java-多线程第三篇3种创建的线程方式、线程的生命周期、线程控制、线程同步、线程通信
    Java-多线程第二篇多线程相关认识(2)
    设计模式-第八篇之桥接模式
    设计模式-第七篇之门面模式
    设计模式-第六篇之策略模式
    设计模式-第五篇之命令模式
    设计模式-第四篇之代理模式
    设计模式-第九篇之观察者模式
  • 原文地址:https://www.cnblogs.com/lin3615/p/3543618.html
Copyright © 2020-2023  润新知