MySQL_2.6【高级查询2】详细讲解

目录

一、多表查询

1、笛卡尔积现象

2、等值连接查询

3、自连接查询

4、内连接查询

5、外连接

二、子查询

1、单列子查询

2、单行子查询

3、多行子查询

4、多列子查询

5、关联子查询【了解】

6、子查询的综合应用

 加油!!!

 


一、多表查询

1、笛卡尔积现象

笛卡尔乘积 是数据库表连接的一种现象,连接两个或多个不相关的表,将第一个表(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时,应该注意笛卡尔积的潜在影响。如果没有指定任何连接条件,笛卡尔积的结果可能会非常大,这可能会导致性能问题。

2、等值连接查询

在 MySQL 中,等值连接查询是一种将两个表连接在一起的查询,两个表中具有相等值的列被连接在一起。等值连接查询的语法如下:

SELECT column1, column2, ...
FROM table1
INNER JOIN table2
ON table1.column1 = table2.column2;

其中,INNER JOIN 表示等值连接,ON table1.column1 = table2.column2 表示连接条件,column1column2 是两个表中具有相等值的列。

以下是等值连接查询的一个示例:

SELECT customer_id, customer_name, order_id, order_date
FROM customers
INNER JOIN orders
ON customers.id = orders.customer_id;

这条语句将从 customers 表和 orders 表中连接具有相等 id 值的行,并返回 customer_idcustomer_nameorder_idorder_date 列的值。

等值连接查询是一种非常常用的查询类型,它可以用于从两个表中检索数据。

通常是在存在主键外键关联关系的表之间的连接进行,使用"="连接相关的表

n个表进行等值连接查询,最少需要n-1个等值条件来约束

3、自连接查询

自连接查询是指将表与自身连接的查询。自连接查询通常用于检索表中的关系数据。

自连接查询的语法如下:

SELECT column1, column2, ...
FROM table1 AS t1
INNER JOIN table1 AS t2
ON t1.column1 = t2.column2;

其中,AS t1AS 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_idstudent_nameclass_name 列的值。

4、内连接查询

内连接查询使用 inner join 关键字实现, inner 可以省略。内连接查询时,条件用 on 连接,多个条件使用 () 将其括起来.

内连接查询是指将两个表连接在一起的查询,只返回两个表中具有相同值的行。内连接查询的语法如下:

SELECT column1, column2, ...
FROM table1
INNER JOIN table2
ON table1.column1 = table2.column2;

其中,INNER JOIN 表示内连接,ON table1.column1 = table2.column2 表示连接条件,column1column2 是两个表中具有相同值的列。

以下是内连接查询的一个示例:

SELECT customer_id, customer_name, order_id, order_date
FROM customers
INNER JOIN orders
ON customers.id = orders.customer_id;

这条语句将从 customers 表和 orders 表中连接具有相同 id 值的行,并返回 customer_idcustomer_nameorder_idorder_date 列的值。

5、外连接

外连接分为左外连接( 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 表示连接条件,column1column2 是两个表中具有相同值的列。

以下是左外连接查询的一个示例:

SELECT customer_id, customer_name, order_id, order_date
FROM customers
LEFT JOIN orders
ON customers.id = orders.customer_id;

这条语句将从 customers 表和 orders 表中连接具有相同 id 值的行,并返回 customer_idcustomer_nameorder_idorder_date 列的值。

如果 customers 表中存在 orders 表中不存在的行,则这些行也会返回,order_idorder_date 列将为 NULL

外连接查询是一种非常有用的查询类型,它可以用于从两个表中检索所有数据。

二、子查询

存在于另外一个SQL语句中、被小括号包起来的查询语句就是子查询。相对于子查询来 说,在外部直接执行的查询语句被称作主查询

子查询分为:

  • 单列子查询: 返回单行单列数据的子查询
  • 单行子查询: 返回单行多列数据的子查询
  • 多行子查询: 返回数据是多行单列的数据
  • 关联子查询: 子查询中如果使用了外部主SQL中的表或列,就说这个子查询跟外部SQL是 相关的

1、单列子查询

在 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"。

单列子查询是一种非常常用的查询类型,它可以用于从表中检索满足特定条件的行。

2、单行子查询

在 MySQL 中,单行子查询是指在 SELECT 语句中使用子查询,并且子查询只返回一行数据。单行子查询的语法如下:

SELECT column1, column2, ...
FROM table1
WHERE condition = (
    SELECT column1
    FROM table2
    WHERE condition2
);

其中,conditionWHERE 子句中的条件,column1column2SELECT 列表中的列。

以下是单行子查询的一个示例:

SELECT customer_id, customer_name
FROM customers
WHERE id = (
    SELECT customer_id
    FROM orders
    WHERE order_id = 1234567890;

这条语句将从 customers 表中检索 order_id 为 1234567890 的客户的客户 ID 和客户姓名。

3、多行子查询

1. 在 MySQL 中,多行子查询是指在 WHERE 子句中使用的子查询,该子查询返回多行数据。多行子查询的语法如下:

SELECT column1, column2, ...
FROM table1
WHERE column1 IN (SELECT column1 FROM table2);

其中,IN 是多行子查询的比较运算符,column1column2 是两个表中具有相同值的列。

以下是多行子查询的一个示例:

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 中,ANYALL 是多行子查询中使用的比较运算符。ANY 表示子查询返回的行中的任意一行,ALL 表示子查询返回的所有行。

  • >any 表示大于子查询中的任意一个值,即大于最小值
  • >all 表示大于子查询中的所有值,即大于最大的值

以下是 ANYALL 的使用示例:

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。

ANYALL 是多行子查询中非常有用的比较运算符,它们可以用于从两个表中检索数据。

4、多列子查询

在MySQL中,多列子查询是指在WHERE子句中使用的子查询,该子查询返回多列数据。多列子查询的语法如下:

SELECT column1, column2, ...
FROM table1
WHERE (column1, column2) IN (SELECT column1, column2 FROM table2);

其中,IN是多列子查询的比较运算符,column1column2是两个表中具有相同值的列。

以下是多列子查询的一个示例:

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的订单中。

5、关联子查询【了解】

查询哪些员工与SMITH不在同一个部门:

SELECT * 
FROM emp e 
WHERE EXISTS ( SELECT * FROM emp p WHERE p.ename = 'SMITH' AND p.deptno != e.deptno );

6、子查询的综合应用

子查询是 SQL 查询中非常强大的工具,它可以用于从两个或多个表中检索数据。子查询可以出现在 WHERE、JOIN 和 HAVING 子句中。

以下是 MySQL 中子查询的综合应用举例:

  • WHERE 子句中的子查询

子查询可以用来过滤外部查询返回的行。例如,以下查询将返回所有客户的 ID 和姓名,这些客户的订单状态为已完成:

SELECT customer_id, customer_name
FROM customers
WHERE customer_id IN (SELECT customer_id
                     FROM orders
                     WHERE order_status = 'completed');
  • JOIN 子句中的子查询

子查询可以用来将两个或多个表连接在一起。例如,以下查询将返回所有订单的信息,这些订单由在美国订购的客户下单:

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';
  • HAVING 子句中的子查询

子查询可以用来过滤 GROUP BY 子句返回的组。例如,以下查询将返回所有客户的数量,这些客户的订单总金额超过 100 美元:

SELECT customer_id, COUNT(*) AS order_count
FROM orders
GROUP BY customer_id
HAVING SUM(order_amount) > 100;

 加油!!!


你可能感兴趣的:(MySQL,高级查询,mysql,数据库)