MySQL——增删改查进阶

目录

一,数据库的约束

1.not null——指定列非空

2.unique——指定值唯一

3.default——默认值约束

4.primary key——主键约束

 5.foreign key——外键约束

6.check约束——了解

二,表的设计

1.主要思路

 三,新增

四,查询(聚合函数:count,sum,max,min,avg)

1.count——计算行数

2.sum——若干行之间进行加和

3.avg——求若干行平均数

4.max——求若干行最大值

5.min——求若干行最小值

6.group by——分组查询

(1).分组

(2). 在分组时进行操作

 (3).分组之前筛选

(4).分组之后筛选 

 7.联合查询(笛卡尔积——列数相加,行数相乘)

(1).未做数据约束

 (2).排除错误数据

(3).jion on 写法

(4).具体聚合步骤

(5).内外链接

(6).自连接

8.子查询/嵌套查询

(1).单行子查询

(2).多行子查询

9.合并查询

(1).union

(2).union all


一,数据库的约束

1.not null——指定列非空

create table student (
 id int not null,
 sn int ,
 name varchar(20),
 qq_mail varchar(20)
);

2.unique——指定值唯一

create table student (
 id int ,
 sn int unique,
 name varchar(20),
 qq_mail varchar(20)
);

使用unique约束,数据库自动给对应列创建索引

3.default——默认值约束

create table student (
 id int ,
 sn int ,
 name varchar(20) default ' 未命名',
 qq_mail varchar(20)
);

4.primary key——主键约束

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

1.相当于 unique+not null

2.一个表中只能有一个(分布式部署时不能保证不重复)

3.常与  auto_increment  搭配使用,可自动增加值,也支持手动分配.

  手动分配后,按手动分配后新数据继续自增

 生成公式=(时间戳+机房编号/主机编号+随机因子)==>计算哈希值

 5.foreign key——外键约束

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

create table students (
id int primary key auto_increment,
sn int unique,
name varchar(20),
qq_mail varchar(20),
classes_id int,
foreign key (classes_id) references classes(id)
);

父表为classes,子表为students

在子表里创建父表的伪id

1.子表存在,不能直接删父表

2.被约束的不能直接删除

拓展:逻辑删除

将数据标记为无效

6.check约束——了解

create table students (
id int primary key auto_increment,
sn int unique,
name varchar(20),
sex varchar(20),

check (sex='男' or sex='女')
);

使用时不报错且自动忽略

二,表的设计

1.主要思路

(1).根据需求,找到“实体”

(2).梳理实体间的关系

一对一     

一对多   

1.学校宿舍管理系统,要求包含宿舍信息,学生信息,每日的宿舍查房记录。

create table dormitory(

  id int primary key,

  number varchar(20)

);

create table student(

id int primary key,

  name varchar(20),

  dormitory_id int,

  foreign key (dormitory_id) references dormitory(id)

);

 多对多

需要额外一个关联表

 三,新增

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

insert into 表1 select * from 表2 [where ];

四,查询(聚合函数:count,sum,max,min,avg)

对某某列的行进行操作

1.count——计算行数

select count(列/*)from 表

 注意:

count(列),若该列为null,则不计算;若该列为*,所有列为空也计算

2.sum——若干行之间进行加和

select sum(列名) from 表名;

 空值不参加运算,直接跳过

3.avg——求若干行平均数

4.max——求若干行最大值

5.min——求若干行最小值

6.group by——分组查询

(1).分组

select  列名 from 表名 group by 列名;

(2). 在分组时进行操作

 select 列, count(*) from 表 group by 列;

产生select 所需列,尽量不要使用*,否则分组产生的数据只显示第一个出现的行

count()

 avg(),max(),min()和count类似

 (3).分组之前筛选

  select 列, avg(*) from 表 wher 条件 group by 列; 

(4).分组之后筛选 

  select 列, avg(*) from 表  group by 列 having 条件;

HAVING是从分组结果中筛选数据的(行),而不是筛选列的 

 7.联合查询(笛卡尔积——列数相加,行数相乘)

联合查询/多表查询=笛卡尔积+连接条件+其他条件

(1).未做数据约束

select * from 表1 ,表2;

 (2).排除错误数据

select * from 表1 ,表2 where 条件;

eg:

select * from students, classer where students.id=classes.id; ()    表.列

(3).jion on 写法

select * from 表1 join 表2 on 条件;

(4).具体聚合步骤

1.先笛卡尔积

select * from 表1,表2 ;

2.再加上连接条件(一般是对id进行去重)

select * from 表1,表2 where 表1.id=表2.id ;

3.再加上其他限制条件,留下你需要的内容

select * from 表1,表2 where 表1.id=表2.id and 条件/group by ;

4.最后改变 select 后的 * 为所需要的列

select 列1,列2/sum(列),avg(列)...  from 表1,表2 where 表1.id=表2.id and 条件/group by ;

(5).内外链接

1.内外连接区别

如果两张表数据对应,内外连接基本相同,甚至没有区别

 如下所示:

 反之,情况不同,内外连接区别明显

 

2.内连接

select * from 表1,表2 where 条件;

select * from 表1 join 表2 on 条件;

select * from 表1 inner join 表2 on 条件;

3.外链接

外连接分为左外连接和右外连接。

左外连接:左侧的表完全显示

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

表1完全显示,表2若无表1对应数据,填充为NULL

 

右外连接:右侧的表完全显示

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

表2完全显示

 

(6).自连接

自连接是指在同一张表连接自身进行查询,比较特殊,因条件查询一般为列操作,而自连接可行操作,即——将行转换为列

但因其可读性差,运行开销成本高,故实际中执行多个SQL来完成比较

8.子查询/嵌套查询

其本质就是将多个查询语句组合成一个查询语句

(1).单行子查询

返回一行记录的子查询

select * from student where classes_id=(select classer_id from student where name=' xxx');

(2).多行子查询

返回多行记录的子查询

[not] in

-- 使用in
select * from score where course_id in (select id from course where name='语文' or name='英文');


-- 使用 not in
select * from score where course_id not in (select id from course where name!='语文' and name!='英文');

[not] exists 

-- 使用 exists
select * from score sco where exists (select sco.id from course cou
where (name='语文' or name='英文') and cou.id = sco.course_id);


-- 使用 not exists
select * from score sco where not exists (select sco.id from course cou
where (name!='语文' and name!='英文') and cou.id = sco.course_id);

exists可能速度较慢,延迟较高,故一般使用 In ,但当数据特别大时,可以使用exists

9.合并查询

(1).union

用于取得两个结果集的并集可自动去掉结果集中的重复行

select * from course where id<3 union select * from course where name='英文';
-- 或者使用or来实现
select * from course where id<3 or name='英文';

(2).union all

 用于取得两个结果集的并集,不能自动去掉结果集中的重复行

select * from course where id<3 union all select * from course where name='英文';

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值