MySQL表的增删改查(CRUD2)
美好的一天又开始了,大家今天有没有学习呢?没学的话,开始跟随和博主一起对MYSQL的学习吧!!!
复习:
CRUD新增
1.新增 insert into 表名 [(列名[,列名,列名...])] values (值[,值,值...]); -- 列名与值是一一对应的关系
2.如果对表中所有的列设置值insert into 表名values (值[,值,值...]); -- 值的顺序与表中列的顺序相同
3.多行插入 insert into 表名[(列名[,列名,列名....)] values (值[ 值, 值..])[ (值[ 值, 值..]), (值[, 值,值..])..; 这里有多少组值的列表就代表要插入多少行数据
查询
1.全列查询 select * from 表名; * 是一个通配符,表示表中所有的列都会被查询出来
2.指定列查询 select 列名[,列名][,列名]... from 表名; --列名可以有多个,中间用逗号隔开
3.表达式 select 表达式 from 表名;#表达式可以是多个列的运行结果,也可是一个常量
4.表达式 +别名:select 表达式/列名 [as] 别名from 表名;# 别名也就是结果集中显示表头的列名
5. 去重 select distinct列名[,列名][列名] from 表名;# 重复记录的判定标准,一个数据行中的所有的列都相同才判定为相同,才可以得到去重的效果
6.排序 select * from 表名 order by 列名 [ASC(升序)| DESC(降序)]; #排序时order by 后面的列名,必须是一个有效的列,必须是表中的列或是查询列表中的表达式
1. 条件查询:WHERE
1 语法
根据指定的一些条件,这过滤掉不符合条件的记录,把符合条件的记录返回给用户可以通过一些运算符,比如说比较运算符,逻辑运算符 ,和JAVA中的思路是一样的
1 ⽐较运算符
大于,大于等于,小于,小于等于 和JAVA中一模一样
原始表:
比较条件:使用比较运算符(如 >、<、=、<> 等)来比较列值和常量或其他列值。例如:
我们查看数学成绩大于80分的数据
我们查看英语成绩小于80分的数据
我们查看语文成绩等于80.5分的数据
我们看上表可以看到丽丽的英语的成绩为NULL 但是我们把条件等于空时,并没有值
是不是很简单呐,看到这里相信大家已经蠢蠢欲动了,快去练习一下吧!!!
3 逻辑运算符
逻辑运算符有优先级的,不建议记忆,建议使用的时候还是通过小括号的方式,:
手动去指定优先级
使用where条件的语法:select * from 表名 where 列名/表达式 运算符 条件;
1. AND
当使用 AND 连接多个条件时,只有当所有条件都为真时,整个表达式才为真。
我们从上可以看到当数学成绩为80时,值为空,说明在数学里面没有值大于80的条件为假所以没值
2. OR
当使用 OR 连接多个条件时,只要其中一个条件为真,整个表达式就为真。
3. NOT
用于对一个条件取反。
4.观察AND和OR的优先级
根据返回的结果,我们可以得出一个结论AND 的优先级是大于OR的整体的优先级顺序和JAVA中一样NOT>AND>OR
用的时候还是手动加括号
4. 范围查询
使⽤BETWEEN AND 实现
查询语⽂成绩在[80,90]分的同学及语⽂成绩:
数学成绩是78或者79或者98或者99分的同学及数学成绩
使⽤IN实现
使⽤OR实现
5 模糊查询
1. LIKE 关键字与通配符
%
(百分号)通配符
代表任意字符序列(包括空字符序列)。例如
如果要查询所有以 '悟' 开头的学生名字,可以使用以下语句:
也可以用于查询包含特定字符串的情况。比如查询名字中包含'悟' 的客户:
还可以用于查询以特定字符串结尾的情况。例如查询名字以 '悟' 结尾的客户:
2. ____(下划线)通配符
代表任意单个字符,如果要查询产品代码是三个字符,且第二个字符是 '悟' 的名字,可以使用以下语句:
2. 区分大小写问题
在 MySQL 中,LIKE
操作默认是区分大小写的(取决于数据库的字符集和排序规则)。如果希望进行不区分大小写的模糊查询,可以使用以下两种方法之一:
1.使用 COLLATE 子句:假设数据库的字符集是 utf8mb4
,可以在查询中指定不区分大小写的排序规则。例如:
SELECT * FROM customers WHERE customer_name COLLATE utf8mb4_general_ci LIKE '%smith%';
这里的 utf8mb4_general_ci
中的 ci
表示不区分大小写(case - insensitive)。
2.修改数据库或表的字符集和排序规则:如果经常需要进行不区分大小写的操作,可以考虑将整个数据库或相关表的字符集和排序规则设置为不区分大小写的类型。但这种方法需要谨慎操作,因为可能会影响到其他依赖于当前字符集和排序规则的功能。
3. 其他模糊查询相关技巧
使用多个条件组合:可以将模糊查询与其他条件(如比较条件、逻辑条件等)结合使用。
SELECT * FROM products WHERE (price >= 100 AND price <= 200) AND product_name LIKE '%good%';
使用正则表达式(REGEXP)进行更复杂的模糊查询:MySQL 支持使用正则表达式进行模式匹配。例如,查询以元音字母开头的客户名字:
SELECT * FROM customers WHERE customer_name REGEXP '^[aeiouAEIOU].*';
不过,正则表达式的执行效率可能比简单的 LIKE
操作低,对于大型数据集,需要谨慎使用。
6 NULL的查询
查询包含 NULL 值的行可以使用 IS NULL
或 IS NOT NULL
运算符。
1. 使用 IS NULL 查询 NULL 值
查询英语成绩为NULL的记录
这种查询方式适用于任何数据类型的列。例如,如果有一个 products
表,其中 description
列可能为 NULL,要查询没有描述信息的产品,可以使用:
SELECT * FROM products WHERE description IS NULL;
2. 使用 IS NOT NULL 查询非 NULL 值
查询英语成绩不为NULL的记录
NULL与其他值进⾏运算结果为NULL
与其他条件的组合:可以将 IS NULL
或 IS NOT NULL
与其他条件(如比较条件、逻辑条件等)一起使用。
索引和 NULL 值:在某些数据库引擎中,索引对 NULL 值的处理方式可能有所不同。在设计数据库和查询时,如果经常需要对包含 NULL 值的列进行查询,需要考虑索引的使用和性能影响。例如,在 MySQL 的某些存储引擎中,含有 NULL 值的列可能不会被包含在索引中,这可能会影响查询性能。
函数处理 NULL 值:在使用一些函数处理数据时,需要特别注意 NULL 值的情况。例如,SUM()
函数在计算包含 NULL 值的列的总和时,会忽略 NULL 值。如果希望将 NULL 值视为 0,可以使用 COALESCE()
函数进行处理。
SELECT SUM(COALESCE(sales_amount, 0)) FROM sales_data;
注意
• WHERE条件中可以使⽤表达式,但不能使⽤别名
• AND的优先级⾼于OR,在同时使⽤时,建议使⽤⼩括号()包裹优先执⾏的部分
• 过滤NULL时不要使⽤等于号(=)与不等于号(!=,<>)
• NULL与任何值运算结果都为NULL
分页查询:
LIMIT 作用:限制查询结果集中的条数
之前我们学习select* from 表名;的时候,给大家说过,不加限制记录条数的査询是不安全的分页查询在项目中运行的非常多,只要查询的是一个记录的集合(多条记录)都在使用分页查询
通过分页查询可以有效的控制一次查询出来的结果集中的记录的条数可以有效的减少数据库服务器的压力,同时对于用户也比较友好
1.语法:
使用 LIMIT 子句
基本语法:LIMIT [offset,] row_count
。其中,offset
是可选参数,表示偏移量(从第几行开始查询),row_count
表示要返回的行数,即每页的记录数。
查询第⼀⻚数据
如果是第一页s应该取什么值?
因为要从第一条开始,所以取0
查询第⼆⻚数据
第二页的记录s应该取什么值?
因为每页获取2条记录,那么第二页就应该跳过之前显示的前3条,从下标为3的位置开始
查询第三⻚数据,没有达到limit的条数限制,也不会有任何影响,有多少条就显⽰多少条
第二..页的记录s应该取值的公式? s=(当前页号-1)*每页显示的记录数
s=(3-1)*3=6
2. 基于排序的分页
在实际应用中,分页查询通常会结合排序操作,以确保每页数据的顺序一致性。例如,按照员工的入职日期对员工信息进行分页查询。假设每页显示 8 条记录,查询第 2 页,按照入职日期升序排序:SELECT * FROM employees ORDER BY hire_date ASC LIMIT 8 OFFSET 8;
这里先通过 ORDER BY
子句对数据进行排序,然后再使用 LIMIT
和偏移量进行分页。
3. 性能优化考虑
索引使用:如果分页查询涉及到排序字段,为排序字段创建合适的索引可以提高查询性能。例如,在上面按照入职日期排序的分页查询中,如果在 hire_date
列上有索引,查询速度会更快。
避免使用 OFFSET 过大的查询:当 OFFSET
值非常大时(比如查询很深的页码),查询性能可能会下降,因为数据库需要跳过大量的行。在这种情况下,可以考虑使用 “键集分页” 等更优化的分页策略,但实现相对复杂,需要根据具体业务场景来决定。例如,可以记录上一页最后一条记录的主键值,下一页查询时使用该主键值作为条件进行查询,而不是简单地依赖 OFFSET
。
2. Update修改
1. ⽰例
将孙悟空同学的数学成绩变更为80分
update exam set math = 80 where name = '孙悟空';
将总成绩倒数前三的3位同学的数学成绩加上30分
查看原始数据
select name, math,chinese + math + english as 总分 from exam where chinese + math + english is not null order by 总分 asc limit 3;
更新操作并查看结果
update exam set math = math +30 where chinese + math + english is not null order by chinese + math + english asc limit 3;
update exam set math = 100;
update操作的时候,如果不加where条件,修改的将是整张表中的所有记录,是非常危险的操作谨慎操作