与MySQL的零距离接触(二.实例:记录操作)

2024-01-30 15:59

本文主要是介绍与MySQL的零距离接触(二.实例:记录操作),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!


道德三皇五帝,功名夏侯商周,五霸七雄闹春秋,顷刻兴亡过手,
青石几行名姓,北邙无数荒丘,前人播种后人收,说甚龙争虎斗。


一、操作数据表中的记录

1、MySQL插入记录INSERT

这里写图片描述

创建新表,并添加记录。

这里写图片描述

2、MySQL插入记录INSERT SET-SELECT

这里写图片描述

INSERT users3 SET username='Ben',password='456';

这里写图片描述

3、MySQL单表更新记录UPDATE

这里写图片描述

//表示原有年龄的基础上加5 更新一列
UPDATE users3 set age=age+5;
//更新多列(年龄改变为当前年龄减去id,sex值都为0)
UPDATE users3 SET age =age-id,sex=0;

这里写图片描述

//使用条件更新记录
UPDATE users SET age = age+10 WHERE id%2=0;

这里写图片描述

4、MySQL单表删除记录DELETE

这里写图片描述

DELETE FROM users3 WHERE id=2;

这里写图片描述

删除一条记录,在添加一条记录,添加的id为删除前最大的id号加1

5、MySQL查询表达式解析

这里写图片描述

这里写图片描述

SELECT id,username FROM users3;
//使用别名查找
SELECT id AS userId,username AS uname FROM users3;

6、MySQL where语句进行条件查询

这里写图片描述

7、MySQL group by 语句对查询结果分组

这里写图片描述

ASC升序,DESC降序

SELECT sex FROM users3 GROUP BY sex;

8、having语句设置分组条件

这里写图片描述

对GROUP BY的查询结果进行过滤
在HAVING字句中,查询对象必须出现在查询表达式中或使用聚合函数

 SELECT sex FROM users3 GROUP BY 1 HAVING count(id)>=2;

9、order by语句对查询结果排序

这里写图片描述

SELECT * FROM users3 ORDER BY id DESC;

10、limit语句限制查询数量

这里写图片描述

SELECT*FROM users LIMIT 2;    表示记两条记录,第0条开始SELECT*FROM users LIMIT 3,2;  表示在第3条开始记录,共2条记录
//把查询到的结果的username插入到另外一张表
INSERT test(username) SELECT username FROM users3 WHERE age>=20;

这里写图片描述

二、子查询与连接

1、数据准备

1》创建tdb_goods数据表

这里写图片描述

CREATE TABLE tdb_goods(-> goods_id SMALLINT(5) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,//商品id-> goods_name VARCHAR(150) NOT NULL,//商品名称-> goods_cate VARCHAR(40) NOT NULL,//商品分类-> brand_name VARCHAR(40) NOT NULL,//商品品牌-> goods_price DECIMAL(15,3) UNSIGNED NOT NULL,//商品价格-> is_show TINYINT(1) NOT NULL DEFAULT 1,//商品是否上架-> is_saleoff TINYINT(1) NOT NULL DEFAULT 0//商品是否销售一空-> );

查看数据表:SHOW TABLES;
查看数据表结构:SHOW COLUMNS FROM tdb_goods;

修改数据表属性:

ALTER TABLE tdb_goods MODIFY goods_price DECIMAL(15,3) UNSIGNED NOT NULL DEFAULT 0.000;

2》写入记录

 INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('R510VC 15.6英寸笔记本','笔记本','华硕','3399',DEFAULT,DEFAULT);INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('Y400N 14.0英寸笔记本电脑','笔记本','联想','4899',DEFAULT,DEFAULT);INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('G150TH 15.6英寸游戏本','游戏本','雷神','8499',DEFAULT,DEFAULT);INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('X550CC 15.6英寸笔记本','笔记本','华硕','2799',DEFAULT,DEFAULT);INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('X240(20ALA0EYCD) 12.5英寸超极本','超级本','联想','4999',DEFAULT,DEFAULT);INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('U330P 13.3英寸超极本','超级本','联想','4299',DEFAULT,DEFAULT);INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('SVP13226SCB 13.3英寸触控超极本','超级本','索尼','7999',DEFAULT,DEFAULT);INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('iPad mini MD531CH/A 7.9英寸平板电脑','平板电脑','苹果','1998',DEFAULT,DEFAULT);INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('iPad Air MD788CH/A 9.7英寸平板电脑 (16G WiFi版)','平板电脑','苹果','3388',DEFAULT,DEFAULT);INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES(' iPad mini ME279CH/A 配备 Retina 显示屏 7.9英寸平板电脑 (16G WiFi版)','平板电脑','苹果','2788',DEFAULT,DEFAULT);INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('IdeaCentre C340 20英寸一体电脑 ','台式机','联想','3499',DEFAULT,DEFAULT);INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('Vostro 3800-R1206 台式电脑','台式机','戴尔','2899',DEFAULT,DEFAULT);INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('iMac ME086CH/A 21.5英寸一体电脑','台式机','苹果','9188',DEFAULT,DEFAULT);INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('AT7-7414LP 台式电脑 (i5-3450四核 4G 500G 2G独显 DVD 键鼠 Linux )','台式机','宏碁','3699',DEFAULT,DEFAULT);INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('Z220SFF F4F06PA工作站','服务器/工作站','惠普','4288',DEFAULT,DEFAULT);INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('PowerEdge T110 II服务器','服务器/工作站','戴尔','5388',DEFAULT,DEFAULT);INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('Mac Pro MD878CH/A 专业级台式电脑','服务器/工作站','苹果','28888',DEFAULT,DEFAULT);INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES(' HMZ-T3W 头戴显示设备','笔记本配件','索尼','6999',DEFAULT,DEFAULT);INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('商务双肩背包','笔记本配件','索尼','99',DEFAULT,DEFAULT);INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('X3250 M4机架式服务器 2583i14','服务器/工作站','IBM','6888',DEFAULT,DEFAULT);INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('玄龙精英版 笔记本散热器','笔记本配件','九州风神','',DEFAULT,DEFAULT);INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES(' HMZ-T3W 头戴显示设备','笔记本配件','索尼','6999',DEFAULT,DEFAULT);INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('商务双肩背包','笔记本配件','索尼','99',DEFAULT,DEFAULT);

3》以网格线的形式查看插入的数据

ELECT * FROM tdb_goods\G;

这里写图片描述

如果显示乱码则修改客户端的显示编码格式

SET NAMES gbk;

2、MySQL子查询简介

这里写图片描述

子查询是一种常用计算机语言SELECT-SQL语言中嵌套查询下层的程序模块。当一个查询是另一个查询的条件时,称之为子查询。
例句:

SELECT * FROM t1 WHERE column1 = (SELECT column1 FROM t2);

其中,SELECT * FROM t1 …称为Outer Query[外查询](或者Outer Statement),
SELECT column1 FROM t2 称为Sub Query[子查询]。

所以,我们说子查询是嵌套在外查询内部。而事实上它有可能在子查询内部再嵌套子查询。
子查询必须出现在圆括号之间。

这里写图片描述

这里写图片描述

3、由比较运算符引发的子查询

这里写图片描述

查找所有商品的平均价格

//AVG为求平均值的聚合函数
SELECT AVG(goods_price) FROM tdb_goods;

这里写图片描述

//计算价格平均值,四舍五入保留小数点后2位
SELECT ROUND(AVG(goods_price),2)FROM tdb_goods;
SELECT goods_id,goods_name,goods_price FROM tdb_goods WHERE goods_price >= 5636.36;

这里写图片描述

通过子查询的方式实现

SELECT goods_id,goods_name,goods_price FROM tdb_goods WHERE goods_price >= (SELECT ROUND(AVG(goods_price),2)FROM tdb_goods);

寻找超极本的价格

SELECT goods_price FROM tdb_goods WHERE goods_cate='超级本';

这里写图片描述

查询哪些商品的价格大于超级本

这里写图片描述

由于查询到多个结果,所以报错,需要使用下面的方式进行修饰

这里写图片描述

这里写图片描述

SELECT goods_id,goods_name,goods_price FROM tdb_goods WHERE goods_price > ANY(SELECT goods_price FROM tdb_goods WHERE goods_cate ='超级本');

这里写图片描述

由此看出都是大于4299

这里写图片描述

4、由[NOT]IN/EXISTS引发的子查询

这里写图片描述

这里写图片描述

5、使用INSERT…SELECT插入记录

在上面的数据中,goods_cate和goods_name字段有很多是重复的,且汉字所占字节数要比数字要多,如果数据量比较大的话,查询起来会越来越慢。我们可以通过外键的方式进行更改数据表。
新创建一张数据表 tdb_goods_cates

 CREATE TABLE IF NOT EXISTS tdb_goods_cates(-> cate_id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,-> cate_name VARCHAR(40) NOT NULL-> );
//查看分类
SELECT goods_cate FROM tdb_goods GROUP BY goods_cate;

这里写图片描述

这里写图片描述

-- 将分组结果写入到tdb_goods_cates数据表INSERT tdb_goods_cates (cate_name) SELECT goods_cate FROM tdb_goods GROUP BY goods_cate;

这里写图片描述

6、多表更新

这里写图片描述

这里写图片描述

这里写图片描述
在mysql,join,cross join和inner join 是等价的。
left [outer] join,左外连接
right [outer] join,右外连接

//INNER JOIN 内连接UPDATE tdb_goods INNER JOIN tdb_goods_cates ON goods_cate = cate_name-> SET goods_cate = cate_id;

这里写图片描述

7、多表更新之一步到位

这里写图片描述

这里写图片描述

 CREATE TABLE tdb_goods_brands-> (-> brand_id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,-> brand_name VARCHAR(40) NOT NULL-> )-> SELECT brand_name FROM tdb_goods GROUP BY brand_name;

这里写图片描述

更新tbd_goods数据

mysql> UPDATE tdb_goods INNER JOIN tdb_goods_brands ON brand_name = brand_name-> SET brand_name = brand_id;
ERROR 1052 (23000): Column 'brand_name' in field list is ambiguous

错误信息:brand_name含义不明确

我们使用别名的方式进行更改

UPDATE tdb_goods AS g INNER JOIN tdb_goods_brands AS b ON g.brand_name = b.brand_name SET g.brand_name = b.brand_id;

这里写图片描述

但是并不能更改表结构

这里写图片描述

因此我们要记得修改表结构

 ALTER TABLE tdb_goodsCHANGE goods_cate cate_id SMALLINT UNSIGNED NOT NULL, CHANGE brand_name brand_id SMALLINT UNSIGNED NOT NULL;

这里写图片描述

我们分别在tdb_goods_cates和tdb_goods_brands表插入记录

INSERT tdb_goods_cates(cate_name) VALUES('路由器'),('交换机'),('网卡');INSERT tdb_goods_brands(brand_name) VALUES('海尔'),('清华同方'),('神舟');
-- 在tdb_goods数据表写入任意记录INSERT tdb_goods(goods_name,cate_id,brand_id,goods_price) VALUES(' LaserJet Pro P1606dn 黑白激光打印机','12','4','1849');

平时,我们需要将多个表的数据展示给用户观看,就需要使用连接来完成。

8、连接的语法结构

这里写图片描述

这里写图片描述

这里写图片描述

9、内连接INNER JOIN

这里写图片描述

这里写图片描述

仅显示符合连接条件的记录

这里写图片描述

SELECT goods_id,goods_name,cate_name FROM tdb_goods INNER JOIN tdb_goods_cates ON tdb_goods.cate_id = tdb_goods_cates.cate_id;

这里写图片描述

并没有查找出我们新更新的数据内容,因为它们不满足查询的条件

INSERT tdb_goods_cates(cate_name) VALUES('路由器'),('交换机'),('网卡');
INSERT tdb_goods_brands(brand_name) VALUES('海尔'),('清华同方'),('神舟');
INSERT tdb_goods(goods_name,cate_id,brand_id,goods_price) VALUES(' LaserJet Pro P1606dn 黑白激光打印机','12','4','1849');

10、外连接OUTER JOIN

这里写图片描述

这里写图片描述

内连接:显示左表及右表符合连接条件的记录,A ∩ B
左外连接:显示左表中的全部和右表符合连接条件的记录,A ∪ (A ∩ B)
右外连接:显示右表中的全部和左表符合连接条件的记录,B ∪ (A ∩ B)

11、多表连接

SELECT goods_id,goods_name,cate_name,brand_name,goods_price FROM tdb_goods AS g -> INNER JOIN tdb_goods_cates AS c ON g.cate_id = c.cate_id-> INNER JOIN tdb_goods_brands AS b ON g.brand_id = b.brand_id\G;

12、关于连接的几点说明

这里写图片描述

这里写图片描述

13、无限级分类表设计

这里写图片描述

 CREATE TABLE tdb_goods_types(type_id   SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,//分类idtype_name VARCHAR(20) NOT NULL,//分类名称parent_id SMALLINT UNSIGNED NOT NULL DEFAULT 0//父类id); 
INSERT tdb_goods_types(type_name,parent_id) VALUES('家用电器',DEFAULT);INSERT tdb_goods_types(type_name,parent_id) VALUES('电脑、办公',DEFAULT);INSERT tdb_goods_types(type_name,parent_id) VALUES('大家电',1);INSERT tdb_goods_types(type_name,parent_id) VALUES('生活电器',1);INSERT tdb_goods_types(type_name,parent_id) VALUES('平板电视',3);INSERT tdb_goods_types(type_name,parent_id) VALUES('空调',3);INSERT tdb_goods_types(type_name,parent_id) VALUES('电风扇',4);INSERT tdb_goods_types(type_name,parent_id) VALUES('饮水机',4);INSERT tdb_goods_types(type_name,parent_id) VALUES('电脑整机',2);INSERT tdb_goods_types(type_name,parent_id) VALUES('电脑配件',2);INSERT tdb_goods_types(type_name,parent_id) VALUES('笔记本',9);INSERT tdb_goods_types(type_name,parent_id) VALUES('超级本',9);INSERT tdb_goods_types(type_name,parent_id) VALUES('游戏本',9);INSERT tdb_goods_types(type_name,parent_id) VALUES('CPU',10);INSERT tdb_goods_types(type_name,parent_id) VALUES('主机',10);

这里写图片描述

这里写图片描述

自身连接:同一个数据表对其自身进行连接。

SELECT s.type_id,s.type_name,p.type_name FROM tdb_goods_types AS s LEFT JOIN tdb_goods_types AS p ON s.parent_id = p.type_id;

这里写图片描述

SELECT p.type_id,p.type_name,s.type_name FROM tdb_goods_types AS p LEFT JOIN  tdb_goods_types s ON s.parent_id = p.type_id;

这里写图片描述

-- 查找所有分类及其子类的数目SELECT p.type_id,p.type_name,count(s.type_name) AS children_count FROM tdb_goods_types AS p LEFT JOIN tdb_goods_types AS s ON s.parent_id = p.type_id GROUP BY p.type_name ORDER BY p.type_id;-- 为tdb_goods_types添加child_count字段ALTER TABLE tdb_goods_types ADD child_count MEDIUMINT UNSIGNED NOT NULL DEFAULT 0;-- 将刚才查询到的子类数量更新到tdb_goods_types数据表UPDATE tdb_goods_types AS t1 INNER JOIN ( SELECT p.type_id,p.type_name,count(s.type_name) AS children_count FROM tdb_goods_types AS p LEFT JOIN tdb_goods_types AS s ON s.parent_id = p.type_id GROUP BY p.type_name ORDER BY p.type_id ) AS t2 ON  t1.type_id = t2.type_id SET t1.child_count = t2.children_count;-- 复制编号为12,20的两条记录SELECT * FROM tdb_goods WHERE goods_id IN (19,20);-- INSERT ... SELECT实现复制INSERT tdb_goods(goods_name,cate_id,brand_id) SELECT goods_name,cate_id,brand_id FROM tdb_goods WHERE goods_id IN (19,20);

14、多表删除

这里写图片描述

-- 查找重复记录SELECT goods_id,goods_name FROM tdb_goods GROUP BY goods_name HAVING count(goods_name) >= 2;-- 删除重复记录DELETE t1 FROM tdb_goods AS t1 LEFT JOIN (SELECT goods_id,goods_name FROM tdb_goods GROUP BY goods_name HAVING count(goods_name) >= 2 ) AS t2  ON t1.goods_name = t2.goods_name  WHERE t1.goods_id > t2.goods_id;

这篇关于与MySQL的零距离接触(二.实例:记录操作)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/660766

相关文章

SpringBoot3应用中集成和使用Spring Retry的实践记录

《SpringBoot3应用中集成和使用SpringRetry的实践记录》SpringRetry为SpringBoot3提供重试机制,支持注解和编程式两种方式,可配置重试策略与监听器,适用于临时性故... 目录1. 简介2. 环境准备3. 使用方式3.1 注解方式 基础使用自定义重试策略失败恢复机制注意事项

MySQL MCP 服务器安装配置最佳实践

《MySQLMCP服务器安装配置最佳实践》本文介绍MySQLMCP服务器的安装配置方法,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下... 目录mysql MCP 服务器安装配置指南简介功能特点安装方法数据库配置使用MCP Inspector进行调试开发指

mysql中insert into的基本用法和一些示例

《mysql中insertinto的基本用法和一些示例》INSERTINTO用于向MySQL表插入新行,支持单行/多行及部分列插入,下面给大家介绍mysql中insertinto的基本用法和一些示例... 目录基本语法插入单行数据插入多行数据插入部分列的数据插入默认值注意事项在mysql中,INSERT I

一文详解MySQL如何设置自动备份任务

《一文详解MySQL如何设置自动备份任务》设置自动备份任务可以确保你的数据库定期备份,防止数据丢失,下面我们就来详细介绍一下如何使用Bash脚本和Cron任务在Linux系统上设置MySQL数据库的自... 目录1. 编写备份脚本1.1 创建并编辑备份脚本1.2 给予脚本执行权限2. 设置 Cron 任务2

SQL Server修改数据库名及物理数据文件名操作步骤

《SQLServer修改数据库名及物理数据文件名操作步骤》在SQLServer中重命名数据库是一个常见的操作,但需要确保用户具有足够的权限来执行此操作,:本文主要介绍SQLServer修改数据... 目录一、背景介绍二、操作步骤2.1 设置为单用户模式(断开连接)2.2 修改数据库名称2.3 查找逻辑文件名

SQL Server数据库死锁处理超详细攻略

《SQLServer数据库死锁处理超详细攻略》SQLServer作为主流数据库管理系统,在高并发场景下可能面临死锁问题,影响系统性能和稳定性,这篇文章主要给大家介绍了关于SQLServer数据库死... 目录一、引言二、查询 Sqlserver 中造成死锁的 SPID三、用内置函数查询执行信息1. sp_w

Python UV安装、升级、卸载详细步骤记录

《PythonUV安装、升级、卸载详细步骤记录》:本文主要介绍PythonUV安装、升级、卸载的详细步骤,uv是Astral推出的下一代Python包与项目管理器,主打单一可执行文件、极致性能... 目录安装检查升级设置自动补全卸载UV 命令总结 官方文档详见:https://docs.astral.sh/

Python实例题之pygame开发打飞机游戏实例代码

《Python实例题之pygame开发打飞机游戏实例代码》对于python的学习者,能够写出一个飞机大战的程序代码,是不是感觉到非常的开心,:本文主要介绍Python实例题之pygame开发打飞机... 目录题目pygame-aircraft-game使用 Pygame 开发的打飞机游戏脚本代码解释初始化部

canal实现mysql数据同步的详细过程

《canal实现mysql数据同步的详细过程》:本文主要介绍canal实现mysql数据同步的详细过程,本文通过实例图文相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的... 目录1、canal下载2、mysql同步用户创建和授权3、canal admin安装和启动4、canal

SQL中JOIN操作的条件使用总结与实践

《SQL中JOIN操作的条件使用总结与实践》在SQL查询中,JOIN操作是多表关联的核心工具,本文将从原理,场景和最佳实践三个方面总结JOIN条件的使用规则,希望可以帮助开发者精准控制查询逻辑... 目录一、ON与WHERE的本质区别二、场景化条件使用规则三、最佳实践建议1.优先使用ON条件2.WHERE用