【MySQL — 数据库增删改查操作】深入解析MySQL的 Retrieve 检索操作

  


Retrieve 检索


示例 


1. 构造数据


   创建表结构   

create table exam1(id bigint, name varchar(20) comment'同学姓名', Chinesedecimal(3,1) comment '语文成绩', Math decimal(3,1) comment '数学成绩', English decimal(3,1) comment '英语成绩'
);

   插入测试数据   

 insert into exam1(id,name,Chinese,math,English) values
(1,'唐三藏',67,98,56),
(2,'孙悟空',87,78,77),
(3,'猪悟能',88,98,90),
(4,'曹孟德',82,84,67),
(5,'刘玄德',55,85,45),
(6,'孙权'  ,70,73,78),
(7,'宋公明',75,65,30);

2. Select


2.1 全列查询


select*from exam1;
+------+-----------+---------+------+---------+
| id   | name      | Chinese | Math | English |
+------+-----------+---------+------+---------+
|    1 | 唐三藏    |      67 |   98 |      56 |
|    2 | 孙悟空    |      87 |   78 |      77 |
|    3 | 猪悟能    |      88 |   98 |      90 |
|    4 | 曹孟德    |      82 |   84 |      67 |
|    5 | 刘玄德    |      55 |   85 |      45 |
|    6 | 孙权      |      70 |   73 |      78 |
|    7 | 宋公明    |      75 |   65 |      30 |
+------+-----------+---------+------+---------+

   select *是一个很危险的操作: 

  • 只要涉及到硬盘操作和网络操作,就会消耗一定的硬盘带宽和网络带宽;
  • 意味着硬盘和网卡的读写速度都是存在上限的,一旦触发大规模的 select * 意味着很可能就把 硬盘/网卡带宽给吃满了(堵车);
  • 其他的客户端尝试访问数据库,访问操作就无法正常进行了;
  • 如果针对公司的生产环境进行select*,就很可能使其他的用户访问数据库的时候,出现访问失败的情况;
  • 当前阶段,数据库中,没啥数据,select*就无所谓了;以后再工作中,尤其是"生产环境",一定要慎重!!


2.2 指定列查询

    语法    

select 列名, 列名...... from 表名;


select id , name , Chinese from exam1;  # 查询指定列select English, math, Chinese, name, id from exam1;  # 按照指定的顺序查询

mysql 是一个客户端-服务器结构的程序,如果使用 select* 会消耗大量的硬盘带宽和网络带宽,这些带宽往往是比较稀缺的资源;因此,使用指定列查询,得到的数据量就比全列查询要少很多,查询要查询的列即可,没有必要一次性查询所有列;


2.3 查询字段为表达式

   把所有学生的语文成绩加10分  

select name, Chinese + 10 from exam1;

执行 select 就会遍历每一行,取出需要的列,把列代入到表达式中; 

这样的结果,只是数据库查询过程中生成的临时表,数据库本体(数据库服务器硬盘上的数据)是没有任何改变的。


desc exam1;
+---------+--------------+------+-----+---------+-------+
| Field   | Type         | Null | Key | Default | Extra |
+---------+--------------+------+-----+---------+-------+
| id      | bigint       | YES  |     | NULL    |       |
| name    | varchar(20)  | YES  |     | NULL    |       |
| Chinese | decimal(3,1) | YES  |     | NULL    |       |
| Math    | decimal(3,1) | YES  |     | NULL    |       |
| English | decimal(3,1) | YES  |     | NULL    |       |
+---------+--------------+------+-----+---------+-------+
5 rows in set (0.01 sec)

根据上述表结构我们可以发现, 如果Chinese +20,就意味着有些成绩的结果就会超出decimal(3,1) 类型约定的范围.


   我们尝试一下查询 Chinese +20 操作,看看数据库查询超出类型范围会如何处理: 

select name, Chinese + 20 from exam1;
+-----------+------------+
| name      | Chinese+20 |
+-----------+------------+
| 唐三藏    |       87.0 |
| 孙悟空    |      107.0 |
| 猪悟能    |      108.0 |
| 曹孟德    |      102.0 |
| 刘玄德    |       75.0 |
| 孙权      |       90.0 |
| 宋公明    |       95.0 |
+-----------+------------+
7 rows in set (0.00 sec)

可以看到,虽然这个结果已经超出了 decimal(3,1) 的范围,但是依旧是可以查询,并且查询结果是正确的;所以我们需要明确:

  • decimal(3,1) 这样的表的类型,是针对硬盘上存储的数据进行制约的;
  • 但是我们当前的查询操作,得到的表中的计算结果,是临时的表数据,不会影响硬盘上的数据;,就可以不受 decimal(3,1) 这样的类型的约束;
  • 换句话说,临时表的数据会尽可能保证查询结果是完整正确的,优先级高于类型约束;

   在一个表达式中,还可以引入多个列参与运算   


-- 总成绩查询select name , Chinese + math + English from exam1;

注意:表达式查询只能针对列和列之间进行运算,行和行之间的运算,后面会介绍聚合查询 ;


2.4 为查询结果指定别名

   为总分这一列指定别名   


如果表达式简单,一眼就能看明白;但是如果表达式比较复杂,就没法直观观察了;此处就可以给表达式取别名(别名只是针对临时表的列名产生修改),此时别名就是查询结果的列名:

select 表达式 as 别名from 表名;

select name , Chinese + math + English as total from exam1;


select name , Chinese + math + English total from exam1;

2.5 结果去重查询 

    语法    

select distinct 列名 from 表名;

去重的意思,多个行的数据,如果出现相同的值,就会只保留一份 


    查询当前的数学成绩,并去除重复记录     


-- 去重查询mysql> select distinct math from exam1;

 去重查询对原来表中的数据无影响,再次查询得到的结果,依旧包含被上一次去重的数据;


3 Where 条件查询


   语法   

select 列名 from 表名 where 条件;

查询过程中,指定筛选条件,满足条件的记录就保留,不满足条件的就跳过.....  


     比较运算符    



    null 参与运算或者比较,得到的结果也是 null   

mysql> insert into exam1 values(null, null , null, null, 90.0);
Query OK, 1 row affected (0.03 sec)select* from exam1;
+------+-----------+---------+------+---------+
| id   | name      | Chinese | Math | English |
+------+-----------+---------+------+---------+
| NULL | NULL      |    NULL | NULL |    90.0 |
+------+-----------+---------+------+---------+
8 rows in set (0.00 sec)select  name, Chinese + math + English as total from exam1;
+-----------+-------+
| name      | total |
+-----------+-------+
| NULL      |  NULL |
+-----------+-------+
8 rows in set (0.01 sec)
  • null = null => null,此时的表达式的值是 null 的时候,条件就会判定为"不成立",也就相当于 false 
  • <=> 也是比较相等,能够针对 NULL 和 NULL 进行比较的.,NULL <=> NULL=> true


      逻辑运算符     



3.1 基本查询

遍历表的每个记录(每一行),把每一行的数据带入到条件中.
如果条件成立,这个记录就添加到结果集合中;如果不成立,就直接跳过. 


    查询英语不及格的同学及英语成绩    


select name , English from exam1 where English < 60;

    查询语文成绩大于英语成绩的同学    


select name ,Chinese, English from exam1 where Chinese > English;

本次查询过程和刚刚一样,也是把每一条查询到的记录带入 where 后面的条件,把符合条件的记录添加到结果集,不满足条件的记录直接跳过;


    别名无法作为 where 后面的条件    


select  name, Chinese + math + English as total from exam1 where total < 200;ERROR 1054 (42S22): Unknown column 'total' in 'where clause'

 解析:这个错误其实是因为 SQL 语句执行顺序造成的:

虽然 where 是写在 SQL 语句末尾,但是执行顺序是在定义别名之前的 ,因此在执行 where 条件时,如果条件中有别名,该别名是未被定义的;


3.2 AND和OR

    查询语文成绩大于80分英语成绩大于80分的同学    


select name , Chinese , English from exam1 where Chinese > 80 and English > 80;

    查询语文成绩大于80分英语成绩大于80分的同学     


select name , Chinese , English from exam1 where Chinese > 80 or English > 80;

    注意: 

and 和  or 同时出现会有优先级,但是如果表达式比较复杂,包含多组 and 和 or,就给需要先运算的部分加括号即可;


3.3 范围查询

    查询语文成绩在[80,90]分的同学及语文成绩    


select name, Chinese from exam1 where Chinese between 80 and 90;  

 


    查询数学成绩是58 或者59 或者 98 或者99 分的同学及数学成绩     

select name, math from exam1 where math in(58, 59, 98, 99);

    总结    

  • 如果查询的区间是连续的,就使用 between....and;
  • 如果查询的区间是离散的(某几个值),就使用 in() ; 

3.4 模糊查询

不要求完全相等,只要满足一定的条件就可以了. 


    %匹配任意个数字符     


-- 查询所有名字以孙开头的同学select* from exam1 where name like '孙%';-- 查询所有名字以孙结尾的同学select* from exam1 where name like '%孙';-- 查询所有名字有孙的同学select* from exam1 where name like '%孙%';

    _匹配一个个数字符      

select* from exam1 where name like '孙_';    -- 查询孙某select* from exam1 where name like '孙__';   -- 查询孙某某

想要查询名字中孙只在中间部分,不能在开头和结尾部分的需求,在数据库中实现有一定难度;

mysql 自带的模糊匹配功能相对比较弱;

如果后续要使用正则表达式,直接搜即可;在 sql 中,like 不能支持正则的,只能简单使用% 或者_来匹配;使用其他编程语言间接的操作 sql 即可;


3.5 NULL的查询

     查询 id 为NULL的记录      



select* from exam1 where id <=> null ;    -- 使用 <=> 判断 id 是否为 nullselect* from exam1 where id is null;      -- 使用 is  判断 id 是否为 null


4 Order by 排序


    语法:  


select 列名,列名.... from exam order by 列名 desc ;  # 降序 (从高到低)select 列名,列名.... from exam order by 列名 asc  ;  # 升序 (从低到高)-- 注意:NULL被看做比任何值都小

    注意: 

  • 数据库不会对于查询得到的结果集的顺序,做出任何承诺(不一定会根据序号,插入顺序...等等因素来决定结果集的顺序)除非 sql 中包含 order by
  • 如果不写 order,得到的结果的顺序是不可预期的.....写代码就不能依赖这样的顺序;

    按语文成绩从低到高排序(不指定顺序,默认从低到高)    


 select* from exam1 order by Chinese;
+------+-----------+---------+------+---------+
| id   | name      | Chinese | Math | English |
+------+-----------+---------+------+---------+
|    5 | 刘玄德    |    55.0 | 85.0 |    45.0 |
|    1 | 唐三藏    |    67.0 | 98.0 |    56.0 |
|    6 | 孙权      |    70.0 | 73.0 |    78.0 |
|    7 | 宋公明    |    75.0 | 65.0 |    30.0 |
|    4 | 曹孟德    |    82.0 | 84.0 |    67.0 |
|    2 | 孙悟空    |    87.0 | 78.0 |    77.0 |
|    3 | 猪悟能    |    88.0 | 98.0 |    90.0 |
+------+-----------+---------+------+---------+
7 rows in set (0.00 sec)

对语文进行排序后,每一行的数据也会以语文成绩为基准进行排序; 


   查询同学各门成绩,依次按数学降序,英语升序,语文升序的方式显示     


select name, math, English, Chinese from exam1 order by 
math desc, 
English asc, 
Chinese asc;+-----------+------+---------+---------+
| name      | math | English | Chinese |
+-----------+------+---------+---------+
| 唐三藏    | 98.0 |    56.0 |    67.0 |
| 猪悟能    | 98.0 |    90.0 |    88.0 |
| 刘玄德    | 85.0 |    45.0 |    55.0 |
| 曹孟德    | 84.0 |    67.0 |    82.0 |
| 孙悟空    | 78.0 |    77.0 |    87.0 |
| 孙权      | 73.0 |    78.0 |    70.0 |
| 宋公明    | 65.0 |    30.0 |    75.0 |
+-----------+------+---------+---------+
7 rows in set (0.00 sec)


     可以使用列的别名进行排序     


select name, Chinese + Math + English as total from exam1 order by total desc;
+-----------+-------+
| name      | total |
+-----------+-------+
| 猪悟能    | 276.0 |
| 孙悟空    | 242.0 |
| 曹孟德    | 233.0 |
| 唐三藏    | 221.0 |
| 孙权      | 221.0 |
| 刘玄德    | 185.0 |
| 宋公明    | 170.0 |
| NULL      |  NULL |
+-----------+-------+-- null 和任何数的计算结果都为 null


5 分页查询 


  • select *容易查询出太多的数据,导致机器挂掉;
  • 通过指定列查询,虽然查到的结果是变少了很多,但是如果行数足够多的话,仍然是有可能会把机器搞出问题的;
  • 此时更稳妥的做法,就是"分页查询",限制一次查询,最多能查到多少个记录;

5.1 查询第一页数据

select 列名 from 表名 limit num ;

5.2 使用LIMIT子句进行分页查询 

-- 起始下标为 0-- 从0开始,筛选 num 条结果
SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT num;-- 从 start 开始,筛选 num 条结果
SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT start, num;-- 从 start 开始,筛选 num条结果,比第二种用法更明确,建议使用
SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT num OFFSET start;

  

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

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

相关文章

Ansible自动化运维实战--通过role远程部署nginx并配置(8/8)

文章目录 1、准备工作2、创建角色结构3、编写任务4、准备配置文件&#xff08;金甲模板&#xff09;5、编写变量6、编写处理程序7、编写剧本8、执行剧本Playbook9、验证-游览器访问每台主机的nginx页面 在 Ansible 中&#xff0c;使用角色&#xff08;Role&#xff09;来远程部…

RNN实现阿尔茨海默症的诊断识别

本文为为&#x1f517;365天深度学习训练营内部文章 原作者&#xff1a;K同学啊 一 导入数据 import torch.nn as nn import torch.nn.functional as F import torchvision,torch from sklearn.preprocessing import StandardScaler from torch.utils.data import TensorDatase…

【新春特辑】2025年春节技术展望:蛇年里的科技创新与趋势预测

&#x1f525;【新春特辑】2025年春节技术展望&#xff1a;蛇年里的科技创新与趋势预测 &#x1f4c5; 发布日期&#xff1a;2025年01月29日&#xff08;大年初一&#xff09; 在这个辞旧迎新的美好时刻&#xff0c;我们迎来了充满希望的2025年&#xff0c;也是十二生肖中的蛇…

使用 Docker + Nginx + Certbot 实现自动化管理 SSL 证书

使用 Docker Nginx Certbot 实现自动化管理 SSL 证书 在互联网安全环境日益重要的今天&#xff0c;为站点或应用部署 HTTPS 已经成为一种常态。然而&#xff0c;手动申请并续期证书既繁琐又容易出错。本文将以 Nginx Certbot 为示例&#xff0c;基于 Docker 容器来搭建一个…

C++11新特性之使用using(代替typedef)定义别名

1.介绍 传统的C使用typedef重定义一个类型存在一些限制&#xff0c;例如无法直接重定义一个模版。如下所示。 template <typename Val> struct str_map {typedef std::map<std::string, Val> type; };str_map<int>::type map1; 需要添加额外的类来实现&…

编程题-最长的回文子串(中等)

题目&#xff1a; 给你一个字符串 s&#xff0c;找到 s 中最长的回文子串。 示例 1&#xff1a; 输入&#xff1a;s "babad" 输出&#xff1a;"bab" 解释&#xff1a;"aba" 同样是符合题意的答案。示例 2&#xff1a; 输入&#xff1a;s &…

maven、npm、pip、yum官方镜像修改文档

文章目录 Maven阿里云网易华为腾讯云 Npm淘宝腾讯云 pip清华源阿里中科大华科 Yum 由于各博客繁杂&#xff0c;本文旨在记录各常见镜像官网&#xff0c;及其配置文档。常用镜像及配置可评论后加入 Maven 阿里云 官方文档 setting.xml <mirror><id>aliyunmaven&l…

CNN-GRU卷积门控循环单元时间序列预测(Matlab完整源码和数据)

CNN-GRU卷积门控循环单元时间序列预测&#xff08;Matlab完整源码和数据&#xff09; 目录 CNN-GRU卷积门控循环单元时间序列预测&#xff08;Matlab完整源码和数据&#xff09;预测效果基本介绍CNN-GRU卷积门控循环单元时间序列预测一、引言1.1、研究背景与意义1.2、研究现状1…

HTML-新浪新闻-实现标题-样式1

用css进行样式控制 css引入方式&#xff1a; --行内样式&#xff1a;写在标签的style属性中&#xff08;不推荐&#xff09; --内嵌样式&#xff1a;写在style标签中&#xff08;可以写在页面任何位置&#xff0c;但通常约定写在head标签中&#xff09; --外联样式&#xf…

搜索引擎友好:设计快速收录的网站架构

本文来自&#xff1a;百万收录网 原文链接&#xff1a;https://www.baiwanshoulu.com/14.html 为了设计一个搜索引擎友好的网站架构&#xff0c;以实现快速收录&#xff0c;可以从以下几个方面入手&#xff1a; 一、清晰的目录结构与层级 合理划分内容&#xff1a;目录结构应…

CF1098F Ж-function

【题意】 给你一个字符串 s s s&#xff0c;每次询问给你 l , r l, r l,r&#xff0c;让你输出 s s s l , r sss_{l,r} sssl,r​中 ∑ i 1 r − l 1 L C P ( s s i , s s 1 ) \sum_{i1}^{r-l1}LCP(ss_i,ss_1) ∑i1r−l1​LCP(ssi​,ss1​)。 【思路】 和前一道题一样&#…

C++ 拷贝构造

拷贝构造函数会在以下几种场景中被调用: 1. 用一个对象显式初始化另一个对象。 2. 对象按值传递给函数。 3. 函数按值返回对象。 4. 将对象插入到容器中。 5. 明确调用拷贝构造函数。 1. 当用一个对象显式初始化另一个对象时 MyClass obj1("Hello"); MyClass obj2…

2024年终总结

回顾 今年过年没回老家&#xff0c;趁着有时间&#xff0c;总结一下24年吧。 我把23年看做是打基础的一年&#xff0c;而24年主要是忙于项目的一年&#xff0c;基本上大部分时间都是忙着交付软件&#xff0c;写的一些文章也大部分都是项目中遇到的问题和解决方案&#xff0c;虽…

《哈佛家训》

《哈佛家训》是一本以教育为主题的书籍&#xff0c;旨在通过一系列富有哲理的故事和案例&#xff0c;传递积极的人生观、价值观和教育理念。虽然它并非直接由哈佛大学官方出版&#xff0c;但其内容深受读者喜爱&#xff0c;尤其是在家庭教育和个人成长领域。 以下是《哈佛家训…

[c语言日寄]越界访问:意外的死循环

【作者主页】siy2333 【专栏介绍】⌈c语言日寄⌋&#xff1a;这是一个专注于C语言刷题的专栏&#xff0c;精选题目&#xff0c;搭配详细题解、拓展算法。从基础语法到复杂算法&#xff0c;题目涉及的知识点全面覆盖&#xff0c;助力你系统提升。无论你是初学者&#xff0c;还是…

使用 KNN 搜索和 CLIP 嵌入构建多模态图像检索系统

作者&#xff1a;来自 Elastic James Gallagher 了解如何使用 Roboflow Inference 和 Elasticsearch 构建强大的语义图像搜索引擎。 在本指南中&#xff0c;我们将介绍如何使用 Elasticsearch 中的 KNN 聚类和使用计算机视觉推理服务器 Roboflow Inference 计算的 CLIP 嵌入构建…

深入理解三高架构:高可用性、高性能、高扩展性的最佳实践

引言 在现代互联网环境下&#xff0c;随着用户规模和业务需求的快速增长&#xff0c;系统架构的设计变得尤为重要。为了确保系统能够在高负载和复杂场景下稳定运行&#xff0c;"三高架构"&#xff08;高可用性、高性能、高扩展性&#xff09;成为技术架构设计中的核…

Nginx 开发总结

文章目录 1. Nginx 基础概念1-1、什么是 Nginx1-2、Nginx 的工作原理1-3、Nginx 的核心特点1-4、Nginx 的常见应用场景1-5、Nginx 与 Apache 的区别1-6、 Nginx 配置的基本结构1-7、Nginx 常见指令 2. Nginx 配置基础2-1、Nginx 配置文件结构2-2、全局配置 (Global Block)2-3、…

Git 出现 Please use your personal access token instead of the password 解决方法

目录 前言1. 问题所示2. 原理分析3. 解决方法前言 1. 问题所示 执行Git提交代码的时候,出现如下所示: lixiaosong@IT07 MINGW64 /f/java_project/JavaDemo (master) $ git push -u origin --all libpng warning: iCCP: known incorrect sRGB profile libpng warning

maven的打包插件如何使用

默认的情况下&#xff0c;当直接执行maven项目的编译命令时&#xff0c;对于结果来说是不打第三方包的&#xff0c;只有一个单独的代码jar&#xff0c;想要打一个包含其他资源的完整包就需要用到maven编译插件&#xff0c;使用时分以下几种情况 第一种&#xff1a;当只是想单纯…