【MySQL数据库学习】MySQL基本查询(上)


🔥承渊政道: 个人主页
❄️个人专栏: 《C语言基础语法知识》 《数据结构与算法》 《C++知识内容》 《Linux系统知识》 《算法刷题指南》 《测评文章活动推广》 《大模型语言路线学习》 《MySQL数据库学习》
✨逆境不吐心中苦,顺境不忘来时路!✨ 🎬 博主简介:

在学习 MySQL 数据库的过程中,查询语句是最基础、也是最常用的内容之一.无论是日常的数据检索、条件筛选,还是后续的数据分析与业务开发,都离不开对基本查询语法的熟练掌握.本篇文章将围绕 MySQL 的基本查询展开讲解,主要介绍 SELECT 查询语句的基本使用方式,包括查询指定字段、设置查询条件、结果排序以及限制返回条数等内容.通过这些基础语法的学习,可以帮助我们逐步建立数据库查询思维,为后续学习多表查询、聚合函数、分组统计等进阶内容打下良好的基础.如果你和我一样刚开始接触 MySQL,或者想系统回顾 SQL 查询的基础用法,那么这篇文章将带你从最常见的查询场景入手,一步步掌握 MySQL 基本查询的核心知识.废话不多说,下面跟着小编的节奏🎵一起去疯狂的学习吧!

目录

1.表的增删改查

CRUD : Create(创建), Retrieve(读取),Update(更新),Delete(删除).

在 MySQL 数据库的学习过程中,表是存储数据的核心对象,而对表中数据进行增、删、改、查操作,则是数据库使用中最基础、最常见的内容.无论是添加新数据、删除无效数据,还是修改已有数据、查询目标数据,这些操作几乎贯穿了数据库应用开发的全过程.

下面将围绕 MySQL 表的增删改查展开讲解,主要介绍 INSERTDELETEUPDATESELECT 四类常用 SQL 语句的基本用法.通过对这些语句的学习,可以帮助我们掌握如何向表中插入数据、删除数据、修改数据以及查询数据,从而进一步理解数据库表与数据之间的操作关系.

对于初学者来说,熟练掌握表的增删改查是学习 MySQL 的重要基础.只有掌握了这些基本操作,后续学习条件查询、多表关联、事务处理以及项目中的数据库操作时,才能更加轻松地理解和应用.


2.Create

在 MySQL 中,CREATE 语句主要用于创建数据库对象,例如创建数据库、创建数据表等.在进行表的增删改查之前,首先需要创建一张表,用来存储对应的数据.

创建表时,需要指定表名、字段名、字段类型以及相关约束.常见的字段约束包括主键、自增、非空等.

基本语法如下:

sql 复制代码
CREATE TABLE 表名 (
    字段名1 数据类型 约束条件,
    字段名2 数据类型 约束条件,
    字段名3 数据类型 约束条件
);

例如,创建一张学生表 student

sql 复制代码
CREATE TABLE student (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(20) NOT NULL,
    age INT,
    gender VARCHAR(10)
);

在上面的 SQL 语句中,student 是表名,idnameagegender 是表中的字段.其中,id 字段使用 PRIMARY KEY 设置为主键,并通过 AUTO_INCREMENT 实现自增;name 字段使用 NOT NULL 约束,表示该字段不能为空.

创建表成功后,就可以向表中插入数据,并进行后续的查询、修改和删除操作.

案例:创建一张学生表


2.1单行数据+全列插入

插入两条记录,value_list 数量必须和定义表的列的数量及顺序一致.

注意:这里在插入的时候,也可以不用指定id(当然,那时候就需要明确插入数据到那些列了),那么mysql会使用默认的值进行自增.

全列插入指的是在插入数据时,不指定字段名,而是按照表中字段的定义顺序,依次为每一个字段赋值.

基本语法如下:

sql 复制代码
insert into 表名 values (值1, 值2, 值3, ...);

例如,向 students 表中插入一条完整的学生数据:

sql 复制代码
insert into students values (1, 123, '张飞', '4567890');

在这条SQL语句中,students 表中的字段顺序为:

sql 复制代码
id, sn, name, qq

因此,插入数据时也需要按照这个顺序依次填写对应的值.

需要注意的是,如果某个字段设置了 auto_increment 自增属性,例如 id 字段,那么插入数据时可以使用 null 来占位,让数据库自动生成该字段的值:

sql 复制代码
insert into students values (null, 124, '关羽', '1234567');

这种方式适合字段较少、字段顺序明确的情况.但在实际开发中,为了提高 SQL 的可读性和安全性,更推荐使用指定列插入的方式.

单行全列插入,我们可以省略字段名,'into'这个单词就可以试着省略不写.


2.2多行数据+指定列插入

指定列插入指的是在插入数据时,明确写出需要插入数据的字段名,然后按照字段顺序依次填写对应的值.相比全列插入,这种方式更加清晰,也更适合实际开发使用.

基本语法如下:

sql 复制代码
insert into 表名 (字段名1, 字段名2, 字段名3, ...)
values
    (值1, 值2, 值3, ...),
    (值1, 值2, 值3, ...),
    (值1, 值2, 值3, ...);

例如,向 students 表中一次插入多条学生数据:

sql 复制代码
insert into students (sn, name, qq) values
    (124, '关羽', '1234567'),
    (125, '刘备', '2345678'),
    (126, '赵云', '3456789');

在上面的SQL语句中,只指定了 snnameqq 三个字段,没有手动指定 id 字段.因为 id 字段在创建表时设置了 auto_increment 自增属性,所以 MySQL 会自动为每一条数据生成对应的 id 值.

多行插入的好处是可以在一条 SQL 语句中插入多条记录,减少多次执行 SQL 的开销,提高数据插入效率.实际开发中,当需要批量添加数据时,通常会优先使用这种方式.

插入两条记录,value_list 数量必须和指定列数量及顺序一致.


2.3插入否则更新

在向表中插入数据时,如果插入的数据和表中已有数据发生唯一键冲突,普通的 insert 语句会执行失败.

例如,在 students 表中,sn 字段和 qq 字段都设置了 unique key 唯一约束.如果插入的数据中 snqq 已经存在,就会触发唯一键冲突.

这时可以使用 on duplicate key update 语句,实现"如果数据不存在就插入,如果数据已经存在就更新"的效果.

基本语法如下:

sql 复制代码
insert into 表名 (字段名1, 字段名2, 字段名3, ...)
values (值1, 值2, 值3, ...)
on duplicate key update
    字段名1 = 新值1,
    字段名2 = 新值2;

例如,向 students 表中插入一条数据:

sql 复制代码
insert into students (sn, name, qq) values (123, '张飞', '4567890')
on duplicate key update
    name = '张飞',
    qq = '4567890';

如果 students 表中不存在 sn = 123qq = '4567890' 的数据,那么这条 SQL 会正常执行插入操作.

如果表中已经存在相同的 snqq,则不会插入新数据,而是执行 update 后面的更新操作.

也可以结合 values() 获取本次准备插入的值:

sql 复制代码
insert into students (sn, name, qq) values (123, '张飞', '4567890')
on duplicate key update
    name = values(name),
    qq = values(qq);

这样写的好处是,如果发生唯一键冲突,就直接使用本次插入语句中的新值来更新原有记录,代码更加简洁.

需要注意的是,on duplicate key update 的触发条件是主键或唯一键发生冲突.如果表中没有设置主键或唯一键,那么即使数据内容相同,也不会触发更新,而是会继续插入新记录.

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

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

bash 复制代码
INSERT ... ON DUPLICATE KEY UPDATE
column = value [, column = value] ...
bash 复制代码
-- ON DUPLICATE KEY 当发生重复key的时候
-- 0 row affected: 表中有冲突数据,但冲突数据的值和 update 的值相等
-- 1 row affected: 表中没有冲突数据,数据被插入
-- 2 row affected: 表中有冲突数据,并且数据已经被更新
-- 通过 MySQL 函数获取受到影响的数据行数

2.4替换

在MySQL 中,replace 语句可以用来实现"替换插入"的效果.它的使用方式和 insert 类似,但执行逻辑有所不同.

当插入的数据没有发生主键或唯一键冲突时,replace 会直接插入一条新记录;如果插入的数据与表中已有数据发生主键或唯一键冲突,MySQL 会先删除原来的记录,然后再插入新的记录.

基本语法如下:

sql 复制代码
replace into 表名 (字段名1, 字段名2, 字段名3, ...)
values (值1, 值2, 值3, ...);

例如,向 students 表中替换插入一条数据:

sql 复制代码
replace into students values (13, 132, 'xuyou', '111111');

如果 students 表中不存在与这条数据冲突的主键或唯一键,那么这条语句会直接插入新数据.

如果表中已经存在 id = 13,或者 sn = 132,又或者 qq = '111111' 的数据,那么就会触发唯一键冲突.此时 replace 会先删除原来的那条记录,然后再插入当前这条新记录.

需要注意的是,replace 并不是简单地修改原有数据,而是"先删除,再插入".因此,如果表中存在自增主键、外键关联或触发器等情况,使用 replace 时需要格外谨慎.

on duplicate key update 相比,replace 更适合直接用新数据整体替换旧数据的场景;而如果只是想在冲突时更新部分字段,通常更推荐使用 on duplicate key update.

bash 复制代码
-- 主键 或者 唯一键 没有冲突,则直接插入;
-- 主键 或者 唯一键 如果冲突,则删除后再插入;
-- 1 row affected: 表中没有冲突数据,数据被插入;
-- 2 row affected: 表中有冲突数据,删除后重新插入;

3.Retrieve

Retrieve 表示查询数据,也就是从表中获取需要的数据.在MySQL中,查询数据主要使用 select 语句.它是数据库操作中使用频率最高的语句之一,可以用来查询整张表的数据,也可以根据条件查询指定的数据.

基本语法如下:

sql 复制代码
select 字段名1, 字段名2, ...
from 表名;

如果想查询表中的所有字段,可以使用 * 表示全列查询:

sql 复制代码
select * from students;

例如,查询 students 表中的所有学生信息:

sql 复制代码
select * from students;

如果只想查询指定字段,可以在 select 后面写出对应的字段名:

sql 复制代码
select id, name, qq from students;

这条SQL表示只查询 students 表中的 idnameqq 字段,而不会显示其他字段.

在实际使用中,我们通常还会配合 where 条件语句进行筛选,例如查询学号 sn123 的学生信息:

sql 复制代码
select * from students where sn = 123;

查询语句可以帮助我们快速获取表中的目标数据,是后续学习条件查询、排序查询、分页查询以及多表查询的重要基础.

语法:

bash 复制代码
SELECT
[DISTINCT] {* | {column [, column] ...}
[FROM table_name]
[WHERE ...]
[ORDER BY column [ASC | DESC], ...]
LIMIT ...

案例:


3.1SELECT列

3.1.1全列查询

bash 复制代码
-- 通常情况下不建议使用 * 进行全列查询
-- 1. 查询的列越多,意味着需要传输的数据量越大;
-- 2. 可能会影响到索引的使用。(索引后面会讲解)

3.1.2指定列查询

bash 复制代码
-- 指定列的顺序不需要按定义表的顺序来

3.1.3查询字段为表达式

bash 复制代码
表达式不包含字段
bash 复制代码
表达式包含一个字段
bash 复制代码
表达式包含多个字段

3.1.4为查询结果指定别名

bash 复制代码
语法:SELECT column [AS] alias_name [...] FROM table_name;

3.1.5结果去重

bash 复制代码
98 分重复了
bash 复制代码
去重结果

3.2WHERE条件

比较运算符:

运算符 说明
>, >=, <, <= 大于,大于等于,小于,小于等于
= 等于,NULL 不安全,例如 NULL = NULL 的结果是 NULL
<=> 等于,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 个)任意字符;_ 表示任意一个字符

逻辑运算符:

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

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


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

bash 复制代码
使用 AND 进行条件连接
bash 复制代码
使用 BETWEEN ... AND ... 条件

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

bash 复制代码
使用 OR 进行条件连接
bash 复制代码
使用 IN 条件

3.2.4姓孙的同学及孙某同学

bash 复制代码
%匹配任意多个(包括 0 个)任意字符
bash 复制代码
_ 匹配严格的一个任意字符

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

bash 复制代码
WHERE 条件中比较运算符两侧都是字段

3.2.6总分在200分以下的同学

bash 复制代码
WHERE 条件中使用表达式
别名不能用在 WHERE 条件中

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

bash 复制代码
AND 与 NOT 的使用

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


3.2.9NULL的查询

bash 复制代码
查询 students 表
bash 复制代码
查询 qq 号已知的同学姓名
bash 复制代码
NULL 和 NULL 的比较,= 和 <=> 的区别

3.3结果排序

bash 复制代码
语法:
-- ASC 为升序(从小到大)
-- DESC 为降序(从大到小)
-- 默认为 ASC
SELECT ... FROM table_name [WHERE ...]
ORDER BY column [ASC|DESC], [...];

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

3.3.1同学及数学成绩,按数学成绩升序显示


3.3.2同学及qq号,按qq号排序显示

bash 复制代码
NULL 视为比任何值都小,升序出现在最上面
bash 复制代码
NULL 视为比任何值都小,降序出现在最下面

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

bash 复制代码
多字段排序,排序优先级随书写顺序

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

bash 复制代码
ORDER BY 中可以使用表达式
bash 复制代码
ORDER BY 子句中可以使用列别名

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

bash 复制代码
结合 WHERE 子句 和 ORDER BY 子句

3.4筛选分页结果

bash 复制代码
语法:
-- 起始下标为 0
-- 从 s 开始,筛选 n 条结果
SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT s, n
-- 从 0 开始,筛选 n 条结果
SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT n;
;
-- 从 s 开始,筛选 n 条结果,比第二种用法更明确,建议使用
SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT n OFFSET s;

建议:对未知表进行查询时,最好加一条 LIMIT 1,避免因为表中数据过大,查询全表数据导致数据库卡死

3.4.1按id进行分页,每页3条记录,分别显示第 1、2、3页

bash 复制代码
第 1 页
bash 复制代码
第 2 页
bash 复制代码
第 3 页,如果结果不足 3 个,不会有影响

🚀真正的勇者不是流泪的人,而是含泪奔跑的人!


敬请期待下一篇文章内容


每日心灵鸡汤: 流水不争先,争的是滔滔不绝!

流水不争先,争的是滔滔不绝.人生从非一时的锋芒毕露,而是长久的沉淀与坚守.不必急于求成,退逐片刻喧嚣,于沉静中蓄力,于坚持中前行,历经岁月奔涌,方能汇成奔流向海的磅礴力量,成就细水长流的人生华章.

相关推荐
周杰伦fans2 小时前
深入浅出AutoCAD .NET二次开发:HostApplicationServices完全解析
数据库·.net
AQin10122 小时前
【对比向】细算“成本”——Hive vs. Doris
大数据·数据库·hive·doris·实时数仓
学计算机的计算基2 小时前
MySQL 性能调优面试复习:Explain、索引、慢查询、缓存和架构优化
java·数据库·笔记·mysql
道川贤林2 小时前
EMMC开发环境的搭建与备份
linux·嵌入式·rk3588·orangepi
运维行者_2 小时前
如何为您的企业选择最佳网络监控工具
大数据·运维·服务器·网络·数据库
十月的皮皮2 小时前
C语言学习笔记20260603-打印整数(32位)二进制的奇数位和偶数位(2种方法)
c语言·笔记·学习
小怪不太怪~2 小时前
本地项目上传到GitHub--小怪教程(Git Bash实操+常见报错解决
git·github·bash
刃神太酷啦2 小时前
MySQL 库表操作 +数据类型+ 基础概念全梳理----《Hello MySQL!》(2)
java·c语言·数据库·c++·vscode·mysql·adb
Benszen2 小时前
云计算基础-4:Linux 进程管理
linux·运维·云计算