MySQL从入门到精通:多表查询的灵活运用_02

Posted ABin-阿斌

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL从入门到精通:多表查询的灵活运用_02相关的知识,希望对你有一定的参考价值。

我是 ABin-阿斌:写一生代码,创一世佳话,筑一揽芳华。 如果小伙伴们觉得我的文章有点 feel ,那就点个赞再走哦。
在这里插入图片描述

第1章 DQL语句

1.1 条件查询

  • 在上一篇文章中我们的查询都是将所有数据都查询出来,但是有时候我们只想获取到满足条件的数据怎么操作呢?
    • 语法格式: SELECT 字段名 FROM 表名 WHERE 条件;
    • 流程: 取出表中的每条数据,满足条件的记录就返回,不满足条件的记录不返回

1.1.1 准备数据

CREATE TABLE student3 (
  id int,
  name varchar(20),
  age int,
  sex varchar(5),
  address varchar(100),
  math int,
  english int
);

INSERT INTO student3(id,NAME,age,sex,address,math,english) VALUES (1,'马云',55,'男','杭州',66,78),(2,'马化腾',45,'女','深圳',98,87),(3,'马景涛',55,'男','香港',56,77),(4,'柳岩',20,'女','湖南',76,65),(5,'柳青',20,'男','湖南',86,NULL),(6,'刘德华',57,'男','香港',99,99),(7,'马德',22,'女','香港',99,99),(8,'德玛西亚',18,'男','南京',56,65);

1.1.2 比较运算符

  • >大于
  • <小于
  • <=小于等于
  • >=大于等于
  • =等于
  • <>!=不等于

具体操作:

  • 查询 math 分数大于 80 分的学生
SELECT * FROM student3 WHERE math>80;

在这里插入图片描述

  • 查询 english 分数小于或等于 80 分的学生
SELECT * FROM student3 WHERE english<=80;

在这里插入图片描述

  • 查询 age 等于 20 岁的学生
SELECT * FROM student3 WHERE age=20;

在这里插入图片描述

  • 查询 age 不等于 20 岁的学生
SELECT * FROM student3 WHERE age!=20;
SELECT * FROM student3 WHERE age<>20;

在这里插入图片描述

1.1.3 逻辑运算符

  • and 多个条件同时满足
  • or 多个条件其中一个满足
  • not 不满足

具体操作:

  • 查询 age 大于 35 且性别为男的学生(两个条件同时满足)
SELECT * FROM student3 WHERE  age>35 AND sex='男';

在这里插入图片描述

  • 查询 age 大于 35 或性别为男的学生(两个条件其中一个满足)
SELECT * FROM student3 WHERE age>35 OR sex='男';

在这里插入图片描述

  • 查询 id 是 1 或 3 或 5 的学生
SELECT * FROM student3 WHERE id=1 OR id=3 OR id=5;

在这里插入图片描述

in 关键字:

  • 语法格式:SELECT 字段名 FROM 表名 WHERE 字段 in (数据1, 数据2...);
  • in里面的每个数据都会作为一次条件,只要满足条件的就会显示

具体操作:

  • 查询 id 是 1 或 3 或 5 的学生
SELECT * FROM student3 WHERE id IN (1,3,5);

]

  • 查询id不是1或3或5的学生
SELECT * FROM student3 WHERE id NOT IN (1,3,5);

在这里插入图片描述

1.1.4 范围区间查询

  • BETWEEN 值1 AND 值2 表示从值1到值2范围,包头又包尾
    • 比如:age BETWEEN 80 AND 100
    • 相当于: age>=80 and age<=100

具体操作:

  • 查询 english 成绩大于等于 75,且小于等于 90 的学生
SELECT * FROM student3 WHERE english>=75 AND english<=90;
SELECT * FROM student3 WHERE english BETWEEN 75 AND 90;

在这里插入图片描述

1.1.5 like:模糊查询

  • LIKE表示模糊查询

    • SELECT * FROM 表名 WHERE 字段名 like '通配符字符串'; 满足通配符字符串规则的数据就会显示出来
  • MySQL通配符有两个:

    • %: 表示0个或多个字符(任意个字符)

    • _: 表示一个字符

具体操作:

  • 查询姓【马】的学生
SELECT * FROM student3 WHERE NAME LIKE '马%';

在这里插入图片描述

  • 查询姓名中包含【德】字的学生
SELECT * FROM student3 WHERE NAME LIKE '%德%';

在这里插入图片描述

  • 查询姓【马】,且姓名有三个字的学生
SELECT * FROM student3 WHERE NAME LIKE '马__';

在这里插入图片描述

1.1.6 排序

  • 通过ORDER BY子句,可以将查询出的结果进行排序(排序只是显示方式,不会影响数据库中数据的顺序)
    SELECT 字段名 FROM 表名 WHERE 字段=值 ORDER BY 字段名 [ASC|DESC];
    • ASC: 升序, 默认是升序
    • DESC: 降序

1.1.6.1 单列排序

  • 单列排序就是使用一个字段排序

具体操作:

  • 查询所有数据,使用年龄降序排序
SELECT * FROM student3 ORDER BY age DESC;

在这里插入图片描述

1.1.6.2 组合排序

  • 组合排序就是先按第一个字段进行排序,如果第一个字段相同,才按第二个字段进行排序,依次类推。
  • 上面的例子中,年龄是有相同的,当年龄相同再使用 math 进行排序
    SELECT 字段名 FROM 表名 WHERE 字段=值 ORDER BY 字段名1 [ASC|DESC], 字段名2 [ASC|DESC];

具体操作:

  • 查询所有数据,在年龄降序排序的基础上,如果年龄相同再以数学成绩降序排序
SELECT * FROM student3 ORDER BY age DESC, math DESC;

在这里插入图片描述

1.1.7 聚合函数

  • 之前我们做的查询都是横向查询,它们都是根据条件一行一行的进行判断,而使用聚合函数查询是纵向查询,它是对一列的值进行计算,然后返回一个结果值,另外聚合函数会忽略空值。

  • 五个聚合函数:

    • count 统计指定列记录数,记录为NULL的不统计
    • sum 计算指定列的数值和,如果不是数值类型,那么计算结果为0
    • max 计算指定列的最大值
    • min 计算指定列的最小值
    • avg 计算指定列的平均值,如果不是数值类型,那么计算结果为0

聚合函数的使用:写在 SQL语句SELECT字段名的地方
SELECT 字段名... FROM 表名;
SELECT COUNT(age) FROM 表名;

具体操作:

SELECT COUNT(*) FROM student3;

在这里插入图片描述

  • 查询年龄大于40的总数
SELECT COUNT(*) FROM student3 WHERE age>40;

在这里插入图片描述

  • 查询数学成绩总分
SELECT SUM(math) FROM student3;

在这里插入图片描述

  • 查询数学成绩平均分
SELECT AVG(math) FROM student3;

在这里插入图片描述

  • 查询数学成绩最高分
SELECT MAX(math) FROM student3;

在这里插入图片描述

  • 查询数学成绩最低分
SELECT MIN(math) FROM student3;

在这里插入图片描述

1.1.8 分组

  • 分组查询是指使用 GROUP BY语句对查询信息进行分组,相同数据作为一组
    SELECT 字段1,字段2... FROM 表名 GROUP BY 分组字段 [HAVING 条件];

  • GROUP BY怎么分组的?将分组字段结果中相同内容作为一组

  • 将sex相同的数据作为一组

  • SELECT * FROM student3 GROUP BY sex;
    在这里插入图片描述

  • GROUP BY将分组字段结果中相同内容作为一组,并且返回每组的第一条数据,所以单独分组没什么用处。分组的目的就是为了统计,一般分组会跟聚合函数一起使用

  • 分组后聚合函数的作用?不是操作所有数据,而是操作一组数据。
    SELECT SUM(math), sex FROM student3 GROUP BY sex;

  • 效果如下:
    在这里插入图片描述

  • 实际上是将每组的math进行求和,返回每组统计的结果
    在这里插入图片描述

注意事项:

  • 当我们使用某个字段分组,在查询的时候也需要将这个字段查询出来,否则看不到数据属于哪组的
  • 查询的时候没有查询出分组字段
    在这里插入图片描述
  • 查询的时候查询出分组字段
    在这里插入图片描述

具体步骤:

  • 按性别分组
SELECT sex FROM student3 GROUP BY sex;

在这里插入图片描述

  • 查询男女各多少人
1.查询所有数据,按性别分组。 2.统计每组人数
SELECT sex, COUNT(*) FROM student3 GROUP BY sex;

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6lufljtG-1623328525221)(imgs\\分组06.png)]

  • 查询年龄大于25岁的人,按性别分组,统计每组的人数
1.先过滤掉年龄小于25岁的人。2.再分组。3.最后统计每组的人数
SELECT sex, COUNT(*) FROM student3 WHERE age > 25 GROUP BY sex;

在这里插入图片描述

  • 查询年龄大于25岁的人,按性别分组,统计每组的人数,并只显示性别人数大于2的数据
    • 有时候我们可能会将SQL语句写出这样:
      SELECT sex, COUNT(*) FROM student3 WHERE age > 25 GROUP BY sex WHERE COUNT(*) >2;
  • 注意: 并只显示性别人数 >2 的数据属于分组后的条件,对于分组后的条件需要使用 HAVING 句
SELECT sex, COUNT(*) FROM student3 WHERE age > 25 GROUP BY sex HAVING COUNT(*) >2;
只有分组后人数大于2``这组数据显示出来

在这里插入图片描述
注意:

  • having 与 where 的区别:
    • having 是在分组后对数据进行过滤.
    • where 是在分组前对数据进行过滤
    • having 后面可以使用聚合函数
    • where 后面不可以使用聚合函数

准备数据:

INSERT INTO student3(id,NAME,age,sex,address,math,english) VALUES 
(9,'唐僧',25,'男','长安',87,78),
(10,'孙悟空',18,'男','花果山',100,66),
(11,'猪八戒',22,'男','高老庄',58,78),
(12,'沙僧',50,'男','流沙河',77,88),
(13,'白骨精',22,'女','白虎岭',66,66),
(14,'蜘蛛精',23,'女','盘丝洞',88,88);

1.1.9 limit语句

  • LIMIT限制的意思,所以LIMIT的作用就是限制查询记录的条数。
    SELECT *|字段列表 [as 别名] FROM 表名 [WHERE子句] [GROUP BY子句][HAVING子句][ORDER BY子句][LIMIT子句];
  • 思考: limit子句为什么排在最后?
    • 因为前面所有的限制条件都处理完了,只剩下显示多少条记录的问题了!

LIMIT语法格式

  • LIMIT offset,length; 或者limit length;
  • offset是指偏移量,可以认为是跳过的记录数量,默认为0:从哪开始
  • length是指需要显示的总记录数:显示几条

具体步骤:

  • 查询学生表中数据,从第三条开始显示,显示6条
我们可以认为跳过前面2条,取6条数据
SELECT * FROM student3 LIMIT 2,6;

在这里插入图片描述

LIMIT的使用场景: 分页

  • 比如我们登录京东,淘宝,返回的商品信息可能有几万条,不是一次全部显示出来。是一页显示固定的条数。
  • 假设我们一每页显示5条记录的方式来分页,SQL语句如下:
-- 每页显示5条
-- 第一页: LIMIT 0,5;	跳过0条,显示5条
-- 第二页: LIMIT 5,5;  跳过5条,显示5条
-- 第三页: LIMIT 10,5; 跳过10条,显示5条
SELECT * FROM student3 LIMIT 0,5;
SELECT * FROM student3 LIMIT 5,5;
SELECT * FROM student3 LIMIT 10,5;

在这里插入图片描述

注意

  • 如果第一个参数是0可以简写:
    • SELECT * FROM student3 LIMIT 0,5;
    • SELECT * FROM student3 LIMIT 5;
  • LIMIT 10,5: 不够 5 条,有多少显示多少

第2章 数据库备份

2.1 备份的应用场景

  • 在服务器进行数据传输、数据存储和数据交换,就有可能产生数据故障。比如发生意外停机或存储介质损坏。这时,如果没有采取数据备份和数据恢复手段与措施,就会导致数据的丢失,造成的损失是无法弥补与估量的。

2.2 source命令备份与还原

备份格式
mysqldump -u用户名 -p密码 数据库 > 文件的路径

还原格式
SOURCE 导入文件的路径;

注意: 还原的时候需要先登录MySQL,并选中对应的数据库

具体操作

  • 备份 day22 数据库中的数据
mysqldump -uroot -proot day22 > D:\\技术栈\\\\MySQL\\code\\bak.sql

数据库中的所有表和数据都会导出成SQL语句
在这里插入图片描述

  • 还原day22数据库中的数据
    • 删除day22数据库中的所有表
      在这里插入图片描述

    • 登录MySQL

    mysql -uroot -proot
    
    • 选中数据库
    use day22;
    select database();
    

在这里插入图片描述

  • 使用 SOURCE 命令还原数据
source  D:\\技术栈\\\\MySQL\\code\\bak.sql

第3章 数据库约束

  • 对表中的数据进行进一步的限制,保证数据的正确性有效性完整性
    约束种类:

  • PRIMARY KEY主键

    • UNIQUE唯一

      • NOT NULL非空

        • DEFAULT默认

          • FOREIGN KEY外键

3.1主键

3.1.1 主键的作用:

  • 用来唯一标识一条记录,每个表都应该有一个主键,并且每个表只能有一个主键。
  • 有些记录的 name,age,score 字段的值都一样时,那么就没法区分这些数据,造成数据库的记录不唯一,这样就不方便管理数据
    在这里插入图片描述
    在这里插入图片描述

哪个字段应该作为表的主键?

  • 通常不用业务字段作为主键,单独给每张表设计一个id的字段,把id作为主键。主键是给数据库和程序使用的,不是给最终的客户使用的。所以主键有没有含义没有关系,只要不重复,非空就行。

3.1.2 创建主键

主键:PRIMARY KEY

主键的特点:

  • 主键必须包含唯一的值
  • 主键列不能包含NULL值

创建主键方式:

在创建表的时候给字段添加主键
字段名 字段类型 PRIMARY KEY

具体操作:

  • 创建表学生表 st5,包含字段(id,name,age)将 id 做为主键
CREATE TABLE st5 (
	id INT PRIMARY KEY, -- id是主键
	NAME VARCHAR(20),
	age INT
);

在这里插入图片描述

  • 添加数据
INSERT INTO st5 (id, NAME) VALUES (1, '唐伯虎');
INSERT INTO st5 (id, NAME) VALUES (2, '周文宾');
INSERT INTO st5 (id, NAME) VALUES (3, '祝枝山');
INSERT INTO st5 (id, NAME) VALUES (4, '文征明');
  • 插入重复的主键值
-- 主键是唯一的不能重复:Duplicate entry '1' for key 'PRIMARY'
INSERT INTO st5 (id, NAME) VALUES (1, '文征明2');
  • 插入NULL的主键值
-- 主键是不能为空的:Column 'id' cannot be null
INSERT INTO st5 (id, NAME) VALUES (NULL, '文征明3');

3.1.3 删除主键

ALTER TABLE 表名 DROP PRIMARY KEY;

具体操作:

  • 删除 st5 表的主键
ALTER TABLE st5 DROP PRIMARY KEY;

在这里插入图片描述

3.1.4 主键自增

  • 主键如果让我们自己添加很有可能重复,我们通常希望在每次插入新记录时,数据库自动生成主键字段的值
    AUTO_INCREMENT 表示自动增长(字段类型必须是整数类型)

具体操作:

  • 创建学生表 st6,包含字段(id,name,age)将 id 做为主键并自动增长
CREATE TABLE st6 (
	id INT PRIMARY KEY AUTO_INCREMENT,
	NAME VARCHAR(20),
	age INT
);
  • 插入数据
-- 主键默认从1开始自动增长
INSERT INTO st6 (NAME, age) VALUES ('唐僧', 22);
INSERT INTO st6 (NAME, age) VALUES ('孙悟空', 26);
INSERT INTO st6 (NAME, age) VALUES ('猪八戒', 25);
INSERT INTO st6 (NAME, age) VALUES ('沙僧', 20);

在这里插入图片描述

扩展:

  • 默认地 AUTO_INCREMENT 的开始值是1,如果希望修改起始值,请使用下列 SQL 语法:
    ALTER TABLE 表名 AUTO_INCREMENT=起始值;

DELETE 和 TRUNCATE 的区别:

  • DELETE 删除表中的数据,但不重置 AUTO_INCREMENT 的值。
    在这里插入图片描述

  • TRUNCATE 摧毁表,重建表,AUTO_INCREMENT重置为1
    在这里插入图片描述

3.2 唯一:

  • 在这张表中这个字段的值不能重复

3.2.1 唯一约束的基本格式

字段名 字段类型 UNIQUE

3.2.2 实现唯一约束

具体步骤:

  • 创建学生表 st7,包含字段(id,name),name这一列设置唯一约束,不能出现同名的学生
CREATE TABLE st7 (
	id INT,
	NAME VARCHAR(20) UNIQUE
);
  • 添加一个学生
INSERT INTO st7 VALUES (1, '貂蝉');
INSERT INTO st7 VALUES (2, '西施');
INSERT INTO st7 VALUES (3, '王昭君');
INSERT INTO st7 VALUES (4, '杨玉环');

-- 插入相同的名字出现name重复: Duplicate entry '貂蝉' for key 'name'
INSERT INTO st7 VALUES (5, '貂蝉');

-- 出现多个null的时候会怎样?因为null是没有值,所以不存在重复的问题
INSERT INTO st3 VALUES (5, NULL);
INSERT INTO st3 VALUES (6, NULL);

3.3 非空:

  • 这个字段必须设置值,不能是 NULL

3.3.1 非空约束的基本语法格式

字段名 字段类型 NOT NULL

具体操作:

  • 创建表学生表 st8,包含字段(id,name,gender)其中 name 不能为 NULL
CREATE TABLE st8 (
	id INT以上是关于MySQL从入门到精通:多表查询的灵活运用_02的主要内容,如果未能解决你的问题,请参考以下文章

MySQL从入门到精通:基本语法介绍与使用_01

MyBatis从入门到精通—MyBatis多表查询和注解开发

Mybatis从入门到精通系列 09——Mybatis多表查询之一对多查询

Mybatis从入门到精通系列 10——Mybatis多表查询之多对多查询

从入门到自闭之Python--MySQL数据库的多表查询

MYSQL_02--多表查询select

(c)2006-2024 SYSTEM All Rights Reserved IT常识