MySQL之基本查询(上)-表的增删查改

目录

Create(创建)

案例建表

插入

 单行数据 + 指定列插入

  单行数据 + 全列插入

多行数据 + 全列插入 

 插入是否更新

 插入时更新

 替换

 Retrieve(读取)

建表插入

select列

全列查询

指定列查询

查询字段为表达式

 为查询结果指定别名

结果去重

 where条件

比较运算符

 逻辑运算符

 案例

结果排序 

筛选分页结果 

表的增删查改:CRUD : Create(创建), Retrieve(读取),Update(更新),Delete(删除)

Create(创建)

案例建表

mysql> create table if not exists students(
    -> id int unsigned primary key auto_increment,
    -> sn int not null unique key comment '学号',
    -> name varchar(20) not null,
    -> qq varchar(32)
    -> );

插入

语法:INSERT INTO table_name (column1, column2, ...) VALUES (value1, value2, ...), (value1, value2, ...), ...;

  • INSERT INTO table_name: 指定要插入数据的目标表名。(INTO可省略)
  • (column1, column2, ...): 可选项,指定要插入数据的列名。如果省略列名,则假定将为所有列提供值。
  • VALUES (value1, value2, ...), (value1, value2, ...), ...: 指定要插入的值列表。每个 value_list 都对应一个要插入的行,每个值按照与列的顺序匹配。(几个小括号就是几行插入)

可以理解为values左边是列属性,右边是列属性的内容 ;相当于扁担

 单行数据 + 指定列插入

指定列单行插入:insert into students (sn,name,qq) values (123,'张飞','123456')

  单行数据 + 全列插入

因为忽略了列属性所以不知道向哪里插入所以要每个列都插入即全列插入;

单行全列:insert into students  values (2,124,'关于','123457');

多行数据 + 全列插入 

多行插入:你可以单行重复多次插入,也可以直接多行插入;

多行全列插入 :insert into students  values (3,125,'刘备','123458'),(4,126,'许褚','123459'),(5,127,'曹操','1234560');//用逗号分开表示多行

 如果多行指定列插入的话:那么忽略的列必须要有默认值(default值)或者它是自增长;

 插入是否更新

由于主键或者唯一键对应的值已经存在而导致插入失败

主键冲突mysql> insert into students  values (1,128,'关于','123457');

报错ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'

唯一键冲突:mysql> insert into students  values (6,124,'关于','123457');

报错ERROR 1062 (23000): Duplicate entry '124' for key 'sn'

 插入时更新

可以选择性的进行同步更新操作

插入:insert into students  values (4,127,'xuyou','123123123') on duplicate key update sn=127,name='xuyou',qq='123123123';//如果碰到冲突了就执行update后面的语句

报错:ERROR 1062 (23000): Duplicate entry '127' for key 'sn'//因为sn唯一键冲突了

正确插入更新:insert into students  values (4,128,'xuyou','123123123') on duplicate key update sn=128,name='xuyou',qq='123123123';

//on duplicate key update可以理解为如果冲突了就执行后续更新操作否则就不执行


如果遇到冲突了,那么执行update的数据,前提是update的值也不能冲突;

当然也可以修改冲突的值:

mysql> insert into students  values (4,128,'xuyou','123123123') on duplicate key update id=6,sn=128,name='xuyou',qq='123123123';

那么冲突的也修改了;


但是这条操作就不行,因为更新语句主键不冲突但是唯一键冲突:

mysql> insert into students  values (6,128,'xuyou','123123123') on duplicate key update id=4,sn=123,name='xuyou',qq='123123123';//sn与id=1的sn数据冲突

正确:mysql> insert into students  values (6,128,'xuyou','123123123') on duplicate key update id=4,sn=128,name='xuyou',qq='123123123';

所以更新的唯一键要么不变要么不与其他冲突;


当然也可以这样:


老数据与新数据一样,虽然冲突了但是没变;也是可以的;

 插入成功后有提示:

当然也可以用函数查找受影响的行数(是上一个语句执行后受影响的行数) row_count()

 错误语句:没有受影响(-1)


查数据:没有行受影响(-1)


插入冲突数据:显示影响行数

 替换

对于replace:主键或者唯一键没有冲突,则直接插入;主键或者唯一键如果冲突,则删除后再插入;

插入不冲突的:replace into students  (sn,name,qq) values (129,'霸王','123');

插入冲突:replace into students  (sn,name,qq) values (131,'霸王2','123');

可以看到是先删除冲突的数据后再添加,由id的自增长可以看到;原来的10没了

 Retrieve(读取)

建表插入

mysql> CREATE TABLE exam_result ( 
    ->  id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT, 
    ->  name VARCHAR(20) NOT NULL COMMENT '同学姓名', 
    ->  chinese float DEFAULT 0.0 COMMENT '语文成绩', 
    ->  math float DEFAULT 0.0 COMMENT '数学成绩', 
    ->  english float DEFAULT 0.0 COMMENT '英语成绩' 
    -> );


mysql> INSERT INTO exam_result (name, chinese, math, english) VALUES 
    ->  ('唐三藏', 67, 98, 56), 
    ->  ('孙悟空', 87, 78, 77), 
    ->  ('猪悟能', 88, 98, 90), 
    ->  ('曹孟德', 82, 84, 67), 
    ->  ('刘玄德', 55, 85, 45), 
    ->  ('孙权', 70, 73, 78), 
    ->  ('宋公明', 75, 65, 30);

select列

全列查询

通 常 情 况 下 不 建 议 使 用 * 进 行 全 列 查 询:

- - 1 . 查 询 的 列 越 多 , 意 味 着 需 要 传 输 的 数 据 量 越 大 ;

- - 2 . 可 能 会 影 响 到 索 引 的 使 用 。

未来我们的数据库服务是在远端的服务器上的;

 select * from exam_result;//默认整张表的信息

指定列查询

select id from exam_result;//指定id列


select id,math,english from exam_result;//指定多个列

查询字段为表达式

mysql> select 1+1;

mysql> select 7*9;

mysql> select id,math,english,10 from exam_result;

mysql> select id,math+english,10 from exam_result;

 为查询结果指定别名

mysql> select id,math+english as total from exam_result;


mysql> select id,math+english  total from exam_result;//省略as也是可以的,一样结果
mysql> select name 姓名,math+english  总分 from exam_result;//多个别名,用逗号分隔


mysql> select 1+1 假发;

 对哪一列起别名就在哪一列后面加别名;

结果去重

distinct:只能进行单列的去重挑选唯一值;

mysql> select distinct math from exam_result;//对那一列去重就在那一列前加distinct

错误多列去重:select distinct math,distinct english from exam_result;//不能多列去重

 where条件

比较运算符

在MySQL中比较两个数字或者字符串是否相等用的是一个等号 ;

在使用=时,不能使用NULL=NULL;不安全

 

正常情况下比较后是true(1)或者false(0),但是NULL=NULL不是而是NULL

当然你可以这样:mysql>  select NULL<=>NULL;//这样安全

<=>也可以使用数字或者字符串比较;


 !=和<>同样无法比较NULL,可以比较数字与字符串


NULL不参与任何计算 ,任何数与null计算都是null

 IS NULL


IS NOT NULL

 逻辑运算符

 案例

英语不及格的同学及英语成绩 ( < 60 ):

mysql> select english from exam_result where english<60;//使用比较运算符

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

mysql> select name,chinese from exam_result where chinese>=80 and chinese<=90;

//使用逻辑运算符与比较运算符


mysql> select name,chinese from exam_result where chinese between 80 and 90;

使用between x and xx;本身就是闭区域

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

mysql> select name,math from exam_result where math=58 or math=59 or math=98 or math=99;//使用比较和逻辑运算符

mysql> select name,math from exam_result where math in(58,59,98,99);//使用in

只要满足in里面任意一个就为真;

 姓孙的同学及孙某同学:模糊匹配      (姓孙可以是孙某也可以是孙某某或者孙某某某等)

% 表示任意多个(包括 0 个)任意字符;_ 表示任意一个字符

姓孙:mysql> select name from exam_result where name like '孙%';
孙某:mysql> select name from exam_result where name like '孙_';

 语文成绩好于英语成绩的同学

mysql> select name,chinese,english from exam_result where chinese > english;

 总分在 200 分以下的同学

错误:mysql> select name,chinese+math+english total from exam_result where total <200;
ERROR 1054 (42S22): Unknown column 'total' in 'where clause'/
/别名不能用在 WHERE 条件中

是先执行from exam_result然后执行where total <200语句最后执行select name,chinese+math+english total;但是在第二步就错了因为表中没有total列
正确:mysql> select name,chinese+math+english total from exam_result where chinese+math+english <200;

 语文成绩 > 80 并且不姓孙的同学

mysql> select name,chinese total from exam_result where chinese>80 and name not like '孙%';

 孙某同学,否则要求总成绩 > 200 并且 语文成绩 < 数学成绩 并且 英语成绩 > 80

mysql> select name,chinese,math,english,chinese+math+english total from exam_result where name like '孙_' or (chinese+math+english>200 and chinese<math and english>80);加小括号更准确

 看name中是否有NULL

mysql> select name from exam_result where name is null;

 where可以理解为条件

结果排序 

--ASC 为升序(从小到大)

-- DESC 为降序(从大到小)

-- 默认为 ASC

SELECT ... FROM table_name [WHERE ...] ORDER BY column [ASC|DESC], [...];

注意:没有 ORDER BY 子句的查询,返回的顺序是未定义的,永远不要依赖这个顺序

 降序:mysql> select name,math from exam_result order by math desc;

 升序:mysql> select name,math from exam_result order by math asc;

NULL 视为比任何值都小,升序出现在最上面 ;

NULL 视为比任何值都小,降序出现在最下面;

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

(多字段排序,排序优先级随书写顺序)

mysql> select name,math,english,chinese from exam_result order by math desc,english,chinese;//不写的话默认asc

如果数学成绩每个人都相等,那么就按照英语成绩的升序来完成,以此类推;


就比如唐三藏和猪悟能的数学成绩一样,那么就按照英语的升序排序比较;

 查询同学及总分,由高到低

ORDER BY 中可以使用表达式

mysql> select name,math+english+chinese total from exam_result order by math+english+chinese desc;


mysql> select name,math+english+chinese total from exam_result order by total desc;//可以使用别名

为什么这里可以使用呢?因为先from exam_result然后条件where再选出select name,math+english+chinese total最后比较order by     四步操作顺序进行,所以能用别名

 查询姓孙的同学或者姓曹的同学数学成绩,结果按数学成绩由高到低显示

mysql> select name,math from exam_result where name like '孙%' or name like '曹%' order by math desc;

order by是有数据才能排序,先把数据按照条件筛选出来我才拍; 

筛选分页结果 

起始下标为 0;

从 0 开始,筛选 n 条结果:SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT n;

从 s 开始,筛选n条结果 SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT s, n;

 从 s 开始,筛选 n 条结果,比第二种用法更明确,建议使用 SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT n OFFSET s;

 n相当于步长;

 从 0 开始,筛选 n 条结果:

mysql> select * from exam_result limit 5;//下标是0的位置是id=1,连续5个

mysql> select * from exam_result limit 3;//下标是0的位置是id=1,连续3个

从表开始(0)连续n行

 从 s 开始,筛选n条结果:s指的是下标,这里id=1的下标是0

mysql> select * from exam_result limit 1,3;//下标是1的位置是id=2,连续3个


mysql> select * from exam_result limit 2,3;//下标是2的位置是id=3,连续3个

 从 s 开始,筛选 n 条结果:

mysql> select * from exam_result limit 5 offset 0;

相当于mysql> select * from exam_result limit 5;

 建议:对未知表进行查询时,最好加一条 LIMIT 1,避免因为表中数据过大,查询全表数据导致数据库卡死 按 id 进行分页,每页 3 条记录,分别显示 第 1、2、3 页

 第一页

mysql> select id,name,math,english,chinese from exam_result order by id  limit 3 offset 0;

第二页

 mysql> select id,name,math,english,chinese from exam_result order by id  limit 3 offset 3;

 第三页

mysql> select id,name,math,english,chinese from exam_result order by id  limit 3 offset 6;

当然也可以结合where:

 mysql> select id,name,math+english+chinese total from exam_result where math+english+chinese>200 order by total  limit 3 offset 0;

limit 就是你把数据准备好,按照条件筛选出再排序给我,我在"显示",limit执行靠后;

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

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

相关文章

昇腾APN最佳伙伴—英码科技AI算力计算产品亮相WAIC 2024

2024年7月4日-7日&#xff0c; “以共商促共享&#xff0c;以善治促善智”为主题的2024世界人工智能大会暨人工智能全球治理高级别会议&#xff08;WAIC&#xff09;在上海世博展览中心隆重举行。国务院总理李强出席开幕式并致辞。来自50多个国家和地区的1300位全球领军人物、展…

分享:Motionity-开源的Web端动画编辑器

Motionity是一个免费且开源的Web端动画编辑器&#xff0c;它结合了After Effects和Canva的优点&#xff0c;为用户提供了强大的动画编辑功能。支持视频剪切、图像搜索过滤、文本动画库、图层蒙版等功能。 一、项目背景与特点 开源项目&#xff1a;Motionity是一个开源项目&…

utf8mb4和utf8的不同、若依框架,代码生成器,gitee,前端vue的下载、修复和启动(寻求大佬帮助若依框架三、2.3)

2024.7.9 一、数据库的排序和统一问题。utf8mb4和utf8的不同1.1 发现问题1.2 解决问题-在idea中用sql生成器&#xff0c;生成sql语句&#xff0c;然后在里面修改1.3 utf8和utf8mb4的区别 二、若依前后端框架。代码生成器&#xff08;还没研究懂&#xff0c;但有三个方案&#x…

重塑智慧生活想象 Yeelight易来举行2024年战略及新品发布会圆满成功

7月9日&#xff0c;智能照明品牌Yeelight易来在广州举行“光为境和无界”——2024年Yeelight易来战略&新品发布会&#xff0c;此次发布会不仅展示了易来在新的一年中取得的显著业绩增长&#xff0c;还发布了多款引领行业潮流的智能新品。同时&#xff0c;发布会还邀请了权威…

如何学好C++?

首先&#xff0c;对于零基础的想学习C的同学&#xff0c;我想要你们先明白一件事&#xff1a;C是一门极为复杂且难以掌握的编程语言。因此推荐在学习C之前可以先去学习C语言&#xff0c;在拥有了一定的知识储备和编程能力后再学习C会更加的高效和相对轻松。 下面推荐从三个方面…

gitee及git的简单使用、下载教(保姆级教程)

前言&#xff1a; GitHub&#xff0c;一个由外国研发的代码开源网站&#xff0c;我们可以通过它获得别人优秀的项目源码&#xff0c;也可以在上面上传自己的劳动成果。但是&#xff0c;我们很难访问外网。于是&#xff0c;我们将目光转向国内一个类似的网站---码云&#xff08…

静态路由配置注意事项及黑洞路由的使用

静态路由 1 . 定义 从管理员处学习到的数据转发路径&#xff0c;就称为静态路由。 2 . 路由表 Proto &#xff1a;协议&#xff08; Protocol &#xff09; Direct — 直连链路Static — 静态路由RIP 、OSPF 等 — 动态路由 Pre : 优先级&#xff08; Preference &#x…

设计模式之职责链模式(Chain of Responsibility Pattern)

1.概念 职责链模式&#xff08;Chain of Responsibility Pattern&#xff09;&#xff1a;避免将请求发送者与接收者耦合在一起&#xff0c;让多个对象都有机会接收请求&#xff0c;将这些对象连接成一条链&#xff0c;并且沿着这条链传递请求&#xff0c;直到有对象处理它为止…

搞清楚[继承],易如反掌

穷不失义&#xff0c;达不离道。——孔丘《论语》 继承 1、简单理解2、继承2、1、继承的概念2、2、继承定义2、3、基类和派生类对象赋值转换2、4、继承中的作用域2、5、派生类默认成员函数2、6、继承中的特点2、6、1、友元2、6、2、静态成员2、6、3、菱形继承及菱形虚拟继承 3、…

html H5 dialog弹窗学习,实现弹窗显示内容 替代confirm、alert

html H5 dialog弹窗学习,实现弹窗内容 替代confirm 框架使用的mui,使用mui.confirm() 弹窗内容过多时,弹窗被撑的到屏幕外去了,使用H5 dialog 标签自定义一个固定大小的弹窗,内容过多时可下拉显示 效果展示 隐私政策内容很多,可以下拉显示 代码 myDialog.css dialog{p…

【深度学习基础】MacOS PyCharm连接远程服务器

目录 一、需求描述二、建立与服务器的远程连接1. 新版Pycharm的界面有什么不同&#xff1f;2. 创建远程连接3. 建立本地项目与远程服务器项目之间的路径映射4.设置保存自动上传文件 三、设置解释器总结 写在前面&#xff0c;本人用的是Macbook Pro&#xff0c; M3 MAX处理器&am…

PointNet——源码调试(模型训练+可视化测试显示)

因为项目涉及到3D点云项目&#xff0c;故学习下PointNet这个用来处理点云的神经网络 论文的话&#xff0c;大致都看了下&#xff0c;网络结构有了一定的了解&#xff0c;本博文主要为了下载调试PointNet网络源码&#xff0c;训练和测试调通而已。 我是在Anaconda下创建一个新的…

【C++知识点总结全系列 (08)】:面向对象编程OOP

这里写目录标题 1、OOP概述(1)面向对象四大特征A.抽象B.封装C.继承D.多态 (2)构造函数A.What&#xff08;什么是构造函数&#xff09;B.Why&#xff08;构造函数的作用&#xff09;C. Which&#xff08;有哪些构造函数&#xff09; (3)析构函数A.What&#xff08;什么是析构函数…

【YOLOv8系列】(一)YOLOv8介绍:实时目标检测的最新突破

目录 引言 背景与发展历程 YOLOv8架构设计 1. 改进的特征提取网络 2. 多尺度特征融合 3. 新的激活函数 4. Attention机制 模型训练与优化 性能评估 应用案例 目标检测 图像分割 图像分类 姿势估计 旋转框检测&#xff08;OBB&#xff09; 优势与挑战 优势&…

SAP PS学习笔记03 - 批量更改Project(CNMASS),批量创建Project(CNMASSCREATE)

上一章讲了网络&#xff08;Network&#xff09;&#xff0c;活动&#xff08;Activity&#xff09;&#xff0c;PS长文本&#xff0c; PS文书&#xff08;凭证&#xff09;&#xff0c;里程碑&#xff08;Milestone&#xff09;的创建等相关知识。 SAP PS学习笔记02 - 网络&a…

中西部公关新篇章:赛氪网赋能新质生产力赛事,引领行业潮流

2024年7月7日&#xff0c;武汉光谷盛况空前&#xff0c;中西部公共关系协会共同体多边合作平台&#xff08;以下简称“共同体”&#xff09;举办了2024年度中西部公关协会会长、秘书长专题交流会&#xff0c;本次会议主题为“加快新质生产力&#xff0c;推进公关行业新格局&…

思维+数学,CF 1138B - Circus

一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 1138B - Circus 二、解题报告 1、思路分析 设第一组会小丑和杂技的人数分别为x1, y1 第二组会小丑和杂技的人数分别为x2, y2 显然根据要求有&#xff1a; x1 y2 > x1 x2 x2 y2 上式说明第二组每…

213.贪心算法:跳跃游戏||(力扣)

class Solution { public:int jump(vector<int>& nums) {if (nums.size() 1) return 0; // 如果数组长度为1&#xff0c;已经在终点&#xff0c;不需要跳跃int cur 0; // 当前跳跃能到达的最远位置int flag 0; // 记录跳跃次数int next 0; // 下一次跳跃能到…

0302GPIO外设输入功能

GPIO外设输入功能 输入部分硬件电路按键简介传感器模块简介按键和传感器模块的硬件电路 C语言的学习C语言数据类型宏定义typedef结构体枚举C语言知识总结 按键控制LED灯&光敏传感器蜂鸣器GPIO总结GPIO使用方法总结模块化编程的方法&#xff1a; 两个程序&#xff1a;按键控…

PostgreSQL 里怎样解决多租户数据隔离的性能问题?

文章目录 一、多租户数据隔离的性能问题分析&#xff08;一&#xff09;大规模数据存储和查询&#xff08;二&#xff09;并发访问和锁争用&#xff08;三&#xff09;索引维护成本高&#xff08;四&#xff09;资源分配不均 二、解决方案&#xff08;一&#xff09;数据分区&a…