哈喽,大家好!我是保护小周ღ,本期为大家带来的是 MySQL 数据表中数据的基本处理的操作,数据表的增删改查,更多相关知识敬请期待:保护小周ღ *★,°*:.☆( ̄▽ ̄)/$:*.°★*
一、 添加数据(insert into )插入
语法:
insert into 表名([字段名1,字段名2,字段名3])values('值1'),('值2)',('值3')...
into 其实可以不用写,可以根据个人意愿决定。
插入数据的时候在没有约束的情况下可以插入null 。
1.1-- 插入时匹配对应的值
desc 【表名】展示表的结构
这种方式插入数据,需要指定需要插入的列名(字段),然后根据列名(在记录没有约束的情况下)插入数据。
意思就是你可以只插入“李四" 独占一行。注意观察插入日期的格式。
1.2 -- 不声明字段新增数据,必须把所有字段的值都写上
此处使用now() 函数来插入日期时间。
1.3 -- insert语句后面可以加多个VALUES,可以添加多个数据
多行插入只需要写一个 values 即可,多行插入的性能也是优于 单行插入的,因为MySql 本质上就是客服端服务器的程序,客服端发出指令,服务器进行相应的处理,一行一行的插入意味着反复发送指令,这个点不知道大家能否能 get 到呢?
注意事项:
字段和字段之间使用英文逗号隔开
字段是可以省略的,但是后面的值必须要一一对应
可以同时插入多条数据,VALUES后面的值需要使用,隔开即可。
value,是一个具体的值,也可以是一个函数
二、查询数据 (select)
现在才是Mysql 学习中的重点,查询数据,查找表的数据实际上建立了 一张临时的表, 不会对原先的表产生改变,这张临时表只是在客户端展示一下,生命周期很短。
用户在客户端输入sql 语句,通过请求发给服务器,服务器根据请求相应得把查询结果从存取器中读取出来,通过一系列介质(网络等)传输给客服端,客服端把这些数据以临时表的形式展示出来。
2.1 基础查询
语法:
SELECT 字段,...FROM 表
以student 表为例。
-- 查询所有的员工 SELECT 字段 FROM 表
如果我们需要一次性查找所有的字段,其实不用讲所有字段全部列举出来,可以使用 ”*“ 来替代。
可以看出两者的结果是一样的。
-- 查询指定字段,ID + Name
-- 别名,给查询结果起一个名字 AS, 可以给字段取别名,也可以给表取别名
-- as可以加也可以不加
这样看起来舒服多了吧,哈哈,as 不加也可以运行,但是最好是加上,避免将别名看成字段。
-- 别名可以简化字段或者表的名称,更精准的输入
-- 给student表起别名为stu
不使用 as 也是可以的,在复杂的查询中,使用别名查询,能提升效率。
2.2 表达式查询
表达式查询也叫查询字段为表达式,为了方便展示,博主这里创建一个 学生成绩表(grade)。
包含 id (学号), name (姓名) ,chinese (语文), math (数学),english (英语) 这几个字段。
表创建成功后,接下插入几条数据。
1, 张三, 80, 90, 99,
2, 李四, 88, 76, 60 ,
3, 王五, 98, 90, 88,
4, 张三, 58, 25, 59,
例题:查找 grade 成绩表,所有学生的总成绩,显示字段 id, name, “总成绩" ;
可以看出为了查询总成绩,我们直接将 语文,数学,英语,字段相加形成一个新的字段展示出来,然后利用 as 重命名为 “总成绩 ”。如果不使用 as 字段就展示 chinese + math + english.
此时 三个字段相加型成一个新的字段的查询就叫做表达式查询(加减乘除都可),表达式查询的本质是让列和列之间进行运算 (而不是行和行之间)。
例题:查找 grade 成绩表,所有学生的语文成绩减 10 分,显示所有字段。
由此可见,查找表的数据实际上建立了 一张临时的表,这张临时表跟硬盘上的表没有任何羁绊,临时表只是在数据表的基础上产生的条件拷贝,不会对数据表产生任何影响。
2.3 去重查询 (distinct)
使用DISTINCT关键字对某列数据进行去重;
去重大家应该都能够理解是什么意思,想象这样一种环境,查找全班同学的 性别,根据性别去重操作后,得到的结果只有两种性别“男”,”女”,在学校的教师表中,查找职称,根据职称去重操作后,就可以展示每一种职称且是不重复的,以成绩表(grade)为例,有两个名字叫张三的同学,我们根据姓名去重后看看有什么效果。
作用:去除SELECT查询出来的结果中重复的数据,只显示一条
可以看出重复的姓名已经去掉了,distinct 针对多列去重的时候,要求这些列值全部都相同才视为重复。
2.4 排序查询 (order by)
语法:
--asc 为升序排序(从小到大)
--desc 为降序(从大到小)
一般是对查询数据的结果根据某个字段或者是多个字段进行排序。
order by 【字段】 asc 或 desc 【字段】 asc 或 desc …… ;
-
如果查询语句没有添加 order by 子句,那么查询的结构不保证是有序的,不可以依赖没有经过排序的查询结果的顺序。
-
null 数值代表表中某项数据为空,视为比任何值都小,升序出现在最上面,降序出现在最下面。
例题:查找 grade 成绩表,所有学生的总成绩,显示字段 id, name, “总成绩" 降序,升序排序
升序:如果最后不添加 asc 默认也是 升序排序。
降序:desc
使用别名排序
可以对多个字段进行排序
查询同学各门成绩,依次按语文升序 ,数学降序,英语升序的方式显示
这句话是什么意思呢,优先按照语文成绩升序排序,当遇到相同语文成绩时,再比较两者数学成绩,降序排序,如果此时数学成绩也相同,就按照英语升序排序。 多字段排序时,字段之间使用 “,”间隔即可。
排序优先级根据顺序来。
2.5 条件查询 (where)
作用: 检索数据中==符合条件==的值
搜索的条件由一个或者多个表达式组成!结果 布尔值
条件查询相当于针对数据库的表中的数据进行遍历,取出每一行数据,把数据代入到条件中,判断条件是否符合,如果返回的条件为真,这个记录就保留,作为结果集的一部分,直到表中的数据全部遍历完毕,然后服务端会把结果集返回给客户端,客户端将数据以临时表的形式展示给用户。
别名不能作为 where 条件和当前 sql 的执行循序有关,当然这也是 mysql 对于语法规定的一部分。
比较运算符
2.5.1 基本比较查询
例题:查找英语成绩大于等于80分的同学
例题:查找姓名为张三同学成绩
例题:查找总成绩大于等于 250 分的同学的总成绩及相关信息
1. 条件查询可以根据两列进行比较,例如:语文成绩大于数学成绩的同学的信息
2. where 条件可以使用表达式,但是不能使用别名。
3.别名不能作为 where 条件和当前 sql 的执行顺序有关,当然这也是 mysql 对于语法规定的一部分。
2.5.2 逻辑运算符
例题:查找姓名为张三 且 各科成绩在80 分以上的同学的信息
例题:查找 语文成绩在80 分 或者 英语在 90分以上的同学的信息
例题:查找姓名为张三 且 语文成绩 大于 50分 或者 语文成绩 大于 80
1. 如果一个 where 中又存在 and 又存在 or 先执行 and 后执行or 。
2. and 的优先级高于 or ,同时使用时,需要使用小括号()包裹优先执行的部分。
2.5.3 模糊查询,范围查询
范围查询:
-
between……and…… 这个区间是前闭后闭的区间。
例题:查询数学成绩在 [80,90] 分的同学及其数学成绩
-
使用 and 也可以实现该功能呢
两者是一样的运行机制,结果也没有什么区别。
-
in -- ----------------------- in(具体的一个或者多个值) ------------------------
例题:查找姓名为张三 且 语文成绩在80 或者 58 分的同学的信息
模糊查询:like
-- 查询 " 张“开头的员工姓名
-- like结合 %(代表0到任意个字符),“%任意字符%”,表示包含字符匹配。
-- 查询结尾是‘四”开头仅一个字的员工
like 结合“_”(匹配一个字符)。
-- 查询姓名是“张“开头的员工信息 且 语文成绩大于等于 80 的同学信息。
null 查询
is not null 表示非空,is null 代表 空。
--查询表中姓名非空的学生的信息
--查询表中姓名 空 的学生的信息
为了方便展示这里博主先插入了一条 含有 null 的记录。
2.6 分页查询 (limit)
-- 100万,为什么要分页?缓解数据库压力,给人的体验更好
-- 语法: limit 起始行, 页面的大小,下标是从 0 开始的。区间是左闭右闭
-- 从 0 开始,筛选 n 条结果
SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT n;
-- 从 s 开始,筛选 n 条结果
SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT s, n;
-- 从 s 开始,筛选 n 条结果,比第二种用法更明确,建议使用
SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT n OFFSET s;
注意: s 是起始行数, n 是页面最大显示记录数。
查询区间 [1,2],
当我们对数据进行分页的时候,如果查询结果不足我们按页分配的记录数, 不会有任何影响,照常显示。
分页查询常常运用于查询结果的最后,给用户一个好的视觉体验。
三、修改数据 (update)
语法:
update 【表名】set 【字段】新值;
初始表:
例题:将id 为4的同学的姓名改为张小三
也可以多个字段修改数据。
例题:将id 为5的同学的姓名改为 赵六,语文成绩修改为 90分
例题:所有同学的语文成绩 减去10分
使用updete 修改数据如果不添加条件限制修改范围则是整个表的被修改列数据都会发生改变。
四、删除数据
4.1 删除数据(delete)
delete from 【表名】where 【条件】
例题:删除张三同学的信息
注意:
在删除数据(记录)的时候注意要添加条件,条件的选择很重要,一般选择不可重复的值作为条件,便于精准定位,例如每个人的身份证号,如果不写条件的话,表中的数据会一条一条的删除。
-- 删除数据(避免这样写,会全部删除)
delete from emp
4.2 清空表数据(truncate)
truncate
作用:完全清空一个数据库表,表的结构和索引约束不会变
-- 清空 student 表
TRUNCATE `student`
delete的truncate区别
-
相同点:都能删除数据,都不会删除表结构
-
不同:
-
truncate 重新设置自增列计数器会归零
-
TRUNCATE TABLE相当于无条件的DELETE FROM
-
delete 可以回滚事务
-
truncate不支持事务
-
delete 后面可以添加where条件
-
delete 删除数据会一条一条的删除,而truncate 会瞬间清空表中的所有数据。
-- delete支持事务
-- 开启事务
START TRANSACTION;
-- 从test删除所有数据
DELETE FROM student;
-- 从test表查询数据
SELECT * FROM student;
-- 回滚
ROLLBACK;
-- 提交
COMMIT;
-- truncate不支持事务
START TRANSACTION;
TRUNCATE table student;
SELECT * FROM student;
ROLLBACK;
SELECT * FROM student;
关于事务的概念会在后期的文章中出现。
总结:无论是各种类型的查找数据还是,修改删除等,实际上都还是离不开对数据表数据的遍历,条件越复杂对系统的消耗越大这是无可避免的。
好了好了,关于查询就浅浅的说一一下啦,关于查询还有许多知识,一篇写不下,下篇博客将着重点将查询的进阶~
至此,Mysql 系列的第三篇内容博主已经分享完了,希望对大家有所帮助,如有不妥之处欢迎批评指正。
本期收录于博主的专栏——Java & MySQL,适用于编程初学者,感兴趣的朋友们可以订阅,查看其它“MySQL 数据库以及Java JDBC 编程的相关知识”。
下一期:MySQL 数据库的约束和查询的进阶
感谢每一个观看本篇文章的朋友,更多精彩敬请期待:保护小周ღ *★,°*:.☆( ̄▽ ̄)/$:*.°★*
遇见你,所有的星星都落在我的头上……