CRUD : 即增加(Create)、查询(Retrieve)、更新(Update)、删除(Delete)四个单词的首字母缩写。
在了解数据库表的增删改查之前,我们需要先进行一些准备工作,即在选中的数据库中准备两张表:
-- 创建一张学生表
DROP TABLE IF EXISTS student;
CREATE TABLE student (
id INT,
sn INT comment '学号',
name VARCHAR(20) comment '姓名',
qq_mail VARCHAR(20) comment 'QQ邮箱'
);
-- 创建考试成绩表
DROP TABLE IF EXISTS exam_result;
CREATE TABLE exam_result (
id INT,
name VARCHAR(20),
chinese DECIMAL(3,1),
math DECIMAL(3,1),
english DECIMAL(3,1)
);
对于类来说:每一行就是一个学生,每一列就是一个学生的某个属性。
class student{
private int id;
private int sn;
private String name;
private String qq_mail;
}
等后面了解到MyBatis等框架的时候就可以用到了。
插入两条记录,VALUES后面括号里的数量必须和定义表的列的数量及顺序一致。例如:
INSERT INTO student VALUES (100, 10000, '唐三藏', NULL);
INSERT INTO student VALUES (101, 10001, '孙悟空', '11111');
插入两条记录,VALUES后面括号里的数量必须和指定列数量及顺序一致。例如:
INSERT INTO student (id, sn, name) VALUES (102, 20001, '曹孟德'),(103, 20002, '孙仲谋');
如果没有指定某个字段的值,那么默认是NULL,但是注意,后期会了解到约束。
假如我们想对timestamp这个数据类型进行插入操作,则插入的格式必须写为
'2024-01-25'
或2024-01-25 18:55:42
。
我们需要先在前面创建的exam_result表中插入一些数据,具体插入操作如下所示:
INSERT INTO exam_result (id,name, chinese, math, english) VALUES
(1,'唐三藏', 67, 98, 56),
(2,'孙悟空', 87.5, 78, 77),
(3,'猪悟能', 88, 98, 90),
(4,'曹孟德', 82, 84, 67),
(5,'刘玄德', 55.5, 85, 45),
(6,'孙权', 70, 73, 78.5),
(7,'宋公明', 75, 65, 30);
SELECT * FROM 表名;
*
代表当前表当中的所有字段。通常情况下不建议使用*
进行全列查询。因为:
指定列的顺序不需要按定义表的顺序来。例如:
SELECT id, name, english FROM exam_result;
SELECT id, name, 10 FROM exam_result;
SELECT id, name, english + 10 FROM exam_result;
SELECT id, name, chinese + math + english FROM exam_result;
取别名的作用: 就是当列名或者表名太复杂了,比如太长了,其此时就可以用别名代替!例如:
SELECT id, name, chinese + math + english as 总分 FROM exam_result;
SELECT id, name, chinese + math + english as 总分 FROM exam_result as exam;
当然 as 也可以省略!即上面两个示例可以修改为:
SELECT id, name, chinese + math + english 总分 FROM exam_result;
SELECT id, name, chinese + math + english 总分 FROM exam_result exam;
使用 DISTINCT 关键字对某列数据进行去重。例如:
SELECT math FROM exam_result;
SELECT DISTINCT math FROM exam_result;
SELECT id,name, DISTINCT math FROM exam_result;
这样的SQL语句是否可以去重?运行之后你会发现,不可以!SELECT DISTINCT math,id,name FROM exam_result;
这样以后,运行结果并没有把两个数学成绩为98去掉一个,而是都选择了保留。那么为什么会发生这种现象呢?去重的原理又到底是什么?SELECT DISTINCT math,id,name FROM exam_result;
中的三个字段同时重复的时候,才会去重!select * from exam_result order by math;
或select * from exam_result order by math asc;
。select * from exam_result order by math desc;
。desc 表名;
,另一次就是现在表降序。drop table if exists desc;
,然后再create table desc(id int,name varchar(10));
。但是你运行之后发现会报错,不能运行通过。drop table if exists `desc`;
create table `desc`(
id int,
name varchar(10)
);
SELECT name, chinese + english + math FROM exam_result ORDER BY chinese + english + math DESC;
;SELECT name, chinese + english + math total FROM exam_result ORDER BY chinese + english + math DESC;
,运行之后我们发现是可以的,成功了!SELECT name, total FROM exam_result ORDER BY chinese + english + math total DESC;
这样写能成功吗?这时我们发现不可以!错误原因:查询的顺序问题,它会首先执行SELECT name, total FROM exam_result;
,但是此时并不认识total是啥,因此会报错。SELECT name, chinese + english + math total FROM exam_result ORDER BY total DESC;
则也是可以成功的!SELECT name, math, english, chinese FROM exam_result ORDER BY math DESC, english, chinese;
总结:
SELECT name, english FROM exam_result WHERE english < 60;
。SELECT name, english FROM exam_result WHERE english < 60 order by english;
。SELECT name, english FROM exam_result order by english WHERE english < 60;
这样写是不可以的,会报错!SELECT name, math FROM exam_result WHERE math IN (58, 59, 98, 99);
SELECT name, math FROM exam_result WHERE math = 58 OR math = 59 OR math = 98 OR math = 99;
。SELECT name, math FROM exam_result WHERE math not IN (58, 59, 98, 99);
。SELECT name FROM exam_result WHERE name LIKE '孙%';
这条SQL语句所匹配的数据一定是以 孙 这个字开始的,将匹配到孙悟空、孙权。SELECT name FROM exam_result WHERE name LIKE '%孙%';
这条SQL语句将匹配的数据一定是以 孙 这个字在中间的。SELECT name FROM exam_result WHERE name LIKE '%孙';
这条SQL语句所匹配的数据一定是以 孙 这个字结尾的。SELECT name FROM exam_result WHERE name LIKE '孙_';
这条SQL语句所匹配的数据一定是以 孙 这个字开始的,且记住一个下划线仅对应一个模糊匹配的字,将匹配到孙权。SELECT name FROM exam_result WHERE name LIKE '孙__';
这条SQL语句所匹配的数据一定是以 孙 这个字开始的,且记住一个下划线仅对应一个模糊匹配的字。所以这条语句将只会找到以孙开头且有3个字的,后两个字是模糊匹配的,将匹配到孙悟空。比较运算符:
运算符 | 说明 |
---|---|
>, >=, <, <= | 大于,大于等于,小于,小于等于 |
= | 等于,NULL 不安全,例如 NULL = NULL 的结果是 NULL |
<=> | 等于,NULL 安全,例如 NULL <=> NULL 的结果是含有NULL的,数据NULL不会被忽略 |
!=、<> | 不等于,NULL 不安全,例如 NULL = NULL 的结果是 NULL |
BETWEEN a0 AND a1 | 范围匹配,[a0, a1],如果 a0 <= value <= a1,返回数据 |
IN(option,…) | 如果是 option 中的任意一个,返回数据 |
IS NULL | 是 NULL |
IS NOT NULL | 不是 NULL |
LIKE | 模糊匹配,% 表示任意多个(包括 0 个)任意字符;_ 表示任意一个字符 |
逻辑运算符:
运算符 | 说明 |
---|---|
AND | 多个条件必须都为 TRUE(1),结果才是 TRUE(1) |
OR | 任意一个条件为 TRUE(1), 结果为 TRUE(1) |
NOT | 条件为 TRUE(1),结果为 FALSE(0)} |
注:
提问: 为何要分页?
答:主要是有的时候,数据量太大了,那么一次性查找数据的时候,系统会执行SQL语句,此时查询是需要时间的,有可能系统就会被卡住。所以,一般优化的方案就是用分页查询。
原理: 每次只查询,当前页需要显示的数据即可。也就是说,如果每页10条数据,那么只查询10条数据。每次点击下一页的时候,又会请求查询10条数据,这样效率就提高了!!!
语法:
-- 起始下标为 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;
注:
示例: 按 id 进行分页,每页 3 条记录,分别显示 第 1、2、3 页。
-- 第 1 页
SELECT id, name, math, english, chinese FROM exam_result ORDER BY id LIMIT 3 OFFSET 0;
-- 第 2 页
SELECT id, name, math, english, chinese FROM exam_result ORDER BY id LIMIT 3 OFFSET 3;
-- 第 3 页,如果结果不足 3 个,不会有影响
SELECT id, name, math, english, chinese FROM exam_result ORDER BY id LIMIT 3 OFFSET 6;
语法: UPDATE table_name SET 更新内容 [WHERE ...] [ORDER BY ...] [LIMIT ...]
示例:
UPDATE exam_result SET math = 80 WHERE name = '孙悟空';
UPDATE exam_result SET math = 60, chinese = 70 WHERE name = '曹孟德';
UPDATE exam_result SET math = math + 30 ORDER BY chinese + math + english LIMIT 3;
UPDATE exam_result SET math = math + 30 ORDER BY chinese + math + english LIMIT 1,3;
这样写是不可以的,会报错。就是因为mysql的update语句,只支持更新前多少行,不支持从某行到某行!UPDATE exam_result SET chinese = chinese * 2;
delete from 表 where 条件
示例如下:
DELETE FROM exam_result WHERE name = '孙悟空';
DELETE FROM exam_result;