刷题日记 | 数据库经典例题(MySQL)

©一颗斯特拉
【注】
1.标有❤️的是值得多做的题
2.参考书:
①Oracle讲稿 BY帅气的朱老师
②菜鸟驿站-MySQL


基础知识

【001】SQL数据库的数据类型详细解释


常见函数

字符函数及说明

1.ASCII(c):用于返回一个字符ASCII码值
2.CHAR(i):用于返回给出ASCII码值所对应的字符。注意,Oracle中这个函数写作CHR(i),这里给出的是MySQL中的用法

数字函数及说明

1.MOD(n1,n2):返回n1除以n2的余数

日期及时间及说明

1.SUBDATE(date,n):日期参数date减去n天前的日期
2.DATEDIFF(date1,date2):获取两个指定日期之间相隔的天数,有正负两种情况


175. 组合两个表(4月2日)

01 知识点

1.外连接查询

格式:SELECT table1.column,table2.column… FROM
table1[LEFT|RIGHT|FULL]JOIN table2
ON table1.column1=table2.column2;

外连接分为3种类型,分别是左外连接、右外连接和完全外连接,分别有以下作用:

  • 左外连接:用于不仅返回满足连接条件的所有记录,而且还返回不满足连接条件的连接操作符左边表的其他行。
  • 右外连接——用于不仅返回满足连接条件的所有记录,而且还返回不满足连接条件的连接操作符右边表的其他行。
  • 完全外连接——用于不仅返回满足连接条件的所有记录,而且还返回不满足连接条件的所有其他行。

这道题是“编写一个 SQL 查询,满足条件:无论 person 是否有地址信息,都需要基于上述两表提供 person 的以下信息。FirstName, LastName, City, State
”其中,前两个变量是左表的,后两个变量是右表的,题目要求不管由表中的变量是否为空也要返回左表的值,所以要用到左连接。


176. 第二高的薪水(4月21号)

01 知识点

1.limit子句

首先limit是属于mysql的语法,用来从某个值开始,取出之后的N条数据的语法。
limit有两种方式:

  • limit a,b后缀两个参数的时候(/参数必须是一个整数常量/),其中a是指记录开始的偏移量,b是指从第a+1条开始,取b条记录。
  • limit b后缀一个参数的时候,是直接取值到第多少位,类似于limit 0,b
2.ifnull()

if()和ifnull()的区别


181. 超过经理收入的员工(4月24号)

01 反思总结

连接查询中的WHEREJOIN分不清楚,以及想看一下什么是笛卡尔积,看看这篇文章。
对两个表里使用 Select 语句可能会导致产生笛卡尔乘积。应该用 WHERE 语句加以限制。


182. 查找重复的电子邮箱(4月3日)

01 知识点

1.分组函数

使用数据分组应注意的问题:

  • 分组函数只能出现在选择列表、HAVING 子句和 ORDER BY 子句中。
  • 如果在 SELECT 语句中同时包含有 GROUP BY 、HAVING以及 ORDER BY 子句,那么必须将 ORDER BY 子句放在最后。
  • 如果选择列表包含有列、表达式和分组函数,那么这些列和表达式必须出现在 GROUP BY 子句中,否则会出错。
2.HAVING

功能(干什么):使用 HAVING 子句限制分组统计结果。划分好的组内的数据应该满足的要求。


183. 从不订购的客户(4月26日)

01 知识点

1.多行子查询

多行子查询

这道题知道了IN操作符和NOT操作符的用法就搞定了!


185. 部门工资前三高的所有员工(4月5号)


196. 删除重复的电子邮箱(4月27号)

01 知识点

1.delete

数据操纵语言DML——用于改变数据库数据,包括插入、删除和修改(INSERT、UPDATE、DELETE。
删除数据语句语法

格式:DELETE FROM [WHERE ];

上面是DELETE的一般格式,但是官方给出了另外一个格式,这道题就要用到这个特别的形式,有点类似于SELECT的用法。请参考DELETE类似SELECT的用法。

格式:DELETE t1 FROM t1 LEFT JOIN t2 ON t1.id=t2.id WHERE t2.id IS NULL;

02 反思&总结

182题是查找重复的邮箱,那里我们用了分组函数。这里是删除重复的邮箱,用分组函数很难保留最小Id的重复邮箱,很复杂呢。所以记住DELETE的这种特殊用法。


197. 上升的温度(4月25号)

01 反思&总结

这道题用SUBDATE(date,n)DATEDIFF(date1,date2)这两种时间函数来表示间隔一天的连接条件均可,操作中,用第二个函数运行时间更短。


574. 当选者(4月7号)

01 知识点

1.子查询

定义(是什么):子查询是指嵌入在其他 SQL 语句中的SELECT 语句。
功能:通过在 WHERE 、HAVING、START WITH 子句中使用子查询,可以提供条件值。

分类:
子查询的分类

【注】朱老师在课上说子查询中不能由order by语句,但是这里可以用。上网查了下可能是软件更新了的原因。

586. 订单最多的客户(4月9号)

01 反思总结

1.LIMIT

LIMIT可用在取出单一结果的查询中,比如取唯一的最大值、最小值。


584. 寻找用户推荐人(4月14号)

01 知识点

1.IS NULL操作符

MySQL 使用三值逻辑 —— TRUE, FALSE 和 UNKNOWN。任何与 NULL 值进行的比较都会与第三种值 UNKNOWN 做比较。这个“任何值”包括 NULL 本身!这就是为什么 MySQL 提供IS NULLIS NOT NULL 两种操作来对 NULL 特殊判断,=NULL的表达是错误的。[1]


627. 交换工资(4月13号)

01 知识点

1.IF表达式、CASE WHEN表达式
2.字符与ASCII码的转化

ASCII(string):将字符串的第一个字符转换成ASCII码的形式
CHAR(int):将ASCII码转换成字符


1082. 销售分析 I(4月16日)

01 反思总结

1.MySQL与Oracel的区别

select seller_id from Sales 
group by seller_id
having sum(price)=(select max(sum(price)) from Sales group by seller_id);

这道题中,上面这段语句在Oracle中能通过,但在MySQL中通不过,提示的错误信息是:

Invalid use of group function

这究竟是怎么回事?
记住!MySQL里面不能叠加使用MAX()和SUM(),比如MAX(SUM())。如果要找MAX(SUM()),怎么做呢?可以参考mysql – 为什么SUM()的MAX()给出错误的输出?。我们给出在M

select seller_id from Sales 
group by seller_id
having sum(price)=(select max(t) from (select sum(price) t from Sales group by seller_id) temp);

1251. 平均售价(3月26日)

01 知识点

1.别名

当表名很长或者执行一些特殊查询的时候,为了方便操作,可以为表指定一个别名,用这个别名代替表原来的名称。
为表指定别名的基本语法格式为:

<表名> [AS] <别名>

其中各子句的含义如下:
<表名>:数据库中存储的数据表的名称。
<别名>:查询时指定的表的新名称。
AS关键字可以省略,省略后需要将表名和别名用空格隔开。
注意:表的别名不能与该数据库的其它表同名。字段的别名不能与该表的其它字段同名。在条件表达式中不能使用字段的别名,否则会出现“ERROR 1054 (42S22): Unknown column”这样的错误提示信息。

2.ROUND函数

ROUND(x)函数返回最接近于参数 x 的整数。
ROUND(x,y)函数对参数x进行四舍五入的操作,返回值保留小数点后面指定的y位。

3.SUM函数

SUM()是一个求总和的函数,返回指定列值的总和。

  • 如果在没有返回匹配行 SELECT 语句中使用 SUM 函数,则 SUM 函数返回 NULL,而不是 0。
  • DISTINCT 运算符允许计算集合中的不同值。
  • SUM 函数忽略计算中的 NULL 值。
    SELECT 语句中,允许使用 GROUP BY 子句,将结果集中的数据行根据选择列的值进行逻辑分组,以便能汇总表内容的子集,实现对每个组而不是对整个结果集进行整合。
4.分组查询

一、语法格式如下:

GROUP BY { <列名> | <表达式> | <位置> } [ASC | DESC]

二、语法说明如下:
<列名>:指定用于分组的列。可以指定多个列,彼此间用逗号分隔。
<表达式>:指定用于分组的表达式。通常与聚合函数一块使用,例如可将表达式 COUNT(*)AS' 人数 '作为 SELECT 选择列表清单的一项。
<位置>:指定用于分组的选择列在 SELECT 语句结果集中的位置,通常是一个正整数。例如,GROUP BY 2 表示根据 SELECT 语句列清单上的第 2 列的值进行逻辑分组。
ASC|DESC:关键字 ASC表示按升序分组,关键字DESC表示按降序分组,其中ASC为默认值,注意这两个关键字必须位于对应的列名、表达式、列的位置之后。
注意:GROUP BY 子句中的各选择列必须也是 SELECT 语句的选择列清单中的一项。

三、对于 GROUP BY 子句的使用,需要注意以下几点:

  • GROUP BY 子句可以包含任意数目的列,使其可以对分组进行嵌套,为数据分组提供更加细致的控制。
  • GROUP BY 子句列出的每个列都必须是检索列或有效的表达式,但不能是聚合函数。若在 SELECT 语句中使用表达式,则必须在 GROUP BY 子句中指定相同的表达式。
  • 除聚合函数之外,SELECT 语句中的每个列都必须在 GROUP BY 子句中给出。
    若用于分组的列中包含有 NULL 值,则 NULL 将作为一个单独的分组返回;若该列中存在多个 NULL 值,则将这些 NULL 值所在的行分为一组。

1294. 不同国家的天气类型(4月8号)

01 知识点

1.CASE语句

CASE 表达式的语法:


CASE表达式的语法
CASE语句例题
2.匹配

在 WHERE 子句中使用 LIKE 操作符
通配符
%:表示 0 或多个字符。
_: 表示单个字符。


1350. 院系无效的学生(3月31日)

01 反思总结

1.连接查询与子查询

这道题两种方法都可以做出来,但是连接查询比子查询快了300ms。



  1. 作者:LeetCode
    链接:https://leetcode-cn.com/problems/find-customer-referee/solution/xun-zhao-yong-hu-tui-jian-ren-by-leetcode/
    来源:力扣(LeetCode)
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 ↩

你可能感兴趣的:(刷题日记 | 数据库经典例题(MySQL))