目录
SQL之母 - SQL自学网站SQL自学网站http://sqlmother.yupi.icu/#/learn/level20
关联查询——cross join
参考: http://sqlmother.yupi.icu/#/learn/level20
概述:
CROSS JOIN
是一种简单的关联查询,不需要任何条件来匹配行,它直接将左表的 每一行 与右表的 每一行 进行组合,返回的结果是两个表的笛卡尔积。
SELECT
s.student_id,
s.student_name,
s.gender,
s.age,
c.class_id,
c.class_name,
s.score
FROM
students s
CROSS JOIN classes c;
结果:
关联查询 inner join
参考:http://sqlmother.yupi.icu/#/learn/level21
概述:
在 SQL 中,INNER JOIN 是一种常见的关联查询方式,它根据两个表之间的关联条件,将满足条件的行组合在一起。
注意,INNER JOIN 只返回两个表中满足关联条件的交集部分,即在两个表中都存在的匹配行。
SELECT e.emp_name, e.salary, e.department, d.manager
FROM employees e
JOIN departments d ON e.department = d.department;
SELECT *
FROM table1
INNER JOIN table2 ON table1.column = table2.column;
关联查询 outher join
参考:http://sqlmother.yupi.icu/#/learn/level22
概述:
在 SQL 中,OUTER JOIN 是一种关联查询方式,它根据指定的关联条件,将两个表中满足条件的行组合在一起,并 包含没有匹配的行 。
在 OUTER JOIN 中,包括 LEFT OUTER JOIN 和 RIGHT OUTER JOIN 两种类型,它们分别表示查询左表和右表的所有行(即使没有被匹配),再加上满足条件的交集部分。
SELECT e.emp_name, e.salary, e.department, d.manager
FROM employees e
LEFT JOIN departments d ON e.department = d.department;
-- LEFT OUTER JOIN(左外连接)
SELECT *
FROM table1
LEFT JOIN table2 ON table1.column = table2.column;
-- RIGHT OUTER JOIN(右外连接)
SELECT *
FROM table1
RIGHT JOIN table2 ON table1.column = table2.column;
-- FULL OUTER JOIN(全外连接)
SELECT *
FROM table1
FULL JOIN table2 ON table1.column = table2.column;
inner join 和outher join 的区别
INNER JOIN
和 OUTER JOIN
是 SQL 中用于联接表的两种不同类型的操作。它们之间的主要区别在于如何处理匹配和不匹配的行。
INNER JOIN(内连接):
- 只返回两个表中匹配的行。
- 如果两个表中的连接列(通常是主键和外键)具有相同的值,那么这些行将被包括在结果中。
- 不匹配的行将被排除在结果之外。
OUTER JOIN(外连接):
- 返回两个表中所有的行,以及匹配的行。
- 如果两个表中的连接列具有相同的值,那么这些行将被包括在结果中。
- 如果某一行在一个表中有匹配,而在另一个表中没有匹配,那么仍然会包括这一行,未匹配的列将会用 NULL 值填充。
总的来说,INNER JOIN
用于获取两个表之间匹配的行,而 OUTER JOIN
用于获取所有行,同时在没有匹配时用 NULL 填充未匹配的列。OUTER JOIN
还可以分为 LEFT OUTER JOIN
、RIGHT OUTER JOIN
和 FULL OUTER JOIN
,取决于你想要的联接结果。
子查询 IN
参考:http://sqlmother.yupi.icu/#/learn/level23
概述
子查询是指在一个查询语句内部 嵌套 另一个完整的查询语句,内层查询被称为子查询。子查询可以用于获取更复杂的查询结果或者用于过滤数据。
当执行包含子查询的查询语句时,数据库引擎会首先执行子查询,然后将其结果作为条件或数据源来执行外层查询。
IN 分析
在这个查询中,IN
是一个用于比较的关键字,它用于判断某个值是否在子查询的结果集中。
-- 主查询
SELECT name, total_amount
FROM customers
WHERE customer_id IN (
-- 子查询
SELECT DISTINCT customer_id
FROM orders
WHERE total_amount > 200
);
子查询 exists
参考:http://sqlmother.yupi.icu/#/learn/level24
exists 分析
其中,子查询中的一种特殊类型是 "exists" 子查询,用于检查主查询的结果集是否存在满足条件的记录,它返回布尔值(True 或 False),而不返回实际的数据。
-- 主查询
SELECT name, total_amount
FROM customers
WHERE EXISTS (
-- 子查询
SELECT 1
FROM orders
WHERE orders.customer_id = customers.customer_id
);