go做后端的网站,天元建设集团有限公司申请破产,新手搭建网站教程,成都网站网页制作CRUD#xff08;增删改查#xff09;基础 一. CRUD二. 新增 #xff08;Create#xff09;1. 单行数据 全列插入2. 多行数据 指定列插入 三. 查询#xff08;Retrieve#xff09;1. 全列查询2. 指定列查询3. 查询字段为表达式4. 别名5. 去重#xff1a;DISTINCT6. 排序… CRUD增删改查基础 一. CRUD二. 新增 Create1. 单行数据 全列插入2. 多行数据 指定列插入 三. 查询Retrieve1. 全列查询2. 指定列查询3. 查询字段为表达式4. 别名5. 去重DISTINCT6. 排序ORDER BY7. 条件查询WHERE 四. 修改Update五. 删除Delete 一. CRUD
注释在SQL中可以使用“–空格描述”来表示注释说明CRUD 即增加(Create)、查询(Retrieve)、更新(Update)、删除(Delete)四个单词的首字母缩写。
二. 新增 Create
语法
INSERT [INTO] table_name[(column [, column] ...)] VALUES (value_list) [, (value_list)] ...value_list: value, [, value] ...示例
-- 创建一张学生表
DROP TABLE IF EXISTS student;
CREATE TABLE student (id INT,sn INT comment 学号,name VARCHAR(20) comment 姓名,qq_mail VARCHAR(20) comment QQ邮箱
);1. 单行数据 全列插入
-- 插入两条记录value_list 数量必须和定义表的列的数量及顺序一致
INSERT INTO student VALUES (100, 10000, 唐三藏, NULL);
INSERT INTO student VALUES (101, 10001, 孙悟空, 11111);2. 多行数据 指定列插入
-- 插入两条记录value_list 数量必须和指定列数量及顺序一致
INSERT INTO student (id, sn, name) VALUES(102, 20001, 曹孟德),(103, 20002, 孙仲谋);这里面没有插入 qq_mail 列, 那么就是默认值
注意
SQL 中可用 ’ ’ 表示字符串 也可以用 , SQL 中无字符类型若某列是时间类型 datetime 怎么插入
通过指定格式字符串 插入一个指定时间
insert into test values (1, 2023-09-05 10:13:00);-- 不指定具体几点 那么默认就是 00 时 00 分 00 秒
insert into test values (2, 2023-09-05);
通过 now() 函数 插入一个当前系统时间
insert into test values (3, now());insert 也可以一次插入多行 values 后面每个 ( ) 对应一行 可以一次性带有多个 ( ), 多个 ) 之间用 分隔
insert into test values (4, 2023-09-05 10:13:00) (5, 2023-09-05 10:15:00), (6, 2023-09-05 11:15:00);一次插入 N 条记录比一次插入一条 分 N 次插入要快 好几倍 如果分多次插入的话 每次服务器都需要再重新解析请求中的 SQL
三. 查询Retrieve
查询的结果都是一个临时表 不会影响数据库中保存的数据
语法
SELECT[DISTINCT] {* | {column [, column] ...} [FROM table_name][WHERE ...][ORDER BY column [ASC | DESC], ...]LIMIT ...示例
-- 创建考试成绩表
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)
);
-- 插入测试数据
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);1. 全列查询
-- 通常情况下不建议使用 * 进行全列查询
-- 1. 查询的列越多意味着需要传输的数据量越大 可能瞬间把 硬盘 IO 吃满同时数据库会立即返回数据 也会把带宽吃满此时就非常卡顿。
-- 2. 可能会影响到索引的使用。因为全列查询直接就扫描全表了 不会使用索引了。
SELECT * FROM exam_result;2. 指定列查询
-- 指定列的顺序不需要按定义表的顺序来
SELECT id, name, english FROM exam_result;3. 查询字段为表达式
-- 表达式不包含字段
SELECT id, name, 10 FROM exam_result;
-- 表达式包含一个字段
SELECT id, name, english 10 FROM exam_result;
-- 表达式包含多个字段
SELECT id, name, chinese math english FROM exam_result;4. 别名
为查询结果中的列指定别名表示返回的结果集中以别名作为该列的名称。
语法
SELECT column [AS] alias_name [...] FROM table_name;示例
-- 结果集中表头的列名别名
SELECT id, name, chinese math english 总分 FROM exam_result;注意 临时表的数据类型与原始表中定义的数据类型不一定一致 比如上面这个查询 chinese math english 都是 double (3, 1) 但是 chinese math english 的结果比较大 那么 可能类型就是 double (4, 1) 了 临时表会自动适应 保证结果计算正确。
5. 去重DISTINCT
使用DISTINCT关键字对某列数据进行去重
-- 98 分重复了
SELECT math FROM exam_result;
--------
| math |
--------
| 98 |
| 78 |
| 98 |
| 84 |
| 85 |
| 73 |
| 65 |
--------
7 rows in set (0.00 sec)-- 去重结果
SELECT DISTINCT math FROM exam_result;
--------
| math |
--------
| 98 |
| 78 |
| 84 |
| 85 |
| 73 |
| 65 |
--------
6 rows in set (0.00 sec)SELECT DISTINCT math english FROM exam_result;此时 math 和 english 都相同才算重复
6. 排序ORDER BY
语法
-- ASC 为升序从小到大
-- DESC 为降序从大到小
-- 默认为 ASC
SELECT ... FROM table_name [WHERE ...] ORDER BY column [ASC|DESC], [...];注意
没有 ORDER BY 子句的查询返回的顺序是未定义的永远不要依赖插入顺序NULL 数据排序视为比任何值都小升序出现在最上面降序出现在最下面
-- 查询同学姓名和 qq_mail按 qq_mail 排序显示
SELECT name, qq_mail FROM student ORDER BY qq_mail;
SELECT name, qq_mail FROM student ORDER BY qq_mail DESC;使用表达式及别名排序
-- 查询同学及总分由高到低
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 total DESC;可以对多个字段进行排序排序优先级随书写顺序
-- 查询同学各门成绩依次按 数学降序英语升序语文升序的方式显示
SELECT name, math, english, chinese FROM exam_result ORDER BY math DESC, english, chinese;注意 MySQL 中的数据是存储在硬盘上的 当要排序的内容不超过一定大小时 直接在内存中使用快排不稳定 当数据量很大时 就使用外排序归并排序稳定。 MySQL 中的排序是不稳定排序 针对一个列比较 如结果相同 但是顺序不可预期。 快速排序详解 归并排序详解
7. 条件查询WHERE
比较运算符 对 NULL 进行一些算术运算结果还是 NULL
逻辑运算符 注意
WHERE条件可以使用表达式但不能使用别名。AND的优先级高于OR在同时使用时需要使用小括号()包裹优先执行的部分
示例
基本查询
-- 查询英语不及格的同学及英语成绩 ( 60 )
SELECT name, english FROM exam_result WHERE english 60;-- 查询语文成绩好于英语成绩的同学
SELECT name, chinese, english FROM exam_result WHERE chinese english;-- 查询总分在 200 分以下的同学
SELECT name, chinese math english 总分 FROM exam_result WHERE chinese math english 200;AND与OR
-- 查询语文成绩大于80分且英语成绩大于80分的同学
SELECT * FROM exam_result WHERE chinese 80 and english 80;-- 查询语文成绩大于80分或英语成绩大于80分的同学
SELECT * FROM exam_result WHERE chinese 80 or english 80;-- 观察AND 和 OR 的优先级
SELECT * FROM exam_result WHERE chinese 80 or math70 and english 70;
SELECT * FROM exam_result WHERE (chinese 80 or math70) and english 70;范围查询
BETWEEN … AND …
-- 查询语文成绩在 [80, 90] 分的同学及语文成绩
SELECT name, chinese FROM exam_result WHERE chinese BETWEEN 80 AND 90;-- 使用 AND 也可以实现
SELECT name, chinese FROM exam_result WHERE chinese 80 AND chinese 90;IN
-- 查询数学成绩是 58 或者 59 或者 98 或者 99 分的同学及数学成绩
SELECT name, math FROM exam_result WHERE math IN (58, 59, 98, 99);-- 使用 OR 也可以实现
SELECT name, math FROM exam_result WHERE math 58 OR math 59 OR math 98 OR math 99;模糊查询LIKE
-- % 匹配任意多个包括 0 个字符
SELECT name FROM exam_result WHERE name LIKE 孙%;-- 匹配到孙悟空、孙权-- _ 匹配严格的一个任意字符
SELECT name FROM exam_result WHERE name LIKE 孙_;-- 匹配到孙权模糊匹配默认不区分大小写
NULL 的查询IS [NOT] NULL
-- 查询 qq_mail 已知的同学姓名
SELECT name, qq_mail FROM student WHERE qq_mail IS NOT NULL;-- 查询 qq_mail 未知的同学姓名
SELECT name, qq_mail FROM student WHERE qq_mail IS NULL;分页查询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;示例 按 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
语法
UPDATE table_name SET column expr [, column expr ...][WHERE ...] [ORDER BY ...] [LIMIT ...]示例
-- 将孙悟空同学的数学成绩变更为 80 分
UPDATE exam_result SET math 80 WHERE name 孙悟空;-- 将曹孟德同学的数学成绩变更为 60 分语文成绩变更为 70 分
UPDATE exam_result SET math 60, chinese 70 WHERE name 曹孟德;-- 将总成绩倒数前三的 3 位同学的数学成绩加上 30 分
UPDATE exam_result SET math math 30 ORDER BY chinese math english LIMIT 3;
-- 可能报错 因为 30 之后越界了
-- 也可能只修改了不到 3 个 因为 NULL 参与任何算术运算都为 NULL-- 将所有同学的语文成绩更新为原来的 2 倍
UPDATE exam_result SET chinese chinese * 2;-- 将所有同学的语文成绩更新为原来的 一半
UPDATE exam_result SET chinese chinese 、 2;
-- 这个可能警告 数据发生了截断 小数点后的位数不够了 就只能截断。如 43.75 - 43.8 (四舍五入)注意 update 也是一个比较危险的操作 撤回不了
五. 删除Delete
语法
DELETE FROM table_name [WHERE ...] [ORDER BY ...] [LIMIT ...]示例
-- 删除孙悟空同学的考试成绩
DELETE FROM exam_result WHERE name 孙悟空;-- 删除整张表数据
-- 准备测试表
DROP TABLE IF EXISTS for_delete;
CREATE TABLE for_delete (id INT,name VARCHAR(20)
);-- 插入测试数据
INSERT INTO for_delete (name) VALUES (A), (B), (C);-- 删除整表数据
DELETE FROM for_delete;
-- 表还在 只不过数据没了
-- drop table for_delete 就是直接连表都没了好啦! 以上就是对 MySQL CRUD (增删改查) 基础 的讲解 希望能帮到你 评论区欢迎指正