数据库学习之数据库增删改查(另外解决Mysql在linux下不能插入中文的问题)(二)
数据库增删改查
增加
首先我们创建一个数据库user,然后创建一张表employee
1 2 3 4 5 6 7 8 9 | create table employee( id int primary key auto_increment, name varchar( 20 ), gender char( 1 ) default '1' , birthday date, entry_date date, job varchar( 30 ), salary double( 7 , 2 ) unsigned ); |
格式:
1 | insert [into] tab_name (field1,filed2,.......) values (value1,value2,.......);<br>insert [into] tab_name set 字段名 = 值; |
例子:
1 | #指定字段,需要按照字段进行添加<br>#往表里插一条记录 |
1 | insert into employee(name,gender,birthday,entry_date,job,salary) values( "Alex" , '0' , '1988-04-01' , '2017-02-01' , "销售部" , 5000 ); |
1 | #往表里插入多条信息,在values后面添加就可以,之间用逗号隔开,最后加上分号结束。 |
1 2 | insert into employee(name,gender,birthday,entry_date,job,salary) values( "琳琳" , '0' , 1993 - 04 - 01 , 2018 - 02 - 02 , "销售部" , 7000 ), ( "Tom" , '0' , 1995 - 04 - 01 , 2017 - 06 - 02 , "技术部" , 13000 ); |
1 | #不指定字段,所有值都需要添加 |
1 | insert into employee values( 9 , '小龙' , '1' , '1990-08-08' , '2016-02-08' , "技术部" , 10000 ); |
1 | #通过键值对,多个键值对用逗号隔开 |
1 | insert into employee set name = "大彤" ; |
演示
解决不能插入中文
下面我们要解决一个问题:不能插入中文。
当我们在job这一列插入销售部的时候,查询记录显示为乱码。
将这列的字符集设置为gbk,就可以解决问题
修改
格式:
1 | update tab_name set field1 = value1,field2 = value2,......[where 语句]; |
例子:
1 2 3 4 5 6 7 8 9 | #将Alex的工资加2000<br>update employee set salary=salary+2000 where name="Alex"; #将Tom的工资加2000,并且调到python部门 update employee set salary = salary + 2000 ,job = "python" where name = "Tom" ; #将id为10的人调到技术部 update employee set job = "技术部" where id = 10 ; <br> #将job字段的字符集设置为gbk,以解决不能插入中文的问题 alter table employee modify job varchar( 30 ) character set gbk; |
演示
删除
格式:
1 | delete from tab_name [where ....]; |
例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | #删除表里所有的记录,一条一条的删除 delete from employee; #删除这个表,然后重新创建一个新的空表 truncate table employee; #删除Tom这一条记录 delete from employee where name = "Tom" ; 使用多重判断 #删除叫Alex并且id为6的记录,需要满足这两个条件 delete from employee where name = "Alex" and id = 6 ; #删除id为6或者id为5的记录 delete from employee where id = 6 or id = 5 ; |
演示
查询
首先我们创建一张表ExamResult,然后往表里添加数据用来演示
1 2 3 4 5 6 7 8 | CREATE TABLE ExamResult( id INT PRIMARY KEY auto_increment, name VARCHAR ( 20 ), JS DOUBLE , Django DOUBLE , OpenStack DOUBLE ); |
1 2 3 4 5 6 | INSERT INTO ExamResult VALUES ( 1 , "yuan" , 98 , 98 , 98 ), ( 2 , "xialv" , 35 , 98 , 67 ), ( 3 , "alex" , 59 , 59 , 62 ), ( 4 , "wusir" , 88 , 89 , 82 ), ( 5 , "alvin" , 88 , 98 , 67 ), ( 6 , "yuan" , 86 , 100 , 55 ); |
格式:
1 2 3 4 5 6 | SELECT * |field1,filed2 ... FROM tab_name WHERE 条件 GROUP BY field HAVING 筛选 ORDER BY field LIMIT 限制条数 |
(1)select [distinct] *|field1,field2,...... from tab_name
其中from指定从哪张表筛选,*表示查找所有列,也可以指定一个列。
表明确指定要查找的列,distinct用来剔除重复行。
1 2 3 4 5 6 | - - 查询表中所有学生的信息。 select * from ExamResult; - - 查询表中所有学生的姓名和对应的英语成绩。 select name,JS from ExamResult; - - 过滤表中重复数据。 select distinct JS ,name from ExamResult; |
(2)select 也可以使用表达式,并且可以使用: 字段 as 别名或者:字段 别名
1 2 3 4 5 6 7 | - - 在所有学生分数上加 10 分特长分显示。 select name,JS + 10 ,Django + 10 ,OpenStack + 10 from ExamResult; - - 统计每个学生的总分。 select name,JS + Django + OpenStack from ExamResult; - - 使用别名表示学生总分。 select name as 姓名,JS + Django + OpenStack as 总成绩 from ExamResult; select name,JS + Django + OpenStack 总成绩 from ExamResult; |
(3)使用where子句,进行过滤查询
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | - - 查询姓名为XXX的学生成绩 select * from ExamResult where name = 'yuan' ; - - 查询英语成绩大于 90 分的同学 select id ,name,JS from ExamResult where JS> 90 ; - - 查询总分大于 200 分的所有同学 select name,JS + Django + OpenStack as 总成绩 from ExamResult where JS + Django + OpenStack> 200 ; - - where字句中可以使用: - - 比较运算符: > < > = < = <> ! = between 80 and 100 值在 10 到 20 之间 in ( 80 , 90 , 100 ) 值是 10 或 20 或 30 like 'yuan%' / * pattern可以是 % 或者_, 如果是 % 则表示任意多字符,此例如唐僧,唐国强 如果是_则表示一个字符唐_,只有唐僧符合。两个_则表示两个字符:__ * / - - 逻辑运算符 在多个条件直接可以使用逻辑运算符 and or not - - 练习 - - 查询JS分数在 70 - 100 之间的同学。 select name ,JS from ExamResult where JS between 80 and 100 ; - - 查询Django分数为 75 , 76 , 77 的同学。 select name ,Django from ExamResult where Django in ( 75 , 98 , 77 ); - - 查询所有姓王的学生成绩。 select * from ExamResult where name like '王%' ; - - 查询JS分> 90 ,Django分> 90 的同学。 select id ,name from ExamResult where JS> 90 and Django > 90 ; - - 查找缺考数学的学生的姓名 select name from ExamResult where Database is null; |
(4)Order by 指定排序的列,排序的列即可是表中的列名,也可以是select 语句后指定的别名
1 2 3 4 5 6 7 8 9 10 11 12 13 | - - select * |field1,field2... from tab_name order by field [Asc|Desc] - - Asc 升序、Desc 降序,其中asc为默认值 ORDER BY 子句应位于SELECT语句的结尾。 - - 练习: - - 对JS成绩排序后输出,默认升序。 select * from ExamResult order by JS; - - 对总分排序按从高到低的顺序输出 select name ,(ifnull(JS, 0 ) + ifnull(Django, 0 ) + ifnull(Database, 0 )) 总成绩 from ExamResult order by 总成绩 desc; - - 对姓李的学生成绩排序输出 select name ,(ifnull(JS, 0 ) + ifnull(Django, 0 ) + ifnull(OpenStack, 0 )) 总成绩 from ExamResult where name like 'a%' order by 总成绩 desc; |
5)group by 分组查询
首先创建一张表order_menu,添加数据用来演示
1 2 3 4 5 6 7 | CREATE TABLE order_menu( id INT PRIMARY KEY auto_increment, product_name VARCHAR ( 20 ), price FLOAT ( 6 , 2 ), born_date DATE, class VARCHAR ( 20 ) ); |
1 2 3 4 5 6 7 8 | INSERT INTO order_menu (product_name,price,born_date, class ) VALUES ( "苹果" , 20 , 20170612 , "水果" ), ( "香蕉" , 80 , 20170602 , "水果" ), ( "水壶" , 120 , 20170612 , "电器" ), ( "被罩" , 70 , 20170612 , "床上用品" ), ( "音响" , 420 , 20170612 , "电器" ), ( "床单" , 55 , 20170612 , "床上用品" ), ( "草莓" , 34 , 20170612 , "水果" ); |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | - - 注意,按分组条件分组后每一组只会显示第一条记录 - - group by字句,其后可以接多个列名,也可以跟having子句,对group by 的结果进行筛选。 - - 按位置字段筛选 select * from order_menu group by 5 ; - - 练习:对购物表按类名分组后显示每一组商品的价格总和 select class , SUM (price) from order_menu group by class ; - - 练习:对购物表按类名分组后显示每一组商品价格总和超过 150 的商品 select class , SUM (price) from order_menu group by class HAVING SUM (price)> 150 ; / * having 和 where两者都可以对查询结果进行进一步的过滤,差别有: < 1 >where语句只能用在分组之前的筛选,having可以用在分组之后的筛选; < 2 >使用where语句的地方都可以用having进行替换 < 3 >having中可以用聚合函数,where中就不行。 * / - - GROUP_CONCAT() 函数 SELECT id ,GROUP_CONCAT(name),GROUP_CONCAT(JS) from ExamResult GROUP BY id ; |
(6)聚合函数: 先不要管聚合函数要干嘛,先把要求的内容查出来再包上聚合函数即可。
(一般和分组查询配合使用)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | - - < 1 > 统计表中所有记录 - - COUNT(列名):统计行的个数 - - 统计一个班级共有多少学生?先查出所有的学生,再用count包上 select count( * ) from ExamResult; - - 统计JS成绩大于 70 的学生有多少个? select count(JS) from ExamResult where JS> 70 ; - - 统计总分大于 280 的人数有多少? select count(name) from ExamResult where (ifnull(JS, 0 ) + ifnull(Django, 0 ) + ifnull(OpenStack, 0 ))> 280 ; - - 注意:count( * )统计所有行; count(字段)不统计null值. - - SUM (列名):统计满足条件的行的内容和 - - 统计一个班级JS总成绩?先查出所有的JS成绩,再用 sum 包上 select JS as JS总成绩 from ExamResult; select sum (JS) as JS总成绩 from ExamResult; - - 统计一个班级各科分别的总成绩 select sum (JS) as JS总成绩, sum (Django) as Django总成绩, sum (OpenStack) as OpenStack from ExamResult; - - 统计一个班级各科的成绩总和 select sum (ifnull(JS, 0 ) + ifnull(Django, 0 ) + ifnull(Database, 0 )) as 总成绩 from ExamResult; - - 统计一个班级JS成绩平均分 select sum (JS) / count( * ) from ExamResult ; - - 注意: sum 仅对数值起作用,否则会报错。 - - AVG(列名): - - 求一个班级JS平均分?先查出所有的JS分,然后用avg包上。 select avg(ifnull(JS, 0 )) from ExamResult; - - 求一个班级总分平均分 select avg((ifnull(JS, 0 ) + ifnull(Django, 0 ) + ifnull(Database, 0 ))) from ExamResult ; - - Max 、 Min - - 求班级最高分和最低分(数值范围在统计中特别有用) select Max ((ifnull(JS, 0 ) + ifnull(Django, 0 ) + ifnull(OpenStack, 0 ))) 最高分 from ExamResult; select Min ((ifnull(JS, 0 ) + ifnull(Django, 0 ) + ifnull(OpenStack, 0 ))) 最低分 from ExamResult; - - 求购物表中单价最高的商品名称及价格 - - - SELECT id , MAX (price) FROM order_menu; - - id 和最高价商品是一个商品吗? SELECT MAX (price) FROM order_menu; - - 注意:null 和所有的数计算都是null,所以需要用ifnull将null转换为 0 ! - - - - - - - ifnull(JS, 0 ) - - with rollup的使用 |
(7) 重点:Select from where group by having order by
1 2 3 4 5 | - - Mysql在执行sql语句时的执行顺序: - - from where select group by having order by - - 分析: select JS as JS成绩 from ExamResult where JS成绩 > 70 ; - - - - 不成功 select JS as JS成绩 from ExamResult having JS成绩 > 90 ; - - - 成功 |
(8) limit
1 2 3 | SELECT * from ExamResult limit 1 ; SELECT * from ExamResult limit 2 , 5 ; - - 跳过前两条显示接下来的五条纪录 SELECT * from ExamResult limit 2 , 2 ; |
(9) 使用正则表达式查询
1 2 3 4 5 | SELECT * FROM employee WHERE emp_name REGEXP '^yu' ; SELECT * FROM employee WHERE emp_name REGEXP 'yun$' ; SELECT * FROM employee WHERE emp_name REGEXP 'm{2}' ; |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?