尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Mysql——操作篇

Mysql——操作篇 目录查看客户端连接情况库的操作创建数据库查看已存在的数据库显示数据库的信息使用数据库修改数据库数据库删除数据库备份表的操作创建表查看表结构修改表删除表表的基本增删改查插入查询普通查询条件查询排序查询分页查询分组查询注意修改删除复合查询多表查询子查询合并查询内外连接内连接外连接查询的关键字执行优先级查看客户端连接情况相关命令show processlist;实操库的操作创建数据库相关命令create database [if not exists] [数据库名] [character set {字符集名}] [collate {字符校验规则}] /* [数据库名]指明要创建的数据库的名字必须 [if not exists]加上这个字段表明只有要创建的数据库不存在的时候才会创建该数据库非必须 [character set {字符集名}]指明该数据库用的字符集show charset可以查看mysql支持的字符集种类非必须 [collate {字符校验规则}]指明该数据库用的字符校验规则show collation 可以查看mysql支持的校验规则种类非必须 */实操字符集字符集决定了这个数据库如何把二进制解释成字符以及如何把字符翻译成二进制只有两个系统字符集一样才能正确通信。字符校验规则就是说在该数据库的表中在查找或者排序的时候要不要把大写字母和小写字母看成一回事上面实操中的“utf8mb4_general_ci”就是表明不区分大小写而“utf8_bin”表明要严格区分大小写。查看已存在的数据库相关命令show databases;显示数据库的信息相关命令show create database [数据库名]实操使用数据库相关命令#使用数据库 use [数据库名]; #查看当前所在数据库 select database();选中数据库后才能对其中的表结构进行操作下面是例子修改数据库主要是修改字符集和校验规则相关命令alter database [数据库名] [character set {字符集名}] [collate {字符校验规则}]实操:数据库删除数据库一旦被删里面表的内容都一起删除相关命令DROP DATABASE [IF EXISTS] [数据库名]; /* [IF EXISTS]加上这个字段表明只有数据库存在才执行删除语句 */数据库备份备份要在xshell命令行进行复原要在mysql客户端内进行相关命令#把数据库的内容备份到一个.sql文件 mysqldump -P[mysql服务的端口号] -u[用户名] -p[密码] -B [要备份的数据库名多个数据库用空格隔开] [要把备份保存在哪个文件里文件名后缀为sql要指明路径]; #把备份的内容还原 source [文件名,要带路径]实操如果要备份的是表而不是整个库:mysqldump -u[用户名] -p[密码] -B [数据库名] [表名多个表名用空格隔开] [要把备份保存在哪个文件里文件名后缀为sql要指明路径]如果备份一个数据库时没有带上-B参数 在恢复数据库时需要先创建空数据库然后使用数据库然后再使用source来还原表的操作创建表相关命令CREATE TABLE [if not exists] table_name ( field1 datatype, field2 datatype, field3 datatype ) [character set {字符集}] [collate {校验规则}] [engine 存储引擎]; #表也可以单独设置字符集和校验规则 #创建表的时候可以选择存储引擎 #创建一个和旧表一样的新表数据不复制 create table [新表名] like [旧表名]实操查看表结构相关命令desc [表名];实操修改表ALTER TABLE [表名] ADD [新增字段名 字段类型等修饰] [after 已有字段名]; #[after 已有字段名] 可以指定新增字段跟在谁后面不必须 ALTER TABLE [表名] MODIfy [要修改的字段名 字段类型等修饰] AlTER TABLE DROP [要删除的字段名] alter table [旧的表名] rename to [新的表名];删除表相关命令DROP TABLE [IF EXISTS] tbl_name;表的基本增删改查插入相关命令#全列插入可一次性插入多行数据 insert into [表名] values ([第一列的值第二列的值... ...]),([第一列的值第二列的值... ...]),... ... #指定列插入可一次性插入多行数据 insert into [表名] (指定列1,指定列2... ...) values ([第一列的值第二列的值... ...]),([第一列的值第二列的值... ...]),... ... #尝试插入如果因为主键或者唯一键重复而插入失败就更新 [插入语句] on duplicate key update [字段{新的值},字段{新的值}... ...] #尝试插入如果因为主键或者唯一键重复而插入失败就删除原有数据在插入可以一次性插入或删除后插入多行 replace into [表名] values ([第一列的值第二列的值... ...]),([第一列的值第二列的值... ...]),... ... #插入查询结果 insert into [表名] [查询语句];实操查询普通查询相关命令#标准查询语句 select [表示要查询哪些字段的内容多个字段用‘’隔开*表示全部字段] from [表名]; #查询内容包含表达式 select [eg: 字段名10、字段名*字段名、5、mysql内置函数] from [表名]; #为查询结果指定别名 select [字段名 as {别名},字段名 as {别名}... ...] FROM [表名]; #对查询出来的结果去重 select distinct [表示要查询哪些字段的内容多个字段用‘’隔开*表示全部字段] FROM [表名];实操条件查询相关命令#标准查询语句 select [表示要查询哪些字段的内容多个字段用‘’隔开*表示全部字段] from [表名] where [条件];实操排序查询相关命令-- ASC 为升序从小到大 -- DESC 为降序从大到小 -- 默认为 ASC select ... from [表名] order by [字段名 排序规则字段名 排序规则... ...];实操分页查询相关命令#显示从距离表头若干偏移量的位置开始的若干行 select ... from [表名] limit [要显示的行数] offset [偏移量];实操分组查询相关命令#首先是把表根据字段分成若干组可以显示这个组的聚合结果以及这个组的共有的用于分组的字段其他字#段不能显示因为组内的各个行的其他字段不一定都一样该显示谁就会产生歧义 select [只能显示用于分组的字段以及聚合函数] from [表名] group by [字段名字段名... ...]; #常用聚合函数 COUNT([DISTINCT] expr) 返回查询到的数据的数量 SUM([DISTINCT] expr) 返回查询到的数据的 总和不是数字没有意义 AVG([DISTINCT] expr) 返回查询到的数据的 平均值不是数字没有意义 MAX([DISTINCT] expr) 返回查询到的数据的 最大值不是数字没有意义 MIN([DISTINCT] expr) 返回查询到的数据的 最小值不是数字没有意义 #加distinct表示先去重再统计 #count(*)表示的是行数 #count(字段名)不会统计值为NULL的一行。实操注意以上的查询关键词比如wheredistinctlimit等都可以组合使用修改相关命令#对查询到的若干行数据更新他们的若干个字段的数据 UPDATE [表名] SET [字段名值字段名值... ...] [WHERE ...] [ORDER BY ...] [LIMIT ...]实操删除相关命令#删除筛选出来的若干行。如果没条件就是删除所有行删除所有行后重新插入数据自增ID不会重置 delete from [表名] [where ...] [order by ...] [limit ...] #清空表中的所有内容重新插入数据自增ID会重置。该操作无法回滚 truncate table [表名]实操复合查询多表查询相关命令#将若干个表组合成一张新的表并进行查询新表包含若干个旧表的所有字段 #组合方式是笛卡尔积。比如表A和表B进行组合那么表A的第一项和表B中的所有项分别组合形成若干个新表项表A的第二项和表B中的所有项分别组合形成若干个新表项... ... #如果两个表有冲突的字段名用 表名.字段名 加以区分 #表的别名可以不写 select ... from [表名1 表的别名,表名2 表的别名... ...] ...实操子查询相关命令#子查询就是在查询语句中嵌套查询语句直接例子说明实操合并查询相关命令#将两张表的内容合并到一起并去除重复内容 查询语句 union 查询语句 #将两张表的内容合并到一起不去除重复内容 查询语句 union all 查询语句实操内外连接在 MySQL 中内连接和外连接的核心区别在于多个表连接后如何处理不满足连接条件的行。内连接只返回两个表中完全匹配的行不匹配的会被丢弃。外连接会保留一个或两个表的所有行即使没有匹配也会用NULL填充缺失的部分。内连接相关命令#这个其实就是多表查询的平替将多个表连接 select 字段 from 表1 inner join 表2 on 连接条件 inner join 表3 on 连接条件;实操外连接相关命令#如果两行不匹配属于左边的表的那一行总是被保留多余的属于右边的表的字段被置NULL select 字段名 from 表名1 left join 表名2 on 连接条件 #如果两行不匹配属于右边的表的那一行总是被保留多余的属于左边的表的字段被置NULL select 字段名 from 表名1 right join 表名2 on 连接条件实操查询的关键字执行优先级SQL查询中各个关键字的执行先后顺序 from on join where group by with having select distinct order by limit其中having和where作用一样但是他两优先级不一样having用于分组后的查询where用于分组前的筛选。having关键字永远在group by后面where关键字永远在group by前面一些关键字的补充casecase相当于给表添加了一个临时的新字段可以显示它也可以用它排序等等类似于程序中的switch语法意为‘如果xxx就是xxx’select name,case depth when depth100 then 优秀 when depth60 then 及格 else 不及格 end as 等级 from table; SELECT * FROM 产品表 ORDER BY CASE WHEN 库存 0 THEN 1 ELSE 0 END;//有货的排前面缺货的排后面overover的作用也是分组但是功能更加强大相对于group by来说它保留所有数据行让他们按照组来扎堆排列并把聚合结果加载每一行数据的后面而不是一分组就只能显示整个分组的情况。聚合函数() OVER ( PARTITION BY 分组字段, -- 可选按什么分组比如按班级、按部门如果不选就把整个表当作一个分组 ORDER BY 排序字段 -- 可选在“圈”内按什么顺序‘累加’或排名 ROWS|RANGE BETWEEN 起始位置 AND 结束位置 --可选进一步限制要聚合的内容在某个分组内的范围 ) 其中起始位置、结束位置可以填 UNBOUNDED PRECEDING -- 分区第一行最前面 N PRECEDING -- 当前行往前第N行 CURRENT ROW -- 当前行 N FOLLOWING -- 当前行往后第N行 UNBOUNDED FOLLOWING -- 分区最后一行最后面 其中range会把相同值的所有行认定为一行而row不会 ------------------------------------------------------------------- ### 最经典的3个使用场景附代码 假设有一张**销售表** sales | id | year | amount | |----|------|--------| | 1 | 2024 | 100 | | 2 | 2024 | 200 | | 3 | 2025 | 150 | | 4 | 2025 | 250 | --- #### 场景1求累计总和最常用 **需求**按年份分组逐年累加销售额看每年卖到第几笔时的累计值。 sql SELECT id, year, amount, SUM(amount) OVER (PARTITION BY year ORDER BY id) AS 累计销售额 FROM sales; **结果** | id | year | amount | 累计销售额 | |----|------|--------|------------| | 1 | 2024 | 100 | **100** | (第一笔) | 2 | 2024 | 200 | **300** | (100200) | 3 | 2025 | 150 | **150** | (新的一年重新开始) | 4 | 2025 | 250 | **400** | (150250) **通俗理解**PARTITION BY year 就是“按年份分成两个小圈子”ORDER BY id 就是“在圈子里按顺序累加”。 --- #### 场景2求每个分组的占比不用子查询 **需求**算出每一笔销售额占**当年**总销售额的百分比。 sql SELECT id, year, amount, amount / SUM(amount) OVER (PARTITION BY year) AS 当年占比 FROM sales; **结果** - 2024年总额300第一笔100占比33.33% - 这里OVER里**没有ORDER BY**就表示“把整个2024年的总和算出来”然后每一行都除以这个总数。 --- #### 场景3排名ROW_NUMBER / RANK **需求**按年份分组给销售额从高到低排名。 sql SELECT id, year, amount, ROW_NUMBER() OVER (PARTITION BY year ORDER BY amount DESC) AS 排名 FROM sales; **结果** | id | year | amount | 排名 | |----|------|--------|------| | 2 | 2024 | 200 | 1 | | 1 | 2024 | 100 | 2 | | 4 | 2025 | 250 | 1 | | 3 | 2025 | 150 | 2 | **通俗理解**ROW_NUMBER()就是给每个圈子里按顺序标号ORDER BY amount DESC 表示大的排前面。 ####场景4 限制范围 sql CREATE TABLE sales ( sale_date DATE, amount DECIMAL(10,2) ); INSERT INTO sales VALUES (2024-01-01, 100), (2024-01-01, 150), -- 1号有两条记录 (2024-01-02, 200), (2024-01-03, 120), (2024-01-03, 180), -- 3号有两条记录 (2024-01-03, 250), -- 3号有三条记录 (2024-01-04, 300); 需求计算前2行到当前行的平均值 sql SELECT sale_date, amount, AVG(amount) OVER ( ORDER BY sale_date ROWS BETWEEN 2 PRECEDING AND CURRENT ROW ) AS ROWS_avg FROM sales; 结果 text sale_date amount ROWS_avg 解释 01-01 100 100.00 ← (100)/1 01-01 150 125.00 ← (100150)/2 01-02 200 150.00 ← (100150200)/3 01-03 120 156.67 ← (150200120)/3物理行往前数3行 01-03 180 166.67 ← (200120180)/3 01-03 250 183.33 ← (120180250)/3 01-04 300 243.33 ← (180250300)/3
返回列表