首先已经安装好了MySQL serverhttps://dev.mysql.com/downloads/file/?id=541637,并且完成环境配置,我使用的图形化界面工具是MySQL workbench。
https://dev.mysql.com/downloads/workbench/。
打开workbench并登录,即可开始编写mysql。
一.MySQL 创建和删除数据库
(1)创建数据库
我们可以在登陆 MySQL 服务后,使用 create 命令创建数据库,语法如下:
CREATE DATABASE 数据库名;
SHOW DATABASES;
可以看到我们已经创建的数据库mydatabase。而创建数据库的时候为什么要加``,这是为了防止与MySQL中的关键字中冲突。(注意的是在编写的工程中,大小写都是可以的,但是一般为了区分,我们一般将关键字作为大写)
但是如果数据库已经存在,执行 CREATE DATABASE 将导致错误。
为了避免这种情况,你可以在 CREATE DATABASE 语句中添加 IF NOT EXISTS 子句:
CREATE DATABASE IF NOT EXISTS mydatabase;
(2)删除数据库
在删除数据库过程中,务必要十分谨慎,因为在执行删除命令后,所有数据将会消失。
drop 命令删除数据库
drop 命令格式:
DROP DATABASE <database_name>;
可以发现在我执行完drop语句之后,“mydatabase”就已经被删除了
但是一般我们可以检查数据库是否存在:
DROP DATABASE [IF EXISTS] <database_name>;
参数说明:
IF EXISTS
是一个可选的子句,表示如果数据库存在才执行删除操作,避免因为数据库不存在而引发错误。database_name
是你要删除的数据库的名称。
注意: 在执行删除数据库操作前,请确保你确实想要删除数据库及其所有数据,因为该操作是不可逆的。为了避免误操作,通常建议在执行删除之前备份数据库。
(3)MySQL 选择数据库
在你连接到 MySQL 数据库后,可能有多个可以操作的数据库,所以你需要选择你要操作的数据库。
在 MySQL 中,要选择要使用的数据库,可以使用 USE 语句,以下是基本的语法:
USE database_name;
参数说明:
- database_name 是你要选择的数据库的名称。
选择来数据库后,你的后续 SQL 查询和操作在指定的数据库 database_name 上执行。
这样我们就可以对我们选择的数据库进行后续的操作了。
最后我们需要了解一下MySQL 数据类型
MySQL 中定义数据字段的类型对你数据库的优化是非常重要的。
MySQL 支持多种类型,大致可以分为三类:数值、日期/时间和字符串(字符)类型。
(4)数值类型
MySQL 支持所有标准 SQL 数值数据类型。
这些类型包括严格数值数据类型(INTEGER、SMALLINT、DECIMAL 和 NUMERIC),以及近似数值数据类型(FLOAT、REAL 和 DOUBLE PRECISION)。
关键字INT是INTEGER的同义词,关键字DEC是DECIMAL的同义词。
BIT数据类型保存位字段值,并且支持 MyISAM、MEMORY、InnoDB 和 BDB表。
作为 SQL 标准的扩展,MySQL 也支持整数类型 TINYINT、MEDIUMINT 和 BIGINT。下面的表显示了需要的每个整数类型的存储和范围。
类型 | 大小 | 范围(有符号) | 范围(无符号) | 用途 |
---|---|---|---|---|
TINYINT | 1 Bytes | (-128,127) | (0,255) | 小整数值 |
SMALLINT | 2 Bytes | (-32 768,32 767) | (0,65 535) | 大整数值 |
MEDIUMINT | 3 Bytes | (-8 388 608,8 388 607) | (0,16 777 215) | 大整数值 |
INT或INTEGER | 4 Bytes | (-2 147 483 648,2 147 483 647) | (0,4 294 967 295) | 大整数值 |
BIGINT | 8 Bytes | (-9,223,372,036,854,775,808,9 223 372 036 854 775 807) | (0,18 446 744 073 709 551 615) | 极大整数值 |
FLOAT | 4 Bytes | (-3.402 823 466 E+38,-1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38) | 0,(1.175 494 351 E-38,3.402 823 466 E+38) | 单精度 浮点数值 |
DOUBLE | 8 Bytes | (-1.797 693 134 862 315 7 E+308,-2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) | 0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) | 双精度 浮点数值 |
DECIMAL | 对DECIMAL(M,D) ,如果M>D,为M+2否则为D+2 | 依赖于M和D的值 | 依赖于M和D的值 | 小数值 |
(5)日期和时间类型
表示时间值的日期和时间类型为DATETIME、DATE、TIMESTAMP、TIME和YEAR。
每个时间类型有一个有效值范围和一个"零"值,当指定不合法的MySQL不能表示的值时使用"零"值。
TIMESTAMP类型有专有的自动更新特性,将在后面描述。
类型 | 大小 ( bytes) | 范围 | 格式 | 用途 |
---|---|---|---|---|
DATE | 3 | 1000-01-01/9999-12-31 | YYYY-MM-DD | 日期值 |
TIME | 3 | '-838:59:59'/'838:59:59' | HH:MM:SS | 时间值或持续时间 |
YEAR | 1 | 1901/2155 | YYYY | 年份值 |
DATETIME | 8 | '1000-01-01 00:00:00' 到 '9999-12-31 23:59:59' | YYYY-MM-DD hh:mm:ss | 混合日期和时间值 |
TIMESTAMP | 4 | '1970-01-01 00:00:01' UTC 到 '2038-01-19 03:14:07' UTC 结束时间是第 2147483647 秒,北京时间 2038-1-19 11:14:07,格林尼治时间 2038年1月19日 凌晨 03:14:07 | YYYY-MM-DD hh:mm:ss | 混合日期和时间值,时间戳 |
(6)字符串类型
字符串类型指CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET。该节描述了这些类型如何工作以及如何在查询中使用这些类型。
类型 | 大小 | 用途 |
---|---|---|
CHAR | 0-255 bytes | 定长字符串 |
VARCHAR | 0-65535 bytes | 变长字符串 |
TINYBLOB | 0-255 bytes | 不超过 255 个字符的二进制字符串 |
TINYTEXT | 0-255 bytes | 短文本字符串 |
BLOB | 0-65 535 bytes | 二进制形式的长文本数据 |
TEXT | 0-65 535 bytes | 长文本数据 |
MEDIUMBLOB | 0-16 777 215 bytes | 二进制形式的中等长度文本数据 |
MEDIUMTEXT | 0-16 777 215 bytes | 中等长度文本数据 |
LONGBLOB | 0-4 294 967 295 bytes | 二进制形式的极大文本数据 |
LONGTEXT | 0-4 294 967 295 bytes | 极大文本数据 |
注意:char(n) 和 varchar(n) 中括号中 n 代表字符的个数,并不代表字节个数,比如 CHAR(30) 就可以存储 30 个字符。
CHAR 和 VARCHAR 类型类似,但它们保存和检索的方式不同。它们的最大长度和是否尾部空格被保留等方面也不同。在存储或检索过程中不进行大小写转换。
BINARY 和 VARBINARY 类似于 CHAR 和 VARCHAR,不同的是它们包含二进制字符串而不要非二进制字符串。也就是说,它们包含字节字符串而不是字符字符串。这说明它们没有字符集,并且排序和比较基于列值字节的数值值。
BLOB 是一个二进制大对象,可以容纳可变数量的数据。有 4 种 BLOB 类型:TINYBLOB、BLOB、MEDIUMBLOB 和 LONGBLOB。它们区别在于可容纳存储范围不同。
有 4 种 TEXT 类型:TINYTEXT、TEXT、MEDIUMTEXT 和 LONGTEXT。对应的这 4 种 BLOB 类型,可存储的最大长度不同,可根据实际情况选择。
二.MySQL创建和删除数据表,插入和查询数据
(1)MySQL 创建数据表
创建 MySQL 数据表需要以下信息:
- 表名
- 表字段名
- 定义每个表字段的数据类型
语法
以下为创建 MySQL 数据表的 SQL 通用语法:
CREATE TABLE table_name (
column1 datatype,
column2 datatype,
...
);
参数说明:
table_name
是你要创建的表的名称。column1
,column2
, ... 是表中的列名。datatype
是每个列的数据类型。
接下来我就用我已经创建的mydatabase01进行操作:
我创建了一个学生表,里面包含三个属性(此时还没设置主键)。
-
如果你不想字段为空可以设置字段的属性为 NOT NULL,如上实例中的 runoob_title 与 runoob_author 字段, 在操作数据库时如果输入该字段的数据为空,就会报错。
- AUTO_INCREMENT 定义列为自增的属性,一般用于主键,数值会自动加 1。
- PRIMARY KEY 关键字用于定义列为主键。 您可以使用多列来定义主键,列间以逗号 , 分隔。
(2)MySQL 删除数据表
MySQL中删除数据表是非常容易操作的,但是你在进行删除表操作时要非常小心,因为执行删除命令后所有数据都会消失。
语法
以下为删除 MySQL 数据表的通用语法:
DROP TABLE table_name; -- 直接删除表,不检查是否存在
或者
DROP TABLE [IF EXISTS] table_name; -- 会检查是否存在,如果存在则删除
参数说明:
table_name
是要删除的表的名称。IF EXISTS
是一个可选的子句,表示如果表存在才执行删除操作,避免因为表不存在而引发错误。
如果你只是想删除表中的所有数据,但保留表的结构,可以使用 TRUNCATE TABLE 语句:
TRUNCATE TABLE table_name;
这会清空表中的所有数据,但不会删除表本身。
注意事项:
- 备份数据:在删除表之前,确保已经备份了数据,如果你需要的话。
- 外键约束:如果该表与其他表有外键约束,可能需要先删除外键约束,或者确保依赖关系被处理好。
这里我删除创建的学生表,然后再查看表格的时候就会报错,因为这个表格已经被删除了
然后我们可以了解一下alter命令
(3)MySQL ALTER 命令
当我们需要修改数据表名或者修改数据表字段时,就需要使用到 MySQL ALTER 命令。
MySQL 的 ALTER 命令用于修改数据库、表和索引等对象的结构。
ALTER 命令允许你添加、修改或删除数据库对象,并且可以用于更改表的列定义、添加约束、创建和删除索引等操作。
ALTER 命令非常强大,可以在数据库结构发生变化时进行灵活的修改和调整。
以下是 ALTER 命令的常见用法和实例:
1. 添加列
ALTER TABLE table_name
ADD COLUMN new_column_name datatype;
2. 修改列的数据类型
ALTER TABLE TABLE_NAME
MODIFY COLUMN column_name new_datatype;
3. 修改列名
ALTER TABLE employees
CHANGE COLUMN old_column_name new_column_name VARCHAR(255);
4. 删除列
ALTER TABLE employees
DROP COLUMN birth_date;
5. 添加 PRIMARY KEY
ALTER TABLE table_name
ADD PRIMARY KEY (column_name);
6. 添加 FOREIGN KEY
ALTER TABLE child_table
ADD CONSTRAINT fk_name
FOREIGN KEY (column_name)
REFERENCES parent_table (column_name);
7. 修改表名
ALTER TABLE old_table_name
RENAME TO new_table_name;
注意:
但在使用 ALTER 命令时要格外小心,因为一些操作可能需要重建表或索引,这可能会影响数据库的性能和运行时间。
在进行重要的结构修改时,建议先备份数据,并在生产环境中谨慎操作。
接下来我在我创建好的student表里面进行操作:
这里我执行了一部分alter命令,为‘student’表新增了一列,并将其中‘name’ 的数据类型改为char,并且将‘student_id’设为主键,最后修该表名为‘new_student’。
(4)MySQL 插入数据
MySQL 表中使用 INSERT INTO 语句来插入数据。
你可以通过 mysql> 命令提示窗口中向数据表中插入数据,或者通过PHP脚本来插入数据。
语法
以下为向MySQL数据表插入数据通用的 INSERT INTO SQL语法:
INSERT INTO table_name (column1, column2, column3, ...)
VALUES (value1, value2, value3, ...);
参数说明:
table_name
是你要插入数据的表的名称。column1
,column2
,column3
, ... 是表中的列名。value1
,value2
,value3
, ... 是要插入的具体数值。
如果数据是字符型,必须使用单引号 ' 或者双引号 ",如: 'value1', "value1"。
一个简单的实例,插入了一行数据到名为 users 的表中:
INSERT INTO users (username, email, birthdate, is_active)
VALUES ('test', 'test@runoob.com', '1990-01-01', true);
username
: 用户名,字符串类型。email
: 邮箱地址,字符串类型。birthdate
: 用户生日, 日期类型。is_active
: 是否已激活,布尔类型。
如果你要插入所有列的数据,可以省略列名:
INSERT INTO users
VALUES (NULL,'test', 'test@runoob.com', '1990-01-01', true);
这里,NULL 是用于自增长列的占位符,表示系统将为 id 列生成一个唯一的值。
如果你要插入多行数据,可以在 VALUES 子句中指定多组数值:
INSERT INTO users (username, email, birthdate, is_active)
VALUES
('test1', 'test1@runoob.com', '1985-07-10', true),
('test2', 'test2@runoob.com', '1988-11-25', false),
('test3', 'test3@runoob.com', '1993-05-03', true);
(5)MySQL 查询数据
MySQL 数据库使用 SELECT 语句来查询数据。
你可以通过 mysql> 命令提示窗口中在数据库中查询数据,或者通过 PHP 脚本来查询数据。
语法
以下为在 MySQL 数据库中查询数据通用的 SELECT 语法:
SELECT column1, column2, ...
FROM table_name
[WHERE condition]
[ORDER BY column_name [ASC | DESC]]
[LIMIT number];
参数说明:
column1
,column2
, ... 是你想要选择的列的名称,如果使用*
表示选择所有列。table_name
是你要从中查询数据的表的名称。WHERE condition
是一个可选的子句,用于指定过滤条件,只返回符合条件的行。ORDER BY column_name [ASC | DESC]
是一个可选的子句,用于指定结果集的排序顺序,默认是升序(ASC)。LIMIT number
是一个可选的子句,用于限制返回的行数。
应用实例:
-- 选择所有列的所有行
SELECT * FROM users;
-- 选择特定列的所有行
SELECT username, email FROM users;
-- 添加 WHERE 子句,选择满足条件的行
SELECT * FROM users WHERE is_active = TRUE;
-- 添加 ORDER BY 子句,按照某列的升序排序
SELECT * FROM users ORDER BY birthdate;
-- 添加 ORDER BY 子句,按照某列的降序排序
SELECT * FROM users ORDER BY birthdate DESC;
-- 添加 LIMIT 子句,限制返回的行数
SELECT * FROM users LIMIT 10;
现在我对着已经创建的‘new_student’表进行操作:
可以看见我在表中插入的数据,要是这时我想在表中继续插入一个数据
此时就会发生报错----因为‘student_id’我设置为主键,而主键在数据库中是不能重复的,所有此时就发生了报错。
我们也可以在创建表的时候,提前设置好属性:
三.MySQL WHERE 子句,UPDATE 更新和DELETE 语句
(1)WHERE 子句
我们知道从 MySQL 表中使用 SELECT 语句来读取数据。
如需有条件地从表中选取数据,可将 WHERE 子句添加到 SELECT 语句中。
WHERE 子句用于在 MySQL 中过滤查询结果,只返回满足特定条件的行。
语法
以下是 SQL SELECT 语句使用 WHERE 子句从数据表中读取数据的通用语法:
SELECT column1, column2, ...
FROM table_name
WHERE condition;
参数说明:
column1
,column2
, ... 是你要选择的列的名称,如果使用*
表示选择所有列。table_name
是你要从中查询数据的表的名称。WHERE condition
是用于指定过滤条件的子句。
WHERE 子句支持多种运算符,可按需组合实现复杂查询:
-
=
(等于)、<>
或!=
(不等于)>
(大于)、<
(小于)、>=
(大于等于)、<=
(小于等于)
示例:
SELECT * FROM users WHERE age >= 18; -- 筛选年龄≥18岁的用户
2.逻辑运算符
AND
(与)、OR
(或)、NOT
(非)
示例:
SELECT * FROM orders
WHERE total_amount > 1000 AND status = 'paid'; -- 金额>1000且已支付的订单
3.特殊字符
BETWEEN
(范围匹配):WHERE age BETWEEN 20 AND 30
IN
(多值匹配):WHERE country IN ('US', 'CN', 'JP')
LIKE
(模糊匹配):WHERE name LIKE 'J%'
(匹配以 J 开头的名字)%
表示任意字符(包括空),_
表示单个字符。
4.NULL 处理
- 使用
IS NULL
或IS NOT NULL
(不可用= NULL
)。
示例:
SELECT * FROM employees WHERE department_id IS NULL; -- 查找未分配部门的员工
如果我们想在 MySQL 数据表中读取指定的数据,WHERE 子句是非常有用的。
使用主键来作为 WHERE 子句的条件查询是非常快速的。
如果给定的条件在表中没有任何匹配的记录,那么查询不会返回任何数据。
现在我对我已经建好的表进行操作:
这个是我所建好的表,我现在想要查询 major是‘rap’ 的学生:
(2)MySQL UPDATE 更新
如果我们需要修改或更新 MySQL 中的数据,我们可以使用 UPDATE 命令来操作。
语法
以下是 UPDATE 命令修改 MySQL 数据表数据的通用 SQL 语法:
UPDATE table_name
SET column1 = value1, column2 = value2, ...
WHERE condition;
参数说明:
table_name
是你要更新数据的表的名称。column1
,column2
, ... 是你要更新的列的名称。value1
,value2
, ... 是新的值,用于替换旧的值。WHERE condition
是一个可选的子句,用于指定更新的行。如果省略WHERE
子句,将更新表中的所有行。
更多说明:
- 你可以同时更新一个或多个字段。
- 你可以在 WHERE 子句中指定任何条件。
- 你可以在一个单独表中同时更新数据。
当你需要更新数据表中指定行的数据时 WHERE 子句是非常有用的。
UPDATE orders
SET status = 'Shipped', ship_date = '2023-03-01'
WHERE order_id = 1001;
注意: 在使用 UPDATE 语句时,请确保你提供了足够的条件来确保只有你想要更新的行被修改。如果不提供 WHERE 子句,将更新表中的所有行,可能导致不可预测的结果。
(3)MySQL DELETE 语句
你可以使用 DELETE FROM 命令来删除 MySQL 数据表中的记录。
你可以在 mysql> 命令提示符或 PHP 脚本中执行该命令。
语法
以下是 DELETE 语句从 MySQL 数据表中删除数据的通用语法:
DELETE FROM table_name
WHERE condition;
参数说明:
table_name
是你要删除数据的表的名称。WHERE condition
是一个可选的子句,用于指定删除的行。如果省略WHERE
子句,将删除表中的所有行。
更多说明:
- 如果没有指定 WHERE 子句,MySQL 表中的所有记录将被删除。
- 你可以在 WHERE 子句中指定任何条件
- 您可以在单个表中一次性删除记录。
当你想删除数据表中指定的记录时 WHERE 子句是非常有用的。
实例
以下实例演示了如何使用 DELETE 语句。
DELETE FROM students
WHERE graduation_year = 2021;
注意: 在使用 DELETE 语句时,请确保你提供了足够的条件来确保只有你想要删除的行被删除。如果不提供 WHERE 子句,将删除表中的所有行,可能导致不可预测的结果。
四. MySQL LIKE 子句,UNION和ORDER BY 语句
(1)MySQL LIKE 子句
我们知道在 MySQL 中使用 SELECT 命令来读取数据, 同时我们可以在 SELECT 语句中使用 WHERE 子句来获取指定的记录。
WHERE 子句中可以使用等号 = 来设定获取数据的条件,如 "runoob_author = 'RUNOOB.COM'"。
但是有时候我们需要获取 runoob_author 字段含有 "COM" 字符的所有记录,这时我们就需要在 WHERE 子句中使用 LIKE 子句。
LIKE 子句是在 MySQL 中用于在 WHERE 子句中进行模糊匹配的关键字。它通常与通配符一起使用,用于搜索符合某种模式的字符串。
LIKE 子句中使用百分号 %字符来表示任意字符,类似于UNIX或正则表达式中的星号 *。
如果没有使用百分号 %, LIKE 子句与等号 = 的效果是一样的。
语法
以下是 SQL SELECT 语句使用 LIKE 子句从数据表中读取数据的通用语法:
SELECT column1, column2, ...
FROM table_name
WHERE column_name LIKE pattern;
参数说明:
column1
,column2
, ... 是你要选择的列的名称,如果使用*
表示选择所有列。table_name
是你要从中查询数据的表的名称。column_name
是你要应用LIKE
子句的列的名称。pattern
是用于匹配的模式,可以包含通配符。
更多说明:
- 你可以在 WHERE 子句中指定任何条件。
- 你可以在 WHERE 子句中使用LIKE子句。
- 你可以使用LIKE子句代替等号 =。
- LIKE 通常与 % 一同使用,类似于一个元字符的搜索。
- 你可以使用 AND 或者 OR 指定一个或多个条件。
- 你可以在 DELETE 或 UPDATE 命令中使用 WHERE...LIKE 子句来指定条件。
实例
以下是一些 LIKE 子句的使用实例。
1. 百分号通配符 %:
% 通配符表示零个或多个字符。例如,'a%' 匹配以字母 'a' 开头的任何字符串。
SELECT * FROM customers WHERE last_name LIKE 'S%';
以上 SQL 语句将选择所有姓氏以 'S' 开头的客户。
2. 下划线通配符 _:
_ 通配符表示一个字符。例如,'_r%' 匹配第二个字母为 'r' 的任何字符串。
SELECT * FROM products WHERE product_name LIKE '_a%';
以上 SQL 语句将选择产品名称的第二个字符为 'a' 的所有产品。
3. 组合使用 % 和 _:
SELECT * FROM users WHERE username LIKE 'a%o_';
以上 SQL 语句将匹配以字母 'a' 开头,然后是零个或多个字符,接着是 'o',最后是一个任意字符的字符串,如 'aaron'、'apol'。
4. 不区分大小写的匹配:
SELECT * FROM employees WHERE last_name LIKE 'smi%' COLLATE utf8mb4_general_ci;
以上 SQL 语句将选择姓氏以 'smi' 开头的所有员工,不区分大小写。
LIKE 子句提供了强大的模糊搜索能力,可以根据不同的模式和需求进行定制。在使用时,请确保理解通配符的含义,并根据实际情况进行匹配。
(2)MySQL UNION 操作符
本教程为大家介绍 MySQL UNION 操作符的语法和实例。
MySQL UNION 操作符用于连接两个以上的 SELECT 语句的结果组合到一个结果集合,并去除重复的行。
UNION 操作符必须由两个或多个 SELECT 语句组成,每个 SELECT 语句的列数和对应位置的数据类型必须相同。
语法
MySQL UNION 操作符语法格式:
SELECT column1, column2, ...
FROM table1
WHERE condition1
UNION
SELECT column1, column2, ...
FROM table2
WHERE condition2
[ORDER BY column1, column2, ...];
参数说明:
column1
,column2
, ... 是你要选择的列的名称,如果使用*
表示选择所有列。table1
,table2
, ... 是你要从中查询数据的表的名称。condition1
,condition2
, ... 是每个SELECT
语句的过滤条件,是可选的。ORDER BY
子句是一个可选的子句,用于指定合并后的结果集的排序顺序。
UNION 操作中的列数和数据类型必须相同:
SELECT first_name, last_name FROM employees
UNION
SELECT department_name, NULL FROM departments
ORDER BY first_name;
UNION 操作符在合并结果集时会去除重复行,而 UNION ALL 不会去除重复行,因此 UNION ALL 的性能可能更好,但如果你确实希望去除重复行,可以使用 UNION。
(3)MySQL ORDER BY(排序) 语句
我们知道从 MySQL 表中使用 SELECT 语句来读取数据。
如果我们需要对读取的数据进行排序,我们就可以使用 MySQL 的 ORDER BY 子句来设定你想按哪个字段哪种方式来进行排序,再返回搜索结果。
MySQL ORDER BY(排序) 语句可以按照一个或多个列的值进行升序(ASC)或降序(DESC)排序。
语法
以下是 SELECT 语句使用 ORDER BY 子句将查询数据排序后再返回数据:
SELECT column1, column2, ...
FROM table_name
ORDER BY column1 [ASC | DESC], column2 [ASC | DESC], ...;
参数说明:
column1
,column2
, ... 是你要选择的列的名称,如果使用*
表示选择所有列。table_name
是你要从中查询数据的表的名称。ORDER BY column1 [ASC | DESC], column2 [ASC | DESC], ...
是用于指定排序顺序的子句。ASC
表示升序(默认),DESC
表示降序。
更多说明:
- 你可以使用任何字段来作为排序的条件,从而返回排序后的查询结果。
- 你可以设定多个字段来排序。
- 你可以使用 ASC 或 DESC 关键字来设置查询结果是按升序或降序排列。 默认情况下,它是按升序排列。
- 你可以添加 WHERE...LIKE 子句来设置条件。
实例
以下是一些 ORDER BY 子句的使用实例。
1. 单列排序:
SELECT * FROM products
ORDER BY product_name ASC;
以上 SQL 语句将选择产品表 products 中的所有产品,并按产品名称升序 ASC 排序。
2. 多列排序:
SELECT * FROM employees
ORDER BY department_id ASC, hire_date DESC;
以上 SQL 语句将选择员工表 employees 中的所有员工,并先按部门 ID 升序 ASC 排序,然后在相同部门中按雇佣日期降序 DESC 排序。
3. 使用数字表示列的位置:
SELECT first_name, last_name, salary
FROM employees
ORDER BY 3 DESC, 1 ASC;
以上 SQL 语句将选择员工表 employees 中的名字和工资列,并按第三列(salary)降序 DESC 排序,然后按第一列(first_name)升序 ASC 排序。
4. 使用表达式排序:
SELECT product_name, price * discount_rate AS discounted_price
FROM products
ORDER BY discounted_price DESC;
以上 SQL 语句将选择产品表 products 中的产品名称和根据折扣率计算的折扣后价格,并按折扣后价格降序 DESC 排序。
5.从 MySQL 8.0.16 版本开始,可以使用 NULLS FIRST 或 NULLS LAST 处理 NULL 值:
SELECT product_name, price
FROM products
ORDER BY price DESC NULLS LAST;
以上 SQL 语句将选择产品表 products 中的产品名称和价格,并按价格降序 DESC 排序,将 NULL 值排在最后。
相反,如果你想让 NULL 值排在前面,可以这样写:
SELECT product_name, price
FROM products
ORDER BY price DESC NULLS FIRST;
ORDER BY 子句是一个强大的工具,可以根据不同的业务需求对查询结果进行排序。在实际应用中,注意选择适当的列和排序顺序,以获得符合期望的排序效果.
到此最基本的MySQL语法就已经学习完了,但是还有特别多知识的需要补充。
最后使用一个实例,完全掌握MySQL基本语法(可以复制到workbench上面执行)
-- 创建员工表格
create table `employee`(
`emp_id` int primary key, -- 员工编号
`name` varchar(20), -- 员工姓名
`brithday` date, -- 出生日期
`sex` char(1), -- 性别
`salary` int, -- 薪水
`branch_id` int, -- 所属部门
`sup_id` int -- 上级领导
);
describe table `employee`;
select *from `employee`;
-- 创建部门表格
create table `branch`(
`branch_id` int primary key, -- 部门编号
`branch_name` varchar(10), -- 部门名字
`manager_id` int, -- 部门经理
foreign key(`manager_id`) references `employee` (`emp_id`) on delete set null -- 一个表的外键是另一个表的主键
-- on delete set null 代表‘employee’表中有一共数据被删除了,但是在‘branch’表有对应,可以直接将对应的manager_id设为null
);
select *from `branch`;
-- 创建客户表格
create table `client`(
`client_id` int primary key, -- 客户编号
`client_name` varchar(10), -- 姓名
`phone` varchar(20) -- 电话
);
select *from `client`;
-- 创建销售表格
create table `work_with`(
`emp_id` int,
`client_id` int,
`total_sales` int,
primary key(`emp_id`,`client_id`),
foreign key(`emp_id`) references `employee` (`emp_id`) on delete cascade, -- on delete cascade 代表当有一共‘emp_id’被删除了对应的也会被删除
foreign key(`client_id`) references `client` (`client_id`) on delete cascade
);
select *from `work_with`;
-- 在创建完`branch` 之后再为`employee`表添加主键和外键
alter table `employee`
add foreign key(`branch_id`)
references `branch`(`branch_id`)
on delete set null;
alter table `employee`
add foreign key(`sup_id`)
references `employee`(`emp_id`)
on delete set null;
-- 先新增部门的数据
insert into `branch` values(1,'研发部门',NULL);
insert into `branch` values(2,'行政部门',NULL);
insert into `branch` values(3,'人事部门',NULL);
-- 接着新增员工数据(此时设置的`branch_id`可以有所对应)
insert into `employee` values(01,'小蔡','2000-01-10','男',19999,1,null);
insert into `employee` values(02,'小徐','2001-02-28','男',9999,2,01);
insert into `employee` values(03,'小坤','2003-03-23','男',8999,3,02);
insert into `employee` values(04,'小王','2004-02-29','女',7999,3,03);
insert into `employee` values(05,'小李','2005-05-23','女',6999,1,04);
-- 然后设定部门的`manager_id`
update `branch`
set `manager_id` = 03
where `branch_id` = 3;
-- 新增客户的数据
insert into `client` values(201,'HHH','111222333');
insert into `client` values(202,'WWW','666688888');
insert into `client` values(203,'AAA','100000001');
insert into `client` values(204,'BBB','200000002');
insert into `client` values(205,'CCC','300000003');
-- 最后新增销售数据
insert into `work_with` values(1,201,80000);
insert into `work_with` values(2,202,70000);
insert into `work_with` values(3,203,60000);
insert into `work_with` values(4,204,50000);
insert into `work_with` values(5,205,40000);
-- 取得数据
-- 1.查询所有员工数据
select * from `employee`;
-- 2.查询客户数据
select *from `client`;
-- 3.按照薪水从低到高排序
select *from `employee` order by `salary` desc;
-- 4.取前三名薪水的员工
select *from `employee`
order by 'salary' desc
limit 3;
-- 5.查询所有员工名字
select `name` from `employee`;
-- 6.查询所有性别并去重(+distinct)
select distinct `sex` from `employee`;
-- 聚合函数使用
-- 1.查询员工总人数
select count(*) from `employee`;
select count(`sup_id`) from `employee`;
-- 2.查询员工编号小于2之后的女性员工
select count(*) from `employee`
where `emp_id` > 2 and `sex` = '女';
-- 3.查询所有员工的平均薪水
select avg(`salary`) from `employee`;
-- 4.查询所有员工薪水的总和
select sum(`salary`) from `employee`;
-- 5.查询员工最高薪水是多少
select max(`salary`) from `employee`;
-- wildcards 通配符 %代表多字元 _代表单个字元
-- 1.查询客户中电话尾号为01的(根据查询要求可以再不同位置加%)
select *from `client`
where `phone` like '%01';
-- 2.查询生日为2月份的员工
select *from `employee`
where `brithday` like '_____02%';
-- union SELECT 语句的结果组合到一个结果集合
-- 1.员工名字和客户名字(注意使用的查询的属性和数据类型必须保持一致)
select `name`from `employee`
union
select `client_name`from `client`;
-- 2. 员工编号和名字 + 客户名字和客户编号
select `name` ,`emp_id`
from `employee`
union
select `client_name`,`client_id`
from `client`;
-- 我们可以使用as改变视图中的属性名称
select `name` as `total_name` ,`emp_id` as `total_name`
from `employee`
union
select `client_name`,`client_id`
from `client`;
-- 3. 员工的薪水和销售金额
select `salary` from `employee`
union
select `total_sales` from `work_with`;
-- join 连接
-- 查询所有部门经理的名字
select `emp_id`,`name`,`branch_name`
from `employee`
join `branch`
on `employee`.`emp_id` = `branch`.`manager_id`; -- 在属性前面加上表的名字可以避免不同表中属性的名字相同造成的问题,类似与c语言中的结构体
-- left join 和 right join
-- subquery 子查询
-- 1. 找出研发部门经理的名字
select `name`
from `employee`
where `emp_id` =(
select `manager_id`
from `branch`
where `branch_name` = '研发部门'
);
-- 2.找出销售金额超过50000的员工名字
select `name`
from `employee`
where `emp_id` in(
select `emp_id`
from `work_with`
where `total_sales` > 50000
);