MySQL基本多表查询语句

所谓的多表查询就是同时查询多张表才能得到需要的数据
MySQL基本多表查询语句_第1张图片

1.子查询:

1.简要概述
将一个查询结果作为另一个查询语句的一部分

SELECT * FROM employee WHERE salary=(SELECT MAX(salary) FROM employee);

子查询需要放在()中先执行子查询,将子查询的结果作为父查询的一部分

2.4种子查询:
1.单行单列
子查询结果是单列,在WHERE后面作为条件
2.单行多列
子查询结果是多行单列,结果集类似于一个数组,在WHERE后面作为条件,父查询使用IN运算符
3.多行多列
子查询结果是多列,在FROM后面作为,

SELECT 查询字段 FROM (子查询) 表别名 WHERE 条件;

4.作为计算字段使用子查询
例如:两张表:
表一:MySQL基本多表查询语句_第2张图片
表二:
MySQL基本多表查询语句_第3张图片
我想查询每一个用户的订单数量

SELECT cust_name,(SELECT COUNT(*) FROM ordersWHERE orders.`cust_id` = customers.`cust_id`) AS 订单数 FROM customers ORDER BY customers.`cust_name`;

联结表

内连接
隐式:SELECT 字段 FROM 表1, 表2 WHERE 条件;
显式:

SELECT 字段 FROM 表1 INNER JOIN 表2 ON 表连接条件;
SELECT 字段 FROM 表1 JOIN 表2 ON 表连接条件;
ON 用于去除笛卡尔积,如有后面还有其他条件使用WHERE

笛卡尔积:
没有联结条件的表关系返回的结果为笛卡儿积。检索出的行的数目将是第一个表中的数乘以第二个表中的行数。
外连接:
1.左连接:SELECT 字段名 FROM 左表 LEFT OUTER JOIN 右表 ON 表连接件;
特点:满足要求的数据显示,并且左表不满足要求的数据也显示
2.右连接:

SELECT 字段名 FROM 左表 RIGHT OUTER JOIN 右表 ON 表连接条件

特点:满足要求的数据显示,并且右表不满足要求的数据也显示

自连接:
假如你发现某物品(其ID为DTNTR)存在问题,因此想知道生产该物
品的供应商生产的其他物品是否也存在这些问题。此查询要求首先找到
生产ID为DTNTR的物品的供应商,然后找出这个供应商生产的其他物品。
MySQL基本多表查询语句_第4张图片
下面是解决此问题的一种方法:

SELECT prod_name,prod_id FROM products WHERE vend_id = (SELECT vend_id FROM products WHERE prod_id = 'DTNTR');

使用自连接:
通过题目的要求找出一致点也就是vend_id
那么可以写成这个样子

SELECT p1.prod_id,p1.prod_name FROM products AS p1,products AS p2
WHERE p1.`vend_id`= p2.`vend_id`
AND p2.`prod_id` ='DTNTR';

可以看出使用了两张表结构一样的表

然后上面代码中还是用了表别名,应该注意,表别名只在查询执行中使用。与列别名不一样,表别名
不返回到客户机。

你可能感兴趣的:(MySQL)