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

相关文章

SQL server数据库如何下载和安装

《SQLserver数据库如何下载和安装》本文指导如何下载安装SQLServer2022评估版及SSMS工具,涵盖安装配置、连接字符串设置、C#连接数据库方法和安全注意事项,如混合验证、参数化查... 目录第一步:打开官网下载对应文件第二步:程序安装配置第三部:安装工具SQL Server Manageme

C#连接SQL server数据库命令的基本步骤

《C#连接SQLserver数据库命令的基本步骤》文章讲解了连接SQLServer数据库的步骤,包括引入命名空间、构建连接字符串、使用SqlConnection和SqlCommand执行SQL操作,... 目录建议配合使用:如何下载和安装SQL server数据库-CSDN博客1. 引入必要的命名空间2.

全面掌握 SQL 中的 DATEDIFF函数及用法最佳实践

《全面掌握SQL中的DATEDIFF函数及用法最佳实践》本文解析DATEDIFF在不同数据库中的差异,强调其边界计算原理,探讨应用场景及陷阱,推荐根据需求选择TIMESTAMPDIFF或inte... 目录1. 核心概念:DATEDIFF 究竟在计算什么?2. 主流数据库中的 DATEDIFF 实现2.1

MySQL 多列 IN 查询之语法、性能与实战技巧(最新整理)

《MySQL多列IN查询之语法、性能与实战技巧(最新整理)》本文详解MySQL多列IN查询,对比传统OR写法,强调其简洁高效,适合批量匹配复合键,通过联合索引、分批次优化提升性能,兼容多种数据库... 目录一、基础语法:多列 IN 的两种写法1. 直接值列表2. 子查询二、对比传统 OR 的写法三、性能分析

MySQL中的LENGTH()函数用法详解与实例分析

《MySQL中的LENGTH()函数用法详解与实例分析》MySQLLENGTH()函数用于计算字符串的字节长度,区别于CHAR_LENGTH()的字符长度,适用于多字节字符集(如UTF-8)的数据验证... 目录1. LENGTH()函数的基本语法2. LENGTH()函数的返回值2.1 示例1:计算字符串

浅谈mysql的not exists走不走索引

《浅谈mysql的notexists走不走索引》在MySQL中,​NOTEXISTS子句是否使用索引取决于子查询中关联字段是否建立了合适的索引,下面就来介绍一下mysql的notexists走不走索... 在mysql中,​NOT EXISTS子句是否使用索引取决于子查询中关联字段是否建立了合适的索引。以下

Java通过驱动包(jar包)连接MySQL数据库的步骤总结及验证方式

《Java通过驱动包(jar包)连接MySQL数据库的步骤总结及验证方式》本文详细介绍如何使用Java通过JDBC连接MySQL数据库,包括下载驱动、配置Eclipse环境、检测数据库连接等关键步骤,... 目录一、下载驱动包二、放jar包三、检测数据库连接JavaJava 如何使用 JDBC 连接 mys

SQL中如何添加数据(常见方法及示例)

《SQL中如何添加数据(常见方法及示例)》SQL全称为StructuredQueryLanguage,是一种用于管理关系数据库的标准编程语言,下面给大家介绍SQL中如何添加数据,感兴趣的朋友一起看看吧... 目录在mysql中,有多种方法可以添加数据。以下是一些常见的方法及其示例。1. 使用INSERT I

Qt使用QSqlDatabase连接MySQL实现增删改查功能

《Qt使用QSqlDatabase连接MySQL实现增删改查功能》这篇文章主要为大家详细介绍了Qt如何使用QSqlDatabase连接MySQL实现增删改查功能,文中的示例代码讲解详细,感兴趣的小伙伴... 目录一、创建数据表二、连接mysql数据库三、封装成一个完整的轻量级 ORM 风格类3.1 表结构

Java操作Word文档的全面指南

《Java操作Word文档的全面指南》在Java开发中,操作Word文档是常见的业务需求,广泛应用于合同生成、报表输出、通知发布、法律文书生成、病历模板填写等场景,本文将全面介绍Java操作Word文... 目录简介段落页头与页脚页码表格图片批注文本框目录图表简介Word编程最重要的类是org.apach