只有left join和right join时候,表的顺序不同,对结果有影响,
跟表中的字段没有关系,跟where条件也没有关系。
如果是inner join 表的顺序也不影响结果。
a表、b表就是一个打个比方,假如在数据库中建立了两张表格,一个叫A表、另一个就是B表。就跟讲故事,不知道那两个人名字,但知道他们做了事情,为了方便描述,一般我们会假定这两个人为“张三”、“李四”;不知道我说明白了没;
在本课程中所指A、B表;
A表如下
id user_name
1 孙悟空
2 唐僧
3 猪八戒
4 沙和尚
B表如下
id user_name
1 孙悟空
2 牛魔王
3 蛟魔王
关联的表在2到3个还可以,如果更多的话会很慢了,可以借助建立索引来优化查询效率,但是一般建议表的关联查询不超过3个。
(left outer join 左外连接) 等同于 (left join 左连接)。
关键是不止4个人啊,另外一张表也有孙悟空。。。
那最后查个孙悟空,那结果岂不是说四人组中孙悟空不是孙悟空的结拜兄弟,感觉这个举例不太恰当呀
末尾(在分号前面)输入\G,
现提供建库建表脚本如下:
-- 注意自己是否需要建库 -- create database if not exists mysqldv1; -- 新建 user1 表 create table if not exists user1 ( id smallint unsigned primary key auto_increment, user_name varchar(40), over varchar(40) ); -- 新建 user2 表 create table if not exists user2 ( id smallint unsigned primary key auto_increment, user_name varchar(40), over varchar(40) ); -- 新建 user_kills 表 create table if not exists user_kills ( id smallint unsigned primary key auto_increment, user_id smallint unsigned, timestr timestamp default CURRENT_TIMESTAMP, kills smallint unsigned ); -- 插入 user1 表数据 insert into user1(user_name,over) values ('唐僧', '旃檀功德佛'); insert into user1(user_name,over) values ('猪八戒', '净坛使者'); insert into user1(user_name,over) values ('孙悟空', '斗战胜佛'); insert into user1(user_name,over) values ('沙僧', '金身罗汉'); -- 插入 user2 表数据 insert into user2(user_name,over) values ('孙悟空', '成佛'); insert into user2(user_name,over) values ('牛魔王', '被降服'); insert into user2(user_name,over) values ('蛟魔王', '被降服'); insert into user2(user_name,over) values ('鹏魔王', '被降服'); insert into user2(user_name,over) values ('狮驼王', '被降服'); -- 插入 user_kills 表数据 insert into user_kills(user_id, timestr, kills) values (2, timestamp('2013-01-10'), 10); insert into user_kills(user_id, timestr, kills) values (2, timestamp('2013-02-01'), 2); insert into user_kills(user_id, timestr, kills) values (2, timestamp('2013-02-05'), 12); insert into user_kills(user_id, timestr, kills) values (4, timestamp('2013-01-10'), 3); insert into user_kills(user_id, timestr, kills) values (4, timestamp('2013-02-11'), 5); insert into user_kills(user_id, timestr, kills) values (2, timestamp('2013-02-06'), 1); insert into user_kills(user_id, timestr, kills) values (3, timestamp('2013-01-11'), 20); insert into user_kills(user_id, timestr, kills) values (2, timestamp('2013-02-12'), 10); insert into user_kills(user_id, timestr, kills) values (3, timestamp('2013-02-07'), 17);
第一个问题:什么时候用left join?说说我的理解
两个表(left join左边的表称为左表,右边的称为右表)有主外键关联时,这个是前提条件,我们想同时查询两个表中的信息,这个时候可以采用这种left join,当然也可以用right join,简单说一下区别,left join是以左表为主,就是查询出左表的全部数据并查询出右表的主外键关联数据,right join相反。你可以找点文章看看。
第二个问题:连接条件怎么确定?
SELECT * FROM beasp_user u LEFT JOIN beasp_address a ON u.`id`=a.`user_id`
这里u.'id' 中的 id 为左表的主键,a.'user_id'为右表的外键,指向 u 表的主键。就是主外键关联作为条件。
第三个问题:怎么知道用那个表作为左表?
就像第一个问题中所说的,想查询某个表中的所有内容,查询另一个表中的关联内容,那么想查询所有内容的表作为左表。
第四个问题:怎么确定要查询那些字段?
* 代表查询所有字段,如果想查询某个表的字段,可以使用 "表名(如果有别名,就用别名).*",如果想查询部分字段,可以使用“表名(如果有别名,就用别名).字段名”,如果字段有冲突,就为字段重新命名!
这个在课程中有提到的
on后面的是连接条件,代表两个表建立关系所遵循的规则
where后面的可以看作是筛选条件,是对最终结果集进行过滤所遵循的规则