day03-MySQL基础知识02
MySQL基础知识02
4.CRUD
数据库CRUD语句:增(create)、删(delete)、改(update)、查(Retrieve)
- Insert 语句 (添加数据)
- Update 语句(更新数据)
- Delete 语句(删除数据)
- Select 语句 (查找数据)
指对数据库中表记录的操作(DML 操作)
注意:
alter属于DDL,用来修改基本表,是对表的结构进行操作,比如对字段增加,删除,修改类型;
DML 操例,如update是用来修改表中的数据,修改某一行某一列的值
对行是数据操纵DML(update),对列是数据定义DDL(alter)
4.1Insert语句
- 使用INSERT 语句向表中插入数据
INSERT INTO tablename [(column [,column ...])] VALUES (value[, value...]);
例子
- 创建一商品表goods(id int, goods_name varchar(10),price double);
- 添加两条记录
# 练习insert语句 -- 1. 创建一商品表goods(id int, goods_name varchar(10),price double); CREATE TABLE goods( id INT, goods_name VARCHAR(10), price DOUBLE) -- 2. 添加两条记录 INSERT INTO goods (id,goods_name,price) VALUES(10,'华为手机',2000); INSERT INTO goods (id,goods_name,price) VALUES(20,'苹果手机',3000); SELECT * FROM goods;

- INSERT语句注意事项
细节说明:
-
插入的数据应该与字段的数据类型相同,比如把 'abc' 添加到 int 类型会错误
-
数据的长度应在列的规定范围之内,例如:不能将一个长度为80的字符串加入到长度为40的列中
-
在values中列出的数据位置必须与被加入的列的排列位置对应
-
字符和日期型数据应包含在单引号中
-
列可以插入空值[前提是该字段允许为空],insert into table value(null)
-
insert into table_name(列名...) values (),(),() 形式添加多条记录
-
如果是给表中的所有字段添加数据,可以不写前面的字段名称
-
默认值的使用,当不给某个字段值时,如果有默认值就会添加默认值,否则报错
如果某个列没有指定not null,那么当添加数据时,没有给定值,则会默认给null
如果我们希望指定某个默认值,可以在创建表时指定
-- - INSERT语句注意事项 -- 细节说明: -- 1. 插入的数据应该与字段的数据类型相同 INSERT INTO goods VALUES('北京','小米手机',2000)-- 失败,id对应的列类型是int -- 2. 数据的长度应在列的规定范围之内,例如:不能将一个长度为80的字符串加入到长度为40的列中 INSERT INTO goods VALUES(40,'vovo手机vovovovo手机vovovovo手机vovo',2000)-- 失败 -- 3. 在values中列出的数据位置必须与被加入的列的排列位置对应 INSERT INTO goods (goods_name,id,price)-- 成功,即使改变了列属性的位置,只要值是对应的,就ok VALUES('vivo手机',50,1800) -- 4. 字符和日期型数据应包含在单引号中 INSERT INTO goods VALUES(60,小米手机,2000)-- 失败,字符串应该加上单引号 -- 5. 列可以插入空值[前提是该字段允许为空],insert into table value(null) INSERT INTO goods (id,goods_name,price) VALUES(11,'boluo手机',NULL)-- 成功,该字段允许为空 -- 6. insert into table_name(列名...) values (),(),() 形式添加多条记录 INSERT INTO goods VALUES(13,'三星手机',2300),(14,'四星手机',2300)-- ok -- 7. 如果是给表中的所有字段添加数据,可以不写前面的字段名称 INSERT INTO goods (id) VALUES(66); -- ok,指定了字段 -- 8. 默认值的使用,当不给某个字段值时,如果有默认值就会添加默认值,否则报错 -- 如果某个列没有指定not null,那么当添加数据时,没有给定值,则会默认给null INSERT INTO goods (id,goods_name) VALUES(88,'格力手机');-- 这里的price默认设为null SELECT * FROM goods; -- 如果我们希望指定某个默认值,可以在创建表时指定 -- 例如 CREATE TABLE goods2 ( id INT , goods_name VARCHAR(10), price FLOAT NOT NULL DEFAULT 100); INSERT INTO goods2 (id,goods_name) VALUES(1,'大西瓜手机'); SELECT * FROM goods2;
goods表:

goods2表:

4.2Update语句
- 语法:
UPDATE tab_name SET col_name1=expr1[, col_name2=expr2...] [WHERE where_definition]
例子
要求:在上面创建的epm表中修改表中的记录
- 将所有员工的薪水改为5000元
- 将姓名为‘小妖怪’的员工薪水改为3000元
- 将老妖怪的薪水在原有的基础上加1000元
-- 要求:在上面创建的epm表中修改表中的记录 SELECT * FROM emp -- 1. 将所有员工的薪水改为5000元 UPDATE emp SET salary = 5000 -- 2. 将姓名为‘小妖怪’的员工薪水改为3000元 UPDATE emp SET salary = 3000 WHERE user_name = '小妖怪' -- 3. 将老妖怪的薪水在原有的基础上加1000元 INSERT INTO emp VALUES(200,'老妖怪','1990-1-1','2004-4-12 12:22:09','捶背的',5000,'给大王捶背','111') UPDATE emp SET salary = salary + 1000, job='出主意的' WHERE user_name = '老妖怪'
- 使用细节
- UPDATE 语法可以用新值更新原有表行中的各列
- set子句指示要修改哪些列和要给予哪些值
- WHERE子句指定应更新哪些行,如果没有WHERE子句,则更新所有的记录。因此要慎用
- 如果需要修改多个字段,可以通过set字段1=值1,字段2=值2...
4.3Delete语句
- 语法
delete from tbl_name [WHERE where_definition]
例子
-- delete语句演示 -- 删除表中名称为'老妖怪'的记录 DELETE FROM emp WHERE user_name ='老妖怪' -- 删除表中所有记录 DELETE FROM emp SELECT * FROM emp
- 使用细节
- 如果不使用子句,将删除表中所有数据
- delete语句不能删除某一列的值(可使用update设为null或者 '')
- 使用delete语句仅删除记录,不删除表本身。如果要删除表,使用drop 语句:
drop table 表名;
4.4Select语句(单表)
4.4.1基本查询
SELECT [DISTINCT] * |{column1,column2,column3..} FROM table_name;
- 注意事项
- select指定查询哪些列的数据
- column指定列名
- *号代表查询所有列
- from指定查询哪张表
- distinct可选,指显示结果时,是否去掉重复数据
课堂练习
- 查询表中所有学生的信息
- 查询表中所有学生的姓名对应的英语成绩
- 过滤表中的重复数据distinct
- 要过滤的记录,每个字段都相同才会去重
CREATE TABLE student ( id INT NOT NULL DEFAULT 1, `name` VARCHAR(20) NOT NULL DEFAULT '', chinese FLOAT NOT NULL DEFAULT 0.0, english FLOAT NOT NULL DEFAULT 0.0, math FLOAT NOT NULL DEFAULT 0.0 ); -- 先插入数据 INSERT INTO student(id,`name`,chinese,english,math) VALUES(1,'张飞',89,78,90), (2,'宋江',67,98,56), (3,'关羽',87,78,77), (4,'赵云',88,98,90), (5,'欧阳锋',55,85,45), (6,'黄蓉',75,65,30), (7,'刘备',98,57,88) -- 1. 查询表中所有学生的信息 SELECT * FROM student; -- 2. 查询表中所有学生的姓名对应的英语成绩 SELECT `name`,english FROM student -- 3. 过滤表中的重复数据distinct SELECT DISTINCT english FROM student; -- 4. 要过滤的记录,(要查询的)每个字段都相同才会去重
4.4.2使用表达式对查询的列进行运算
SELECT *|{ column1|expression, column2|expression, ...} FROM tablename;
- 在select语句中可使用as语句
SELECT column_name as 别名 from 表名;
练习
- 统计每个学生的总分
- 给所有学生总分加10分
- 使用别名表示学生分数
-- 1. 统计每个学生的总分 SELECT `name`,(chinese+english+math) FROM student; -- 2. 给所有学生总分加10分 SELECT `name`,(chinese+english+math+10) FROM student; -- 3. 使用别名表示学生分数 SELECT `name` AS `名字`,(chinese+english+math) AS `total` FROM student;
4.4.3在where子句中经常使用的运算符
使用wher子句进行过滤查询

练习1
-- 1. 查询姓名为赵云的学生的成绩 SELECT * FROM Student WHERE `name` = '赵云' -- 2. 查询英语成绩大于90分的同学 SELECT * FROM Student WHERE english > 90 -- 3. 查询总分大于200分的所有同学 SELECT * FROM Student WHERE (chinese + english + math) > 200 -- 4. 查询math大于60且id大于4的学生成绩 SELECT * FROM student WHERE math > 60 AND id > 4 -- 5. 查询英语成绩大于语文成绩的同学 SELECT * FROM student WHERE math > chinese -- 6. 查询总分大于200分的,且数学成绩小于语文成绩的姓宋的同学 -- 宋% 表示名字以宋开头的 SELECT * FROM student WHERE (chinese + english + math) > 200 AND math < chinese AND `name` LIKE '宋%'
练习2
-- 查询英语成绩分数在80-90之间的同学 SELECT * FROM student WHERE english BETWEEN 80 AND 90 -- 查询数学成绩分数为89,90,91之间的同学(也可以用or) SELECT * FROM student WHERE math IN(89,90,91) -- 查询所有姓宋的学生的成绩 SELECT * FROM student WHERE `name` LIKE '宋%' -- 查询数学分数大于80,语文分大于80的同学 SELECT * FROM student WHERE math > 80 AND chinese >80
练习3
-- 查询语文在70到80之间的同学 SELECT * FROM student WHERE chinese <= 80 AND chinese >=70 -- 查询总分为189,190,191的同学 SELECT * FROM student WHERE (chinese + english + math) IN (189,190,191) -- 查询所有姓李或姓宋的学生的成绩 SELECT * FROM student WHERE `name` LIKE '宋%' OR `name` LIKE '李%' -- 查询数学比语文多10分的同学 SELECT * FROM student WHERE chinese = math+10
4.4.4使用order by 子句排序查询结果
SELECT column1,column2,column3... FROM table; order by column asc|desc,...
- order by 指定排序的列,排序的列既可以是表中的列名,也可以是select语句后指定的列名
- asc升序(默认),desc降序
- order by子句应位于select语句的结尾
练习
-- 对数学成绩排序后输出(升序) SELECT * FROM student ORDER BY math -- 对总分按从高到低的顺序输出 SELECT `name`,(chinese + math +english)AS total FROM student ORDER BY total descd -- 对姓张的学生成绩排序输出(升序) INSERT INTO student(id,`name`,chinese,english,math) VALUES(8,'张三',65,45,99) SELECT `name`,(chinese + math +english)AS total FROM student WHERE `name` LIKE '张%' ORDER BY total
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!