- 大数据面试SQL题-笔记01【运算符、条件查询、语法顺序、表连接】
- 大数据面试SQL题-笔记02【...】
目录
[2.5.3、if / is null](#2.5.3、if / is null)
HSQL绝对重点
三、窗口函数用法举例
- 序号函数:row_number()/ rank() / dense_rank()(面试重点)
- 分布函数:percent_rank() / cume_dist()
- 前后函数 lag(expr, n, defval)、lead(expr, n, defval)(面试重点)
- 头尾函数:FIRST_VALUE(expr)、LAST_VALUE(expr)
- 聚合函数+窗口函数联合使用
01、力扣网-sql题
力扣sql题
1、高频SQL50题(基础版)
没写完 ...
2、高频SQL50题(进阶版)
没写完 ...
02、牛客网-sql题
非技术快速入门
2.1、运算符
2.2、条件查询
sql
_:匹配任意一个字符;
SELECT * FROM 学生表 WHERE name LIKE '张__'//查询姓"张"且名字是3个字的学生姓名。
%:匹配0个或多个字符;
SELECT * FROM 学生表 WHERE 姓名 LIKE '张%'//查询学生表中姓'张'的学生的详细信息。
[ ]:匹配[ ]中的任意一个字符(若要比较的字符是连续的,则可以用连字符"-"表 达 );
SELECT * FROM 学生表 WHERE 姓名 LIKE '[张李刘]%'//查询学生表中姓'张'、姓'李'和姓'刘'的学生的情况。
[^ ]:不匹配[ ]中的任意一个字符。
SELECT * FROM 学生表 WHERE 学号 LIKE '%[^235]' //从学生表表中查询学号的最后一位不是2、3、5的学生信息。
2.3、语法顺序
sql
SELECT columns
FROM table_name
WHERE conditions
GROUP BY columns
HAVING conditions
ORDER BY columns DESC
LIMIT num;
-------------------------------
SELECT * | 字段列表 [as 别名]
FROM 表名
[WHERE 子句]
[GROUP BY 子句]
[HAVING 子句]
[ORDER BY 子句]
[LIMIT 子句];
在 SQL 查询中,通常的语法顺序是这样的:
SELECT
:选择要查询的列。FROM
:指定查询的数据表。WHERE
:对数据进行筛选,根据指定的条件过滤行。GROUP BY
:按照指定的列对结果进行分组。HAVING
:对分组后的结果应用条件过滤。ORDER BY
:指定结果的排序顺序。LIMIT
:限制返回的行数。虽然在实际的 SQL 查询中,您不一定需要每个子句都使用,但是一般来说,这是它们的一般顺序。
至于
AND
,它是用于连接多个条件的逻辑运算符。它通常出现在WHERE
子句中,用于结合多个条件以过滤行。SELECT * FROM table_name WHERE condition1 AND condition2;
在这种情况下,
AND
的使用是在WHERE
子句中,但它可以根据需要出现在其他地方。
牛客网------SQL19 分组过滤练习题select
university,
avg(question_cnt) as avg_question_cnt,
avg(answer_cnt) as avg_answer_cnt
from
user_profile
group by
university
having #聚合函数结果作为筛选条件时,不能用where,而是用having语法
avg_question_cnt < 5
or avg_answer_cnt < 20;
++3.3.3 总结内连接查询步骤:++
确定查询哪些表
确定表连接的条件
确定查询的条件
确定查询的字段
2.4、表连接方式
- 内连接(Inner Join):返回匹配连接条件的行,包括两个表中同时出现的行。
- 左连接(Left Join 或 Left Outer Join):返回左表中的所有行,以及右表中与左表匹配的行。如果右表中没有匹配的行,则返回 NULL 值。
- 右连接(Right Join 或 Right Outer Join):返回右表中的所有行,以及左表中与右表匹配的行。如果左表中没有匹配的行,则返回 NULL 值。
- 全连接(Full Join 或 Full Outer Join):返回左表和右表中的所有行,如果某行在其中一个表中没有匹配的行,则返回 NULL 值。
- 自连接(Self Join):将表与自身连接,通常用于比较表中的不同行。
除了这些基本的连接方式外,还有一些其他变体和组合,但这些是最常见的表连接方式。
这些连接方式可以组合使用,因此可能会导致多个表同时参与连接。例如,在一个查询中,您可以使用多个内连接,左连接,右连接或全连接。
2.5、语法元素
2.5.1、union
UNION
是用于合并两个或多个 SELECT 语句的结果集的操作符。它用于将多个查询结果合并为单个结果集,并且会自动去除重复的行。UNION
用于组合两个或多个查询的结果集,并返回一个包含所有查询结果的单个结果集。分别查看&结果不去重:所以直接使用两个条件的or是不行的,直接用union也不行,要用union all,分别去查满足条件1的和满足条件2的,然后合在一起不去重。
UNION
:UNION
操作符用于合并两个查询结果集,并且会自动去除重复的行。如果两个查询的结果集中存在相同的行,则UNION
只会返回一次该行。UNION
不会返回重复的行。UNION ALL
:UNION ALL
也用于合并两个查询结果集,但是它不会去除重复的行。即使两个查询的结果集中存在相同的行,UNION ALL
也会将它们都返回。UNION ALL
返回所有行,包括重复的行。
sql
select
device_id, gender, age, gpa
from user_profile
where university = '山东大学'
union all
select
device_id, gender, age, gpa
from user_profile
where gender = 'male';
2.5.2、case
sql
CASE
WHEN 简单表达式1 THEN 结果表达式1
WHEN 简单表达式2 THEN 结果表达式2 ...
WHEN 简单表达式n THEN 结果表达式n
[ ELSE 结果表达式n+1 ]
END
----------------------------------------------------
SELECT
CASE
WHEN GRADE BETWEEN 85 AND 100 THEN '优'
WHEN GRADE BETWEEN 70 AND 84 THEN '良'
WHEN GRADE BETWEEN 60 AND 69 THEN '及格'
ELSE '不及格'
END 等级,
COUNT(*) 人数
FROM
SC
GROUP BY
CASE
WHEN GRADE BETWEEN 85 AND 100 THEN '优'
WHEN GRADE BETWEEN 70 AND 84 THEN '良'
WHEN GRADE BETWEEN 60 AND 69 THEN '及格'
ELSE '不及格'
END
2.5.3、if / is null
sql
#if判断
SELECT IF(age < 25 OR age IS NULL, '25岁以下', '25岁及以上') age_cut, COUNT(device_id) Number
FROM user_profile
GROUP BY age_cut
---------------------------------
SELECT
IF (age < 25 OR age IS NULL,
'25岁以下',
'25岁及以上'
) age_cut,
COUNT(device_id) Number
FROM
user_profile
GROUP BY
age_cut;
---------------------------------
SELECT
device_id,
gender,
IF (age is null, '其他',
IF (age < 20, '20岁以下',
IF (age <= 24, '20-24岁', '25岁及以上')
)
) age_cut
FROM
user_profile;
2.5.4、日期函数-DATEDIFF
MySQL 中的
DAY()
、MONTH()
和YEAR()
函数用于从给定的日期中提取日、月和年,返回类型:int。
sql
select
day (date) as day,
count(question_id) as question_cnt
from
question_practice_detail
where
month (date) = 8
and year (date) = 2021
group by
date;
DATEDIFF()
是 MySQL 中的日期函数,用于计算两个日期之间的天数差异。它的语法如下:DATEDIFF(date1, date2)
其中,
date1
和date2
是要比较的两个日期或日期/时间表达式。函数返回date1
减去date2
的结果,以天为单位的差值。例如,假设有两个日期
date1
和date2
,你可以使用DATEDIFF()
函数来计算它们之间的天数差:
SELECT DATEDIFF('2024-04-26', '2024-04-20'); -- 返回 6
在这个例子中,结果是
6
,因为从2024-04-20
到2024-04-26
之间相隔了 6 天。
ヾ(◍°∇°◍)ノ゙加油~