文章目录
- 一、新增(Create)
- 1.单行数据 + 全列插入
- 2.多行数据 + 全列插入
- 3.多行数据+指定列插入
- 二、查询(Retrieve)
- 1.全列查询
- 2.指定列查询
- 3.查询字段为表达式
- 4.起别名(as)
- 5.去重(distinct)
- 6.排序(order by)
- 7.条件查询(where)
- 范围查询
- in
- 模糊查询:LIKE
- null的查询
- 8.分页查询(limit)
- 9.插入查询结果
- 三、修改(Update)
- 四、删除(Delete)
- 总结
CRUD也就是我们常说的增删查改也是数据库最基础的操作
C:create增加
R:retrieve 查找
U:update 修改
D:delete 删除
注释: 在SQL中 – 表示注释,需要独占一行,或者使用 comment注释。
一、新增(Create)
我们先创建一张学生表
-- 创建一张学生表
create table student (
id int,
-- 学号
sn int,
-- 姓名
name varchar(16),
-- qq邮箱
qq_mail varchar(17)
);
使用 insert into 表名 values 对表进行插入数据
注意:数量必须和定义表的列的数量及顺序一致
1.单行数据 + 全列插入
insert into student values (1,20210001,'刘备','12345@qq.com');
insert into student values (2,20210002,'张飞','1234566@qq.com');
2.多行数据 + 全列插入
insert into student values (3,20210003,'关羽','1234567@qq.com'),
(4,20210003,'诸葛亮','10001@qq.com');
3.多行数据+指定列插入
我们还可以指定单独几个列进行插入,需要注意:插入的顺序要对应
-- 指定插入学号和姓名
insert into student (sn,name) values (5,'曹操'), (6,'周瑜');
注意:更建议一条语句插入多条数据,插入数据的时候会涉及到网络传输,如果多条数据分多次插入就会涉及到多次网络传输,开销也就会更大。
二、查询(Retrieve)
我们先创建一个考试成绩表
-- 创建考试成绩表
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,'刘备',77.5,98,56),
(2,'张飞',80,66,77),
(3,'关羽',67,87,56),
(4,'曹操',77.5,78,66),
(5,'诸葛亮',87,98.5,88),
(6,'宋江',80,76,65),
(7,'李逵',50,30.5,45);
我们通过 select 关键字来进行查找操作
1.全列查询
通过 select * from对所有列查询
通常情况下不建议使用 * 进行全列查询
- 查询的列越多,意味着需要传输的数据量越大;
- 可能会影响到索引的使用.
select * from exam_result;
查询结果
2.指定列查询
这种方式比全列插叙更推荐使用
通过 select 多个列名 from 表名进行查询数据
-- 插叙学生名字和其对应的数学成绩
select name,math from exam_result;
运行结果:
3.查询字段为表达式
我们可以指定的查询结果上加上一些简单的表达式,此操作查询出来的表只是一个临时表并不影响原来表的数据。
1.包含一个字段
-- 对查询的语文成绩加10分
select id,name,chinese+10 from exam_result;
运行结果:
2.包含多个字段
-- 对插叙的数学加10分,英语加5分
select id,name,chinese,math+10,english+5 from exam_result;
运行结果:
3.多个字段求和
我们可以对查询结果进行求和来求总成绩
select name,chinese+math+english from exam_result;
运行结果:
4.起别名(as)
为查询结果中的列指定别名,表示返回的结果集中,以别名作为该列的名称
select id,name,chinese+math+english 总分 from exam_result;
运行结果
为了更好区分我们还可以在别名前面加上 as 效果是一样的
select id,name,chinese+math+english as 总分 from exam_result;
给每个字段都起别名查询
select id as 学号,name as 姓名,chinese as 语文, math as 数学,english as 英语, chinese+math+english as 总分 from exam_result;
5.去重(distinct)
通过 查询关键字 select 配合 distinct 关键字来去重
select distinct 去重列名 from 表名
-- 不去重的查询
select chinese from exam_result;
去重后
-- 去重代码
select distinct chinese from exam_result;
还可以指定多列去重,指定多列的时候需要每一列都相同才会去重。
-- 去重前
select chinese,math,english from exam_result;
去重后
select distinct chinese,math,english from exam_result;
注意:每次去重操作其实都涉及到比较运算,比较整数没啥问题,如果比较 double 或者是 float 就可能存在误差。
decimal是可以精准比较的
比较字符串的时候,在创建数据库的时候会通过关键字 COLLATE 指定比较规则
6.排序(order by)
通过 order by 关键字来对查询数据进行排序。
- ASC 为升序(从小到大)
- DESC 为降序(从大到小)
- 默认为 ASC
注意:
1.没有 ORDER BY 子句的查询,返回的顺序是未定义的,永远不要依赖这个顺序
2.NULL 数据排序,视为比任何值都小,升序出现在最上面,降序出现在最下面
-- 按照数学成绩
select name,math from exam_result order by math;
运行结果:
使用表达式排序
按总成绩从高到低排序
select id,name,chinese+math+english from exam_result order by chinese+english+math desc;
运行结果:
使用表达式排序起别名排序
select id,name,chinese+math+english as 总分 from exam_result order by chinese+math+english desc
运行结果:
多个字段进行排序,排序优先级随书写顺序
select name,chinese,math,english from exam_result order by chinese ,math,chinese;
先按照语文升序排序,如果语文成绩相同,用数学成绩进行降序排序,同理如果语文数学成绩相同就用英语降序排序
可对数据去重后排序
排序前
去重排序后
-- 对语文成绩去重排序
select distinct chinese from exam_result order by chinese;
7.条件查询(where)
比较运算符:
逻辑运算符:
注意:
- WHERE条件可以使用表达式,但不能使用别名。
- AND的优先级高于OR,在同时使用时,需要使用小括号()包裹优先执行的部分
基本查询:
-- 查询英语不及格的同学
select name,english from exam_result where english < 60;
-- 查询语文成绩好于数学成绩的同学
select name, chinese, math from exam_result where chinese > math;
-- 查询总分小于250分的同学
select name,chinese+math+english as 总分 from exam_result where chinese+math+english < 250;
-- 查询总分小于250的同学并以升序排序
select name,chinese+math+english as 总分 from exam_result where chinese+math+english < 250 order by chinese+math+english;
AND与OR:
-- 查询语文成绩大于80分,且数学成绩大于80分的同学
select name,chinese,math from exam_result where chinese > 80 and math > 80;
-- 查询数学成绩大于80分,或者英语成绩大于80分的同学
select name,math,english from exam_result where math > 80 or english > 80;
范围查询
BETWEEN … AND .
注意:between and ,左右都是闭区间
-- 查询语文成绩在[80,90]分的同学
select name,chinese from exam_result where chinese between 80 and 90;
这个查询用 and 也是可以实现的
-- 使用 and 也是同样可以实现
mysql> select name,chinese from exam_result where chinese >= 80 and chinese <= 90;
in
-- 查找数学成绩分数等于 98或者66或者80或99分的同学
select name,math from exam_result where math in (98,66,80,99);
-- 使用or也可以实现同样的效果
select name,math from exam_result where math = 98 or math = 66 or math = 80 or math = 90;
模糊查询:LIKE
用 % 和 _ 可以使用模糊查询
“%”:可以代替 n 个字符
“_”:每一个可以代替一个字符
当前表中的所有同学
-- 查询所有姓孙的同学
select name from exam_result where name like '孙%';
运行结果
-- 查询所有名字两个字且性孙的同学
select name from exam_result where name like '孙_';
运行结果
null的查询
查询 NULL 的时候不能直接使用 = ,可以用
- <=>
- is null
-- 两种方法都可以判断是不是 null
select name chinese from exam_result where chinese <=> null;
select name chinese from exam_result where chinese is null;
示例:
查询不是 null 的同学
-- 查询英语成绩不为 null 的同学
select name chinese from exam_result where english is not null;
8.分页查询(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;
-- 查询从0开始的前三条数据
select id,name,chinese,math,english from exam_result limit 3;
-- 查询表中从3开始的后8条数据
select id,name,chinese,math,english from exam_result limit 3,8;
-- 查询表中从3开始的后8条数据,比上面那种方式更明确,也更建议使用
select id,name,chinese,math,english from exam_result limit 8 offset 3;
-- 查询从3开始往后8条数据并以数学成绩排序
select id,name,chinese,math,english from exam_result order by math limit 8 offset 3;
注意:如果操作线上数据库,每个SQL语句都要带上 limit
9.插入查询结果
语法:
INSERT INTO table_name [(column [, column ...])] SELECT ...
我们可以把一个表的查询结果插入到另外一个表中,需要注意以下几点:
- 查询表中的结果中的字段要和插入表中的字段类型对应
- 不一定需要两个表中的字段全部对应,只需要查询到的结果中的字段在被插入的表中要存在,且类型一样
代码示例:
创建一个学生表和用户表,插入两条数据
-- 用户表
create table user (
id int primary key auto_increment,
name varchar(20),
age int,
sex char
);
-- 学生表
create table student (
name varchar(10),
sex char
);
insert into student values ('李逵','男');
insert into student values ('宋江','男');
通过 select 语句 把查询到的学生表记录插入到用户表中
insert into user (name,sex) select name,sex from student;
三、修改(Update)
通过 update…set关键字来修改数据
注意:修改数据时一定要加上 where ,一旦忘记加上 where 就可能修改掉所有数据
语法:
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 = '刘备';
修改前
-- 把总成绩前三的同学的数学分数减10分
update exam_result set math = math-10 order by chinese+math+english desc limit 3;
-- 将所有同学的语文成绩更新为原来的 2 倍
update exam_result set chinese = chinese*2;
四、删除(Delete)
语法:
DELETE FROM table_name [WHERE ...] [ORDER BY ...] [LIMIT ...]
-- 删除孙膑的成绩
delete from exam_result where name = '孙膑';
删除整张表的数据
和drop 的区别就是表还在数据没了
delete from 表名;
总结
- 插入数据
-- 单行插入
insert into 表(字段1, ..., 字段N) values (value1, ..., value N);
-- 多行插入
insert into 表(字段1, ..., 字段N) values
(value1, ...),
(value2, ...),
(value3, ...)
- 查询:select
-- 全列查询
select * from 表
-- 指定列查询
select 字段1,字段2... from 表
-- 查询表达式字段
select 字段1+100,字段2+字段3 from 表
-- 别名
select 字段1 别名1, 字段2 别名2 from 表
-- 去重DISTINCT
select distinct 字段 from 表
-- 排序ORDER BY
select * from 表 order by 排序字段
-- 条件查询WHERE:
-- (1)比较运算符 (2)BETWEEN ... AND ... (3)IN (4)IS NULL (5)LIKE (6)AND (7)OR
(8)NOT
select * from 表 where 条件
update 表 set 字段1=value1, 字段2=value2... where 条件
delete from 表 where 条件
比特科
- 修改:update
update 表 set 字段1=value1, 字段2=value2... where 条件
- 删除:delete
delete from 表 where 条件
注意:
- where 条件可以使用表达式,但不能使用别名
- 判断是否为 null 要使用 <=> 或者 is null ,非 null 则用 not null
- 修改数据时一定要加上 where ,一旦忘记加上 where 就可能修改掉所有数据
- 如果操作线上数据库,每个SQL语句都要带上 limit