目录
一、多表查询
1、笛卡尔积现象
2、等值连接查询
3、自连接查询
4、内连接查询
5、外连接
二、子查询
1、单列子查询
2、单行子查询
3、多行子查询
4、多列子查询
5、关联子查询【了解】
6、子查询的综合应用
加油!!!
笛卡尔乘积 是数据库表连接的一种现象,连接两个或多个不相关的表,将第一个表(T1)中的每一行与第二个表(T2)中的每一行进行组合,得到的结果集就是笛卡尔积。在没有任何限制条件的情况下,两表连接必然会形成笛卡尔积。如果表1有m行a列,表2有n行b列,两表无条件连接时会将两表里所有行两两组合到一起,所形成的表就有m*n行,a+b列 。所谓的笛卡尔乘积即是每个表的每一行都和其他表的每一 行组合。
以下是笛卡尔积的例子:
SELECT *
FROM customers
CROSS JOIN orders;
这条语句将customers表和orders表中的所有行连接在一起。如果customers表中有1000行,orders表中有1000行,那么笛卡尔积的结果将有1000万行。
笛卡尔积通常不是我们想要的结果。我们通常希望在连接两个表时指定一些连接条件,以便只返回满足条件的行。例如,我们可以使用以下语句来返回订单金额大于100美元的订单:
SELECT *
FROM customers
INNER JOIN orders
ON customers.id = orders.customer_id
WHERE order_amount > 100;
这条语句将只返回订单金额大于100美元的订单。
在使用MySQL时,应该注意笛卡尔积的潜在影响。如果没有指定任何连接条件,笛卡尔积的结果可能会非常大,这可能会导致性能问题。
在 MySQL 中,等值连接查询是一种将两个表连接在一起的查询,两个表中具有相等值的列被连接在一起。等值连接查询的语法如下:
SELECT column1, column2, ...
FROM table1
INNER JOIN table2
ON table1.column1 = table2.column2;
其中,INNER JOIN
表示等值连接,ON table1.column1 = table2.column2
表示连接条件,column1
和 column2
是两个表中具有相等值的列。
以下是等值连接查询的一个示例:
SELECT customer_id, customer_name, order_id, order_date
FROM customers
INNER JOIN orders
ON customers.id = orders.customer_id;
这条语句将从 customers
表和 orders
表中连接具有相等 id
值的行,并返回 customer_id
、customer_name
、order_id
和 order_date
列的值。
等值连接查询是一种非常常用的查询类型,它可以用于从两个表中检索数据。
通常是在存在主键外键关联关系的表之间的连接进行,使用"="连接相关的表
n个表进行等值连接查询,最少需要n-1个等值条件来约束
自连接查询是指将表与自身连接的查询。自连接查询通常用于检索表中的关系数据。
自连接查询的语法如下:
SELECT column1, column2, ...
FROM table1 AS t1
INNER JOIN table1 AS t2
ON t1.column1 = t2.column2;
其中,AS t1
和 AS t2
是表的别名。
SELECT t1.student_id, t1.student_name, t2.class_name
FROM students AS t1
INNER JOIN classes AS t2
ON t1.class_id = t2.class_id;
这条语句将从 students
表和 classes
表中连接具有相同 class_id
值的行,并返回 student_id
、student_name
和 class_name
列的值。
内连接查询使用 inner join 关键字实现, inner 可以省略。内连接查询时,条件用 on 连接,多个条件使用 () 将其括起来.
内连接查询是指将两个表连接在一起的查询,只返回两个表中具有相同值的行。内连接查询的语法如下:
SELECT column1, column2, ...
FROM table1
INNER JOIN table2
ON table1.column1 = table2.column2;
其中,INNER JOIN
表示内连接,ON table1.column1 = table2.column2
表示连接条件,column1
和 column2
是两个表中具有相同值的列。
以下是内连接查询的一个示例:
SELECT customer_id, customer_name, order_id, order_date
FROM customers
INNER JOIN orders
ON customers.id = orders.customer_id;
这条语句将从 customers
表和 orders
表中连接具有相同 id
值的行,并返回 customer_id
、customer_name
、order_id
和 order_date
列的值。
外连接分为左外连接( left outer join ) 和右外连接( right outer join )其值 oute r 可以省略。外连接查询时,条件用 on 连接,多个条件使用 () 将其括起来. 左外连接表示以左表为主表,右外连接表示以右表为主表。查询时将主表信息在从表中进 行匹配。
在 MySQL 中,外连接查询是指将两个表连接在一起的查询,即使两个表中没有相同值的行,也返回所有行。外连接查询的语法如下:
SELECT column1, column2, ...
FROM table1
LEFT [OUTER] JOIN table2
ON table1.column1 = table2.column2;
其中,LEFT [OUTER] JOIN
表示左外连接,ON table1.column1 = table2.column2
表示连接条件,column1
和 column2
是两个表中具有相同值的列。
以下是左外连接查询的一个示例:
SELECT customer_id, customer_name, order_id, order_date
FROM customers
LEFT JOIN orders
ON customers.id = orders.customer_id;
这条语句将从 customers
表和 orders
表中连接具有相同 id
值的行,并返回 customer_id
、customer_name
、order_id
和 order_date
列的值。
如果 customers
表中存在 orders
表中不存在的行,则这些行也会返回,order_id
和 order_date
列将为 NULL
。
外连接查询是一种非常有用的查询类型,它可以用于从两个表中检索所有数据。
存在于另外一个SQL语句中、被小括号包起来的查询语句就是子查询。相对于子查询来 说,在外部直接执行的查询语句被称作主查询
子查询分为:
在 MySQL 中,单列子查询是指在 WHERE 子句中使用的子查询,该子查询返回单个列的值。单列子查询的语法如下:
WHERE column IN (SELECT column FROM table WHERE condition);
其中,column
是主查询中使用的列,column
是子查询中使用的列,condition
是子查询的条件。
以下是单列子查询的一个示例:
SELECT *
FROM customers
WHERE id IN (SELECT customer_id FROM orders WHERE order_status = 'paid');
这条语句将从 customers
表中检索所有客户的记录,他们的 ID 在 orders
表中存在,订单状态为 "paid"。
单列子查询是一种非常常用的查询类型,它可以用于从表中检索满足特定条件的行。
在 MySQL 中,单行子查询是指在 SELECT
语句中使用子查询,并且子查询只返回一行数据。单行子查询的语法如下:
SELECT column1, column2, ...
FROM table1
WHERE condition = (
SELECT column1
FROM table2
WHERE condition2
);
其中,condition
是 WHERE
子句中的条件,column1
和 column2
是 SELECT
列表中的列。
以下是单行子查询的一个示例:
SELECT customer_id, customer_name
FROM customers
WHERE id = (
SELECT customer_id
FROM orders
WHERE order_id = 1234567890;
这条语句将从 customers
表中检索 order_id
为 1234567890 的客户的客户 ID 和客户姓名。
1. 在 MySQL 中,多行子查询是指在 WHERE 子句中使用的子查询,该子查询返回多行数据。多行子查询的语法如下:
SELECT column1, column2, ...
FROM table1
WHERE column1 IN (SELECT column1 FROM table2);
其中,IN
是多行子查询的比较运算符,column1
和 column2
是两个表中具有相同值的列。
以下是多行子查询的一个示例:
SELECT customer_id, customer_name
FROM customers
WHERE customer_id IN (SELECT customer_id FROM orders WHERE order_status = 'completed');
这条语句将从 customers
表中检索所有顾客的 ID 和姓名,这些顾客的订单状态为 completed
。
2. 在 MySQL 中,ANY
和 ALL
是多行子查询中使用的比较运算符。ANY
表示子查询返回的行中的任意一行,ALL
表示子查询返回的所有行。
以下是 ANY
和 ALL
的使用示例:
SELECT customer_id, customer_name
FROM customers
WHERE customer_id > ANY (SELECT customer_id FROM orders WHERE order_status = 'completed');
这条语句将从 customers
表中检索所有顾客的 ID 和姓名,这些顾客的 ID 大于 orders
表中订单状态为 completed
的顾客的 ID。
SELECT customer_id, customer_name
FROM customers
WHERE customer_id > ALL (SELECT customer_id FROM orders WHERE order_status = 'completed');
这条语句将从 customers
表中检索所有顾客的 ID 和姓名,这些顾客的 ID 大于 orders
表中所有订单状态为 completed
的顾客的 ID。
ANY
和 ALL
是多行子查询中非常有用的比较运算符,它们可以用于从两个表中检索数据。
在MySQL中,多列子查询是指在WHERE子句中使用的子查询,该子查询返回多列数据。多列子查询的语法如下:
SELECT column1, column2, ...
FROM table1
WHERE (column1, column2) IN (SELECT column1, column2 FROM table2);
其中,IN
是多列子查询的比较运算符,column1
和column2
是两个表中具有相同值的列。
以下是多列子查询的一个示例:
SELECT customer_id, customer_name
FROM customers
WHERE (customer_id, customer_name)
IN (SELECT customer_id, customer_name FROM orders WHERE order_status = 'completed');
这条语句将从customers
表中检索所有顾客的ID和姓名,这些顾客的ID和姓名都出现在orders
表中订单状态为completed
的订单中。
查询哪些员工与SMITH不在同一个部门:
SELECT *
FROM emp e
WHERE EXISTS ( SELECT * FROM emp p WHERE p.ename = 'SMITH' AND p.deptno != e.deptno );
子查询是 SQL 查询中非常强大的工具,它可以用于从两个或多个表中检索数据。子查询可以出现在 WHERE、JOIN 和 HAVING 子句中。
以下是 MySQL 中子查询的综合应用举例:
子查询可以用来过滤外部查询返回的行。例如,以下查询将返回所有客户的 ID 和姓名,这些客户的订单状态为已完成:
SELECT customer_id, customer_name
FROM customers
WHERE customer_id IN (SELECT customer_id
FROM orders
WHERE order_status = 'completed');
子查询可以用来将两个或多个表连接在一起。例如,以下查询将返回所有订单的信息,这些订单由在美国订购的客户下单:
SELECT order_id, order_date, customer_id, customer_name
FROM orders
INNER JOIN customers
ON customers.customer_id = orders.customer_id
WHERE customers.country = 'USA';
子查询可以用来过滤 GROUP BY 子句返回的组。例如,以下查询将返回所有客户的数量,这些客户的订单总金额超过 100 美元:
SELECT customer_id, COUNT(*) AS order_count
FROM orders
GROUP BY customer_id
HAVING SUM(order_amount) > 100;