sql-sorting-results
SQL - 排序查询结果
Section titled “SQL - 排序查询结果”当你查询数据库时,除非你明确要求排序,否则行不保证以任何特定顺序排列。ORDER BY 子句是 SQL 标准中用于按一个或多个列对查询结果集进行排序的方式。正确的排序对于创建用户友好的应用程序至关重要,从按价格显示产品到按日期列出评论都是如此。
SELECT column_listFROM table_name[WHERE condition]ORDER BY column1 [ASC | DESC], column2 [ASC | DESC], ...;让我们使用一个 CUSTOMERS 表来作为我们的示例:
CREATE TABLE CUSTOMERS( ID INT PRIMARY KEY, NAME VARCHAR(20) NOT NULL, AGE INT NOT NULL, CITY VARCHAR(25), SALARY DECIMAL(18, 2));
INSERT INTO CUSTOMERS(ID, NAME, AGE, CITY, SALARY) VALUES(1, 'Ramesh', 32, 'Ahmedabad', 2000.00),(2, 'Khilan', 25, 'Delhi', 1500.00),(3, 'Kaushik', 23, 'Kota', 2000.00),(4, 'Chaitali', 25, 'Mumbai', 6500.00),(5, 'Hardik', 27, 'Bhopal', 8500.00),(6, 'Komal', 22, 'Hyderabad', 4500.00),(7, 'Muffy', 24, 'Indore', NULL); -- 注意此处 SALARY 为 NULL基本排序:ASC 和 DESC
Section titled “基本排序:ASC 和 DESC”你可以按两个方向对数据进行排序:
ASC(升序): 从最低到最高排序(A-Z,0-9)。如果你不指定方向,这是默认行为。DESC(降序): 从最高到最低排序(Z-A,9-0)。
示例:升序(默认)
Section titled “示例:升序(默认)”此查询按客户姓名按字母顺序排序。
SELECT NAME, CITY, AGE FROM CUSTOMERS ORDER BY NAME ASC;-- 这等同于: SELECT NAME, CITY, AGE FROM CUSTOMERS ORDER BY NAME;此查询按年龄从大到小对客户进行排序。
SELECT NAME, AGE FROM CUSTOMERS ORDER BY AGE DESC;排序中 NULL 值的处理
Section titled “排序中 NULL 值的处理”一个常见的问题是:当排序时,NULL 值会放在哪里?SQL 标准并没有严格定义默认行为,因此不同的数据库表现不同。例如,PostgreSQL 将 NULL 值视为比任何其他值都大,而 Oracle 将它们视为更小。
为了明确控制这一点,在大多数现代数据库中,你可以使用 NULLS FIRST 或 NULLS LAST 语法。
-- 按薪资排序,但确保薪资未知(NULL)的客户排在最后。SELECT NAME, SALARY FROM CUSTOMERS ORDER BY SALARY ASC NULLS LAST;你可以向 ORDER BY 子句提供逗号分隔的列列表。结果集将首先按第一列排序,然后对于第一列中值相同的行,它们将按第二列排序,依此类推。
示例:先按年龄排序,再按姓名排序
Section titled “示例:先按年龄排序,再按姓名排序”让我们按年龄降序排序客户。如果两个客户年龄相同,则按姓名按字母顺序排序。
SELECT NAME, AGE FROM CUSTOMERS ORDER BY AGE DESC, NAME ASC;在输出中,‘Chaitali’(25 岁)会出现在 ‘Khilan’(25 岁)之前,因为 ‘C’ 在 ‘K’ 之前。
高级排序技术
Section titled “高级排序技术”使用 CASE 进行自定义逻辑排序
Section titled “使用 CASE 进行自定义逻辑排序”有时你需要按非标准、自定义的顺序进行排序。CASE 语句非常适合这种情况。例如,你希望首先显示来自“Mumbai”和“Delhi”的客户,然后列出其余的客户。
SELECT NAME, CITY FROM CUSTOMERSORDER BY CASE WHEN CITY = 'Mumbai' THEN 1 WHEN CITY = 'Delhi' THEN 2 ELSE 3 END ASC, NAME ASC;按计算表达式排序
Section titled “按计算表达式排序”你也可以按表达式或函数的结果进行排序。例如,如果你想按客户姓名的长度进行排序:
-- 注意:LENGTH() 函数名称可能有所不同(例如,SQL Server 中的 LEN())。SELECT NAME, LENGTH(NAME) AS NameLength FROM CUSTOMERS ORDER BY NameLength DESC;性能考量:索引的作用
Section titled “性能考量:索引的作用”对大型结果集进行排序对于数据库来说可能是一个缓慢且占用内存的操作。如果你经常按特定列或列集进行排序,为它们创建数据库索引可以显著提高性能。索引是一种特殊的数据结构,它允许数据库更快地查找和排序行,通常可以完全避免对数据进行排序。
例如,如果你的应用程序有一个页面总是显示按 SALARY DESC 排序的客户,那么在 SALARY 列上创建索引是一个关键的优化。
CREATE INDEX idx_customers_salary ON CUSTOMERS (SALARY);