文章目录

  • 一、新增(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,'周瑜');

注意:更建议一条语句插入多条数据,插入数据的时候会涉及到网络传输,如果多条数据分多次插入就会涉及到多次网络传输,开销也就会更大。

mysql基本语句增删改查 mysql基本增删改查命令_database

二、查询(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对所有列查询
通常情况下不建议使用 * 进行全列查询

  1. 查询的列越多,意味着需要传输的数据量越大;
  2. 可能会影响到索引的使用.
select * from exam_result;

查询结果

mysql基本语句增删改查 mysql基本增删改查命令_mysql基本语句增删改查_02

2.指定列查询

这种方式比全列插叙更推荐使用

通过 select 多个列名 from 表名进行查询数据

-- 插叙学生名字和其对应的数学成绩
 select name,math from exam_result;

运行结果:

mysql基本语句增删改查 mysql基本增删改查命令_database_03

3.查询字段为表达式

我们可以指定的查询结果上加上一些简单的表达式,此操作查询出来的表只是一个临时表并不影响原来表的数据。

1.包含一个字段

-- 对查询的语文成绩加10分
select id,name,chinese+10 from exam_result;

运行结果:

mysql基本语句增删改查 mysql基本增删改查命令_mysql基本语句增删改查_04


2.包含多个字段

-- 对插叙的数学加10分,英语加5分
select id,name,chinese,math+10,english+5 from exam_result;

运行结果:

mysql基本语句增删改查 mysql基本增删改查命令_database_05


3.多个字段求和

我们可以对查询结果进行求和来求总成绩

select name,chinese+math+english from exam_result;

运行结果:

mysql基本语句增删改查 mysql基本增删改查命令_database_06

4.起别名(as)

为查询结果中的列指定别名,表示返回的结果集中,以别名作为该列的名称

select id,name,chinese+math+english 总分 from exam_result;

运行结果

mysql基本语句增删改查 mysql基本增删改查命令_数据库_07

为了更好区分我们还可以在别名前面加上 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;

mysql基本语句增删改查 mysql基本增删改查命令_数据库_08

5.去重(distinct)

通过 查询关键字 select 配合 distinct 关键字来去重

select distinct 去重列名 from 表名

-- 不去重的查询
select chinese from exam_result;

mysql基本语句增删改查 mysql基本增删改查命令_mysql基本语句增删改查_09


去重后

-- 去重代码
select distinct chinese from exam_result;

mysql基本语句增删改查 mysql基本增删改查命令_mysql_10


还可以指定多列去重,指定多列的时候需要每一列都相同才会去重。

-- 去重前
select chinese,math,english from exam_result;

mysql基本语句增删改查 mysql基本增删改查命令_mysql基本语句增删改查_11


去重后

select distinct chinese,math,english from exam_result;

mysql基本语句增删改查 mysql基本增删改查命令_mysql基本语句增删改查_12

注意:每次去重操作其实都涉及到比较运算,比较整数没啥问题,如果比较 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;

运行结果:

mysql基本语句增删改查 mysql基本增删改查命令_mysql基本语句增删改查_13


使用表达式排序

按总成绩从高到低排序

select id,name,chinese+math+english from exam_result order by chinese+english+math desc;

运行结果:

mysql基本语句增删改查 mysql基本增删改查命令_字段_14


使用表达式排序起别名排序

select id,name,chinese+math+english as 总分  from exam_result order by chinese+math+english desc

运行结果:

mysql基本语句增删改查 mysql基本增删改查命令_mysql基本语句增删改查_15


多个字段进行排序,排序优先级随书写顺序

select name,chinese,math,english from exam_result order by chinese ,math,chinese;

先按照语文升序排序,如果语文成绩相同,用数学成绩进行降序排序,同理如果语文数学成绩相同就用英语降序排序

mysql基本语句增删改查 mysql基本增删改查命令_数据库_16


可对数据去重后排序

排序前

mysql基本语句增删改查 mysql基本增删改查命令_mysql基本语句增删改查_17


去重排序后

-- 对语文成绩去重排序
select distinct chinese from exam_result order by chinese;

mysql基本语句增删改查 mysql基本增删改查命令_mysql基本语句增删改查_18

7.条件查询(where)

比较运算符:

mysql基本语句增删改查 mysql基本增删改查命令_mysql_19


逻辑运算符:

mysql基本语句增删改查 mysql基本增删改查命令_mysql_20

注意:

  1. WHERE条件可以使用表达式,但不能使用别名。
  2. 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 个字符
“_”:每一个可以代替一个字符

当前表中的所有同学

mysql基本语句增删改查 mysql基本增删改查命令_数据库_21

-- 查询所有姓孙的同学
select name from exam_result where name like '孙%';

运行结果

mysql基本语句增删改查 mysql基本增删改查命令_mysql基本语句增删改查_22

-- 查询所有名字两个字且性孙的同学
select name from exam_result where name like '孙_';

运行结果

mysql基本语句增删改查 mysql基本增删改查命令_mysql基本语句增删改查_23

null的查询

查询 NULL 的时候不能直接使用 = ,可以用

  1. <=>
  2. is null
-- 两种方法都可以判断是不是 null
select name chinese from exam_result where chinese <=> null;
select name chinese from exam_result where chinese is null;

示例:

mysql基本语句增删改查 mysql基本增删改查命令_mysql_24


查询不是 null 的同学

-- 查询英语成绩不为 null 的同学
select name chinese from exam_result where english is not null;

8.分页查询(limit)

如果查询的数据有成千上万条,就不适合在一个页面显示了。

mysql基本语句增删改查 mysql基本增删改查命令_mysql_25


语法:

-- 起始下标为 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;

mysql基本语句增删改查 mysql基本增删改查命令_database_26

-- 查询从3开始往后8条数据并以数学成绩排序
select id,name,chinese,math,english from exam_result order by math limit 8 offset 3;

mysql基本语句增删改查 mysql基本增删改查命令_database_27

注意:如果操作线上数据库,每个SQL语句都要带上 limit

9.插入查询结果

语法:

INSERT INTO table_name [(column [, column ...])] SELECT ...

我们可以把一个表的查询结果插入到另外一个表中,需要注意以下几点:

  1. 查询表中的结果中的字段要和插入表中的字段类型对应
  2. 不一定需要两个表中的字段全部对应,只需要查询到的结果中的字段在被插入的表中要存在,且类型一样

代码示例:
创建一个学生表和用户表,插入两条数据

-- 用户表
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 ...]

修改前

mysql基本语句增删改查 mysql基本增删改查命令_database_28

-- 把孙权的数学成绩改成80
update exam_result set math = 80 where name = '孙权';
-- 把刘备的数学成绩改为60,语文改为成绩70
update exam_result set math = 60,chinese = 70 where name = '刘备';

mysql基本语句增删改查 mysql基本增删改查命令_字段_29


修改前

mysql基本语句增删改查 mysql基本增删改查命令_mysql基本语句增删改查_30

-- 把总成绩前三的同学的数学分数减10分
update exam_result set math = math-10 order by chinese+math+english desc limit 3;

mysql基本语句增删改查 mysql基本增删改查命令_字段_31

-- 将所有同学的语文成绩更新为原来的 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 表名;

总结

  1. 插入数据
-- 单行插入
insert into 表(字段1, ..., 字段N) values (value1, ..., value N);
-- 多行插入
insert into 表(字段1, ..., 字段N) values
(value1, ...),
(value2, ...),
(value3, ...)
  1. 查询: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 条件
比特科
  1. 修改:update
update 表 set 字段1=value1, 字段2=value2... where 条件
  1. 删除:delete
delete from 表 where 条件

注意:

  1. where 条件可以使用表达式,但不能使用别名
  2. 判断是否为 null 要使用 <=> 或者 is null ,非 null 则用 not null
  3. 修改数据时一定要加上 where ,一旦忘记加上 where 就可能修改掉所有数据
  4. 如果操作线上数据库,每个SQL语句都要带上 limit