【MySQL】表的增删查改

目录

一、Create创建

1、单行数据+全列插入

2、多行数据+指定列插入

3、插入更新

4、替换

二、Retrieve查询

1、SELECT 列

1.1、 全列查询

1.2、指定列查询

1.3、查询字段为表达式 

1.4、结果去重

2、where条件

2.1、英语不及格的同学及英语成绩 ( < 60 )

2.2、语文成绩在 [80, 90] 分的同学及语文成绩

2.2.1、使用 AND 进行条件连接

2.2.1、使用 BETWEEN ... AND ... 条件

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

2.3.1、使用 OR 进行条件连接

2.3.2、 使用 IN 条件

2.4、姓孙的同学 及 孙某同学

2.4.1、% 匹配任意多个(包括 0 个)任意字符

2.4.2、_ 匹配严格的一个任意字符

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

2.6、总分在 200 分以下的同学

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

2.8、孙某同学,否则要求总成绩 > 200 并且 语文成绩 < 数学成绩 并且 英语成绩 > 80

2.9、NULL 的查询

3、结果排序

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

3.2、同学及 qq 号,按 qq 号排序显示

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

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

3.5、查询姓孙的同学或者姓王的同学数学成绩,结果按数学成绩由高到低显示

4、 筛选分页结果 

三、Update

1、将李四同学的数学成绩变更为 80 分

2、将赵六同学的数学成绩变更为 60 分,语文成绩变更为 70 分

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

4、将所有同学的语文成绩更新为原来的 2 倍

四、Delete

1、删除数据

1.1、删除李四同学的考试成绩

1.2、删除整张表数据

2、截断表 

五、插入查询结果 

六、聚合函数

1、统计班级共有多少同学

2、统计班级收集的 qq 号有多少

3、统计本次考试的数学成绩分数个数

4、统计数学成绩总分

5、 统计平均分 

6、返回英语最高分

7、返回 > 70 分以上的数学最低分

七、group by子句的使用

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

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

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

3.1、统计各个部门的平均工资

3.2、having和group by配合使用,对group by结果进行过滤


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

一、Create创建

语法:

INSERT [INTO] table_name
    [(column [, column] ...)]
    VALUES (value_list) [, (value_list)] ...

value_list: value, [, value] ...

 案例:

创建一张学生表:

【MySQL】表的增删查改_第1张图片

1、单行数据+全列插入

insert into 表名 values (数据1,数据2,...);

【MySQL】表的增删查改_第2张图片

 查看插入结果:

select * from 表名

【MySQL】表的增删查改_第3张图片

2、多行数据+指定列插入

insert into 表名 (字段1, 字段2, ...) values (数据1, 数据2, ...);

【MySQL】表的增删查改_第4张图片

3、插入更新

 之前由于 主键 或者 唯一键 对应的值已经存在而导致插入失败,现在可以把对应的插入操作更改成更新操作。

语法:

INSERT ... ON DUPLICATE KEY UPDATE
    column = value [, column = value] ...

【MySQL】表的增删查改_第5张图片

-- 0 row affected: 表中有冲突数据,但冲突数据的值和 update 的值相等
-- 1 row affected: 表中没有冲突数据,数据被插入
-- 2 row affected: 表中有冲突数据,并且数据已经被更新

通过 MySQL 函数获取受到影响的数据行数:

select row_count();

4、替换

 主键 或者 唯一键 没有冲突,则直接插入。 主键 或者 唯一键 如果冲突,则删除后再插入。

【MySQL】表的增删查改_第6张图片

二、Retrieve查询

 语法:

SELECT
    [DISTINCT] {* | {column [, column] ...}
    [FROM table_name]
    [WHERE ...]
    [ORDER BY column [ASC | DESC], ...]
    LIMIT ...

案例:

创建一个学生成绩的表结构:

【MySQL】表的增删查改_第7张图片

 插入数据:

【MySQL】表的增删查改_第8张图片

1、SELECT 列

1.1、 全列查询

通常情况下不建议使用 * 进行全列查询

  • 查询的列越多,意味着需要传输的数据量越大。
  • 可能会影响到索引的使用。

【MySQL】表的增删查改_第9张图片

1.2、指定列查询

指定列的顺序不需要按定义表的顺序来:

【MySQL】表的增删查改_第10张图片

1.3、查询字段为表达式 

【MySQL】表的增删查改_第11张图片

表达式包含多个字段

【MySQL】表的增删查改_第12张图片

为查询结果指定别名

语法:

SELECT column [AS] alias_name [...] FROM table_name;

【MySQL】表的增删查改_第13张图片

其中 as 可以省略。

1.4、结果去重

【MySQL】表的增删查改_第14张图片

2、where条件

比较运算符:

运算符 说明
>, >=, <, <= 大于,大于等于,小于,小于等于
= 等于,NULL 不安全,例如 NULL = NULL 的结果是 NULL
<=> 等于,NULL 安全,例如 NULL <=> NULL 的结果是 TRUE(1)
!=, <> 不等于
BETWEEN a0 AND a1 范围匹配,[a0, a1],如果 a0 <= value <= a1,返回 TRUE(1)
IN (option, ...) 如果是 option 中的任意一个,返回 TRUE(1)
IS NULL 是 NULL
IS NOT NULL 不是 NULL
LIKE 模糊匹配。% 表示任意多个(包括 0 个)任意字符;_ 表示任意一个字符

逻辑运算符:

运算符 说明
AND 多个条件必须都为 TRUE(1),结果才是 TRUE(1)
OR 任意一个条件为 TRUE(1), 结果为 TRUE(1)
NOT 条件为 TRUE(1),结果为 FALSE(0)

2.1、英语不及格的同学及英语成绩 ( < 60 )

【MySQL】表的增删查改_第15张图片

2.2、语文成绩在 [80, 90] 分的同学及语文成绩

2.2.1、使用 AND 进行条件连接

2.2.1、使用 BETWEEN ... AND ... 条件

【MySQL】表的增删查改_第16张图片

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

2.3.1、使用 OR 进行条件连接

【MySQL】表的增删查改_第17张图片

2.3.2、 使用 IN 条件

【MySQL】表的增删查改_第18张图片

2.4、姓孙的同学 及 孙某同学

2.4.1、% 匹配任意多个(包括 0 个)任意字符

【MySQL】表的增删查改_第19张图片

2.4.2、_ 匹配严格的一个任意字符

【MySQL】表的增删查改_第20张图片

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

WHERE 条件中比较运算符两侧都是字段:

【MySQL】表的增删查改_第21张图片

2.6、总分在 200 分以下的同学

WHERE 条件中使用表达式。

 别名不能用在 WHERE 条件中,这是因为 mysql 的执行顺序是先进行判断筛选条件,再提取结果。因此是先执行的 where 条件,此时还不认识别名。

【MySQL】表的增删查改_第22张图片

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

AND 与 NOT 的使用:

【MySQL】表的增删查改_第23张图片

2.8、孙某同学,否则要求总成绩 > 200 并且 语文成绩 < 数学成绩 并且 英语成绩 > 80

综合性查询

【MySQL】表的增删查改_第24张图片

2.9、NULL 的查询

查询 students 表:

【MySQL】表的增删查改_第25张图片

3、结果排序

语法:

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

注意:没有 order by 子句的查询,返回的顺序是未定义的,永远不要依赖这个顺序。

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

【MySQL】表的增删查改_第26张图片

3.2、同学及 qq 号,按 qq 号排序显示

 NULL 视为比任何值都小,升序出现在最上面,降序出现在最下面:

【MySQL】表的增删查改_第27张图片

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

多字段排序,排序优先级随书写顺序:

【MySQL】表的增删查改_第28张图片

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

ORDER BY 中可以使用表达式:

【MySQL】表的增删查改_第29张图片

 ORDER BY 子句中可以使用列别名

【MySQL】表的增删查改_第30张图片

3.5、查询姓孙的同学或者姓王的同学数学成绩,结果按数学成绩由高到低显示

结合 WHERE 子句 和 ORDER BY 子句:

【MySQL】表的增删查改_第31张图片

4、 筛选分页结果 

语法:

-- 起始下标为 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 页。

【MySQL】表的增删查改_第32张图片

三、Update

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

语法:

UPDATE table_name SET column = expr [, column = expr ...]
    [WHERE ...] [ORDER BY ...] [LIMIT ...]

1、将李四同学的数学成绩变更为 80 分

更新值为具体值。

查看原数据:

【MySQL】表的增删查改_第33张图片

 数据更新:

【MySQL】表的增删查改_第34张图片

2、将赵六同学的数学成绩变更为 60 分,语文成绩变更为 70 分

一次更新多个列。

【MySQL】表的增删查改_第35张图片

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

更新值为原值基础上变更。

查看原数据,别名可以在ORDER BY中使用:

【MySQL】表的增删查改_第36张图片

 数据更新,不支持 math += 30 这种语法:

【MySQL】表的增删查改_第37张图片

 查看更新后数据:

【MySQL】表的增删查改_第38张图片

4、将所有同学的语文成绩更新为原来的 2 倍

没有 WHERE 子句,则更新全表。

查看原数据:

 【MySQL】表的增删查改_第39张图片

 数据更新:

【MySQL】表的增删查改_第40张图片

 查看更新后数据:

【MySQL】表的增删查改_第41张图片

四、Delete

1、删除数据

语法:

DELETE FROM table_name [WHERE ...] [ORDER BY ...] [LIMIT ...]

1.1、删除李四同学的考试成绩

【MySQL】表的增删查改_第42张图片

1.2、删除整张表数据

注意:删除整表操作要慎用!

建立测试用表,并且插入数据:

【MySQL】表的增删查改_第43张图片

删除整表数据:

查看删除结果:

再插入一条数据,自增 id 在原值上增长:

查看数据:

【MySQL】表的增删查改_第44张图片

 查看表结构,会有 AUTO_INCREMENT=5 项,表示下一个自增 id 是 5:

【MySQL】表的增删查改_第45张图片

2、截断表 

语法:

TRUNCATE [TABLE] table_name

注意:这个操作慎用。

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

建立测试用表,并且插入数据:

【MySQL】表的增删查改_第46张图片

 截断整表数据,注意影响行数是 0,所以实际上没有对数据真正操作

【MySQL】表的增删查改_第47张图片

查看删除结果:

再插入一条数据,自增 id 在重新增长:

 查看数据:

【MySQL】表的增删查改_第48张图片

 查看表结构,会有 AUTO_INCREMENT=2 ,表示下一个自增 id 是 2:

【MySQL】表的增删查改_第49张图片

五、插入查询结果 

语法:

INSERT INTO table_name [(column [, column ...])] SELECT ...

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

创建原数据表,并插入数据:

【MySQL】表的增删查改_第50张图片

 思路

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

【MySQL】表的增删查改_第51张图片

 将 duplicate_table 的去重数据插入到 no_duplicate_table:

【MySQL】表的增删查改_第52张图片

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

【MySQL】表的增删查改_第53张图片

 通过 rename 方式进行重命名,是想等一切都就绪了,然后统一进行放入、更新、生效等操作。

 查看最终结果:

【MySQL】表的增删查改_第54张图片

六、聚合函数

函数 说明
COUNT([DISTINCT] expr) 返回查询到的数据的 数量
SUM([DISTINCT] expr) 返回查询到的数据的 总和,不是数字没有意义
AVG([DISTINCT] expr) 返回查询到的数据的 平均值,不是数字没有意义
MAX([DISTINCT] expr) 返回查询到的数据的 最大值,不是数字没有意义
MIN([DISTINCT] expr) 返回查询到的数据的 最小值,不是数字没有意义

1、统计班级共有多少同学

使用 * 做统计,不受 NULL 影响:

【MySQL】表的增删查改_第55张图片

2、统计班级收集的 qq 号有多少

NULL 不会计入结果:

【MySQL】表的增删查改_第56张图片

3、统计本次考试的数学成绩分数个数

COUNT(math) 统计的是全部成绩:

【MySQL】表的增删查改_第57张图片

COUNT(DISTINCT math) 统计的是去重成绩数量:

【MySQL】表的增删查改_第58张图片

4、统计数学成绩总分

【MySQL】表的增删查改_第59张图片

 不及格 < 60 的总分,没有结果,返回 NULL:

【MySQL】表的增删查改_第60张图片

5、 统计平均分 

统计英语成绩平均分:

 【MySQL】表的增删查改_第61张图片

统计平均总分:

【MySQL】表的增删查改_第62张图片

6、返回英语最高分

 【MySQL】表的增删查改_第63张图片

7、返回 > 70 分以上的数学最低分

【MySQL】表的增删查改_第64张图片

七、group by子句的使用

分组的目的是为了分组之后,方便进行聚合统计的。

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

select column1, column2, .. from table group by column;

 分组统计,需要指定列名,实际分组是用该列的不同行数据进行分组的。分完组之后,同一组内的该列条件是相同的,因此可以被聚合压缩。

 分组,就是把一组按照条件拆成了多个组,进行各自组内的统计。

案例:

准备工作,创建一个雇员信息表(来自oracle 9i的经典测试表)

  • EMP员工表
  • DEPT部门表
  • SALGRADE工资等级表

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

select deptno,avg(sal),max(sal) from EMP group by deptno;

【MySQL】表的增删查改_第65张图片

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

select avg(sal),min(sal),job, deptno from EMP group by deptno, job;

【MySQL】表的增删查改_第66张图片

 注意:当我们在select后增加了一个 ename 列时,mysql发生了报错。

 这是因为 ename 不属于分组条件,因此无法压缩聚合。

 在原则上,只有在 group by 中出现的具体的列名称,才可以在 select 中具体出现。另一类可以直接在select中出现的是聚合函数。

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

3.1、统计各个部门的平均工资

select avg(sal) from EMP group by deptno

【MySQL】表的增删查改_第67张图片

3.2、having和group by配合使用,对group by结果进行过滤

select deptno, avg(sal) as myavg from EMP group by deptno having myavg<2000;

【MySQL】表的增删查改_第68张图片

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

 having经常和group by搭配使用,作用是对分组进行筛选,作用有些像where。

having与where的区别:

  • where是对具体的任意列进行条件筛选。
  • having是对分组聚合之后的结果进行条件筛选。

【MySQL】表的增删查改_第69张图片

 

你可能感兴趣的:(MySQL,mysql,数据库)