MySQL高阶查询语句与视图实战指南

文章目录

  • MySQL高阶查询语句与视图实战指南
    • 一、常用高阶查询技巧
      • 1. 按关键字排序(ORDER BY)
        • 基础用法
        • 进阶用法:多字段排序+条件过滤
      • 2. 区间判断与去重(AND/OR + DISTINCT)
        • 区间判断:AND/OR
        • 去重查询:DISTINCT
      • 3. 结果分组(GROUP BY + 聚合函数)
        • 基础分组
        • 进阶分组:条件筛选+排序
      • 4. 限制结果条数(LIMIT)
        • 常用场景
      • 5. 简化查询:设置别名(AS)
        • 字段别名
        • 表别名
        • 特殊用法:用别名创建表
      • 6. 模糊查询(通配符 + LIKE)
        • 常用案例
      • 7. 嵌套查询(子查询)
        • 基础用法:IN关键字
        • 进阶用法:子查询在INSERT/UPDATE/DELETE中
        • 特殊用法:EXISTS关键字
      • 8. NULL值处理
        • 常用操作
    • 二、视图:简化查询+数据安全
      • 1. 什么是视图?
      • 2. 视图的作用
      • 3. 视图与表的区别和联系
      • 4. 视图实战案例
        • 案例1:单表创建视图
        • 案例2:多表创建视图
        • 案例3:通过视图修改原表
      • 5. 视图的注意事项
    • 三、总结

在日常的数据库操作中,基础的增删改查(CRUD)往往无法满足复杂的业务需求。比如需要对查询结果排序、筛选特定区间数据、简化多表查询,或者控制数据访问权限等。今天这篇文章,就带大家深入学习MySQL的高阶查询语句和视图的应用,结合实际案例,让你轻松应对复杂场景。

一、常用高阶查询技巧

首先,我们先搭建一个测试环境,创建一张info表并插入学生数据,后续案例都会基于这张表展开:

-- 创建info表
create table info (id int,name varchar(10) primary key not null,score decimal(5,2),address varchar(20),hobbid int(5)
);-- 插入测试数据
insert into info values
(1,'liuyi',80,'beijing',2),
(2,'wangwu',90,'shengzheng',2),
(3,'lisi',60,'shanghai',4),
(4,'tianqi',99,'hangzhou',5),
(5,'jiaoshou',98,'laowo',3),
(6,'hanmeimei',10,'nanjing',3),
(7,'lilei',11,'nanjing',5);

1. 按关键字排序(ORDER BY)

类比Windows任务管理器的排序功能,ORDER BY可以对查询结果按单个或多个字段排序,默认升序(ASC),降序需显式指定(DESC)。

基础用法
  • 按分数升序排列(默认ASC,可省略):
select id,name,score from info order by score;
  • 按分数降序排列:
select id,name,score from info order by score desc;
进阶用法:多字段排序+条件过滤

当第一个排序字段值相同时,会按第二个字段排序;还可结合WHERE筛选数据。比如筛选地址为“杭州”的学生,按分数降序排列:

select name,score from info where address='hangzhou' order by score desc;

再比如,先按兴趣ID(hobbid)降序,相同兴趣的学生按ID升序排列:

select id,name,hobbid from info order by hobbid desc, id;

2. 区间判断与去重(AND/OR + DISTINCT)

区间判断:AND/OR
  • 筛选分数大于70且小于等于90的学生:
select * from info where score >70 and score <=90;
  • 筛选分数大于70或小于等于90的学生(注意:逻辑或会包含大部分数据,需谨慎使用):
select * from info where score >70 or score <=90;
  • 多条件嵌套:筛选分数大于70,或分数在75-90之间的学生:
select * from info where score >70 or (score >75 and score <90);
去重查询:DISTINCT

当某个字段存在重复值时,用DISTINCT只保留唯一值。比如查询所有不重复的兴趣ID:

select distinct hobbid from info;

3. 结果分组(GROUP BY + 聚合函数)

GROUP BY通常与聚合函数搭配使用,常用聚合函数有:

  • COUNT():计数
  • SUM():求和
  • AVG():求平均
  • MAX()/MIN():求最大/最小值
基础分组

hobbid分组,统计每个兴趣的学生人数:

select count(name) as student_count, hobbid from info group by hobbid;
进阶分组:条件筛选+排序

筛选分数大于等于80的学生,按hobbid分组,再按学生人数升序排列:

select count(name) as student_count, hobbid from info where score>=80 group by hobbid order by student_count asc;

4. 限制结果条数(LIMIT)

LIMIT是高频使用的语句,用于只返回部分结果,语法为:

SELECT 字段 FROM 表名 LIMIT [偏移量,] 条数;
  • 偏移量可选,默认从第0行开始(即第一条数据);
  • 条数:要返回的记录数。
常用场景
  • 显示前3条数据:
select * from info limit 3;
  • 从第4行开始(偏移量为3),显示3条数据:
select * from info limit 3,3;
  • 按ID降序,显示最后3条数据(常用于获取最新数据):
select id,name from info order by id desc limit 3;

5. 简化查询:设置别名(AS)

当表名或字段名较长时,用AS设置别名(AS可省略),增强SQL可读性。

字段别名

name改为“姓名”,score改为“成绩”:

select name as 姓名, score as 成绩 from info;
表别名

查询时给表设置别名,简化多表查询(后续视图会用到):

select i.name as 姓名, i.score as 成绩 from info as i;
特殊用法:用别名创建表

info表的查询结果作为新表t1的结构和数据(注意:原表的主键约束可能无法完全复制):

create table t1 as select * from info;

6. 模糊查询(通配符 + LIKE)

通配符用于匹配部分字符,常与LIKE搭配,常用通配符:

  • %:匹配0个、1个或多个字符;
  • _:匹配单个字符。
常用案例
  • 查询名字以“c”开头的学生:
select id,name from info where name like 'c%';
  • 查询名字中包含“g”的学生:
select id,name from info where name like '%g%';
  • 查询名字格式为“c_ic_i”的学生(比如“caicai”):
select id,name from info where name like 'c_ic_i';

7. 嵌套查询(子查询)

子查询(内查询)是嵌套在主查询中的SQL语句,先执行子查询,结果作为主查询的条件。

基础用法:IN关键字

查询分数大于80的学生姓名和成绩(子查询先获取符合条件的ID,主查询根据ID筛选数据):

select name,score from info where id in (select id from info where score>80);
进阶用法:子查询在INSERT/UPDATE/DELETE中
  • 插入数据:将info表中ID在ky11表中的记录插入t1
insert into t1 select * from info where id in (select * from ky11);
  • 更新数据:将ky11表中ID=2对应的学生分数改为50:
update info set score=50 where id in (select * from ky11 where id=2);
  • 删除数据:删除分数大于80的学生:
delete from info where id in (select id from info where score>80);
特殊用法:EXISTS关键字

EXISTS判断子查询结果是否为空,不为空则返回TRUE,否则FALSE。比如判断是否存在分数等于80的学生,若存在则统计info表总记录数:

select count(*) from info where exists(select id from info where score=80);

8. NULL值处理

NULL表示“缺失值”,与0、空字符串('')不同:

  • 空字符串长度为0,不占空间;
  • NULL长度未知,占用空间;
  • COUNT()会忽略NULL,但包含空字符串。
常用操作
  • 查询addr字段为NULL的记录:
select * from info where addr is NULL;
  • 查询addr字段不为NULL的记录:
select * from info where addr is not null;

二、视图:简化查询+数据安全

1. 什么是视图?

视图是数据库中的虚拟表,不存储真实数据,只保存对真实表的查询逻辑(类似“镜子”,动态映射真实数据)。

2. 视图的作用

  • 简化查询:将复杂的多表查询封装为视图,后续直接查询视图即可;
  • 数据安全:给不同用户提供不同视图,隐藏敏感字段(比如不给普通用户看学生的身份证号);
  • 灵活适配:同一批真实数据,可根据需求生成多个视图。

3. 视图与表的区别和联系

维度视图(View)表(Table)
数据存储不存储真实数据,只存查询逻辑存储真实物理数据
编译状态已编译的SQL语句未编译,动态执行
空间占用不占物理空间占用物理空间
安全性可隐藏表结构,权限更精细直接暴露表结构
修改影响修改视图可能影响原表修改表直接影响数据

联系:视图基于表存在,一个视图可对应一个或多个表;视图的结构和数据来自表。

4. 视图实战案例

案例1:单表创建视图

创建一个视图,只显示分数大于等于80的学生(后续原表数据更新,视图会同步变化):

-- 创建视图
create view v_score as select * from info where score>=80;-- 查询视图
select * from v_score;
案例2:多表创建视图

先创建test01表存储学生年龄:

create table test01 (id int,name varchar(10),age char(10));
insert into test01 values(1,'zhangsan',20),(2,'lisi',30),(3,'wangwu',29);

创建视图,关联infotest01,显示学生ID、姓名、分数和年龄:

create view v_info(id,name,score,age) as 
select info.id,info.name,info.score,test01.age 
from info,test01 
where info.name=test01.name;-- 查询视图
select * from v_info;
案例3:通过视图修改原表

视图不仅能查,还能修改原表数据(前提是视图字段对应原表字段,无函数计算)。比如修改v_score视图中“tianqi”的分数为120:

update v_score set score='120' where name='tianqi';-- 验证原表数据
select * from info where name='tianqi';

5. 视图的注意事项

  • 不建议用视图做增删改:复杂视图(如多表关联、含聚合函数)无法增删改,容易报错;
  • 视图不保存数据:查询视图时,本质是执行底层SQL,性能取决于原表索引;
  • 删除视图不影响原表:drop view v_score;只会删除视图,不会删除原表数据。

三、总结

本文介绍的MySQL高阶功能,覆盖了日常开发中90%以上的复杂查询场景:

  1. 排序与筛选ORDER BY + WHERE实现精准排序;
  2. 分组统计GROUP BY + 聚合函数搞定数据汇总;
  3. 简化操作LIMIT限制结果、AS设置别名、DISTINCT去重;
  4. 复杂查询:子查询解决嵌套逻辑,视图封装多表关联;
  5. 细节处理NULL值判断、通配符模糊查询。

这些技巧需要结合实际业务多练,比如用视图封装报表查询、用子查询筛选复杂条件,慢慢就能熟练掌握。如果有疑问,欢迎在评论区交流!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/97872.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/97872.shtml
英文地址,请注明出处:http://en.pswp.cn/web/97872.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解决Pytest参数化测试中文显示乱码问题:两种高效方法

在使用Pytest进行参数化测试时&#xff0c;许多开发者都会遇到一个常见但令人头疼的问题&#xff1a;当测试用例的ids参数包含中文字符时&#xff0c;控制台输出会出现乱码。这不仅影响了测试报告的可读性&#xff0c;也给测试结果的分析带来了困难。本文将深入探讨这个问题&am…

基于SpringBoot的校园流浪动物救助平台【spring boot实战项目、Java毕设、Java项目、Java实战】

&#x1f496;&#x1f496;作者&#xff1a;计算机毕业设计小途 &#x1f499;&#x1f499;个人简介&#xff1a;曾长期从事计算机专业培训教学&#xff0c;本人也热爱上课教学&#xff0c;语言擅长Java、微信小程序、Python、Golang、安卓Android等&#xff0c;开发项目包括…

利用kimi k2编写postgresql协议服务端的尝试

美团龙猫还是很有自知之明的 提问请用C编写postgresql协议服务端&#xff0c;能接收psql客户端或其他采用postgresql协议的工具的请求&#xff0c;实现将用户请求打印在控制台&#xff0c;并把回应发给客户端回答 抱歉&#xff0c;我无法为您编写完整的 PostgreSQL 协议服务端。…

医疗 AI 再突破:辅助诊断准确率超 90%,但落地医院仍面临数据安全与临床信任难题

一、引言&#xff08;一&#xff09;医疗 AI 发展背景在数字化与智能化浪潮的席卷下&#xff0c;医疗领域正经历着深刻变革&#xff0c;人工智能&#xff08;AI&#xff09;技术的融入成为这场变革的关键驱动力。近年来&#xff0c;医疗 AI 辅助诊断技术取得重大突破&#xff0…

Rocky Linux10.0安装zabbix7.4详细步骤

安装Rocky Linux10.0系统 请参考Rocky Linux10.0安装教程-CSDN博客 查看当前系统版本 cat /etc/*release 安装数据库 安装zabbix之前&#xff0c;需要先安装一个数据库来承载zabbix的数据。这里我选择在本机直接安装一个MariaDB数据库。 Rocky Linux10.0系统默认不包含MySQ…

JDBC插入数据

文章目录视频&#xff1a;JDBC插入数据环境准备写插入数据属性配置属性配置视频&#xff1a;JDBC插入数据 环境准备 MySQL环境 小皮面板 提供MySQL环境 写插入数据 属性配置 声明变量 属性配置 # . properties 是一个特俗的map 集合 # key : 字符串 value : 字符串…

GPU 服务器压力测试核心工具全解析:gpu-burn、cpu-burn 与 CUDA Samples

在 GPU 服务器的性能验证、稳定性排查与运维管理中,压力测试是关键环节,可有效检测硬件极限性能、散热效率及潜在故障。以下从工具原理、核心功能、使用场景等维度,详细介绍三款核心测试工具,帮助用户系统掌握 GPU 服务器压力测试方法。 一、GPU 专属压力测试工具:gpu-bu…

Python进程和线程——多线程

前面提到过进程是由很多线程组成的&#xff0c;那么今天廖老师就详细解释了线程是如何运行的。首先&#xff0c;&#xff0c;Python的标准库提供了两个模块&#xff1a;_thread和threading&#xff0c;_thread是低级模块&#xff0c;threading是高级模块&#xff0c;对_thread进…

【MySQL|第九篇】视图、函数与优化

目录 十、视图 1、简单视图&#xff1a; 2、复杂视图&#xff1a; 3、视图更新&#xff1a; 十一、函数 1、函数创建&#xff1a; 十二、数据库优化 1、索引优化&#xff1a; 2、查询优化&#xff1a; 3、设计优化&#xff1a; 十、视图 在 MySQL 中&#xff0c;视图…

使用Docker和虚拟IP在一台服务器上灵活部署多个Neo4j实例

使用Docker和虚拟IP在一台服务器上灵活部署多个Neo4j实例 前言 在现代应用开发中&#xff0c;图数据库Neo4j因其强大的关系处理能力而备受青睐。但有时候我们需要在同一台服务器上运行多个Neo4j实例&#xff0c;比如用于开发测试、多租户环境或者A/B测试。传统的端口映射方式…

K8s学习笔记(一):Kubernetes架构-原理-组件

Kubernetes&#xff08;简称 K8s&#xff09;是一款开源的容器编排平台&#xff0c;核心目标是实现容器化应用的自动化部署、扩展、故障恢复和运维管理。其设计遵循 “主从架构”&#xff08;Control Plane Node&#xff09;&#xff0c;组件分工明确&#xff0c;通过 “声明式…

ensp配置学习笔记 比赛版 vlan 静态路由 ospf bgp dhcp

学习配置VLAN 虚拟局域网&#xff0c;目的让两台在同一网段的设备&#xff0c;在交换机中访问。基础指令&#xff1a;sys 进入系统 sysname R1 修改交换机名字为R1 display cur 查看数据、端口等交换机信息 &#xff08;在端口中&#xff0c;可以直接display this 可以直接看…

仓颉编程语言青少年基础教程:enum(枚举)类型和Option类型

仓颉编程语言青少年基础教程&#xff1a;enum&#xff08;枚举&#xff09;类型和Option类型enum 和 Option 各自解决一类“语义级”问题&#xff1a;enum 让“取值只在有限集合内”的约束从注释变成编译器强制&#xff1b;Option 让“值可能不存在”的语义显式化。enum类型enu…

javaEE-Spring IOCDI

目录 1、什么是Spring&#xff1a; 2.什么是IoC: 3. 什么是控制反转呢? 4.IoC容器具备以下优点: 5.DI是什么&#xff1a; 依赖注⼊方法&#xff1a; 三种注入方法的优缺点&#xff1a; Autowired注解注入存在的问题&#xff1a; Autowired和Resource的区别&#xff…

TensorFlow Lite 全面解析:端侧部署方案与PyTorch Mobile深度对比

1 TensorFlow Lite 基础介绍 TensorFlow Lite (TFLite) 是 Google 为移动设备&#xff08;Android, iOS&#xff09;、微控制器&#xff08;Microcontrollers&#xff09;和其他嵌入式设备&#xff08;如 Raspberry Pi&#xff09;开发的轻量级深度学习推理框架。它的核心目标是…

mapbox进阶,使用jsts实现平角缓冲区

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:mapbox 从入门到精通 文章目录 一、🍀前言 1.1 ☘️mapboxgl.Map 地图对象 1.2 ☘️mapboxgl.Map style属性 1.3 ☘️jsts myBufferOp 缓冲区生成对对象 …

linux装好显卡后如何检查

背景&#xff1a;客户通知装好了显卡&#xff0c;我们去机器上查看一下一. 使用到的命令 watch -n 1 nvidia-smi 可实时查看gpu的使用率nvidia-smi 之查看一次 二、查看内存和显存 内存使用命令 free -h,显存使用 nvidia-smi 这只是查看的navidia, 其他品牌的会不一样

人工智能深度学习——卷积神经网络(CNN)

一、图像卷积运算 对图像矩阵与滤波器矩阵进行对应相乘再求和运算&#xff0c;转化得到新的矩阵。 作用&#xff1a;快速定位图像中某些边缘特征 英文&#xff1a;convolution&#xff08;CNN&#xff09;池化层实现维度缩减 池化&#xff1a;按照一个固定规则对图像矩阵进行处…

SaaS 建站从 0 到 1 教程:Vue 动态域名 + 后端子域名管理 + Nginx 配置

SaaS 建站从 0 到 1 教程&#xff1a;Vue 动态域名 后端子域名管理 Nginx 配置 一、什么是 SaaS 建站&#xff1f; SaaS&#xff08;Software as a Service&#xff09;建站&#xff0c;就是通过一套统一的系统&#xff0c;支持用户在线注册、绑定域名、快速生成专属网站。…

关于神经网络中回归的概念

神经网络中的回归详解 引言 神经网络&#xff08;NeuralNetworks&#xff09;是一种强大的机器学习模型&#xff0c;可用于分类和回归任务。本文聚焦于神经网络中的回归&#xff08;Regression&#xff09;&#xff0c;即预测连续输出值&#xff08;如房价、温度&#xff09;。…