一直以来,对于sql都是并没有花费时间与精力在上面,所以对于sql语句,一般都是秉承着会使用基本的增删查改就可以了,但是最近同事遇到了一个sql优化的问题,搞了好久,虽然最终废了好大的劲搞定了,但是还是感觉到了sql基础的薄弱,这才打算把sql相关的重新学习一遍,而关于join,这是第一篇。
首先,先甩出来一张已经被用烂了的图,如下:
由图可知,join大致分为内连接,外连接,右连接,左连接,自然连接。
首先,建两张表,emp、dep:
CREATE TABLE `emp` (
`id` int(11) NOT NULL,
`empName` varchar(20) COLLATE utf8_bin DEFAULT NULL,
`deptId` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin
CREATE TABLE `dep` (
`id` int(11) NOT NULL,
`deptName` varchar(20) COLLATE utf8_bin DEFAULT NULL,
`locAdd` varchar(50) COLLATE utf8_bin DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin
插入对应的数据:
insert into `emp` (`id`, `empName`, `deptId`) values('1','e1','1');
insert into `emp` (`id`, `empName`, `deptId`) values('2','e2','1');
insert into `emp` (`id`, `empName`, `deptId`) values('3','e3','1');
insert into `emp` (`id`, `empName`, `deptId`) values('4','e4','2');
insert into `emp` (`id`, `empName`, `deptId`) values('5','e5','2');
insert into `emp` (`id`, `empName`, `deptId`) values('6','e6','3');
insert into `emp` (`id`, `empName`, `deptId`) values('7','e7','4');
insert into `emp` (`id`, `empName`, `deptId`) values('8','e8','51');
insert into `dep` (`id`, `deptName`, `locAdd`) values('1','RD','11');
insert into `dep` (`id`, `deptName`, `locAdd`) values('2','HR','12');
insert into `dep` (`id`, `deptName`, `locAdd`) values('3','MK','13');
insert into `dep` (`id`, `deptName`, `locAdd`) values('4','MIS','14');
insert into `dep` (`id`, `deptName`, `locAdd`) values('5','FD','15');
笛卡尔积:CROSS JOIN:
要理解各种JOIN首先要理解笛卡尔积。笛卡尔积就是将A表的每一条记录与B表的每一条记录强行拼在一起。所以,如果A表有n条记录,B表有m条记录,笛卡尔积产生的结果就会产生n*m条记录。下面的例子,emp有8条记录,dep有5条记录,所有他们俩的笛卡尔积有40条记录。有五种产生笛卡尔积的方式如下:
SELECT * FROM emp CROSS JOIN dep;
SELECT * FROM emp INNER JOIN dep;
SELECT * FROM emp ,dep;
SELECT * FROM emp NATURE JOIN dep;
SELECT * FROM emp NATURA JOIN dep;
查询结果如下:
id empName deptId id deptName locAdd
1 e1 1 1 RD 11
1 e1 1 2 HR 12
1 e1 1 3 MK 13
1 e1 1 4 MIS 14
1 e1 1 5 FD 15
2 e2 1 1 RD 11
2 e2 1 2 HR 12
2 e2 1 3 MK 13
2 e2 1 4 MIS 14
2 e2 1 5 FD 15
3 e3 1 1 RD 11
3 e3 1 2 HR 12
3 e3 1 3 MK 13
3 e3 1 4 MIS 14
3 e3 1 5 FD 15
4 e4 2 1 RD 11
4 e4 2 2 HR 12
4 e4 2 3 MK 13
4 e4 2 4 MIS 14
4 e4 2 5 FD 15
5 e5 2 1 RD 11
5 e5 2 2 HR 12
5 e5 2 3 MK 13
5 e5 2 4 MIS 14
5 e5 2 5 FD 15
6 e6 3 1 RD 11
6 e6 3 2 HR 12
6 e6 3 3 MK 13
6 e6 3 4 MIS 14
6 e6 3 5 FD 15
7 e7 4 1 RD 11
7 e7 4 2 HR 12
7 e7 4 3 MK 13
7 e7 4 4 MIS 14
7 e7 4 5 FD 15
8 e8 51 1 RD 11
8 e8 51 2 HR 12
8 e8 51 3 MK 13
8 e8 51 4 MIS 14
8 e8 51 5 FD 15
内连接:INNER JOIN:
内连接INNER JOIN是最常用的连接操作。从数学的角度讲就是求两个表的交集,从笛卡尔积的角度讲就是从笛卡尔积中挑出ON子句条件成立的记录。有INNER JOIN,WHERE(等值连接),STRAIGHT_JOIN,JOIN(省略INNER)四种写法,示例如下:
SELECT * FROM emp INNER JOIN dep ON emp.`deptId`=dep.`id`;
SELECT * FROM emp,dep WHERE emp.`deptId`=dep.`id`;
SELECT * FROM emp STRAIGHT_JOIN dep ON emp.`deptId`=dep.`id`;
SELECT * FROM emp JOIN dep ON emp.`deptId`=dep.`id`
查询结果如下:
id empName deptId id deptName locAdd
1 e1 1 1 RD 11
2 e2 1 1 RD 11
3 e3 1 1 RD 11
4 e4 2 2 HR 12
5 e5 2 2 HR 12
6 e6 3 3 MK 13
7 e7 4 4 MIS 14
左连接:LEFT JOIN
左连接LEFT JOIN的含义就是求两个表的交集外加左表剩下的数据。依旧从笛卡尔积的角度讲,就是先从笛卡尔积中挑出ON子句条件成立的记录,然后加上左表中剩余的记录,写法如下:
SELECT * FROM emp LEFT JOIN dep ON emp.`deptId`=dep.`id`;
查询结果如下,见最后一条:
id empName deptId id deptName locAdd
1 e1 1 1 RD 11
2 e2 1 1 RD 11
3 e3 1 1 RD 11
4 e4 2 2 HR 12
5 e5 2 2 HR 12
6 e6 3 3 MK 13
7 e7 4 4 MIS 14
8 e8 51 NULL NULL NULL
右连接:RIGHT JOIN
同理右连接RIGHT JOIN就是求两个表的交集外加右表剩下的数据。再次从笛卡尔积的角度描述,右连接就是从笛卡尔积中挑出ON子句条件成立的记录,然后加上右表中剩余的记录,写法如下:
SELECT * FROM emp RIGHT JOIN dep ON emp.`deptId`=dep.`id`;
查询结果如下,见最后一条:
id empName deptId id deptName locAdd
1 e1 1 1 RD 11
2 e2 1 1 RD 11
3 e3 1 1 RD 11
4 e4 2 2 HR 12
5 e5 2 2 HR 12
6 e6 3 3 MK 13
7 e7 4 4 MIS 14
NULL NULL NULL 5 FD 15
外连接:OUTER JOIN
外连接就是求两个集合的并集。从笛卡尔积的角度讲就是从笛卡尔积中挑出ON子句条件成立的记录,然后加上左表中剩余的记录,最后加上右表中剩余的记录。另外MySQL不支持OUTER JOIN,但是我们可以对左连接和右连接的结果做UNION操作来实现,写法如下:
SELECT * FROM emp LEFT JOIN dep ON emp.`deptId`=dep.`id`
UNION
SELECT * FROM emp RIGHT JOIN dep ON emp.`deptId`=dep.`id`;
查询结果如下:
id empName deptId id deptName locAdd
1 e1 1 1 RD 11
2 e2 1 1 RD 11
3 e3 1 1 RD 11
4 e4 2 2 HR 12
5 e5 2 2 HR 12
6 e6 3 3 MK 13
7 e7 4 4 MIS 14
8 e8 51 NULL NULL NULL
NULL NULL NULL 5 FD 15
自然连接:NATURE JOIN
自然连接就是找出两个表中相同的列作为连接条件进行连接,写法如下:
SELECT * FROM emp NATURAL JOIN dep;
查询结果如下:
id empName deptId deptName locAdd
1 e1 1 RD 11
2 e2 1 HR 12
3 e3 1 MK 13
4 e4 2 MIS 14
5 e5 2 FD 15
下一篇具体介绍一下,开始的时候那张图的几种具体的sql写法。
- 大小: 80.8 KB
分享到:
相关推荐
sql语句中join的用法 sql语句中join的用法
SQL语句left join/right join/inner join 的用法比较 SQL语句left join/right join/inner join 的用法比较
关于SQL 中的inner join的使用,是DOC文档,希望对大家有用,关于SQL 中的inner join的使用,是DOC文档,希望对大家有用
Sql语句用left join解决多表关联问题(关联套关联,例子和源码)一看就明白多表关联如何写SQl语句
SQL语句inner join,left join ,right join连接的不同之处, 非常实用
本文简单描述了sql语句join中on和where的区别以及其原理
sql语句中join的用法和效率说明.doc
10、说明:几个简单的基本的sql语句 选择:select * from table1 where 范围 插入:insert into table1(field1,field2) values(value1,value2) 删除:delete from table1 where 范围 更新:update table1 set field1...
画图解释 SQL join 语句1
LINQ to SQL语句之Join和Order By部分代码 语句描述:这个例子在From子句中使用外键导航筛选在西雅图的雇员,同时列出其所在地区。这条生成SQL语句为: SELECT [t0].[FirstName], [t0].[LastName], [t2]....
无论多么复杂的语句,都能分析出来(包括SQL各子句中嵌套的SQL语句) 5、数据库视图定义和重建 6、支持将SQL查询语句,替换为插入(Insert into)和更新(Update)语句 7、附属工具内嵌入Delphi IDE(支持Delphi 5和...
SQL语句优化——in,not in,exists,not exists, left join...on博客所需SQL语句2.txt,欢迎下载!
3. SQL SELECT 语句 5 4. SQL WHERE 子句 7 5. SQL AND & OR 运算符 8 6. SQL ORDER BY 子句 9 7. SQL INSERT INTO 语句 11 8. SQL UPDATE 语句 12 9. SQL DELETE 语句 13 10. SQL TOP 子句 13 11. SQL LIKE 操作符 ...
SQL语句优化——in,not in,exists,not exists, left join...on博客所需SQL语句.txt欢迎下载!
利用Transact-SQL语句声明一个长度为16的nchar型变量bookname,并赋初值为”SQL Server 数据库编程”。 运算符的应用,使用teaching数据库 查询生日在’1989-01-01’之后的学生信息; 3)系统函数的应用 编程计算...
1、支持绝大部分数据库,包括 大型数据库Oracle,Sybase(包括SQL AnyWhere),DB2,MS_SQL 中型数据库MS_Access,MySQL ... 10.3 SQL语句关键词高亮度显示 10.4 简单SQL查询语句转换为Delete,Update,Insert语句
Web开发中常用的SQL语句 说明:复制表(只复制结构,源表名:a 新表名:b) select * into b from a where 1<>1 说明:拷贝表(拷贝数据,源表名:a 目标表名:b) insert into b(a, b, c) select d,e,f from b; ...
10、说明:几个简单的基本的sql语句 选择:select * from table1 where 范围 插入:insert into table1(field1,field2) values(value1,value2) 删除:delete from table1 where 范围 更新:update table1 ...