前言
在前面,我们已经了解了什么是MySQL,MySQL的常见名词和常用字段类型,MySQL表结构的常用语法。也就是说,现在的我们已经知道了什么是数据库,什么是表,怎么键表,怎么修改表,怎么添加字段等方面的内容,那么接下来就该学习数据库中数据相关的语法了。
CRUD
我们经常能听到有人说crud,那么什么是crud呢?
crud是指在做计算处理时的增加(Create)、读取(Read)、更新(Update)和删除(Delete)几个单词的首字母简写。crud主要被用在描述软件系统中数据库或者持久层的基本操作功能。
没错,crud就是我们今天要学习的语法了,也就是我们常说的增删改查。
在表结构知识里面,我们创建了一张高考学生表,那么今天的语法学习,也在这张表的基础上完成。
ps:昨天的表,其实只是做教学用,实际工作的时候,这张表中还是有许多问题的。比如电话号码,我们通常是存123****4567这种格式外加一个密文字段,再比如表应该添加一个删除状态,用于业务中数据的假删,因为在实际工作中是不允许物理删除数据,只允许逻辑删除。所以提前说一下,这个表只做教学使用,工作中设计表的一些思路,规范这些,在讲完入门知识,进阶知识后我补充上去。
增
当我们创建好一张表以后,通常情况下这个表是空的,没有数据,随着业务的进行,我们的应用就会往这个表写入数据,但是我们这里是单独学习,所以只能靠手敲来新增数据。
语法
INSERT INTO table_name(column_1,column_2,column_3,column_4,column_5,column_6 )
VALUES(value_1,value_2,value_3,value_4,value_5,value_6),
(value_11,value_22,value_33,value_44,value_55,value_66);
- INSERT:关键字,表示添加。
- INTO:关键字,表示向哪个表添加。
- table_name:表名,表示你要想写入的数据的表。
- column_1:列名,也可以叫字段名,后面23456同理,表示这个表中的字段。
- VALUES:关键字,后面接要添加到表中的值。
- value_1: 列1的值,后面的23456分别对应列的值。
示例
在这里祝高考学子都考一个满意的分数,最好满分。
INSERT INTO college_entrance_examination_student (name, sex, birth_date, email, phone, total_score, chinese_score, math_score, english_score, science_score, humanities_score, created_at)
VALUES
('李四', 'M', '2002-06-15', 'lisi@example.com', '13900139000', 700, 125, 140, 130, 240, 235, CURRENT_TIMESTAMP),
('王芳', 'F', '2002-07-20', 'wangfang@example.com', '13500135000', 680, 115, 135, 125, 240, 235, CURRENT_TIMESTAMP),
('赵六', 'M', '2002-08-25', 'zhaoliu@example.com', '13600136000', 710, 130, 145, 130, 245, 235, CURRENT_TIMESTAMP),
('刘莉', 'F', '2002-09-30', 'liuli@example.com', '13700137000', 660, 110, 130, 120, 240, 230, CURRENT_TIMESTAMP);
删
这里的删除是属于物理删除,也就是说这条数据删掉以后,在你的数据库就找不掉了(除非通过其他手段恢复)。在实际工作中我们基本不会有这种物理删除的场景,所以删除语法了解一下即可,但是别乱用。
语法
DELETE FROM table_name WHERE condition;
- DELETE:关键字,表示删除。
- FROM:关键字,表示当前操作来自于哪张表,后面接表名
- table_name:表名,估计已经不用我说了。
- WHERE:关键字,表示之前操作在什么情况下会进行。如果没有后续条件,可以不用表示无条件操作。
- condition:条件。满足这个条件的数据会被删除。通常是某个字段的某个取值范围。可以不填条件,删除全部,慎重!
示例
由于我们数据不多,而且都是满分的数据,我们这里不做实际删除,只写个语句示例。
# 删除名字是'李四'
DELETE FROM college_entrance_examination_student WHERE name = '李四';
# 删除名字中带有三字的
DELETE FROM college_entrance_examination_student WHERE name = '%三%';
# 删除姓王的
DELETE FROM college_entrance_examination_student WHERE name = '王%';
# 删除ID大于2的
DELETE FROM college_entrance_examination_student WHERE student_id > 2;
条件各种各样,全看你心情,这里不再做示范了。
改
表中最开始插入的数据的值也许会随着业务的进行发生改变,这个时候就要通过修改语句来对表中数据的值。
语法
UPDATE table_name SET column_1 = value_1, column_2 = value_2, ... WHERE condition;
- UPDATE:关键字,表示修改。
- table_name:表名。
- SET:关键字,表示设置。
- column_1 = value_1:表示把列1的值设置成值1,如果你修改很多列,用逗号隔开,注意到下一个关键之间不需要逗号。
- WHERE :关键字
- condition:修改条件,与删除条件类似,满足这个条件的数据会被修改。没有条件则是全表修改,慎重!
示例
# 把张三的电话改成13900139001(我们的数据中没有张三,只有满足条件的数据才会被修改)
UPDATE college_entrance_examination_student SET phone = '13900139001' WHERE name = '张三';
# 把ID等于1的名称改成赵六六
UPDATE college_entrance_examination_student SET name= '赵六六' WHERE student_id= 3;
查
查询使我们的重头戏,因为查询是用的最多的业务,各种各样的查询业务。增改也就那样,玩不出啥花来,查询就不一样了。
不过本文也不会写很花里胡哨的查询,讲清楚基本的查询,内置函数等就差不多。更复杂的查询在进阶的时候讲。
基础查询
SELECT column_1 AS alias_1,column_2 alias_2,column_3,... FROM table_name;
- SELECT:关键字,表示查询
- column_1:列名,多个用逗号拼接,到下个关键字FROM时不需要逗号。表示你想查询哪些列的值出来,* 表示查询全部,实际上这样写的不多。
- AS:关键字,表示起一个别名,可以接在字段后面和表名后面。采用表别名+.方式,可以快捷的指定表中的列。当你在图形化软件中的编写代码时采用别名+.的方式有惊喜哦!
- alias_2:也是起一个别名,这种方式省略了AS关键字,这里也提一下,防止有看到不明白这是什么写法。
- FROM:关键字。
- table_name:表名。
示例
# select * 查询,无条件
SELECT * FROM college_entrance_examination_student;
# 很多时候我们不需要那么多字段的值,就直接指定需要查询的字段,节省资源
SELECT
s.student_id AS '学生ID',
s.name AS '学生姓名',
s.phone '学生电话'
FROM
college_entrance_examination_student AS s;
在后面的查询示例中,不会再出现select * 的查询方式。
条件查询
SELECT column_1,column_2,column_3,... FROM table_name WHERE condition;
- SELECT:关键字,表示查询
- column_1:列名。
- FROM:关键字。
- table_name:表名。
- WHERE :关键字。
- condition:查询条件。
示例
# 很多时候我们不需要那么多字段的值,就直接指定需要查询的字段,节省资源
SELECT
s.student_id AS '学生ID',
s.name AS '学生姓名',
s.phone '学生电话'
FROM
college_entrance_examination_student AS s
WHERE
s.student_id > 2;
顺序查询
很多时候,我们需要对查询出的数据进行排序,甚至需要对多个字段排序,这个时候就要用到顺序查询。
SELECT column_1,column_2,column_3,... FROM table_name ORDER BY column_1 SORT, column_2;
- SELECT:关键字,表示查询
- column_1:列名。
- FROM:关键字。
- table_name:表名。
- ORDER BY:关键字,后面接列名,表示根据某列的值进行排序,多个字段逗号拼接
- SORT:排序方式。取值为ASC(正序),DESC(倒序),不填默认ASC。
示例
# 不填默认正序ASC
SELECT
s.student_id AS '学生ID',
s.name AS '学生姓名',
s.phone '学生电话' ,
s.birth_date '学生生日'
FROM
college_entrance_examination_student AS s
ORDER BY s.birth_date;
# 指定倒序查询
SELECT
s.student_id AS '学生ID',
s.name AS '学生姓名',
s.phone '学生电话' ,
s.birth_date '学生生日'
FROM
college_entrance_examination_student AS s
ORDER BY s.birth_date DESC;
# 多字段排序,先根据理科成绩倒序,再按ID排序。
SELECT
s.student_id AS '学生ID',
s.name AS '学生姓名',
s.phone '学生电话' ,
s.science_score
FROM
college_entrance_examination_student AS s
ORDER BY s.science_score DESC, s.student_id;
分页查询
有时候因为数据太多了,我们没办法一次性查出所有数据,这个时候就要用到分页查询。
SELECT column1, column2, ...FROM table_name LIMIT offset, count;
- SELECT:关键字,表示查询
- column_1:列名。
- FROM:关键字。
- table_name:表名。
- LIMIT :关键字, 表示分页
- offset:偏移量,表示开始返回的数据在所有数据的中偏移量。从0开始。注意这个偏移量,会随着页数的增加变化。
- count:每页查询的数据量。
示例
# 偏移量是0,页大小是2.这个对应到页面上去,就是查询第一页数据,每页查询2条数据。
SELECT
s.student_id AS '学生ID',
s.name AS '学生姓名',
s.phone '学生电话' ,
s.science_score
FROM
college_entrance_examination_student AS s
LIMIT 0, 2;
# 偏移量是2,页大小是2.这个对应到页面上去,就是查询第二页数据,每页查询2条数据。到这里可以类推
# LIMIT 4, 2是第三页, LIMIT 6, 2是第4页。
SELECT
s.student_id AS '学生ID',
s.name AS '学生姓名',
s.phone '学生电话' ,
s.science_score
FROM
college_entrance_examination_student AS s
LIMIT 2, 2;
# 偏移量超过数据总数时,返回空结果集
SELECT
s.student_id AS '学生ID',
s.name AS '学生姓名',
s.phone '学生电话' ,
s.science_score
FROM
college_entrance_examination_student AS s
LIMIT 4, 2;
分组查询
很多时候我们需要根据字段不同的值统计数据,这个时候就用到分组查询。
SELECT column_1, COUNT(column_2), AVG(column_2), ...FROM table_name GROUP BY column_1;
- SELECT:关键字,表示查询
- column_1:列名。
- COUNT():内置函数,统计数量
- AVG():内置函数,统计平均值
- FROM:关键字。
- table_name:表名。
- GROUP BY :关键字, 表示分组
- column_1:分组字段,根据此字段所有值进行分组,相等的值分在一组。
示例
SELECT sex '性别', COUNT(*) '人数', AVG(total_score) '总分平均分'
FROM college_entrance_examination_student AS s
GROUP BY sex;
写在最后
到这里入门的方法已经讲完了。后面会开始将更加复杂的知识。
比如更加复杂的查询,条件排序分页分组混在一起,多表混在一起,更多的内置函数,自定义函数等等。
比如事务的知识,索引的知识,引擎的知识,对MySQL架构更深入的知识等等。
后面文章,对我来说算是复习及再一遍学习,可能没法一天一篇,我还正在自学Python。时间有点难顶,尽力。
之前我就说过每个人对入门的定义是不一样,对于一个0开始的人,我觉得这里入门已经算结束了。如果有不同意见,别问你是对的。
好了,各位加油!!!