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

MySQL基础(三)

一. 插入内容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 别名 

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

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

2.5 去重查询

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


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

2.6 排序查询

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

注意:

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


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

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


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

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

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

 

2.7 条件查询

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 中自带的模糊匹配功能 相对比较弱,实际开发中,会使用到更强大的字符串匹配工具(正则表达式) 


 逻辑运算符:

运算符说明
AND多个条件必须都为TRUE(1),结果才是TRUE(1)
OR任意一个条件为TRUE(1),结果为TRUE(1)
NOT条件为TRUE(1),结果为FALSE(O)

 举例:

 

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

 


 

相关文章:

MySQL基础(三)

一. 插入内容insert tips&#xff1a; &#xff08;一&#xff09;SQL中 表示 字符串&#xff0c;可以用 也可以用 " C/C、Java中&#xff0c; 表示字符&#xff0c;" 表示字符串SQL/Python/JS&#xff0c;没有字符类型&#xff0c;只有字符串&#xff0c; 和 &qu…...

浏览器八股

面试系列文章 万字总结我在寒冬里的面试准备经历前端铜九铁十面试必备八股文——【HTML&CSS】前端铜九铁十面试必备八股文——【JavaScript】前端铜九铁十面试必备八股文——【Vue】前端铜九铁十面试必备八股文——【浏览器】前端铜九铁十面试必备八股文——【网络相关】前…...

华为机试HJ18 识别有效的IP地址和掩码并进行分类统计

首先看一下题 描述 请解析IP地址和对应的掩码&#xff0c;进行分类识别。要求按照A/B/C/D/E类地址归类&#xff0c;不合法的地址和掩码单独归类。 所有的IP地址划分为 A,B,C,D,E五类 A类地址从1.0.0.0到126.255.255.255; B类地址从128.0.0.0到191.255.255.255; C类地址从192.0.…...

计算机网络——TCP拥塞控制原理

吞吐量 端口有16位...

ubuntu-开机黑屏问题快速解决方法

开机黑屏一般是由于显卡驱动出现问题导致。 快速解决方法&#xff1a; 通过ubuntu高级选项->recovery模式->resume->按esc即可进入recovery模式&#xff0c;进去后重装显卡驱动&#xff0c;重启即可解决。附加问题&#xff1a;ubuntu的默认显示管理器是gdm3,如果重…...

DNS服务器

正反解析 [rootlocalhost ~]# systemctl stop firewalld #关防火墙 [rootlocalhost ~]# setenforce 0 #关闭selinux [rootlocalhost ~]# mount /dev/sr0 /mnt #挂载 mount: /mnt: WARNING: source write-protected, mounted read-only. [rootlocalhost ~]# yum …...

【C++笔记】string类使用详解

前言 各位读者朋友们大家好&#xff01;上期我们讲完了C的模板初阶&#xff0c;这一期我们开启STL的学习。STL是C的数据结构和算法库&#xff0c;是我们学习C的很重要的一部分内容&#xff0c;在以后的工作中也很重要。现在我们开始讲解。 目录 前言一. 为什么学习string类1.…...

数字隔离器与光隔离器有何不同?---腾恩科技

在电子隔离中&#xff0c;两种常用的解决方案是数字隔离器和光学隔离器。两者都旨在电气隔离电路的各个部分&#xff0c;以保护敏感元件免受高压干扰&#xff0c;但它们通过不同的技术实现这一目标。本文探讨了这些隔离器之间的差异&#xff0c;重点介绍了它们的工作原理、优势…...

方差与协方差

方差是一种特殊的协方差。...

【含文档】基于Springboot+Vue的工商局商家管理系统 (含源码数据库+LW)

1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要技术: Java,Springboot,mybatis,mysql,vue 2.视频演示地址 3.功能 系统定…...

【股票市场情绪量化模型】

股票市场情绪量化模型&#xff1a;理论与实践 目录 什么是股票市场情绪情绪量化模型的基本概念情绪数据的来源与获取情绪量化模型的构建 4.1 情绪指标的选择4.2 模型设计与算法 情绪与市场表现的关系情绪量化模型的应用案例模型的局限性与挑战总结 1. 什么是股票市场情绪 股…...

Oracle视频基础1.3.8与1.4.1练习

1.3.8与1.4.1 -看数据文件的目录&#xff0c; dump 的目录&#xff0c;oracle的软件目录 -(secureCRT&#xff0c;telnet连接linux。)看当前用户&#xff0c;当前所属组&#xff0c;通过操作系统认证以sysdba登陆,启动数据库然后关闭 -看口令文件 看数据文件的目录&#xff0c…...

基于前馈神经网络模型和卷积神经网络的MINIST数据集训练

目录 前馈神经网络FNN模型 卷积神经网络CNN模型 前馈神经网络FNN模型 author: lxy function: model--mnist date : 2024/10/25 email : 13102790991163.com # 导入必要的库 import torch import torch.nn as nn import torchvision.datasets as dsets import torchvision.t…...

Vue3中Element Plus==el-eialog弹框中的input无法获取表单焦点

有弹框情况下 <template> <input ref"input" /> </template> <script setup> import { ref, onMounted } from vue // 声明一个 ref 来存放该元素的引用 // 必须和模板里的 ref 同名 const input ref(null) onMounted(() > { ne…...

16.网工入门篇--------介绍下网络服务及应用

一、网络服务的概念 网络服务是指通过网络提供的软件功能或设施&#xff0c;它允许不同的设备和用户在网络环境中进行信息交换、资源共享和协作。这些服务基于各种网络协议&#xff0c;以实现高效、可靠的通信。 二、常见网络服务类型 &#xff08;一&#xff09;文件传输服务 …...

区分 electron 全屏和最大化

一. 全屏 在 Electron 中&#xff0c;当窗口处于全屏状态时&#xff0c;通常不能直接使用 JavaScript 来改变窗口大小。这是出于安全和用户体验的考虑&#xff0c;以防止意外的窗口大小变化影响全屏体验。 1. 退出全屏后再调整大小 检测全屏状态&#xff0c;退出全屏并调整大…...

封装一个请求的hook(react函数组件)

对于后台系统&#xff0c;上面筛选&#xff0c;下面表格分页的页面&#xff0c;这个hook非常实用 omitBy方法&#xff1a;过滤不为undefined的对象属性 export const omitBy <T extends IObject, K extends keyof T>(object:T, predicate:(value:T[K]) > boolean):I…...

c语言内存块讲解

文章目录 前言一、栈区1、栈区的特点&#xff1a;1.1 自动管理1.2 后进先出1.3 有限大小1.4 高速访问1.5 栈区存储方向 2、栈区使用注意事项 二、堆区1、堆区的定义2、堆区的特点3、堆区的内存分配与释放4、注意事项&#xff1a; 三、全局/静态存储区1、全局存储区1.1 全局变量…...

2024年10月23日Github流行趋势

项目名称&#xff1a;hiteshchoudhary / apihub 项目维护者&#xff1a;wajeshubham, atulbhatt-system32, jwala-anirudh, arnb-smnta, shrey-dadhaniya 项目介绍&#xff1a;您自己的API Hub&#xff0c;用于学习和掌握API交互。非常适合前端、移动开发人员和后端开发人员。 …...

YOLOv6-4.0部分代码阅读笔记-dbb_transforms.py

dbb_transforms.py yolov6\layers\dbb_transforms.py 目录 dbb_transforms.py 1.所需的库和模块 2.def transI_fusebn(kernel, bn): 3.def transII_addbranch(kernels, biases): 4.def transIII_1x1_kxk(k1, b1, k2, b2, groups): 5.def transIV_depthconcat(kernel…...

测试微信模版消息推送

进入“开发接口管理”--“公众平台测试账号”&#xff0c;无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息&#xff1a; 关注测试号&#xff1a;扫二维码关注测试号。 发送模版消息&#xff1a; import requests da…...

Admin.Net中的消息通信SignalR解释

定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...

MongoDB学习和应用(高效的非关系型数据库)

一丶 MongoDB简介 对于社交类软件的功能&#xff0c;我们需要对它的功能特点进行分析&#xff1a; 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具&#xff1a; mysql&#xff1a;关系型数据库&am…...

第25节 Node.js 断言测试

Node.js的assert模块主要用于编写程序的单元测试时使用&#xff0c;通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试&#xff0c;通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...

【Java_EE】Spring MVC

目录 Spring Web MVC ​编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 ​编辑参数重命名 RequestParam ​编辑​编辑传递集合 RequestParam 传递JSON数据 ​编辑RequestBody ​…...

Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)

目录 一、&#x1f44b;&#x1f3fb;前言 二、&#x1f608;sinx波动的基本原理 三、&#x1f608;波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、&#x1f30a;波动优化…...

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中&#xff0c;新增了一个本地验证码接口 /code&#xff0c;使用函数式路由&#xff08;RouterFunction&#xff09;和 Hutool 的 Circle…...

Java 二维码

Java 二维码 **技术&#xff1a;**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...

LeetCode - 199. 二叉树的右视图

题目 199. 二叉树的右视图 - 力扣&#xff08;LeetCode&#xff09; 思路 右视图是指从树的右侧看&#xff0c;对于每一层&#xff0c;只能看到该层最右边的节点。实现思路是&#xff1a; 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...

JVM虚拟机:内存结构、垃圾回收、性能优化

1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...