Linux下学【MySQL】表中插入和查询的进阶操作(配实操图和SQL语句通俗易懂)

绪论​

每日激励:挫折是会让我们变得越来越强大的重点是我们敢于积极的面对它。---Jack叔叔
**绪论​:
本章是表操作的进阶篇章(没看过入门的这里是传送门,本章将带你进阶的去学习表的插入insert和查找select,本质也就是学他们后面所带的一些附加条件(具体请看目录),通过这些条件去更好的插入和查找你所需要的数据。本章是上篇(全文8000字),下篇将写道修改和删除,将快速更新敬请期待。

早关注不迷路,话不多说安全带系好,发车啦(建议电脑观看)。**


表的增删查改

CURD是一个数据库技术中的缩写词,一般的项目开发的各种参数的基本功能都是CURD。作用是用于处理数据的基本原子操作。(源百度百科)

CURD:

  • Create(创建)、
  • Retrieve(读取)、
  • Update(更新)、
  • Delete(删除)

1. Create插入数据(Insert细节操作)

sql 复制代码
INSERT [INTO] table_name [(column [, column] ...)] VALUES (value_list) [, (value_list)] ...

直接通过实例来学习:

先创建一个学生表(后续在学生表上进行操作)

1.1 单行数据插入:

  1. 主要需要理解的结构:
    (需要插入的属性列) values(对应的值)
    insert into students (插入中:into可省略,students就是要插入的表名)
  2. 当values右边列属性不写,就是一次性插入所有属性(全列插入)

1.2 多行插入:

也很简单直接在插入的数据 用逗号分隔 连续插入(具体如下图)

同样能指定列插入,这里就不过诉了。

1.3 冲突时同步更新:

当插入数据时可能会有主键、唯一键冲突...等情况,假如直接插入会直接报错。

那么现在可以通过添加一些语法,让当有冲突(即已存在该数据)时,对冲突进行处理,让即使有问题也能插入,而不是直接报错。

语法:

sql 复制代码
on duplicate key update

例如:

下述插入许攸的情况,若直接插入,因为主机冲突的情况无法直接插入新的值。
那么我们使用(原SQL)on duplicate key update (更新SQL)这样就能插入,并且修改即使存在也会将他修改为新的

下面再看具体语法:

sql 复制代码
在插入语句后面添加:
INSERT ...... ON DUPLICATE KEY UPDATE
column = value [, column = value] ...

-- 0 row affected: 表中有冲突数据,但冲突数据的值和 update 的值相等
-- 1 row affected: 表中没有冲突数据,数据被插入
-- 2 row affected: 表中有冲突数据,并且数据已经被更新

select  ROW_COUNT()-- 获取受影响函数

1.4 冲突时同步替换:

语法:

sql 复制代码
-- 主键 或者 唯一键 没有冲突,则直接插入;
-- 主键 或者 唯一键 如果冲突,则删除后再插入
replace into students (sn, name) VALUES (20001, '曹阿瞒');
Query OK, 2 rows affected (0.00 sec)

-- 1 row affected: 表中没有冲突数据,数据被插入
-- 2 row affected: 表中有冲突数据,删除后重新插入

实例:
当插入冲突时,会直接进行替换(此时就会显示2行影响行数),注意此处是删除后再插入(id会改变)

具体如下图:

2. Retireve读取数据(Select细节操作)

语法:

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

同样是用实例来学习:

创建表并插入数据:

2.1 全列查询

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

之前讲写了就不过诉了!

2.2 指定列查询

sql 复制代码
-- 指定列的顺序不需要按定义表的顺序来
和插入时类似在前面加上要查询的列名称,不同的是此时变成了FROM
SELECT id, name, english FROM exam_result;

2.3 查询字段为表达式

在select 后可以添加表达式,将会在查询结果中带上表达式结果。

sql 复制代码
表达式不包含字段时:
SELECT id, name, 10 FROM exam_result;

发现将会直接打印10(其实代表的是该表达式的计算结果)

查询有字段的表达式时:
并且还能通过as进行重命名:
如求一行中的成绩总和

其中as可以省略:

2.4 结果去重 DISTINCT

sql 复制代码
SELECT DISTINCT math FROM exam_result

很简单就是将查询到的重复数据只见一行。

2.5 where条件

比较运算符:

运算符 说明
> , >=, <, <= 大于,大于等于,小于,小于等于
= 等于,只能用于数值的比较,NULL 不安全(不能比较),例如 NULL = NULL 的结果是 NULL
<=> 等于,NULL 安全,例如 NULL <=> NULL 的结果是 TRUE(1)
!=, <> 不等于NULL 不安全
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 个)任意字符;_ 表示任意一个字符

附:

=号,不能用于比较NULL值,比较NULL值需要使用<=>

具体如下:

当直接用 = 进行比较时比较后会为NULL、的使用<=>这样就能正常比较

逻辑运算符:

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

实例:

比较运算符
  1. 找英语成绩不合格的人:
between运算符的使用
  1. 语文成绩在 80 ~ 90 分的同学和成绩

    上述和使用between a1 and a2 (a1 ~ a2)一样,但between更方便。
in运算符的使用

in:如果是 option 中的任意一个,返回 TRUE(1)

  1. 取出数学成绩 58 或 59 或 98或99 的同学和成绩
    可以直接使用 or

    也可以使用 math in (58,59,...)
like模糊查询

使用 like:

  • %表示模糊查询后面任意多个(包括 0 个)任意字符;
  • _表示模糊查询后面任意一个字符
  1. 查询孙某某(使用%,因为不确定其后面有几个字)

    若写成_(就只能查孙某):
where后面能使用表达式(和字段)
  1. 语文好于英语成绩
  2. 总分在200以下的同学

    注意其中不能在where后面使用as重命名的变量,这是因为在select中是where是先执行的,然后才到筛选列,所以也就是as还未定义,无法使用。
    具体执行顺序:
    1. from(先找表)
    2. where(筛选条件),
    3. select(查找的列属性)

所以因为先where,才到列属性,所以重命名是不能使用的(列属性处还未被定义,就不能在where中使用了)

not运算符
  1. 寻找语文成绩大于80且不姓孙

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

    1. 要么是孙某
    2. 否则:要求总成绩 > 200 and 语文 < 数学 and 英语 > 80
    3. 可先把后面一长串的内容先写 然后 再去加上前面的孙某
NULL的查询

重新新建一个表test:

  1. 查询NULL
  2. 查询不为空
  3. NULL不参与比较运算,要比较只能使用<=> 、<>

2.6 order by语句(结果排序)

  • ASC 为升序(Ascending)(从小到大)
  • DESC 为降序(Descending)(从大到小)
  • 默认为 ASC
  • 没有order by子句的查询,返回的顺序是未定义的,永远不要依赖这个顺序

语法:

cpp 复制代码
SELECT ... FROM table_name [WHERE ...]
ORDER BY column [ASC|DESC], [...];

实操:

ASC升序:

  1. 按数学成绩升序显示
  2. 降序desc
NULL值在排序中,默认设置为比任何值都要小
多字段排序,排序优先级随书写顺序

具体理解如下:

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

上图中先按数学降序(数学写在英语前面),当数学相等时才按英语降序,最后才考虑写到最后的语文

建议就是向上图一样,将排序的 方式全部列全出来,不要去使用MySQL默认的情况(无法掌控)

order by默认升序
可以在order by 中使用前面的as别名


因为在order by中需要对数据进行排序,一定要先有适合的数据才排序 (所以他是先执行前面的列属性筛选那么它就能排序)

2.7 limit的使用(筛选分页结果)

  1. 直接在select后面加上limit表示需要的行数(从开始到第n行)
  2. 当limit 还能从 指定位置开始,读取连续个数(pos,len)(并且注意:开始位置是从0开始的)

如下图:从第一个开始读,3个

  1. 在limit读取行数的前提下,还能通过offset设置开始的行数(同样是从0开始)

建议对未知表查询时,对limit限制为1,防止数据过大

limit的作用,类似于网页中常见的页面的1、2、3、4 。。。分页显示数据。

如下图:

limit的执行阶段会更加靠后,因为只有最后将所有数据都准备好了,才到最终的显示,而limit的本质功能也就是显示,所以将排到最后。

结合上面多个读取数据的方法实例:

获取班级第一(如下图):

sql 复制代码
SELECT name, (english + math + chinese) AS total
FROM exam_result
WHERE english + math + chinese > 200
ORDER BY total DESC
LIMIT 1;

本章完。预知后事如何,暂听下回分解。

如果有任何问题欢迎讨论哈!

如果觉得这篇文章对你有所帮助的话点点赞吧!

持续更新大量MySQL细致内容,早关注不迷路。

相关推荐
点灯小铭7 分钟前
基于单片机的自动存包柜设计
数据库·单片机·mongodb·毕业设计·课程设计
失散1321 分钟前
软件设计师——09 数据库技术基础
数据库·软考·软件设计师
SXJR23 分钟前
Spring前置准备(七)——DefaultListableBeanFactory
java·spring boot·后端·spring·源码·spring源码·java开发
爱奥尼欧27 分钟前
【Linux】网络部分——Socket编程 UDP实现网络云服务器与本地虚拟机的基本通信
linux·服务器·网络
Ching·28 分钟前
RK3568入门之VScode远程连接开发板,直接开发板上面编程和实验
linux·ide·vscode·编辑器·rk3568
养生技术人36 分钟前
Oracle OCP认证考试题目详解082系列第53题
数据库·sql·oracle·database·开闭原则·ocp
iconball1 小时前
个人用云计算学习笔记 --20 (Nginx 服务器)
linux·运维·笔记·学习·云计算
Moonbit1 小时前
MoonBit高校行 | 中大、深技大、深大、港科广回顾
后端·开源·编程语言
银帅183350309711 小时前
2018年下半年试题四:论NoSQL数据库技术及其应用
数据库·架构·nosql
纸照片1 小时前
【邪修玩法】如何在WPF中开放 RESTful API 服务
后端·wpf·restful