当前位置: 首页 > news >正文

SQL 核心操作全解析:从基础查询到关联关系实战

目录

条件查询:精准筛选数据

比较运算符

逻辑运算符

成员运算符

范围运算符

模糊查询

空查询

分页:控制数据显示数量

基本用法

分页公式

排序:调整数据展示顺序

升序

降序

分组:聚合数据统计分析

去重:消除重复数据

聚合函数:数据统计利器

关联查询:多表数据联合查询

嵌套查询

笛卡尔连接

内连接

外连接

全连接

关联关系:表之间的业务关联

自关联

一对一

一对多

多对多


**

在数据库操作中,SQL(Structured Query Language)是必不可少的工具。掌握 SQL 的核心操作,能够让我们高效地从数据库中获取、处理和分析数据。本文将详细解析 SQL 中的条件查询、分页、排序、分组、去重、聚合函数以及关联查询和关联关系等核心知识点,帮助大家夯实 SQL 基础。

条件查询:精准筛选数据

条件查询是 SQL 中最常用的操作之一,通过WHERE子句可以对数据进行筛选,只返回满足条件的记录。WHERE子句可以结合多种运算符使用,以实现不同的筛选需求。

比较运算符

比较运算符用于比较两个值的大小关系,常用的比较运算符有等于(=)、不等于(<> 或!=)、大于(>)、小于(<)、大于等于(>=)、小于等于(<=)等。其中,不等于可以用<>来表示,例如查询年龄不等于 18 岁的用户信息:

 

SELECT * FROM user WHERE age <> 18;

逻辑运算符

逻辑运算符用于连接多个条件,常用的逻辑运算符有AND(与)、OR(或)、NOT(非)。AND表示所有条件都满足时才返回记录;OR表示只要有一个条件满足就返回记录;NOT表示对条件取反。例如查询年龄大于 18 岁且性别为男的用户信息:

 

SELECT * FROM user WHERE age > 18 AND gender = '男';

成员运算符

成员运算符IN用于判断某个值是否在指定的集合中。例如查询用户 ID 为 1、3、5 的用户信息:

 

SELECT * FROM user WHERE id IN (1, 3, 5);

范围运算符

范围运算符BETWEEN AND用于判断某个值是否在指定的范围内,包括范围的起始值和结束值。例如查询年龄在 18 到 25 岁之间的用户信息:

 

SELECT * FROM user WHERE age BETWEEN 18 AND 25;

模糊查询

模糊查询用于查找符合某种模式的记录,通过LIKE关键字实现,常用的通配符有%和_。%可以匹配任意多个字符(包括 0 个),_只能匹配一个字符。例如查询姓名以 “张” 开头的用户信息:

 

SELECT * FROM user WHERE name LIKE '张%';

查询姓名第二个字是 “明” 的用户信息:

 

SELECT * FROM user WHERE name LIKE '_明%';

空查询

空查询用于判断字段的值是否为空,IS NULL表示字段值为空,IS NOT NULL表示字段值不为空。需要注意的是,不能用=或<>来判断空值,必须使用IS NULL或IS NOT NULL。例如查询邮箱为空的用户信息:

 

SELECT * FROM user WHERE email IS NULL;

查询邮箱不为空的用户信息:

 

SELECT * FROM user WHERE email IS NOT NULL;

分页:控制数据显示数量

当数据库中的数据量较大时,一次性显示所有数据会影响性能和用户体验,此时可以使用分页查询来控制每次显示的数据数量。在 SQL 中,通过LIMIT关键字实现分页功能。

基本用法

LIMIT n表示返回前 n 条记录,例如查询前 10 条用户信息:

 

SELECT * FROM user LIMIT 10;

LIMIT start, count表示从第 start 条记录开始(起始位置从 0 开始),返回 count 条记录。例如从第 10 条记录开始,返回 10 条用户信息:

 

SELECT * FROM user LIMIT 10, 10;

分页公式

在实际应用中,通常需要根据页码来进行分页。假设每一页显示 n 条记录,要查询第 m 页的数据,那么分页公式为LIMIT (m-1)*n, n。例如每一页显示 10 条记录,查询第 3 页的数据:

 

SELECT * FROM user LIMIT (3-1)*10, 10;

排序:调整数据展示顺序

排序操作可以将查询结果按照指定的字段进行升序或降序排列,通过ORDER BY关键字实现。

升序

ASC表示升序,是ORDER BY的默认排序方式,即按照字段值从小到大排列。例如按照年龄升序查询用户信息:

 

SELECT * FROM user ORDER BY age ASC;

也可以省略ASC,直接写成:

 

SELECT * FROM user ORDER BY age;

降序

DESC表示降序,即按照字段值从大到小排列。例如按照年龄降序查询用户信息:

 

SELECT * FROM user ORDER BY age DESC;

还可以按照多个字段进行排序,例如先按照年龄降序,再按照姓名升序:

 

SELECT * FROM user ORDER BY age DESC, name ASC;

分组:聚合数据统计分析

分组操作可以将数据按照指定的字段进行分组,然后对每个分组进行聚合计算,通过GROUP BY关键字实现。HAVING子句可以对分组后的结果进行筛选,类似于WHERE子句,但HAVING子句可以使用聚合函数。

例如查询每个性别的用户数量:

 

SELECT gender, COUNT(*) FROM user GROUP BY gender;

查询用户数量大于 10 的性别:

 

SELECT gender, COUNT(*) FROM user GROUP BY gender HAVING COUNT(*) > 10;

去重:消除重复数据

当查询结果中存在重复的记录时,可以使用DISTINCT关键字来消除重复数据,只保留唯一的记录。DISTINCT作用于查询结果中的所有字段,只有所有字段的值都相同才会被视为重复记录。例如查询所有不重复的用户所在城市:

 

SELECT DISTINCT city FROM user;

聚合函数:数据统计利器

聚合函数用于对数据进行统计分析,常用的聚合函数有COUNT()、SUM()、AVG()、MAX()、MIN()。

  • COUNT():统计记录的行数,可以统计指定字段非空值的数量,也可以统计所有记录的数量(使用COUNT(*))。例如统计用户表中的总人数:
 

SELECT COUNT(*) FROM user;

  • SUM():对指定的数值型字段进行求和。例如计算所有用户的年龄总和:
 

SELECT SUM(age) FROM user;

  • AVG():计算指定数值型字段的平均值。例如计算用户的平均年龄:
 

SELECT AVG(age) FROM user;

  • MAX():获取指定字段的最大值。例如查询用户中的最大年龄:
 

SELECT MAX(age) FROM user;

  • MIN():获取指定字段的最小值。例如查询用户中的最小年龄:
 

SELECT MIN(age) FROM user;

关联查询:多表数据联合查询

在实际的数据库应用中,数据通常存储在多个表中,关联查询可以将多个表中的数据联合起来进行查询。常用的关联查询方式有嵌套查询、笛卡尔连接、内连接、外连接和全连接。

嵌套查询

嵌套查询是指将一个查询的结果作为另一个查询的条件,也称为子查询。例如查询年龄大于平均年龄的用户信息:

 

SELECT * FROM user WHERE age > (SELECT AVG(age) FROM user);

笛卡尔连接

笛卡尔连接是指将两个表中的所有记录进行组合,产生的结果集的行数是两个表行数的乘积。笛卡尔连接通常需要结合WHERE子句来筛选有意义的数据,否则结果集可能会非常大。例如查询用户表和订单表的笛卡尔连接,并筛选出用户 ID 对应的订单:

 

SELECT * FROM user, order WHERE user.id = order.user_id;

内连接

内连接(INNER JOIN)只返回两个表中满足连接条件的记录。内连接是最常用的关联查询方式,语法如下:

 

SELECT 字段列表 FROM 表1 INNER JOIN 表2 ON 连接条件;

例如查询用户信息及其对应的订单信息:

 

SELECT user.*, order.order_no FROM user INNER JOIN order ON user.id = order.user_id;

外连接

外连接不仅返回满足连接条件的记录,还会返回其中一个表中不满足连接条件的记录。外连接分为左外连接和右外连接。

  • 左外连接(LEFT OUTER JOIN或LEFT JOIN):返回左表中所有的记录,以及右表中满足连接条件的记录。如果右表中没有对应的记录,则右表的字段值为NULL。例如查询所有用户的信息及其对应的订单信息,没有订单的用户也会显示:
 

SELECT user.*, order.order_no FROM user LEFT JOIN order ON user.id = order.user_id;

  • 右外连接(RIGHT OUTER JOIN或RIGHT JOIN):返回右表中所有的记录,以及左表中满足连接条件的记录。如果左表中没有对应的记录,则左表的字段值为NULL。例如查询所有订单信息及其对应的用户信息,没有用户的订单也会显示:
 

SELECT user.*, order.order_no FROM user RIGHT JOIN order ON user.id = order.user_id;

全连接

全连接(FULL OUTER JOIN或FULL JOIN)返回两个表中所有的记录,无论是否满足连接条件。如果其中一个表中没有对应的记录,则对应的字段值为NULL。需要注意的是,并不是所有的数据库都支持全连接,例如 MySQL 就不支持全连接,但可以通过左外连接和右外连接的并集来实现全连接的效果。

关联关系:表之间的业务关联

在数据库设计中,表与表之间存在着不同的关联关系,常见的关联关系有自关联、一对一、一对多和多对多。

自关联

自关联是指一个表与自己发生关联,通常用于表示表中记录之间的层次关系或父子关系。例如在部门表中,每个部门可能有一个上级部门,上级部门也属于该表中的记录,此时可以通过自关联来查询部门的层级关系。

一对一

一对一关系是指两个表中的记录一一对应,即一个表中的一条记录只能与另一个表中的一条记录相关联。在实际应用中,一对一关系的表可以合并为一个表,但为了提高查询效率或根据业务需求,也可以拆分为两个表,将不常用的字段放在另一个表中。一对一关系的外键可以定义在任意一方。例如用户账号基础信息表和用户详细信息表就是一对一关系,一个用户只能有一条详细信息记录,一条详细信息记录也只属于一个用户。

一对多

一对多关系是指一个表中的一条记录可以与另一个表中的多条记录相关联,而另一个表中的一条记录只能与第一个表中的一条记录相关联。一对多关系的外键定义在多方。例如一个用户可以有多个收货地址,而一个收货地址只能属于一个用户,用户表和收货地址表就是一对多关系,外键定义在收货地址表中,关联到用户表的主键。

多对多

多对多关系是指一个表中的一条记录可以与另一个表中的多条记录相关联,反之亦然。多对多关系需要通过第三张表来存储两个主表的主键,第三张表也称为中间表或关联表。例如用户表和商品表就是多对多关系,一个用户可以收藏多个商品,一个商品也可以被多个用户收藏,此时可以通过收藏表来存储用户和商品的关联关系,收藏表中包含用户 ID 和商品 ID 两个外键,分别关联到用户表和商品表的主键。另外,用户表和道具表也可以通过背包表来建立多对多关系。

掌握 SQL 的核心操作和表之间的关联关系,对于进行高效的数据查询、分析和数据库设计都具有重要意义。在实际应用中,需要根据具体的业务需求选择合适的 SQL 操作和关联关系,以提高数据处理的效率和准确性。

http://www.lryc.cn/news/619923.html

相关文章:

  • 18. parseInt 的参数有几个
  • 多语言文本 AI 情感分析 API 数据接口
  • Python解包技巧全解析
  • Docker部署RAGFlow:生产环境开启Kibana与ES安全集成指南
  • Celery在Django中的应用
  • 【web站点安全开发】任务3:网页开发的骨架HTML与美容术CSS
  • Pytest+selenium UI自动化测试实战实例(超详细)
  • 第十三节:后期处理:效果增强
  • OpenBMC适配器模式小白学习指南
  • 服务器安全检测和防御技术
  • LeetCode算法日记 - Day 10: x 的平方根、搜索插入位置
  • 大模型微调【1】之入门
  • 农业物联网:现代农业的智慧革命
  • 后端(服务端)的跳转方式-请求转发和重定向
  • 集成电路学习:什么是CV计算机视觉
  • Nginx学习笔记(七)——Nginx负载均衡
  • 深度学习之CNN网络简介
  • 深度学习(4):数据加载器
  • go语言学习笔记
  • 初识神经网络05——构建神经网络3
  • C# 反射入门:如何获取 Type 对象?
  • 深度学习流体力学:基于PyTorch的物理信息神经网络(PINN)完整实现
  • Spring Boot项目通过Feign调用三方接口的详细教程
  • 力扣top100(day02-04)--二叉树 01
  • 阿里云Anolis OS 8.6的公有云仓库源配置步骤
  • 旧版MinIO的安装(windows)、Spring Boot 后端集成 MinIO 实现文件存储(超详细,带图文)
  • oss(阿里云)前端直传
  • 4G模块 ML307A通过MQTT协议连接到阿里云
  • ImportError: Encountered error: Failed to import NATTEN‘s CPP backend.
  • 事件处理与组件基础