当前位置: 首页 > news >正文

Mysql从入门到上手(二)-全面了解增删改查(CRUD).

一、检索数据

        MySQL 中的检索数据操作是数据库操作中最常见的任务之一。使用 SQL 查询语言中的 SELECT 语句,可以从数据库中的一个或多个表中检索数据。以下是 MySQL 中与数据检索相关的各种技术和用法的详细讲解。

1.1、基本查询

        最基本的查询是使用 SELECT 语句来检索数据:

        SELECT column1, column2, ... FROM table_name;

SELECT: 用于指定需要检索的列(字段)。

FROM: 指定要查询的表。

例如,从 users 表中检索所有列:

SELECT * FROM users;

* 表示选择所有的列。

1.2、限制返回

        如果只需要检索特定的列,可以在 SELECT 中指定列名:

SELECT name, age FROM users;

这样只会返回 name 和 age 列的数据。

1.3、WHERE子句

        WHERE 子句用于对检索的数据进行条件筛选。通过 WHERE 可以指定条件,限制结果集的范围。

SELECT * FROM users WHERE age > 18;

此查询会返回所有 age 大于 18 的用户。

常见的条件操作符包括:

=:等于

>:大于

<:小于

>=:大于等于

<=:小于等于

<> 或 !=:不等于

BETWEEN:在两个值之间

SELECT * FROM users WHERE age BETWEEN 10 AND 20;

IN:指定多个可能值

SELECT * FROM users WHERE age in (18,19);

LIKE:模式匹配

IS NULL:判断是否为 NULL

1.4、AND 和 OR

可以使用 AND 和 OR 组合多个筛选条件:

SELECT * FROM users WHERE age > 18 AND city = 'Beijing';

此查询返回 age 大于 18  city 为 'Beijing' 的用户。

SELECT * FROM users WHERE age > 18 OR city = 'Beijing';

此查询返回 age 大于 18  city 为 'Beijing' 的用户。

1.5、ORDER BY排序

        ORDER BY 子句用于对检索到的数据进行排序。可以按一个或多个列进行升序(ASC)或降序(DESC)排序。

SELECT * FROM users ORDER BY age DESC;

此查询按 age 列降序排列结果。

SELECT * FROM users ORDER BY city ASC, age DESC;

此查询先按 city 升序排序,然后按 age 降序排序。

        在 SQL 中,LIKE 操作符用于执行模糊匹配查询。你可以使用通配符(% 和 _)来匹配字符串中的特定模式。

1.6、通配符过滤

4.6.1、%通配符

        % 是一个通配符,表示任意数量的字符(包括零个字符)。你可以在查询中使用 % 来匹配任意字符。

  1. 查询以某个字符串开始的记录

假设你有一个 employees 表,里面有 name 字段,你想查询所有名字以 "J" 开头的员工:

SELECT * FROM employees WHERE name LIKE 'J%';

这将返回所有名字以 "J" 开头的员工,如 James、John、Jack 等。

  1. 查询包含某个子字符串的记录

假设你要查询所有名字中包含 "ar" 的员工:

SELECT * FROM employees WHERE name LIKE '%ar%';

这将返回名字中包含 "ar" 的员工,如 Clark、Barbara 等。

  1. 查询以某个字符串结尾的记录

如果你想查询所有名字以 "son" 结尾的员工,可以使用 % 来表示字符串结尾:

SELECT * FROM employees WHERE name LIKE '%son';

这将返回所有名字以 "son" 结尾的员工,如 Jackson、Harrison 等。

4.6.2、_通配符

        _ 是一个通配符,表示单个字符。它用于匹配某个位置的单个字符。

  1. 查询名字中第二个字符是 "a" 的员工

假设你想查询名字第二个字符是 "a" 的员工:

SELECT * FROM employees WHERE name LIKE '_a%';

这将返回所有名字第二个字符是 "a" 的员工,如 James、Carl 等。

  1. 查询名字第三个字符是 "n" 的员工

如果你想查询名字第三个字符是 "n" 的员工:

SELECT * FROM employees WHERE name LIKE '__n%';

这将返回所有名字第三个字符是 "n" 的员工,如 Mandy 等。

1.7、正则表达式

1.7.1、基本字符匹配

.:匹配任意单个字符(除换行符外)。

[abc]:匹配字符 a、b 或 c。

[^abc]:匹配任何不是 a、b 或 c 的字符。

示例: SELECT * FROM employees WHERE name REGEXP 'a.b';

这会匹配名字中,a 和 b 之间有任意一个字符的记录。

1.7.2、OR 匹配

|:表示“或”操作符,用于匹配两种或多种可能的模式。

示例:SELECT * FROM employees WHERE name REGEXP 'John|Steve';

这会匹配名字是 John 或 Steve 的记录。

1.7.3、范围匹配

[a-z]:匹配小写字母。

[A-Z]:匹配大写字母。

[0-9]:匹配数字。

[a-zA-Z]:匹配任何字母(不区分大小写)。

[a-z0-9]:匹配小写字母或数字。

示例:SELECT * FROM employees WHERE name REGEXP '^[a-z]';

这会匹配以小写字母开头的名字。

1.7.4特殊字符匹配

^:匹配字符串的开头。

$:匹配字符串的结尾。

\:转义字符,匹配特殊字符(如 .、*、+ 等)。

示例:SELECT * FROM employees WHERE name REGEXP '^John';

这会匹配以 John 开头的名字。

如果你需要匹配字面上的点号(.),可以使用转义字符:

SELECT * FROM employees WHERE name REGEXP 'a\.b';

这会匹配 a.b(而不是任意字符)这样的名字。

1.7.5、结合多种规则

可以将多种正则表达式规则结合在一起,进行更复杂的匹配。

示例:SELECT * FROM employees WHERE name REGEXP '^[A-Za-z]+$';

这会匹配只包含字母的名字(不包括数字或其他字符)。

综合示例:

假设员工表,表格如下:

name

position

John

Manager

Steve

Developer

Amanda

Designer

Jack

Developer

Sarah

Manager

Jack123

Developer

示例 1:匹配名字以 J 开头,且至少包含两个字母。

SELECT * FROM employees WHERE name REGEXP '^J[a-zA-Z]{2,}';

结果:John、Jack

示例 2:匹配名字中包含 Jack 或 Sarah。

SELECT * FROM employees WHERE name REGEXP 'Jack|Sarah';

结果:Jack、Jack123

示例 3:匹配名字中至少包含一个数字。

SELECT * FROM employees WHERE name REGEXP '[0-9]';

结果:Jack123

1.8、数据处理函数

1. 字符串处理函数CONCAT()

将两个或多个字符串连接起来。

SELECT CONCAT(first_name, ' ', last_name) AS full_name FROM employees;

2. LENGTH() 和 CHAR_LENGTH()

LENGTH():返回字符串的字节长度。

CHAR_LENGTH():返回字符串的字符长度(考虑多字节字符)。

SELECT LENGTH('Hello') AS byte_length, CHAR_LENGTH('Hello') AS char_length;

3. UPPER() 和 LOWER()

将字符串转换为大写或小写。

SELECT UPPER('hello') AS upper_case, LOWER('HELLO') AS lower_case;

4.SUBSTRING() 或 SUBSTR()

截取字符串的一部分。

SELECT SUBSTRING('Hello World', 1, 5) AS substring;

5. NOW() 或 CURRENT_TIMESTAMP()

返回当前的日期和时间。

SELECT NOW() AS current_datetime;

  1. CURDATE() 和 CURTIME()

CURDATE():返回当前日期。

CURTIME():返回当前时间。

SELECT CURDATE() AS current_date, CURTIME() AS current_time;

  1. DATE_FORMAT()

格式化日期时间。

SELECT DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i:%s') AS formatted_date;

1.9、聚合函数

1. COUNT()

返回记录的数量。

SELECT COUNT(*) FROM employees;

2. SUM()

计算一列的总和。

SELECT SUM(salary) FROM employees;

3. AVG()

计算一列的平均值。

SELECT AVG(salary) FROM employees;

4. MAX() 和 MIN()

返回一列的最大值和最小值。

SELECT MAX(salary) AS max_salary, MIN(salary) AS min_salary FROM employees;

1.10、GROUP BY分组

将查询结果按指定的列进行分组,并且通常与聚合函数(如 COUNT()、SUM()、AVG() 等)一起使用,用来对每个分组进行统计和分析。

GROUP BY 的基本语法

SELECT column1,  aggregate_function(column2) FROM table_name GROUP BY column1;

column1: 用于分组的列。

aggregate_function(column2): 聚合函数,应用在分组后的数据上(如 SUM(), COUNT(), AVG() 等)。

table_name: 表名。

基本的 GROUP BY 使用

假设有一个名为 employees 的表,它包含 department_id 和 salary 列,我们可以按部门分组,计算每个部门的平均薪资:

SELECT department_id, AVG(salary) AS avg_salary FROM employees GROUP BY department_id;

这会按 department_id 列分组,并计算每个部门的平均薪资。

如果我们想要根据多个列进行分组,可以在 GROUP BY 后列出多个列名。例如,假设 sales 表包含 employee_id 和 sale_date 列,我们可以按员工和销售日期分组:

SELECT employee_id, sale_date, SUM(amount) AS total_sales FROM sales GROUP BY employee_id, sale_date;

1.11、LIMIT分页

通常用于从大量数据中提取部分结果,以提高查询效率。分页通常通过 LIMIT 和 OFFSET 来实现,它们用于限制返回的记录数量,并跳过指定数量的记录。

LIMIT 和 OFFSET

LIMIT:用于指定返回记录的数量。

OFFSET:用于指定跳过的记录数。

示例:

假设有一个表 employees,我们希望每页显示 10 条记录,查询第一页和第二页的数据。

第一页(记录 1 到 10):

SELECT * FROM employees LIMIT 10 OFFSET 0;

第二页(记录 11 到 20):

SELECT * FROM employees LIMIT 10 OFFSET 10;

可以看到,LIMIT 和 OFFSET 的搭配用于实现分页。LIMIT 规定了每页显示的记录数,而 OFFSET 确定了跳过的记录数,通常 OFFSET = (页数 - 1) * 每页记录数。

使用简化的 LIMIT:

LIMIT 还可以使用简化的写法,不显式使用 OFFSET,直接在一个参数中指定偏移量和记录数。

分页操作步骤讲解

1. 获取总记录数

分页查询的第一步是获取总记录数,通常通过 COUNT() 函数来获取表的总行数。通过获取总记录数,我们可以动态地计算出总页数。

SELECT COUNT(*) AS total_records FROM employees;

2. 计算总页数

有了总记录数后,我们可以计算出总页数。假设每页显示 10 条记录,可以通过以下公式计算:

总页数 = CEIL(总记录数 / 每页显示的记录数)

在 MySQL 中,可以通过 CEIL() 函数来向上取整,确保总页数即使有部分记录也能完整显示在最后一页。

SELECT CEIL(COUNT(*) / 10) AS total_pages FROM employees;

这个查询将返回一个数字,表示数据表中按每页 10 条记录分页后的总页数。

3. 计算当前页的 OFFSET

计算当前页数据时,需要知道从哪个位置开始获取数据。OFFSET 就是跳过前面多少条记录。通常是:

OFFSET = (当前页 - 1) * 每页显示的记录数

比如,如果用户请求第 3 页,每页显示 10 条记录,计算公式是:

OFFSET = (3 - 1) * 10 = 20 这意味着从第 21 条记录开始显示。

1.12、子查询

子查询是一个嵌套在另一个查询中的查询。它允许你在查询中使用一个查询的结果来影响另一个查询。

  1. 子查询在 WHERE 子句中

子查询常用来在 WHERE 子句中做条件过滤。它用于返回一个值,这个值会作为主查询的条件。

例子: 找到薪水高于某个员工(比如 id = 1)的所有员工。

SELECT

name

FROM

employees

WHERE salary > (SELECT salary FROM employees WHERE id = 1); 

这里,内部的子查询 (SELECT salary FROM employees WHERE id = 1) 获取了员工 id = 1 的薪水,主查询会返回所有薪水大于这个值的员工。

  1. 子查询在 SELECT 子句中

子查询也可以放在 SELECT 子句中,通常用于计算某些值。

例子: 查询每个员工的薪水以及他们所在部门的最大薪水。

SELECT

name, salary,

(SELECT

MAX(salary)

FROM employees

WHERE department = e.department) AS max_salary

FROM employees e;

这里的子查询 (SELECT MAX(salary) FROM employees WHERE department = e.department) 计算了每个员工所在部门的最大薪水,并将其作为额外列返回。

  1. 子查询在 FROM 子句中

子查询可以出现在 FROM 子句中,这种情况通常用于将子查询的结果当作一个临时表来使用。

例子: 查询每个部门的平均薪水。

SELECT

department, AVG(salary)

FROM (SELECT department, salary FROM employees) AS dept_salaries

GROUP BY department;

子查询 (SELECT department, salary FROM employees) 返回了每个员工的部门和薪水,主查询对这些数据计算了每个部门的平均薪水。

1.13、联表查询

JOIN ON 是用来指定表之间如何连接的条件,通常会在 JOIN 语句中使用。ON 后面跟着的是两个表之间的连接条件,它决定了如何根据一个共同的列(或多个列)将两张表的数据组合在一起。

1. 基本的 JOIN ON 语法

SELECT

column1, column2

FROM

table1 JOIN table2

ON

table1.column_name = table2.column_name;

column_name 是连接条件,通常是两个表中的相同字段。它可以是 ID、外键 等。

ON 后的条件是用于匹配两张表中记录的规则。比如常见的是基于某个字段的相等匹配(例如 table1.id = table2.user_id)。

2. JOIN ON 的工作原理

在执行查询时,数据库会根据 ON 后的条件把两张表中的数据进行组合。只有满足连接条件的行才会被返回。换句话说,JOIN ON 确定了哪些行应该配对并一起展示。

INNER JOIN:只返回两个表中都有的记录。

LEFT JOIN:返回左表的所有记录,以及右表中匹配的记录,若没有匹配,则返回 NULL。

RIGHT JOIN:返回右表的所有记录,以及左表中匹配的记录,若没有匹配,则返回 NULL。

FULL JOIN:返回两个表中所有的记录,若没有匹配,则返回 NULL。

SELF JOIN:将表与自己连接,用于表内部的关系查询。

通过合理使用 JOIN,可以有效地从多张表中提取并关联数据。

二、MySQL索引

索引是数据库中用来加速查询操作的数据结构。它类似于书的目录,通过它可以快速定位到数据的位置,避免每次查询时都需要扫描整个表,从而提高查询效率。索引虽然能提升查询性能,但也带来了一些开销,如占用存储空间和降低写入性能。

2.1、主键索引

定义:主键索引是唯一的索引,确保表中的每一行数据都具有唯一的标识符,且值不能为 NULL。

特点:一个表只能有一个主键,MySQL 会自动创建主键索引。

2.2、唯一索引

定义:唯一索引保证了索引列的值是唯一的,但允许列中有 NULL 值(与主键索引不同,主键列不允许 NULL)。

特点:可以有多个唯一索引。

2.3、普通索引

定义:普通索引是最常用的索引类型,用于加速查询操作,但不强制唯一性。

特点:适用于查询频繁的列。

2.4、全文索引

定义:全文索引专用于加速对文本字段的全文搜索,适用于 CHAR、VARCHAR 和 TEXT 类型的字段。

特点:适合进行复杂的字符串匹配和查询(如 MATCH AGAINST),通常用于搜索引擎类应用。

2.5、组合索引

定义:组合索引是基于多个列的索引,用于加速多列组合查询的性能。

特点:适用于 WHERE 子句中涉及多个字段的查询。索引的顺序很重要。

组合索引的工作原理:

顺序匹配:组合索引会按照索引创建时的列顺序进行匹配。所以,当查询时列的顺序跟索引列的顺序一致时,索引会被完全利用。

最左前缀原则:MySQL 会根据最左边的列来选择是否使用组合索引。比如,索引是 (name, age),那么你可以通过 name 查询,也可以通过 name 和 age 一起查询,但不能只通过 age 查询。

三、INSERT添加

3.1、插入单行数据

通常的插入操作是将一行数据插入到表中。你可以指定要插入的列以及对应的值。

语法:

INSERT INTO table_name (column1, column2, column3, ...) VALUES (value1, value2, value3, ...);

注意:

如果你没有为 id 字段提供值,数据库会自动生成该值。

如果表中的某个字段允许 NULL 或有默认值,则可以选择不插入该字段的值,数据库会根据默认设置插入。

3.2、插入多行数据

INSERT 语句中插入多行数据,可以减少多个单独插入操作的开销。

语法:

INSERT INTO table_name (column1, column2, column3, ...)

VALUES (value1a, value2a, value3a, ...),

       (value1b, value2b, value3b, ...),

       (value1c, value2c, value3c, ...);

这种方式一次性插入三行数据,效果等同于执行三次 INSERT 语句,但更加高效。

注意:

每一行的数据值必须和列数一一对应。

每一行的值之间用逗号 , 分隔。

3.3、查询检索数据并插入

你可以通过 SELECT 查询语句从一个表中检索数据,然后将这些数据插入到另一个表中。这种方法在批量迁移数据或从其他表选择数据插入时非常有用。

语法:

INSERT INTO table_name (column1, column2, column3, ...)

SELECT

column1, column2, column3, ...

FROM

another_table

WHERE condition;

INSERT INTO table_name (column1, column2, ...):这是目标表和目标列,您要将数据插入到哪个表的哪些列。

SELECT column1, column2, ... FROM another_table:这是源表及其列,从哪个表中选择数据。

WHERE condition:这是一个条件,通常用来筛选要插入的数据。

注意:

SELECT 查询的列顺序必须与 INSERT INTO 中列的顺序一致。

目标表的字段类型必须兼容 SELECT 查询中检索到的列的类型。

四、UPDATE修改

UPDATE 语句用于修改表中的现有记录。你可以通过条件 WHERE 来指定更新的行。如果没有条件,整个表的记录都会被更新。

语法:

UPDATE table_name SET column1 = value1, column2 = value2, ... WHERE condition;

table_name:需要更新数据的表名。

column1, column2, ...:需要更新的列。

value1, value2, ...:新值,更新列的内容。

WHERE condition:指定哪些行需要更新,确保只更新特定的记录。如果没有 WHERE 条件,所有记录都会被更新。

注意事项:

使用 WHERE 条件:如果忘记写 WHERE 条件,所有记录都会被更新,这可能会导致数据丢失或不可预料的结果。

更新多列:可以在 SET 部分同时更新多个列。

五、DELETE删除

语句用于从表中删除一条或多条记录。就像 UPDATE 语句一样,DELETE 语句可以结合 WHERE 条件来指定哪些记录需要删除。没有 WHERE 条件时,所有记录都会被删除。

语法:

DELETE FROM table_name WHERE condition;

table_name:要删除数据的表名。

condition:指定哪些记录需要删除。如果没有 WHERE 条件,所有记录都会被删除。

注意事项:

使用 WHERE 条件:如果没有 WHERE 条件,所有数据都会被删除,这个操作无法恢复。

删除多行数据:可以使用条件来删除多条记录。例如,删除所有 signup_date 在 2023 年之前的用户:

DELETE FROM users WHERE signup_date < '2023-01-01';

软删除 vs 硬删除:在某些情况下,可能不希望真正删除数据,而是标记数据为已删除(软删除)。这种情况下可以使用 UPDATE 设置一个“删除标记”,例如:

UPDATE users SET deleted = 1 WHERE id = 1;

通过以上内容便可轻轻松松使用Mysql.是不是超级简单.有任何问题欢迎留言哦!!!

重点!重点!重点!

遇到问题不用怕不如来我的知识库找找看,也许有意想不到的收获!!!

易网时代-易库资源-易库教程:.NET开发、Java开发、PHP开发、SqlServer技术、MySQL技术-开发资料大全-易网时代-易库资源-易库教程 (escdns.com)

相关文章:

  • 《目标检测双雄:YOLO与Faster R-CNN,谁主沉浮?》
  • 文本生成与采样策略 (Text Generation Sampling)
  • c# 字典存储的委托失效?
  • 结合建筑业务讲述TOGAF标准处理哪种架构
  • 毕业论文超清pdf带标签导出
  • goc命令大全
  • spring boot应用部署IIS
  • 【软件测试】
  • Docker安装与介绍(一)
  • Trae,字节跳动推出的 AI 编程助手插件
  • 进程控制(下)【Linux操作系统】
  • linux下C++性能调优常用的工具
  • AcWing 11:背包问题求方案数 ← 0-1背包
  • 科学研究:怎么做
  • [密码学基础]国密算法深度解析:中国密码标准的自主化之路
  • 计算机软考中级 知识点记忆——排序算法 冒泡排序-插入排序- 归并排序等 各种排序算法知识点整理
  • 腾讯云对象存储m3u8文件使用腾讯播放器播放
  • React 文章列表
  • 2024-04-19| Java: Documented注解学习 JavaDoc
  • 高可靠 ZIP 压缩方案兼容 Office、PDF、TXT 和图片的二阶段回退机制
  • 张九思任电子科大副教授,曾以学生身份入选爱思唯尔全球前2%顶尖科学家
  • “云南舞蹈大家跳”暨牟定“三月会”下周举行,城际公交免票
  • 老总们带着产品直奔对接会,外贸拓内销找到更多“新路子”
  • 第八届进博会倒计时200天,超100家展商将连续八届参展
  • 经济日报:扩大内需与扩大开放并行不悖
  • 多家期刊就AI辅助写作表态:不想让放弃思考毁了一代人