Select-Join-inner join:
连接(连结)查询
一般而言,一个实体对应一个表。
而业务逻辑中,常常需要使用多个实体的数据。
如此以来,就需要有多个表一起使用,将多个表的记录
连接起来的技术,也就是本次学习的join。
总体思路:
将所有的数据,按照某种条件,连接起来,再进行筛选处理。
连接的分类:
根据连接的条件不同,分类如下所示:
1.内连接:
数据内部的连接,要求连接的多个数据都必须存在才能进行连接。
所谓存在(几个相连接的表,主体记录在其他的表中都有相互之间的配对信息)
语法:
tbl_left inner join tbl_right on 连接条件
On 也可以被 where 、using代替
On 连接的时候,过滤掉不符合条件的记录。
Where 先形成表(笛卡尔积),再进行数据过滤。 Where 不用与外连接
Using 要求法则连接的两个实体之间的字段名称一致
内连接处理:内连接在连接时,是可以省略连接条件的,即所有都为真,所有左表记录与
右表记录连接都保留,有叫做交叉连接,也叫笛卡尔积N*M。
此时可以使用 cross join(笛卡尔积:没有条件的)代替 inner join
也可以用 无条件 多表 查询。
2.外连接:
如果负责连接的一个或者多个数据不真实存在,则称之为外连接
3.自然连接(有内有外):
On 的具体连接操作
Union 与 join 区别:
Union 是记录连接,纵向(因此要求字段相同);
Join 是字段连接(表),横向;
create table j_teacher
(
id int primary key auto_increment,
t_name varchar(10),
gender enum('male','female','secret')
)engine innodb character set utf8;
insert into j_teacher values
(1,'寒心','male'),
(2,'李白','female'),
(3,'韩非子','secret'),
(4,'孙武','male');
create table j_class
(
id int primary key auto_increment,
c_name varchar(10),
room char(3)
)engine innodb character set utf8;
insert into j_class values
(1,'php0115','207'),
(2,'php0228','104'),
(3,'php0331','102'),
(4,'php0505','202');
create table j_teacher_class
(
id int primary key auto_increment,
t_id int,
c_id int,
days tinyint,
begin_date date,
end_date date
)engine innodb character set utf8;
insert into j_teacher_class values
(1,1,1,15,'2013-01-15','2013-02-20'),
(2,1,2,18,'2013-02-28','2013-03-30'),
(3,1,3,22,'2013-03-21','2013-05-05'),
(4,2,1,20,'2013-02-22','2013-03-25'),
(5,2,2,20,'2013-03-31','2013-04-29'),
(6,3,1,15,'2013-03-27','2013-4-18'),
(7,1,1,15,'2013-04-19','2013-05-01'),
(8,3,3,15,'2013-05-28','2013-06-15'),
(9,2,1,5,'2013-05-04','2013-05-15');
select * from j_teacher inner join j_teacher_class on
j_teacher.id=j_teacher_class.t_id;
select j_teacher.t_name, j_teacher_class.begin_date,
j_teacher_class.days from j_teacher inner join j_teacher_class on
j_teacher.id=j_teacher_class.t_id;
select j_teacher.t_name, j_teacher_class.begin_date,
j_teacher_class.days from j_teacher left outer join j_teacher_class on
j_teacher.id=j_teacher_class.t_id;
select j_teacher.t_name, j_teacher_class.begin_date,
j_teacher_class.days from j_teacher inner join j_teacher_class;
/*笛卡尔积查询*/
select j_teacher.t_name, j_teacher_class.begin_date,
j_teacher_class.days from j_teacher inner join j_teacher_class;
/*多表查询*/
select j_teacher.t_name, j_teacher_class.begin_date,
j_teacher_class.days from j_teacher ,j_teacher_class;
select id, days, t_name from