一、MySQL课程内容

Author:王国伟
Version:MySQL8.0

数据库介绍

  • 数据库概念
  • 术语介绍

MySQL数据库

  • 下载、安装、配置、卸载
  • MySQL客户端工具的安装及使用

SQL结构化查询语言

  • 什么是SQL
  • SQL操作数据(CRUD操作:添加、查询、修改、删除)

SQL高级

  • 存储过程
  • 索引
  • 触发器、视图

数据库事务

  • 什么是事务
  • 事务特征ACID
  • 事务隔离级别
  • 事务管理

数据库设计

  • 数据库设计步骤
  • 数据库设计范式
  • E-R图

数据库引擎

  • MySQL体系结构
  • 存储引擎介绍
  • 常见引擎
  • InnoDB逻辑存储结构

SQL优化

  • 插入优化
  • 排序优化

MySQL锁

  • 全局锁
  • 行级锁
  • 表级锁

MySQL日志

  • 错误日志
  • 二进制日志

运维

  • 主从复制
  • 读写分离

二、数据库介绍

数据库的概念

数据库是“按照数据结构来组织、存储和管理数据的仓库”。是一个长期存储在计算机内的、有组织的、可共享的、统一管理的大量数据的集合。数据库软件还提供了高效的增加\删除\修改\查询数据的解决方案。

  1. 数据库,就是存放数据的仓库
  2. 数据库(DataBase,简称DB)是长期存储在计算机内部有结构的、大量的、共享的数据结合
  • 长期存储:持久化
  • 有结构:
    • 类型:数据库不仅可以存放数据,而且存放的数据还是有类型的
    • 关系:存储数据与数据之间的关系
  • 大量:大多数数据库都是文件系统的,也就是说存储在数据库中的数据实际上就是存储在磁盘的文件中
  • 共享:多个应用程序可以通过数据库实现数据的共享

为什么需要用数据库

其实通过io技术对数据进行增删改查,实际上相当于自己写了一个数据库软件,但功能简单,执行效率低下,而且每个项目都开发数据操作相关的代码致使开发效率低下,数据库就是当前计算机软件开发行业中,对大量数据管理的通用解决方案,学习数据库就是学习如何和数据库软件进行交流,SQL语言就是程序员和数据库软件进行沟通的语言。

关系型数据库与非关系型数据库

数据库可以分为关系型非关系型数据库

  • 关系型数据库

    关系型数据库,采用关系模型来组织数据的存储,以行和列的形式存储数据并记录数据与数据之间的关系—–将数据存储在表格中,可以通过建立表格与表格之间的关联来维护数据与数据之间的关系。
    学生信息—-学生表
    班级信息—-班级表

  • 非关系型数据库

    非关系型数据库,采用键值对的模型来存储数据,只完成数据的记录,不会记录数据与数据之间的关系。在非关系型数据库中基于其特定的存储结构来解决一些大数据应用的难题。

    NoSQL(Not only SQL)数据库来指代非关系型数据库。

常见的数据库产品

关系型数据库产品

  • MySQL免费(最常用)

    • MrriaDB
    • Percona Server
  • PostgreSQL

  • Oracle(收费)(常用)

  • SQL Server

  • Access

  • Sybase

  • 达梦数据库

非关系型数据库产品

  • 面相检索的列式存储 Column-Oriented
    • HaBsae(Hadoop子系统)
    • BigTable(Google)
  • 面相高并发的缓存存储Key-Value
    • Redis
    • MemcacheDB
  • 面向海量数据访问文档存储Document-Oriented
    • MongoDB
    • CouchDB

数据库术语

  • 数据库(Database):存储的数据的集合,提供数据存储的服务
  • 数据(Data):实际上指的是描述事务的符号记录
  • 数据库管理系统(DataBase Management System简称:DBMS):数据库管理系统,是位于用户与操作系统之间的一层数据管理软件
  • 数据库管理员(DataBase Anministrator简称:DBA):负责数据库创建,使用及维护的专门人员
  • 数据库系统(DataBase System简称:DBS):数据库系统管理员,数据库管理系统及数据库组成整个单元

三、MySQL数据库的环境准备

MySQL的下载、安装、配置、卸载、安装DBMS、使用DBMS

MySQL版本及下载

版本

  • MySQL是Oracle公司提供的免费的关系型数据库,官网http://www.mysql.com/

  • MySQL目前最新版本是8.0.X,在企业项目中主流版本:5.0—5.5—5.6—5.7—8.0.X

    • 5.x — 常用版本为5.6或者5.7
    • 8.x — 常用版本为8.0.x
  • MySQL 8.x的新特性

    • 性能:官方8.x比5.7速度要快2倍
    • 支持NoSQL(非关系型)存储:5.7开始提供了对NoSQL的支持,8.0.x做了更近一步的改进
    • 窗口函数(提供了一种新的查询方式)
    • 索引:隐藏索引、降序索引
    • 可用性、可靠性

下载

MySQL安装

图片出错啦!

图片出错啦!

图片出错啦!

图片出错啦!

图片出错啦!

图片出错啦!

图片出错啦!

图片出错啦!

图片出错啦!

图片出错啦!

图片出错啦!

MySQL服务的启动与停止

MySQL是以服务的形式运行在系统中

计算机管理窗口

此电脑——>右键——>管理

图片出错啦!

Windows命令行

打开命令行:Win+R — 输入cmd回车

(如果上边步骤报错)以管理员身份打开命令行:Win+S····输入cmd选择以管理员身份运行

1
2
net stop mysql   	## 停止MySQL服务
net start MySQL ## 打开MySQL服务

图片出错啦!

MySQL的卸载

  • 先关闭服务

    1
    2
    ## 管理员身份启动cmd命令行
    net stop mysql
  • 卸载软件

    • 打开控制面板

      图片出错啦!

    • 点击”程序和功能”

      图片出错啦!

    • 找到MySQL右击卸载

      图片出错啦!

  • 删除目录

    • MySQL的安装目录:C:\Program Files\MySQL\MySQL Server 8.0,或者C:\Program Files(X86)\MySQL\MySQL(默认)
    • MySQL的数据文件目录(默认隐藏):C:\ProgramData\MySQL(默认,如果不允许删除,强制删除)
  • 删除注册表

    • 打开注册表:Win+R ··· 输入regedit ··· 回车
    • 删除HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\MySQL(新版的MySQL卸载后会自动删除)
    • 删除搜索mysql的相关项(非必须)

四、MySQL的管理工具

当完成数据库的安装之后,MySQL是以服务的形式运行在Windows/linux系统,用户是通过工具来对MySQL进行操作的,当我们安装完成MySQL之后默认安装了mysql Command line client,此工具是一个命令行形式的工具,通常我们会单独安装可视化DBMS工具:

常用工具比如(以下都是收费的):

  • SQLyog
  • Navicat for MySQL

当然这里也有免费的DBMS工具,比如DBeaver

MySQL Command line Client使用

  • 打开:开始菜单—MySQL— MySQL8.0 Command line client
  • 连接MySQL:输入密码即可(如果密码错误或者mysql服务没有启动,窗口会闪退)

五、MySQL逻辑结构

MySQL可以存储数据,但是存储在MySQL中的数据需要按照特定的结构进行存储

学生——–学校

数据——–数据库

逻辑结构

图片出错啦!

六、SQL结构化查询语言

SQL概述

SQL(Structured Query Language)结构化查询语言,用于存取、查询、更新数据以及管理关系型数据库系统

SQL发展
  • SQL是1981年由IBM公司推出,一经推出基于其简洁的语法在数据库中得到了广泛的应用,成为主流数据库的通用规范

  • SQL由ANSI组织确定规范

  • 在不同的数据库产品遵守SQL的通用规范,但是对SQL有一些不同的改进,形成了一些数据库的专有指令

    • MySQL:limit

    • SQLServer:top

    • Oracle:rownum

SQL分类

根据SQL指令完成的数据库操作的不同,可以将SQL指令分为四类:

  • DDL(Date Befinition Language)数据库定义语言

    • 用于完成对数据库对象(数据库、数据表、视图、索引)的创建、删除、修改
  • DML(Data Manipulation Language)数据库操作/操纵语言

    • 用于完成对数据库中的数据的添加、删除、修改操作
    • 添加:将数据存储到数据表
    • 删除:将数据从数据表移除
    • 修改:对数据表中的数据进行修改
  • DQL(Date Query Language)数据查询语言

    • 用于将数据表中的数据查询出来
  • DCL(Date Control Language)数据控制语言

    • 用于完成事务管理等控制性操作

SQL基本语法

在MySQL Conmmand Line Client 或者 navicat等工具中都可以编写SQL指令

  • SQl指令不区分大小写
  • 每条SQL表达式结束之后都已;结束
  • SQL关键字之间以空格进行分割
  • SQL之间可以不限制换行(可以有空格的地方就可以有换行)

DDL 数据定义语言

DDL-数据库操作

使用DDL语句可以创建数据库、查询数据库、修改数据库、删除数据库

查询数据库

1
2
3
4
5
## 显示当前mysql中的数据库表
show databases;

## 显示指定名称的数据库创建SQL指令
show create database db_test;

创建数据库

1
2
3
4
5
6
7
8
## 创建数据库 db_test表示创建的数据库名称,可以自定义
create database db_test;

## 创建数据库,当指定名称的数据库不存在时执行创建
create database if not exists db_test;

## 在创建数据库的同时指定数据库的字符集(字符集:数据存储在数据表中采用的编码格式 utf8 gbk)
create database db_test charcter set utf8;

修改数据库 修改数据库字符集

1
2
## 修改数据库的字符集
alter database db_test character set utf8; #utf8 gbk

删除数据库 删除数据库时会删除当前数据库中所有的数据表中的数据

1
2
3
4
5
## 删除数据库
drop database db_test;

## 如果数据库存在则删除数据库
drop database is exists db_test;

使用/切换数据库

1
use db_test;

DDL-数据表操作

创建数据表

数据表实际上就是一个二维的表格,一个表格是由多列组成,表格中的每一类成之为表格的一个字段

图片出错啦!

在数据库中创建列名如果需要多个单词,请用_来区分,因为SQL语句不区分大小写

在小括号中定义列名,需要通过,分割,切记最后一个没有逗号

char(8):不可变字符串(定长,如果字符串长度不够,会自动补0)

varchar(20):可变字符串(一个字符占2个字节)

not null:约束不能为空

unique:约束不可重复

1
2
3
4
5
6
7
8
create table students(
stu_num char(8) not null unique,
stu_name varchar(20) not null,
stu_gender char(2) not null,
stu_age int not null,
stu_tel char(11) not null unique,
stu_qq varchar(11) unique
);

查询全部数据表

1
show tables;

查询表结构

1
desc students;

删除数据表

1
2
3
4
5
## 删除数据表
drop table students;

## 当前表存在时删除数据表
drop table if exists students;

修改数据表

修改表的关键词为alter

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
## 修改表名
alter table <表名> rename to <新的表名>;

## 数据表也是有字符集的,默认字符集和数据库一致,当然也可以通过以下语句进行修改
alter table <表名> character set utf8;

## 添加列(字段)
alter table <表名> add <列名> varchar(200);

## 修改列(字段)的列表和类型
alter table <表名> change <旧的列名> <新的列名> <类型>;

## 只修改列(字段)类型
alter table <表名> modify <列名> <新类型>;

## 删除列(字段)
alter table stus drop <列名>;

MySQL数据类型

数据类型,指的是数据表中的列中支持存放的数据的类型

数值类型

在mysql中有多种数据类型可以存放数值,不同的类型存放的数值的范围或者形式是不同的

注意:前三种数字类型我们在实际研发中心用的很少,一般整数类型我们会直接使用int/integer,如果过大会使用bigint,同样浮点数类型默认会使用double

类型 内存空间大小 范围 说明
tinyint 1byte 有符号 -128 - 127
无符号 0 - 255
特小型整数(年龄)
smalint 2byte(16bit) 有符号 -32768 - 32767
无符号 0 - 65535
小型整数
mediumint 3byte 有符号 -2^31 - 2^31-1
无符号 0 - 2^32-1
中型整数
int/integer 4byte 整数
bigint 8byte 大型整数
float 4byte 单精度
double 8byte 双精度
decimal 一般情况:第一参数+2 decimal(10,2)
表示数值一共有10位
小数位有2位

字符串类型

存储字符串列的类型

注意:在数据库中存储图片或者音频视频等内容,一般是存储,文件在服务器上的路径,当然如果非要存储就需要将图片等数据转成二进制进行存储,所以blob类型是可以存储所有类型的,但是前提是需要转换成二进制,所以此类型用的很少。

longtext类型一般用于varchar类型存储不下的时候。

常用类型也就是char和varchanr

类型 字符长度 说明
char 0-255字节 定长字符串,最多可以存储255个字符;当我们指定数据表字段为char(n),此列中的数据最长为n个字符,如果添加的数据小于n,则补’\u0000’至n长度
varchar 0-65536字节 可变字符串,此类型的最大长度为65535
tinyblob 0-255字节 存储二进制字符串
blob 0-65535 存储二进制字符串
mediumblob 0-1677215 存储二进制字符串
longblob 0-4294967295 存储二进制字符串
tinytext 0-255 文本数据(字符串)
text 0-65535 文本数据(字符串)
mediumtext 0-1677215 文本数据(字符串)
longtext 0-4294967295 文本数据(字符串)

日期类型

在MySQL数据库中,我们可以使用字符串在存储时间,但是如果我们需要基于时间字段进行查询操作(查询在某个时间段的数据)就不便于查询实现

类型 格式 说明
date 2021-09-13 日期,只存储年月日
time 18:26:36 时间,只存储时分秒
year 2024 年份
datatime 2024-04-14 18:26:59 日期+时间,存储年月日时分秒
timestamp 20240414182659 日期+时间,(时间锉)

字段约束

约束介绍

在创建数据表的时候,指定的对数据表的列的数据限制性的要求(对表的列中的数据进行限制)

为什么要给表中的列添加约束呢?

  • 保证数据的有效性
  • 保证数据的完整性
  • 保证数据的正确性

字段常见的约束有哪些呢?

  • 非空约束(not null):限制此列的值必须提供,不能为null
  • 唯一约束(unique):在表的多条数据,此列的值不能重复
  • 主键约束(primary key):非空+唯一,能够唯一标识数据表中的一条数据
  • 外键约束(foreign key):建立不同表之间的关联关系

非空约束

限制数据表中此列的值必须提供

  • 创建表:设置图书表的 book_name not null
1
2
3
4
5
create table books(
book_isbn char(4),
book_name varchar(10) not null,
book_author varcahr(6)
);

唯一约束

在表中的多条数据,此列的值不能重复

  • 创建表:设置图书表的book_isbn为unique
1
2
3
4
5
create table books(
book_isbn char(4) unique,
book_name varchar(10) not null,
book_author varcahr(6)
);
  • 添加数据

    图片出错啦!

主键约束

主键——就是数据表中记录唯一标识,在一张表中只能有一个主键(主键可以是一个列,也可以是多个列的组合)

当一个字段声明为主键之后,添加数据时:

  • 此字段数据不能为null
  • 此字段不能重复

创建表时添加主键约束

1
2
3
4
5
create table books(
book_isbn char(4) primary key,
book_name varchar(10) not null,
book_author varcahr(6)
);

或者

1
2
3
4
5
6
create table books(
book_isbn char(4),
book_name varchar(10) not null,
book_author varcahr(6),
primary key(book_isbn)
);

删除数据表主键约束

1
alter table <表名> drop primary key;

创建表之后添加主键约束

1
2
3
4
5
6
7
8
9
## 创建表时没有添加主键约束
create table books(
book_isbn char(4),
book_name varchar(10) not null,
book_author varcahr(6)
);

## 创建表之后添加主键约束
alter table <表名> modify book_isbn char(4) primary key;

主键自动增长

在我们创建一张数据表时,如果数据表中有列可以作为主键(例如:学生表的学号,图书表的isbn)我们可以直接这个列为主键;

当有些数据表中没有合适的列作为主键时,我们可以额外定义一个与记录本身无关的列(ID)作为主键,此列数据无具体的含义,主要用于标识一条记录,在mysql中我们可以将此列定义为int,同时设置为自动增长,当我们向数据表中新增一条记录时,无需提供ID的列的值,它会自动生成。

定义此列的原因,在于后期我们使用教程,对于数据进行CRUD的时候,可以根据此ID字段来完成一些操作。

定义主键自动增长

  • 定义int类型字段自动增长:auto_increment
1
2
3
4
5
create table types(
type_id int primary key auto_increment,
type_name varchar(20) not null,
type_remark varchar(100)
);

注意:自动增长从1开始,每添加一条记录,自动的增长的列会自定+1,当我们把某条记录删除之后再添加数据,自动增长的数据也不会重复生成(自动增长只保证唯一性、不保证连续性)

联合主键

图片出错啦!

如上的案例中,students为学员、courses为课程表、grads为分数表。此时成绩表中没有任何一列可以作为主 键的存在,因为不管是stu_num还是courses_id包括score都不能作为唯一表示的存在,所以此刻我们就需要使 用到联合主键,所以需要确定stu_num和course_id一并作为唯一标识

定义联合主键

1
2
3
4
5
6
7
8
9
10
11
12
create table grades(
stu_num char(8),
course_id int,
score int,
primary key(stu_num,course_id)
);
## 以下写法不可
create table grades(
stu_num char(8) primary key,
course_id int primary key,
score int
);

注意:在实际企业项目的数据库设计中,联合主键使用的频率并不高;当一张表中没有明确的字段可以作为主键时,我们可以额外添加一个ID字段作为主键。

外键约束

在多分表关联部分会提到

DML数据操纵语言

用于完成对数据表中的数据的插入、删除、修改操作

1
2
3
4
5
6
7
8
create table stus(
stu_num char(8) primary key,
stu_name varchar(20) not null,
stu_gender char(2) not null,
stu_age int not null,
stu_tel char(11) not null unique,
stu_qq varchar(11) unique
);

插入数据

语法

1
insert into <表名> (列名,列名....) valuse(值1,值2....);

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
## 向数据表中添加数据。完整格式
insert into stus(stu_num,stu_name,stu_gender,stu_age,stu_tel,stu_qq)
values('20240101','张三','男',21,'13030303300','55555555');

## 向数据表中指定的列添加数据(不允许为空的列必须提供数据)
insert into stus(stu_num,stu_name,stu_gender,stu_age,stu_tel)
values('20240102','李四','男',21,'13030303301');

## 数据表名后的字段列名顺序可以不与表中的一致,但是values中的值的顺序必须与表名后的字段名顺序对应
insert into stus(stu_num,stu_name,stu_age,stu_tel,stu_gender)
values('20240103','王五',20,'13030303302','女');

## 当要向表中的所有列添加数据时,数据表名后面的字段可以省略,但是values中的值的顺序要与数据表定义的字段保持一致
insert into stus values('20240104','赵六','男',21,'13030303304','666666');

## 不过在项目开发中,即使要向所有的列添加数据,也建议将列名的列表显示写出来(增强SQL的稳定性)
insert into stus(stu_num,stu_name,stu_gender,stu_age,stu_tel,stu_qq)
values('20240105','小明','男',21,'13030303304','666666');

删除数据

语法

1
delete from <表名> {where ...条件};

示例

1
2
3
4
5
6
7
8
## 删除学号为20240102的学生信息
delete from stus where stu_num='20240102';

## 删除年龄大于20岁的学生信息(如果满足where子句的记录有多条,则删除多条记录)
delete from stus where stu_age>20;

## 如果删除语句没有where子句,则表示删除当前数据表中的所有记录(慎用!!!!!)
delete from stus;

修改数据

对数据表中已经添加的记录进行修改

语法

1
update <表名> set 列名=值 {where ...条件}

示例

1
2
3
4
5
6
7
8
9
10
11
## 将学号为20240105的学生姓名修改为“孙七”(只修改一列)
update stus set stu_name='孙七' where stu_num='20240105';

## 将学号为20240103的学生 性别修改为“男”同时将QQ修改为“777777”(修改多列)
update stus set stu_gender='男',stu_qq='777777' where stu_num='20240103';

## 根据主键修改其他所有列
updata stus set stu_name='韩梅梅',stu_gender="女",stu_age=18,stu_tel='131313133111',stu_qq='999999' where stu_num='20240102';

## 如果update语句没有where子句,则表示修改当前表中所有行(记录)
update stus set stu_name='Tom';

DQL数据查询语言

从数据表中提取满足特定条件的记录

  • 单表查询
  • 多表联合查询

查询基础语法

1
2
3
4
5
## select 关键字后指定要显示查询到的记录的哪些列
select 列名1{,列名2,列名3...} from <表名> {where ...条件};

## 如果要显示查询到的记录的所有列,则可以使用*替代字段名列表(在项目开发中不建议使用*
select * from stus;

where字句

在删除、修改及查询的语句后都可以添加where子句(条件),用于筛选满足特定的添加的数据进行删除、修改和查询操作。

1
2
3
delete from 表名 where 条件;
update 表名 set ... where 条件;
select ... from 表名 where 条件;

条件关系运算符

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
##  =  等于
select * from stus where stu_num = '20240101';

##!=<>不等于
select * from stus where stu_num != '20240101';
select * from stus where stu_num <> '20240101';

##>大于
select * from stus where stu_age > 18;

##<小于
select * from stus where stu_age < 20;

##>=大于等于
select * from stus where stu_age >= 18;

##<=小于等于
select * from stus where stu_age <= 20;

##between and 区间查询between v1 and v2
select * from stus where stu_age between 18 and 20;

条件逻辑运算符

在where字句中,可以将多个条件通过逻辑预算(and or not)进行连接,通过多个条件来筛选要操作的数据。

1
2
3
4
5
6
7
8
##and 并且,筛选多个条件同时满足的记录
select * from stus where stu_gender = '女' and stu_age < 21;

##or 或者,筛选多个条件至少满足一个条件的记录
select * from stus where stu_gender = '女' or stu_age < 21;

##not 取反,筛选多个条件同时满足的记录
select * from stus where stu_age not between 18 and 20;

LIKE字句

在where字句的条件中,我们可以使用like关键字来实现模糊查询

语法

1
select * from 表名 where 列名 like "reg";
  • 在like关键字后的reg表达式中
    • %表示任意多个字符【%o% 包含字母o】
    • _表示任意一个字符【_o% 第二个字母为o】

示例

1
2
3
4
5
6
7
8
9
10
11
# 查询学生姓名包含字母o的学生信息
select * from stus where stu_name like "%o%";

# 查询学生姓名第一个字为‘张’的学生信息
select * from stus where stu_name like "张%";

# 查询学生表姓名最后一个字为o的学生信息
select * from stus where stu_name like "%d";

# 查询学生姓名中第二个字母为o的学生信息
select * from stus where stu_name like "_o%";

对查询结果的处理

设置查询的列

声明显示查询结果的指定列

1
select 列名1,列名2,... from stus where stu_age > 20;
计算列

对从数据表中查询的记录的列进行一定的运算之后显示出来

1
2
3
4
5
6
7
8
9
10
11
12
## 出生年份 = 当前年份 - 年龄
select stu_name,2024-stu_age from stus;

+---------- +--------------+
| stu_name | 2024-stu_age|
+---------- +--------------+
| 张三 | 2003 |
| 李四 | 2003 |
| 王五 | 2004 |
| 赵六 | 2003 |
| 小黑 | 2014 |
+-----------+--------------+
as字段取别名
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
select stu_name,2021-stu_age as stu_birth_year from stus;

+----------+----------------+
| stu_name | stu_birth_year |
+----------+----------------+
| 张三 | 2000 |
| 李四 | 2000 |
| 王五 | 2001 |
| 赵六 | 2000 |
+----------+----------------+

select stu_name as 姓名,2021-stu_age as 出生年份 from stus;

+------+------------+
| 姓名 | 出生年份 |
+------+------------+
| 张三 | 2000 |
| 李四 | 2000 |
| 王五 | 2001 |
| 赵六 | 2000 |
+-------+-----------+
distinct消除重复行

从查询的结果中将重复的记录删除distinct

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
select stu_age from stus;

+---------+
| stu_age |
+---------+
| 23 |
| 21 |
| 20 |条件逻辑运算符
| 21 |
| 18 |
+---------+

select distinct stu_age from stus;

+---------+
| stu_age |
+---------+
| 23 |
| 21 |
| 20 |
| 18 |
+---------+
排序 - order by

将查询到的满足条件的记录按照指定的列的值升序/降序排列

语法

1
select * from 表名 where 条件 order by 列名 asc|desc;
  • order by 列名 表示将查询结果按照指定的列排序
    • asc按照指定的列升序(默认)
    • desc按照指定的列降序

实例

1
2
3
4
5
6
7
8
9
10
11
12
# 单字段排序
select * from stus where stu_age>15 order by stu_gender desc;

+----------+----------+------------+---------+-------------+------------+
| stu_num | stu_name | stu_gender | stu_age | stu_tel | stu_qq |
+----------+----------+------------+---------+-------------+------------+
| 20240101 | 张三 || 23 | 13030303300 | 55555555 |
| 20240102 | 李四 || 21 | 13030303301 | NULL |
| 20240104 | 赵六 || 21 | 13030303304 | 666666 |
| 20240103 | 王五 || 20 | 13030303302 | NULL |
| 20240105 | 小王 || 18 | 13030303305 | 4358566556 |
+----------+----------+------------+---------+-------------+------------+