SQL语言增删改查之C与R

本节通关要求

1、掌握 SQL 语句对数据库进行的创建 Create读取 Retireve 操作的指令;

2、多练习🎮

说明:操作对象是数据表中的数据行 ,也就是表中的记录。请明确操作对象,不要误伤友军。

背景:

sql 复制代码
create table if not exists game(
    id bigint comment '玩家编号',
    `name` varchar(20) comment '游戏身份',
    lifebar int comment '生命值',
    power int comment '力量',
    constitution int comment '体质',
		intelligence int comment '智力'
);

---------------------------------------------------------游戏开始------------------------------------------------------------

关卡1、Create 新增

🎦开场动画:insert [into] 表名 [(字段1 [,字段2] ..)] values (值1, 值2...);

---> [ ] 表示可写可不写,() 则必须输入。

本关包含3个BOSS:🫅单行 数据全列 插入 🫅单行 数据指定列 插入 🫅多行 数据指定列插入

锦囊💊:字符串类型的值用 '' 英文单引号括起来。

1.1 单行数据全列插入

⚠️值列表中的数量和顺序必须和定义表中所有列的顺序一致。

示例:运行环境 ------ Navicat

insert into game values (1, '孙悟空',100,100,100,80);

1.2 单行数据指定列插入

insert into game (id,name,lifebar) values (2,'猪悟能',100);

锦囊💊:没有指定的列将会被默认值填充,默认值是 null。

1.3 多行数据指定列插入

insert into game values (3,'沙悟净',100,70,80,77), (4,'玄奘法师',100,40,36,75), (5,'白龙马',100,50,100,30), (6,'红孩儿',100,50,100,50),(7,'牛魔王',100,76,89,50);

1.4 开销

锦囊💊开箱:

① 执行所有的 SQL 时都会有网络开销,是一个不可控的因素;

② 写入数据时还会有磁盘 IO (input 输入 output 输出) 的开销

③ 每执行一条 SQL 语句都会开启一个事务,事务的开启和关闭都需要消耗系统资源

(一次提交多条数据【前提是数量在一个可控范围内】,比一次只提交一条数据的效率高一点点)

④ 在写入的时候如果出现以下类似的警告:Incorrect string value: '\xE5\xBC...' for column 'name' at row 1 首先考虑是否是数据库的编码集未设置正确,导致读写中文出错。使用show variables like '%character%'; 查看当前数据库的编码集;若确定是编码集的问题,则可以使用 alter database 数据库名 character set 目标编码集; 指令来修改,又或者修改 MySQL 的配置文件 my.ini。

-------------------------------------------------恭喜你,第一关轻松拿下-----------------------------------------------

关卡2、Retrieve 检索

🎦开场动画:

select [distinct] 字段 [,字段,...] [ from 表名] [ where 条件] [ group by {字段 / 表达式},...] [having 条件] [ order by {字段 / 表达式} [ asc / desc ], ... ] [ limit { [offset], 行数 / 行数 offset 偏移量 } ];

一大批 BOSS 正在向你靠近:

2.1 全列查询

select * from 表名**( * 类似通配符)**

锦囊💊:

在日常练习中该语句可以使用;倘若在正式的生产环境中查询表内所有数据是一个非常危险的行为!

因为在生产环境中,一个表的实际存储数据量会非常大,有可能达到 TB。而在上一关的锦囊提醒您当一个查询开始时就会产生磁盘开销与网络开销,磁盘和网络都是非常稀缺的资源,消耗成本会非常高;

如果一条全列查询语句开始执行,就有可能将服务器的资源吃光,其他的操作就要等待该语句执行完才能继续执行。

因此在生产环境下,不要使用不加任何限制语句的查询语句。该限制对象是结果集的条数。

2.2 指定列查询

select 字段 [ , 字段 ,...] from 表名

示例:查询所有角色的力量和体质

2.3 查询字段为表达式

2.3.1 常量表达式

表达式本身是一个常数,以10这个常数为例

常数的运算

2.3.2 多列运算

把所有角色的力量加10,但实际上被没有修改原先定义的值

计算所有角色的属性值总分(力量+体质+智力)

2.4 为查询结果指定别名

selelct 列名 [as] 别名 from 表名;

锦囊💊:①as 可以省略,别名如果包含了空格必须使用英文单引号括起来。

②因为我们原始设定的表中并没有叫"总属性值"这一列,所有通过表达式查询出来的结果集是通过一个临时表返回到显示界面的,执行完成之后临时表就被删除了。=> 在 MySQL 中所有的查询结果都会通过临时表返回给用户。

2.5 distinct 去重

select distinct 字段 from 表名;

锦囊💊:使⽤ distinct 去重时,只有查询列表中所有列的值都相同才会判定为重复

2.6 order by 排序

select 字段 [, 字段...] from 表名 order by 列名 [asc / desc];

锦囊💊:

① 若无明确指明是 asc 升序还是 desc 降序,将默认是升序。

② 其中的降序 desc 这个关键词很眼熟,因为 desc table_name; 查看表结构这个指令也是用了这个关键字。一个 desc 表示 descend 下降;一个 desc 表示 describe 描述。两种意思一个关键字,是不好的反面案例。在日常生产环境下作为专业的程序员,应当正确规范命名,使其明确、有意义。

2.6.1 null 值大小

null 数据排序被视为比任何值(包括负数)都要小,升序时在最前面,降序时在最下面。

示例:

2.6.2 使用表达式及别名排序

select name 姓名,power+constitution+intelligence 总属性值 from game ORDER BY 总属性值 DESC; (推荐写法)或者 select name 姓名,power+constitution+intelligence 总属性值 from game ORDER BY power+constitution+intelligence DESC;

锦囊💊:MySQL 中特殊的null

① 不论和什么值参与什么样的运算,返回的值都是 null;

② null 始终被判定为 false;

③ null 的值在 MySQL 中就是 null,与其他语言用 null 表示 0 不一样。

2.6.3 多字段排序

select 字段 [, 字段...] from 表名****order by 列名 [asc / desc], 列名 [asc / desc], ...;

锦囊💊:多字段进行排序时,排序的优先级与前后顺序有关,也可以为每一个字段定义不同的排序规则。

示例:先按智力降序排序,再按体质升序排序,最后按力量降序排序:

2.7 where 条件查询

select 字段 [ , 字段 ...] from 表名 where 条件;

2.7.1 比较运算符

运算符 说明
>, >=, <, <=
= (只有一个符号,Java是两个) 等于,对于NULL的比较是不安全的,比如 null = null 返回结果是 null
<=> 等于,对于NULL的比较是安全的,比如 null <=> null 返回结果是 true(1)
!=, <> 不等于,两种写法都可以
value between a₀ and a₁ 范围匹配,[ a₀, a₁**]**,如果 a₀ <= value <= a₁,返回 true 或 1,not between 则取反
value in (option, ...) 如果 value 在 option 列表或者集合中,则返回 true(1) ,not in 则取反
is null 是 null
is not null 不是 null
like 模糊匹配,% 表示任意多个(包括0个)字符;_表示任意一个字符;not like 则取反

2.7.2 逻辑运算符

运算符 说明
and 多个条件必须都为 true(1),结果才是 true(1)
or 任意一个条件是 true(1),结果就是 true(1)
not 条件为 true(1),结果为 false(0)

锦囊💊:逻辑运算符的优先级:() > not > and > or

若记不住优先级,那就使用小括号手动指定优先级。


示例:① 比较运算时自动过滤了值为 null 的数据行

② 查询总属性值大于200的角色

小葫芦🍐:能否在 where 条件句中使用别名?

葫芦卖药揭秘:

出现上面的现象和 MySQL 内部的实现有关,即与 MySQL 执行 SQL 语句的顺序有关;

Ⅰ. 如果要做数据中查寻某些数据,首先要确定是哪个表 => 先执行 from 表名

Ⅱ. 在查询过程中要依据指定的查询条件把符合条件的数据过滤出来 => 执行 where 条件

Ⅲ. 执行 select 后面指定的字段,这些列是需要加入到最终的结果集中 => 执行 select 字段 [, 字段]...

Ⅳ. 排序操作,根据 order by 子句中指定的列名和排序规则进行最后的排序 => 执行 order by 列名 [ asc / desc ];

由上面的步骤可得,当 where 条件中是一条表达式的时候,因为是先执行 where 条件 再执行 select 字段,所以 where 条件中不能使用别名

③ 两个表示等于的运算符:

④ 多条件

查询智力是 75 或 78 或 80 的角色名字和智力值。两种方法:

查询智力不为 null,按智力值从高到低排序:

⑤ 模糊查询:

% 表示任意多个(包括0个)字符;_表示任意一个字符;not like 则取反

💊注意通配符的位置,若查询条件是 '%孙',在当前表中的数据是会显示 Empty set 的;

2.8 分页查询

时间胶囊💊:回顾前面提及到查询全列 select * from 表名; 的时候,提及到这是非常危险的行为。因此建议使用 分页查询 运行项目,查询的是一些记录的集合,而不是大量记录,能有效减少数据库服务器的压力,同时也是对用户友好的表现。

1、select ... from 表名 ... limit num; 从下标0开始,筛选 num 条结果;

2、select ... from 表名 ... limit start, num; 从下标 start 开始,筛选 num 条结果;

3、select ... from 表名 ... limit num offset start; 从 start 开始,筛选 num 条结果,offset 是偏移量,也就是开始位置的意思。

↑ 如果起始位置超过整张表的数据量,也是可执行的,只不过返回的是一个空结果集。

小葫芦🍐:如果设置翻页,一页数据量为 5 条,那么每次起始位置怎么取得?

葫芦卖药揭秘:每页起始位置 = (当前页码 - 1)* 每页数据量。=> 收入锦囊💊

---------------------------------------------------恭喜你,第二关也拿下------------------------------------------------

>> 下一关 :SQL语言增删改查之U与D(预发布,即将揭秘隐藏 BOSS 攻略)

相关推荐
hit56实验室5 小时前
腾讯云的运维笔记——从yum的安装与更新源开始
运维·笔记·腾讯云
再睡一夏就好5 小时前
浅谈new与::operator new
笔记
梅见十柒5 小时前
UNIX网络编程笔记:共享内存区和远程过程调用
linux·服务器·网络·笔记·tcp/ip·udp·unix
2301_803554525 小时前
mysql(自写)
数据库·mysql
麦麦大数据6 小时前
vue+Django 双推荐算法旅游大数据可视化系统Echarts mysql数据库 带爬虫
数据库·vue.js·django·可视化·推荐算法·百度地图·旅游景点
成都极云科技6 小时前
裸金属服务器与虚拟机、物理机的核心差异是什么?
运维·服务器·数据库
学习中的程序媛~6 小时前
图数据库neo4j的安装
数据库·neo4j
喂完待续7 小时前
【Big Data】AI赋能的ClickHouse 2.0:从JIT编译到LLM查询优化,下一代OLAP引擎进化路径
大数据·数据库·clickhouse·数据分析·olap·big data·序列晋升
柏油7 小时前
MySQL InnoDB 架构
数据库·后端·mysql
我命由我123457 小时前
Word - Word 查找文本中的特定内容
运维·经验分享·笔记·word·运维开发·文档·文本