length和char_length函数区别
计算字段长度规则:
- length是汉字是算三个字符,数字或字母算一个字符,中文标点符号(如:¥、?。,)算三个字符,英文标点符号算一个字符。
- char_length是汉字、数字或字母都算是一个字符,包括中英文标点符号也算一个字符。
1 | -- 查询某字符串长度 |
偏移量 & 日期函数
表: Weather
±--------------±--------+
| Column Name | Type |
±--------------±--------+
| id | int |
| recordDate | date |
| temperature | int |
±--------------±--------+
id 是该表具有唯一值的列。
没有具有相同 recordDate 的不同行。
该表包含特定日期的温度信息
编写解决方案,找出与之前(昨天的)日期相比温度更高的所有日期的 id 。
返回结果 无顺序要求 。
偏移量解决方案
lag()
和lead()
函数用于获取当前行的前一行和后一行的数据,可以通过偏移量来获取更多的行数据。- 第一个为待查询的参数列名,第二个为向上[下]偏移的位数,第三个参数为超出最上面边界的默认值。
- OVER子句是用于指定窗口函数操作的条件。通过ORDER BY子句,可以指定要根据哪列来排序,使得LAG()函数的结果按照指定的顺序进行计算。
日期函数解决
DATE_ADD(date,INTERVAL expr type)
向日期添加指定的时间间隔。- ADDDATE()有两种形式:
ADDDATE(date,INTERVAL expr unit)
和ADDDATE(expr,days)
- 第一种和DATE_ADD()完全一样,第二种中第二个参数只能是天。其实就是第一种的功能包括第二种。
DATEDIFF(begin,end)
函数返回begin-end的天数。TIMESTAMPDIFF(unit,begin,end);
TIMESTAMPDIFF函数返回begin-end的结果
1 |
|
JOIN方式
Employee
empId | name | supervisor | salary |
---|---|---|---|
3 | Brad | null | 4000 |
1 | John | 3 | 1000 |
2 | Dan | 3 | 2000 |
4 | Thomas | 3 | 4000 |
bouns
empId | bonus |
---|---|
2 | 500 |
4 | 2000 |
5 | 200 |
JOIN方式 默认inner JOIN
1 | select * |
empId | name | supervisor | salary | empId | bonus |
---|---|---|---|---|---|
2 | Dan | 3 | 2000 | 2 | 500 |
4 | Thomas | 3 | 4000 | 4 | 2000 |
LEFT JOIN方式
1 | select * |
empId | name | supervisor | salary | empId | bonus |
---|---|---|---|---|---|
3 | Brad | null | 4000 | null | null |
1 | John | 3 | 1000 | null | null |
2 | Dan | 3 | 2000 | 2 | 500 |
4 | Thomas | 3 | 4000 | 4 | 2000 |
RIGHT JOIN方式
1 | select * |
empId | name | supervisor | salary | empId | bonus |
---|---|---|---|---|---|
2 | Dan | 3 | 2000 | 2 | 500 |
4 | Thomas | 3 | 4000 | 4 | 2000 |
null | null | null | null | 5 | 200 |
FULL JOIN方式
1 | -- mysql中未提供full join 使用左查询 union 右查询 实现 |
empId | name | supervisor | salary | empId | bonus |
---|---|---|---|---|---|
3 | Brad | null | 4000 | null | null |
1 | John | 3 | 1000 | null | null |
2 | Dan | 3 | 2000 | 2 | 500 |
4 | Thomas | 3 | 4000 | 4 | 2000 |
null | null | null | null | 5 | 200 |
窗口函数
Delivery 表:
±------------±------------±-----------±----------------------------+
| delivery_id | customer_id | order_date | customer_pref_delivery_date |
±------------±------------±-----------±----------------------------+
| 1 | 1 | 2019-08-01 | 2019-08-02 |
| 2 | 2 | 2019-08-02 | 2019-08-02 |
| 3 | 1 | 2019-08-11 | 2019-08-12 |
| 4 | 3 | 2019-08-24 | 2019-08-24 |
| 5 | 3 | 2019-08-21 | 2019-08-22 |
| 6 | 2 | 2019-08-11 | 2019-08-13 |
| 7 | 4 | 2019-08-09 | 2019-08-09 |
±------------±------------±-----------±----------------------------+
delivery_id 是该表中具有唯一值的列。
该表保存着顾客的食物配送信息,顾客在某个日期下了订单,并指定了一个期望的配送日期(和下单日期相同或者在那之后)。
如果顾客期望的配送日期和下单日期相同,则该订单称为 「即时订单」,否则称为「计划订单」。
「首次订单」是顾客最早创建的订单。我们保证一个顾客只会有一个「首次订单」。
编写解决方案以获取即时订单在所有用户的首次订单中的比例。保留两位小数。
ROW_NUMBER分组排序
ROW_NUMBER()
分组排序后给组内数据一个顺序编号,可用来取前几
TO_DAYS()判断日期是否是同一天
TO_DAYS()
返回日期和年份0之间的天数
1 | SELECT |
当表格为空时,返回null值
MyNumbers 表:
±------------±-----+
| Column Name | Type |
±------------±-----+
| num | int |
±------------±-----+
该表可能包含重复项(换句话说,在SQL中,该表没有主键)。
这张表的每一行都含有一个整数。
单一数字 是在 MyNumbers 表中只出现一次的数字。
找出最大的 单一数字 。如果不存在 单一数字 ,则返回 null 。
查询结果如下例所示。
1 | -- 1.可以使用聚合函数进行空值null值的转换,具体的聚合函数包括SUM/AVG/MAX/MIN |
分条件查询
产品数据表: Products
±--------------±--------+
| Column Name | Type |
±--------------±--------+
| product_id | int |
| new_price | int |
| change_date | date |
±--------------±--------+
(product_id, change_date) 是此表的主键(具有唯一值的列组合)。
这张表的每一行分别记录了 某产品 在某个日期 更改后 的新价格。
编写一个解决方案,找出在 2019-08-16 时全部产品的价格,假设所有产品在修改前的价格都是 10 。
1 | -- 1.找出所有的产品: |