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 的字段中
left join, right join , inner join, join, union的意义的更多相关文章
- 【Transact-SQL】SQL Server自动把left join自动转化为inner join、以及关联时的数据重复问题
原文:[Transact-SQL]SQL Server自动把left join自动转化为inner join.以及关联时的数据重复问题 1.SQL Server自动把left join自动转化为inn ...
- 数据库中的左连接(left join)和右连接(right join)区别
Left Join / Right Join /inner join相关 关于左连接和右连接总结性的一句话: 左连接where只影向右表,右连接where只影响左表. Left Join select ...
- MySQL的JOIN(四):JOIN优化实践之快速匹配
这篇博文讲述如何优化扫描速度.我们通过MySQL的JOIN(二):JOIN原理得知了两张表的JOIN操作就是不断从驱动表中取出记录,然后查找出被驱动表中与之匹配的记录并连接.这个过程的实质就是查询操作 ...
- MySQL的JOIN(五):JOIN优化实践之排序
这篇博文讲述如何优化JOIN查询带有排序的情况.大致分为对连接属性排序和对非连接属性排序两种情况.插入测试数据. CREATE TABLE t1 ( id INT PRIMARY KEY AUTO_I ...
- Python3 join函数和os.path.join用法
Python3 join函数和os.path.join用法 os.path.join()连接两个文件名地址的时候,就比os.path.join("D:\","test. ...
- Python join() 方法与os.path.join()的区别
Python join() 方法与os.path.join()的区别 pythonJoinos.path.join 今天工作中用到python的join方法,有点分不太清楚join() 方法与os.p ...
- “,”、“natural join”、“natural left outer join”、“natural right outer join”的用法总结
“,”:代表笛卡尔积: “natural join”:代表自然连接,即同名列等值连接: “natural left outer join”:表示左外连接: “natural right outer j ...
- hive 包含操作(left semi join)(left outer join = in)迪卡尔积
目前hive不支持 in或not in 中包含查询子句的语法,所以只能通过left join实现. 假设有一个登陆表login(当天登陆记录,只有一个uid),和一个用户注册表regusers(当天注 ...
- left join on and和left join on where条件的困惑[转]
外连接:left join(左联接) left outer join 返回包括左表中的所有记录和右表中联结字段相等的记录right join(右联接) right outer join返回包括右表中的 ...
- 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 ...
随机推荐
- 8-14-Exercise
8-14-小练 这次是我这组出题......我出的是B.C.D[虽然本来是想出的很难......╮(╯▽╰)╭但是,没找到AC1000+同时又让我想出的难题......SO...我出的真的不难= =] ...
- svn无法更新解决方案
1.删除C:\Documents and Settings\用户名\Application Data\Subversion\auth下的文件,删除svn登录信息. 2.将eclipse中 window ...
- 洛谷P1471 方差
蒟蒻HansBug在一本数学书里面发现了一个神奇的数列,包含N个实数.他想算算这个数列的平均数和方差. ——by 洛谷; http://www.luogu.org/problem/show?pid=1 ...
- 用Natvis定制C++对象在Visual Studio调试时如何显示
博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:用Natvis定制C++对象在Visual Studio调试时如何显示.
- 单位内部DNS架设及域名解析服务
越来越多的企业将企业内部局域网通过光缆.交换机等高速互连设备连接起来,形成较大规模的中型网络,网络上的主机和用户也随之日渐增多.作为 Internet的缩影,企业内部网上的各类服务器(如WWW服务器. ...
- Socket异步通信学习一
最近在做一个频谱管理项目,负责通信模块,自己也是小白,重头学起,直至今天通信基本框架已经完成,把自己在学习中的心得与大家分享一下,做一个socket系列的博文,顺便加固一下自己对socket通信的认识 ...
- HDU1495(bfs)
非常可乐 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- Android(java)学习笔记146:Bundle和Intent类使用和交互
Bundle只是一个信息的载体 将内部的内容以键值对组织 ,Intent负责Activity之间的交互自己是带有一个Bundle的.Intent.putExtras(Bundle bu ...
- SoundPool没有声音的问题
在项目中需要播放一个提示,很短的一个声音,Android中播放声音有两种方式:MediaPlayer和SoundPool.相对来说SoundPool比较轻量级一些,多用在播放比较短急的声音,Media ...
- iOS之应用程序国际化
一.程序国际化 准备工作: 1.首先我们要先创建一个工程,我们给他命名Internationalization-Demo,然后添加语言. 从代码中分离文本: 目前,应用展示的所有文本都是以硬编码字符串 ...