MYSQL表的增删改查

1. CRUD

  • 在SQL中可以使用"--空格+描述"来注释说明
  • CRUD即增加(create)、查询(retrieve)、更新(update)、删除(delete)四个单词的首字母缩写。

2. 新增(Create)

先创建一张表:

mysql>  create table student(
    ->  id int,
    ->  sn int comment'学号',
    -> name varchar(20) comment'姓名'
    -> );

插入语法:

insert into table_name
[(column [, column]...)]
values (value_list) [,(values_list)]...

values_list:value,[,value]...

2.1 单行数据+全列插入

mysql> insert into student values(100,10000,'唐三藏');

mysql> insert into student values (101,10001,'孙悟空');

2.2 多行数据+指定列插入

 insert into student (id,sn,name) values
 (102,20001,'曹孟德'),
 (103,20002,'孙仲谋');

3. 查询(Retrieve)

语法:

select 查询关键字
[distinct] * |{column [, column]...}去重关键字(一个或多个字段去重)
[from table_name] 从哪张表过滤
[where...] 条件过滤
[order by column [asc| desc],...]根据指定的字段(可以有多个)来排序
limit...分页关键字
mysql>  create table exam_result(
    -> id int,
    -> name varchar(20),
    -> chinese decimal(3,1),
    ->  math decimal(3,1),
    -> english decimal(3,1)
    -> );
mysql> 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);

3.1 全列查询

-- 通常情况下不建议使用 * 进行全列查询
-- 1. 查询的列越多,意味着需要传输的数据量越大;
-- 2. 可能会影响到索引的使用
select * from exam_result;

在这里插入图片描述

3.2 指定列查询

-- 指定列的顺序不需要按定义表的顺序来
select id,name,english from exam_result;

在这里插入图片描述

3.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;

在这里插入图片描述
查询字段可以是

  1. 表的字段
  2. 常量值
  3. 加减乘除表达式

3.4 别名

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

select column [as] alias_name [...] from table_name;
-- 结果集中,表头的列名=别名
select id,name,chinese+math+english 总分 from exam_result;

在这里插入图片描述

3.5 去重(Distinct)

-- 98分重复了
 select math from exam_result;
+------+
| math |
+------+
| 98.0 |
| 78.0 |
| 98.0 |
| 84.0 |
| 85.0 |
| 73.0 |
| 65.0 |
+------+
7 rows in set (0.00 sec)
--去重结果
mysql> select distinct math from exam_result;
+------+
| math |
+------+
| 98.0 |
| 78.0 |
| 84.0 |
| 85.0 |
| 73.0 |
| 65.0 |
+------+
6 rows in set (0.01 sec)

注意:可以跟多个字段,必须每个字段都相同,才会去重。

3.6 排序(ORDER BY)

语法:

-- asc 为升序(从小到大)
-- desc 为降序(从大到小)
-- 默认为asc
select ... from table_name [where ...]
order by column [asc|desc],[...];
  1. 没有order by子句的查询,返回的顺序是未定义的,永远不要依赖这个顺序
  2. 没有null数据排序,视为比任何值都小,升序出现在最上面,降序出现在最下面
  3. 使用表达式别名排序
-- 查询同学及总分,由高到低
select name, chinese+math+english 总分 from exam_result
    -> order by 总分 desc;
+-----------+--------+
| name      | 总分   |
+-----------+--------+
| 猪悟能    |  276.0 |
| 孙悟空    |  242.5 |
| 曹孟德    |  233.0 |
| 孙权      |  221.5 |
| 唐三藏    |  221.0 |
| 刘玄德    |  185.5 |
| 宋公明    |  170.0 |
+-----------+--------+
7 rows in set (0.00 sec)
  1. 可以对多个字段进行排序,排序优先级随书写顺序
-- 查询同学各门成绩,依次按数学降序,英语升序,语文升序的方式显示
mysql> select name,math,english,chinese from exam_result
    -> order by math desc,english,chinese;
+-----------+------+---------+---------+
| name      | math | english | chinese |
+-----------+------+---------+---------+
| 唐三藏    | 98.0 |    56.0 |    67.0 |
| 猪悟能    | 98.0 |    90.0 |    88.0 |
| 刘玄德    | 85.0 |    45.0 |    55.5 |
| 曹孟德    | 84.0 |    67.0 |    82.0 |
| 孙悟空    | 78.0 |    77.0 |    87.5 |
| 孙权      | 73.0 |    78.5 |    70.0 |
| 宋公明    | 65.0 |    30.0 |    75.0 |
+-----------+------+---------+---------+

3.7 条件查询(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 个)任意字符;_ 表示任意一个字符

注意
写成x=null或x!=null都不会报错,但是显示空的结果集

逻辑运算符

运算符说明
and多个条件必须都为 TRUE(1),结果才是 TRUE(1)
or任意一个条件为 TRUE(1), 结果为 TRUE(1)
not条件为 TRUE(1),结果为 FALSE(0)

注意:

  1. where条件可以使用表达式,但不能使用别名。
  2. and的优先级高于or,在同时使用时,需要使用小括号()包裹优先执行的部分。

示例:

  • 基本查询
 -- 查询英语成绩不及格的同学及英语成绩(<60)
mysql> select name,english from exam_result where english<60;
+-----------+---------+
| name      | english |
+-----------+---------+
| 唐三藏    |    56.0 |
| 刘玄德    |    45.0 |
| 宋公明    |    30.0 |
+-----------+---------+
3 rows in set (0.01 sec)
mysql> -- 查询语文成绩好于英语成绩的同学
mysql> select name,chinese,english from exam_result where english<chinese;
+-----------+---------+---------+
| name      | chinese | english |
+-----------+---------+---------+
| 唐三藏    |    67.0 |    56.0 |
| 孙悟空    |    87.5 |    77.0 |
| 曹孟德    |    82.0 |    67.0 |
| 刘玄德    |    55.5 |    45.0 |
| 宋公明    |    75.0 |    30.0 |
+-----------+---------+---------+

mysql> -- 查询总分在200分以下的同学
 -> where chinese+math+english <200;
+-----------+--------+
| name      | 总分   |
+-----------+--------+
| 刘玄德    |  185.5 |
| 宋公明    |  170.0 |
+-----------+--------+
  • and和or:
 -- 查询语文成绩大于80,且英语成绩大于80的同学
mysql> select * from exam_result where chinese>80 and english>80;
+------+-----------+---------+------+---------+
| id   | name      | chinese | math | english |
+------+-----------+---------+------+---------+
|    3 | 猪悟能    |    88.0 | 98.0 |    90.0 |
+------+-----------+---------+------+---------+
mysql> -- 查询语文成绩大于80, 或英语成绩大于80的同学
mysql> select * from exam_result where chinese >80 or english>80;
+------+-----------+---------+------+---------+
| id   | name      | chinese | math | english |
+------+-----------+---------+------+---------+
|    2 | 孙悟空    |    87.5 | 78.0 |    77.0 |
|    3 | 猪悟能    |    88.0 | 98.0 |    90.0 |
|    4 | 曹孟德    |    82.0 | 84.0 |    67.0 |
+------+-----------+---------+------+---------+
 -- 观察and和or的优先级
 mysql> select * from exam_result where chinese >80 or math>70 and english>70;
+------+-----------+---------+------+---------+
| id   | name      | chinese | math | english |
+------+-----------+---------+------+---------+
|    2 | 孙悟空    |    87.5 | 78.0 |    77.0 |
|    3 | 猪悟能    |    88.0 | 98.0 |    90.0 |
|    4 | 曹孟德    |    82.0 | 84.0 |    67.0 |
|    6 | 孙权      |    70.0 | 73.0 |    78.5 |
+------+-----------+---------+------+---------+

mysql> select * from exam_result where  (chinese >80 or math>70 ) and english>70;
+------+-----------+---------+------+---------+
| id   | name      | chinese | math | english |
+------+-----------+---------+------+---------+
|    2 | 孙悟空    |    87.5 | 78.0 |    77.0 |
|    3 | 猪悟能    |    88.0 | 98.0 |    90.0 |
|    6 | 孙权      |    70.0 | 73.0 |    78.5 |
+------+-----------+---------+------+---------+

注意
and优先级比or高,如果需要让or先执行,需要加()

  • 范围查询
    1.between… and …
-- 查询语文成绩在[80,90]的同学及语文成绩
mysql> select name,chinese from exam_result where chinese between 80 and 90;
+-----------+---------+
| name      | chinese |
+-----------+---------+
| 孙悟空    |    87.5 |
| 猪悟能    |    88.0 |
| 曹孟德    |    82.0 |
+-----------+---------+

 -- 使用and也可以实现
mysql> select name,chinese from exam_result where chinese >=80 and chinese<=90;
+-----------+---------+
| name      | chinese |
+-----------+---------+
| 孙悟空    |    87.5 |
| 猪悟能    |    88.0 |
| 曹孟德    |    82.0 |
+-----------+---------+

2.in

 -- 查询数学成绩是58 59 或者99 分的同学及数学成绩
mysql> select name,math from exam_result where math in(58,59,98,99);
+-----------+------+
| name      | math |
+-----------+------+
| 唐三藏    | 98.0 |
| 猪悟能    | 98.0 |
+-----------+------+

-- 使用or也可以实现
mysql> select name,math from
    -> exam_result where math =58 or math=59 or math=98 or math=99;
+-----------+------+
| name      | math |
+-----------+------+
| 唐三藏    | 98.0 |
| 猪悟能    | 98.0 |
+-----------+------+
  • 模糊查询
 -- % 匹配任意多个字符
mysql> select name from exam_result where name like '孙%';-- 匹配到带孙字的
+-----------+
| name      |
+-----------+
| 孙悟空    |
| 孙权      |
+-----------+

 -- _匹配严格的一个任意字符
mysql> select name from exam_result where name like '孙_';
+--------+
| name   |
+--------+
| 孙权   |
+--------+
  • 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;

3.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;

示例:
按id进行分页,每页3条记录,分别显示第1,2 ,3页

 -- 第1页
mysql> select id,name,math,english,chinese from exam_result order by id limit 3 offset 0;
+------+-----------+------+---------+---------+
| id   | name      | math | english | chinese |
+------+-----------+------+---------+---------+
|    1 | 唐三藏    | 98.0 |    56.0 |    67.0 |
|    2 | 孙悟空    | 78.0 |    77.0 |    87.5 |
|    3 | 猪悟能    | 98.0 |    90.0 |    88.0 |
+------+-----------+------+---------+---------+

-- 第2页
mysql> select id,name,math,english,chinese from exam_result order by id limit 3 offset 3;
+------+-----------+------+---------+---------+
| id   | name      | math | english | chinese |
+------+-----------+------+---------+---------+
|    4 | 曹孟德    | 84.0 |    67.0 |    82.0 |
|    5 | 刘玄德    | 85.0 |    45.0 |    55.5 |
|    6 | 孙权      | 73.0 |    78.5 |    70.0 |
+------+-----------+------+---------+---------+

 -- 第3页
mysql> select id,name,math,english,chinese from exam_result order by id limit 3 offset 6;
+------+-----------+------+---------+---------+
| id   | name      | math | english | chinese |
+------+-----------+------+---------+---------+
|    7 | 宋公明    | 65.0 |    30.0 |    75.0 |
+------+-----------+------+---------+---------+

4. 修改(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;
-- 将所有同学的语文成绩更新为原来的 2 倍
UPDATE exam_result SET chinese = chinese * 2;
DELETE FROM  table_name [WHERE ...] [ORDER BY ..

5. 删除(delete)

语法:

DELETE FROM  table_name [WHERE ...] [ORDER BY ...] [LIMIT...]

示例:

-- 删除孙悟空同学的考试成绩
mysql> delete from exam_result where name='孙悟空';

-- 删除整张表数据
mysql> -- 准备测试表
mysql> 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;

注意
修改和删除操作都是要非常谨慎的,建议把修改和删除sql转换为查询sql,先看是否是想删除或者修改的,再执行修改或者删除的语句。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值