【MySQL】表的增删查改(CRUD)(下)

发布于:2025-03-07 ⋅ 阅读:(17) ⋅ 点赞:(0)

个人主页♡喜欢做梦

欢迎  👍点赞  ➕关注  ❤️收藏  💬评论


本篇是继上篇的下篇,如果上篇没有看过小伙伴,可以先看看我的上一篇再来看一下这一篇【MySQL】表的增删查改(CRUD)(上) 

💥条件查询(where)

概念: 

条件查询:允许用户在查询语句中指定筛选条件,数据库中会根据这些条件从表中筛选出符合条件的数据,将满足条件的记录返回给用户,不满足的条件的排出在外。

  • 进行条件查询需要用到where,否则在没有写where的情况下,写运算符会发生报错。

运算符 

比较运算符:

运算符 说明
>,>=,<,<= 大于,大于等于,小于,小于等于
= 等于,null不安全,例如null=null,结果为null
<=> 等于,null安全,例如null=null,结果为true(1)
!=,<> 不等于

between a and b

匹配范围,[a0,a1],如果a0<=value<=a1,则返回true(1)

in(option1,option2....) 如果是in中任意一个option,则返回true(1)
is null 如果是null,则返回true(1)
is not null 如果不是null,则返回true(1)
like

模糊匹配,%表示任意多个(包括0个)任意字符;

_表示任意一个字符

  •  这里的等于就是=,而不是==;

逻辑运算符

运算符 说明
and 多个条件必须都为true(1),结果才为true(1)
or 任意一个条件为true(1),结果才为true(1)
not 条件为true(1),结果为false(0)
  • and类似于&&;
  • or类似于||;
  • not类似于!; 
  • 逻辑运算符具有优先级,建议用括号制定。

示例:

表中数据:

mysql> select * from exam;
+------+--------+---------+------+---------+
| id   | name   | chinese | math | english |
+------+--------+---------+------+---------+
|    1 | 张三   |    67.0 | 80.0 |    88.0 |
|    2 | 李四   |    87.0 | 55.0 |    66.0 |
|    3 | 小五   |    91.0 | 90.0 |    96.0 |
|    4 | 小六   |    48.0 | 32.0 |    55.0 |
|    5 | 赵六   |    91.0 | 90.0 |    96.0 |
|    6 | 老王   |    23.0 | 36.0 |    NULL |
|    7 | 老六   |    33.0 | 26.0 |    66.0 |
|    8 | 孙武   |    77.0 | 88.0 |    NULL |
+------+--------+---------+------+---------+
8 rows in set (0.00 sec)
🔥基本查询  
--查询语文成绩大于60的同学(>)
mysql>  select * from exam where chinese>60;
+------+--------+---------+------+---------+
| id   | name   | chinese | math | english |
+------+--------+---------+------+---------+
|    1 | 张三   |    67.0 | 80.0 |    88.0 |
|    2 | 李四   |    87.0 | 55.0 |    66.0 |
|    3 | 小五   |    91.0 | 90.0 |    96.0 |
|    5 | 赵六   |    91.0 | 90.0 |    96.0 |
|    8 | 孙武   |    77.0 | 88.0 |    NULL |
+------+--------+---------+------+---------+
5 rows in set (0.00 sec)

--查询英语成绩小于60的同学(其结果集会自动过滤null)
mysql> select * from exam where english<60;
+------+--------+---------+------+---------+
| id   | name   | chinese | math | english |
+------+--------+---------+------+---------+
|    4 | 小六   |    48.0 | 32.0 |    55.0 |
+------+--------+---------+------+---------+
1 row in set (0.00 sec)

--查询数学成绩为90的同学(=)
mysql>  select * from exam where math=90;
+------+--------+---------+------+---------+
| id   | name   | chinese | math | english |
+------+--------+---------+------+---------+
|    3 | 小五   |    91.0 | 90.0 |    96.0 |
|    5 | 赵六   |    91.0 | 90.0 |    96.0 |
+------+--------+---------+------+---------+
2 rows in set (0.00 sec)

--查询数学成绩为85的同学(=)
mysql>   select * from exam where math=85;
--不存在数学成绩为85的同学,显示为空
Empty set (0.00 sec)

--查询数学成绩不为90的同学(<>或者!=)
mysql>  select * from exam where math<>90;
+------+--------+---------+------+---------+
| id   | name   | chinese | math | english |
+------+--------+---------+------+---------+
|    1 | 张三   |    67.0 | 80.0 |    88.0 |
|    2 | 李四   |    87.0 | 55.0 |    66.0 |
|    4 | 小六   |    48.0 | 32.0 |    55.0 |
|    6 | 老王   |    23.0 | 36.0 |    NULL |
|    7 | 老六   |    33.0 | 26.0 |    66.0 |
|    8 | 孙武   |    77.0 | 88.0 |    NULL |
+------+--------+---------+------+---------+
6 rows in set (0.00 sec)

--查询语数英总分小于150的同学
mysql> select *from exam where chinese+english+math<150;
+------+--------+---------+------+---------+
| id   | name   | chinese | math | english |
+------+--------+---------+------+---------+
|    4 | 小六   |    48.0 | 32.0 |    55.0 |
|    7 | 老六   |    33.0 | 26.0 |    66.0 |
+------+--------+---------+------+---------+
2 rows in set (0.00 sec)

--where不能使用别名,否则会报错
mysql> select name,chinese+math+english as total from exam where total<150;
ERROR 1054 (42S22): Unknown column 'total' in 'where clause'

--进行条件查询的同时可以对数据进行排序
mysql>  select name,chinese+math+english as total from exam where chinese+english+math<150 order by total asc;
+--------+-------+
| name   | total |
+--------+-------+
| 老六   | 125.0 |
| 小六   | 135.0 |
+--------+-------+
2 rows in set (0.00 sec)

  •  结果集会自动过滤掉null;
  •  where不能使用别名,否则会发生报错;

为什么where不能使用别名?

这与MySQL执行SQL语句有关 

执行顺序:

  1. 首先确定表,执行from;
  2. 查询的时候爸符合条件的数据过滤处理,也就是接下来执行where语句,此时where语句还没有被定义别名;
  3. 随后执行select后面指定的列,将指定列加入到最中的结构中;
  4. 排序操作,根据order by子句中指定的列名和排序规则进行最后的排序。

🔥and与or
mysql>  select * from exam where math<60 or chinese>40 and english<70;
+------+--------+---------+------+---------+
| id   | name   | chinese | math | english |
+------+--------+---------+------+---------+
|    2 | 李四   |    87.0 | 55.0 |    66.0 |
|    4 | 小六   |    48.0 | 32.0 |    55.0 |
|    6 | 老王   |    23.0 | 36.0 |    NULL |
|    7 | 老六   |    33.0 | 26.0 |    66.0 |
+------+--------+---------+------+---------+
4 rows in set (0.00 sec)
  •  and与or的优先级比较

  • 优先级顺序:not>and>or;
  • 建议:用的时候还是手动加括号; 

  • 范围查询

1.between...and...

--查询英语成绩在60-90的同学(between a and b)
mysql>  select * from exam where english between 60 and 90;
+------+--------+---------+------+---------+
| id   | name   | chinese | math | english |
+------+--------+---------+------+---------+
|    1 | 张三   |    67.0 | 80.0 |    88.0 |
|    2 | 李四   |    87.0 | 55.0 |    66.0 |
|    7 | 老六   |    33.0 | 26.0 |    66.0 |
+------+--------+---------+------+---------+
3 rows in set (0.00 sec)

--也可以使用and
mysql> select * from exam where english >=60 and english <=90;
+------+--------+---------+------+---------+
| id   | name   | chinese | math | english |
+------+--------+---------+------+---------+
|    1 | 张三   |    67.0 | 80.0 |    88.0 |
|    2 | 李四   |    87.0 | 55.0 |    66.0 |
|    7 | 老六   |    33.0 | 26.0 |    66.0 |
+------+--------+---------+------+---------+
3 rows in set (0.00 sec)
  • between...and...左右是闭区间; 

2. in

--查找语文成绩为33或者87或者66的同学(in)
mysql> select * from exam where chinese in(33,87,66);
+------+--------+---------+------+---------+
| id   | name   | chinese | math | english |
+------+--------+---------+------+---------+
|    2 | 李四   |    87.0 | 55.0 |    66.0 |
|    7 | 老六   |    33.0 | 26.0 |    66.0 |
+------+--------+---------+------+---------+
2 rows in set (0.01 sec)

--也可以使用or来表示
mysql> select * from exam where chinese=33 or chinese=87 or  chinese=66;
+------+--------+---------+------+---------+
| id   | name   | chinese | math | english |
+------+--------+---------+------+---------+
|    2 | 李四   |    87.0 | 55.0 |    66.0 |
|    7 | 老六   |    33.0 | 26.0 |    66.0 |
+------+--------+---------+------+---------+
2 rows in set (0.01 sec)

 🔥模糊查询:like
--查找老开头的名字(%):
mysql> select * from exam where name like '老%';
+------+-----------+---------+------+---------+
| id   | name      | chinese | math | english |
+------+-----------+---------+------+---------+
|    6 | 老王      |    23.0 | 36.0 |    NULL |
|    7 | 老六      |    33.0 | 26.0 |    66.0 |
|    8 | 老小四    |    22.0 | 87.0 |    92.0 |
+------+-----------+---------+------+---------+
3 rows in set (0.00 sec)

--查找最后一个名字为六的名字:
mysql> select * from exam where name like '%六';
+------+--------+---------+------+---------+
| id   | name   | chinese | math | english |
+------+--------+---------+------+---------+
|    4 | 小六   |    48.0 | 32.0 |    55.0 |
|    5 | 赵六   |    91.0 | 90.0 |    96.0 |
|    7 | 老六   |    33.0 | 26.0 |    66.0 |
+------+--------+---------+------+---------+
3 rows in set (0.00 sec)

--查找名字开头为老,且名只有一个的名字:
mysql>  select * from exam where name like '老_';
+------+--------+---------+------+---------+
| id   | name   | chinese | math | english |
+------+--------+---------+------+---------+
|    6 | 老王   |    23.0 | 36.0 |    NULL |
|    7 | 老六   |    33.0 | 26.0 |    66.0 |
+------+--------+---------+------+---------+
2 rows in set (0.00 sec)

--查找语文成绩为9开头的同学:
mysql>  select * from exam where chinese like '9%';
+------+--------+---------+------+---------+
| id   | name   | chinese | math | english |
+------+--------+---------+------+---------+
|    3 | 小五   |    91.0 | 90.0 |    96.0 |
|    5 | 赵六   |    91.0 | 90.0 |    96.0 |
+------+--------+---------+------+---------+
2 rows in set (0.00 sec)
  • 查询时要使用 like 不能使用 = ;
  • %表示任意多个(包括0个)任意字符;
  • _表示任意一个字符;
  • 要记得加上单引号,否则报错;

 🔥Null查询
--查找英语成绩为null的同学:
mysql>  select * from exam where english is null;
+------+--------+---------+------+---------+
| id   | name   | chinese | math | english |
+------+--------+---------+------+---------+
|    6 | 老王   |    23.0 | 36.0 |    NULL |
|    8 | 孙武   |    77.0 | 88.0 |    NULL |
+------+--------+---------+------+---------+
2 rows in set (0.00 sec)

--查找英语成绩不为null的同学:
mysql> select * from exam where english is  not null;
+------+-----------+---------+------+---------+
| id   | name      | chinese | math | english |
+------+-----------+---------+------+---------+
|    1 | 张三      |    67.0 | 80.0 |    88.0 |
|    2 | 李四      |    87.0 | 55.0 |    66.0 |
|    3 | 小五      |    91.0 | 90.0 |    96.0 |
|    4 | 小六      |    48.0 | 32.0 |    55.0 |
|    5 | 赵六      |    91.0 | 90.0 |    96.0 |
|    7 | 老六      |    33.0 | 26.0 |    66.0 |
|    8 | 老小四    |    22.0 | 87.0 |    92.0 |
+------+-----------+---------+------+---------+
7 rows in set (0.00 sec)

--也可以使用<=>
mysql>  select * from exam where english <=> null;
+------+--------+---------+------+---------+
| id   | name   | chinese | math | english |
+------+--------+---------+------+---------+
|    6 | 老王   |    23.0 | 36.0 |    NULL |
|    8 | 孙武   |    77.0 | 88.0 |    NULL |
+------+--------+---------+------+---------+
2 rows in set (0.00 sec)
  • 查询null值时,不能使用=,!=,否则显示为空;

  • 也可以使用<=>来查找为null的值; 

🔥分页查询:limit

概念: 

分页查询:用于将大量数据按照一定的大小进行划分,以便逐页获取和展示数据。 

语法:

--从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开始;
  • s表示起始位置;
  • n表示每页显示的记录数; 
  • offset表示起始位置;

 示例:

--从第一条开始,记录数为0:
--写法一:
mysql>  select * from exam limit 3;
+------+--------+---------+------+---------+
| id   | name   | chinese | math | english |
+------+--------+---------+------+---------+
|    1 | 张三   |    67.0 | 80.0 |    88.0 |
|    2 | 李四   |    87.0 | 55.0 |    66.0 |
|    3 | 小五   |    91.0 | 90.0 |    96.0 |
+------+--------+---------+------+---------+
3 rows in set (0.00 sec)

--写法二:
mysql> select * from exam limit 0,3;
+------+--------+---------+------+---------+
| id   | name   | chinese | math | english |
+------+--------+---------+------+---------+
|    1 | 张三   |    67.0 | 80.0 |    88.0 |
|    2 | 李四   |    87.0 | 55.0 |    66.0 |
|    3 | 小五   |    91.0 | 90.0 |    96.0 |
+------+--------+---------+------+---------+
3 rows in set (0.00 sec)

--写法三:
mysql>  select * from exam limit 3 offset 0;
+------+--------+---------+------+---------+
| id   | name   | chinese | math | english |
+------+--------+---------+------+---------+
|    1 | 张三   |    67.0 | 80.0 |    88.0 |
|    2 | 李四   |    87.0 | 55.0 |    66.0 |
|    3 | 小五   |    91.0 | 90.0 |    96.0 |
+------+--------+---------+------+---------+
3 rows in set (0.00 sec)
  •  每一页起始位置的计算公式:s=(当前页号-1)*每页显示的记录数;

3.✨修改(update)

语法:

UPDATE table_name SET column = expr [, column = expr ...]
 [WHERE ...] [ORDER BY ...] [LIMIT ...]
  • update:表示制定要更新的表;
  • set:用于指定要更新的列和新值,也可以更新多个列,用逗号隔开;
  • where:可选句子,用于指定更新的条件。如果不使用where句子,那么将更新所有行。

示例:

--更新单条数据:
--将编号为1的同学姓名更改为王五
mysql> update exam set name = '王五' where id=1;
Query OK, 1 row affected (0.10 sec)
Rows matched: 1  Changed: 1  Warnings: 0

--更新多条记录
--将语文成绩小于60的同学成绩加上0.6:
mysql>  update exam set chinese=chinese+0.7 where chinese<60;
Query OK, 4 rows affected (0.06 sec)
Rows matched: 4  Changed: 4  Warnings: 0

--不加where:
--将所有同学的数学成绩加上0.5
mysql>  update exam set math=math+0.5 ;
Query OK, 9 rows affected (0.10 sec)
Rows matched: 9  Changed: 9  Warnings: 0

mysql>  select * from exam;
+------+-----------+---------+------+---------+
| id   | name      | chinese | math | english |
+------+-----------+---------+------+---------+
|    1 | 王五      |    67.0 | 80.5 |    88.0 |
|    2 | 李四      |    87.0 | 55.5 |    66.0 |
|    3 | 小五      |    91.0 | 90.5 |    96.0 |
|    4 | 小六      |    48.7 | 32.5 |    55.0 |
|    5 | 赵六      |    91.0 | 90.5 |    96.0 |
|    6 | 老王      |    23.7 | 36.5 |    NULL |
|    7 | 老六      |    33.7 | 26.5 |    66.0 |
|    8 | 孙武      |    77.0 | 88.5 |    NULL |
|    8 | 老小四    |    22.7 | 87.5 |    92.0 |
+------+-----------+---------+------+---------+
9 rows in set (0.00 sec)

4.✨删除(delete)

语法:

delete from table_name [where...][order by...][limit...];
  •  delete from:指定要删除的表;
  • where:可选句子,用于指定删除的条件。如果不使用where句子,那么将删除所有数据。

示例:

--先查询语文成绩小于60的同学:
mysql> select * from exam where chinese<60;
+------+-----------+---------+------+---------+
| id   | name      | chinese | math | english |
+------+-----------+---------+------+---------+
|    4 | 小六      |    48.7 | 32.5 |    55.0 |
|    6 | 老王      |    23.7 | 36.5 |    NULL |
|    7 | 老六      |    33.7 | 26.5 |    66.0 |
|    8 | 老小四    |    22.7 | 87.5 |    92.0 |
+------+-----------+---------+------+---------+
4 rows in set (0.00 sec)

--将语文成绩小于60的同学进行排序,删除两条记录:
mysql>  delete from exam where chinese<60 order by chinese asc limit 2;
Query OK, 2 rows affected (0.08 sec)

----删除后语文成绩小于60的同学:
mysql> select * from exam where chinese<60;
+------+--------+---------+------+---------+
| id   | name   | chinese | math | english |
+------+--------+---------+------+---------+
|    4 | 小六   |    48.7 | 32.5 |    55.0 |
|    7 | 老六   |    33.7 | 26.5 |    66.0 |
+------+--------+---------+------+---------+
2 rows in set (0.00 sec)

基本查询差不多就到这里就完结啦🌹🌹🌹