2019独角兽企业重金招聘Python工程师标准>>>
深入理解SQL的四种连接-左外连接、右外连接、内连接、全连接_Mysql_脚本之家
SQL 使用连接_w3cschool
- SQL连接类型
a、内连接(INNER JOIN):当两个表中存在匹配时,才返回行( 返回具有where,on条件相的信息)内联接使用比较运算符根据每个表共有的列的值匹配两个表中的行
b、外连接
1、左连接(LEFT JOIN):返回左表中所有行,即使右表中没有匹配的行
2、右连接(RIGHT JOIN):返回右表中的所有行,即使左表中没有匹配的行
3、全连接(FULL JOIN):只要某一个表存在匹配,就返回行
c、笛卡尔连接(CARTESIAN JOIN):返回两个或者更多的表中记录集的笛卡尔积
- 内连接
- 等值结合
a、结合
是把两个或多个表组合在一起来获取数据
b、结合条件的未知
要结合的表列在 FROM 子句里,而结合是在 WHERE 子句里完成的。
- 等值结合(内部结合)
利用通用字段结合两个表,通常用主键
语法
SELECT TABLE1.CONLUMN1,
TABLE2.CONLUMN2...
FROM TABLE1,
TABLE2 [, TABLE3]
--表名. 作为限定字段
WHERE TABLE1.CONLUMN_NAME = TABLE2.CONLUMN_NAME
[AND TABLE1.CONLUMN_NAME = TABLE3.CONLUMN_NAME]
案例1
SELECT EMPLOYEE_TBL.EMP_ID,
EMPLOYEE_PAY_TBL.DATE_HIRE
FROM EMPLOYEE_TBL,
EMPLOYEE_PAY_TBL
WHERE EMPLOYEE_TBL.EMP_ID = EMPLOYEE_TBL.EMP_ID
案例2
select a.*,b.*
from a inner jion b
on a.id = b.parent_id
结果
其实就是结合两个a.id = parent_id一样的数据
- 可以利用 INNER JOIN语法来提高可读性
语法
SELECT TABLE1.COLUMN1,TABLE2.CLOUMN2
FROM TABLE1
/*
WHERE子句被结合操作符去掉
INNER JION后面是结合的表
ON 后面结合操作符
*/
INNER JION TABLE2
ON TABLE1.COLUMN_NAME = TABLE.COLUMN_NAME
案例
SELECT EMPLOYEE_TBL.EMP_ID,
EMPLOYEE_PAY_TBL.DATE_HIRE
FORM EMPLOYEE_TBL
INNER JION EMPLOYEE_PAY_TBL
ON EMPLOYYE_TBL.EMP_ID = EMPLOYEE_TBL,EMP_ID
- 不等值结合
意思WHERE 条件不想等全部拿出来,根据同一个字段在两个表里值不想等来实现结合
语法
SELECT TABLE1.COLUNM,TABLE2.COLUMN
FROM TABLE1,TABLE2
WHERE TABLE1_COLUMNNAME <> TABLE2_COLUMNNAME
- 外连接
- 左连接(LEFT JOIN 或 LEFT OUTER JOIN)
左向外连接的结果集包括 LEFT OUTER 子句中指定的左表的所有行,而不仅仅是连接所匹配的行,如果左表中的某行在右表中没有匹配行,则连接后的结果集中右表所选择列表均为空值
语法
SELECT table1.column1,table2.column2...
FROM table1
LEFT JOIN table2
ON table1.common_field = table2.common_field;
将两个表用左连接
SELECT ID,NAME,AMOUNT,DATE
FORM CUSTOMERS
LEFT JION ORDERS
ON CUSTOMERS.ID = ORDERS.ID
输出
案例2
表A记录如下: aID aNum 1 a20050111 2 a20050112 3 a20050113 4 a20050114 5 a20050115 表B记录如下: bID bName 1 2006032401
2 2006032402
3 2006032403
4 2006032404
8 2006032408
elect * from A
left join B
on A.aID = B.bID
结果
- 右连接( RIGHT JOIN或 RIGHT OUTER JOIN)
右向外连接是左向外连接的反向连接,将返回右表的所有行,如果右表的某行在坐标中没有匹配行,则将左表返回空值
语法
SELECT table1.column,table2.column...
FROM table1
RIGHT JION table2
ON table1.common_field = table2.common_field
- 全连接(FULL JOIN 或 FULL OUTER JOIN)
完整外部连接返回左表和右表中的所有行,当某行在另一个表中没有匹配时,则另一个表的选择列表列包含空值,如果表之间有匹配行,则整个结果行包含基表的数据值
语法
SELECT table1.column1,table2.column2...
FROM tabel1
FULL JOIN table2
ON table1.common_field = table2.common_field
注:
MySQL中不支持该种方法,那么使用UNION ALL子句将左连接和右链接结果组合在一起
语法
SELECT table1.column1,table2.column
FROM table1
LEFT JOIN table2
ON table1.common_filed = table2.common_filed
UNION ALL
SELECT table1.column1,table2.column
FROM table1
RIGHT JOIN table2
ON table1.common_filed = table2.common_filed
- 笛卡尔连接(交叉连接 CROSS JOIN)
返回左表中的所有行,左表中的每一行与右表中的所有行组合,交叉联接也称作笛卡尔积
语法
SELECT table1.column1,table2.column2...
FROM table1,table2 [,table3] --隐式的连接方式,忽略了 cross jion 其实是 table1 cross jion table2
案例
将会输出两者条数乘积的总条数
- 自结合
- 使用基表
如果需要从两个表里获取数据,但它们又没有公用字段,我们就必须结合另一个表,这个表与前面两个表都有公用字段,这个表被称为基表,基表用于结合到具有公用字段的一个或多个表,或是结合没用公用字段的多个表
案例
/*
ORDERS_TBL拥有CUST_ID,PROD_ID,通过这个来建立联系
*/
SELECT C.CUST_NAMW,P.PROD_DESC
FROM CUSTOMER_TBL C,
PRODUCTS_TBL P,
ORDERS_TBL O
WHERE C.CUST_ID = O.CUST_ID
AND P.PROD_ID = O.PROD_ID