MySQl表的增删查改(聚合查询+联合查询)

目录

1. 数据库约束

1.1 null约束

1.2 unique:唯一约束

1.3 default:默认值约束

1.4 primary key:主键约束 

1.5 foreign key:外键约束

1.6 check约束(了解)

2. 表的设计

3. 新增(查询结果,插入另一个表)

4. 查询

4.1 聚合查询

4.1.1 聚合函数 

4.1.2 group by 子句

4.1.3 having

4.2 联合查询

4.2.1 内连接(常用)

4.2.2 外连接(左外+右外+全外)

4.2.3 自连接

4.2.4 子查询

4.2.5 合并查询(union)


1. 数据库约束

约束:对于数据库中的记录做出更详细的检查

(1)not null:指示某列不能存储null值

(2)unique:唯一约束

保证某列的每行必须有唯一值

(3)default:默认值约束

规定没有给列赋值时的默认值

(4)primary key:主键约束

确保某列(或多个列的结合)有唯一的标识

有助于更容易快速找到表中的一个特定的记录

(5)foreign key:外键约束

保证一个表中的数据匹配另一表中的值的参照完整性

(6)check:保证列中的值符合指定的条件

1.1 null约束

not null 要求指定列,非空

创建表时如果约束这列非空,那么新增时,这列就不可以为空

1.2 unique:唯一约束

unique 值唯一,每次插入、修改数据,都会针对当前数据在表里进行查找,看这个值是否能查到,如果能查到,那么不是唯一的,就会导致插入或修改失败

如果使用unique后,先查询,再插入!!!   所以效率比较低

entry 在数据结构出现过,Map时entry叫做入口、条目

Map没有实现Iterable接口,没法直接遍历,所以把键值对转换成一个Set ,entrySet 

1.3 default:默认值约束

default:作用是修改默认值

本来表的默认值是null,可以使用 default 把默认值修改成其他值

1.4 primary key:主键约束 

primary key 主键 针对每一天记录,作为身份标识

主键要保证唯一性,主键也不能为空

 🤠 使用主键,需要给这个列设置一个唯一的值,我们自己进行分配值的工作,并且还要保证值不会重复,这样会比较麻烦,MySQL提供了一个机制,叫自增主键,来方便分配值

自增主键 跟在primary key 后面  (primary key auto_increment) ,

通过这样的机制,来给主键设置值

 自增主键,都是从最大值之后进行增加的

(虽然这样可能会有空间上的浪费,但从大量数据看,这点浪费不影响)

1.5 foreign key:外键约束

外键 foreign key:将两种表联系起来

........foreign key (当前表的那一列) references 另外一张表(那一列);

约束别的表的表,叫父表(parent,例子中的班级表)

被约束的表,叫子表(child,例子中的学生表)

(1)创建班级表,创建外键约束的学生表 

(2)给学生表插入数据,失败 

(3)给班级表插入数据,然后再给学生表插入数据,成功

 这里也要求,子表中引用父表的这一列,必须是primary key 或者 unique

(4)删除或修改父表的数据,失败

修改或删除记录也要看当前记录是否被子表引用,如果引用不能随便修改删除,

如果没有引用就可以修改或删除

1.6 check约束(了解)

check 不支持mysql

通过check中的表达式,对某些要求可以更加灵活实现


2. 表的设计

(1)一对一

比如网上银行系统  ,一个客户,只有一个账号;一个账号也对应一个账号

设计方式可以有多种

1)把所有信息放入一个表中

customer-account(身份证号,姓名,手机号,密码,用户名)

2)在客户表中,加上一个账号id

customer(customerId,姓名,手机号,身份证号,accountId

account(accountId,用户名,密码)

3)反之,也可以在账号表中加客户id

customer(customerId,姓名,手机号,身份证号)

account(accountId,用户名,密码,customerId

(2)一对多

一个银行经理,可以专属多个客户

一个客户,只能属于一个银行经理

 1)设计一个客户表,一个银行经理表,客户表加银行经理id进行联系

 2)设计一个客户表,一个银行经理表,银行经理表加客户id进行联系(此方法行不通

但是需要注意的是第二中这样的写法是不行的,因为customerld这里每行放多个,

在MySQL中是没有数组类型的,所以不能这样写

(3)多对多

 比如 一个客户,可以购买多个理财产品

一个理财产品,也可以由多个客户购买

1)创建一个客户表,一个理财产品表,一个关联表


3. 新增(查询结果,插入另一个表)

可以把查询的结果,插入到另一个另一个表中

create table 表2 第一个表查询结果;

(也可以插入部分,通过条件筛选,但是注意列的个数和类型要匹配)


4. 查询

4.1 聚合查询

聚合查询,是把行和行放在一起进行计算

4.1.1 聚合函数 

函数说明
count()返回查询到的数据的  数量(单查行不计空值,查全部*计空值)
sum()返回查询到的数据的 总和,不是数字没有意义
avg()返回查询到的数据的 平均值
max()返回查询到的数据的 最大值

min()

返回查询到的数据的 最小值

 下面看两个例子

4.1.2 group by 子句

group by子句:可以对指定列进行分组查询,指定的字段必须是‘’分组依据字段‘’,其他字段若想出现必须包含在聚合函数中

创建建一个emp表 

 (1)查询每个岗位的人数

思路 先查询都有什么岗位,也就是对岗位role进行分组,然后查询每个岗位的人数

 (2)查询每个岗位的平均薪资

思路 先查有哪些岗位,也就是对岗位进行分组,然后再对每种岗位求平均工资

求最高工资,和最低工资


4.1.3 having

group by 子句进行分组后,如果要对分组结果进行条件筛选时,不可以使用where语句,而要使用having

分组查询,还可以指定条件,需要区别的是

分组之前,使用条件筛选;   使用where

分组之后,进行条件筛选;   使用having

(1)查询每个岗位的平均薪资(除去 张三 这个记录)

思路 先除去张三,再进行分组(也就是分组之前,进行条件筛选)

(2)查询平均薪资 > 10000的岗位

先分组,计算平均薪资,然后再找到平均薪资大于10000的岗位

(也就是先分组,再进行条件筛选)

(3)求除去张三之外,每个岗位的平均薪资,并且保留平均薪资 > 10000的岗位


4.2 联合查询

实际开发中往往数据来自不同的表,所以需要多表联合查询。多表查询是对多张表的数据取笛卡尔积:

笛卡尔积,是两个表记录,排列组合的结果

笛卡尔的行数是一个相乘的关系,如果原来行数很多,相乘后行数就会更多

在进行联合查询的过程,就是在进行计算笛卡尔积的过程

当表比较大时,如果多表查询,机会比较低效,很可能会是危险操作

笛卡尔积的列数,是两个表的列数之和

笛卡尔积的行数,是两个表的行数之积

联合查询/多表查询 = 笛卡尔积 +  连接条件 + 其他条件(根据其他的需求)

联合查询:相当于把数据先变多,再变少的过程

创建四张表

4.2.1 内连接(常用)

select 字段 from 表1 join 表2 on 连接条件 and 其他条件;

select 字段 from 表1,表2 where 连接条件 and 其他条件

内连接,方法四步走

(1)进行笛卡尔积

select * from 表1,表2;

(2)添加连接条件,去除无用信息

select * form 表1,表2 where 连接条件

(3)添加其他条件,进行信息筛选

 select * form 表1,表2 where 连接条件 and 其他条件;

(4)精简列,去除无用列

 select 字段 form 表1,表2 where 连接条件 and 其他条件;

(1)查询“许仙”同学的成绩

学生表中查名字,分数表中查成绩

思路1:根据许仙同学的名字,找到学号,再根据学号找到对应的分数

思路2:学生表和分数表笛卡尔积,根据条件进行筛选

使用where做 

 使用join...on...做

(2)查询所有同学的总成绩,及同学的个人信息
思路 按照同学身份进行分组,然后依次每次求和
(3)查询所有同学的成绩,及同学的个人信息
查询出每个同学的成绩,带有课程信息
同学名在学生表,课程名在课程表,分数在分数表中
此时就要三张表的笛卡尔积
使用where

使用 join...on... 


4.2.2 外连接(左外+右外+全外)

外连接反为左外连接和右外连接

(1) 左外连接,表1完全显示

select 字段  from 表名1 left join 表名2 on 连接条件;

(2)右外连接,表2完全显示

select 字段 from 表名1 right join 表名2 on 连接条件;

下面创建下面这两个信息不一一对应的两个表

 看一下内外连接的区别

如果两张表,完全重合,内外连接没有区别

如果两张表,只有一部分重合,内连接就是获取到‘交集’;

 

 左外连接和右外连接,主要是看表的先后顺序

在join左侧还是右侧

select * from student left join score;    左外连接 student

select * from score right join student;  右外连接 student


4.2.3 自连接

自连接是指在同一张表连接自身进行查询(自己和自己进行笛卡尔积)

思路 ‘‘行’’转为‘’列‘’

显示所有“计算机原理”成绩比“Java”成绩高的成绩信息

 下面写一下,自连接的过程分析

自连接的代价

1.运行的开销

2.可读性的成本 


4.2.4 子查询

子查询是指嵌入在其他sql语句中的select语句,也叫嵌套查询

本质就是把多个查询语句,给组合成一个查询语句

用一个查询的结果的临时表,基于这个临时表再发起另一组查询

(1)单行子查询 返回一行记录的子查询

查询与“不想毕业”同学的同班同学

子查询可以理解为套娃,一层套一层,但如果套娃太复杂,就会非常影响理解 

 (2)多行子查询 返回多行记录的子查询

如果子查询,返回的结构是多条记录,就可以使用in来进行子查询

查询“语文”或“英文”课程的成绩信息

 多行子查询  除了可以使用in之外,

也可以使用exists ,exists写法,执行效率和可读性都远低于in写法

但是在特殊情况下,exists可以带头in

in的子查询结构是保存在内存中,

如果子查询结果集特别大,内存放不下,就需要使用exists


4.2.5 合并查询(union)

使用union或者union all 来完成把多个查询的结果集合,合并到一起 

  union   在合并时,如果合并时有重复数据,去重

  union all 在合并时,如果合并时有重复的数据,不去重

 查询id小于3,或者名字为“英文”的课程

union 可以 将不同的表合并在一块查询

or 只能在同一张表中查询 


  • 44
    点赞
  • 53
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 31
    评论
以下是C#联合MySQL进行增删查改的示例代码: 1. 连接MySQL数据库: ```csharp using MySql.Data.MySqlClient; string connectionString = "server=localhost;user=root;database=mydatabase;password=mypassword"; MySqlConnection connection = new MySqlConnection(connectionString); connection.Open(); ``` 2. 插入数据: ```csharp string insertQuery = "INSERT INTO student (name) VALUES (@name)"; MySqlCommand insertCommand = new MySqlCommand(insertQuery, connection); insertCommand.Parameters.AddWithValue("@name", "John"); insertCommand.ExecuteNonQuery(); ``` 3. 查询数据: ```csharp string selectQuery = "SELECT * FROM student"; MySqlCommand selectCommand = new MySqlCommand(selectQuery, connection); MySqlDataReader reader = selectCommand.ExecuteReader(); while (reader.Read()) { int id = reader.GetInt32("id"); string name = reader.GetString("name"); Console.WriteLine("ID: " + id + ", Name: " + name); } reader.Close(); ``` 4. 更新数据: ```csharp string updateQuery = "UPDATE student SET name = @newName WHERE id = @id"; MySqlCommand updateCommand = new MySqlCommand(updateQuery, connection); updateCommand.Parameters.AddWithValue("@newName", "Jane"); updateCommand.Parameters.AddWithValue("@id", 1); updateCommand.ExecuteNonQuery(); ``` 5. 删除数据: ```csharp string deleteQuery = "DELETE FROM student WHERE id = @id"; MySqlCommand deleteCommand = new MySqlCommand(deleteQuery, connection); deleteCommand.Parameters.AddWithValue("@id", 1); deleteCommand.ExecuteNonQuery(); ``` 6. 关闭数据库连接: ```csharp connection.Close(); ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 31
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

快到锅里来呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值