1.连接查询
2.连接方式
1.连接查询
连接查询是关系数据库中最主要的查询,主要包括内连接、外连接和交叉连接等。通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点,也是它区别于其它类型数据库管理系统的一个标志。在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在一个表中。当检索数据时,通过连接操作查询出存放在多个表中的不同实体的信息。连接操作给用户带来很大的灵活性,他们可以在任何时候增加新的数据类型。为不同实体创建新的表,然后通过连接进行查询。--摘自百度百科
2.连接方式
2.1自然连接(natural join)
自然连接(Natural join)是一种特殊的等值连接,要求两个关系表中进行比较的属性组必须是名称相同的属性组,并且在结果中把重复的属性列去掉(即:留下名称相同的属性组中的其中一组)。
SELECT * FROM employees NATURAL JOIN salaries;
自然连接将两个关系组中在相同名称的属性上具有相同的值的行记录进行匹配,并且重复的属性列去掉,这样新的一行将出现在查询结果中,而那些没被匹配的行不出现在结果中。因此自然连接的结果会有数据丢失,这些丢失的数据就是那些没有匹配的数据。
2.2内连接(inner join)
内连接( [inner] join)是从查询结果表中删除与其他被连接表中没有匹配行的所有行,所以内连接可能会丢失信息。注明,[inner] join表示inner可以省略。
--on
SELECT departments.`dept_name` AS '单位名称',dept_emp.`dept_no` '部门编号' FROM departments INNER JOIN dept_emp ON departments.`dept_no`=dept_emp.`dept_no`;
--where
SELECT departments.`dept_name` AS '单位名称',dept_emp.`dept_no` '部门编号' FROM departments INNER JOIN dept_emp where departments.`dept_no`=dept_emp.`dept_no`;
--using
SELECT departments.`dept_name` AS '单位名称',dept_emp.`dept_no` '部门编号' FROM departments INNER JOIN dept_emp USING(dept_no);
--简写
SELECT dt1.`dept_name` AS '单位名称',de1.`dept_no` '部门编号' FROM departments dt1 INNER JOIN dept_emp de1 USING(dept_no);
2.3外连接(outer join)
外连接(outer join)
外连接不仅返回匹配的行,也会返回不匹配的行。外连接不支持where条件写法。
左外连接(left [outer] join)
列出左边表里所有的数据行,加上右边匹配到的行,在右表中没有匹配行,均为空值(null)。
右外连接(right [outer] join)
列出右边表里所有的数据行,加上左边匹配到的行,在左表中没有匹配行,均为空值(null)。
全外连接(full [outer] join)
返回左表和右表中的所有行,当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值(null)。Mysql不支持full join.
--left outer join
mysql> use jss_sip;
Database changed
mysql> SELECT * FROM jss_tb1;
+----+------+------+------+-------------+
| id | name | age | sex | tel |
+----+------+------+------+-------------+
| 1 | tom | 11 | 男 | 15300000000 |
| 2 | bob | 12 | 女 | 15300000001 |
| 3 | j00 | 13 | 男 | 15300000002 |
| 4 | j01 | 14 | 女 | 15300000003 |
| 5 | j02 | 15 | 女 | 15300000004 |
+----+------+------+------+-------------+
5 rows in set (0.00 sec)
mysql> SELECT * FROM jss_tb2;
+----+------+------+------+-------------+
| id | name | age | sex | tel |
+----+------+------+------+-------------+
| 1 | tom | 11 | 男 | 15300000000 |
| 2 | bob | 12 | 女 | 15300000001 |
| 3 | lili | 13 | 女 | 15312000000 |
| 4 | tim | 22 | 女 | 15600000000 |
+----+------+------+------+-------------+
4 rows in set (0.00 sec)
mysql> SELECT * FROM jss_tb1 jt1 LEFT OUTER JOIN jss_tb2 jt2 ON jt1.`name`=jt2.`name`;
+----+------+------+------+-------------+------+------+------+------+-------------+
| id | name | age | sex | tel | id | name | age | sex | tel |
+----+------+------+------+-------------+------+------+------+------+-------------+
| 1 | tom | 11 | 男 | 15300000000 | 1 | tom | 11 | 男 | 15300000000 |
| 2 | bob | 12 | 女 | 15300000001 | 2 | bob | 12 | 女 | 15300000001 |
| 3 | j00 | 13 | 男 | 15300000002 | NULL | NULL | NULL | NULL | NULL |
| 4 | j01 | 14 | 女 | 15300000003 | NULL | NULL | NULL | NULL | NULL |
| 5 | j02 | 15 | 女 | 15300000004 | NULL | NULL | NULL | NULL | NULL |
+----+------+------+------+-------------+------+------+------+------+-------------+
5 rows in set (0.00 sec)
2.4交叉连接(cross join)
交叉连接(cross join)把表A和表B的数据进行一个N*M的组合,即笛卡尔积。
SELECT * FROM jss_tb1 jt1 CROSS JOIN jss_tb2 jt2 ON jt1.`name`=jt2.`name`;
2.5半连接(semi join)
一个数据集中某些字段存在于另一个数据集合中的记录时,常常会用到in 或者exists
mysql> SELECT * FROM jss_tb1 WHERE EXISTS (SELECT * FROM jss_tb2 WHERE jss_tb1.`name`=jss_tb2.`name`) ORDER BY id;
+----+------+------+------+-------------+
| id | name | age | sex | tel |
+----+------+------+------+-------------+
| 1 | tom | 11 | 男 | 15300000000 |
| 2 | bob | 12 | 女 | 15300000001 |
+----+------+------+------+-------------+
2 rows in set (0.00 sec)
2.6反连接(anti join)
从一个结果集合中返回不在另一个结果集中的数据行。多用于!=,not in 等查询。
SELECT * FROM jss_tb1 WHERE jss_tb1.`name` NOT IN (SELECT `name` FROM jss_tb2 );
2.7 自连接(self join)
自己与自己连接.
SELECT jt1.`id`,jt1.`name`,jt2.`age`,jt2.`tel` FROM jss_tb1 jt1,jss_tb2 jt2 WHERE jt1.`name`=jt2.`name`;
关注公众号,查阅数据库与Linux知识不迷路。公众号:数据库 BOSS





