0
点赞
收藏
分享

微信扫一扫

mysql进阶学习

_阿瑶 2022-05-06 阅读 81

文章目录


前言

你们的点赞关注收藏是我写作的动力!!!!!!
提示:以下是本篇文章正文内容,下面案例可供参考

一、比较运算符

比较运算符用于比较运算,判断逻辑是否成立。
比较运算符的使用方式如下:

A operator B

其中 operator 是比较运算符,用于对 A 和 B 进行比较运算。

常用的比较运算符有 =(等于) 、!=(不等于)、 <>(不等于)、<(小于)、<=(小于等于)、>(大于)、>=(大于等于),其中 != 和 <> 在特殊情况下用法是不同的,这里暂时不提。

比较运算符常常与 WHERE 在一起使用。WHERE 用于逻辑判断,WHERE 后面写判断的条件,满足条件的语句会被筛选出来。

WHERE 比较运算符的使用方式如下:

WHERE A operator B

👇我们可以通过下面的实例来感受一下比较运算符的用法。

假如我们要查询学生人数超过 800 的所有课程信息,我们可以使用下面的 SQL 语句:

SELECT * 
FROM `courses`
WHERE `student_count` > 800;

执行输出结果

mysql> SELECT *
    -> FROM `courses`
    -> WHERE `student_count` > 800;
+----+-------------------------+---------------+------------+------------+
| id | name                    | student_count | created_at | teacher_id |
+----+-------------------------+---------------+------------+------------+
|  1 | Advanced Algorithms     |           880 | 2020-06-01 |          4 |
|  2 | System Design           |          1350 | 2020-07-18 |          3 |
|  6 | Artificial Intelligence |          1660 | 2018-05-13 |          3 |
| 12 | Dynamic Programming     |          2000 | 2018-08-18 |          1 |
+----+-------------------------+---------------+------------+------------+
4 rows in set (0.00 sec)

结果可以清楚地看出学生人数超过 800 的课程一共有四门,课程名称如上所示。

二、逻辑运算符

1.使用 AND 连接多条件

使用 SQL 中的逻辑运算符 AND 可以将 WHERE 子句中两个或两个以上的条件结合起来,其结果是满足 AND 连接的所有条件的数据。

语法

SELECT `column_name` 
FROM `table_name` 
WHERE condition1 AND condition2;

其中:
condition 为设置的条件,最后返回的结果应为满足 condition1 和 condition2 的数据。
👇我们可以通过下面的实例来感受一下逻辑运算符 AND 的用法。

假设我们要查询课程表 courses 中学生人数 student_count 在 800 (包括) 至 1000 (不包括) 之间的所有课程,我们可以使用下面的 SQL 语句:

SELECT *
FROM `courses`
WHERE `student_count` >= 800 AND `student_count` < 1000;

执行输出结果:

mysql> SELECT *
    -> FROM `courses`
    -> WHERE `student_count` >= 800 AND `student_count` < 1000;
+----+---------------------+---------------+------------+------------+
| id | name                | student_count | created_at | teacher_id |
+----+---------------------+---------------+------------+------------+
|  1 | Advanced Algorithms |           880 | 2020-06-01 |          4 |
+----+---------------------+---------------+------------+------------+
1 row in set (0.07 sec)

2.使用 OR 连接多个条件

使用 SQL 中的逻辑运算符 OR 与 AND 关键字不同,OR 关键字,只要记录满足任意一个条件,就会被查询出来。

语法

SELECT `column_name` 
FROM `table_name` 
WHERE condition1 or condition2;

其中:
condition1 和 condition2 为设置的条件,最后返回的结果应满足 condition1 或 condition2 的数据。

👇我们可以通过下面的实例来感受一下逻辑运算符 OR 的用法。

如果我们要查询课程表 courses 中课程名为 ‘System Design’ 或 ‘Django’ 的课程信息,我们可以使用下面的 SQL 语句:

SELECT *
FROM `courses`
WHERE `name` = 'System Design'
	OR `name` = 'Django';

执行输出结果:

mysql> SELECT *
    -> FROM `courses`
    -> WHERE `name` = 'System Design'
    -> OR `name` = 'Django';
+----+---------------+---------------+------------+------------+
| id | name          | student_count | created_at | teacher_id |
+----+---------------+---------------+------------+------------+
|  2 | System Design |          1350 | 2020-07-18 |          3 |
|  3 | Django        |           780 | 2020-02-24 |          3 |
+----+---------------+---------------+------------+------------+
2 rows in set (0.00 sec)

3.使用 NOT 过滤不满足条件的数据

使用 SQL 中的逻辑运算符 NOT 可以过滤掉 WHERE 子句中不满足条件的结果集。

语法

SELECT `column_name` 
FROM `table_name` 
WHERE NOT `condition`;

其中:
condition 为设置的条件,最后返回的结果应不满足 condition 。

👇我们可以通过下面的实例来感受一下逻辑运算符 NOT 的用法。

假设我们要查询教师表 teachers 中除了年龄 age 在 20 岁以上(不包括 20 岁)且来自于中国(CN)的以外所有教师信息,我们可以使用下面的 SQL 语句:

SELECT *
FROM `teachers`
WHERE NOT (`age` > 20 AND `country` = 'CN');

执行输出结果:

mysql> SELECT *
    -> FROM `teachers`
    -> WHERE NOT (`age` > 20 AND `country` = 'CN');
+----+------------------+---------------------------+-----+---------+
| id | name             | email                     | age | country |
+----+------------------+---------------------------+-----+---------+
|  1 | Eastern Heretic  | eastern.heretic@gmail.com |  20 | UK      |
|  3 | Western Venom    | western.venom@163.com     |  28 | USA     |
|  4 | Southern Emperor | southern.emperor@qq.com   |  21 | JP      |
|  5 | Linghu Chong     | NULL                      |  18 | CN      |
+----+------------------+---------------------------+-----+---------+
4 rows in set (0.00 sec)

三、特殊条件

1.使用 IN 查询多条件

当我们需要查询单个表条件过多时,就会用多个 ‘OR’ 连接或者嵌套,这会比较麻烦,现在我们有 ‘IN’ 能更方便的解决这一问题。
示例代码
IN 用法:

SELECT *
FROM `table_name`
WHERE `column_name` IN `value`;

👇 我们可以通过下面的实例来感受一下 IN 的用法。

假如我们想查询教师表 teachers 中教师国籍为中国 (CN) 或英国 (UK) 的所有教师信息,我们可以使用下面的 SQL 语句:

SELECT *
FROM `teachers`
WHERE `country` IN ('CN', 'UK');

执行输出结果

mysql> SELECT *
    -> FROM `teachers`
    -> WHERE `country` IN ('CN', 'UK');
+----+-----------------+---------------------------+-----+---------+
| id | name            | email                     | age | country |
+----+-----------------+---------------------------+-----+---------+
|  1 | Eastern Heretic | eastern.heretic@gmail.com |  20 | UK      |
|  2 | Northern Beggar | northern.beggar@qq.com    |  21 | CN      |
|  5 | Linghu Chong    | NULL                      |  18 | CN      |
+----+-----------------+---------------------------+-----+---------+
3 rows in set (0.01 sec)

2.使用 NOT IN 排除

前面我们已经学习了逻辑运算符,这里的 ‘IN’ 也可以与逻辑运算符 ‘NOT’ 并用,组成 ‘NOT IN’,表示不在集合中的所有结果。

示例代码

NOT IN 用法:

SELECT *
FROM `table_name`
WHERE `column_name` NOT IN value;

👇 我们可以通过下面的实例来感受一下 NOT IN 的用法。

假如我们想查询在教师表 teachers 中,国籍 “country” 不为日本 (JP) 和美国 (USA) 的所有教师信息,我们可以使用下面的 SQL 语句:

SELECT *
FROM `teachers`
WHERE `country` NOT IN ('JP', 'USA');

执行输出结果:

mysql> SELECT *
    -> FROM `teachers`
    -> WHERE `country` NOT IN ('JP', 'USA');
+----+-----------------+---------------------------+-----+---------+
| id | name            | email                     | age | country |
+----+-----------------+---------------------------+-----+---------+
|  1 | Eastern Heretic | eastern.heretic@gmail.com |  20 | UK      |
|  2 | Northern Beggar | northern.beggar@qq.com    |  21 | CN      |
|  5 | Linghu Chong    | NULL                      |  18 | CN      |
+----+-----------------+---------------------------+-----+---------+
3 rows in set (0.00 sec)

3.使用 BETWEEN AND 查询两值间的数据范围

BETWEEN AND 会选取介于两个值之间的数据范围。这些值可以是数值、文本或者日期。

请注意,在不同的数据库中,BETWEEN 操作符会产生不同的结果!

在某些数据库中,BETWEEN 选取介于两个值之间但不包括两个测试值的字段。

在某些数据库中,BETWEEN 选取介于两个值之间且包括两个测试值的字段。

在某些数据库中,BETWEEN 选取介于两个值之间且包括第一个测试值但不包括最后一个测试值的字段。

因此,请检查您的数据库是如何处理 BETWEEN 操作符!

我们这里选用的是 MySQL 的支持,BETWEEN 选取介于两个值之间且包括两个测试值的字段,即

BETWEEN 200 AND 250 选取结果会包括 200 和 250

示例代码

BETWEEN AND 用法:

SELECT *
FROM `table_name`
WHERE `column_name` BETWEEN `value` AND `value`;

👇 我们可以通过下面的实例来感受一下 BETWEEN AND 的用法。

下面的 SQL 语句从 teachers 表中查询年龄在 20 到 25 岁之间( 包括 20 和 25 岁 ),但是国籍不为中国和英国的教师信息,注意,BETWEEN AND 包括选取的两个值:

SELECT *
FROM `teachers`
WHERE (`age` BETWEEN 20 AND 25) AND (`country` NOT IN ('CN','UK'));

执行输出结果:

mysql> SELECT *
    -> FROM `teachers`
    -> WHERE (`age` BETWEEN 20 AND 25) AND (`country` NOT IN ('CN','UK'));
+----+------------------+-------------------------+-----+---------+
| id | name             | email                   | age | country |
+----+------------------+-------------------------+-----+---------+
|  4 | Southern Emperor | southern.emperor@qq.com |  21 | JP      |
+----+------------------+-------------------------+-----+---------+
1 row in set (0.00 sec)

注意这里我们 AND 左右的条件语句加入了括号(),是为了让括号()内的子语句优先计算,得到逻辑值真 (True) 或假 (False),再通过 AND 比较获得结果。

如果不加括号,则没办法直观的看出应该优先执行哪一部分,因为 BETWEEN AND 也有 AND,会造成混淆从而产生期望以外的结果。

4.使用 IS NULL 查询空数据

NULL 值代表遗漏的未知数据。默认的,表的列可以存放 NULL 值。
如果表中的某个列是可选的,那么我们可以在不向该列添加值的情况下插入新记录或更新已有的记录。这意味着该字段将以 NULL 值保存。

NULL 用作未知的或不适用的值的占位符。

注释:无法比较 NULL 和 0;它们是不等价的。

无法使用比较运算符来测试 NULL 值,比如 =、!= 或 <>。

我们必须使用 IS NULL 和 IS NOT NULL操作符。

示例代码

IS NULL 用法:

SELECT *
FROM `table_name`
WHERE `column_name` IS NULL;

👇 我们可以通过下面的实例来感受一下 IS NULL 的用法。

假如我们想从教师表 teachers 中查询邮箱 email 为空的所有教师信息,我们可以使用下面的 SQL 语句:

SELECT *
FROM `teachers`
WHERE `email` IS NULL;

执行输出结果:

mysql> SELECT *
    -> FROM `teachers`
    -> WHERE `email` IS NULL;
+----+--------------+-------+-----+---------+
| id | name         | email | age | country |
+----+--------------+-------+-----+---------+
|  5 | Linghu Chong | NULL  |  18 | CN      |
+----+--------------+-------+-----+---------+
1 row in set (0.00 sec)

5.使用 LIKE 模糊查询

前面我们学习 BETWEEN AND 和比较运算符时,和文本操作类似,比如前面课程名称首字母的范围,这种方案虽然可行但是不稳定,不是直接对文本的操作。在这里我们学习使用 LIKE 更准确规范得解决文本比较问题。

LIKE 比较类似我们平时用到的搜索。

示例代码

LIKE 用法:

SELECT *
FROM `table_name`
WHERE `column_name` LIKE  `value`;

👇 我们可以通过下面的实例来感受一下 LIKE 的用法。

假如我们想查询课程表 courses 中以字母 ‘D’ 开头的所有课程,我们可以使用下面的 SQL 语句:

SELECT *
FROM `courses`
WHERE `name` LIKE 'D%';

执行输出结果:

mysql> SELECT *
    -> FROM `courses`
    -> WHERE `name` LIKE 'D%';
+----+---------------------+---------------+------------+------------+
| id | name                | student_count | created_at | teacher_id |
+----+---------------------+---------------+------------+------------+
|  3 | Django              |           780 | 2020-02-29 |          3 |
|  8 | Data Analysis       |           500 | 2019-07-12 |          1 |
| 12 | Dynamic Programming |          2000 | 2018-08-18 |          1 |
+----+---------------------+---------------+------------+------------+
3 rows in set (0.00 sec)

其中 ‘D%’ 表示以 D 开头的所有单词,% 表示为通配符,可以替代 0 个或多个字符

对于SQL 中的通配符有以下类型:
在这里插入图片描述

四、ORDER BY 与 LIMIT

1.使用 ORDER BY 对数据进行排序

在前面的学习中,我们学习了如何对表中的数据进行简单的查询,仔细观察后可以发现,检索出的数据并不是以纯粹的随机顺序显示的,在没有对其进行排序时,数据以它在表中出现的顺序显示,一般为数据最初添加到表中的顺序。

当我们想要查询具有明确排序的数据时,ORDER BY 关键字就可以帮助到我们。

ORDER BY 关键字用于对结果集按照一个列或者多个列进行排序,其具有 ASC(升序)和 DESC(降序)两个关键字,且默认按照升序排列。

  • ASC :按升序排列,ORDER BY 默认按照升序对记录进行排序,因此升序的关键字 ASC 可以省去不写。
  • DESC:按降序排列,如果需要按照降序对记录进行排序,可以使用 DESC 关键字。

基本语法

SELECT `column_name`, `column_name`
FROM `table_name`
ORDER BY `column_name`, `column_name` ASC|DESC;

1.1 对一列进行排序
我们可以使用 ORDER BY 关键字对结果集按照一个列或者多个列进行排序,我们首先学习一下如何按照一个列进行排序。

👇我们可以通过下面的实例来学习一下 ORDER BY column_name 的用法。

假如我们想查询课程表 courses 中的所有内容,并按照学生人数 student_count 升序排序。

我们可以使用下面的 SQL 语句:

SELECT *
FROM `courses`
ORDER BY `student_count`;

执行输出结果

mysql> SELECT *
    -> FROM `courses`
    -> ORDER BY `student_count`;
+----+-------------------------+---------------+------------+------------+
| id | name                    | student_count | created_at | teacher_id |
+----+-------------------------+---------------+------------+------------+
| 14 | Flash Sale              |           100 | 2018-01-01 |          5 |
| 10 | Object Oriented Design  |           300 | 2020-08-08 |          4 |
|  4 | Web                     |           340 | 2020-04-22 |          4 |
| 13 | Python                  |           400 | 2021-05-23 |          3 |
|  8 | Data Analysis           |           500 | 2019-07-12 |          1 |
|  5 | Big Data                |           700 | 2020-09-11 |          1 |
|  3 | Django                  |           780 | 2020-02-29 |          3 |
|  7 | Java P6+                |           780 | 2019-01-19 |          3 |
|  1 | Advanced Algorithms     |           880 | 2020-06-01 |          4 |
|  2 | System Design           |          1350 | 2020-07-18 |          3 |
|  6 | Artificial Intelligence |          1660 | 2018-05-13 |          3 |
| 12 | Dynamic Programming     |          2000 | 2018-08-18 |          1 |
+----+-------------------------+---------------+------------+------------+
12 rows in set (0.00 sec)

2.使用 LIMIT 限制输出行数

在前面的学习中我们知道 SELECT 语句返回所有匹配的行。可是当我们数据非常多时,如果只希望返回有限个数的数据的时候我们该怎么办呢?这时候 LIMIT 子句就能帮助到我们。

LIMIT 子句用于 SELECT 中,对输出结果集的行数进行约束,LIMIT 接收2个参数 offset 和 count,两个参数都是整型数字,但通常只用一个。

基本语法

SELECT `column_name`, `column_name`
FROM `table_name`
LIMIT `offset` , `count`;
  • offset :是返回集的初始标注,起始点是0,不是1哦
  • count :制定返回的数量

👇我们可以通过下面的实例来感受一下 LIMIT 的用法。

假如我们想查询课程表 course 中学生人数 student_count 最少的三门课程信息。

我们可以使用下面的 SQL 语句:

SELECT *
FROM `courses`
ORDER BY `student_count`
LIMIT 3;

注意

这里 LIMIT 关键字的位置,需要放在 ORDER BY 关键字的后面,否则会报错.

执行输出结果

mysql> SELECT *
    -> FROM `courses`
    -> ORDER BY `student_count`
    -> LIMIT 3;
+----+------------------------+---------------+------------+------------+
| id | name                   | student_count | created_at | teacher_id |
+----+------------------------+---------------+------------+------------+
| 14 | Flash Sale             |           100 | 2018-01-01 |          5 |
| 10 | Object Oriented Design |           300 | 2020-08-08 |          4 |
|  4 | Web                    |           340 | 2020-04-22 |          4 |
+----+------------------------+---------------+------------+------------+
3 rows in set (0.00 sec)
举报

相关推荐

0 条评论