MySQL之表的记录操作

2024-01-03 22:04

本文主要是介绍MySQL之表的记录操作,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言
存数据不是目的,目的是能够将存起来的数据取出来或者查出来,并且能够对数据进行增删改查操作,本文将详细介绍表中记录的增删改查操作。对记录的操作属于DML数据库操作语言,可以通过SQL实现对数据的操作,包括实现向表中插入数据(insert),对表中数据进行更新(update),删除表中数据(delete)以及查询数据(select)。

增 - insert
表准备

create table info ( id int primary key auto_increment, name varchar(6), age int, gender enum ( 'male', 'female' ) defaule 'male' );

最标准的insert语句

-- INSERT INTO 表名(字段1, 字段2,...) VALUES (字段1对应的值, 字段2对应的值...);
mysql> insert into info(name, age, gender) values ('xu', 18, 'male');mysql> select * from info;
+----+------+------+--------+
| id | NAME | age  | gender |
+----+------+------+--------+
|  1 | xu   |   18 | male   |
+----+------+------+--------+
1 row in set (0.00 sec)

省事的写法,按照所有字段顺序进行插入数据

-- INSERT INTO 表名 VALUES (字段1对应的值, 字段2对应的值...);
mysql> insert into info values (2, 'lili', 20, 'female');
Query OK, 1 row affected (0.00 sec)mysql> select * from info;
+----+------+------+--------+
| id | NAME | age  | gender |
+----+------+------+--------+
|  1 | xu   |   18 | male   |
|  2 | lili |   20 | female |
+----+------+------+--------+
2 rows in set (0.00 sec)

针对性的录入数据

-- INSERT INTO 表名 (字段1, 字段2...) VALUES (字段1对应的值, 字段2对应的值...)
mysql> insert into info (name, age) values ('jack', 30);
Query OK, 1 row affected (0.00 sec)mysql> select * from info;
+----+------+------+--------+
| id | NAME | age  | gender |
+----+------+------+--------+
|  1 | xu   |   18 | male   |
|  2 | lili |   20 | female |
|  3 | jack |   30 | male   |
+----+------+------+--------+
3 rows in set (0.00 sec)

同时录入多行数据

-- INSERT INTO 表名 (字段1, 字段2...) VALUES (字段1对应的值, 字段2对应的值...), (字段1对应的值, 字段2对应的值...)...;
mysql> insert into info (name, age) values ('python', 30),('java', 40),('go', 50);
Query OK, 3 rows affected (0.00 sec)
Records: 3  Duplicates: 0  Warnings: 0mysql> select * from info;
+----+--------+------+--------+
| id | NAME   | age  | gender |
+----+--------+------+--------+
|  1 | xu     |   18 | male   |
|  2 | lili   |   20 | female |
|  3 | jack   |   30 | male   |
|  4 | python |   30 | male   |
|  5 | java   |   40 | male   |
|  6 | go     |   50 | male   |
+----+--------+------+--------+
6 rows in set (0.00 sec)

删 - delete

删除操作一定要慎重慎重再慎重!!!!

-- 删除表中的所有数据,但是主键的自增不会停止
delete from 表名;  -- 清空表数据并重置主键
truncate 表名;  -- 删除表中某一条或几条数据:delete from 表名 where 条件; (where条件在介绍查询时会详细介绍)
mysql> delete from info where id=1;
Query OK, 1 row affected (0.00 sec)mysql> select * from info;
+----+--------+------+--------+
| id | NAME   | age  | gender |
+----+--------+------+--------+
|  2 | lili   |   20 | female |
|  3 | jack   |   30 | male   |
|  4 | python |   30 | male   |
|  5 | java   |   40 | male   |
|  6 | go     |   50 | male   |
+----+--------+------+--------+
5 rows in set (0.00 sec)mysql> delete from info where age=30;
Query OK, 2 rows affected (0.00 sec)mysql> select * from info;
+----+------+------+--------+
| id | NAME | age  | gender |
+----+------+------+--------+
|  2 | lili |   20 | female |
|  5 | java |   40 | male   |
|  6 | go   |   50 | male   |
+----+------+------+--------+
3 rows in set (0.00 sec)

改 - update

对表中已经存在的记录进行修改。

-- update 表名 set 字段1=值1, 字段2=值2 where 条件;
-- 如果不加where条件会将表中所有记录都修改
mysql> update info set name='xxx', age=100;
Query OK, 3 rows affected (0.00 sec)
Rows matched: 3  Changed: 3  Warnings: 0mysql> select * from info;
+----+------+------+--------+
| id | NAME | age  | gender |
+----+------+------+--------+
|  2 | xxx  |  100 | female |
|  5 | xxx  |  100 | male   |
|  6 | xxx  |  100 | male   |
+----+------+------+--------+
3 rows in set (0.00 sec)-- 如果不想修改全部的记录就需要使用where条件
mysql> update info set name='test', age=10 where id=2;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0mysql> select * from info;
+----+------+------+--------+
| id | NAME | age  | gender |
+----+------+------+--------+
|  2 | test |   10 | female |
|  5 | xxx  |  100 | male   |
|  6 | xxx  |  100 | male   |
+----+------+------+--------+
3 rows in set (0.00 sec)

查 - select

表与表之间有时是有关系的,尤其是在同一个项目中的表,因此查询数据就分为单表查询和多表查询。这里师门使用MySQL官方提供的MySQL示例进行介绍查询操作,打开压缩包之后是world.sql文件,如何将这个文件导入到MySQL中呢,可以通过下面的语法:

-- source .sql文件的路径
mysql> source  C:\Users\12801\Desktop\world.sqlmysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| book_manage        |
| mysql              |
| performance_schema |
| stu                |
| test               |
| world              |
+--------------------+
7 rows in set (0.00 sec)

单表查询
查询语句的标准用法是需要select配合其他子句进行查询,因为在实际项目开发中并不是每次都需要查询所有的数据,而是需要一些过滤条件进行过滤,查询出需要的数据,并且在实际开发中不推荐查询所有数据,因为如果一张表中数据太多的话,内存可能会不够用哦~会导致电脑卡死...

首先和select配合使用的子句有以下几个select /from/where/group by/having/order by/limit,上面这些子句的书写顺序也是默认的SQL书写顺序。

from子句

是从哪张表中查询数据。

-- select 列名 from 表名;-- 全表扫描,查询country表中的所有数据,不建议这样操作,数据过多可能导致电脑卡死
mysql>select * from country;  -- 只查询表中部分列的所有值,查询country表中的code、name列的所有值
mysql> select code, name from country;

where子句

where子句就需要和过滤条件配合使用,过滤条件包括= > < <= >= != and or not like in (between and),以下述例子进行说明:

-- 查询中国所有城市信息
select * from city where countrycode='CHN';-- 中国人口大于1000000的城市信息
select * from city countrycode='CHN' and population>5000000; -- 查询省的名字前面带guang开头的,注意:like语句时,%不能放在前面,因为不走索引(索引会在后续文章中介绍,这里就简单理解索引就是书的目录)
select * from city where district like 'guang%';-- 查询中国和美国所有城市信息
select * from city where countrycode in ('CHN' ,'USA');-- 查询世界上人口数量大于100w小于200w的城市信息
select * from city where population >1000000 and population <2000000;-- 查询世界上人口数量大于100w小于200w的城市信息
select * from city where population between 1000000 and 2000000;

group by子句

group by是分组查询,根据情况是否需要where过滤条件,group by一般需要配合聚合函数使用,group by大致逻辑是取出分组和聚合函数参数的数据,根据分组依据进行排序,排序后对分组依据进行去重,由于MySQL数据库中不允许一行数据与多行数据对应(only_full_group_by严格模式),因此需要使用聚合函数将多个数据整合为与分组依据对应的一个数据。

聚合函数有max() min() sum() avg()---平均数 count()---计数 group_concat()---列转行等。

-- 统计世界上每个国家的总人口数
select countrycode ,sum(population) from  city  group by countrycode;-- 统计中国每个省的人口数
select district,sum(Population) from city  where countrycode='chn' group by district;-- 统计中国每个省的名字,人数,城市个数,城市名字(由于严格模式,一行数据不能对应多行数据,需要使用group_concat聚合函数进行列转行操作)。
select district, sum(population), count(id), group_concat(name) from world.city where countrycode='chn' group by district;

having子句

having子句与where子句功能差不多,只不过having是对分组后的数据进行筛选。

-- 统计中国每个省的总人口数,只打印总人口数小于100
select district,sum(Population) from city where countrycode='chn'group by district having sum(Population) < 1000000 ;

order by

按照指定顺序输出结果,默认是从小到大,desc是从大到小。

-- 统计中国每个省的总人口数,只打印总人口数小于100,从大到小排列。
select district,sum(Population) from city where countrycode='chn'
group by district having sum(Population) < 1000000 order by sum(population) desc;

limit

将结果分页显示,通常配合order by使用

-- LIMIT N, M;  -- 跳过N行,显示M行
-- LIMIT M OFFSET N; -- 跳过N行,显示M行
select district,sum(Population) from city where countrycode='chn'group by district having sum(Population) < 1000000 order by sum(population) desc limit 5 6; -- 统计中国每个省的总人口数,只打印总人口数小于100,从大到小排列,只显示前6~11条。

多表查询
需要的数据来自于多张表,单表无法满足,实际上是将多张表有关联的数据合并成一张新表,在新表中做where group by等子句等操作。

多表连接查询类型大概有三种类型,分别是笛卡尔乘积、内连接和外连接。

笛卡尔乘积join

是将多张表的数据合并成大表,不推荐使用。

select * from teacher join course; 

内连接inner join

应用最广泛,取两张表有关联部分的数据,A表 inner join B表 on A.xx=B.xx;

-- teacher表和course表,查询teacher表中tno等于course表中的tno的数据
select * from teacher (inner) join course on(where) teacher.tno=course.tno;

外连接left join/right join

left join左表所有的数据都展示,右表只展示与左表有关联的数据,没有对应项的用null标识;right join右表所有的数据都展示,左表只展示与右表有关联的数据,没有对应项的用null标识。

作用就是强制驱动表,将小表(查询得到的结果更少的结果集)作为驱动表降低next loop(循环)次数。

select city.name, cpuntry.name, city.population from city left join country on city.countrycode=country.code and city.poplation<100;

驱动表的原理

join...on...的实现原理:拿到其中一张表作为驱动表,使用关联条件(on的条件)去和另一张表(内层循环)比对,如果符合就将这两张表的数据进行拼接。当两张表的行数差异较大时,将小表(查询得到的结果更少的结果集)作为驱动表,可以优化查询降低next loop的次数,对于内连接来说,无法控制驱动表是谁,完全由优化器决定,如果需要人为干预驱动表,可以通过外连接实现。

left join中驱动表就是左表,类似于双层for循环的外层循环,强制将左表作为驱动表.

总结:

感谢每一个认真阅读我文章的人!!!

作为一位过来人也是希望大家少走一些弯路,如果你不想再体验一次学习时找不到资料,没人解答问题,坚持几天便放弃的感受的话,在这里我给大家分享一些自动化测试的学习资源,希望能给你前进的路上带来帮助

 

这篇关于MySQL之表的记录操作的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

MySQL中On duplicate key update的实现示例

《MySQL中Onduplicatekeyupdate的实现示例》ONDUPLICATEKEYUPDATE是一种MySQL的语法,它在插入新数据时,如果遇到唯一键冲突,则会执行更新操作,而不是抛... 目录1/ ON DUPLICATE KEY UPDATE的简介2/ ON DUPLICATE KEY UP

MySQL分库分表的实践示例

《MySQL分库分表的实践示例》MySQL分库分表适用于数据量大或并发压力高的场景,核心技术包括水平/垂直分片和分库,需应对分布式事务、跨库查询等挑战,通过中间件和解决方案实现,最佳实践为合理策略、备... 目录一、分库分表的触发条件1.1 数据量阈值1.2 并发压力二、分库分表的核心技术模块2.1 水平分

Python与MySQL实现数据库实时同步的详细步骤

《Python与MySQL实现数据库实时同步的详细步骤》在日常开发中,数据同步是一项常见的需求,本篇文章将使用Python和MySQL来实现数据库实时同步,我们将围绕数据变更捕获、数据处理和数据写入这... 目录前言摘要概述:数据同步方案1. 基本思路2. mysql Binlog 简介实现步骤与代码示例1

sysmain服务可以禁用吗? 电脑sysmain服务关闭后的影响与操作指南

《sysmain服务可以禁用吗?电脑sysmain服务关闭后的影响与操作指南》在Windows系统中,SysMain服务(原名Superfetch)作为一个旨在提升系统性能的关键组件,一直备受用户关... 在使用 Windows 系统时,有时候真有点像在「开盲盒」。全新安装系统后的「默认设置」,往往并不尽编

Python自动化处理PDF文档的操作完整指南

《Python自动化处理PDF文档的操作完整指南》在办公自动化中,PDF文档处理是一项常见需求,本文将介绍如何使用Python实现PDF文档的自动化处理,感兴趣的小伙伴可以跟随小编一起学习一下... 目录使用pymupdf读写PDF文件基本概念安装pymupdf提取文本内容提取图像添加水印使用pdfplum

Python从Word文档中提取图片并生成PPT的操作代码

《Python从Word文档中提取图片并生成PPT的操作代码》在日常办公场景中,我们经常需要从Word文档中提取图片,并将这些图片整理到PowerPoint幻灯片中,手动完成这一任务既耗时又容易出错,... 目录引言背景与需求解决方案概述代码解析代码核心逻辑说明总结引言在日常办公场景中,我们经常需要从 W

使用shardingsphere实现mysql数据库分片方式

《使用shardingsphere实现mysql数据库分片方式》本文介绍如何使用ShardingSphere-JDBC在SpringBoot中实现MySQL水平分库,涵盖分片策略、路由算法及零侵入配置... 目录一、ShardingSphere 简介1.1 对比1.2 核心概念1.3 Sharding-Sp

使用Python的requests库来发送HTTP请求的操作指南

《使用Python的requests库来发送HTTP请求的操作指南》使用Python的requests库发送HTTP请求是非常简单和直观的,requests库提供了丰富的API,可以发送各种类型的HT... 目录前言1. 安装 requests 库2. 发送 GET 请求3. 发送 POST 请求4. 发送

MySQL 表空却 ibd 文件过大的问题及解决方法

《MySQL表空却ibd文件过大的问题及解决方法》本文给大家介绍MySQL表空却ibd文件过大的问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考... 目录一、问题背景:表空却 “吃满” 磁盘的怪事二、问题复现:一步步编程还原异常场景1. 准备测试源表与数据

Mac电脑如何通过 IntelliJ IDEA 远程连接 MySQL

《Mac电脑如何通过IntelliJIDEA远程连接MySQL》本文详解Mac通过IntelliJIDEA远程连接MySQL的步骤,本文通过图文并茂的形式给大家介绍的非常详细,感兴趣的朋友跟... 目录MAC电脑通过 IntelliJ IDEA 远程连接 mysql 的详细教程一、前缀条件确认二、打开 ID