高级数据操作--连接查询
一.连接查询——交叉连接
概念
表与表之间是有联系的!
所谓的连接查询,就是指将两张表或者多张表按照某个指定的条件,进行横向上的连接并显示!
所以,从结果上看,字段数增加了!
分类
根据连接查询的性质不同,又可以分成交叉连接、内连接、外连接和自然连接!
交叉连接关键字:cross join
交叉连接含义:
交叉连接是最容易理解的,就是指从一张表中的每一条记录分别去连接另外一张表的所有的记录,并且保存所有的记录,其中也包括两张表的所有的字段!
所以说,交叉连接的本质就是两张数据表做笛卡尔积!
笛卡尔积:
所以,如果表1有m条记录,表2有n条记录,笛卡尔积的结果就是m*n条记录!
语法:
1 -- 交叉连接语法 2 select *|字段列表 from 表名1 cross join 表名2; 3 4 select * from php_student cross join php_class; 5 /* 6 注意: 7 交叉连接的结果一般没有意义,因为产生了大量无效的数据,但是交叉连接的语法意义比较重要,它把两种表进行连接的所有可能性都罗列出来了,而且其他 的连接查询都是基于交叉连接的! 8 */
insert into php_student values (null,'孙悟空','male',17,600,'花果山',98), (null,'蜘蛛精','female',18,500,'花果山',90), (null,'猪悟能','male',17,700,'高老庄',88), (null,'沙悟净','male',17,750,'流沙河',78), (null,'唐僧','male',17,30,'东土大唐',100), (null,'高翠兰','female',16,18,'高老庄',70), (null,'皇后','female',16,18,'东土大唐',73), (null,'小龙女','female',17,30,'流沙河',80), (null,'小猴子','male',16,100,'花果山',95), (null,'皇帝','male',16,60,'东土大唐',93), (null,'高翠华','female',16,16,'高老庄',80); create table php_class( class_id tinyint unsigned primary key auto_increment, class_teacher varchar(30) ); insert into php_class values (15,'卡卡西'), (16,'纲手'), (17,'鼬'), (18,'自来也'); -- 交叉查询 select * from php_student cross join php_class;
注意:
交叉连接的结果一般没有意义,因为产生了大量无效的数据!
但是,交叉连接的语法意义比较重要,它把两张表进行连接的所有的可能性都罗列出来了!而且其他的连接查询都是基于交叉连接的!
案例
/* 因为小孩取个贱名不生病好养活,所以根据出生月份和日期起名字。 根据阳历(公历) 生日中 月份: 1 长 2 栓 3 大 4 来 5 狗 6 守 7 傻 8 福 9屎 10 二 11 胖 12 臭 具体日期: 1 娟 2 妮 3 腿 4 娣 5 球 6 坑 7 年 8 岁 9 娃 10 毛 11 剩 12 姑 13 英 14 妹 15 肥 16 霞 17 狗 18 虎 19 花20 凤 21 定 22 蛋 23 妞 24 牛 25 木 26 翠 27 爱 28 财 29 石 30 美丽 31 发 */ create table birth_month( month_id tinyint unsigned primary key auto_increment, month_value varchar(10) )engine InnoDB default charset utf8; insert into birth_month(month_value) values('长'),('栓'),('大'),('来'),('狗'),('守'),('傻'),('福'),('屎'),('二'),('胖'),('臭'); create table birth_day( day_id tinyint unsigned primary key auto_increment, day_value varchar(10) )engine InnoDB default charset utf8; insert into birth_day(day_value) values('娟'),('妮'),('腿'),('娣'),('球'),('坑'),('年'),('岁'),('娃'),('毛'),('剩'),('姑'),('英'),('妹'),('肥'),('霞'),('狗'),('虎'),('花'),('凤'),('定'),('蛋'),('妞'),('牛'),('木'),('翠'),('爱'),('财'),('石'),('美丽'),('发');
1 -- 查询上面所有名字的情况 2 select * from birth_month cross join birth_day;
二.连接查询——内连接
关键字:inner join
内连接要区分左表和右表,出现在join关键字左边的表就叫做左表,反之是右表!
含义
数据在左表中存在,同时在右表中有对应的匹配的结果才会被保存,如果没有匹配上,我们就认为数据没有意义,就不会被保存!
什么叫匹配?
就是存在某种关系能够识别彼此,通常就是两张表中的两个字段的值要相等!
语法
1 -- 内连接语法 2 select * | 字段列表 from 左表[inner] join 右表 on 左表.字段名 = 右表.字段名; 3 -- 这里的inner可以省略 4 5 select * from php_student as s inner join php_class as c on s.class_id = c.class_id; 6 /* 7 注意: 8 1.当左表和右表用来判断是否相等的字段名一样的时候,必须要以表名.字段名的形式! 9 2.如果表名比较长,一般使用别名 10 3.如果省略了关键字on 和后面的条件,相当于交叉连接了 11 select * from php_student as s inner join php_class as c; 12 */
三.连接查询——外连接
又分成了左外连接和右外连接!
1.左外连接
left outer join
含义
跟内连接一样,也是按照on后面的条件去匹配,如果匹配成功,那么就保存两个表的所有的记录,如果匹配失败,只保留左表中的记录,右表中的记录全部为NULL,此时左表也叫做主表!
1 -- 左外连接 2 select * from php_student as s left outer join php_class as c on s.class_id = c.class_id;
2.右外连接
right outer join
含义
跟内连接一样,也是按照on后面的条件去匹配,如果匹配成功,那么就保存两个表的所有的记录,如果匹配失败,只保留右表中的记录,左表中的记录全部为NULL,此时右表也叫做主表!
1 -- 右外连接 2 select * from php_student as s right outer join php_class as c on s.class_id = c.class_id;
注意:
左外连接和右外连接中的outer关键字都可以省略!
所以,左外连接就叫做左连接,右外连接也叫做右连接!
四.连接查询——自然连接
关键字:natural join
概念
自然连接中的“自然”,是指两个或多个数据表之间进行连接的时候,系统会自动的去匹配连接条件,而不需要人为的指定,也就是没有on关键字了!
1 /* 2 自动匹配的规则如下: 3 只要两张表中具有相同的字段名,系统就会认为这是一个连接条件,就会自动的去匹配这两个字段的值是否相等,如果相等就认为条件匹配上了,如果不相等就认为没有匹配上! 4 5 如果两个表中的多个字段名都相同,所有相同字段的值都相同才算是匹配成功! 6 所以,自然连接的意思就是匹配的条件由系统已经确定好了,而根据匹配之后的结果如何保存又可以分成自然内连接和自然外连接: 7 */ 8 9 10 11 -- 自然内连接语法 12 13 左表 natural join 右表; 14 15 16 --自然内连接的本质还是内连接,只是匹配的条件只是由系统主动指定罢了 17 18 -- 内连接 19 select * from php_student inner as s join php_class as c on s.class_id = c.class_id; 20 -- 自然内连接 21 select * from php_student natural join php_class; 22 23 -- 以上两个查询语句的结果是一样的,原因就是系统指定的条件和用户人为指定的条件刚好一样的,只是自然内连接会自动删除重复的那一列 24 25 26 -- 自然外连接语法 27 -- 又分成自然左外连接,自然右外连接 28 -- 语法形式: 29 左表 natural left|right join 右表 30 31 -- 其实,自然外连接的本质还是外连接,只是匹配的条件由系统指定罢了,也会自动删除重复的字段 32 33 34 -- 左外连接 35 select * from php_student as s left oin php_class as c on s.class_id = c.class_id; 36 -- 自然左外连接 37 select * from php_student natural left join php_class; 38 39 40 41 -- 右外连接 42 select * from php_student as s right join php_class as c on s.class_id = c.class_id; 43 -- 自然右外连接 44 select * from php_student natural right join php_class;