MySQL基础(三)

目录

一. 插入内容insert

1.1 默认插入

1.2 指定某些列插入数据

1.3 一次插入多行 

1.4 insert 插入时间 

二. 查询数据select(比较复杂)

2.1 全列查询 

2.2 指定列查询 

2.3 查询字段为表达式 

2.4 别名 as

2.5 去重查询 distinct

2.6 排序查询 order by

2.7 条件查询 where

2.8 分页查询 limit


一. 插入内容insert

tips:

(一)SQL中 表示 字符串,可以用 ' 也可以用

  • C/C++、Java中,' 表示字符," 表示字符串
  • SQL/Python/JS,没有字符类型,只有字符串,' 和 " 都可以用。

(二)在控制台中,通过向上方向键可以切换输入的命令 

(三):如果要输入汉字,需确保创建数据库的时候,指定了字符集是 utf8 / gbk 等能支持中文的字符集,否则 中文数据会出现报错。

(四)查看表的内容:select * from 表名;

1.1 默认插入

insert into 表名(值, 值, 值......);列的个数和类型要和表的结构匹配

要点一:输入的数据类型必须要与参数列表一致


 要点二:隐式转换问题

 

    SQL中的类型系统,和Java差异很大。上述插入的数据,虽然 values  后面第一列写的是 字符串类型,SQL 会尝试自动转成int,‘100’ --> 100; 第二列写的是整数类型,会尝试自动转成int,200-->'200' 。
    上述这样的转换,就是 “隐式类型转换”,对于Java来说是非常排斥的。比较支持隐式类型转换的称为 “弱类型系统”,不太支持隐式类型转换的称为 “强类型系统”。(注意,此处并不绝对,Java是“强类型系统”,但也存在 自动装箱、自动拆箱的隐式操作,而 C / SQL 隐式类型转换触发的情况会多一些)

    强类型和弱类型,一般认为强类型要更好,检查比较严格,问题可以提前发现解决;弱类型属于之前的探索尝试。

    C++属于 强类型 还是 弱类型 存在争议,C++兼容C的隐式转换类型,但在现代的语法标准中,有对于类型强度有了一定的加强了。


除此之外,还有两个相关类型:

  • 动态类型:程序运行过程中,变量的类型是可以改变的(Python , JS , Ruby , PHP....)。优势:非常灵活,表达能力更强;缺点:程序在运行之前,难以做很丰富的检查,很多问题要执行到对应的代码才能发现。
  • 静态类型:程序运行过程中,变量的类型不能改变(C/C++ , Java....)

    动态/静态 具体哪个好,要结合实际情况。有的场景认为动态类型好(比如 初创公司想尽快开发出产品原型,非常适合动态类型),有的场景认为静态类型更好(比如 产品具有一定规模,代码和业务也越来越复杂,非常适合静态类型)


(失败的原因是 SQL 把 lisi 尝试转换成 int 失败了。)

1.2 指定某些列插入数据

insert into 表名(列名, 列名, .....) values (值, 值, .....); 值的个数、类型、顺序等 要和 ( ) 中的列名相匹配。

(NULL 在 SQL 中,表示“空”,这个单元格啥都没写) 

 (列名可以交换顺序,但是要对应) 


1.3 一次插入多行 

insert into 表名 values (值, 值, ....), (值, 值, ...), (值, 值, ...); :每个括号对应一行

 
(也可以指定列,一次插入多行) 


 插入 3 条记录: 
(1)一次插入一行

(2)一次插入 3 行

   MySQL 是一个 “客户端 - 服务器” 结构的程序,数据库通常运行在服务器上,服务器提供必要的硬件资源(如CPU、内存、硬盘)来存储数据库文件,并通过数据库管理系统来管理这些数据。 客户端-服务器交互过程中,交互次数越多,整体开销就越大,花的时间就越长。一个sql包含数据的多少,不是主要矛盾,除非数据差异太大了,可能有明显影响;如果只是差了几条,区别是不大的。

1.4 insert 插入时间 

 

    有的时候,插入的时间日期,希望就是 “当前时刻”,SQL 作为一个 编程语言,也支持一些库函数。

now() --> 获取当前的日期时间

二. 查询数据select(比较复杂)

  • 所有 select 操作都只是 针对查询结果,得到“临时表”,做出计算 / 调整 ,不会影响到硬盘上的原始数据。
2.1 全列查询 

select * from 表名; :查询出这个表中的所有的行和所有的列( *  称为 “通配符”,可以指代所有的列。)

select * 是一个很危险的操作

  • 如果表比较小,select * 都无所谓
  • 一旦表非常的大,千万 / 亿 级别的数据量,此时,进行 select 就会产生大量的 硬盘IO 和 网络IO

   再次强调,MySQL 是一个 “客户端 - 服务器” 结构的程序,数据库通常运行在服务器上,服务器提供必要的硬件资源(如CPU、内存、硬盘)来存储数据库文件,并通过数据库管理系统来管理这些数据。硬盘 和 网卡,读写速度都是存在上限的一旦触发 大规模的 select * ,意味着很可能就把你的 硬盘/网卡 带宽 吃满了(堵车),其他的客户端尝试访问数据库,访问操作就无法正常进行了。(如果针对 公司生产环境 进行select * 操作,就很有可能使其他的用户访问数据库的时候出现访问失败的情况) 

     硬盘本身,存储空间是越来越便宜了,但是硬盘的带宽(访问速度),并没有特别的质变,尤其是 机械硬盘,速度很多年都没有提升了。网络带宽 往往是比较稀缺的资源,比硬盘带宽还贵(计算机中最贵的资源)


拓展常识——网络带宽: 

    网络带宽是指在单位时间内网络能够传输的数据量。它通常用来衡量网络连接的最大传输能力,以比特每秒(bps)为单位来表示。带宽的概念可以类比于高速公路的车道数,车道越多,通行能力越强。在网络中,带宽越大,理论上能够传输的数据量也就越多。

    带宽与网速是两个相关但不同的概念。带宽是网络的最大传输能力,而网速是实际的数据传输速率,这个速率会受到网络拥堵、硬件性能等因素的影响。例如,一个100Mbps的带宽意味着理论上每秒可以传输100兆比特的数据,但实际网速可能会因为网络高峰时段的拥堵而降低。

上行带宽:

  • 指的是从个人或企业的网络设备(如计算机、手机等)发送数据到互联网或其他网络的能力。
  • 它决定了你可以多快地将数据上传到服务器与其他网络用户共享信息
  • 在家庭网络(“共享带宽”)中,上行带宽通常比下行带宽要小,因为用户通常下载的数据比上传的数据多。

下行带宽:

  • 指的是从互联网或其他网络接收数据到个人或企业的网络设备的能力。
  • 它决定了你可以多快地从互联网下载文件、观看视频或浏览网页
  • 在大多数宽带服务中,下行带宽通常比上行带宽要大,以适应用户大量下载内容的需求。

    如果你有一个提供100Mbps(兆比特每秒)下行带宽和10Mbps上行带宽的互联网连接,那么理论上,你可以在最理想的情况下每秒下载100兆比特的数据,而上传的速度则为每秒10兆比特。

2.2 指定列查询 

select 列名, 列名.... from 表名; :查询的时候手动指定列表,得到的结果就是和列名关联的。

    实际开发中,一个表有十几列,甚至几十列都是很有可能的。比如 当前只需要关注两列,一共有20列,使用指定列查询,得到的数据量就比全列查询要少很多。

2.3 查询字段为表达式 

select 表达式 from 表名;: 基于列名,进行 加减乘除 运算(不会修改服务器 硬盘 上的数据,只是把返回的结果进行了计算)

    如果+20,意味着有些成绩的结果就会超出约定的类型范围 decimal(3,1),为什么不会报错呢?—— 表的类型,是针对硬盘上存储的数据 进行的制约,但是 当前是查询操作,此处计算的结果,是“临时表”的数据,不会影响到 硬盘上的数据。


在一个表达式中,还可以引入多个列参与运算:
(逐行遍历表中的数据,针对每一行,把这三个列进行相加即可。)

表达式查询,只能针对 列和列 之间进行计算,行和行 之间的运算,后面会介绍到 “聚合查询”。 

2.4 别名 as

select 表达式 as 别名 from 表名;: 在表达式查询中,如果表达式简单,一眼就能看懂;如果表达式比较复杂,就需要通过给表达式取别名,方便观察。

(虽然 as 可以省略,但是不建议省略,以防看错 )

2.5 去重查询 distinct

select distinct 列名 from 表名; 去重的意思,多个行的数据如果出现相同的值,就只会保留一份。如果只选中一列,直接触发去重;如果是多列,必须指定的每一列都要重复,才能触发去重。


(这里的去重都是针对 “临时表”,硬盘上的数据没有任何影响)

2.6 排序查询 order by

select * from 表名 order by 列名; (默认为升序):针对查询结果进行排序( 排序 也是针对临时表进行排序,不会对硬盘上的数据造成影响。)查询的时候,指定按照某个列进行排序,也可以指定 升序 还是 降序。

注意:

  • 数据库 不会对于查询得到的结果集的顺序 做出任何承诺,除非 SQL 中包含 order by(如果不写 order by,得到的结果的顺序,是不可预期的.... 写代码就不能依赖这样的顺序)


(进行排序的时候,select 后面写啥,对于最终排序结果都没有影响)

降序排序,在 order by 列名 后面写上 desc 关键字。(此处的 desc 不是 describe 的缩写,而是 descent(降序)的缩写。)


(如果数学成绩相同,排序顺序都是不可预期的 )

显示的升序排序,在 order by 列名 后面写上 asc 关键字(可省略)。

order by 可以指定多个列来排序,多个列之间,使用 , 进行分割:先按照第一列来排序,如果第一列相同,再按照第二列排序.....(如果第一列均不相同,那后面的列都用不上)

2.7 条件查询 where

select * / 列名 / 表达式 / 去重 from 表名 where 条件;查询过程中,指定筛选条件,满足条件的记录就保留,不满足条件的就跳过。

 举例:

 

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

 比较运算符:

运算符说明
>, >=, <, <=大于,大于等于,小于,小于等于
=等于,NULL 不安全,例如 NULL=NULL 的结果是 NULL,相当于FALSE(0)
<=>等于, NULL 安全,例如 NULL <=> NULL 的结果是 TRUE(1)
!=, <>

不等于

between a0 and a1范围匹配,[a0,a1],如果 a0<= value <=a1,返回 TRUE(1)
IN (option, ......)如果是option 中的任意一个,返回 TRUE(1)
IS NULL

是 NULL

IS NOT NULL不是NULL
LIKE模糊匹配。%表示任意多个(包括0个)任意字符;_表示任意一个字符

(一)SQL 中,null 是一个特殊值,null 参与运算(加减乘除...)得到的结果还是 null。

(二)空值和空值之间是否认为是 “相同的”,可能存在差别。使用 = 比较 null 是否相等 是不安全的,因此不要直接使用 = 和 null 比较。

解决办法:

 使用 <=> 还可以比较两个列都是null的情况,但是 is null 就不可以了。

(三)where后面的条件语句中不可以使用别名

(显示 total 不在 表中)

根据sql的执行过程进行解释:

  1. 遍历表,取出每一行
  2. 把当前行,带入到 where 条件,根据条件的真假,决定这一行是否要查询出来
  3. 再根据 select 后面的列名 / 表达式,进行 选择列/进行计算
  4. order by 进行排序 

因此 在执行第二步的时候,就会出现错误。 

(四)between a0 and a1 的范围是 [ a0, a1 ](闭区间)

    编程中,大部分谈到的 “区间” 都是 “前闭后开” 区间[ a, b ),像Java标准库,C++标准库,Python标准库,大部分的设定都是“前闭后开”;但是少数的情况下,是有 闭区间的,像 SQL 的between and ,Redis 针对列表 取子区间,Linux shell 取子区间......前闭后开 最大的好处,就是通过 b - a 得到区间的长度,就不用思考 +1 -1 这样的问题了。 

(五) 

(六) like 模糊匹配,不要求完全相等,只要满足一定条件就可以了

   此处还是需要搭配通配符,描述这样的条件: 

  • %:匹配 0 个 或者 任意个 任意的字符
  • _:匹配 1 个特定的字符 

例如:
查询姓名中 “孙” 开头 的记录

查询姓名中 “孙” 结尾 的记录

 查询姓名中包含 “孙” 的记录

查询姓名中姓“孙”且两个字的

    MySQL 中自带的模糊匹配功能 相对比较弱,实际开发中,会使用到更强大的字符串匹配工具(正则表达式) 比如,Java中String的方法split( "-" ),括号中也可以是正则表达式。

    正则表达式是一种强大的文本处理工具,它使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。正则表达式常用于字符串的搜索、替换、分割和校验等操作。在MySQL中,like不能支持正则的,只能简单使用 % 或者 _ 来匹配,但是可以使用其他语言间接操作SQL。对于数据库来说,like 模糊查询 是一个比较低效的操作,实际开发中,使用 like就要节制一些(数据库本身就慢,再频繁使用like这种低效操作是不建议的)


 逻辑运算符:

运算符说明
AND多个条件必须都为TRUE(1),结果才是TRUE(1)
OR任意一个条件为TRUE(1),结果为TRUE(1)
NOT条件为TRUE(1),结果为FALSE(O)
and 的优先级高于 or ,在同时使用时,需要使用小括号 ()  包裹优先执行的部分。

2.8 分页查询 limit

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

指定 limit 的时候,可以搭配 offset,指定从下标为几 开始查询 limit 条记录(第一条记录的下标从0开始)


('曹孟德' 是第四条数据,但是下标为3)


(还有另一种写法 limit 3, 5,与 limit 5 offset 3 等价,但是不推荐,可读性比较差)

分页查询,典型应用场景,就是分页(浏览器...)

有的时候,查询结果很多,如果把所有的结果都返回到客户端这边,用户也看不过来,分页是比较合适的做法。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

OpenAI 的 Whisper:盛名之下,其实难副?

OpenAI 的 Whisper&#xff1a;盛名之下&#xff0c;其实难副&#xff1f; Whisper 的崛起与承诺 严重缺陷的曝光 风险分析 应对措施 结论 在人工智能的浪潮中&#xff0c;OpenAI 一直以其创新性和强大的技术实力备受瞩目。然而&#xff0c;最近 OpenAI 的语音转写工具 Wh…

在kanzi 3.9.8里使用API创建自定义材质

1. kanzi studio设置 1.1 创建一个纹理贴图&#xff0c;起名Render Target Texture 1.2 创建一个Image节点&#xff0c;使用该贴图 2. 代码设置 2.1 创建一个自定义节点类 class mynode2d : public Node2D { public: virtual void renderOverride(Renderer3D& renderer…

音频中sample rate是什么意思?

‌sample rate‌在数字信号处理中&#xff0c;指的是‌采样频率‌&#xff0c;即每秒钟从连续信号中抽取的样本数量。采样频率越高&#xff0c;信号的还原度越高&#xff0c;但同时也会增加计算负担和存储需求‌。 实际应用场景 在音频处理中&#xff0c;设置合适的采样率可以…

杨辉三角形

大家好&#xff0c;今天给大家分享一下杨辉三角形是如何打印的&#xff0c;首先我们来看看它的原理。 我们先来看结果 1.如果把它看为一个二维数组&#xff08;包括后面的空格&#xff09;&#xff0c;那么它数字的这边是一个直角三角形&#xff0c;它的第一列和对角线都为1&a…

详解ARM64可执行程序的生成过程

版权归作者所有&#xff0c;如有转发&#xff0c;请注明文章出处&#xff1a;https://cyrus-studio.github.io/blog/ ARM64可执行程序的生成过程 根据 ARM64 可执行程序生成的四个主要步骤&#xff1a;预处理、编译、汇编、链接&#xff0c;我们可以详细分解整个过程如下 1. …

DB-GPT系列(二):DB-GPT部署(镜像一键部署、源码部署)

一、简介 DB-GPT 是一个开源项目&#xff0c;其将大语言模型 LLM 与数据库紧密结合。该项目主要致力于探索如何让预训练的大规模语言模型&#xff08;例如 GPT&#xff09;能够直接与数据库进行交互&#xff0c;从而生成更为准确且信息丰富的回答。 DB-GPT部署后能否直接使用…

升序数组两两不相等

题目&#xff1a;给定一个排好升序的数组A[1],A[2],… A[n]&#xff0c;其元素的值两两都不相等。请设计一个高效算法&#xff0c;找出其中所有A[]i的下标&#xff0c;并分析其复杂度。 算法分析&#xff1a;一个升序且值都不相等的数组&#xff0c;如果第一个数大于右下标&…

基于vue框架的的乐守护儿童成长记录系统b65tg(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;用户,成长指标,疫苗接种,学业档案,课外活动,旅游经历,交流论坛 开题报告内容 基于Vue框架的乐守护儿童成长记录系统开题报告 一、研究背景与意义 随着科技的飞速发展和家庭对子女成长关注度的不断提升&#xff0c;如何科学、系统地记…

VSCode 设置环境变量(WSL 2)

环境&#xff1a;openEuler、Windows 11、WSL 2、python 3.12.3 背景&#xff1a;使用vscode连接Windows 的Linux子系统&#xff0c;开发python项目&#xff0c;获取环境变量失败 时间&#xff1a;20241029 说明&#xff1a;使用os.environ获取不到变量&#xff0c;设置/etc…

使用Git LFS管理大型文件

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 使用Git LFS管理大型文件 引言 Git LFS 简介 安装 Git LFS 安装 Git 安装 Git LFS 配置 Git LFS 初始化 Git 仓库 指定需要使用…

RHCE的练习(10)

实验1&#xff1a;反向解析 准备工作 [rootserver ~]# setenforce 0[rootserver ~]# systemctl stop firewalld# 服务端安装bind软件 [rootserver ~]# dnf install bind -y DNS配置 第一步&#xff1a;服务端操作&#xff0c;编辑bind主配置文件 [rootbogon ~]# cat /e…

Redis-结构化value对象的类型

文章目录 一、Redis的结构化value对象类型的介绍二、Redis的这些结构化value对象类型的通用操作查看指定key的数据类型查看所有的key判断指定key是否存在为已存在的key进行重命名为指定key设置存活时间pexpire与expire 查看指定Key的存活时间为指定key设置成永久存活 三、Redis…

产品结构设计(六):结构设计全过程

参考引用 产品结构设计实例教程 1. ID 图及 PCB 堆叠分析 1.1 产品说明及相关资料 1、新产品开发指令单 2、ID 图 3、产品功能规格书 1.2 ID 图分析 ID&#xff08;Industrial Design&#xff0c;工业设计&#xff09;是以工业产品为主要对象&#xff0c;综合运用工学、…

Apache Dubbo (RPC框架)

本文参考官方文档&#xff1a;Apache Dubbo 1. Dubbo 简介与核心功能 Apache Dubbo 是一个高性能、轻量级的开源Java RPC框架&#xff0c;用于快速开发高性能的服务。它提供了服务的注册、发现、调用、监控等核心功能&#xff0c;以及负载均衡、流量控制、服务降级等高级功能。…

webGlL变量的声明与使用

抢先观看&#xff1a; 变量的声明格式&#xff1a;<存储限定符><类型限定符><变量名> 存储限定符&#xff1a;const, attribute, uniform, varying, buffer。 类型限定符&#xff1a;void, bool, int, float, double, vec2, vec3, vec4, mat2, mat3, mat4, s…

免费送源码:Java+CSS+springboot Springboot高校医务室管理系统 计算机毕业设计原创定制

摘 要 科技进步的飞速发展引起人们日常生活的巨大变化&#xff0c;电子信息技术的飞速发展使得电子信息技术的各个领域的应用水平得到普及和应用。信息时代的到来已成为不可阻挡的时尚潮流&#xff0c;人类发展的历史正进入一个新时代。在现实运用中&#xff0c;应用软件的工作…

CDN加速实战:使用七牛云CDN加速阿里云OSS资源访问

今天是双11搞活动,在阿里云1元注册了个域名,想着在学CDN,想使用CDN做个加速项目,但是阿里的要收费,上网查了下七牛云的不收费,想着将七牛云的CDN结合阿里的DNS做个访问加速,刚好看到了阿里的一个文章,照着改了改,实践成功了。 阿里文章:使用CDN加速OSS资源访问_对象…

SpringMVC执行流程(视图阶段JSP、前后端分离阶段)、面试题

目录 1.SpringMVC执行流程分为以下两种 2.非前后端分离的SpringMVC的执行流程 3.前后端分离的项目SpringMVC执行流程 4. 面试题 1.SpringMVC执行流程分为以下两种 2.非前后端分离的SpringMVC的执行流程 流程图&#xff1a; 更加生动的描述&#xff1a; DisPatcherServlet…

笔记本电脑买i7还是i9?i7和i9处理器区别详细介绍

i7和i9处理器都是英特尔&#xff08;Intel&#xff09;公司生产的高性能处理器&#xff0c;但它们有一些显著的区别。为了帮助你做出明智的选择&#xff0c;下面我们详细介绍一下i7和i9处理器的区别&#xff0c;以及如何根据你的需求来选择合适的处理器。 一、i7处理器的特点…

51c大模型~合集12

我自己的原文哦~ https://blog.51cto.com/whaosoft/11564858 #ProCo 无限contrastive pairs的长尾对比学习 , 个人主页&#xff1a;https://andy-du20.github.io 本文介绍清华大学的一篇关于长尾视觉识别的论文: Probabilistic Contrastive Learning for Long-Tailed Visua…