文章目录
MySQL(3)
前言:
在进入MySQL 第三部分之前,我们来回忆一下上文的内容;
1.MySQL 数据库
2.数据库 的表操作
这里数据库指的 是逻辑上的数据集合。
数据表:
MySQL 要求数据表中的每一行,的列数和列的类型都是对应的
我们的 MySQL , Oracle ,SQL Server 都是 按照表格来组织 ,称为“关系型数据库”
1.创建数据表
create table 表名 (列名 类型 列名 类型 .....);
这里我们常使用的类型有
1234intdoublevarchardatetime
注意:在指定列表的时候,列名在前,类型在后.
2.查看表
show tables;
3.查看表结构
**
desc 表名;
**
4.删除表
drop table 表名;
上文的重点差不多就算 这些,那么下面让我们进入,MySQL 的增删查改操作
1.新增(Create)
全列插入
insert
往表里面插入数据
insert into 表名 values(列的值....)
注意:
这里我们 需要保证插入的 数据类型 与 表头 一至。
这里我们 SQL 中表示字符串,可以使用 ’ ’ (单引号) 或者 " " (双引号)。【Java中 只能 使用 " " 表示字符串】
对 datetime 进行插入
接下来 我们 来学习一下如何 插入datetime 的值。
这里有两种方法
1.通过 指定格式的字符串来插入一个指定时间
2.通过 now()函数来插入 一个当前时间
另外 insert进行插入的时候,可以只插入其中的某一列或者 某几列的.此时其他的列将采用默认值。
指定列插入
insert into 表名(指定插入的数据) values (插入的数据);
注意: 这里 的 个数 和类型 也需要匹配;
这里 也可以多行插入
-- 插入两条记录,value_list 数量必须和指定列数量及顺序一致
insert into student (id, sn, name) values (102, 20001, '曹孟德'),(103, 20002, '孙仲谋');
这里values 每一个 圆括号都对应一行,可以一次性的带有多个(),多个()之间使用 逗号来分割
这里 一次 插入 多行 ,也可以 一次插入一行,分三个 insert 语句 来插入
如:
insert into student values(1, 'zhangsan', 19, 90.0);
insert into student values(2, 'lisi', 19, 90.0);
insert into student values(3, 'wangwu', 19, 90.0);
这里 一次 插入 n 条 相比 一次插入 一条 分 n 次插入, 要快很多 !! (可能是 好几倍)
例子: 比如 我们 被 父母 叫上 楼 拿 东西,拿到 了 东西 去给 了 父母,但是 父母,又 想到 有东西没拿,叫你在去上楼去拿,
相比 父母是一次性叫你拿上她需要的东西,你是不是只需要跑一趟,这里效率就高了很多。
修改 mysql 配置属性
补充:
成功插入
下面文错误 插入
这里我们 插入 了 中文 张三,但是 在 有些电脑可能会插入失败 ,这是为啥呢?
其实这里 与MySQL 的 默认编码方式有关,
这里可能的默认编码方式 为 拉丁文,就会失败
这里我们就需要把数据库给配置成支持中文(配置成utf8 编码方式)
那么 这里就补充 一下如何 进行配置编码方式
1.查看 当前数据库的编码方式。
这里就可以通过
show variables like 'character%';
来查看我们的MySQL 的编码方式
2.通过修改 mysql 配置未见的方式进行处理。
MySQL 中的 增加就 讲到这里了,下面我们 来学习一下 SQL 中 的 核心 也是 最复杂的操作查找操作
查询(Retrieve)
1.全列查询
最基础 的 查找 ,全列查找, 直接把一个表所有
的列和 所有的行都查询出来
select * from 表名
这里 的 * 叫做
通配符
表示一个表的所有列。
这里 的
*
就好比 斗地主中 的
癞子
可以代替 其他牌。
这里 在 使用全列查找前 我们 先来创建一张表,并 插入 数据。
1. 创建 exam_result 表 create table + 表名
create table exam_result (id int, name varchar(20), chinese decimal(3,1), math decimal(3,1), english decimal(3,1));2. 插入 数据 insert into + 表名
insert into exam_result (id, name, chinese, math, english)values(1,'唐三藏',67,98,56),->(2,'孙悟空',87.5,78,77),->(3,'猪悟能',88,98.5,90),->(4,'曹孟德',82,84,67),->(5,'刘玄德',55.5,85,45),->(6,'孙权',70,73,78.5),->(7,'宋公明',75,65,30);3. 查询 表
select * from + 表名
select * from exam_result;
可以看到这里我们 就通过 * (通配符) 将 全部列 都 表示出来,然后 通过 select 查询 出全部的列 和 行 。
注意:
这里 我们 查询的 结果 是 一个
临时表
, 我们 之前 介绍 过 ,数据库的数据是 存储 在硬盘上,所以这里的表 也是 存储到 硬盘上保证持久化存储。
这里我们 通过 selct * from + 表名 查询的结构为临时表,不是在硬盘上,而是在内存中,随着进行了输出之后,数据也就被释放了。
注意: select 操作,不会影响 到 服务器这边硬盘上保存的数据
补充:
select * from + 表名
是 一个 危险 操作
这里如果在生产 环境的服务器上,执行
select * from 表名
很肯能带来灾难 !!!
因为 我们 的 生产 环境保存的数据量 可能是非常大的 (淘宝 就有很多数据 如 : 用户 商品 等 )
这里通过 select * frome + 表名 ,服务 器就会解析 执行, 因为 数据非常大(几个 TB 级别),MySQL 服务器就会疯狂的来读取数据,瞬间把硬盘的IO 带宽 个
吃满 (这里 我们 硬盘 的读取速度 是存在上限 ,尤其是我们的机械营盘) , 同时 MySQL 服务器 又会 立即的返回响应 的数据 由于 返回的响应数据也很大很多也会把网卡的 带宽 吃满.
一旦 服务器 的 硬盘 和 网络 被 吃满 ,此时 数据库服务器 就难以 对其他的客户端的请求 做出响应。
( 生产 环境 的 服务器 ,无时无刻要给 普通用户 提供响应, 如果 吃满了 用户 就会出现卡顿 等 现象)
这里就可以举一个 形象的例子:
有一个海王 在没有 改 之前 他能 一个人 拥有 很多的妹子,妹子A 发出 请求 (相当于 服务器 给客户端发出响应) 要 海王 星期一配他,此时 妹子B 也发出请求
想要 海王 星期二 配她, 这时 海王 都 觉 的 ok (都能完成响应),在后来的 某一天,海王 陷入 了 爱河 决定 改正, 和 某个妹子结了婚 ,这时,他老婆 是不是就占据了他,他接收了其他妹子的请求,就不能去 给 妹子 发出响应。此时 就像 (服务 器 吃满 一样,别的客户端发来的请求,就 不能 去 响应)。
看完全列查询接下来我们来 学习 下 指定列查询
2.指定列查询
语法:
select + 列名(可以为多个列中间使用,隔开) + from + 表名;
如:
这里查询的时候我们 会显式 的告诉数据库要查询的是那些列,这时数据库就会有针对的进行 返回数据了
(这里同样是临时表,在内存 临时保存的一个数据表,随着打印进行,内存就释放,临时表的结果对于数据库服务器的原始数据没有任何影响)。
相比于刚刚 的全列查询 ,这里 的 指定查询更高效。
3.带表达式的查找
指定查询 字段为 表达式
select + 表达式 from 表名;
注释: 查询的时候,同时进行一些运算操作
(一般 列和列之间 进行 运算)。
这里就来演示一下:
- 我们 需要 语文成绩 比原来高10分。 原成绩:
修改后成绩:
可以看到这里 比 原成绩 就 高了 10分
注意: 这里我们 修改的数据 是 临时表上的 数据
而原来 数据库服务器上的数据是没有变化的。
(这里查询结果变 了,只是数据库服务器针对查询的结果进行了加工,把加工后的数据作为临时表显示出来了。)
2.这里来 来 查询 一下 每个 同学的 总分
语文 + 数学 + 英语
这里我们 就 通过
select name, chinese + math + english from exam_result;
成功的 将总分 统计出来了
小细节:
总结: 上述操作,都是针对一个或多个列来进行的运算操作。 也就是 针对指定的列中的每一行都进行同样的运算。
(行和行之间互不影响)
这里我们 可以看到 输出 的 表格 位 chinese + math + english 是不是很长 影响观看体验,那么这里 有没有啥方法 ,将 这个 修改呢,其实 是 有的 ,
那么我们接下来就来学习一下别名操作。
4.别名
语法:
select + 表达式 + as + 别名 + from + 表名;
为查询结果中的列指定别名,表示返回的结果集中,以别名作为该列的名称。
(通过 别名 的方式, 来避免得到的临时表, 名字比较乱)
这里来看
别名前:
别名后:
对比:没有别名和 有别名的 语法区别.
补充:
我们指定 别名的 时候 可以给多个 列 指定别名
别名学完, 我们 来学习 下一个 查询 操作 去重 操作。
5.去重 (distinct)
针对查询结果 去重 (distinct)
针对查询结果把重复的记录给去掉。
语法:
select + distinct + 去重的列名 + frome + 表名;
完成去重操作。
实例:
注意: 这里我们 也是可以 针对多个列进行去重操作,但是这里 的 多个列的值都相同的时候才视为 重复。
举例:
这里可以看到我们的 98 还是 重复的,
这里要去重 要保证 数学成绩(math) 和英语成绩(english) 都相同才能完成去重操作。
去重操作 就 讲到这里(用的 不太多)
下面我们 来学习一下 排序,
6.排序 (order by)
排序:针对查询结果(临时表)进行排序。(不会影响到数据库服务器上的原始数据)
语法:
select + 列名 + from + 表名 + order by + 列名(根据这一列来进行具体排序)/ asc(表示升序) / desc(表示降序)
注: 这里默认 是 asc 升序排序。
演示: 针对数学成绩 进行升序排序。(asc 省略不写 也是 升序)。
可以看到 数学这一列 是 升序的 。
补:MySQL 的排序是 不稳定。
Mysql order by 原理 内部 排序 外部 排序 不稳定排序 根据时间 排序 发生的 问题 数据更新前 数据更新之后 id 623 排到末尾 虽然根据时间 排序 规则,返回的结果没有逻辑 问题 ,但对于用户来说就是消息列表更新之后, 消息顺序发生变动。
升序看完 我们来看一下 降序排序
注意:这里我们 有些数据库记录中 是 带有NULL值的,像这样的 NULL 认为是 最小的 (如果按升序就在最前面,按照降序那么就在最后面)。
这里我们 先 插入 一个张三 让他的 语文 数学 英语成绩 为 NULL
这里来看 张三 跑到了 最前面 ,这里 没有 给 排序 方式 所以 默认 为 升序(所以 NULL 会被视为 最小值)。
上面我们 学习了 表达式, 学习了 别名, 这里我们的 排序 还可以通过 表达式 和 别名来进行排序。
1.根据总成绩来进行排序
演示:
这里 依据 总成绩 来排序,会发现 会很长,那么我们 还可以通过 别名 来 进行排序。
2.根据总成绩 的别名来进行排序
演示:
补充: 这里排序 也可排序 字符串 但 不完全是按照字典序进行排序的(创建数据库通过 collate : 来指定 数据库字符集的校验规则)。
这里 字典序 只针对英文 有意义。 这里 排序中文就会有问题。
排序 也可以 指定多个 列进行排序(多个列排序的时候是有明确的优先级的)
这里 排序 通过 order by 来指定 对各列进行排序(这里多个列之间使用
,
(逗号)隔开)
会先根据第一个列进行排序,如果 第一个列结果相同,相同结果之间在通过第二个列排序。
演示:
这里 来看我们的 唐山藏 和 猪悟能 的 数学成绩相同, 那么就会 在根据 给定的 语文成绩 排序, 因为 没给 排序规则,默认是 升序,那么 语文成绩低 的唐山藏排在了 猪悟能的前面。
注意: 如果不指定多个列的话,只能指定一个列,此时如果结果相同,彼此之间的顺序是不可预期的。
排序查询就 这么多,下面我们来学习一下我们的条件查询。
7.条件查询 (where)
在 select 的 后面 加上一个 where 字句 ,后面跟上 一个具体的筛选条件。
语法:
select + 列名 + from + 表名 where + 条件;
这里的查询结果 就会把满足条件的记录保留,把不满足 条件的记录给过滤掉。
在 演示 条件 查询 前我们需要 了解 这里的 条件要如何完成。
- 比较运算符:
运算符说明>, >=, <, <=大于,大于等于,小于,小于等于=等于,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是 NULLis not NULL不是 NULLlike模糊匹配。% 表示任意多个(包括 0 个)任意字符;_ 表示任意一个字符
注意 :
=
表示 比较相等,而不是赋值(这里 又与 java 不同了。)
NULL = NULL => 结果 仍然 是 NULL ,这里NULL 会视为为假 , 条件不成立。
这里
<=>
也是 比较相等,用法和
=
基本一至,只是使用
<=>
比较空置结果为真。(NULL <=> NULL 进行比较结果为真)
between a0 and a1(区间比较) 这里 构成的 是 一个 闭区间 如 [a0,a1] ,这里 包含 了 a0 和 a1, 相比 java中 大部分 都是左闭右开 [ ) 这种形式 还是有很大区别的。
in (opetion,…) 通过 这个( ) 给 出的几个 固定值,判定当前结果 是否在这个几个 值当中 。
is NULL 和 is not NULL 也是 专门 与 空置比较。
like 能够 针对 结果 进行"模糊匹配"。(后面会举例子)
逻辑运算符:
运算符说明and
(相当于 &&)多个条件必须都为 true(1),结果才是 true(1)or
(相当于 || )任意一个条件为 true(1), 结果为 true(1)not
(相当于 !)条件为 true(1),结果为 false(0)
了解 完 上面 ,那么接下来就 来演示 一下。
1.查询 英语不及格的同学成绩(条件为 < 60)
这个条件就会针对查询结果进行筛选
服务器就会遍历表中的每一条记录,如果记录符合条件,就会返回客服端,如果不符合条件,就跳过。
2.查询 语文 成绩 好于英语成绩的同学(两列之间的比较)
注意:
这里 指的 是对同一行的 语文 和 英语 之间进行 比较。这里 不会涉及 行与行之间的 比较。
补充:
这里 select 后面 其实就是需要 打印的 列名,我们 可以省略 不会影响 后面条件的 比较。(where 后面的条件和前面写的列和列之间没有关系)。
3.查询 总分 在 200 一下 的同学 ( 条件 总分 < 200)
通过 表达式 和 条件 来进行 查询 和 筛选 。
这里 能够使用表达式 ,那么 这里 能不能 使用别名来 代替 表达是呢?
来看这里就 报 错误了,报错内容为 不认识 total这个。
这里 就需要注意:
where 字句 不能使用别名
。
查询 语句 ,要查询的 列 和 where 后面访问的列之间是没啥 关联关系的。
下面 我们来使用逻辑运算符。
逻辑运算:
and
这里 我们 来 使用 and 表示 语文 大于80 和 英语 大于 80 的同学
演示:
or
查询 语文 大于 80 的同学 或者 英语 大于 80 的 同学
演示:
这里
and
和
or
是由 先后之分 的
注意事项:
and 和 or 的 先后之分, 表达式如果同时有 and 和 or,先计算 and 后 计算 or
这里打破 优先 级 可以 使用括号。
这里就是 先计算 and 在 计算 or
看这里 的 曹孟德 数学 大于 70 但 英语 小于 70 这里 and 就不成立 ,但是 他的 语文成绩 大于了 80 所以 整体 还是满足条件的。
在比如 , 孙权 语文 不满足, 但 后面满足,这里 也打印出来了
这里 加上括号来看一下 结果。
这里 会先算 or 在算 and
这里 曹孟德 就没有了。
条件 查询 演示 完 那么 接下来我们来看一下 范围查询
范围查询 :
between ... and ....
注意: between … and… 这里 为 [] 左后两边 必须包含。
in
查询数学成绩是 58 或者 59 或者 98 或者 99 分的同学及数学成绩
这里 只要数学成绩 是 括号里的 任意其中的一个值 都能查询。
这里 还可以 通过 or 这种写法来实现 类似效果。
这里 相比 in 这种 写法相对麻烦点。
模糊查询:
模糊匹配 其实 就相当于,描述了一个规则,但凡是符合这个规则都会被筛选出来,
**
like
** 搭配通配符来使用,只要对方的字符串符合你此处描述的一个形式 就 ok。
通配符说明%代表任意个字符(也包含0个字符)_代表任意一个字符(类似模式匹配)
 
代表任意个字符%
演示:
查找 姓 孙的 同学的成绩.
这里
孙%
就能 匹配 孙 开头的 字符串,
(这里 孙 一个字也能匹配到, 孙afafafafafa后面跟 一大堆 的 也同理)
但是 ab 孙 ab 这种 就匹配不到。bbb 孙 同样 也匹配不到。
这里
%孙%
此时 孙 前面 可以 有 任意字符,后面一可以有任意字符。
像 aaaa 孙 , 孙 bbbb , aaaa 孙 bbbb 都可匹配到, 但 完全没有 孙 就 匹配不到如:aaaabbbb, 所以这种 名字含有 孙 都能匹配到。
只能匹配到一个任意字符。_
含有 一个
_
:
含有两个
__
:
含有 三个
___
:
这里 为空 , 没有 4个字的名字。
总结: 有几个下滑线就能匹配到几个字符。
8.分页查找
SQL 中 通过 limit 来实现分页查询
这里我们的 表 里 有 8条记录,那么我们通过 limit 一页显示 3 条记录。
这里 limit 3 为只 取结果 中的前3 条
这里我们 想要 获取 下一页的 记录呢?
这里就就可以 使用
offser
来完成
注意: 这里 的意思 是 从下标为 3 的 记录开始再往后 在3 条。 (这里 offer 下标是从0 开始,但是写成 offset 3 就是 从 下表为 3 开始)。
补充: 知道 了 offer 那么 我们 还可以 这样查询第一页:
另外 这里 limit 同样 可以 搭配条件,以及 order by 等操作 来使用。
演示: 查找出总成绩 前3 面的 同学姓名
补充 : 回忆 一下 提过 selsect * from 表名,对于生产环境的 数据库来说 ,非常危险。
这里 我们的 分页 查询, 就 相对 比较安全
这里 危不危险 看到 是返回结果的数据量是多还是少 (返回的数据量 少,其实 就还好,返回的数据多,就比较危险)。
那么这里 就可以通过 where (限制更严格的条件)和 limit(使用limit更加稳妥) 让 SQL 不那么未向
补: 查询语句 和NULL进行比较
运算符说明=等于,null不安全,例如 null= null的结果是 null<=>等于,null安全,例如 null<=> null的结果是 true(1)is null是 nullis not null不是 null
1.查询语文成绩为空的同学信息
错误 写法: 使用
=
正确写法: 使用
<=>
这里 就 成功 将 张三 查询出来了。
这里还能 使用
is null
来 查询是 为空 的情况
这里 同样能 将 语文成绩 为空的 张三 找出来。
本就 先 讲到 SQL 的插入 与 查询 ,
版权归原作者 牧.. 所有, 如有侵权,请联系我们删除。