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;
连接的分类
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;
相关文章推荐
- 【Oracle】实现主键自增
- 一次MySQL慢查询导致的故障
- Oracle11g数据泵导入导出
- 64位win7 pl/sql developer连接linux oracle11g服务端
- Sqlite学习笔记(一)&&编译安装
- sql生成器(含注释)问题修复版
- Redis演示及使用场景
- SQL语法之查询语句
- 数据库事务总结
- xampp修改mysql的默认空密码
- 对sql的查询语句做成对象式,简单实现。Where部分
- ORACLE 11g RAC 之健忘与脑裂
- MySQL你让我情何以堪
- 为什么pyspider+mongodb只存了一部分数据到数据库,而其他大量数据并没有写入数据库!
- asp.net中oracle 存储过程(代码+图文)
- 一次MySQL慢查询导致的故障
- MySQL备份与恢复之冷备(1)
- MySQL备份与恢复之真实环境使用冷备(2)
- MySQL备份与恢复之热备(3)
- MySQL备份与恢复之热拷贝(4)