MySQL数据库 ---MySQL表的增删改查(进阶)

  • 1.7 CHECK约束(了解)

  • 2. 表的设计

    • 2.1 一对一
  • 2.2 一对多

  • 2.3 多对多

  • 3. 新增

  • 4. 查询

    • 4.1 聚合查询
    • 4.1.1 聚合函数
    • 4.1.1.1 COUNT
  • 4.1.1.2 SUM

  • 4.1.1.3 AVG

  • 4.1.1.4 MAX

  • 4.1.1.5 MIN

  • 案例求所有分数小于90的同学的平均分

  • 4.1.2 GROUP BY子句

  • 4.1.3 HAVING

    • 显示平均工资低于1500的角色和它的平均工资
  • 4.2 联合查询

    • 4.2.1 内连接
    • 语法:
  • 示例1: 查找名字为"许仙"的同学的所有成绩

  • 示例2: 查找所有同学的总成绩,以及该同学的基本信息

  • 示例3: 查找所有同学的每一科的成绩,和同学的相关信息

  • 4.2.2 外连接

    • 语法:
  • 示例1: 查询所有同学的成绩,及同学的个人信息,如果该同学没有成绩,也需要显示

  • 4.2.3 自连接

    • 示例1: 所有计算机原理的成绩 比 Java 成绩高的同学
  • 4.2.4 子查询

    • 单行子查询:子查询只有一行
    • 示例1: 查询与“不想毕业” 同学的同班同学:
  • 多行子查询:返回多行记录的子查询

    • 查询"语文"或者"英文"课程的成绩信息
  • 4.2.5 合并查询

    • 示例1: 查询 id < 3 或者 名字为 "英语"的课程
  • 示例2: 查询id小于3,或者名字为“Java”的课程

  • 4.2.6 内连 外连 集合图

MySQL表的增删改查(进阶)

==================================================================================

1. 数据库约束

============================================================================

| 约束类型 | 说明 | 示例 |

| — | — | — |

| NULL约束 | 使用NOT NULL指定列不为空 | name varchar(20) not null, |

| UNIQUE唯一约束 | 指定列为唯一的、不重复的 | name varchar(20) unique, |

| DEFAULT默认值约束 | 指定列为空时的默认值 | age int default 20, |

| 主键约束 | NOT NULL 和 UNIQUE 的结合 | id int primary key, |

| 外键约束 | 关联其他表的主键或唯一键 | foreign key (字段名) references 主表(列) |

| CHECK约束(了解) | 保证列中的值符合指定的条件 | check (sex =‘男’ or sex=‘女’) |

1.1 约束类型


  • NOT NULL - 指示某列不能存储 NULL 值。

  • UNIQUE - 保证某列的每行必须有唯一的值。

  • DEFAULT - 规定没有给列赋值时的默认值。

  • PRIMARY KEY - NOT NULL 和 UNIQUE 的结合。确保某列(或两个列多个列的结合)有唯一标识,有助于更容易更快速地找到表中的一个特定的记录。

  • FOREIGN KEY - 保证一个表中的数据匹配另一个表中的值的参照完整性。

  • CHECK - 保证列中的值符合指定的条件。对于MySQL数据库,对CHECK子句进行分析,但是忽略CHECK子句。

1.2 NULL约束


创建表时,可以指定某列不为空:

create table student (

id int not null,

name varchar(20),

score decimal(3,1)

);

在这里插入图片描述

在这里插入图片描述

1.3 UNIQUE:唯一约束


create table student (

id int unique,

name varchar(20),

score decimal(3,1)

);

在这里插入图片描述

在这里插入图片描述

1.4 DEFAULT:默认值约束


create table student (

id int unique not null,

name varchar(20) default ‘unknown’,

score decimal(3,1)

);

在这里插入图片描述

在这里插入图片描述

1.5 PRIMARY KEY:主键约束


等价于 not null + unique

create table student (

id int primary key,

name varchar(20),

score decimal(3,1)

);

在这里插入图片描述

在这里插入图片描述

如何保证主键不重复?人工保证不太靠谱.

可以借助数据库自动来生成.---- auto_increment

create table student (

id int primary key auto_increment,

name varchar(20),

score decimal(3,1)

);

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

自增的特点是:

  • 如果表中没有任何的记录,自增从1开始.
  • 如果表中已经有记录了,自增从上一条记录往下自增.
  • 如果中间某个数据删了,再次插入数据,刚才删掉的自增主键的值不好被重复利用

1.6 FOREIGN KEY:外键约束


描述两张表的之间的关联关系

外键用于关联其他表的主键或唯一键,语法:

foreign key (字段名) references 主表(列)

例:

create table class (

id int primary key auto_increment,

name varchar(20)

);

create table student (

id int primary key auto_increment,

name varchar(20),

classId int,

foreign key(classId) references class(id)

);

在这里插入图片描述

在这里插入图片描述

1.7 CHECK约束(了解)


MySQL使用时不报错,但忽略该约束:

create table user_test (

id int,

name varchar(20),

sex varchar(1),

check (sex =‘男’ or sex=‘女’)

);

2. 表的设计

===========================================================================

2.1 一对一


在这里插入图片描述

2.2 一对多


在这里插入图片描述

2.3 多对多


在这里插入图片描述

多对多的关系两者之间的对应关系是非常复杂的.

多对多这个关系复杂需要引入中间表来解决这个问题.

例如,描述每个同学的每个科目的考试成绩.

先创建表来描述同学的信息,然后创建表描述科目信息.

create table student(

id int primary key auto_increment,

name varchar(20)

);

create table course(

id int primary key auto_increment,

name varchar(20)

);

insert into student values

(null,‘甲’),

(null,‘乙’),

(null,‘丙’),

(null,‘丁’);

insert into course values

(null,‘语文’),

(null,‘数学’),

(null,‘英语’),

(null,‘物理’),

(null,‘化学’);

为了描述每个同学每一科考了多少分,就需要搞一个中间表来描述.

create table score(

courseId int,

studentId int,

score decimal(3,1)

);

insert into score values

(1,1,90);

在这里插入图片描述

如果想查找"甲"这个同学的"语文"成绩如何?

此时的查找过程就会更复杂.

  1. 先找到甲的studentld

  2. 在找到语文的courseld

  3. 结合这两个id再在score表中查找

3. 新增

=========================================================================

插入查询结果

语法:

insert into [表名] select [列名],[列名]… from [表名];

案例:

create table user(

id int primary key auto_increment,

name varchar(20),

description varchar(1000)

);

insert into user values

(null,‘曹操’,‘乱世枭雄’),

(null,‘刘备’,‘仁德之主’),

(null,‘孙权’,‘年轻有为’);

create table user2(

name varchar(20),

description varchar(1000)

);

insert into user2 select name,description from user;

在这里插入图片描述

4. 查询

=========================================================================

4.1 聚合查询


4.1.1 聚合函数

| 函数 | 说明 |

| :-- | :-- |

| COUNT([DISTINCT] expr) | 返回查询到的数据的 数量 |

| SUM([DISTINCT] expr) | 返回查询到的数据的 总和,不是数字没有意义 |

| AVG([DISTINCT] expr) | 返回查询到的数据的 平均值,不是数字没有意义 |

| MAX([DISTINCT] expr) | 返回查询到的数据的 最大值,不是数字没有意义 |

| MIN([DISTINCT] expr) | 返回查询到的数据的 最小值,不是数字没有意义 |

4.1.1.1 COUNT

在这里插入图片描述

在这里插入图片描述

4.1.1.2 SUM

在这里插入图片描述

4.1.1.3 AVG

在这里插入图片描述

4.1.1.4 MAX

在这里插入图片描述

4.1.1.5 MIN

在这里插入图片描述

案例求所有分数小于90的同学的平均分

在这里插入图片描述

4.1.2 GROUP BY子句

SELECT 中使用 GROUP BY 子句可以对指定列进行分组查询。需要满足:使用 GROUP BY 进行分组查询时, SELECT 指定的字段必须是“分组依据字段”,其他字段若想出现在SELECT 中则必须包含在聚合函数中。

select column1, sum(column2), … from table group by column1,column3;

案例:

create table emp(

id int primary key auto_increment,

name varchar(20) not null,

role varchar(20) not null,

salary numeric(11,2)

);

insert into emp(name, role, salary) values

(‘马云’,‘服务员’, 1000.20),

(‘马化腾’,‘游戏陪玩’, 2000.99),

(‘孙悟空’,‘游戏角色’, 999.11),

(‘猪无能’,‘游戏角色’, 333.5),

(‘沙和尚’,‘游戏角色’, 700.33),

(‘隔壁老王’,‘董事长’, 12000.66);

查询每个角色的最高工资、最低工资和平均工资

select role,max(salary),min(salary),avg(salary) from emp group by role;

在这里插入图片描述

4.1.3 HAVING

GROUP BY 子句进行分组以后,需要对分组结果再进行条件过滤时,不能使用 WHERE 语句,而需要用HAVING

显示平均工资低于1500的角色和它的平均工资

select role,avg(salary) from emp group by role having avg(salary) <1500;

在这里插入图片描述

4.2 联合查询


实现联合查询的基本机制 : 笛卡尔积

在这里插入图片描述

测试数据:

create table classes (id int primary key auto_increment,name varchar(20),desc varchar(100));

create table student (id int primary key auto_increment,sn varchar(20),name varchar(20),qq_mail varchar(20),classes_id int);

create table course (id int primary key auto_increment,name varchar(20));

create table score (score decimal(3,1),student_id int,course_id int);

insert into classes(name, desc) values

(‘计算机系2019级1班’, ‘学习了计算机原理、C和Java语言、数据结构和算法’),

(‘中文系2019级3班’,‘学习了中国传统文学’),

(‘自动化2019级5班’,‘学习了机械自动化’);

insert into student(sn, name, qq_mail, classes_id) values

(‘09982’,‘黑旋风李逵’,‘xuanfeng@qq.com’,1),

(‘00835’,‘菩提老祖’,null,1),

(‘00391’,‘白素贞’,null,1),

(‘00031’,‘许仙’,‘xuxian@qq.com’,1),

(‘00054’,‘不想毕业’,null,1),

(‘51234’,‘好好说话’,‘say@qq.com’,2),

(‘83223’,‘tellme’,null,2),

(‘09527’,‘老外学中文’,‘foreigner@qq.com’,2);

insert into course(name) values

(‘Java’),(‘中国传统文化’),(‘计算机原理’),(‘语文’),(‘高阶数学’),(‘英文’);

insert into score(score, student_id, course_id) values

– 黑旋风李逵

(70.5, 1, 1),(98.5, 1, 3),(33, 1, 5),(98, 1, 6),

– 菩提老祖

(60, 2, 1),(59.5, 2, 5),

– 白素贞

(33, 3, 1),(68,3, 3),(99, 3, 5),

– 许仙

(67, 4, 1),(23,4, 3),(56, 4, 5),(72, 4, 6),

– 不想毕业

(81, 5, 1),(37, 5, 5),

– 好好说话

最后希望可以帮助到大家!

千千万万要记得:多刷题!!多刷题!!

之前算法是我的硬伤,后面硬啃了好长一段时间才补回来,算法才是程序员的灵魂!!!!

篇幅有限,以下只能截图分享部分的资源!!

(1)多线程(这里以多线程为代表,其实整理了一本JAVA核心架构笔记集)

image

(2)刷的算法题(还有左神的算法笔记)

image

(3)面经+真题解析+对应的相关笔记(很全面)

image

(4)视频学习(部分)

ps:当你觉得学不进或者累了的时候,视频是个不错的选择

在这里,最后只一句话:祝大家offer拿到手软!!
‘say@qq.com’,2),

(‘83223’,‘tellme’,null,2),

(‘09527’,‘老外学中文’,‘foreigner@qq.com’,2);

insert into course(name) values

(‘Java’),(‘中国传统文化’),(‘计算机原理’),(‘语文’),(‘高阶数学’),(‘英文’);

insert into score(score, student_id, course_id) values

– 黑旋风李逵

(70.5, 1, 1),(98.5, 1, 3),(33, 1, 5),(98, 1, 6),

– 菩提老祖

(60, 2, 1),(59.5, 2, 5),

– 白素贞

(33, 3, 1),(68,3, 3),(99, 3, 5),

– 许仙

(67, 4, 1),(23,4, 3),(56, 4, 5),(72, 4, 6),

– 不想毕业

(81, 5, 1),(37, 5, 5),

– 好好说话

最后希望可以帮助到大家!

千千万万要记得:多刷题!!多刷题!!

之前算法是我的硬伤,后面硬啃了好长一段时间才补回来,算法才是程序员的灵魂!!!!

篇幅有限,以下只能截图分享部分的资源!!

(1)多线程(这里以多线程为代表,其实整理了一本JAVA核心架构笔记集)

[外链图片转存中…(img-8k9huIwF-1721149661302)]

(2)刷的算法题(还有左神的算法笔记)

[外链图片转存中…(img-oAMPuG0K-1721149661303)]

(3)面经+真题解析+对应的相关笔记(很全面)

[外链图片转存中…(img-Im4lCZEl-1721149661303)]

(4)视频学习(部分)

ps:当你觉得学不进或者累了的时候,视频是个不错的选择

在这里,最后只一句话:祝大家offer拿到手软!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值