mysql
1-来自于leetcode1517的题目
表: Users
+---------------+---------+
| Column Name | Type |
+---------------+---------+
| user_id | int |
| name | varchar |
| mail | varchar |
+---------------+---------+
已知一个表,它的创建语句
Create table If Not Exists Users
(user_id int, name varchar(30), mail varchar(50))
添加语句
Truncate table Users//清空users这个
insert into Users (user_id, name, mail) values ('1', 'Winston', 'winston@leetcode.com')
2----来自于1527道题
患者信息表: Patients
+--------------+---------+
| Column Name | Type |
+--------------+---------+
| patient_id | int |
| patient_name | varchar |
| conditions | varchar |
+--------------+---------+
在 SQL 中,patient_id (患者 ID)是该表的主键。
'conditions' (疾病)包含 0 个或以上的疾病代码,以空格分隔。
这个表包含医院中患者的信息。
Create table If Not Exists Patients (patient_id int, patient_name varchar(30), conditions varchar(100))
3----第1581题
表:Visits
+-------------+---------+
| Column Name | Type |
+-------------+---------+
| visit_id | int |
| customer_id | int |
+-------------+---------+
visit_id 是该表中具有唯一值的列。
该表包含有关光临过购物中心的顾客的信息。
表:Transactions
+----------------+---------+
| Column Name | Type |
+----------------+---------+
| transaction_id | int |
| visit_id | int |
| amount | int |
+----------------+---------+
transaction_id 是该表中具有唯一值的列。
此表包含 visit_id 期间进行的交易的信息。
Create table If Not Exists Visits(visit_id int, customer_id int)
Create table If Not Exists Transactions(transaction_id int, visit_id int, amount int)
4----第1587
表: Users
+--------------+---------+
| Column Name | Type |
+--------------+---------+
| account | int |
| name | varchar |
+--------------+---------+
account 是该表的主键(具有唯一值的列)。
该表的每一行都包含银行中每个用户的帐号。
表中不会有两个用户具有相同的名称。
表: Transactions
+---------------+---------+
| Column Name | Type |
+---------------+---------+
| trans_id | int |
| account | int |
| amount | int |
| transacted_on | date |
+---------------+---------+
trans_id 是该表主键(具有唯一值的列)。
该表的每一行包含了所有账户的交易改变情况。
如果用户收到了钱, 那么金额是正的; 如果用户转了钱, 那么金额是负的。
所有账户的起始余额为 0。
Create table If Not Exists Users (account int, name varchar(20))
Create table If Not Exists Transactions (trans_id int, account int, amount int, transacted_on date)
常见且重要且关键的sql语句的一些匹配方式
关于某个数据需要进行判断,该数据的类型是字符串类型,其前缀必须是字母开头,可以包含字母(大写或小写),数字,下划线 '_'
,点 '.'
和/或破折号 '-'
。
#这道题需要用到正则表达式
regexp 是“正则表达式”(Regular Expression)的缩写,正则表达式是一种用于描述字符串模式的工具。它允许用户定义复杂的字符串匹配规则,可以用于搜索、替换和验证字符串。
^:表示字符串的开始。确保匹配从字符串的开头开始。
[a-zA-Z]:表示匹配一个字母,范围是大写字母 A-Z 或小写字母 a-z。这意味着电子邮件的用户名部分必须以字母开头。
[\\w.-]*:
\\w:表示匹配任何字母数字字符(包括下划线),相当于 [a-zA-Z0-9_]。
.:表示匹配一个点字符。由于在正则表达式中,点 . 是一个特殊字符,表示匹配任何单个字符,因此需要转义为 \.(在某些语言中需要用双反斜杠 \\. 来表示)。
-:表示匹配一个连字符。
*:表示前面的字符集可以出现零次或多次。这意味着在字母之后,可以有多个字母、数字、下划线、点或连字符。
\\@leetcode:表示匹配字符串 @leetcode。同样,由于 @ 是一个特殊字符,通常需要转义,所以用 \\@ 来表示。
\\.com:表示匹配字符串 .com。同样,点 . 需要转义,所以用 \\. 来表示。
$:表示字符串的结束。确保匹配到字符串的末尾。
regexp '^[a-zA-Z][\\w.-]*\\@leetcode\\.com$'
详细的请看1517.
关于某个数据中间包含了某一个数据(字符,单词)
WHERE conditions LIKE 'DIAB1%':查找 conditions 字段以 DIAB1 开头的记录。
OR conditions LIKE '% DIAB1%':查找 conditions 字段中包含 DIAB1 作为一个单词(前面有空格)的记录。
OR conditions LIKE '%DIAB1%':查找 conditions 字段中包含 DIAB1 的记录,不论前面是否有空格。
详情间1527题
为什莫要用一个空格,由于有的单词可能会包含里面的这些单词
常见的查询顺序
select 数据
from 表
where 条件
·group by 某个数据的排序
聚合函数sum()和count()的区别
SUM() 和 COUNT() 是 SQL 中常用的聚合函数,它们的主要区别在于它们的功能和用途。以下是对这两个函数的详细解释:
1. SUM()
功能:SUM() 函数用于计算指定列中所有数值的总和。
用法:通常用于数值型数据列。
返回值:返回一个数值,表示该列所有行的总和。如果没有行符合条件,则返回 NULL。
示例:
SELECT SUM(salary) AS total_salary
FROM Employees;
这个查询将计算 Employees 表中所有员工的薪水总和。
2. COUNT()
功能:COUNT() 函数用于计算符合条件的行数。
用法:可以用于任何类型的数据列,也可以用于 * 来计算所有行。
返回值:返回一个整数,表示符合条件的行数。如果没有行符合条件,则返回 0。
示例:
SELECT COUNT(*) AS total_employees
FROM Employees;
这个查询将计算 Employees 表中的所有员工数量。
主要区别
特点 SUM() COUNT()
功能 计算数值的总和 计算行数
返回值类型 数值 整数
用法 仅适用于数值型数据 可用于任何数据类型
NULL 值处理 忽略 NULL 值 NULL 值也会被计入(如果使用 COUNT(column_name),则 NULL 值不计入)
例子对比
假设有一个名为 Sales 的表,包含以下数据:
id amount
1 100
2 200
3 NULL
4 300
使用 SUM():
SELECT SUM(amount) AS total_amount FROM Sales;
返回结果:400(100 + 200 + 300,NULL 被忽略)
使用 COUNT():
SELECT COUNT(amount) AS total_count FROM Sales;
返回结果:3(计入了 100、200 和 300,NULL 不计入)
总结
使用 SUM() 计算数值的总和。
使用 COUNT() 计算行数或特定列的非 NULL 值数量。
了解这两个函数的区别可以帮助您更有效地进行数据分析和查询。
Having这个函数在什么情况下会被使用
HAVING 子句在 SQL 中用于对聚合结果进行过滤,通常与 GROUP BY 子句一起使用。与 WHERE 子句不同,WHERE 用于在数据分组之前过滤行,而 HAVING 用于对分组后的结果进行过滤。下面是一些关于 HAVING 的使用场景和示例。
使用场景
聚合条件过滤:当你需要根据聚合函数(如 SUM()、COUNT()、AVG() 等)的结果来过滤数据时,使用 HAVING。
与 GROUP BY 一起使用:HAVING 通常与 GROUP BY 子句结合使用,以便在分组后对每个组的聚合结果进行条件筛选。
复杂的条件:如果需要基于聚合结果的复杂条件进行过滤,HAVING 是合适的选择。
示例
假设有一个名为 Sales 的表,包含以下字段:id、product_id、quantity 和 sales_amount。我们想要找出销售数量大于 100 的产品:
SELECT product_id, SUM(quantity) AS total_quantity
FROM Sales
GROUP BY product_id
HAVING SUM(quantity) > 100;
解释
SELECT product_id, SUM(quantity) AS total_quantity:选择产品 ID 和该产品的总销售数量。
FROM Sales:从 Sales 表中查询数据。
GROUP BY product_id:按产品 ID 对数据进行分组。
HAVING SUM(quantity) > 100:过滤出总销售数量大于 100 的产品。
关键点
与 WHERE 的区别:WHERE 用于在数据分组之前过滤行,而 HAVING 用于在数据分组之后过滤聚合结果。例如,WHERE 不能用于聚合函数,而 HAVING 可以。
性能考虑:由于 HAVING 是在数据分组后执行的,因此在某些情况下,使用 WHERE 进行初步过滤可以提高查询性能。
总结
使用 HAVING 来对聚合结果进行过滤。
通常与 GROUP BY 子句一起使用。
适合复杂的聚合条件过滤。
降序升序关键字
返回的结果表按 percentage 的 降序 排序,若相同则按 contest_id 的 升序 排序。
ORDER BY percentage DESC, contest_id ASC
聚合函数avg()
AVG() 是 SQL 中的一个聚合函数,用于计算一组数值的平均值。它会将指定列中的所有数值相加,然后除以该列中非空值的数量,从而得到平均值。
语法
AVG(column_name)
示例
假设有一个名为 employees 的表,包含员工的工资信息,如下所示:
employee_id salary
1 5000
2 6000
3 7000
4 NULL
如果你想计算所有员工的平均工资,可以使用以下 SQL 查询:
SELECT AVG(salary) AS average_salary
FROM employees;
在这个例子中,AVG(salary) 将计算出所有非空工资的平均值,即 (5000 + 6000 + 7000) / 3 = 6000。
注意事项
AVG() 函数只会计算非空值(NULL)的平均值。
如果列中所有值都是 NULL,AVG() 将返回 NULL。
AVG() 函数在数据分析和报告中非常有用,能够帮助我们快速了解数据集的中心趋势。
如何将首字母变成大写的,其余都是小写
这段 SQL 代码的作用是将一个字符串的首字母转换为大写,其余字母转换为小写,从而实现首字母大写的效果。我们可以逐步解析这段代码的含义:
LEFT(name, 1): 这部分提取 name 字符串的第一个字符(即首字母)。
UPPER(LEFT(name, 1)): 将提取到的首字母转换为大写。
SUBSTRING(name, 2): 这部分提取 name 字符串从第二个字符开始的所有字符。
LOWER(SUBSTRING(name, 2)): 将从第二个字符开始的所有字符转换为小写。
CONCAT(...): 最后,CONCAT 函数将大写的首字母和小写的其余部分连接在一起,形成一个新的字符串。
示例
假设 name 的值为 "jOhn",那么:
LEFT(name, 1) 会返回 "j"
UPPER(LEFT(name, 1)) 会返回 "J"
SUBSTRING(name, 2) 会返回 "Ohn"
LOWER(SUBSTRING(name, 2)) 会返回 "ohn"
CONCAT(UPPER(LEFT(name, 1)), LOWER(SUBSTRING(name, 2))) 会返回 "John"
总结
这段代码可以用于格式化名字,使其符合常见的“首字母大写,其余小写”的格式。
求字符串的长度
CHAR_LENGTH()
union
在 SQL 中,UNION 是一个用于合并两个或多个 SELECT 查询结果的操作符。使用 UNION 可以将多个查询的结果集合并成一个结果集,且该结果集会自动去除重复的行。
语法
SELECT column1, column2, ...
FROM table1
UNION
SELECT column1, column2, ...
FROM table2;
使用要求
列数和数据类型: 所有参与 UNION 的 SELECT 查询必须具有相同数量的列,并且对应列的数据类型应该兼容。
去重: UNION 默认会去除重复的记录。如果希望保留重复的记录,可以使用 UNION ALL。
示例
假设有两个表 employees_2022 和 employees_2023,它们的结构相同,包含员工的 ID 和姓名:
employees_2022 表:
employee_id name
1 Alice
2 Bob
employees_2023 表:
employee_id name
2 Bob
3 Charlie
如果你想要获取这两年所有员工的姓名,可以使用 UNION:
SELECT name FROM employees_2022
UNION
SELECT name FROM employees_2023;
结果
这个查询将返回以下结果:
name
Alice
Bob
Charlie
注意:Bob 只会出现一次,因为 UNION 会自动去除重复的记录。
使用 UNION ALL
如果希望保留所有记录,包括重复的,可以使用 UNION ALL:
SELECT name FROM employees_2022
UNION ALL
SELECT name FROM employees_2023;
结果
这个查询将返回以下结果:
name
Alice
Bob
Bob
Charlie
总结
UNION 是一个强大的工具,可以帮助我们合并来自不同表或查询的结果集,适用于需要整合多条查询结果的场景。
count(1)
你可以将 COUNT(1) 与其他 SQL 功能结合使用,例如 GROUP BY 和 HAVING:
SELECT
department,
COUNT(1) AS employee_count
FROM
employees
GROUP BY
department
HAVING
COUNT(1) > 10;
这个查询将返回每个部门的员工数量,并只显示员工数量大于 10 的部门。
总结
使用 COUNT(1) 是一种有效的方式来获取记录数量,适用于多种场景。根据具体需求,可以选择 COUNT(1) 或 COUNT(*)。
第n行的数据
源查询语句
SELECT DISTINCT
Salary
FROM
Employee
ORDER BY Salary DESC
LIMIT 1 OFFSET 1
LIMIT 1 表示只返回一条记录。
OFFSET 1 表示跳过第一条记录。结合使用 LIMIT 和 OFFSET,这条语句实际上是获取排序后第二条记录。
窗口函数DENSE_RANK()
是 SQL 中的一个窗口函数,用于为结果集中的行分配排名。与 RANK()
函数不同,DENSE_RANK()
在遇到重复值时不会跳过排名,而是为相同的值分配相同的排名,并为下一个不同的值分配下一个连续的排名。
窗口函数over()
OVER()
是 SQL 中用于窗口函数的一个关键字,它定义了窗口的范围和排序方式。窗口函数允许你在查询结果的每一行上执行计算,而不需要将结果分组。以下是一些常见的用法和示例:
示例
假设你有一个名为 Sales
的表,包含 salesperson
和 amount
列,你想计算每个销售人员的累计销售额。
SELECT
salesperson,
amount,
SUM(amount) OVER (PARTITION BY salesperson ORDER BY sale_date) AS cumulative_sales
FROM
Sales;
说明:
SUM(amount)
: 这是一个聚合函数,用于计算销售额的总和。OVER()
: 关键字,指示这是一个窗口函数。PARTITION BY salesperson
: 将结果集按销售人员分区,每个销售人员的计算是独立的。ORDER BY sale_date
: 在每个分区内,按销售日期排序,以便计算累计销售额。
注意事项:****
OVER()
可以与多种聚合函数一起使用,如ROW_NUMBER()
,RANK()
,DENSE_RANK()
,AVG()
,COUNT()
等。- 你可以根据需要使用
PARTITION BY
和ORDER BY
来定义窗口的范围和顺序。
over和dense_rank()结合一起使用
表: Scores
+-------------+---------+
| Column Name | Type |
+-------------+---------+
| id | int |
| score | decimal |
+-------------+---------+
id 是该表的主键(有不同值的列)。
该表的每一行都包含了一场比赛的分数。Score 是一个有两位小数点的浮点值。
编写一个解决方案来查询分数的排名。排名按以下规则计算:
- 分数应按从高到低排列。
- 如果两个分数相等,那么两个分数的排名应该相同。
- 在排名相同的分数后,排名数应该是下一个连续的整数。换句话说,排名之间不应该有空缺的数字。
按 score
降序返回结果表。
查询结果格式如下所示。
示例 1:
输入:
Scores 表:
+----+-------+
| id | score |
+----+-------+
| 1 | 3.50 |
| 2 | 3.65 |
| 3 | 4.00 |
| 4 | 3.85 |
| 5 | 4.00 |
| 6 | 3.65 |
+----+-------+
输出:
+-------+------+
| score | rank |
+-------+------+
| 4.00 | 1 |
| 4.00 | 1 |
| 3.85 | 2 |
| 3.65 | 3 |
| 3.65 | 3 |
| 3.50 | 4 |
+-------+------+
SELECT
S.score,
DENSE_RANK() OVER (
ORDER BY
S.score DESC
) AS 'rank'
FROM
Scores S;
datediff()
datediff(a.event_date, p.login)=1
ATEDIFF()
函数用于计算两个日期之间的差异,通常以天为单位。你提到的表达式 DATEDIFF(a.event_date, p.login) = 1
的含义是:
解释
DATEDIFF(a.event_date, p.login)
: 这个函数计算a.event_date
和p.login
之间的天数差。如果a.event_date
是晚于p.login
的日期,结果将是正整数;如果是早于,结果将是负整数;如果两者相同,结果为 0。= 1
: 这个条件表示我们只关心那些a.event_date
比p.login
晚一天的记录。换句话说,a.event_date
是p.login
的后一天。
COALESCE函数
COALESCE
函数用于返回其参数中的第一个非空值。你提到的 COALESCE(s2.student, s1.student)
的意思是,如果 s2.student
的值不为空,则返回 s2.student
的值;如果 s2.student
的值为空,则返回 s1.student
的值。
语法
COALESCE(value1, value2, ..., valueN)
value1, value2, ..., valueN
: 你可以传入多个值,COALESCE
将返回第一个非空值。
示例
假设你有两个表 students1
和 students2
,它们都有一个名为 student
的列。你想要从这两个表中获取学生的名字,但优先选择 students2
表中的名字,如果 students2
表中没有名字,则使用 students1
表中的名字。
SELECT
COALESCE(s2.student, s1.student) AS student_name
FROM
students1 s1
LEFT JOIN
students2 s2 ON s1.id = s2.id;
结果解释
- 如果
s2.student
不为空,则student_name
的值将是s2.student
的值。 - 如果
s2.student
为空,则student_name
的值将是s1.student
的值。 - 这样,你可以确保
student_name
列总是有一个有效的学生名字(如果存在的话)。
用途
COALESCE
函数在处理缺失数据时非常有用,尤其是在需要从多个来源合并数据时。它可以确保查询结果中没有空值,提供更完整的信息。
row_number() over()连用
ROW_NUMBER()
是 SQL 中的一个窗口函数,用于为结果集中的每一行分配一个唯一的序列号。结合 PARTITION BY
和 ORDER BY
子句时,它可以按照指定的分组和排序规则生成行号。
语法
ROW_NUMBER() OVER (PARTITION BY column1, column2, ... ORDER BY column3, column4, ...)
- PARTITION BY: 指定如何将结果集划分为多个分区。每个分区内的行号是独立的。
- ORDER BY: 指定在每个分区内如何排序行,以确定行号的分配顺序。
示例
假设你有一个名为 orders
的表,包含以下列:
order_id
: 订单的唯一标识符customer_id
: 顾客的唯一标识符order_date
: 订单日期
你希望为每个顾客的订单分配一个行号,按照订单日期升序排列。可以使用如下查询:
SELECT
order_id,
customer_id,
order_date,
ROW_NUMBER() OVER (PARTITION BY customer_id ORDER BY order_date) AS row_num
FROM
orders;
结果解释
- PARTITION BY customer_id: 这意味着结果集将根据
customer_id
列的值进行分组。每个顾客的订单将被视为一个独立的分区。 - ORDER BY order_date: 在每个顾客的分区内,订单将按照
order_date
列的值进行升序排序。 - ROW_NUMBER(): 对于每个顾客的订单,
ROW_NUMBER()
将分配一个行号,最早的订单将被分配为 1,第二个订单为 2,以此类推。
示例结果
假设 orders
表的数据如下:
order_id | customer_id | order_date |
---|---|---|
1 | 101 | 2023-01-01 |
2 | 101 | 2023-01-05 |
3 | 102 | 2023-01-03 |
4 | 101 | 2023-01-02 |
5 | 102 | 2023-01-04 |
执行上述查询后,结果可能如下:
order_id | customer_id | order_date | row_num |
---|---|---|---|
1 | 101 | 2023-01-01 | 1 |
4 | 101 | 2023-01-02 | 2 |
2 | 101 | 2023-01-05 | 3 |
3 | 102 | 2023-01-03 | 1 |
5 | 102 | 2023-01-04 | 2 |
用途
ROW_NUMBER()
函数在许多场景中非常有用,例如:
- 在分页查询中为每一页的结果分配行号。
- 在需要对分组数据进行排序并获取前 N 条记录时。
- 数据分析和报告中,生成序列号以便于引用。
查找每个月和每个国家/地区。
数据表中的 trans_date 是精确到日,我们可以使用 DATE_FORMAT() 函数将日期按照年月 %Y-%m 输出。比如将 2019-01-02 转换成 2019-01 。
DATE_FORMAT(trans_date, ‘%Y-%m’)
sum(amount) over(rows 6 preceding)
SUM(amount) OVER (ROWS 6 PRECEDING)
是一种窗口函数的用法,用于对数据集中的某一列(在这个例子中是 amount
)进行求和,并且可以在特定的窗口范围内进行计算。
解释
- SUM(amount): 这是一个聚合函数,用于计算
amount
列的总和。 - OVER: 关键字用于定义窗口函数的范围。
- ROWS 6 PRECEDING: 这个部分指定了窗口的大小和位置。
6 PRECEDING
意味着从当前行开始向上(即之前的行)计算总和,包括当前行在内的前6行。
示例
假设我们有一个销售记录的表格,结构如下:
id | amount |
---|---|
1 | 100 |
2 | 200 |
3 | 300 |
4 | 400 |
5 | 500 |
6 | 600 |
7 | 700 |
8 | 800 |
如果我们执行如下 SQL 查询:
SELECT
id,
amount,
SUM(amount) OVER (ROWS 6 PRECEDING) AS running_total
FROM
sales;
结果
查询的结果将会是:
id | amount | running_total |
---|---|---|
1 | 100 | 100 |
2 | 200 | 300 |
3 | 300 | 600 |
4 | 400 | 1000 |
5 | 500 | 1500 |
6 | 600 | 2100 |
7 | 700 | 2700 |
8 | 800 | 3300 |
注意事项
- 窗口的起始点: 在第一行(
id = 1
)时,只有这一行可用,因此它的running_total
只会是100
。 - 窗口大小: 当行数少于6时,窗口会自动调整为可用的行数。例如,在
id = 1
到id = 6
的行中,running_total
会包含所有可用的行。 - 性能: 使用窗口函数时,可能会对查询性能产生影响,尤其是在处理大数据集时,因此在使用时需要注意。
limit
LIMIT
可以接受两个参数:第一个参数表示要跳过的行数,第二个参数表示要返回的行数。
语法
SELECT column1, column2, ...
FROM table_name
LIMIT offset, row_count;
- offset: 要跳过的行数。
- row_count: 要返回的行数。
示例
假设我们有一个名为 employees
的表,结构如下:
id | name | salary |
---|---|---|
1 | Alice | 50000 |
2 | Bob | 60000 |
3 | Charlie | 70000 |
4 | David | 80000 |
5 | Eva | 90000 |
6 | Frank | 100000 |
7 | Grace | 110000 |
8 | Henry | 120000 |
如果我们执行以下查询:
SELECT * FROM employees
LIMIT 6, 2;
结果
这个查询的结果将会是:
id | name | salary |
---|---|---|
7 | Grace | 110000 |
8 | Henry | 120000 |
解释
-
LIMIT 6, 2
:
6
表示跳过前 6 行。2
表示返回接下来的 2 行。
注意事项
- 行数限制: 在一些数据库系统(如 MySQL)中,
LIMIT
子句可以接受两个参数;而在其他数据库系统(如 SQL Server)中,可能使用不同的语法(如OFFSET
和FETCH NEXT
)。 - 性能: 使用
LIMIT
和OFFSET
时,尤其是在处理大数据集时,可能会影响查询性能,因为数据库需要跳过一定数量的行。 - 数据顺序: 使用
LIMIT
时,通常需要结合ORDER BY
子句,以确保返回的结果是有序的。
mod()
在 SQL 中,MOD()
函数用于计算两个数相除后的余数。这个函数常用于需要处理数值运算和判断奇偶性等场景。
语法
MOD(dividend, divisor)
- dividend: 被除数。
- divisor: 除数。
示例
假设我们有一个名为 numbers
的表,结构如下:
id | value |
---|---|
1 | 10 |
2 | 15 |
3 | 20 |
4 | 25 |
我们可以使用 MOD()
函数来计算每个值除以 3 的余数:
SELECT
id,
value,
MOD(value, 3) AS remainder
FROM
numbers;
结果
执行上述查询后,结果将会是:
id | value | remainder |
---|---|---|
1 | 10 | 1 |
2 | 15 | 0 |
3 | 20 | 2 |
4 | 25 | 1 |
解释
- 对于
value
为 10,计算10 MOD 3
得到余数 1。 - 对于
value
为 15,计算15 MOD 3
得到余数 0。 - 对于
value
为 20,计算20 MOD 3
得到余数 2。 - 对于
value
为 25,计算25 MOD 3
得到余数 1。
使用场景
- 判断奇偶性: 可以用
MOD()
函数来判断一个数是奇数还是偶数。例如,MOD(value, 2)
返回 0 表示偶数,返回 1 表示奇数。 - 分组: 在某些情况下,可以使用
MOD()
函数对数据进行分组,例如将数据分为不同的组。 - 循环: 在处理循环逻辑时,
MOD()
函数可以用于确定当前循环的状态。
注意事项
- 在使用
MOD()
函数时,除数不能为 0,否则会导致错误。 - 不同的数据库系统可能提供不同的实现方式。例如,在某些 SQL 方言中,可能使用
%
运算符来代替MOD()
函数。
如何判断非空值以及空值
表: 教师表
+-------------+---------+
| 字段名称 | 类型 |
+-------------+---------+
| 教师号 | int |
| 教师姓名 | varchar |
+-------------+---------+
教师号 是该表的主键。
该表的每一行表示 一名教师的信息,包含编号、姓名。
找出姓名不为空值的教师信息。
查询结果如下例所示。
示例 1:
输入:
表:教师表
+-------+---------+
| 教师号 | 教师姓名 |
+-------+--------+
| 1 | 猴子 |
| 2 | 小明 |
| 3 | |
| 4 | null |
+-------+--------+
输出:
+-------+---------+
| 教师号 | 教师姓名 |
+-------+--------+
| 1 | 猴子 |
| 2 | 小明 |
+-------+--------+
解释:
编号 3 的教师姓名为空值,编号 4 的教师姓名为 null,因此返回 编号 1 和 2 的教师信息
select * from 教师表 where 教师姓名 is not null and 教师姓名 <> ''