一直以来,对于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
分享到:
相关推荐
在给出的示例中,LEFT JOIN SQL语句是: ```sql SELECT * FROM A LEFT JOIN B ON A.aID = B.bID ``` 输出结果展示了A表的所有记录,即使B表中没有对应的bID。对于B表中不存在的aID,bName列显示为NULL。 2. RIGHT ...
在IT行业中,编写SQL语句是一项必备技能,但手动编写和调试SQL语句可能会耗费大量时间和精力,尤其在处理复杂查询时。这就是"SQL语句万能生成器"的用途所在。 SQL语句生成器是一种软件工具,它能够帮助开发者自动...
本项目提供了一个Java源码工具,能够帮助用户便捷地将Oracle SQL语句转换为MySQL SQL语句。 Oracle SQL与MySQL SQL的主要差异在于以下几个方面: 1. **数据类型**:Oracle支持的数据类型如NUMBER、LONG、RAW等在...
在数据库管理系统(如MySQL、Oracle、SQL Server等)中,SQL语句是不可或缺的一部分。 1. SQL基础语法 SQL的基础语法包括SELECT、INSERT、UPDATE、DELETE四大语句,它们分别用于查询、插入、更新和删除数据。 - ...
**INNER JOIN** 是SQL中最常用的连接类型之一,主要用于从两个或多个表中提取数据,其中仅返回那些满足连接条件的记录。简单来说,INNER JOIN返回的是两个表中匹配部分的数据。 #### 二、INNER JOIN的语法结构 ...
在数据库管理与开发过程中,编写SQL语句是必不可少的一环。有时,我们可能会遇到需要执行非常长的SQL语句的情况。这些超长语句可能由于包含大量的条件、子查询或是数据量较大等原因而变得异常复杂。本文将围绕“SQL...
同时,本教程还涵盖了 SQL 高级知识,如 Top 语句、Like 语句、通配符、In 语句、Between 语句、Aliases 语句、Join 语句、Inner Join 语句、Left Join 语句、Right Join 语句、Full Join 语句、Union 语句、Select ...
### SQL Server 2005 基本方法...以上介绍了 SQL Server 2005 中的基本方法与常用语句,涵盖了数据库管理与数据操作的核心技能。通过熟练掌握这些知识,可以有效地管理和维护数据库系统,提高数据处理的效率与准确性。
学习并熟练掌握这些SQL语句将使你能够高效地操作和管理数据库,无论是在开发、数据分析还是数据库管理领域,SQL都是不可或缺的基础技能。通过"SQL 语句大全"文档,你可以深入理解并实践这些知识点,提升自己的数据库...
SQL Join 语句是数据库管理系统中最基本也是最重要的语句之一。它允许用户从多个表中检索数据,并将其组合成一个结果集。今天,我们将使用图形来解释 SQL Join 语句的各种类型。 INNER JOIN INNER JOIN 也称为等值...
在编程领域,尤其是在数据库操作中,SQL语句的嵌套是一项重要的技能。SQL(Structured Query Language,结构化查询语言)是用于管理关系数据库的标准语言,而嵌套SQL语句则是指在一个SQL语句内部嵌入另一个或多个SQL...
SQL语句包括SELECT(查询)、INSERT(插入)、UPDATE(更新)、DELETE(删除)等基本操作,还有JOIN(连接)、GROUP BY(分组)、HAVING(分组后的条件过滤)等高级功能。 C#,另一方面,是微软公司推出的一种面向...
LINQ to SQL语句之Join和Order By部分代码 语句描述:这个例子在From子句中使用外键导航筛选在西雅图的雇员,同时列出其所在地区。这条生成SQL语句为: SELECT [t0].[FirstName], [t0].[LastName], [t2]....
例如,要在Store_Information表格中找出所有不同的店名,可以使用以下SQL语句: SELECT DISTINCT store_name FROM Store_Information ### WHERE指令 WHERE指令让我们能够选择性地抓取资料。WHERE指令的语法结构...
本资源集合了泛微系统中与SQL Server数据库交互时常用的各种SQL语句,涵盖了组织架构、流程管理以及自定义需求等多个方面。以下是对这些SQL语句知识点的详细解释: 1. **组织架构相关SQL**: - 组织架构是企业信息...
10. 存储过程:存储过程是一组预编译的SQL语句,可以封装在单个数据库对象中。它们允许你创建可重用的代码,提高性能,并可以接受参数以实现更灵活的调用。 通过这个“SQL语句基础教程”,初学者将逐步了解和掌握...
在IT行业中,数据库管理和数据...总结来说,"通过解析SQL语句获取表血缘关系项目"是一个关键的数据管理实践,它依赖于对SQL的深入理解和合适的工具,以揭示数据库中的数据流动路径,从而支持更高效、更合规的数据操作。
《SQL语句大全》是一本全面介绍SQL语言的电子书籍,涵盖了从基础到高级的各种SQL操作,旨在帮助读者深入理解和熟练运用SQL进行数据库管理和数据处理。SQL,全称Structured Query Language,即结构化查询语言,是用于...