MySQL(26)如何使用ORDER BY进行排序?

105 阅读4分钟

使用 ORDER BY 子句可以对查询结果进行排序。ORDER BY 子句可以按照一个或多个列进行排序,并且可以指定升序(ASC)或降序(DESC)。默认情况下,排序是升序的。

基本语法

SELECT column1, column2, ...
FROM table_name
ORDER BY column1 [ASC|DESC], column2 [ASC|DESC], ...;

示例数据库和表结构

假设我们有一个公司数据库,其中有两个表:employeesdepartments

-- 创建数据库
CREATE DATABASE company;

-- 选择数据库
USE company;

-- 创建表 departments
CREATE TABLE departments (
    dept_id INT AUTO_INCREMENT PRIMARY KEY,
    dept_name VARCHAR(100) NOT NULL
);

-- 创建表 employees
CREATE TABLE employees (
    emp_id INT AUTO_INCREMENT PRIMARY KEY,
    emp_name VARCHAR(100) NOT NULL,
    emp_position VARCHAR(100),
    emp_salary DECIMAL(10, 2),
    hire_date DATE,
    dept_id INT,
    FOREIGN KEY (dept_id) REFERENCES departments(dept_id)
);

-- 插入示例数据到 departments 表
INSERT INTO departments (dept_name)
VALUES 
('HR'),
('Engineering'),
('Marketing');

-- 插入示例数据到 employees 表
INSERT INTO employees (emp_name, emp_position, emp_salary, hire_date, dept_id)
VALUES 
('John Doe', 'Manager', 75000.00, '2023-10-01', 1),
('Jane Smith', 'Developer', 60000.00, '2023-09-01', 2),
('Alice Johnson', 'Analyst', 50000.00, '2023-08-01', 1),
('Bob Brown', 'Developer', 70000.00, '2023-07-01', 2),
('Charlie Brown', 'Tester', 55000.00, '2023-11-01', 3);

使用 ORDER BY 的示例

1. 按照员工名字升序排序

SELECT * FROM employees
ORDER BY emp_name ASC;

结果:

emp_id | emp_name      | emp_position | emp_salary | hire_date  | dept_id
-------|---------------|--------------|------------|------------|--------
3      | Alice Johnson | Analyst      | 50000.00   | 2023-08-01 | 1
4      | Bob Brown     | Developer    | 70000.00   | 2023-07-01 | 2
5      | Charlie Brown | Tester       | 55000.00   | 2023-11-01 | 3
1      | John Doe      | Manager      | 75000.00   | 2023-10-01 | 1
2      | Jane Smith    | Developer    | 60000.00   | 2023-09-01 | 2

2. 按照员工名字降序排序

SELECT * FROM employees
ORDER BY emp_name DESC;

结果:

emp_id | emp_name      | emp_position | emp_salary | hire_date  | dept_id
-------|---------------|--------------|------------|------------|--------
2      | Jane Smith    | Developer    | 60000.00   | 2023-09-01 | 2
1      | John Doe      | Manager      | 75000.00   | 2023-10-01 | 1
5      | Charlie Brown | Tester       | 55000.00   | 2023-11-01 | 3
4      | Bob Brown     | Developer    | 70000.00   | 2023-07-01 | 2
3      | Alice Johnson | Analyst      | 50000.00   | 2023-08-01 | 1

3. 按照薪水升序排序

SELECT * FROM employees
ORDER BY emp_salary ASC;

结果:

emp_id | emp_name      | emp_position | emp_salary | hire_date  | dept_id
-------|---------------|--------------|------------|------------|--------
3      | Alice Johnson | Analyst      | 50000.00   | 2023-08-01 | 1
5      | Charlie Brown | Tester       | 55000.00   | 2023-11-01 | 3
2      | Jane Smith    | Developer    | 60000.00   | 2023-09-01 | 2
4      | Bob Brown     | Developer    | 70000.00   | 2023-07-01 | 2
1      | John Doe      | Manager      | 75000.00   | 2023-10-01 | 1

4. 按照入职日期降序排序

SELECT * FROM employees
ORDER BY hire_date DESC;

结果:

emp_id | emp_name      | emp_position | emp_salary | hire_date  | dept_id
-------|---------------|--------------|------------|------------|--------
5      | Charlie Brown | Tester       | 55000.00   | 2023-11-01 | 3
1      | John Doe      | Manager      | 75000.00   | 2023-10-01 | 1
2      | Jane Smith    | Developer    | 60000.00   | 2023-09-01 | 2
3      | Alice Johnson | Analyst      | 50000.00   | 2023-08-01 | 1
4      | Bob Brown     | Developer    | 70000.00   | 2023-07-01 | 2

多列排序

5. 先按部门 ID 升序排序,再按薪水降序排序

SELECT * FROM employees
ORDER BY dept_id ASC, emp_salary DESC;

结果:

emp_id | emp_name      | emp_position | emp_salary | hire_date  | dept_id
-------|---------------|--------------|------------|------------|--------
1      | John Doe      | Manager      | 75000.00   | 2023-10-01 | 1
3      | Alice Johnson | Analyst      | 50000.00   | 2023-08-01 | 1
4      | Bob Brown     | Developer    | 70000.00   | 2023-07-01 | 2
2      | Jane Smith    | Developer    | 60000.00   | 2023-09-01 | 2
5      | Charlie Brown | Tester       | 55000.00   | 2023-11-01 | 3

6. 先按职位升序排序,再按入职日期升序排序

SELECT * FROM employees
ORDER BY emp_position ASC, hire_date ASC;

结果:

emp_id | emp_name      | emp_position | emp_salary | hire_date  | dept_id
-------|---------------|--------------|------------|------------|--------
3      | Alice Johnson | Analyst      | 50000.00   | 2023-08-01 | 1
2      | Jane Smith    | Developer    | 60000.00   | 2023-09-01 | 2
4      | Bob Brown     | Developer    | 70000.00   | 2023-07-01 | 2
1      | John Doe      | Manager      | 75000.00   | 2023-10-01 | 1
5      | Charlie Brown | Tester       | 55000.00   | 2023-11-01 | 3

小结

通过使用 ORDER BY 子句,您可以对查询结果进行灵活的排序。使用 ASCDESC 关键字可以指定升序或降序排序,默认是升序。您可以按照一个或多个列进行排序,并且可以结合多个排序条件来实现复杂的排序逻辑。上述示例展示了不同情况下如何使用 ORDER BY 子句进行排序,这在数据查询和报告中非常有用。