"常量和运算" 是 SQL 中用于对数据进行计算和处理的重要概念。在 SQL 查询中,常量指的是固定的数值或文本(比如 "1"),而运算则是对这些常量进行数学运算或字符串操作。
通过常量和运算,我们可以在查询语句中对数据进行加减乘除、取平均值、连接文本等操作,从而得到我们想要的查询结果。
select name,2*score double_score
from student
模糊查询是一种特殊的条件查询,它允许我们根据模式匹配来查找符合特定条件的数据,可以使用 LIKE 关键字实现模糊查询。
在 LIKE 模糊查询中,我们使用通配符来代表零个或多个字符,从而能够快速地找到匹配的数据。
有如下 2 种通配符:
- 百分号(%):表示任意长度的任意字符序列。
- 下划线(_):表示任意单个字符。
模糊查询的应用场景:假设你是一名侦探,你需要根据目标人物的一部分线索信息来找到匹配的目标,比如你可以根据目标的名字中包含的关键字或字符来查找。
同理,可以使用
not like
来查询不包含某关键字的信息。
请编写一条 SQL 查询语句,从名为 student 的数据表中
选择出所有学生的姓名(name)和成绩(score),
要求姓名(name)不包含 "李" 这个字。
select name,score
from student
where name not like '%李%'
逻辑运算是一种在条件查询中使用的运算符,它允许我们结合多个条件来过滤出符合特定条件的数据。
在逻辑运算中,常用的运算符有:
- AND:表示逻辑与,要求同时满足多个条件,才返回 true。
- OR:表示逻辑或,要求满足其中任意一个条件,就返回 true。
- NOT:表示逻辑非,用于否定一个条件(本来是 true,用了 not 后转为 false)
在数据表中,可能存在重复的数据记录,但如果我们想要过滤掉重复的记录,只保留不同的记录,就要使用 SQL 的去重功能。
在 SQL 中,我们可以使用
DISTINCT
关键字来实现去重操作。除了按照单字段去重外,
DISTINCT
关键字还支持根据多个字段的组合来进行去重操作,确保多个字段的组合是唯一的。示例语法如下:
distinct 字段1, 字段2, 字段3, ... select distinct class_id,exam_num from student
在排序的基础上,我们还可以根据多个字段的值进行排序。当第一个字段的值相同时,再按照第二个字段的值进行排序,以此类推。
示例语法如下:
order by 字段1 [升序/降序], 字段2 [升序/降序], ... select name,age,score from student order by score desc,age asc
假设你有一张待办事项清单,上面有很多任务。当你每次只想查看其中的几个任务时,会怎么办呢?
1)你可以使用手指挡住不需要看的部分(即截断)
2)根据任务的编号,直接翻到需要查看的位置(即偏移)
在 SQL 中,我们使用
LIMIT
关键字来实现数据的截断和偏移。截断和偏移的一个典型的应用场景是分页,即网站内容很多时,用户可以根据页号每次只看部分数据。
现在,我们使用
LIMIT
关键字来进行分页查询:-- LIMIT 后只跟一个整数,表示要截断的数据条数(一次获取几条) select task_name, due_date from tasks limit 2; -- LIMIT 后跟 2 个整数,依次表示从第几条数据开始、一次获取几条 select task_name, due_date from tasks limit 2, 2; 请编写一条 SQL 查询语句,从名为 student 的数据表中选择 学生姓名(name)和年龄(age),按照年龄从小到大排序, 从第 2 条数据开始、截取 3 个学生的信息。 select name,age from student order by age limit 1,3 //从第2(下标为1)条数据开始,截取3个学生的信息
条件分支 case when
case when 相当于 if else 允许我们根据不同的条件选择不同的结果返回
使用case when 可在查询结果中根据特定的条件动态生成新的列或对现有的列进行转换
case when (条件1) then 结果1
when (条件2) then 结果2
...
else 其他结果 end
假设有一个学生表 student,包含以下字段:name(姓名)、age(年龄)。 请你编写一个 SQL 查询,将学生按照年龄划分为三个年龄等级(age_level): 60 岁以上为 "老同学",20 岁以上(不包括 60 岁以上)为 "年轻", 20 岁及以下、以及没有年龄信息为 "小同学"。 返回结果应包含学生的姓名(name)和年龄等级(age_level),并按姓名升序排序。 select name , case when(age>60) then '老同学' when(age>20) then '年轻' else '小同学' end as age_level from student order by name asc
时间函数
在 SQL 中,时间函数是用于处理日期和时间的特殊函数。它们允许我们在查询中操作和处理日期、时间、日期时间数据,从而使得在数据库中进行时间相关的操作变得更加方便和灵活。
常用的时间函数有:
- DATE:获取当前日期
- DATETIME:获取当前日期时间
- TIME:获取当前时间
使用时间函数获取当前日期、当前日期时间和当前时间: -- 获取当前日期 SELECT DATE() AS current_date; -- 获取当前日期+时间 SELECT DATETIME() AS current_datetime; -- 获取当前时间 SELECT TIME() AS current_time;
假设有一个学生表 student,包含以下字段:name(姓名)、age(年龄)。 请你编写一个 SQL 查询,展示所有学生的姓名(name) 和当前日期(列名为 "当前日期")。 select name,date() 当前日期 from student
字符串函数
在 SQL 中,字符串处理是一类用于处理文本数据的函数。它们允许我们对字符串进行各种操作,如转换大小写、计算字符串长度以及搜索和替换子字符串等。字符串处理函数可以帮助我们在数据库中对字符串进行加工和转换,从而满足不同的需求。
1)使用字符串处理函数
UPPER
将姓名转换为大写:2)使用字符串处理函数
LENGTH
计算姓名长度:3)使用字符串处理函数
LOWER
将姓名转换为小写:-- 将姓名转换为大写 SELECT name, UPPER(name) AS upper_name FROM employees; -- 计算姓名长度 SELECT name, LENGTH(name) AS name_length FROM employees; -- 将姓名转换为小写并进行条件筛选 SELECT name, LOWER(name) AS lower_name FROM employees;
聚合函数
在 SQL 中,聚合函数是一类用于对数据集进行 汇总计算 的特殊函数。它们可以对一组数据执行诸如计数、求和、平均值、最大值和最小值等操作。聚合函数通常在 SELECT 语句中配合 GROUP BY 子句使用,用于对分组后的数据进行汇总分析。
常见的聚合函数包括:
- COUNT:计算指定列的行数或非空值的数量。
- SUM:计算指定列的数值之和。
- AVG:计算指定列的数值平均值。
- MAX:找出指定列的最大值。
- MIN:找出指定列的最小值。
使用聚合函数
COUNT(DISTINCT 列名)
计算订单表中不同客户的数量。
单字段分组group by
在 SQL 中,分组聚合是一种对数据进行分类并对每个分类进行聚合计算的操作。它允许我们按照指定的列或字段对数据进行分组,然后对每个分组应用聚合函数,如 COUNT、SUM、AVG 等,以获得分组后的汇总结果。
在 SQL 中,通常使用
GROUP BY
关键字对数据进行分组。假设有一个学生表 student,包含以下字段:id(学号)、 name(姓名)、class_id(班级编号)、score(成绩)。 请你编写一个 SQL 查询,统计学生表中的班级编号(class_id) 和每个班级的平均成绩(avg_score)。 select class_id,avg(score) avg_score from student group by class_id
多字段分组和单字段分组的实现方式几乎一致,使用
GROUP BY
语法即可要查询使用多字段分组查询表中 每个客户 购买的 每种商品 的总金额,相当于按照客户编号和商品编号分组:
-- 查询每个用户购买的每种商品的总金额,按照客户编号和商品编号分组 SELECT customer_id, product_id, SUM(amount) AS total_amount FROM orders GROUP BY customer_id, product_id; 假设有一个学生表 student,包含以下字段:id(学号)、 name(姓名)、class_id(班级编号)、exam_num(考试次数)、 score(成绩)。请你编写一个 SQL 查询,统计学生表中的 班级编号(class_id),考试次数(exam_num)和每个班级 每次考试的总学生人数(total_num)。 select class_id,exam_num,count(*) total_num from student group by class_id,exam_num
在 SQL 中,HAVING 子句用于在分组聚合后对分组进行过滤。它允许我们对分组后的结果进行条件筛选,只保留满足特定条件的分组。
HAVING 子句与条件查询 WHERE 子句的区别在于,WHERE 子句用于在 分组之前 进行过滤,而 HAVING 子句用于在 分组之后 进行过滤。
假设有一个学生表 student,包含以下字段:id(学号)、 name(姓名)、class_id(班级编号)、score(成绩)。 请你编写一个 SQL 查询,统计学生表中班级的总成绩超 过 150 分的班级编号(class_id)和总成绩(total_score)。 select class_id,sum(score) total_score from student group by class_id having sum(score)>150
查询进阶 - 关联查询 - cross join
在 SQL 中,关联查询是一种用于联合多个数据表中的数据的查询方式。
其中,
CROSS JOIN
是一种简单的关联查询,不需要任何条件来匹配行,它直接将左表的 每一行 与右表的 每一行 进行组合,返回的结果是两个表的笛卡尔积。假设有一个学生表 student ,包含以下字段:id(学号)、name(姓名) 、age(年龄)、class_id(班级编号);还有一个班级表 class , 包含以下字段:id(班级编号)、name(班级名称)。 请你编写一个 SQL 查询,将学生表和班级表的所有行组合在一起, 并返回学生姓名(student_name)、学生年龄(student_age)、 班级编号(class_id)以及班级名称(class_name)。 //方法一: select s.name student_name, s.age student_age, s.class_id class_id, c.name class_name from student s cross join class c //方法二: select s.name student_name, s.age student_age, s.class_id class_id, c.name class_name from student s class c
查询进阶 - 关联查询 - inner join
在 SQL 中,INNER JOIN 是一种常见的关联查询方式,它根据两个表之间的关联条件,将满足条件的行组合在一起。
注意,INNER JOIN 只返回两个表中满足关联条件的交集部分,即在两个表中都存在的匹配行。
假设有一个学生表 student,包含以下字段:id(学号)、name(姓名)、 age(年龄)、class_id(班级编号)。还有一个班级表 class,包含以 下字段:id(班级编号)、name(班级名称)、level(班级级别)。 请你编写一个 SQL 查询,根据学生表和班级表之间的班级编号进行匹配, 返回学生姓名(student_name)、学生年龄(student_age)、 班级编号(class_id)、班级名称(class_name)、班级级别(class_level)。 //方法一: select s.name student_name, s.age student_age, c.id class_id, c.name class_name, c.level class_level from student s,class c where s.class_id=c.id //方法二: SELECT e.emp_name, e.salary, e.department, d.manager FROM employees e JOIN departments d ON e.department = d.department;
查询进阶 - 关联查询 - outer join
在 SQL 中,OUTER JOIN 是一种关联查询方式,它根据指定的关联条件,将两个表中满足条件的行组合在一起,并 包含没有匹配的行 。
在 OUTER JOIN 中,包括 LEFT OUTER JOIN 和 RIGHT OUTER JOIN 两种类型,它们分别表示查询左表和右表的所有行(即使没有被匹配),再加上满足条件的交集部分。