SQL命令二:SQL 高级查询与特殊算法

引言

        在掌握了 SQL 的基础操作和建表约束后,我们可以进一步探索 SQL 的高级查询功能和一些特殊算法。这些高级技巧能够帮助我们更高效地处理和分析数据,满足复杂的业务需求。

一、查询进阶

(一)简单查询

简单查询通过 select 语句实现,语法为 select 字段 from 表名 [别名]。例如,在 employees 表中:

  • 查询所有员工信息select * from employees;
  • 查询员工姓名和薪资select ename, sal from employees;
  • 使用别名查询select ename 姓名, sal 薪资 from employees;
  • 去重查询岗位select distinct job from employees;

(二)限定查询

限定查询通过 where 子句实现条件筛选,支持多种比较运算符。例如:

  • 查询薪资高于 2000 的员工信息select * from employees where sal > 2000;
  • 查询薪资介于 1500 到 5000 的员工信息
select * from employees where sal between 1500 and 5000;
-- 等价于
select * from employees where sal >= 1500 and sal <= 5000;
  • 模糊查询
    • 查询名称中包含 S 的员工信息:select * from employees where ename like "%S%";
    • 查询名称中第二个字母是 S 的员工信息:select * from employees where ename like "_S%";
  • 查询入职日期在 1981 年的员工信息
select * from employees where hiredate like '%1981%';
-- 更精确的查询
select * from employees where hiredate between '1981-01-01' and '1981-12-31';
  • 查询员工编号在 7499、7521、7900 的员工信息
select * from employees where empno = 7499 or empno = 7521 or empno = 7900;
-- 等价于
select * from employees where empno in (7499, 7521, 7900);

(三)排序查询

排序查询使用 order by 关键字,asc 表示升序,desc 表示降序。例如:

  • 按入职日期降序排列select * from employees order by hiredate desc;
  • 按薪资升序排列select * from employees order by sal asc;
  • 多字段排序select * from employees order by deptno, sal desc; 先按部门编号排序,部门相同的再按薪资降序排列。

(四)多表查询

  1. 笛卡尔积查询select * from emp, dept; 这种查询方式简单地将两张表堆积在一起,会带来数据冗余问题,称为笛卡尔积效应。
  2. 消除笛卡尔积:通过追加关联条件,如 select * from emp, dept where emp.deptno = dept.deptno;
  3. 连接查询
    • 左(外)连接left(outer)join...on,返回左表的所有行以及右表中匹配的行。例如,查询所有员工及其领导信息:
select e1.empno 员工编号, e1.ename 员工姓名, e1.sal 员工薪资, e2.empno 领导编号, e2.ename 领导姓名, e2.sal 领导薪资
from emp e1 left join emp e2 on e1.mgr = e2.empno;
  • 右(外)连接right(outer)join...on,返回右表的所有行以及左表中匹配的行。例如,查询所有员工及部门信息:
select e.empno 员工编号, e.ename 员工姓名, e.sal 薪资, d.deptno 部门编号, d.dname 部门名称
from emp e right join dept d on e.deptno = d.deptno;
  1. SQL1999 语法
    • 交叉连接join 会出现笛卡尔积,如 select * from emp join dept;
    • 自然连接natural join 自动提取相同字段,并放在最前面,如 select * from emp natural join dept;
    • join...on:指定连接条件,如 select * from emp join dept on emp.deptno = dept.deptno;
    • join...using:指定连接字段,会把字段放到最前面,如 select * from emp join dept using(deptno);

(五)分组查询

分组查询基于 group by 关键字,适用于需要对数据进行分组统计的场景。例如:

  • 查询各部门人数select deptno, count(empno) 人数 from emp group by deptno;
  • 统计各部门平均工资select deptno, avg(sal) 平均工资 from emp group by deptno;
    分组后如需筛选,使用 having 子句。例如,查询平均薪资高于 2000 的部门信息:
select deptno, avg(sal) 平均工资 from emp group by deptno having avg(sal) > 2000;

(六)子查询

1、where 子查询:当查询的结果为单行单列或多行单列时使用。例如:

  • 查询比 smith 工资高的人:select * from emp where sal > (select sal from emp where ename = 'smith');
  • 查询与销售岗位薪资相同的员工信息:
select * from emp where sal in (select sal from emp where job = 'salesman');
select * from emp where sal = any (select sal from emp where job = 'salesman');

2、from 子查询:当查询到的结果为多行多列时使用。例如,查询部门编号、部门名称、部门位置、部门人数和平均薪资的信息:

select d.deptno, d.dname, d.loc, count(e.empno) 人数, avg(e.sal) 平均薪资
from dept d left join emp e on d.deptno = e.deptno
group by e.deptno;

也可以使用子查询实现相同的功能。

(七)分页查询

        分页查询使用 limit 关键字,语法为 limit start, countstart 表示数据下标索引,count 表示每页条数。当 start 为 0 时可省略。例如,查询前十条员工信息:

select * from emp limit 0, 10;
-- 等价于
select * from emp limit 10;

二、特殊算法与约束

(一)雪花算法

雪花算法(Snowflake Algorithm)是一种分布式唯一 ID 生成算法,最早由 Twitter 开发,用于解决高并发环境下生成全局唯一 ID 的问题。

  1. ID 结构:生成的是一个 64 位的整数 ID,结构如下:
    | 1 位符号位 | 41 位时间戳 | 10 位机器信息 | 12 位序列号 |
    详细分解:
    • 符号位:永远为 0,表示正整数。
    • 时间戳:当前时间与起始时间戳的差值,单位为毫秒,能使用约 69 年。
    • 机器 ID(工作机器 + 数据中心):标识不同节点,一般为 5 位数据中心 ID + 5 位机器 ID。
    • 序列号:每毫秒内的序号,支持每台机器每毫秒生成 4096 个 ID。
  2. 优点
    • 高性能:本地生成,无需数据库访问,生成一个 ID 只需几微秒。
    • 全局唯一:由时间戳 + 机器号 + 序列号共同决定,天然不会重复。
    • 趋势递增:基于时间戳生成,保证 ID 大致按生成时间递增,方便排序。
    • 适合分布式系统:支持多节点并行生成不冲突的 ID。
  3. 缺点
    • 依赖机器时钟:如果系统时间回拨,可能会导致 ID 重复。
    • 位数固定:64 位中各部分长度写死,扩展性有限。
    • 不适合生成短 ID 或可读性强的 ID:生成的 ID 是类似 879278326123438080 的长整型数字。

(二)检查约束(CK)

在 MySQL 8.0.16 以下版本中,虽然可以设置检查约束,但实际并不生效。例如:

CREATE TABLE employees (id INT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(100),age INT,CONSTRAINT age_check CHECK(age >= 18 AND age <= 65)
);

建议在程序中处理业务逻辑,数据库专注于数据存储。

三、多对多关系与权限管理

        在数据库设计中,多对多关系常见于权限管理等场景。例如,用户与角色、角色与菜单之间存在多对多关系。可以通过中间表来实现这种关系,如用户表、用户角色表、角色表、角色菜单表和菜单表。

  • 动态权限:通过中间表动态关联用户、角色和菜单,实现灵活的权限分配。
  • 静态权限:预先定义好的权限设置,相对固定。

总结

        本文介绍了 SQL 的高级查询功能,包括简单查询、限定查询、排序查询、多表查询、分组查询、子查询和分页查询等。同时,探讨了雪花算法等特殊算法以及检查约束。掌握这些高级技巧和特殊算法,能够让我们在处理复杂的数据场景时更加得心应手,为数据分析和管理提供强大的支持。

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

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

相关文章

HTML04:图像标签

图像标签 常见的图像标签 JPGGIFPNGBMP <img src"路径" alt"名称" title"悬停名称" width"高" height"宽"/><!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8&quo…

Docker —— 技术架构的演进

Docker —— 技术架构的演进 技术架构演进总结单机架构优点缺点总结 应用数据分离架构优点缺点总结 应用服务集群架构1. Nginx2. HAProxy3. LVS&#xff08;Linux Virtual Server&#xff09;4. F5 BIG-IP对比总结选型建议 读写分离/主从分离架构1. MyCat简介 2. TDDL&#xff…

[machine learning] Transformer - Attention (一)

Attention是Transformer的核心&#xff0c;本系列先通过介绍Attention来学习Transformer。本文先介绍简单版的Attention。 在Attention出现之前&#xff0c;通常使用recurrent neural networds (RNNs)来处理长序列数据。模型架构上&#xff0c;又通常使用encoder-decoder的结构…

Android 输入控件事件使用示例

一 前端 <EditTextandroid:id="@+id/editTextText2"android:layout_width="match_parent"android:layout_height="wrap_content"android:ems="10"android:inputType="text"android:text="Name" />二 后台代…

【向量数据库】用披萨点餐解释向量数据库:一个美味的技术类比

文章目录 前言场景设定&#xff1a;披萨特征向量化顾客到来&#xff1a;生成查询向量相似度计算实战1. 欧氏距离计算&#xff08;值越小越相似&#xff09;2. 余弦相似度计算&#xff08;值越大越相似&#xff09; 关键发现&#xff1a;度量选择影响结果现实启示结语 前言 想象…

人工智能和机器学习在包装仿真中的应用与价值

引言 随着包装成为消费品关键的差异化因素&#xff0c;对智能设计、可持续性和高性能的要求比以往任何时候都更高 。为了满足这些复杂的期望&#xff0c;公司越来越多地采用先进的仿真方法&#xff0c;而现在人工智能 (AI) 和机器学习 (ML) 又极大地增强了这些方法 。本文探讨…

【人工智能】深入探索Python中的自然语言理解:实现实体识别系统

《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 自然语言理解(NLU)是人工智能(AI)领域中的重要研究方向之一,其目标是让计算机理解和处理人类语言。在NLU的众多应用中,实体识别(Nam…

个人健康中枢的多元化AI硬件革新与精准健康路径探析

在医疗信息化领域,个人健康中枢正经历着一场由硬件技术革新驱动的深刻变革。随着可穿戴设备、传感器技术和人工智能算法的快速发展,新一代健康监测硬件能够采集前所未有的多维度生物数据,并通过智能分析提供精准的健康建议。本文将深入探讨构成个人健康中枢的最新硬件技术,…

深入了解Linux系统—— 进程切换和调度

前言&#xff1a; 了解了进程的状态和进程的优先级&#xff0c;我们现在来看进程是如何被CPU调度执行的。 在单CPU的系统在&#xff0c;程序是并发执行的&#xff1b;也就是说在一段时间呢&#xff0c;进程是轮番执行的&#xff1b; 这也是说一个进程在运行时不会一直占用CPU直…

阿里云服务迁移实战: 06-切换DNS

概述 按前面的步骤&#xff0c;所有服务迁移完毕之后&#xff0c;最后就剩下 DNS 解析修改了。 修改解析 在域名解析处&#xff0c;修改域名的解析地址即可。 如果 IP 已经过户到了新账号&#xff0c;则不需要修改解析。 何确保业务稳定 域名解析更换时&#xff0c;由于 D…

uni-app 中封装全局音频播放器

在开发移动应用时&#xff0c;音频播放功能是一个常见的需求。无论是背景音乐、音效还是语音消息&#xff0c;音频播放都需要一个稳定且易于管理的解决方案。在 uni-app 中&#xff0c;虽然原生提供了 uni.createInnerAudioContext 方法用于音频播放&#xff0c;但直接使用它可…

golang常用库之-标准库text/template

文章目录 golang常用库之-标准库text/template背景什么是text/templatetext/template库的使用 golang常用库之-标准库text/template 背景 在许多编程场景中&#xff0c;我们经常需要把数据按照某种格式进行输出&#xff0c;比如生成HTML页面&#xff0c;或者生成配置文件。这…

Linux btop 使用教程

简介 btop 是一个基于终端的现代系统资源监控器&#xff0c;具有美观的图形界面、响应快、功能丰富等特点。它支持查看 CPU、内存、磁盘、网络、进程&#xff0c;并可以方便地筛选和管理进程。 功能总览 启动命令&#xff1a; btop界面分为以下几部分&#xff1a; CPU 区域…

Vue3调度器错误解析,完美解决Unhandled error during execution of scheduler flush.

目录 Vue3调度器错误解析&#xff0c;完美解决Unhandled error during execution of scheduler flush. 一、问题现象与本质 二、七大高频错误场景与解决方案 1、Setup初始化陷阱 2、模板中的"幽灵属性" 3、异步操作的"定时炸弹" 4、组件嵌套黑洞 5…

使用DeepSeek定制Python小游戏——以“俄罗斯方块”为例

前言 本来想再发几个小游戏后在整理一下流程的&#xff0c;但是今天试了一下这个俄罗斯方块的游戏结果发现本来修改的好好的的&#xff0c;结果后面越改越乱&#xff0c;前面的版本也没保存&#xff0c;根据AI修改他是在几个版本改来改去&#xff0c;想着要求还是不能这么高。…

Kotlin带接收者的Lambda介绍和应用(封装DialogFragment)

先来看一个具体应用&#xff1a;假设我们有一个App&#xff0c;App中有一个退出应用的按钮&#xff0c;点击该按钮后并不是立即退出&#xff0c;而是先弹出一个对话框&#xff0c;询问用户是否确定要退出&#xff0c;用户点了确定再退出&#xff0c;点取消则不退出&#xff0c;…

ES6/ES11知识点 续一

模板字符串 在 ECMAScript&#xff08;ES&#xff09;中&#xff0c;模板字符串&#xff08;Template Literals&#xff09;是一种非常强大的字符串表示方式&#xff0c;它为我们提供了比传统字符串更灵活的功能&#xff0c;尤其是在处理动态内容时。模板字符串通过反引号&…

【C++】智能指针RALL实现shared_ptr

个人主页 &#xff1a; zxctscl 专栏 【C】、 【C语言】、 【Linux】、 【数据结构】、 【算法】 如有转载请先通知 文章目录 1. 为什么需要智能指针&#xff1f;2. 内存泄漏2.1 什么是内存泄漏&#xff0c;内存泄漏的危害2.2 内存泄漏分类&#xff08;了解&#xff09;2.3 如何…

ROS2 开发踩坑记录(持续更新...)

1. 从find_package(xxx REQUIRED)说起&#xff0c;如何引用其他package(包&#xff09; 查看包的安装位置和include路径详细文件列表 例如&#xff0c;xxx包名为pluginlib # 查看 pluginlib 的安装位置 dpkg -L ros-${ROS_DISTRO}-pluginlib | grep include 这条指令的目的是…

系统思考:困惑源于内心假设

不要怀疑&#xff0c;你的困惑来自你的假设。 你是否曾经陷入过无解的困境&#xff0c;觉得外部环境太复杂&#xff0c;自己的处境无法突破&#xff1f;很多时候&#xff0c;答案并不在于外部的局势&#xff0c;而是来自我们内心深处的假设——那些我们理所当然、从未质疑过的…