文章目录
- 一、 插入数据
- 1. 单条数据插入
- 2. 批量插入数据
- 3. 插入默认值
- 4. 部分字段插入
- 5. 总结
- 二、更新数据
- 1. 基本的UPDATE语法
- 2. 带多个字段的更新
- 3. 批量条件更新
- 4. 小心条件为空的更新
- 教训
- 5. 一个实际例子:换专业的情况
- 6. 总结
- 三、删除数据
- 1. 删除特定数据:`DELETE`
- 2. 无条件删除:小心用`DELETE`
- 3. 快速清空表:`TRUNCATE`
- 4. `DELETE`和`TRUNCATE`的区别总结
- 5. 实例场景解析
- 6. 小心操作:删除数据前的思考
- 总结
- 四、查询数据
- 基本查询:`SELECT`语句的基本用法。
- 1. 基本的`SELECT`语法
- 2. 选择特定列
- 3. 为结果加点调味料:`WHERE`条件
- 4. 让查询结果排序:`ORDER BY`
- 5. 限定结果数:`LIMIT`
- 6. 组合条件:`AND`和`OR`
- 7. 总结
- 下面详细介绍一下select语句
- 1、条件查询:`WHERE`子句、条件运算符(`=`、`<>`、`>`、`<`等)
- 1. `WHERE`基本用法
- 2. 常用条件运算符
- 1) `=` :等于
- 2) `<>` 或 `!=` :不等于
- 3) `>` 和 `<` :大于和小于
- 4) `>=` 和 `<=` :大于等于和小于等于
- 3. 组合条件:用`AND`和`OR`筛选更精准
- 4. 用`IN`简化条件
- 5. 范围查询:用`BETWEEN`查找区间
- 6. 模糊查询:`LIKE`和通配符
- 总结
- 2、逻辑运算符:`AND`、`OR`、`NOT`
- 1. `AND`:我要两个条件都满足
- 2. `OR`:只要一个条件成立就行
- 3. `NOT`:排除不符合条件的数据
- 4. 逻辑运算符组合使用
- 5. 逻辑运算符的优先级
- 总结
- 3、模糊查询:`LIKE`、`IN`、`BETWEEN`
- 1. `LIKE`:模糊查找的万能钥匙
- 示例:
- 2. `IN`:指定多个选项进行筛选
- 示例:
- 3. `BETWEEN`:查找范围内的值
- 示例:
- 4. `LIKE`、`IN`和`BETWEEN`的综合示例
- 总结
- 4、排序:`ORDER BY`的用法
- 1. `ORDER BY`基础:升序和降序排序
- 例子1:按年龄升序排列
- 2. 降序排列:使用`DESC`关键字
- 例子2:按年龄降序排列
- 3. 按多个列排序
- 例子3:按部门和年龄排序
- 4. 多列混合排序:升序+降序
- 例子4:部门升序,年龄降序
- 5. 排序字段可以是计算结果
- 6. 小技巧:随机排序
- 总结
- 5、限制结果集:`LIMIT`的用法
- 1. 基本用法:限制结果条数
- 例子1:取前5条记录
- 2. 配合排序:查询前几条符合条件的记录
- 例子2:查询最新的5个商品
- 3. 从某个位置开始查询:`LIMIT offset, count`
- 例子3:分页显示——查询第6到第15条记录
- 4. 仅使用偏移量,返回指定位置之后的所有数据
- 例子4:从第10条开始,返回后面的所有记录
- 5. 与`OFFSET`配合的写法
- 总结
- 举个栗子
- 创建表语句
- 插入模拟数据
- 1. 插入数据:`INSERT INTO`
- 2. 更新数据:`UPDATE`
- 3. 删除数据:`DELETE` 和 `TRUNCATE`
- 4. 查询数据
- 基本查询:`SELECT`
- 条件查询:`WHERE` 子句和条件运算符
- 逻辑运算符:`AND`、`OR`、`NOT`
- 模糊查询:`LIKE`、`IN`、`BETWEEN`
- 排序:`ORDER BY`
- 限制结果集:`LIMIT`
一、 插入数据
在数据库中添加数据,就像往一个空架子上摆放书本。用MySQL的INSERT INTO
语法,我们可以轻松“搬运”数据到表中,无论是单条添加、批量插入,还是插入默认值,灵活性都非常高。
1. 单条数据插入
首先,最常见的操作就是往表中“摆放”一条完整的数据。假设我们有一张students
表,里面有学生的基本信息,包括student_id
、name
、age
和enrollment_date
。
INSERT INTO students (student_id, name, age, enrollment_date)
VALUES (1, '张三', 20, '2024-10-26');
INSERT INTO students
:指定要插入数据的表。- 列出字段:
(student_id, name, age, enrollment_date)
表示我们要填充的列。 - VALUES:用
VALUES
定义插入的具体值。 - 插入的结果就是一条完整的学生记录被添加到表中。
这样,表中就多了一条学生信息,这种方法适合一次插入单条数据。
2. 批量插入数据
假设我们有多个学生数据需要一次性插入。这时就可以用批量插入的方式,把几条记录一起加进去。
INSERT INTO students (student_id, name, age, enrollment_date)
VALUES
(2, '李四', 21, '2024-10-27'),
(3, '王五', 22, '2024-10-28'),
(4, '赵六', 19, '2024-10-29');
批量插入时,使用一条INSERT INTO
语句后列出多组VALUES
值,每组用逗号分隔。这样写一次SQL就能添加多条数据,不仅节省代码量,也减少了与数据库的交互次数,非常高效!
3. 插入默认值
有时候表中的某些字段设定了默认值,例如enrollment_date
默认是当天的日期,我们插入数据时就可以省略这个字段,让数据库自动填写默认值。
-- 如果我们只知道学生ID和姓名,其他的用默认值
INSERT INTO students (student_id, name)
VALUES (5, '小七');
假如enrollment_date
默认是当前日期,插入后这个字段会自动填上今天的日期,而不需要我们手动写入。利用默认值不仅方便,还能减少人为错误。
4. 部分字段插入
有时候我们并不需要为所有字段都填值,比如表中有些字段可以为空,或者我们只关心少量信息。那我们就只写这些字段即可。
-- 只插入学生ID和姓名,其他字段自动填充默认值或空值
INSERT INTO students (student_id, name)
VALUES (6, '周八');
如果表中age
和enrollment_date
允许为空(或有默认值),它们会自动填充为默认值或空值。这种方法可以用来快速插入部分数据而不影响其他字段。
5. 总结
- 单条插入:一次插入一条完整数据。
- 批量插入:一次插入多条数据,简化代码,提高效率。
- 插入默认值:表中设置了默认值的字段可以省略,数据库会自动填上默认内容。
- 部分字段插入:只指定必要字段,其余字段按默认值或空值处理。
不论是单条还是批量、默认值还是部分字段,INSERT INTO
都能满足各种需求,让我们可以灵活高效地把数据“搬”进数据库!
二、更新数据
在数据库中更新数据,就像给一批旧数据换上新的“衣服”,让它们符合新的需求。在MySQL里,UPDATE
语法是专门为此设计的,不论是更新某一行数据,还是批量修改符合条件的数据,UPDATE
都能轻松搞定。下面用大白话带你逐步了解数据更新的操作!
1. 基本的UPDATE语法
最简单的UPDATE
语法是指定要更新的表名、要更改的字段和新的值。假设我们有一个students
表,现在要更新学生“张三”的年龄。
-- 将学生ID为1的张三年龄改为21
UPDATE students
SET age = 21
WHERE student_id = 1;
UPDATE students
:选择要操作的表。SET
:指定要更改的字段和新值,比如把age
改成21
。WHERE student_id = 1
:加入条件,表示只更新student_id
为1的行,避免误改其他数据。
注意:一定要加上WHERE
条件,否则没有条件限制的UPDATE
会将表中所有学生的年龄都改成21
!这一点非常重要。
2. 带多个字段的更新
假设张三不仅年龄需要更新,还要改他的姓名和入学日期。我们可以用SET
指定多个字段,同时修改多列。
-- 更新张三的姓名、年龄和入学日期
UPDATE students
SET
name = '张三新',
age = 22,
enrollment_date = '2024-11-01'
WHERE student_id = 1;
在SET
后用逗号分隔多个字段,即可一次更新多个内容。这个方法适合需要对多列同时做修改的情况。
3. 批量条件更新
假如现在学校决定让所有年龄小于20岁的学生统一加1岁。使用条件批量更新,可以让MySQL自动找到符合条件的行并执行修改。
-- 给所有年龄小于20岁的学生加1岁
UPDATE students
SET age = age + 1
WHERE age < 20;
这里的age = age + 1
表示在现有年龄基础上加1,WHERE age < 20
会筛选出年龄小于20的所有学生。结果是,符合条件的每位学生的年龄都会自动加1岁,而其他学生数据不会受影响。
4. 小心条件为空的更新
如果你在执行UPDATE
时忘了加上WHERE
条件,那么所有行都会被更新!为了避免这种失误,建议在使用UPDATE
时仔细检查WHERE
条件,确保只更新符合要求的行。
-- 不小心漏掉WHERE的情况
UPDATE students
SET age = 18; -- 这会把表中所有学生的年龄都改成18!
教训
之前我做项目的时候就遇上过类似的情况,我们当时出现了类似的情况,好像是test分支向master分支合并的时候出了问题,导致生产代码出现了异常,前面逻辑出现了混乱,本来都是小问题,而且在测试生成的时候也没发现问题,但坏就坏在这段逻辑让数据库里面运行了这样一条语句:
UPDATE 表1 set 某几个钱 = 0
where id in
(select t1_id from 表2 where 1=1)
-- 出现了类似1=1的情况,好像是因为前面某个数据没传过来
如果是正常的全表更新,就比如上面的4,我们加了 BlockAttackInnerInterceptor
( 阻止全表更新删除的一个插件) 其实是没啥问题的,但是这句sql其实是按照主键更新,这个拦截完全没用上,一下子就把表1里面所有的这几个字段全清成0了。
屋漏偏逢连夜雨,当时那段时间服务器还出了问题,备份数据库是好久之前的,直接天上飞来一连串紧急问题,我们项目里面十来个人啥也不干了,直接通宵查日志一条条手动给用户恢复数据,ε=(´ο`*)))唉。
小建议:为了保险起见,平时可以在UPDATE
前先写一个SELECT
语句检查条件是否正确,再进行更新,当然还一定要注意代码逻辑,别出我们这种错误。
5. 一个实际例子:换专业的情况
假设学校有个students
表记录学生的专业(major
字段),现在所有“计算机科学”专业的学生需要改成“人工智能”。可以使用条件更新快速实现这个调整:
-- 把所有“计算机科学”专业的学生的专业改成“人工智能”
UPDATE students
SET major = '人工智能'
WHERE major = '计算机科学';
这个操作会检查major
字段里等于“计算机科学”的所有行,并将它们更新为“人工智能”。这种批量更新方式非常适合批量数据调整,比如调整专业、更新课程等。
6. 总结
- 基本更新:用
UPDATE
加SET
修改字段,配合WHERE
确定条件。 - 多字段更新:可以一次更改多个字段,
SET
后用逗号分隔。 - 条件更新:用
WHERE
指定条件,确保只更新符合要求的数据。 - 批量更新:在条件内符合的数据会被一起更新。
- 小心无条件更新:确保
WHERE
条件不为空,否则可能影响所有数据!
三、删除数据
在数据库管理中,删除数据就像清理杂物,但具体操作可以有轻有重。MySQL里常用的删除操作有两种:DELETE
和TRUNCATE
。这两个指令看似都在“清理”数据,实际上却有很大的区别。
1. 删除特定数据:DELETE
DELETE
语法可以让我们有选择性地删除数据,适合清理特定的记录。比如我们有一个students
表,记录了所有学生的信息,某位学生毕业了,这时就可以用DELETE
删除该学生的信息。
-- 删除学生ID为1的记录
DELETE FROM students
WHERE student_id = 1;
DELETE FROM students
:表示要从students
表中删除数据。WHERE student_id = 1
:加上条件,确保只删除ID为1的学生。
这样,只有符合WHERE
条件的行会被删除,其他数据不受影响。如果漏掉WHERE
条件怎么办呢?请看下一条。
2. 无条件删除:小心用DELETE
在使用DELETE
时,如果不加WHERE
条件,就会删除整个表中的所有数据!这种情况比较危险,尤其在生产环境里操作时一定要慎重。
-- 没有WHERE条件,将删除students表的所有数据
DELETE FROM students;
这个操作会清空students
表里的所有内容,但表结构(字段和表的定义)仍然保留。使用无条件的DELETE
时要特别小心,以免误删数据。
3. 快速清空表:TRUNCATE
TRUNCATE
是另一个“清空”表数据的命令,执行速度比DELETE
更快。它专门用于快速清空表中的所有数据,而且无法通过WHERE
条件筛选。TRUNCATE
通常会重新分配表的存储空间,因此速度非常快,但是操作后无法恢复。
-- 使用TRUNCATE清空students表的数据
TRUNCATE TABLE students;
与DELETE
不同的是,TRUNCATE
相当于把整个表“重置”了。这意味着数据一旦清空,整个表将完全恢复到“刚创建”的状态,比如所有自增ID会重新从1开始计数。
4. DELETE
和TRUNCATE
的区别总结
操作 | DELETE | TRUNCATE |
---|---|---|
是否可选行 | 可以用WHERE 选择特定行 | 无法选择,直接清空整表 |
操作速度 | 慢(逐行删除) | 快(直接清空并重置表) |
自增ID重置 | 不重置,自增继续 | 重置,自增从1开始 |
适用场景 | 删除特定数据或小批量数据 | 清空整个表数据,快速释放空间 |
是否可恢复 | 可以通过事务回滚 | 一般无法恢复,危险操作 |
5. 实例场景解析
-
毕业生数据清理:如果学校数据库只需删除个别学生的数据,可以用
DELETE
加上WHERE
条件,比如删除ID为1的学生。DELETE FROM students WHERE student_id = 1;
-
每学期新表初始化:学校需要每学期清空一次学生成绩数据(但保留表结构),可以用
TRUNCATE
快速完成:TRUNCATE TABLE grades;
这样既能保证数据全部清空,且表结构(列、类型等)依然保留,也不会影响到其他表关联关系。
6. 小心操作:删除数据前的思考
- 避免误删:在删除操作之前,建议先用
SELECT
查询确认要删除的内容。 - 考虑是否备份:数据删除后一般无法恢复,重要数据可以先备份。
- 小批量数据推荐用
DELETE
,批量或全部清空用TRUNCATE
,根据需要选择合适的操作。
总结
DELETE
适合选择性删除,可以加WHERE
条件删特定数据,但无条件的DELETE
会删除所有数据。TRUNCATE
适合一键清空所有数据,速度更快,但无法针对特定行,且会重置表的自增ID。
掌握了DELETE
和TRUNCATE
,你就能灵活清理数据,不论是单行删除还是批量清空,都能得心应手!
四、查询数据
基本查询:SELECT
语句的基本用法。
在数据库中,查询数据是最常见、最重要的操作之一。想要找出某个用户的信息、统计订单量、筛选特定记录……都需要用到SELECT
语句。可以说,SELECT
就是数据库的“搜索引擎”。
1. 基本的SELECT
语法
SELECT
的基本用法非常简单,它由两个主要部分组成:要查询的字段和要查询的表。我们来看一个例子:
-- 查询students表的所有数据
SELECT * FROM students;
SELECT *
:*
表示选择所有字段,也就是所有数据的每一列。FROM students
:指定要查询的表,这里是students
。
这个语句的意思是:从students
表中选择并展示每一列的所有数据。*
的作用是选择表中所有的列。假如你只想要某几个字段,比如学生的name
和age
,可以直接列出字段名。
2. 选择特定列
查询时,我们不总是需要整个表的所有数据,有时候只想查询表里的几个字段。假设我们只想看学生的名字和年龄:
-- 只查询students表中的name和age字段
SELECT name, age FROM students;
name, age
:表示只查询name
和age
这两列。FROM students
:从students
表中查询。
这就会返回每位学生的名字和年龄,而不会显示其他无关的字段。这样既节省了资源,也更容易找到自己想要的数据。
3. 为结果加点调味料:WHERE
条件
WHERE
条件可以让SELECT
更有“目标性”。比如,我们只想查询年龄大于18岁的学生:
-- 查询年龄大于18岁的学生
SELECT name, age FROM students
WHERE age > 18;
WHERE age > 18
:表示只查询符合age > 18
条件的数据。
这个语句会筛选出所有年龄大于18岁的学生,只显示这些人的名字和年龄。WHERE
条件可以是任何符合条件的表达式,比如等于=
、大于>
、小于<
、不等于<>
等。
4. 让查询结果排序:ORDER BY
假设你希望查询的结果按年龄从小到大排列。可以使用ORDER BY
来对结果进行排序:
-- 按年龄从小到大排序查询结果
SELECT name, age FROM students
WHERE age > 18
ORDER BY age ASC;
ORDER BY age ASC
:表示按age
字段从小到大(升序)排序,ASC
即升序。如果想按降序排序,可以使用DESC
。
这个语句会返回年龄大于18岁的学生名单,并按年龄从小到大排序。排序可以让数据看起来更加有条理,尤其在处理大量数据时非常有用。
5. 限定结果数:LIMIT
有时候我们只想看看前几条数据,或者只展示一部分数据。LIMIT
可以帮助你限制返回的结果条数。比如,我们只想看前3个符合条件的学生信息:
-- 查询前3个年龄大于18岁的学生
SELECT name, age FROM students
WHERE age > 18
ORDER BY age ASC
LIMIT 3;
LIMIT 3
:限制返回的结果数为3条。
这样,查询就会返回符合条件的前3条记录。如果只想查找特定数据的小样本,LIMIT
会特别方便。
6. 组合条件:AND
和OR
我们还可以用AND
和OR
组合多个条件进行更精确的查询。比如,查询“年龄大于18岁且专业为计算机科学”的学生:
-- 查询年龄大于18岁且专业为计算机科学的学生
SELECT name, age, major FROM students
WHERE age > 18 AND major = '计算机科学';
AND
:要求两个条件都符合才会返回结果。
再比如查询“年龄大于18岁或者专业为计算机科学”的学生,用OR
:
-- 查询年龄大于18岁或专业为计算机科学的学生
SELECT name, age, major FROM students
WHERE age > 18 OR major = '计算机科学';
OR
:只要符合一个条件就会返回结果。
7. 总结
SELECT *
:查询所有列。SELECT 列名
:查询指定的列,适合只想看部分字段。WHERE
:为查询添加条件,筛选出符合条件的数据。ORDER BY
:排序结果,按升序或降序显示。LIMIT
:限制返回的结果数,适合快速查找少量数据。AND
/OR
:组合条件,进行更复杂的筛选。
下面详细介绍一下select语句
1、条件查询:WHERE
子句、条件运算符(=
、<>
、>
、<
等)
WHERE
子句是数据库查询里的“筛选器”,可以让我们找到符合特定条件的数据。如果数据库是个大仓库,那WHERE
就像一个精准的筛选工具,帮你从成千上万的数据中找到符合要求的那几条。
1. WHERE
基本用法
WHERE
子句在SELECT
语句中用于设定条件。比如,你想从students
表里找出年龄为20岁的学生,WHERE
就是你设定条件的地方:
-- 查询年龄为20岁的学生
SELECT name, age FROM students
WHERE age = 20;
age = 20
:这里的=
就是条件运算符,表示“等于”的意思。WHERE
后面跟着条件,只有符合条件的数据才会被返回。
2. 常用条件运算符
在WHERE
条件中,MySQL支持多种条件运算符。每种运算符都适用于不同的筛选场景,具体来看几个常用的:
1) =
:等于
比如想查询专业是“计算机科学”的学生,可以用=
来筛选:
SELECT name, major FROM students
WHERE major = '计算机科学';
major = '计算机科学'
:表示只查找专业是“计算机科学”的学生。
2) <>
或 !=
:不等于
假如你想找专业不是“计算机科学”的学生,可以用<>
(或!=
)表示不等于:
SELECT name, major FROM students
WHERE major <> '计算机科学';
major <> '计算机科学'
:查询专业不是“计算机科学”的学生。
3) >
和 <
:大于和小于
假设你想查询年龄大于18岁的学生,用>
就能筛选出所有符合条件的记录:
SELECT name, age FROM students
WHERE age > 18;
age > 18
:找出年龄大于18岁的学生。
类似地,用<
查询年龄小于18岁的学生:
SELECT name, age FROM students
WHERE age < 18;
age < 18
:找出年龄小于18岁的学生。
4) >=
和 <=
:大于等于和小于等于
假如你还想包括年龄刚好为18的学生,可以用>=
表示大于等于18:
SELECT name, age FROM students
WHERE age >= 18;
age >= 18
:找出年龄大于或等于18岁的学生。
3. 组合条件:用AND
和OR
筛选更精准
有时候单一条件无法满足需求,想筛选年龄在18岁以上且专业是“计算机科学”的学生,可以用AND
组合多个条件:
SELECT name, age, major FROM students
WHERE age > 18 AND major = '计算机科学';
age > 18 AND major = '计算机科学'
:要求年龄大于18并且专业是“计算机科学”。
如果你想要查询年龄大于18岁或者专业为“计算机科学”的学生,用OR
来连接条件:
SELECT name, age, major FROM students
WHERE age > 18 OR major = '计算机科学';
OR
:表示只要满足其中一个条件(年龄大于18或者专业为“计算机科学”)就返回结果。
4. 用IN
简化条件
有时候条件不止一个,比如查找年龄是18、20或22岁的学生,可以用IN
简化条件:
SELECT name, age FROM students
WHERE age IN (18, 20, 22);
age IN (18, 20, 22)
:列出符合这些条件的所有数据,相当于写成age = 18 OR age = 20 OR age = 22
。
5. 范围查询:用BETWEEN
查找区间
如果想查找年龄在18到22岁之间的学生,BETWEEN
可以让你轻松实现范围查询:
SELECT name, age FROM students
WHERE age BETWEEN 18 AND 22;
age BETWEEN 18 AND 22
:查询年龄在18到22岁之间(包含18和22)的学生。
6. 模糊查询:LIKE
和通配符
假如我们要查询名字以“张”开头的学生,LIKE
结合通配符%
可以帮助实现模糊匹配:
SELECT name FROM students
WHERE name LIKE '张%';
name LIKE '张%'
:查找名字以“张”开头的学生,%
表示任意字符。
如果想查找名字包含“浩”的学生,可以用%浩%
来匹配:
SELECT name FROM students
WHERE name LIKE '%浩%';
%浩%
:表示名字中包含“浩”的学生。
总结
运算符 | 功能 | 示例 |
---|---|---|
= | 等于 | age = 20 |
<> / != | 不等于 | major <> '计算机科学' |
> / < | 大于 / 小于 | age > 18 |
>= / <= | 大于等于 / 小于等于 | age >= 18 |
AND / OR | 组合条件 | age > 18 AND major = '计算机科学' |
IN | 列表匹配 | age IN (18, 20, 22) |
BETWEEN | 范围匹配 | age BETWEEN 18 AND 22 |
LIKE | 模糊匹配 | name LIKE '张%' |
2、逻辑运算符:AND
、OR
、NOT
在数据库查询中,AND
、OR
和NOT
是逻辑运算符,它们就像搜索过滤器,让你根据多个条件快速筛选出符合要求的数据。这些操作符组合使用能让你的查询更精准,比如找出“符合多个条件的数据”,或者“排除掉不需要的部分”。
1. AND
:我要两个条件都满足
AND
表示“并且”的意思,要求多个条件同时成立才能返回结果。比如,你想查询专业是“计算机科学”并且年龄大于20岁的学生,用AND
来组合这两个条件:
SELECT name, age, major FROM students
WHERE major = '计算机科学' AND age > 20;
major = '计算机科学' AND age > 20
:要求专业是“计算机科学”并且年龄大于20,两者都要满足。
如果其中一个条件不成立,这条记录就不会显示。比如有位同学专业是“计算机科学”但只有19岁,或者年龄21但专业是“数学”,都会被筛掉。
2. OR
:只要一个条件成立就行
OR
表示“或者”,只要任意一个条件满足就返回结果。假设你想查找年龄大于20或者**专业是“计算机科学”**的学生,用OR
连接条件:
SELECT name, age, major FROM students
WHERE age > 20 OR major = '计算机科学';
age > 20 OR major = '计算机科学'
:只要年龄大于20或专业是“计算机科学”,就返回该记录。
使用OR
会包含更多的数据。比如一位同学专业是“经济学”但年龄21,这样的记录也会被查询出来,因为年龄符合要求;同理,年龄19但专业是“计算机科学”的同学也会被筛选出。
3. NOT
:排除不符合条件的数据
NOT
表示“非”,可以用来排除不符合条件的数据。比如,我们要查找**专业不是“计算机科学”**的学生:
SELECT name, major FROM students
WHERE NOT major = '计算机科学';
NOT major = '计算机科学'
:查询专业不是“计算机科学”的学生。
NOT
可以和其他条件配合使用。比如,你想查找年龄大于20且**专业不是“计算机科学”**的学生:
SELECT name, age, major FROM students
WHERE age > 20 AND NOT major = '计算机科学';
age > 20 AND NOT major = '计算机科学'
:要求年龄大于20,同时专业不是“计算机科学”。
这样能精准地排除不符合条件的记录,返回符合你要求的数据。
4. 逻辑运算符组合使用
这些逻辑运算符可以组合在一起使用,让查询更灵活。例如,查询所有年龄大于20岁并且**专业是“计算机科学”或“经济学”**的学生:
SELECT name, age, major FROM students
WHERE age > 20 AND (major = '计算机科学' OR major = '经济学');
age > 20
:年龄大于20。AND
:必须年龄满足条件。(major = '计算机科学' OR major = '经济学')
:专业可以是“计算机科学”或者“经济学”。
用小括号将OR
部分括起来,确保查询优先判断“专业是计算机科学或经济学”这个条件,再和age > 20
结合。
5. 逻辑运算符的优先级
NOT
、AND
和OR
的执行顺序是:
NOT
优先级最高,先处理NOT
条件。AND
其次,先执行AND
条件。OR
最低,最后执行OR
条件。
如果条件复杂,使用小括号明确优先级。例如,查询“年龄大于20并且专业是计算机科学或经济学”的学生时,(major = '计算机科学' OR major = '经济学')
优先判断,然后才考虑age > 20
。
总结
运算符 | 功能 | 示例 |
---|---|---|
AND | 并且 | age > 20 AND major = '计算机科学' |
OR | 或者 | age > 20 OR major = '计算机科学' |
NOT | 非 | NOT major = '计算机科学' |
3、模糊查询:LIKE
、IN
、BETWEEN
当数据库里有成千上万条数据时,LIKE
、IN
和BETWEEN
三种模糊查询技巧可以帮你快速找到特定范围的数据,或包含某些关键字的数据。
1. LIKE
:模糊查找的万能钥匙
LIKE
主要用于模糊查询,配合通配符%
或_
可以轻松找到包含指定字符的记录。
%
:代表任意数量的字符,可以是0个、1个、或多个。_
:代表单个任意字符。
示例:
假如你有一张名为employees
的员工表,想找出名字中带“张”的员工,用LIKE
和%
搭配就行:
SELECT name FROM employees
WHERE name LIKE '%张%';
LIKE '%张%'
:表示名字中包含“张”的所有员工,比如“张伟”“王张成”等都能被找到。
如果你只想找名字以“张”开头的员工,可以这样:
SELECT name FROM employees
WHERE name LIKE '张%';
LIKE '张%'
:表示名字以“张”开头,比如“张三”“张小明”等。
再比如,想找名字是两个字的、第二个字是“伟”的人,就可以使用_
通配符:
SELECT name FROM employees
WHERE name LIKE '_伟';
LIKE '_伟'
:表示名字只有两个字,且第二个字是“伟”,比如“张伟”。
2. IN
:指定多个选项进行筛选
IN
让你可以指定多个符合条件的值,只要数据在这个列表里,就能被查出来。它很适合在筛选多个特定值时使用,比如寻找符合特定类别或选项的记录。
示例:
假设你想查询部门为“销售”、“人事”或“财务”的员工,可以用IN
指定这几个部门的选项:
SELECT name, department FROM employees
WHERE department IN ('销售', '人事', '财务');
department IN ('销售', '人事', '财务')
:表示部门是“销售”、“人事”或“财务”中的任意一个,都符合条件。
IN
还可以用于数字字段。假如你想查找年龄为25、30、35的员工,用IN
会更简洁:
SELECT name, age FROM employees
WHERE age IN (25, 30, 35);
age IN (25, 30, 35)
:表示符合这些年龄的员工都会被查出来。
3. BETWEEN
:查找范围内的值
BETWEEN
主要用来查询一个范围内的值,比如日期范围或数字范围。它包含边界值(即起始和结束值都会包含在结果内)。
示例:
假设你想查询2022年1月1日至2022年12月31日之间入职的员工,用BETWEEN
就能快速筛选出符合条件的数据:
SELECT name, hire_date FROM employees
WHERE hire_date BETWEEN '2022-01-01' AND '2022-12-31';
hire_date BETWEEN '2022-01-01' AND '2022-12-31'
:表示查询在这段时间内入职的员工。
对于数字范围也可以使用BETWEEN
。比如要找年龄在20到30岁之间的员工:
SELECT name, age FROM employees
WHERE age BETWEEN 20 AND 30;
age BETWEEN 20 AND 30
:表示年龄在20到30岁之间(包含20和30)的员工都会被找到。
4. LIKE
、IN
和BETWEEN
的综合示例
假如你有一个客户信息表,想找到:
- 年龄在30到40岁之间的客户;
- 或者所在城市是“北京”或“上海”;
- 或者名字包含“丽”的客户。
你可以把LIKE
、IN
和BETWEEN
组合在一起使用,查询这样的复合条件:
SELECT name, age, city FROM customers
WHERE age BETWEEN 30 AND 40
OR city IN ('北京', '上海')
OR name LIKE '%丽%';
age BETWEEN 30 AND 40
:年龄在30到40岁之间。city IN ('北京', '上海')
:城市是北京或上海。name LIKE '%丽%'
:名字中包含“丽”。
这样写可以同时找到符合这些条件的客户,查询结果更加灵活。
总结
操作符 | 功能 | 示例 |
---|---|---|
LIKE | 模糊匹配 | name LIKE '%张%' |
IN | 多选匹配 | department IN ('销售', '人事', '财务') |
BETWEEN | 范围匹配 | age BETWEEN 20 AND 30 |
用好LIKE
、IN
和BETWEEN
,你可以轻松过滤数据,更高效地找到你想要的信息。数据库查询从此变得简单、直观又好用!
4、排序:ORDER BY
的用法
在数据库里,有时我们不仅仅想获取数据,还希望按顺序排列它们——比如从大到小、从小到大,或者按字母顺序。ORDER BY
就是帮我们实现排序的工具,能让数据以我们想要的顺序展示出来。
1. ORDER BY
基础:升序和降序排序
ORDER BY
的基本用法很简单,就是在查询的最后加上ORDER BY
,然后写上你想排序的列名。默认情况下,ORDER BY
会按升序排列,意思是数字从小到大,字母从A到Z。
例子1:按年龄升序排列
假设你有一个员工表employees
,想查询所有员工信息并按年龄从小到大排序:
SELECT name, age FROM employees
ORDER BY age;
ORDER BY age
:表示按年龄升序排列,年龄越小的排在越前面。
2. 降序排列:使用DESC
关键字
如果想让结果按降序(从大到小)排列,只需在列名后面加上DESC
。这样可以把年龄最大的员工排在前面。
例子2:按年龄降序排列
SELECT name, age FROM employees
ORDER BY age DESC;
ORDER BY age DESC
:表示按年龄降序排列,年龄越大的排在越前面。
3. 按多个列排序
有时我们希望根据多个条件排序,比如先按部门排序,再在每个部门里按年龄排序。只需在ORDER BY
后面加上多个列名即可。这样,当第一个列值相同时,按第二个列的顺序排列。
例子3:按部门和年龄排序
假设你想让员工表先按部门排序,再在每个部门内部按年龄升序排列:
SELECT name, department, age FROM employees
ORDER BY department, age;
ORDER BY department, age
:先按部门排,部门相同的员工再按年龄从小到大排。
4. 多列混合排序:升序+降序
ORDER BY
允许你在不同的列上使用不同的排序规则。比如按部门升序排列,但在同一部门内按年龄降序排列。这时只需指定各列的排序方式。
例子4:部门升序,年龄降序
SELECT name, department, age FROM employees
ORDER BY department ASC, age DESC;
ORDER BY department ASC, age DESC
:部门从A到Z排序,同一部门的员工按年龄从大到小排。
5. 排序字段可以是计算结果
ORDER BY
不仅可以直接用列名,还可以用计算结果来排序。比如,你有一张销售记录表sales
,想按“单价 * 数量”算出总价并按总价排序,直接在ORDER BY
里写计算公式即可:
SELECT product_name, unit_price, quantity, (unit_price * quantity) AS total_price
FROM sales
ORDER BY total_price DESC;
ORDER BY total_price DESC
:按总价从大到小排列,把大订单放在前面。
6. 小技巧:随机排序
如果希望每次随机排列记录,可以用ORDER BY RAND()
:
SELECT name FROM employees
ORDER BY RAND();
ORDER BY RAND()
:每次查询结果会随机排序,非常适合用来做抽奖或随机推荐。
总结
排序方式 | 说明 | 示例 |
---|---|---|
单列升序排序 | 默认按升序排列 | ORDER BY age |
单列降序排序 | 指定DESC 降序 | ORDER BY age DESC |
多列排序 | 多条件排序,先部门再年龄 | ORDER BY department, age |
混合排序 | 不同列不同排序规则 | ORDER BY department ASC, age DESC |
计算结果排序 | 对公式结果排序 | ORDER BY total_price DESC |
随机排序 | 每次查询结果随机排列 | ORDER BY RAND() |
5、限制结果集:LIMIT
的用法
在查询数据库时,有时候我们不需要成百上千条数据,而只想要前几条,或者一小部分。LIMIT
可以帮你限制结果的数量,让你精准拿到想要的那几条记录,非常适合在页面上展示“热门内容”“最新几条记录”等情况。
1. 基本用法:限制结果条数
LIMIT
的基本用法很简单,就是在查询最后加上LIMIT
,后面跟一个数字,用来限制最多返回的记录条数。
例子1:取前5条记录
假设有个商品表products
,想查询里面的前5条记录,可以这样写:
SELECT * FROM products
LIMIT 5;
LIMIT 5
:表示只返回前5条数据。
这样可以避免一次查询出大量数据,如果你只想快速看看一部分内容,这种限制非常方便。
2. 配合排序:查询前几条符合条件的记录
LIMIT
通常会和ORDER BY
一起使用。比如想查询最近添加的前5条记录,就可以先按添加时间降序排序,再限制只返回5条。
例子2:查询最新的5个商品
SELECT * FROM products
ORDER BY created_at DESC
LIMIT 5;
ORDER BY created_at DESC LIMIT 5
:表示按创建时间从新到旧排列,返回最新的5个商品。
这样可以在界面上显示最新上架的商品或文章等内容。
3. 从某个位置开始查询:LIMIT offset, count
有时我们需要分页查看数据,比如每页显示10条,点击“下一页”查看后面的10条记录。这时可以使用LIMIT
的偏移量(offset)来指定从第几条开始,然后获取多少条。
- 语法:
LIMIT offset, count
offset
表示从第几条记录开始。count
表示返回多少条记录。
例子3:分页显示——查询第6到第15条记录
假设你有一页显示10条记录的需求,想查看从第6条到第15条的内容,可以写成这样:
SELECT * FROM products
LIMIT 5, 10;
LIMIT 5, 10
:表示跳过前5条,获取接下来的10条数据。
注意:偏移量是从0开始计数的,所以
LIMIT 5, 10
实际上是从第6条记录开始。
4. 仅使用偏移量,返回指定位置之后的所有数据
如果只想从某个位置开始返回数据,并且不限制数量,只需写偏移量,省略数量即可。
例子4:从第10条开始,返回后面的所有记录
SELECT * FROM products
LIMIT 10;
LIMIT 10
:如果没有offset
,MySQL会理解为返回前10条记录。
但是如果只写一个数字,比如LIMIT 10
,MySQL会自动理解为“从第0条开始,返回10条数据”。
5. 与OFFSET
配合的写法
在某些数据库中可以使用LIMIT
+ OFFSET
的语法代替LIMIT offset, count
。不过在MySQL里,使用LIMIT offset, count
更为常见。
总结
用法 | 说明 | 示例 |
---|---|---|
基本用法 | 返回前N条记录 | LIMIT 5 |
配合排序 | 排序后限制返回条数 | ORDER BY created_at DESC LIMIT 5 |
分页显示 | 跳过前N条记录,返回接下来M条数据 | LIMIT 5, 10 |
偏移量与数量结合 | 从偏移量开始返回数据 | LIMIT offset, count |
举个栗子
以下是创建表语句和一些模拟数据:
创建表语句
CREATE TABLE students (
id INT PRIMARY KEY AUTO_INCREMENT, -- 自动增长的学生ID
name VARCHAR(50) NOT NULL, -- 学生姓名
age INT, -- 学生年龄
grade VARCHAR(20) DEFAULT 'Freshman' -- 学生年级,默认为 Freshman
);
这段代码创建了一个 students
表,其中包含4个字段:
id
:自动生成的主键,标识学生ID。name
:存储学生姓名,不允许为空。age
:存储学生年龄,允许为空。grade
:存储学生的年级,默认值为Freshman
。
插入模拟数据
创建了一些学生数据:
INSERT INTO students (name, age, grade) VALUES
('Bob', 22, 'Junior'),
('Charlie', 19, 'Freshman'),
('David', 23, 'Senior'),
('Eva', 21, 'Junior'),
('Frank', 20, 'Freshman'),
('Grace', 22, 'Sophomore'),
('Helen', 24, 'Senior'),
('Ivy', 21, 'Junior'),
('Jack', 23, 'Senior'),
('Kevin', 19, 'Freshman'),
('Laura', 20, 'Sophomore'),
('Mona', 21, 'Junior'),
('Nathan', 22, 'Junior'),
('Olivia', 23, 'Senior'),
('Peter', 20, 'Sophomore'),
('Quincy', 19, 'Freshman'),
('Rachel', 21, 'Junior'),
('Sam', 23, 'Senior'),
('Tina', 22, 'Junior');
为了更好地理解MySQL的CRUD(增删改查)操作,下面是一个完整的例子。假设我们有一个学生信息表 students
,其中包含以下字段:
id
:学生ID(INT)name
:学生姓名(VARCHAR)age
:学生年龄(INT)grade
:学生的年级(VARCHAR)
以下是如何使用增、删、改、查操作管理这张表的示例:
1. 插入数据:INSERT INTO
-
插入单条数据
INSERT INTO students (id, name, age, grade) VALUES (20, 'Alice', 20, 'Sophomore');
-
批量插入多条数据
-- 上面有了,就不重新写了
2. 更新数据:UPDATE
-
更新某个学生的年级,带有条件的更新
UPDATE students SET grade = 'Senior' WHERE name = 'Alice';
-
批量更新符合条件的数据
UPDATE students SET grade = 'Graduated' WHERE age > 21;
这里
WHERE
条件限定了年纪大于21岁的学生。
3. 删除数据:DELETE
和 TRUNCATE
(建议做完下面的查询再回来看,我这里是按照前面的顺序写的)
-
使用
DELETE
删除符合条件的记录DELETE FROM students WHERE grade = 'Freshman';
-
使用
TRUNCATE
清空整个表(保留表结构)TRUNCATE TABLE students;
TRUNCATE
删除数据时不带条件,且删除速度快。
4. 查询数据
基本查询:SELECT
-
查询所有学生的信息
SELECT * FROM students;
条件查询:WHERE
子句和条件运算符
-
查询特定年龄的学生
SELECT * FROM students WHERE age = 20;
逻辑运算符:AND
、OR
、NOT
-
查询年龄大于20岁且年级为
Junior
的学生SELECT * FROM students WHERE age > 20 AND grade = 'Junior';
-
查询非
Sophomore
年级的学生SELECT * FROM students WHERE NOT grade = 'Sophomore';
模糊查询:LIKE
、IN
、BETWEEN
-
使用
LIKE
查询名字中包含“A”的学生SELECT * FROM students WHERE name LIKE '%A%';
-
使用
IN
查询指定多个年级的学生SELECT * FROM students WHERE grade IN ('Junior', 'Senior');
-
使用
BETWEEN
查询年龄在20到22之间的学生SELECT * FROM students WHERE age BETWEEN 20 AND 22;
排序:ORDER BY
-
按照年龄升序排列查询结果
SELECT * FROM students ORDER BY age ASC;
-
按照年级降序排列、年龄升序排列
SELECT * FROM students ORDER BY grade DESC, age ASC;
限制结果集:LIMIT
-
查询前3个学生
SELECT * FROM students LIMIT 3;
-
跳过前2条记录,返回接下来的3条
SELECT * FROM students LIMIT 2, 3;