【MySQL学习笔记】数据库的CURD(一)
【MySQL学习笔记】数据库的CURD(一)
🔥个人主页:大白的编程日记
🔥专栏:MySQL笔记
文章目录
- 【MySQL学习笔记】数据库的CURD(一)
- 前言
- 一.表的增删改查
- 1.1 Create
- 1.1.1 单行数据 + 全列插入
- 1.1.2 多行数据+指定列插入
- 1.1.3 插入否则更新
- 1.1.4 替换
- 1.2 Retrieve
- 1.2.1 SELECT 列
- 1.2.1.1 全列查询
- 1.2.1.2 指定列查询
- 1.2.1.3 查询字段为表达式
- 1.2.1.4 为查询结果指定别名
- 1.2.1.5 结果去重
- 1.2.2 WHERE 条件
- 1.2.3 结果排序
- 1.3 筛选分页结果
- 后言
前言
哈喽,各位小伙伴大家好!上期我们讲了数据库表达约束 今天我们讲的是数据库表的CURD(一)。话不多说,我们进入正题!向大厂冲锋!
一.表的增删改查
CRUD :Create(创建),Retrieve(读取),Update(更新),Delete(删除)
1.1 Create
语法:
INSERT [INTO] table_name
[(column [,column]...)]
VALUES (value_list)[,(value_list)]...value_list:value,[,value]
1.1.1 单行数据 + 全列插入
-- 创建一张学生表
CREATE TABLE students (id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,sn INT NOT NULL UNIQUE COMMENT '学号',name VARCHAR(20)NOT NULL,qq VARCHAR(20)
);
1.1.2 多行数据+指定列插入
INSERT INTO students (id,sn,name)VALUES
(102,20001,'曹孟德'),
(103,20002,'孙仲谋');
1.1.3 插入否则更新
-- 主键冲突
INSERT INTO students (id,sn,name)VALUES (100,10010,'唐大师');
-- 唯一键冲突
INSERT INTO students (sn,name)VALUES (20001,'曹阿瞒');
可以选择性的进行同步更新操作语法:
INSERT INTO students (id,sn,name)VALUES (100,10010,'唐大师')ON DUPLICATE KEY UPDATE sn =10010,name ='唐大师';
1.1.4 替换
REPLACE INTO students (sn,name)VALUES (20001,'曹阿瞒');
1.2 Retrieve
SELECT
[DISTINCT]{*|{column [,column]...}
[FROM table_name]
[WHERE ...]
[ORDER BY column [ASC |DESC],...]LIMIT ...
案例:
-- 创建表结构
CREATE TABLE exam_result (id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(20)NOT NULL COMMENT '同学姓名',
chinese float DEFAULT 0.0COMMENT '语文成绩',
math float DEFAULT 0.0COMMENT '数学成绩',
english float DEFAULT 0.0COMMENT '英语成绩'
);
-- 插入测试数据INSERT INTO exam_result (name, chinese, math, english) VALUES('唐三藏', 67, 98, 56),('孙悟空', 87, 78, 77),('猪悟能', 88, 98, 90),('曹孟德', 82, 84, 67),('刘玄德', 55, 85, 45),('孙权', 70, 73, 78),('宋公明', 75, 65, 30);Query OK, 7 rows affected (0.00 sec)
Records: 7 Duplicates: 0 Warnings: 0
1.2.1 SELECT 列
1.2.1.1 全列查询
- 通常情况下不建议使用 * 进行全列查询
- 查询的列越多,意味着需要传输的数据量越大;
- 可能会影响到索引的使用。
SELECT * FROM exam_result;+----+-----------+-------+--------+--------+| id | name | chinese | math | english |+----+-----------+-------+--------+--------+| 1 | 唐三藏 | 67 | 98 | 56 || 2 | 孙悟空 | 87 | 78 | 77 || 3 | 猪悟能 | 88 | 98 | 90 || 4 | 曹孟德 | 82 | 84 | 67 || 5 | 刘玄德 | 55 | 85 | 45 || 6 | 孙权 | 70 | 73 | 78 || 7 | 宋公明 | 75 | 65 | 30 |+----+-----------+-------+--------+--------+7 rows in set (0.00 sec)
1.2.1.2 指定列查询
- – 指定列的顺序不需要按定义表的顺序来
SELECT id, name, english FROM exam_result;+----+-----------+--------+| id | name | english |+----+-----------+--------+| 1 | 唐三藏 | 56 || 2 | 孙悟空 | 77 || 3 | 猪悟能 | 90 || 4 | 曹孟德 | 67 || 5 | 刘玄德 | 45 || 6 | 孙权 | 78 || 7 | 宋公明 | 30 |+----+-----------+--------+7 rows in set (0.00 sec)
1.2.1.3 查询字段为表达式
– 表达式不包含字段
SELECT id, name, 10 FROM exam_result;
+----+-----------+----+| id | name | 10 |+----+-----------+----+| 1 | 唐三藏 | 10 || 2 | 孙悟空 | 10 || 3 | 猪悟能 | 10 || 4 | 曹孟德 | 10 || 5 | 刘玄德 | 10 || 6 | 孙权 | 10 |
| 7 | 宋公明 | 10 |+----+-----------+----+7 rows in set (0.00 sec)-- 表达式包含一个字段SELECT id, name, english + 10 FROM exam_result;+----+-----------+-------------+| id | name | english + 10 |+----+-----------+-------------+| 1 | 唐三藏 | 66 || 2 | 孙悟空 | 87 || 3 | 猪悟能 | 100 || 4 | 曹孟德 | 77 || 5 | 刘玄德 | 55 || 6 | 孙权 | 88 || 7 | 宋公明 | 40 |+----+-----------+-------------+7 rows in set (0.00 sec)-- 表达式包含多个字段SELECT id, name, chinese + math + english FROM exam_result;+----+-----------+-------------------------+| id | name | chinese + math + english |+----+-----------+-------------------------+| 1 | 唐三藏 | 221 || 2 | 孙悟空 | 242 || 3 | 猪悟能 | 276 || 4 | 曹孟德 | 233 || 5 | 刘玄德 | 185 || 6 | 孙权 | 221 || 7 | 宋公明 | 170 |+----+-----------+-------------------------+7 rows in set (0.00 sec)
1.2.1.4 为查询结果指定别名
语法:
SELECT column [AS] alias_name [...] FROM table_name;
SELECT id, name, chinese + math + english 总分 FROM exam_result;+----+-----------+--------+| id | name | 总分 |+----+-----------+--------+| 1 | 唐三藏 | 221 || 2 | 孙悟空 | 242 || 3 | 猪悟能 | 276 || 4 | 曹孟德 | 233 |比特就业课 | 5 | 刘玄德 | 185 || 6 | 孙权 | 221 || 7 | 宋公明 | 170 |+----+-----------+--------+7 rows in set (0.00 sec)
1.2.1.5 结果去重
– 98 分重复了
SELECT math FROM exam_result;
math |
---|
98 |
78 |
98 |
84 |
85 |
73 |
65 |
– 去重结果
SELECT DISTINCT math FROM exam_result;
math |
---|
98 |
78 |
84 |
85 |
73 |
65 |
1.2.2 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 | 是 NULL |
IS NOT NULL | 不是 NULL |
LIKE | 模糊匹配。% 表示任意多个(包括 0 个)任意字符;_ 表示任意一个字符 |
逻辑运算符:
运算符 | 说明 |
---|---|
AND | 多个条件必须都为 TRUE(1) ,结果才是 TRUE(1) |
OR | 任意一个条件为 TRUE(1), 结果为 TRUE(1) |
NOT | 条件为 TRUE(1) ,结果为 FALSE(0) |
1.2.3 结果排序
语法:
- ASC 为升序(从小到大)
- DESC 为降序(从大到小)
- 默认为 ASC
SELECT ... FROM table_name [WHERE ...]
ORDER BY column [ASC|DESC], [...];
注意:没有 ORDER BY
子句的查询,返回的顺序是未定义的,永远不要依赖这个顺序
案例:
1.2.3.1 同学及数学成绩,按数学成绩升序显示
SELECT name, math FROM exam_result ORDER BY math;
+-----------+------+
| name | math |
+-----------+------+
| 宋公明 | 65 |
| 孙权 | 73 |
| 孙悟空 | 78 |
| 曹孟德 | 84 |
| 唐三藏 | 85 |
| 猪悟能 | 98 |
+-----------+------+
7 rows in set (0.00 sec)
同学及 qq 号,按 qq 号排序显示
– NULL 视为比任何值都小,升序出现在最上面
SELECT name, qq FROM students ORDER BY qq;
+-----------+-------+
| name | qq |
+-----------+-------+
| 唐大师 | NULL |
| 孙仲谋 | NULL |
| 曹阿瞒 | NULL |
| 孙悟空 | 11111111|
+-----------+-------+
4 rows in set (0.00 sec)
– NULL 视为比任何值都小,降序出现在最下面
SELECT name, qq FROM students ORDER BY qq DESC;
+-----------+-------+
| name | qq |
+-----------+-------+
| 孙悟空 | 11111 |
| 唐大师 | NULL |
| 孙仲谋 | NULL |
| 曹阿瞒 | NULL |
+-----------+-------+
4 rows in set (0.00 sec)
按简同学各门成绩,依次按数学降序,英语升序,语文升序的方式显示
– 多字段排序,排序优先级随书写顺序
SELECT name, math, english, chinese FROM exam_result
ORDER BY math DESC, english, chinese;
+-----------+------------+------+------+
| name | math | english | chinese |
+-----------+------+------+------+
| 唐三藏 | 98 | 56 | 67 |
| 猪悟能 | 98 | 90 | 88 |
| 刘玄德 | 84 | 67 | 82 |
| 孙悟空 | 78 | 77 | 87 |
| 孙权 | 73 | 78 | 70 |
| 宋公明 | 65 | 30 | 75 |
+-----------+------+------+------+
7 rows in set (0.00 sec)
6.2.3.4 查询同学及总分,由高到低
– ORDER BY 中可以使用表达式
SELECT name, chinese + math + english FROM exam_result
ORDER BY chinese + math + english DESC;
+-----------+---------+
| name | 总分 |
+-----------+---------+
| 猪悟能 | 276 |
| 孙悟空 | 242 |
| 曹孟德 | 233 |
| 唐三藏 | 221 |
| 孙权 | 221 |
| 刘玄德 | 185 |
| 宋公明 | 170 |
+-----------+---------+
7 rows in set (0.00 sec)
6.2.3.5 查询姓孙的同学数学成绩,结果按数学成绩由高到低显示
– 结合 WHERE 子句和 ORDER BY 子句
SELECT name, math FROM exam_result
WHERE name LIKE '孙%'
ORDER BY math DESC;
+-----------+------+
| name | math |
+-----------+------+
| 孙悟空 | 78 |
| 孙权 | 73 |
+-----------+------+
2 rows in set (0.00 sec)
6.2.3.6 查询同学及总分,由高到低
SELECT name, chinese + math + english 总分 FROM exam_result
ORDER BY 总分 DESC;
+-----------+-------+
| name | 总分 |
+-----------+-------+
| 猪悟能 | 276 |
| 孙悟空 | 242 |
| 曹孟德 | 233 |
| 唐三藏 | 221 |
| 孙权 | 221 |
| 刘玄德 | 185 |
| 宋公明 | 170 |
+-----------+-------+
7 rows in set (0.00 sec)
6.2.3.7 查询同学及qq号,按qq号排序显示
SELECT name, qq FROM students ORDER BY qq;
+-----------+-------+
| name | qq |
+-----------+-------+
| 唐大师 | NULL |
| 孙仲谋 | NULL |
| 曹阿瞒 | NULL |
| 孙悟空 | 11111111|
+-----------+-------+
4 rows in set (0.00 sec)
– NULL 视为比任何值都小,降序出现在最下面
SELECT name, qq FROM students ORDER BY qq DESC;
+-----------+-------+
| name | qq |
+-----------+-------+
| 孙悟空 | 11111 |
| 唐大师 | NULL |
| 孙仲谋 | NULL |
| 曹阿瞒 | NULL |
+-----------+-------+
4 rows in set (0.00 sec)
6.2.3.8 查询简同学各门成绩,依次按数学降序,英语升序,语文升序的方式显示
– 多字段排序,排序优先级随书写顺序
SELECT name, math, english, chinese FROM exam_result
ORDER BY math DESC, english, chinese;
+-----------+------+------+------+
| name | math | english | chinese |
+-----------+------+------+------+
| 唐三藏 | 98 | 56 | 67 |
| 猪悟能 | 98 | 90 | 88 |
| 刘玄德 | 84 | 67 | 82 |
| 孙悟空 | 78 | 77 | 87 |
| 孙权 | 73 | 78 | 70 |
| 宋公明 | 65 | 30 | 75 |
+-----------+------+------+------+
7 rows in set (0.00 sec)
6.2.3.9 查询姓孙的同学数学成绩,结果按数学成绩由高到低显示
– 结合 WHERE 子句和 ORDER BY 子句
SELECT name, math FROM exam_result
WHERE name LIKE '孙%'
ORDER BY math DESC;
+-----------+------+
| name | math |
+-----------+------+
| 孙悟空 | 78 |
| 孙权 | 73 |
+-----------+------+
2 rows in set (0.00 sec)
1.3 筛选分页结果
语法:
- 起始下标为 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;
- 从 0 开始,筛选 n 条结果
建议:对未知表进行查询时,最好加一条 LIMIT 1,避免因为表中数据过大,查询全表数据导致数据库卡死
按 id 进行分页,每页 3 条记录,分别显示第 1、2、3 页
第 1 页
SELECT id, name, math, english, chinese FROM exam_result
ORDER BY id LIMIT 3 OFFSET 0;
+----+-----------+------+------+------+
| id | name | math | english | chinese |
+----+-----------+------+------+------+
| 1 | 唐三藏 | 98 | 56 | 67 |
| 2 | 孙悟空 | 78 | 77 | 87 |
| 3 | 猪悟能 | 98 | 90 | 88 |
+----+-----------+------+------+------+
3 rows in set (0.02 sec)
第 2 页
SELECT id, name, math, english, chinese FROM exam_result
ORDER BY id LIMIT 3 OFFSET 3;
+----+-----------+------+------+------+
| id | name | math | english | chinese |
+----+-----------+------+------+------+
| 4 | 曹孟德 | 84 | 67 | 82 |
| 5 | 刘玄德 | 85 | 45 | 55 |
| 6 | 孙权 | 73 | 78 | 70 |
+----+-----------+------+------+------+
3 rows in set (0.00 sec)
第 3 页,如果结果不足 3 个,不会有影响
SELECT id, name, math, english, chinese FROM exam_result
ORDER BY id LIMIT 3 OFFSET 6;
+----+-----------+------+------+------+
| id | name | math | english | chinese |
+----+-----------+------+------+------+
| 7 | 宋公明 | 65 | 30 | 75 |
+----+-----------+------+------+------+
1 row in set (0.00 sec)
后言
这就是数据库表的CURD(一)。大家自己好好消化!今天就分享到这! 感谢各位的耐心垂阅!咱们下期见!拜拜~