?🎉欢迎您来到我的MySQL基础复习专栏
☆* o(≧▽≦)o *☆哈喽~我是小小恶斯法克🍹
?博客主页:小小恶斯法克的博客
🎈该系列文章专栏:力扣刷题讲解-MySQL
🍹文章作者技术和水平很有限,如果文中出现错误,希望大家能指正🙏
📜 感谢大家的关注!???
目录
表:?
SalesPerson
+-----------------+---------+ | Column Name | Type | +-----------------+---------+ | sales_id | int | | name | varchar | | salary | int | | commission_rate | int | | hire_date | date | +-----------------+---------+ sales_id 是该表的主键列(具有唯一值的列)。 该表的每一行都显示了销售人员的姓名和 ID ,以及他们的工资、佣金率和雇佣日期。 表:Company +-------------+---------+ | Column Name | Type | +-------------+---------+ | com_id | int | | name | varchar | | city | varchar | +-------------+---------+ com_id 是该表的主键列(具有唯一值的列)。 该表的每一行都表示公司的名称和 ID ,以及公司所在的城市。表:?
Orders
+-------------+------+ | Column Name | Type | +-------------+------+ | order_id | int | | order_date | date | | com_id | int | | sales_id | int | | amount | int | +-------------+------+ order_id 是该表的主键列(具有唯一值的列)。 com_id 是 Company 表中 com_id 的外键(reference 列)。 sales_id 是来自销售员表 sales_id 的外键(reference 列)。 该表的每一行包含一个订单的信息。这包括公司的 ID 、销售人员的 ID 、订单日期和支付的金额。
编写解决方案,找出没有任何与名为?“RED”?的公司相关的订单的所有销售人员的姓名。
以?任意顺序?返回结果表。
返回结果格式如下所示。
示例 1:
输入: SalesPerson 表: +----------+------+--------+-----------------+------------+ | sales_id | name | salary | commission_rate | hire_date | +----------+------+--------+-----------------+------------+ | 1 | John | 100000 | 6 | 4/1/2006 | | 2 | Amy | 12000 | 5 | 5/1/2010 | | 3 | Mark | 65000 | 12 | 12/25/2008 | | 4 | Pam | 25000 | 25 | 1/1/2005 | | 5 | Alex | 5000 | 10 | 2/3/2007 | +----------+------+--------+-----------------+------------+ Company 表: +--------+--------+----------+ | com_id | name | city | +--------+--------+----------+ | 1 | RED | Boston | | 2 | ORANGE | New York | | 3 | YELLOW | Boston | | 4 | GREEN | Austin | +--------+--------+----------+ Orders 表: +----------+------------+--------+----------+--------+ | order_id | order_date | com_id | sales_id | amount | +----------+------------+--------+----------+--------+ | 1 | 1/1/2014 | 3 | 4 | 10000 | | 2 | 2/1/2014 | 4 | 5 | 5000 | | 3 | 3/1/2014 | 1 | 1 | 50000 | | 4 | 4/1/2014 | 1 | 4 | 25000 | +----------+------------+--------+----------+--------+ 输出: +------+ | name | +------+ | Amy | | Mark | | Alex | +------+ 解释: 根据表order中的订单 '3' 和 '4' ,容易看出只有 'John' 和 'Pam' 两个销售员曾经向公司 'RED' 销售过。所以我们需要输出表salesperson中所有其他人的名字。
?方法一 (not in)
1.先在company表中找出,name为red的com_id
2.再在orders表中找出,这个com_id所对应的销售员sales_id
3.再在SalesPerson表中找出销售id也就是sales_id不在刚刚id中的销售员,用到not in
4.根据这个id从SalesPerson表中返回销售员的姓名
5.代码如下
select name from SalesPerson where sales_id not in ( select sales_id from Orders where com_id in ( ( select com_id from Company where name = 'RED' ) ) )
首先,我们可以查询公司 'RED' 的销售信息,并将其作为临时表。然后尝试将这个表与 salesperson 表建立连接,因为它有销售员的名字信息。(where用来过滤出company表中name是red的数据)
SELECT ? ? * FROM ? ? orders o ? ? ? ? LEFT JOIN ? ? company c ON o.com_id = c.com_id WHERE ? ? c.name = 'RED' ;
注意:"LEFT OUTER JOIN" 可以写为 "LEFT JOIN"。
| order_id | date ? ? | com_id | sales_id | amount | com_id | name | city ? |
|----------|----------|--------|----------|--------|--------|------|--------|
| 3 ? ? ? ?| 3/1/2014 | 1 ? ? ?| 1 ? ? ? ?| 50000 ?| 1 ? ? ?| RED ?| Boston |
| 4 ? ? ? ?| 4/1/2014 | 1 ? ? ?| 4 ? ? ? ?| 25000 ?| 1 ? ? ?| RED ?| Boston |
显然,表中的 sales_id 列存在于 salesperson 表中,所以我们可以将其作为子查询的条件,然后使用 NOT IN 条件来获取目标数据。SELECT ? ? s.name FROM ? ? salesperson s WHERE ? ? s.sales_id NOT IN (SELECT ? ? ? ? ? ? o.sales_id ? ? ? ? FROM ? ? ? ? ? ? orders o ? ? ? ? ? ? ? ? LEFT JOIN ? ? ? ? ? ? company c ON o.com_id = c.com_id ? ? ? ? WHERE ? ? ? ? ? ? c.name = 'RED') ;
作者:力扣官方题解
链接:https://leetcode.cn/problems/sales-person/solutions/2366337/xiao-shou-yuan-by-leetcode-solution-wg7i/
来源:力扣(LeetCode)
?
?表:?
Triangle
+-------------+------+ | Column Name | Type | +-------------+------+ | x | int | | y | int | | z | int | +-------------+------+ 在 SQL 中,(x, y, z)是该表的主键列。 该表的每一行包含三个线段的长度。
对每三个线段报告它们是否可以形成一个三角形。
以?任意顺序?返回结果表。
查询结果格式如下所示。
示例 1:
输入: Triangle 表: +----+----+----+ | x | y | z | +----+----+----+ | 13 | 15 | 30 | | 10 | 20 | 15 | +----+----+----+ 输出: +----+----+----+----------+ | x | y | z | triangle | +----+----+----+----------+ | 13 | 15 | 30 | No | | 10 | 20 | 15 | Yes | +----+----+----+----------+
?
要确定每组线段是否可以形成一个三角形,我们可以使用以下SQL查询:
SELECT x, y, z, CASE WHEN x + y > z AND x + z > y AND y + z > x THEN 'Yes' ELSE 'No' END AS triangle FROM Triangle;
这条SQL查询首先从
Triangle
表中选择每组线段的长度。然后,它使用CASE
语句来对每组线段进行条件判断。如果任意两边之和大于第三边(即三角形的基本条件),则将结果设置为'Yes',否则设置为'No'。根据提供的示例数据,上述查询将返回以下结果:
+----+----+----+----------+ | x | y | z | triangle | +----+----+----+----------+ | 13 | 15 | 30 | No | | 10 | 20 | 15 | Yes | +----+----+----+----------+
这是因为对于第一行数据 (13, 15, 30),任意两边之和不大于第三边,所以不能构成三角形;而对于第二行数据 (10, 20, 15),任意两边之和大于第三边,所以可以构成三角形。
因此,通过这个查询,我们可以清晰地了解每组线段是否可以形成一个三角形。
或者用if也比较简单
select x, y, z, if(x+y>z and x+z>y and y+z>x, 'Yes', 'No') as triangle from triangle
在MySQL中,
CASE
语句和IF
函数都用于实现条件逻辑。下面是它们的详细语法:CASE 语句
简单 CASE 表达式
CASE case_expression WHEN when_expression THEN result [WHEN when_expression THEN result ...] [ELSE else_result] END
搜索 CASE 表达式
CASE WHEN condition1 THEN result1 WHEN condition2 THEN result2 ... ELSE else_result END
case_expression
:要进行比较的表达式或列。when_expression
:与case_expression
进行比较的表达式或值。result
:如果case_expression
等于when_expression
,则返回的结果。condition1, condition2
:要评估的条件。result1, result2
:对应于满足条件的结果。else_result
:如果没有任何一个条件匹配,则返回的默认结果。IF 函数
IF(expr, true_value, false_value)
expr
:要评估的条件或表达式。true_value
:如果expr
为真,则返回的值。false_value
:如果expr
为假,则返回的值。示例
使用 CASE 表达式
SELECT name, CASE WHEN age < 18 THEN 'Minor' WHEN age BETWEEN 18 AND 65 THEN 'Adult' ELSE 'Senior' END AS age_group FROM people;
使用搜索 CASE 表达式
SELECT product_name, CASE WHEN quantity > 10 THEN 'In Stock' WHEN quantity <= 10 AND quantity > 0 THEN 'Limited Stock' ELSE 'Out of Stock' END AS stock_status FROM products;
使用 IF 函数
SELECT product_name, IF(quantity > 10, 'In Stock', 'Out of Stock') AS stock_status FROM products;
希望对你有帮助!