在使用之前 先创两张表如下↓↓
concrete_class表 :是具体的某一类
DROP TABLE IF EXISTS `concrete_class`;
CREATE TABLE `concrete_class` (
`o_id` int(11) NOT NULL AUTO_INCREMENT,
`f_id` int(11) DEFAULT NULL,
`o_name` varchar(255) CHARACTER SET utf8 DEFAULT NULL,
PRIMARY KEY (`o_id`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=latin1;
-- ----------------------------
-- Records of concrete_class
-- ----------------------------
INSERT INTO `concrete_class` VALUES ('1', '1', '广橘');
INSERT INTO `concrete_class` VALUES ('2', '1', '葡萄');
INSERT INTO `concrete_class` VALUES ('3', '2', '牛肉');
INSERT INTO `concrete_class` VALUES ('4', '2', '猪肉');
INSERT INTO `concrete_class` VALUES ('5', '3', '黄瓜');
INSERT INTO `concrete_class` VALUES ('6', '4', '白鹭');
INSERT INTO `concrete_class` VALUES ('7', '4', '麻雀');
INSERT INTO `concrete_class` VALUES ('8', '4', '乌鸦');
INSERT INTO `concrete_class` VALUES ('9', '1', '香蕉');
what_class表:这一物属于的那个种类
DROP TABLE IF EXISTS `what_class`;
CREATE TABLE `what_class` (
`f_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '水果id',
`f_name` varchar(255) CHARACTER SET utf8 DEFAULT NULL,
`f_state` varchar(255) CHARACTER SET utf8 DEFAULT NULL COMMENT '状态',
PRIMARY KEY (`f_id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=latin1;
-- ----------------------------
-- Records of what_class
-- ----------------------------
INSERT INTO `what_class` VALUES ('1', '水果类', '新鲜');
INSERT INTO `what_class` VALUES ('2', '肉类', '不动的');
INSERT INTO `what_class` VALUES ('3', '蔬菜类', '刚摘的');
INSERT INTO `what_class` VALUES ('4', '鸟类', '会飞的');
1.内连接查询:
1.1第一种不使用inner join on:
SELECT f.f_name,o.o_name from what_class f,concrete_class o where f.f_id=o.f_id
1.2第二种使用 inner join on:
SELECT f.f_name,o.o_name from what_class f INNER JOIN concrete_class o on f.f_id=o.f_id
注:inner join 语法是ANSI SQL的标准规范,使用inner join连接语法能够确保不会忘记连接条件,使用where在某些时候回影响查询性能
自连接查询
如果在一个连接查询中,涉及的两张表都是同一个表,这种查询称为自连接查询 是一种特殊的内连接
select c1.f_id,c1.o_name from concrete_class as c1,concrete_class as c2 where c1.o_id = c2.o_id and c2.f_id=1
2.外连接查询
查询前添加几个空数据
INSERT INTO `concrete_class` VALUES ('10', null, '野马');
INSERT INTO `concrete_class` VALUES ('11', null, '鸡蛋');
INSERT INTO `what_class` VALUES ('5', '鱼类', null);
INSERT INTO `what_class` VALUES ('6', null, null);
2.0 外连接查询将查询多个表中相关联的行,内连接时,返回查询结果集合中的只是符合查询条件和连接条件的行,但有时候需要包含没有关联的行的数据,即返回查询结果集合中的不仅包含符合连接条件的行,而且还包括左表或右表的所有数据行,外连接分为左外连接和右外连接
left join(左连接):返回包括左表中的所有记录和右表中连接字段相等的记录
right join(右连接):返回包括右表中的所有记录和左表中连接字段相等的记录
LEFT JOIN:
SELECT f.f_name,o.o_name from what_class f LEFT JOIN concrete_class o on f.f_id=o.f_id
RIGHT JOIN:
SELECT f.f_name,o.o_name from what_class f RIGHT JOIN concrete_class o on f.f_id=o.f_id
3.复合条件连接查询 只为查询更加的准确
SELECT f.f_name,o.o_name from what_class f INNER JOIN concrete_class o on f.f_id=o.f_id and o.o_id=o.f_id