您的位置:首页 > 数据库

SQL连接的使用

2015-08-12 09:01 417 查看
pre:以前总是不喜欢记这些概念和具体的用法,总是用的时候去找度娘或谷哥,直到面试的时候问到这些,才觉得有必要做做笔记,便于回忆。

连接的分类

1、内连接;

包括自然连接和等值连接;

2、外连接;

包括左外连接、右外连接和全连接;

3、交叉连接;

也称作笛卡尔积;

建表:

DROP TABLE IF EXISTS `student`;

CREATE TABLE `student` (

`id` int(10) NOT NULL AUTO_INCREMENT,

`name` varchar(20) DEFAULT NULL,

`gender` varchar(10) DEFAULT NULL,

`age` int(10) DEFAULT NULL,

`classid` int(10) DEFAULT NULL,

PRIMARY KEY (`id`)

) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;

DROP TABLE IF EXISTS `class`;

CREATE TABLE `class` (

`id` int(10) NOT NULL AUTO_INCREMENT,

`name` varchar(20) DEFAULT NULL,

PRIMARY KEY (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

插入测试数据:

INSERT INTO `student` VALUES ('1', 'zhangsan', 'M', '24', '1');

INSERT INTO `student` VALUES ('2', 'lisi', 'M', '23', '2');

INSERT INTO `student` VALUES ('3', 'wangwu', 'F', '19', '3');

INSERT INTO `student` VALUES ('4', 'zhaoliu', 'M', '39', '1');

INSERT INTO `student` VALUES ('5', 'jiangwei', 'F', '22', '1');

INSERT INTO `student` VALUES ('6', 'lilei', 'M', '26', '2');

INSERT INTO `student` VALUES ('7', 'zhanghai', 'F', '23', '6');



INSERT INTO `class`(name) VALUES ('class1');

INSERT INTO `class`(name) VALUES ('class2');

INSERT INTO `class`(name) VALUES ('class3');

INSERT INTO `class`(name) VALUES ('class4');



1、内连接

内连接使用比较运算符根据每个表共有的列的值匹配两个表中的行。

其中,自然连接和等值连接的区别:自然连接(Naturaljoin)是一种特殊的等值连接,它要求两个关系中进行比较的分量必须是相同的属性组,并且在结果中把重复的属性列去掉。而等值连接并不去掉重复的属性列。

SELECT * from student INNER JOIN class on student.classid=class.id;



上面语句的执行结果与下面语句的执行结果相同,而且下面的语句平时用得更多:

SELECT * from student, class WHERE student.classid=class.id;



2、外连接

2.1左外连接

左外连接的结果集包括left(outer)join子句中指定左表的所有行,而不仅仅是连接列所匹配的行。如果左表的某行在右表中没有匹配行,则在关联的结果集行中右表的所有选择列表列均为空值。

SELECT * FROM student LEFT JOIN class on student.classid=class.id ORDER BY student.id;



2.2右外连接

右外连接是左外连接的反向连接。将返回右表的所有行。如果右表的某行在左表中没有匹配行,则将左表的行为空值。

SELECT * FROM student RIGHT JOIN class on student.classid=class.id ORDER BY class.id;



2.3全连接

完整外部连接返回左表和右表中的所有行。当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值。如果表之间有匹配行,则整个结果集行包含基表的数据值。

SELECT * FROM student FULL JOIN class on student.classid=class.id ORDER BY student.id;(MySQL中不支持全连接)

3、交叉连接

交叉连接返回左表中的所有行,左表中的每一行与右表中的所有行组合。交叉连接也称作笛卡尔积。 cross join 不带条件where。

SELECT * FROM student CROSS JOIN class;

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: