【MySQL基础】数据的增删改查(CRUD)

在这里插入图片描述

文章目录

    • 一、 插入数据
      • 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_idnameageenrollment_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, '周八');

如果表中ageenrollment_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分支合并的时候出了问题,导致生产代码出现了异常,前面逻辑出现了混乱,本来都是小问题,而且在测试生成的时候也没发现问题,但坏就坏在这段逻辑让数据库里面运行了这样一条语句:

UPDATE1 set 某几个钱 = 0
	where id in
		(select t1_id from2 where 1=1)
		-- 出现了类似1=1的情况,好像是因为前面某个数据没传过来

如果是正常的全表更新,就比如上面的4,我们加了 BlockAttackInnerInterceptor( 阻止全表更新删除的一个插件) 其实是没啥问题的,但是这句sql其实是按照主键更新,这个拦截完全没用上,一下子就把表1里面所有的这几个字段全清成0了。

屋漏偏逢连夜雨,当时那段时间服务器还出了问题,备份数据库是好久之前的,直接天上飞来一连串紧急问题,我们项目里面十来个人啥也不干了,直接通宵查日志一条条手动给用户恢复数据,ε=(´ο`*)))唉。

小建议:为了保险起见,平时可以在UPDATE前先写一个SELECT语句检查条件是否正确,再进行更新,当然还一定要注意代码逻辑,别出我们这种错误。


5. 一个实际例子:换专业的情况

假设学校有个students表记录学生的专业(major字段),现在所有“计算机科学”专业的学生需要改成“人工智能”。可以使用条件更新快速实现这个调整:

-- 把所有“计算机科学”专业的学生的专业改成“人工智能”
UPDATE students 
SET major = '人工智能'
WHERE major = '计算机科学';

这个操作会检查major字段里等于“计算机科学”的所有行,并将它们更新为“人工智能”。这种批量更新方式非常适合批量数据调整,比如调整专业、更新课程等。


6. 总结

  • 基本更新:用UPDATESET修改字段,配合WHERE确定条件。
  • 多字段更新:可以一次更改多个字段,SET后用逗号分隔。
  • 条件更新:用WHERE指定条件,确保只更新符合要求的数据。
  • 批量更新:在条件内符合的数据会被一起更新。
  • 小心无条件更新:确保WHERE条件不为空,否则可能影响所有数据!

三、删除数据

在数据库管理中,删除数据就像清理杂物,但具体操作可以有轻有重。MySQL里常用的删除操作有两种:DELETETRUNCATE。这两个指令看似都在“清理”数据,实际上却有很大的区别。


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. DELETETRUNCATE的区别总结

操作DELETETRUNCATE
是否可选行可以用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。

掌握了DELETETRUNCATE,你就能灵活清理数据,不论是单行删除还是批量清空,都能得心应手!

四、查询数据

基本查询:SELECT语句的基本用法。

在数据库中,查询数据是最常见、最重要的操作之一。想要找出某个用户的信息、统计订单量、筛选特定记录……都需要用到SELECT语句。可以说,SELECT就是数据库的“搜索引擎”。


1. 基本的SELECT语法

SELECT的基本用法非常简单,它由两个主要部分组成:要查询的字段要查询的表。我们来看一个例子:

-- 查询students表的所有数据
SELECT * FROM students;
  • SELECT **表示选择所有字段,也就是所有数据的每一列。
  • FROM students:指定要查询的表,这里是students

这个语句的意思是:从students表中选择并展示每一列的所有数据。*的作用是选择表中所有的列。假如你只想要某几个字段,比如学生的nameage,可以直接列出字段名。


2. 选择特定列

查询时,我们不总是需要整个表的所有数据,有时候只想查询表里的几个字段。假设我们只想看学生的名字和年龄:

-- 只查询students表中的name和age字段
SELECT name, age FROM students;
  • name, age:表示只查询nameage这两列。
  • 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. 组合条件:ANDOR

我们还可以用ANDOR组合多个条件进行更精确的查询。比如,查询“年龄大于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. 组合条件:用ANDOR筛选更精准

有时候单一条件无法满足需求,想筛选年龄在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、逻辑运算符:ANDORNOT

在数据库查询中,ANDORNOT是逻辑运算符,它们就像搜索过滤器,让你根据多个条件快速筛选出符合要求的数据。这些操作符组合使用能让你的查询更精准,比如找出“符合多个条件的数据”,或者“排除掉不需要的部分”。


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. 逻辑运算符的优先级

NOTANDOR的执行顺序是:

  • NOT优先级最高,先处理NOT条件。
  • AND其次,先执行AND条件。
  • OR最低,最后执行OR条件。

如果条件复杂,使用小括号明确优先级。例如,查询“年龄大于20并且专业是计算机科学或经济学”的学生时,(major = '计算机科学' OR major = '经济学')优先判断,然后才考虑age > 20


总结
运算符功能示例
AND并且age > 20 AND major = '计算机科学'
OR或者age > 20 OR major = '计算机科学'
NOTNOT major = '计算机科学'

3、模糊查询:LIKEINBETWEEN

当数据库里有成千上万条数据时,LIKEINBETWEEN三种模糊查询技巧可以帮你快速找到特定范围的数据,或包含某些关键字的数据。


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. LIKEINBETWEEN的综合示例

假如你有一个客户信息表,想找到:

  • 年龄在30到40岁之间的客户;
  • 或者所在城市是“北京”或“上海”;
  • 或者名字包含“丽”的客户。

你可以把LIKEINBETWEEN组合在一起使用,查询这样的复合条件:

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

用好LIKEINBETWEEN,你可以轻松过滤数据,更高效地找到你想要的信息。数据库查询从此变得简单、直观又好用!

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. 删除数据:DELETETRUNCATE

(建议做完下面的查询再回来看,我这里是按照前面的顺序写的)

  • 使用 DELETE 删除符合条件的记录

    DELETE FROM students 
    WHERE grade = 'Freshman';
    
  • 使用 TRUNCATE 清空整个表(保留表结构)

    TRUNCATE TABLE students;
    

    TRUNCATE删除数据时不带条件,且删除速度快。


4. 查询数据

基本查询:SELECT
  • 查询所有学生的信息

    SELECT * FROM students;
    
条件查询:WHERE 子句和条件运算符
  • 查询特定年龄的学生

    SELECT * FROM students 
    WHERE age = 20;
    
逻辑运算符:ANDORNOT
  • 查询年龄大于20岁且年级为Junior的学生

    SELECT * FROM students 
    WHERE age > 20 AND grade = 'Junior';
    
  • 查询非Sophomore年级的学生

    SELECT * FROM students 
    WHERE NOT grade = 'Sophomore';
    
模糊查询:LIKEINBETWEEN
  • 使用 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;
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/902105.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于SSM+微信小程序的社区垃圾回收管理系统(垃圾1)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1、项目介绍 基于ssm微信小程序的社区垃圾回收管理系统&#xff0c;有管理员&#xff0c;回收员&#xff0c;用户三个角色。 1、管理员功能有个人中心&#xff0c;用户管理&#xff0c;回收员管理&am…

java游戏第六天——总结

开始 我们先在这里创建五个java文件&#xff0c;后面创建一个文件夹存储图片&#xff0c;我就按照这几个文件作用展开描述 bg.java package common; import common.game_pic;import java.awt.Color; import java.awt.Graphics; public class bg {public void paintself(Graph…

Python数据分析——Numpy

纯个人python的一个小回忆笔记&#xff0c;当时假期花两天学的python&#xff0c;确实时隔几个月快忘光了&#xff0c;为了应付作业才回忆起来&#xff0c;不涉及太多基础&#xff0c;适用于有一定编程基础的参考回忆。 这一篇笔记来源于下面哔哩哔哩up主的视频&#xff1a; 一…

Python + 查看个人下载次数小工具 - 记录

目录 前言 一、演示 二、流程简述 1.CSDN网站自动登入 2.登入查询接口网站获取网页数据 3.处理HTML数据 4.完整业务执行程序 三、主程序 四、UI程序 前言 为了方便查看个人资源下载的数据&#xff0c;通过selenium控制浏览器 HTML网页源代码数据获取 数据分析 三个…

服务器虚拟化全面教程:从入门到实践

服务器虚拟化全面教程&#xff1a;从入门到实践 引言 在现代 IT 基础设施中&#xff0c;服务器虚拟化已成为一种不可或缺的技术。它不仅能够提高资源利用率&#xff0c;还能降低硬件成本&#xff0c;优化管理流程。本文将深入探讨服务器虚拟化的概念、技术、应用场景及其实现…

【ECMAScript标准】深入理解ES2023的新特性与应用

&#x1f9d1;‍&#x1f4bc; 一名茫茫大海中沉浮的小小程序员&#x1f36c; &#x1f449; 你的一键四连 (关注 点赞收藏评论)是我更新的最大动力❤️&#xff01; &#x1f4d1; 目录 &#x1f53d; 前言1️⃣ ECMAScript的演变与重要性2️⃣ ES2023的主要新特性概述3️⃣ 记…

[Ansible实践笔记]自动化运维工具Ansible(一):初探ansibleansible的点对点模式

文章目录 Ansible介绍核心组件任务执行方式 实验前的准备更新拓展安装包仓库在ansible主机上配置ip与主机名的对应关系生成密钥对将公钥发送到被管理端&#xff0c;实现免密登录测试一下是否实现免密登录 常用工具ansibleansible—docansible—playbook 主要配置文件 Ansible 模…

安装Maven配置以及构建Maven项目(2023idea)

一、下载Maven绿色软件 地址&#xff1a;http://maven.apache.org/download.cgi 尽量不要选择最高版本的安装&#xff0c;高版本意味着高风险的不兼容问题&#xff0c;选择低版本后续问题就少。你也可以选择尝试。 压缩后&#xff1a; 打开后&#xff1a; 在该目录下新建mvn-…

【算法练习】最小生成树

题意&#xff1a;【模板】最小生成树 方法1&#xff1a;Prim算法(稠密边用优&#xff09; #include <bits/stdc.h> using namespace std; int n,m,u,v,d,ans; bool f[5001]; vector<pair<int,int>> a[5001];//用结构体和重载比直接定义小根堆似乎还快一点点…

局部变量和全局变量(Python)

引入例子拆解 源码 class A:def __init__(self):self.test 0def add(c, k):c.test c.test 1k k 1def main():Count A()k 0for i in range(0, 25):add(Count, k)print("Count.test", Count.test)print("k", k)main() 运行结果如下图 代码解析 这…

使用语音模块的开发智能家居产品(使用雷龙LSYT201B 语音模块)

在这篇博客中&#xff0c;我们将探讨如何使用 LSYT201B 语音模块 进行智能设备的语音交互开发。通过这个模块&#xff0c;我们可以实现智能设备的语音识别和控制功能&#xff0c;为用户带来更为便捷和现代的交互体验。 1. 语音模块介绍 LSYT201B 是一个基于“芯片算法”的语音…

GS-SLAM Dense Visual SLAM with 3D Gaussian Splatt 论文阅读

项目主页 2024 CVPR (highlight) https://gs-slam.github.io/ 摘要 本文提出了一种基于3D Gaussian Splatting方法的视觉同步定位与地图构建方法。 与最近采用神经隐式表达的SLAM方法相比&#xff0c;本文的方法利用实时可微分泼溅渲染管道&#xff0c;显著加速了地图优化和…

一天工作量压缩成半天!5个ChatGPT高效工作法则!

在信息爆炸的时代&#xff0c;高效的生活方式成为了许多人的追求。如何利用科技手段提升效率&#xff0c;成为了一个热门话题。ChatGPT&#xff0c;作为一款强大的语言模型&#xff0c;为我们提供了全新的解决方案。本文将深入探讨如何利用 ChatGPT 改变你的生活&#xff0c;助…

【SSM详细教程】-13-SpringMVC详解

精品专题&#xff1a; 01.《C语言从不挂科到高绩点》课程详细笔记 https://blog.csdn.net/yueyehuguang/category_12753294.html?spm1001.2014.3001.5482 02. 《SpringBoot详细教程》课程详细笔记 https://blog.csdn.net/yueyehuguang/category_12789841.html?spm1001.20…

SQL实战训练之,力扣:1532最近的三笔订单

目录 一、力扣原题链接 二、题目描述 三、建表语句 四、题目分析 五、SQL解答 六、最终答案 七、验证 八、知识点 一、力扣原题链接 1532. 最近的三笔订单 二、题目描述 客户表&#xff1a;Customers ------------------------ | Column Name | Type | --------…

Redis进阶:Spring框架中利用Redis实现对象的序列化存储

前言 由于Redis只能提供基于字符串型的操作&#xff0c;而Java中使用的却以类对象为主&#xff0c;所以需要Redis存储的字符串和Java对象相互转换。如果我们自己编写这些规则&#xff0c;工作量是比较大的&#xff0c;因此本文介绍如何使用Spring框架快速实现Java数据类型在Red…

Flask-SocketIO 简单示例

用于服务端和客户端通信&#xff0c;服务端主动给客户端发送消息 前提&#xff1a; 确保安装了socket库&#xff1a; pip install flask-socketio python-socketio服务端代码 from flask import Flask from flask_socketio import SocketIO import threading import timeap…

计算机网络:网络层 —— IPv4 地址的应用规划

文章目录 IPv4地址的应用规划定长的子网掩码变长的子网掩码 IPv4地址的应用规划 IPv4地址的应用规划是指将给定的 IPv4地址块 (或分类网络)划分成若干个更小的地址块(或子网)&#xff0c;并将这些地址块(或子网)分配给互联网中的不同网络&#xff0c;进而可以给各网络中的主机…

2023IKCEST第五届“一带一路”国际大数据竞赛--社交网络中多模态虚假 媒体内容核查top11

比赛链接&#xff1a;https://aistudio.baidu.com/competition/detail/1030/0/introduction PPT链接&#xff1a;https://www.ikcest.org/bigdata2024/zlxz/list/page.html 赛题 社交网络中多模态虚假媒体内容核查 背景 随着新媒体时代信息媒介的多元化发展&#xff0c;各种内容…

Handler、Looper、message进阶知识

Android Handler、Looper、Message的进阶知识 在Android开发中&#xff0c;Handler、Looper和Message机制是多线程通信的核心。为了深入理解并优化它们的使用&#xff0c;尤其是在高并发和UI性能优化中&#xff0c;可以利用一些高级特性。 1. Handler的高阶知识 Handler在基本…