数据库是存放专门存放和管理数据的库。数据库就好比是一座大型的图书馆,而这个图书馆可以存储大量的信息。我们可以在图书馆中建立各种各样的书架,每个书架代表一个数据表。

书架上会有很多本书,数据表中的每一行就相当于一本书,每一列就相当于这本书的属性,比如书的名称、书的出版日期等等。

SQL(Structured Query Language)是一种用于管理、操作和查询数据库的标准化语言,被广泛应用于各种类型的数据库,如 MySQL、PostgreSQL、Oracle、Microsoft SQL Server 等。

SQL 的语法是简单易学的,它使用类似自然语言的结构,方便开发人员和数据库管理员进行数据库操作和管理。无论是网站应用、企业软件还是大型数据系统,SQL 都是数据库操作的基础和核心。

查询

全表查询

如何使用 SQL 从数据库中查询数据呢?

首先要了解 select 查询,就好比是我们要从图书馆中找到我们感兴趣的书籍。我们可以使用 select 查询从数据表中检索所需的信息,就像是通过图书馆目录找到了我们想读的书。

select 查询语句有非常多的语法,本节我们学习的是最简单直接的 全表查询

当我们使用 select * from 表名 这样的 SQL 语句时,就是在进行全表查询,它会返回数据表中的所有行,让我们可以全面了解表中的数据。

示例:

让我们假设有一张名为 student 的数据表,它存储了学生的信息,包括学号、姓名、年龄等。

现在,我们来使用 select 全表查询语句,查看整个学生表的内容。

数据表 student

学号 姓名 年龄
101 小明 20
102 小红 22
103 小刚 21
104 小丽 19

SQL 查询语句:

1
select * from student;

查询结果:

学号 姓名 年龄
101 小明 20
102 小红 22
103 小刚 21
104 小丽 19

选择查询

选择查询是 SQL 中最基本的查询类型,它用于从数据表中选择 特定的列或字段 ,并只返回这些列的数据值。

选择查询的 SQL 语法是 SELECT {列名...},它告诉数据库我们想要查看哪些列的数据。

示例:

假设有一张名为 students 的学生数据表,它存储了班级里学生的信息,包括姓名(name)、年龄(age)、性别(gender)、分数(score)等。

数据表 students

name age gender score
John 18 Male 90
Alice 17 Female 88
Bob 19 Male 78
Kate 18 Female 95

现在,我们使用”选择查询”来获取所有学生的姓名(name)和性别(gender)信息,SQL 语句如下:

1
select name, gender from students;

查询结果:

name gender
John Male
Alice Female
Bob Male
Kate Female

通过上述 SQL 查询语句,我们得到了学生名单表中所有学生的姓名和性别信息。

别名

别名是为数据表的列或查询结果中的字段取一个临时的、可读性更高的名字,使得查询结果更加直观和易读。

在 SQL 查询中,我们可以使用别名语法 {原始字段名} as {别名} 来为查询结果的列名取一个便于理解的名称。通过使用别名,我们可以更直观地知道查询结果中每一列的含义,方便阅读和使用。

示例:

假设有一张名为 employees 的数据表,它存储了团队成员的信息,包括姓名(name)、年龄(age)、职位(position)等:

数据表 employees

name age position
John 30 Project Manager
Alice 28 Software Engineer
Bob 32 Product Designer
Kate 26 Marketing Specialist

现在,我们使用 “别名” 来获取所有团队成员的姓名(name)和职位(position)信息,并为它们取别名为 员工姓名职位名称

1
2
-- SQL查询语句
select name as 员工姓名, position as 职位名称 from employees;

上述代码中的 as 也可以省略,比如 name 员工姓名 也是可以的。

在某些数据库中(如Oracle),as必须省略

查询结果,注意表格头的列名从英文变为了中文:

员工姓名 职位名称
John Project Manager
Alice Software Engineer
Bob Product Designer
Kate Marketing Specialist

通过上述 SQL 查询语句,我们得到了团队成员名单表中所有成员的姓名和职位信息,并通过别名让查询结果更加易读和直观。

常量和运算

“常量和运算” 是 SQL 中用于对数据进行计算和处理的重要概念。在 SQL 查询中,常量指的是固定的数值或文本(比如 “1”),而运算则是对这些常量进行数学运算或字符串操作。

通过常量和运算,我们可以在查询语句中对数据进行加减乘除、取平均值、连接文本等操作,从而得到我们想要的查询结果。

示例:

假设有一张名为 orders 的数据表,它存储了订单信息,包括订单编号(order_id)、商品单价(unit_price)、购买数量(quantity)等:

数据表orders

order_id unit_price quantity
1001 10.00 5
1002 20.00 3
1003 15.00 2
1004 25.00 4

现在,我们需要计算每个订单的总金额(total_amount),即商品单价(unit_price)乘以购买数量(quantity)。

SQL 查询语句如下:

1
2
3
select order_id, unit_price, quantity, 
unit_price * quantity as total_amount
from orders;

查询结果如下,其中 total_amount 是计算出来的新列:

order_id unit_price quantity total_amount
1001 10.00 5 50.00
1002 20.00 3 60.00
1003 15.00 2 30.00
1004 25.00 4 100.00

条件查询 where

有的时候,我们只想取表中的部分数据,怎么办呢?

这时,我们就可以使用条件查询语法。通过条件查询,你可以从数据库中筛选出 满足特定条件 的数据行,而不是返回表中的所有数据。

主要使用 where 子句在查询中设置过滤条件,只有满足这些条件的数据行才会被返回。

where 子句的语法如下:

1
2
3
SELECT1, 列2, ...
FROM 表名
WHERE 条件;

其中,列1, 列2, ...是你要选择的列,可以是具体的列名,也可以是*表示选择所有列。表名是你要从中查询数据的表名。条件是指定的查询条件,可以使用比较运算符(如=<>等)、逻辑运算符(如ANDOR等)、IN 操作符、LIKE 操作符等来设置条件。

示例:

让我们来看一个具体的SQL代码和结果示例,假设有一张名为products的数据表,它存储了产品信息,包括产品名称(name)、单价(price)、库存(stock)等:

数据表products

name price stock
A 10.00 50
B 20.00 30
C 15.00 20
D 25.00 10

现在,我们使用 “WHERE” 来筛选出库存小于等于 20 的产品:

1
2
-- SQL查询语句
select name, price, stock from products where stock <= 20;

查询结果:

name price stock
C 15.00 20
D 25.00 10

通过上述 SQL 查询语句,我们筛选出了库存小于等于 20 的产品,从而得到了符合条件的产品信息。

运算符

运算符是 SQL 中用于在条件查询中进行条件判断的特殊符号,比如 =!=<> 等。通过使用不同的运算符,我们可以在查询语句中设定多样化的条件,从而根据数据的不同属性进行灵活的筛选和过滤。

示例:

假设有一张名为 employees 的数据表,它存储了员工信息,包括员工姓名(name)、年龄(age)、工资(salary)等:

数据表 employees

name age salary
小明 25 5000
小红 30 6000
小李 28 5500
小张 22 4500

现在,我们使用不同的运算符来进行条件查询:

1)使用 “!=” 运算符筛选出 name 不是 ‘小张’ 的员工:

1
2
-- SQL查询语句
select name, age, salary from employees where name != '小张';

查询结果:

name age salary
小明 25 5000
小红 30 6000
小李 28 5500

2)使用 “>” 运算符筛选出工资高于 5500 的员工:

1
2
-- SQL查询语句
select name, age, salary from employees where salary > 5500;

查询结果:

name age salary
小红 30 6000

3)使用 “BETWEEN” 运算符筛选出年龄在 25 到 30 之间的员工:

1
2
-- SQL查询语句
select name, age, salary from employees where age between 25 and 30;

查询结果:

name age salary
小明 25 5000
小红 30 6000
小李 28 5500

空值

在数据库中,有时候数据表的某些字段可能没有值,即为空值(NULL)。

空值表示该字段的值是未知的、不存在的或者没有被填写的。在SQL查询中,我们可以使用 IS NULLIS NOT NULL 来判断字段是否为空值或非空值。

示例:

假设有一张名为 employees 的数据表,它存储了员工信息,包括员工姓名(name)、年龄(age)、入职日期(hire_date)等:

数据表 employees

name age hire_date
小明 25 2020-01-01
小红 30 2020-02-15
小李 28 NULL
小张 NULL 2020-03-20

现在,我们使用 “IS NULL” 来查询出入职日期未填写的员工:

1
2
-- SQL查询语句
select name, age from employees where hire_date is null;

查询结果:

name age
小李 28

模糊查询

模糊查询是一种特殊的条件查询,它允许我们根据模式匹配来查找符合特定条件的数据,可以使用 LIKE 关键字实现模糊查询。

在 LIKE 模糊查询中,我们使用通配符来代表零个或多个字符,从而能够快速地找到匹配的数据。

有如下 2 种通配符:

  • 百分号(%):表示任意长度的任意字符序列。
  • 下划线(_):表示任意单个字符。

示例:

假设有一张名为employees的数据表,它存储了员工信息,包括员工姓名(name)、年龄(age)、职位(position)等:

数据表employees

name age position
张三 25 软件工程师
李四 30 数据分析师
王五 28 产品经理
小明 22 软件测试工程师

现在,我们使用 LIKE 模糊查询来找出姓名(name)中包含关键字 “张” 的员工信息:

1
2
-- SQL查询语句
select name, age, position from employees where name like '%张%';

查询结果:

name age position
张三 25 软件工程师

还可以使用模糊查询匹配开头和结尾:

1
2
3
4
5
-- 只查询以 "张" 开头的数据行
select name, age, position from employees where name like '张%';

-- 只查询以 "张" 结尾的数据行
select name, age, position from employees where name like '%张';

同理,可以使用 not like 来查询不包含某关键字的信息。

逻辑运算

逻辑运算是一种在条件查询中使用的运算符,它允许我们结合多个条件来过滤出符合特定条件的数据。

在逻辑运算中,常用的运算符有:

  • and:表示逻辑与,要求同时满足多个条件,才返回 true。
  • or:表示逻辑或,要求满足其中任意一个条件,就返回 true。
  • not:表示逻辑非,用于否定一个条件(本来是 true,用了 not 后转为 false)

示例:

假设有一张名为employees的数据表,它存储了员工信息,包括员工姓名(name)、年龄(age)、工资(salary)等:

数据表employees

name age salary
张三 25 10000
李四 30 12000
李五 28 15000
小明 22 8000

现在,我们使用逻辑运算来找出姓名中包含关键字 “李” 年龄小于 30 岁的员工信息:

1
2
-- SQL查询语句
select name, age, salary from employees where name like '%李%' and age < 30;

查询结果:

name age salary
李五 28 15000

关联查询 cross join

有时,我们可能希望在单张表的基础上,获取更多额外数据,比如获取学生表中学生所属的班级信息等。这时,就需要使用关联查询。

在 SQL 中,关联查询是一种用于联合多个数据表中的数据的查询方式。

其中,CROSS JOIN 是一种简单的关联查询,不需要任何条件来匹配行,它直接将左表的 每一行 与右表的 每一行 进行组合,返回的结果是两个表的笛卡尔积。

示例:

假设有一个员工表 employees,包含以下字段:emp_id(员工编号)、emp_name(员工姓名)、department(所属部门)、salary(工资)。数据如下:

emp_id emp_name department salary
1 小明 技术部 5000
2 小红 财务部 6000
3 李华 销售部 4500

假设还有一个部门表 departments,包含以下字段:department(部门名称)、manager(部门经理)、location(所在地)。数据如下:

department manager location
技术部 张三 上海
财务部 李四 北京
销售部 王五 广州

使用 CROSS JOIN 进行关联查询,将员工表和部门表的所有行组合在一起,获取员工姓名、工资、部门名称和部门经理,示例 SQL 代码如下:

1
2
3
SELECT e.emp_name, e.salary, e.department, d.manager
FROM employees e
CROSS JOIN departments d;

注意,在多表关联查询的 SQL 中,我们最好在选择字段时指定字段所属表的名称(比如 e.emp_name),还可以通过给表起别名(比如 employees e)来简化 SQL 语句。

查询结果:

emp_name salary department manager
小明 5000 技术部 张三
小明 5000 财务部 李四
小明 5000 销售部 王五
小红 6000 技术部 张三
小红 6000 财务部 李四
小红 6000 销售部 王五
李华 4500 技术部 张三
李华 4500 财务部 李四
李华 4500 销售部 王五

inner join

在 SQL 中,INNER JOIN 是一种常见的关联查询方式,它根据两个表之间的关联条件,将满足条件的行组合在一起。

注意,INNER JOIN 只返回两个表中满足关联条件的交集部分,即在两个表中都存在的匹配行。

示例:

假设有一个员工表 employees,包含以下字段:emp_id(员工编号)、emp_name(员工姓名)、department(所属部门)、salary(工资)。数据如下:

emp_id emp_name department salary
1 小明 技术部 5000
2 小红 财务部 6000
3 李华 销售部 4500

假设还有一个部门表 departments,包含以下字段:department(部门名称)、manager(部门经理)、location(所在地)。数据如下:

department manager location
技术部 张三 上海
财务部 李四 北京
销售部 王五 广州
摸鱼部 赵二 吐鲁番

使用 INNER JOIN 进行关联查询,根据员工表和部门表之间的公共字段 部门名称(department) 进行匹配,将员工的姓名、工资以及所属部门和部门经理组合在一起:

1
2
3
SELECT e.emp_name, e.salary, e.department, d.manager
FROM employees e
JOIN departments d ON e.department = d.department;

查询结果如下:

emp_name salary department manager
小明 5000 技术部 张三
小红 6000 财务部 李四
李华 4500 销售部 王五

我们会发现,使用 INNER_JOIN 后,只有两个表之间存在对应关系的数据才会被放到查询结果中。

outer join

在 SQL 中,OUTER JOIN 是一种关联查询方式,它根据指定的关联条件,将两个表中满足条件的行组合在一起,并 包含没有匹配的行

在 OUTER JOIN 中,包括 LEFT OUTER JOIN 和 RIGHT OUTER JOIN 两种类型,它们分别表示查询左表和右表的所有行(即使没有被匹配),再加上满足条件的交集部分。

示例:

假设有一个员工表 employees,包含以下字段:emp_id(员工编号)、emp_name(员工姓名)、department(所属部门)、salary(工资)。数据如下:

emp_id emp_name department salary
1 小明 技术部 5000
2 小红 财务部 6000
3 李华 销售部 4500

假设还有一个部门表 departments,包含以下字段:department(部门名称)、manager(部门经理)、location(所在地)。数据如下:

department manager location
技术部 张三 上海
财务部 李四 北京
人事部 王五 广州
摸鱼部 赵二 吐鲁番

使用 LEFT JOIN 进行关联查询,根据员工表和部门表之间的部门名称进行匹配,将员工的姓名、工资以及所属部门和部门经理组合在一起,并包含所有员工的信息:

1
2
3
SELECT e.emp_name, e.salary, e.department, d.manager
FROM employees e
LEFT JOIN departments d ON e.department = d.department;

查询结果:

emp_name salary department manager
小明 5000 技术部 张三
小红 6000 财务部 李四
李华 4500 销售部 NULL

关注下表格的最后一条数据,李华所属的销售部并没有在部门表中,但仍然返回在了结果集中,manager 为 NULL。

基础语法

去重 distinct

在数据表中,可能存在重复的数据记录,但如果我们想要过滤掉重复的记录,只保留不同的记录,就要使用 SQL 的去重功能。

在 SQL 中,我们可以使用 DISTINCT 关键字来实现去重操作。

示例:

假设有一张名为students的数据表,它存储了学生信息,包括学生姓名(name)、班级ID(class_id)、考试编号(exam_num)、成绩(score)等:

数据表students

name class_id exam_num score
张三 1 1 90
李四 2 2 85
王五 1 1 92
李四 2 3 88

现在,我们使用DISTINCT关键字来找出不同的班级 ID:

1
2
-- SQL 查询语句
select distinct class_id from students;

查询结果:

class_id
1
2

除了按照单字段去重外,DISTINCT 关键字还支持根据多个字段的组合来进行去重操作,确保多个字段的组合是唯一的。

示例语法如下:

1
distinct 字段1, 字段2, 字段3, ...

排序 order by

在查询数据时,我们有时希望对结果按照某个字段的值进行排序,以便更好地查看数据。

在 SQL 中,我们可以使用 order by 关键字来实现排序操作。order by 后面跟上需要排序的字段,可以选择升序(ASC)或降序(DESC)排列。

示例:

假设有一张名为 students 的数据表,它存储了学生信息,包括学生姓名(name)、年龄(age)和成绩(score)等:

数据表 students

name age score
张三 18 90
李四 20 85
王五 19 92
赵六 20 88

现在,我们使用order by关键字来对学生表进行排序:

1
2
3
4
5
-- SQL 查询语句 1
select name, age from students order by age asc;

-- SQL 查询语句 2
select name, score from students order by score desc;

查询语句 1 结果,按照年龄升序(从小到大):

name age
张三 18
王五 19
李四 20
赵六 20

查询语句 2 结果,按照分数降序(从大到小):

name score
王五 92
张三 90
赵六 88
李四 85

在排序的基础上,我们还可以根据多个字段的值进行排序。当第一个字段的值相同时,再按照第二个字段的值进行排序,以此类推。

示例语法如下:

1
order by 字段1 [升序/降序], 字段2 [升序/降序], ...

截断和偏移 limit

先用一个比喻来引出截断和偏移的概念。

假设你有一张待办事项清单,上面有很多任务。当你每次只想查看其中的几个任务时,会怎么办呢?

1)手指挡住不需要看的部分(即截断)

2)根据任务的编号,直接翻到需要查看的位置(即偏移)

在 SQL 中,我们使用 limit 关键字来实现数据的截断和偏移。

截断和偏移的一个典型的应用场景是分页,即网站内容很多时,用户可以根据页号每次只看部分数据。

示例:

假设有一张名为 tasks 的数据表,它存储了待办事项信息,包括任务名称(task_name)和截止日期(due_date)等。

数据表tasks

task_name due_date
完成报告 2023-08-05
预约医生 2023-08-08
购买礼物 2023-08-10
安排旅行 2023-08-15

现在,我们使用LIMIT关键字来进行分页查询:

1
2
3
4
5
-- LIMIT 后只跟一个整数,表示要截断的数据条数(一次获取几条)
select task_name, due_date from tasks limit 2;

-- LIMIT 后跟 2 个整数,依次表示从第几条数据开始、一次获取几条
select task_name, due_date from tasks limit 2, 2;

查询语句 1 结果,只获取了 2 条数据:

task_name due_date
完成报告 2023-08-05
预约医生 2023-08-08

查询语句 2 结果,从下标为 2(第 3 条)数据的位置开始获取 2 条数据:

task_name due_date
购买礼物 2023-08-10
安排旅行 2023-08-15

条件分支 case when

条件分支 case when 是 SQL 中用于根据条件进行分支处理的语法。它类似于其他编程语言中的 if else 条件判断语句,允许我们根据不同的条件选择不同的结果返回。

使用 case when 可以在查询结果中根据特定的条件动态生成新的列或对现有的列进行转换。

示例:

假设有一个学生表 student,包含以下字段:name(姓名)、age(年龄)。使用条件分支 case when ,将学生按照年龄划分为三个年龄等级(age_level):60 岁以上为 “老同学”,20 岁以上(不包括 60 岁以上)为 “年轻”,20 岁及以下、以及没有年龄信息为 “小同学”。返回结果应包含学生的姓名(name)和年龄等级(age_level)

数据表student

id name age class_id score exam_num
1 张三 67 1 2.5 1
2 李四 18 1 400 4
3 热dog 40 2 600 4
4 摸FISH 2 360 4

示例SQL如下

1
2
3
4
5
6
7
8
9
SELECT
name,
CASE
WHEN (age > 60) THEN '老同学'
WHEN (age > 20) THEN '年轻'
ELSE '小同学'
END AS age_level
FROM
student

查询结果:

name age_level
张三 老同学
李四 小同学
热dog 年轻
摸FISH 小同学

case when 支持同时指定多个分支,示例语法如下:

1
2
3
4
CASE WHEN (条件1) THEN 结果1
WHEN (条件2) THEN 结果2
...
ELSE 其他结果 END

分组聚合 group by

在 SQL 中,分组聚合是一种对数据进行分类并对每个分类进行聚合计算的操作。它允许我们按照指定的列或字段对数据进行分组,然后对每个分组应用聚合函数,如 COUNT、SUM、AVG 等,以获得分组后的汇总结果。

在 SQL 中,通常使用 GROUP BY 关键字对数据进行分组。

示例:

假设有一个订单表 orders,包含以下字段:order_id(订单号)、customer_id(客户编号)、amount(订单金额)。数据如下:

order_id customer_id amount
1 A001 100
2 A002 200
3 A001 150
4 A003 50

1)使用分组聚合查询中每个客户的编号:

1
2
3
SELECT customer_id
FROM orders
GROUP BY customer_id;

查询结果:

customer_id
A001
A002
A003

2)使用分组聚合查询每个客户的下单数:

1
2
3
SELECT customer_id, COUNT(order_id) AS order_num
FROM orders
GROUP BY customer_id;

查询结果:

customer_id order_num
A001 2
A002 1
A003 1

多字段分组和单字段分组的实现方式几乎一致。

分组聚合 having子句

在 SQL 中,HAVING 子句用于在分组聚合后对分组进行过滤。它允许我们对分组后的结果进行条件筛选,只保留满足特定条件的分组。

HAVING 子句与条件查询 WHERE 子句的区别在于,WHERE 子句用于在 分组之前 进行过滤,而 HAVING 子句用于在 分组之后 进行过滤。

示例:

假设有一个订单表 orders,包含以下字段:order_id(订单号)、customer_id(客户编号)、amount(订单金额)。数据如下:

order_id customer_id amount
1 A001 100
2 A002 200
3 A001 150
4 A003 50

1)使用 HAVING 子句查询订单数超过 1 的客户:

1
2
3
4
SELECT customer_id, COUNT(order_id) AS order_num
FROM orders
GROUP BY customer_id
HAVING COUNT(order_id) > 1;

查询结果:

customer_id order_num
A001 2

2)使用 HAVING 子句查询订单总金额超过 100 的客户:

1
2
3
4
5
-- 查询订单总金额超过100的客户
SELECT customer_id, SUM(amount) AS total_amount
FROM orders
GROUP BY customer_id
HAVING SUM(amount) > 100;

查询结果:

customer_id total_amount
A001 250
A002 200

alter

用于在已有的表中添加、删除或修改列

如需在表中添加列,请使用下面的语法

1
2
ALTER TABLE table_name
ADD column_name datatype

如需删除表中的列,使用下面的语法(注意,某些数据库系统不允许这种在数据库表中删除列的方式)

1
2
ALTER TABLE table_name
DROP COLUMN column_name

要改变表中列的数据类型,使用下面的语法

1
2
3
4
5
6
7
8
9
**SQL Server / MS Access:**

ALTER TABLE table_name
ALTER COLUMN column_name datatype

**My SQL / Oracle:**

ALTER TABLE table_name
MODIFY COLUMN column_name datatype

示例:

Persons”表:

P_Id LastName FirstName Address City
1 Hansen Ola Timoteivn 10 Sandnes
2 Svendson Tove Borgvn 23 Sandnes
3 Pettersen Kari Storgt 20 Stavanger

在 “Persons” 表中添加一个名为 “DateOfBirth” 的列。

1
2
ALTER TABLE Persons
ADD DateOfBirth date

现在,”Persons” 表将如下所示:

P_Id LastName FirstName Address City DateOfBirth
1 Hansen Ola Timoteivn 10 Sandnes
2 Svendson Tove Borgvn 23 Sandnes
3 Pettersen Kari Storgt 20 Stavanger

update

Update 语句用于修改表中的数据。

语法:

1
UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值

示例:

Person:

LastName FirstName Address City
Gates Bill Xuanwumen 10 Beijing
Wilson Champs-Elysees

我们为 lastname 是 “Wilson” 的人添加 firstname:

1
UPDATE Person SET FirstName = 'Fred' WHERE LastName = 'Wilson'
LastName FirstName Address City
Gates Bill Xuanwumen 10 Beijing
Wilson Fred Champs-Elysees

函数

时间函数

在 SQL 中,时间函数是用于处理日期和时间的特殊函数。它们允许我们在查询中操作和处理日期、时间、日期时间数据,从而使得在数据库中进行时间相关的操作变得更加方便和灵活。

常用的时间函数有:

  • DATE:获取当前日期
  • DATETIME:获取当前日期时间
  • TIME:获取当前时间

示例:

假设有一个订单表 orders,包含以下字段:order_id(订单号)、order_date(下单日期)、order_time(下单时间)。数据如下:

order_id order_date order_time
1 2023-08-01 12:30:45
2 2023-08-01 14:20:10
3 2023-08-02 09:15:00
4 2023-08-02 18:05:30

使用时间函数获取当前日期、当前日期时间和当前时间:

1
2
3
4
5
6
7
8
-- 获取当前日期
SELECT DATE() AS current_date;

-- 获取当前日期时间
SELECT DATETIME() AS current_datetime;

-- 获取当前时间
SELECT TIME() AS current_time;

查询结果:

为了方便对比,放到同一个表格

current_date current_datetime current_time
2023-08-01 2023-08-01 14:30:00 14:30:00

注意,这里的日期、日期时间和时间将根据当前的系统时间来生成,实际运行结果可能会因为当前时间而不同。

还有很多时间函数,比如计算两个日期的相差天数、获取当前日期对应的毫秒数等,实际运用时自行查阅即可。

字符串处理

字符串处理是一类用于处理文本数据的函数。它们允许我们对字符串进行各种操作,如转换大小写、计算字符串长度以及搜索和替换子字符串等。字符串处理函数可以帮助我们在数据库中对字符串进行加工和转换,从而满足不同的需求。

示例:

假设有一个员工表 employees,包含以下字段:id(员工编号)、name(员工姓名)。数据如下:

id name
1 小明
2 热dog
3 Fish

1)使用字符串处理函数 UPPER 将姓名转换为大写:

1
2
3
-- 将姓名转换为大写
SELECT name, UPPER(name) AS upper_name
FROM employees;

查询结果:

name upper_name
小明 小明
热dog 热DOG
Fish FISH

2)使用字符串处理函数 LENGTH 计算姓名长度:

1
2
3
-- 计算姓名长度
SELECT name, LENGTH(name) AS name_length
FROM employees;

查询结果:

name name_length
小明 2
热dog 4
Fish 4

3)使用字符串处理函数 LOWER 将姓名转换为小写:

1
2
3
-- 将姓名转换为小写并进行条件筛选
SELECT name, LOWER(name) AS lower_name
FROM employees;

查询结果:

name lower_name
小明 小明
热dog 热dog
Fish fish

4)使用字符串处理函数translate替换

1
TRANSLATE(input_string, from_characters, to_characters);

在这个语法中:

  • input_string是要搜索的字符串。它可以是文字字符串,字符表达式或列。
  • from_characters是一个字符串表达式,其中包含应替换的字符。
  • to_characters是一个包含替换字符的字符串表达式。

如果from_charactersto_characters的长度不同,则TRANSLATE()函数将返回错误。

如果任何参数为NULL,则TRANSLATE()函数将返回NULL

以下示例使用TRANSLATE()函数将方括号替换为括号:

1
2
3
SELECT 
TRANSLATE('[408] 555 6789','[]','()') result;
SQL

执行上面查询,得到以下结果:

1
2
3
4
result
--------------
(408) 555 6789
Shell

该语句相当于两次调用REPLACE()函数:

1
2
SELECT 
REPLACE(REPLACE('[408] 555 6789','[','('),']',')') result;

聚合函数

在 SQL 中,聚合函数是一类用于对数据集进行 汇总计算 的特殊函数。它们可以对一组数据执行诸如计数、求和、平均值、最大值和最小值等操作。聚合函数通常在 SELECT 语句中配合 GROUP BY 子句使用,用于对分组后的数据进行汇总分析。

常见的聚合函数包括:

  • COUNT:计算指定列的行数或非空值的数量。
  • SUM:计算指定列的数值之和。
  • AVG:计算指定列的数值平均值。
  • MAX:找出指定列的最大值。
  • MIN:找出指定列的最小值。

示例:

假设有一个订单表 orders,包含以下字段:order_id(订单号)、customer_id(客户编号)、amount(订单金额)。数据如下:

order_id customer_id amount
1 A001 100
2 A002 200
3 A001 150
4 A003 50

1)使用聚合函数 COUNT 计算订单表中的总订单数:

1
2
SELECT COUNT(*) AS order_num
FROM orders;

查询结果:

order_num
4

2)使用聚合函数 COUNT(DISTINCT 列名) 计算订单表中不同客户的数量:

1
2
SELECT COUNT(DISTINCT customer_id) AS customer_num
FROM orders;

查询结果:

customer_num
3

3)使用聚合函数 SUM 计算总订单金额:

1
2
SELECT SUM(amount) AS total_amount
FROM orders;

查询结果:

total_amount
500

零散

extract(year from birthday) 返回出生年份