Mysql(6)--基础查询

表的增删查改

CRUD : Create(创建), Retrieve(读取),Update(更新),Delete(删除)

1.Create

语法:

sql 复制代码
INSERT [INTO] table_name 
	[(column [, column] ...)] 
	VALUES (value_list) [, (value_list)] ...
value_list: value, [, value] ...

中的代表可以被省略的部分。

以studet表为例:

单行插入: (框出来的地方可省略)列名可以部分省略,前提要符合数据的约束

**多行插入:**插入的部分用 ','隔开,最后一个加';'

插入否则更新

由于 主键 或者 唯一键 对应的值已经存在而导致插入失败,可以选择性的进行同步更新操作:

语法:

sql 复制代码
INSERT ... ON DUPLICATE KEY UPDATE 
	column = value [, column = value] ...

替换

sql 复制代码
-- 主键 或者 唯一键 没有冲突,则直接插入;
-- 主键 或者 唯一键 如果冲突,则删除后再插入
	REPLACE INTO students (sn, name) VALUES (20001, '曹阿瞒');
	Query OK, 2 rows affected (0.00 sec)
	-- 1 row affected:      表中没有冲突数据,数据被插入
	-- 2 row affected:       表中有冲突数据,删除后重新插入

2.Retrieve

sql 复制代码
SELECT  
	[DISTINCT] {* | {column [, column] ...}  
	[FROM table_name] 
	[WHERE ...] 
	[ORDER BY column [ASC | DESC], ...] 
	LIMIT ... 

全列查询

指定列查询

查询字段为表达式

表达式不包含字段:

表达式包含一个字段:

表达式包含多个字段 :

为查询结果指定别名:

结果去重

有重复

去重后

WHERE 条件

练习:

查询英语成绩小于60 的学生

语文成绩在 80, 90 分的同学及语文成绩

数学成绩是 58 或者 59 或者 98 或者 99 分的同学及数学成绩

姓孙的同学 及 孙某同学

语文成绩好于英语成绩的同学

总分在 200 分以下的同学

语文成绩 > 80 并且不姓孙的同学

NULL 的查询

sql 复制代码
SELECT name, qq FROM students WHERE qq IS NOT NULL;

-- NULL 和 NULL 的比较,= 和 <=> 的区别

结果排序

sql 复制代码
-- ASC 为升序(从小到大) 
-- DESC 为降序(从大到小) -- 默认为 ASC 
SELECT ... FROM table_name [WHERE ...]  
	ORDER BY column [ASC|DESC], [...]; 

注:null值默认比任何值都小

例子:

同学及数学成绩,按数学成绩升序显示

查询同学各门成绩,依次按 数学降序,英语升序,语文升序的方式显示

查询同学及总分,由高到低

筛选分页结果

sql 复制代码
-- 起始下标为 0 -- 从 0 开始,筛选 n 条结果
SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT n;
-- 从 s 开始,筛选 n 条结果 
SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT s, n; 
-- 从 s 开始,筛选 n 条结果,比第二种用法更明确,建议使用 
SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT n OFFSET s; 

建议:对未知表进行查询时,最好加一条 LIMIT 1,避免因为表中数据过大,查询全表数据导致数据库卡死

例子:

按 id 进行分页,每页 3 条记录,分别显示 第 1、2、3 页

3.Update

sql 复制代码
UPDATE table_name SET column = expr [, column = expr ...] 
	[WHERE ...] [ORDER BY ...] [LIMIT ...] 

对查询到的结果进行列值更新

示例

将孙悟空同学的数学成绩变更为 80 分

将曹孟德同学的数学成绩变更为 60 分,语文成绩变更为 70 分

将总成绩倒数前三的3位同学的数学成绩加上30分

4.Delete

sql 复制代码
DELETE FROM  table_name [WHERE ...] [ORDER BY ...] [LIMIT ...]

例子:

删除孙悟空同学的考试成绩

删除表

我们可以看到这个auto_increment=4,不会因为删除所有的元素而重置自动增长id的计数器

因此我们再插入数据时,可以看到id从4开始

截断表

sql 复制代码
 TRUNCATE [TABLE] table_name

注意:这个操作慎用

  1. 只能对整表操作,不能像 DELETE 一样针对部分数据操作;
  2. 实际上 MySQL 不对数据操作,所以比 DELETE 更快,但是TRUNCATE在删除数据的时候,并不经过真正的事
    物,所以无法回滚
  3. 会重置 AUTO_INCREMENT 项



    我们可以观察到,与删除整表不同的是截断表truncate会将计数器重置

5.插入查询结果

sql 复制代码
INSERT INTO table_name [(column [, column ...])] SELECT ...

删除表中的的重复复记录,重复的数据只能有一份

创建一张空表 no_duplicate_table,结构和 duplicate_table 一样

将 duplicate_table 的去重数据插入到 no_duplicate_table

通过重命名表,实现原子的去重操作

6.聚合函数

示例:统计多少学生

统计math列有多少个成绩

统计数math成绩不同的个数

统计math成绩的总和

统计math成绩的平均值

统计英语成绩小于六十的有几人

数学成绩超过七十分的最小成绩

7.分组聚合统计

在select中使用group by 子句可以对指定列进行分组查询:

sql 复制代码
select column1, column2, .. from table group by column;

分组就像防御把一组按照条件拆成了多个组,进行各自组内的统计分组(分表),就是相当于把一战表按照条件在逻辑上拆成了多个子表,然后对各自的子表进行聚合统计

显示每个部门的平均工资和最高工资

显示每个部门的每种岗位的平均工资和最低工资

显示平均工资低于2000的部门和它的平均工资

having是对聚合后的统计数据,再进行条件筛选

相关推荐
Databend13 小时前
在 AWS 中国峰会逛了一天,我在 Databend 展台看到了 Agent 数据基础设施的新思路
数据库·人工智能·agent
李白客2 天前
KES新版MySQL兼容能力再升级意味着什么?
mysql·国产数据库
ClouGence2 天前
Oracle 数据同步为什么会出现数据不一致?长事务是常被忽略的原因
数据库·后端·oracle
飞将2 天前
从零实现数据库(2)——HashIndex + IndexManager
数据库
Nturmoils3 天前
订单列表慢查询,先看 WHERE、ORDER BY 和 LIMIT
数据库
渣波3 天前
拒绝 SQL 焦虑!手把手带你用 NestJS + Prisma + DTO 写出“防弹”级后端代码
javascript·数据库·后端
Jim6004 天前
【吃透 MySQL InnoDB连载】第 1 章・解密线上数据库高频故障
mysql
GreatSQL4 天前
gt-checksum v4.0.0 新功能解读系列文章(4):SSL 加密连接——数据校验传输安全再升级
mysql
倔强的石头_4 天前
KingbaseES 新版MySQL 兼容版体验:旧版迁移 + 功能实测
数据库