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是对聚合后的统计数据,再进行条件筛选

相关推荐
添砖java‘’4 小时前
MySQL事务
数据库·mysql
身如柳絮随风扬5 小时前
MongoDB 典型使用场景深度解析:从订单冷热分离到社交地理查询
数据库·mongodb
minji...5 小时前
MySQL数据库 (一) MySQL数据库基础,MySQL架构,存储引擎,SQL语句分类
数据库·mysql·oracle·sql语句·存储引擎··mysqld
baynk5 小时前
深入理解MySQL事务隔离级别:从理论到实战实验
mysql
jason_renyu5 小时前
MySQL横表(直表/宽表)与竖表(键值表)完整实操学习笔记
mysql·mysql学习·横标和竖表·竖表讲解·横标竖表学习
梦想的颜色5 小时前
MySQL 查询性能核武器
运维·服务器·数据结构·数据库·mysql
haven-8526 小时前
mysql索引当中的B+树,聚簇/二级索引,最左匹配,失效场景
数据库·b树·mysql
jason_renyu7 小时前
MySQL数据表设计入门学习文档(基于Flask+Vue3图书馆管理系统·小白专用)
mysql·数据表设计入门学习·mysql数据库表设计学习·新手入门数据表设计
KaiwuDB7 小时前
KWDB SampleDB 上新|用 Agent Skill 跑通数据库示例
数据库