MySQL 高阶查询语句详解:排序、分组、子查询与视图
前言
建表语句
插入示例数据
一、按关键字排序(ORDER BY)
语法:
示例:
二、区间判断与去重查询
1. 使用 AND / OR 进行条件筛选
2. 使用 DISTINCT 去重
三、分组查询(GROUP BY)
语法:
示例:
四、限制结果条目(LIMIT)
语法:
示例:
五、设置别名(AS)
示例:
六、通配符查询(LIKE)
示例:
七、子查询
示例:
八、视图(VIEW)
创建视图:
查看视图:
多表视图:
视图与表的区别:
九、NULL 值处理
示例:
总结
前言
本文将介绍 MySQL 中常用的高阶查询语句,包括按关键字排序、分组查询、限制结果条目、设置别名、使用通配符、子查询和视图等内容,并通过示例展示其使用方法。
建表语句
sql
-- 创建学生信息表 info CREATE TABLE info (id INT,name VARCHAR(10) PRIMARY KEY NOT NULL,score DECIMAL(5,2),address VARCHAR(20),hobbid INT(5) );-- 创建辅助表 ky11 CREATE TABLE ky11 (id INT );-- 创建测试表 test01 CREATE TABLE test01 (id INT,name VARCHAR(10),age CHAR(10) );-- 创建副本表 t1(用于示例) CREATE TABLE t1 AS SELECT * FROM info WHERE 1=0;
插入示例数据
sql
-- 向 info 表插入数据 INSERT INTO info VALUES(1, 'liuyi', 80.00, 'beijing', 2); INSERT INTO info VALUES(2, 'wangwu', 90.00, 'shengzheng', 2); INSERT INTO info VALUES(3, 'lisi', 60.00, 'shanghai', 4); INSERT INTO info VALUES(4, 'tianqi', 99.00, 'hangzhou', 5); INSERT INTO info VALUES(5, 'jiaoshou', 98.00, 'laowo', 3); INSERT INTO info VALUES(6, 'hanmeimei', 10.00, 'nanjing', 3); INSERT INTO info VALUES(7, 'lilei', 11.00, 'nanjing', 5);-- 向 ky11 表插入数据 INSERT INTO ky11 VALUES(1), (2), (3);-- 向 test01 表插入数据 INSERT INTO test01 VALUES(1, 'zhangsan', '20'); INSERT INTO test01 VALUES(2, 'lisi', '30'); INSERT INTO test01 VALUES(3, 'wangwu', '29');-- 向 t1 表插入数据(复制 info 表数据) INSERT INTO t1 SELECT * FROM info;
一、按关键字排序(ORDER BY)
使用 ORDER BY
可以对查询结果进行排序,支持单字段或多字段排序。
语法:
sql
SELECT column1, column2, ... FROM table_name ORDER BY column1 [ASC|DESC], column2 [ASC|DESC], ...;
-
ASC
:升序(默认) -
DESC
:降序
示例:
sql
-- 按分数升序 SELECT name, score FROM info ORDER BY score;-- 按分数降序 SELECT name, score FROM info ORDER BY score DESC;-- 多字段排序:先按兴趣降序,再按 id 升序 SELECT id, name, hobbid FROM info ORDER BY hobbid DESC, id ASC;
二、区间判断与去重查询
1. 使用 AND
/ OR
进行条件筛选
sql
-- 分数在70到90之间 SELECT * FROM info WHERE score > 70 AND score <= 90;-- 分数大于70或小于等于90 SELECT * FROM info WHERE score > 70 OR score <= 90;
2. 使用 DISTINCT
去重
sql
SELECT DISTINCT hobbid FROM info;
三、分组查询(GROUP BY)
GROUP BY
常与聚合函数(如 COUNT
, SUM
, AVG
, MAX
, MIN
)一起使用。
语法:
sql
SELECT column_name, aggregate_function(column_name) FROM table_name WHERE condition GROUP BY column_name;
示例:
sql
-- 按兴趣分组统计人数 SELECT COUNT(name), hobbid FROM info GROUP BY hobbid;-- 分数大于80的学生按兴趣分组并排序 SELECT COUNT(name), hobbid FROM info WHERE score >= 80 GROUP BY hobbid ORDER BY COUNT(name) ASC;
四、限制结果条目(LIMIT)
LIMIT
用于限制返回的记录数。
语法:
sql
SELECT column1, column2, ... FROM table_name LIMIT [offset,] number;
示例:
sql
-- 前3条记录 SELECT * FROM info LIMIT 3;-- 从第4条开始取3条 SELECT * FROM info LIMIT 3, 3;-- 按 id 降序取最后3条 SELECT id, name FROM info ORDER BY id DESC LIMIT 3;
五、设置别名(AS)
使用 AS
可以为列或表设置别名,提高可读性。
示例:
sql
-- 列别名 SELECT name AS 姓名, score AS 成绩 FROM info;-- 表别名 SELECT i.name, i.score FROM info AS i;-- 统计表记录数 SELECT COUNT(*) AS number FROM info;
六、通配符查询(LIKE)
通配符 %
表示多个字符,_
表示一个字符。
示例:
sql
-- 名字以 c 开头 SELECT id, name FROM info WHERE name LIKE 'c%';-- 名字中包含 g SELECT id, name FROM info WHERE name LIKE '%g%';-- 名字为 tang 开头且后面跟3个字符 SELECT id, name FROM info WHERE name LIKE 'tang___';
七、子查询
子查询是嵌套在主查询中的查询语句,常用于 WHERE
或 FROM
子句中。
示例:
sql
-- 查询分数大于80的学生 SELECT name, score FROM info WHERE id IN (SELECT id FROM info WHERE score > 80);-- 多表子查询 SELECT id, name, score FROM info WHERE id IN (SELECT * FROM ky11);-- 使用 EXISTS 判断子查询是否返回结果 SELECT COUNT(*) FROM info WHERE EXISTS (SELECT id FROM info WHERE score = 80);
八、视图(VIEW)
视图是基于查询结果的虚拟表,不存储数据,仅保存查询逻辑。
创建视图:
sql
CREATE VIEW v_score AS SELECT * FROM info WHERE score >= 80;
查看视图:
sql
SELECT * FROM v_score;
多表视图:
sql
CREATE VIEW v_info AS SELECT i.id, i.name, i.score, t.age FROM info i, test01 t WHERE i.name = t.name;
视图与表的区别:
-
视图不存储数据,表存储数据
-
视图是逻辑表,表是物理表
-
视图可以简化复杂查询,提高安全性
九、NULL 值处理
NULL
表示缺失值,与空字符串 ''
不同。
示例:
sql
-- 查询 NULL 值 SELECT * FROM info WHERE addr IS NULL;-- 查询非 NULL 值 SELECT * FROM info WHERE addr IS NOT NULL;
总结
本文介绍了 MySQL 中常用的高阶查询语句,包括排序、分组、限制结果、别名、通配符、子查询和视图等功能。掌握这些语句能显著提升数据库查询的灵活性和效率。
如果有任何问题或建议,欢迎在评论区留言!