SQL 语句 增删改查、边学习边增加中..... 这一部分为select

SQL语句按照最大的类别分为

  1、增加 insert 

  2、删除 delete  https://www.cnblogs.com/kuangmeng/p/17756654.html

  3、修改update  https://www.cnblogs.com/kuangmeng/p/17758060.html

  4、查询 select  https://www.cnblogs.com/kuangmeng/p/17756425.html

这一部分为select 查询操作,以及对应的Leecode题,进行加深印象。通常  select * from 表名 ,这条SQL语句代表查询表名的所有数据。

175. 组合两个表    

联合两个表进行查询,本人采用的是下面SQL ,但是返回的是 Person.personId = Address.personId 的数据, 与题目中要求 Person表中的数据,如果没有在Address表中出现,city,state 字段变为null

select firstName,lastName,city,state  
from Person,Address  
where Person.personId = Address.personId

所以采用 left join 、 on 的方式。

其中 left join :是一种连接(JOIN)操作,用于将两个或多个表根据某个相关列进行关联。LEFT JOIN会返回左表中的所有记录,以及右表中与左表匹配的记录。如果在右表中没有找到匹配的记录,则会返回NULL值

其中 on:ON子句用于指定连接条件,即哪些列需要相等才能将两个表关联起来。

181. 超过经理收入的员工   

题目:给定一个表,采用别名as的形式,提取两次表中的数据。

select a.name as 'Employee'  ##### 将a.name 设置别名 为Employee 符合题目要求

select a.name as 'Employee' 
from Employee as a,Employee as b 
where a.managerId = b.id  and a.salary>b.salary 

其中 whereand,将两个判断条件连接。

182. 查找重复的电子邮箱

重复字段,暂时采用unique 唯一标识字段  思考再三之后,决定采用group by   +  count 值

count : 遍历表,找到对应字段出现的次数。

group by:若是没有 加后续条件,则按照降序排列。

having:对group by字段添加 附属条件

select email as 'Email'
from Person
group by email
having count(email) > 1;

183. 从不订购的客户

没有出现的用户,根据题目来说,目前的见解,只能采用 not in。

其中not in : 顾名思义   a not in b  ==> 返回所有a 有b 没有的东西。

整体上,将select内置到 not in中。通过相同的字段与字段进行判断。

select name as 'Customers'
from Customers
where  Customers.id not in 
( select customerId from Orders);

 610. 判断三角形

题解:三角形的条件:任意两条边 > 第三边。因此采用CASE..WHEN..THEN..END 的形式。具体格式如下所示:

CASE
    WHEN condition1 THEN result1
    WHEN condition2 THEN result2
    ...
    ELSE resultN
END;

  对应LeeCode的代码:

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;

197. 上升的温度

题解:采用 DATEDIFF(w1.recordDate,w2.recordDate) = 1,来判断 w1.recordDate - w2.recordDate = 1。 

  1. select:用于选择要返回的列。例如,SELECT column1, column2 FROM table;

  2. from:用于指定要查询的表。例如,FROM table;

  3. join:用于将两个或多个表连接起来。例如,JOIN table1 ON table1.column = table2.column;

  4. on:用于指定连接条件。例如,ON table1.column = table2.column;

  5. where:用于指定过滤条件。例如,WHERE table1.column = value;

# SQL 比较 自连接
select w1.id as 'Id'
from Weather w1
JOIN
    Weather w2
on 
    DATEDIFF(w1.recordDate,w2.recordDate) = 1
where
    w1.Temperature > w2.Temperature;

 577. 员工奖金

题解:针对 两个表,存在输出的情况为null的情况,采用 left join 

对于null,采用 is null 来判断。

# 两个表 
select a.name,b.bonus
from 
    Employee as a left join  Bonus as b
on
    a.empId = b.empId
where 
    b.bonus < 1000 or b.bonus is null ;

 584. 寻找用户推荐人

题解:找出那些 没有被 id = 2 的客户 推荐 的客户的姓名。 拟采用 !=  和 is null 的方式

select name
from 
    Customer 
where
    referee_id != 2 or referee_id is null;

通过查看题解,得知 在SQL 语句中,<> 和 != 的作用一致。

586. 订单最多的客户

题解:查找下了 最多订单 的客户的 customer_number。

解释:一个表中,customer_number 对应的 order_number 最多的个数。

采用 DESC:降序排列 、ORDER BY :由某个值进行排序 LIMIT:取值个数 。

# 题解:肯定有一个客户 是最多的 ,存在多笔订单的情况 订单个数,不是订单的和
SELECT 
    customer_number
FROM 
    Orders
GROUP BY
    customer_number
ORDER BY count(*) DESC
LIMIT 1;

619. 只出现一次的最大数字

题解:找出最大的 单一数字 。如果不存在 单一数字 ,则返回 null

解释:使用 MAX 对只有一次的num字段进行找出最大值,若是没有 则返回null

select MAX(num) as num
from(
select num,count(*)
from
    MyNumbers
group by 
    num
having count(num) = 1) as t;

PS:最后加上一个 as t。 如果不加会出现 Every derived table must have its own alias 。中文意思为:别名 设置。

 1148. 文章浏览 I

题解:Views表 某人id 作品id 参观者id 时间,查询出所有浏览过自己文章的作者。同一人的 author_id 和 viewer_id 是相同的。

这里会出现两个重复的信息,使用 DISTINCT 关键字来从表 Views 中检索唯一元素。

SELECT
    DISTINCT author_id AS id 
FROM
    Views
WHERE
    author_id = viewer_id
ORDER BY 
    id

1211. 查询结果的质量和占比

题解:难点在于统计平均值,判断是否为所需结果,四舍五入到小数点后两位。

拟采用:AVG() 作为平均值,IF(x1,x2,x3) x1是判断条件,x2为满足条件跳转的位置 ,x3为不满足条件跳转的位置,ROUND(值,小数点后几位) 函数将结果四舍五入到小数点后两位。

# quality = rating / position
# poor_query_percentage  =   <3
select 
    query_name,
    ROUND(AVG(rating/position),2) AS quality,
    ROUND(SUM(IF(rating<3, 1, 0)) * 100 / COUNT(*) ,2) AS poor_query_percentage
from
    Queries
group by
    query_name

1517. 查找拥有有效邮箱的用户

题解:采用正则表达式

一般来说,如果你被要求匹配一个字符串,应该最先想到写一个正则表达式模式进行匹配。

正则表达式提供各种功能,以下是一些相关功能:

  ^:表示一个字符串或行的开头

  [a-z]:表示一个字符范围,匹配从 a 到 z 的任何字符。

  [0-9]:表示一个字符范围,匹配从 0 到 9 的任何字符。

  [a-zA-Z]:这个变量匹配从 a 到 z 或 A 到 Z 的任何字符。请注意,你可以在方括号内指定的字符范围的数量没有限制,您可以添加想要匹配的其他字符或范围。

  [^a-z]:这个变量匹配不在 a 到 z 范围内的任何字符。请注意,字符 ^ 用来否定字符范围,它在方括号内的含义与它的方括号外表示开始的含义不同。

  [a-z]*:表示一个字符范围,匹配从 a 到 z 的任何字符 0 次或多次。

  [a-z]+:表示一个字符范围,匹配从 a 到 z 的任何字符 1 次或多次。

  .:匹配任意一个字符。

  \.:表示句点字符。请注意,反斜杠用于转义句点字符,因为句点字符在正则表达式中具有特殊含义。还要注意,在许多语言中,你需要转义反斜杠本身,因此需要使用\\.

  $:表示一个字符串或行的结尾。

# 前缀 名称是一个字符串,可以包含字母(大写或小写),数字,下划线 '_' ,点 '.' 和/或破折号 '-' 。
# 前缀名称 必须 以字母开头。
# 域 为 '@leetcode.com' 。
SELECT
    *
FROM
    Users
WHERE
    # 保存某些条件,分隔开 正则表达式
    mail REGEXP '^[a-zA-Z][a-zA-Z0-9_.-]*\\@leetcode\\.com$';

  

 

 

 

 

 

 

posted @ 2023-10-11 11:22  我太想努力了  阅读(47)  评论(0编辑  收藏  举报