Mysql表增删改查进阶—入门+实战面面俱到

Mysql增删改查(进阶)

1.约束类型

  • NOT NULL - 指示某列不能存储 NULL 值。
  • UNIQUE - 保证某列的每行必须有唯一的值。
  • DEFAULT - 规定没有给列赋值时的默认值。
  • PRIMARY KEY - NOT NULL 和 UNIQUE 的结合。确保某列(或两个列多个列的结合)有唯一标识,有助于更容易更快速地找到表中的一个特定的记录。
  • FOREIGN KEY - 保证一个表中的数据匹配另一个表中的值的参照完整性。
  • CHECK - 保证列中的值符合指定的条件。对于MySQL数据库,对CHECK子句进行分析,但是忽略CHECK子句。

2.表的设计(三大范式)

2.1一对一

  • 解释:有俩张表(人表,身份证表),那么根据人表指定一个人的消息,能在身份证表找到唯一的一条记录,同样根据身份证中的身份证在人表中同样能够找到唯一一个人,这就是一对一;
    Mysql表增删改查进阶—入门+实战面面俱到_第1张图片

2.2一对多

  • 解释:根据学生表中的一条消息,可以在班级表对应一个班级号,对应一条记录,
    根据班级表中的一个班级号,可以在学生表找到多条记录(因为一个班级肯定有多个学生),这就是一对多;
    Mysql表增删改查进阶—入门+实战面面俱到_第2张图片

2.3多对多

  • 解释:
    1.多对多,一般俩张表不发生关系的时候是没有任何关系的;
    2.例如下面的学生表和课程表,在学生没有选择课或者参加过这门课考试的时候,他们没有关系,但是当学生选择了这么课,学生就会产生一张课表,来建立起来学生与课程之间的关系;
    3.一个学生会选择多门课程,一门同样课程被多名同学选择,学生与课表课之间是一对多;
    4.同样一个课程表中一门课程,在课程中间表中可以找到多条记录,一条课程中间表记录,打印一门课程,也是一对多;
    5.这样学生表与课程表之间通过这个中间表就建立起来了多对多;
    Mysql表增删改查进阶—入门+实战面面俱到_第3张图片
  • 一道习题告诉你怎么搞定多对多建表

2.4学校宿舍管理系统

  • 题:要求包含宿舍信息,学生信息,每日宿舍查房记录

三张表:学生表,宿舍查房记录表(中间表),宿舍表;

  • 思路分析:(中间表)通过学号与学生表联系,通过宿舍楼号与宿舍楼联系;

    //创建学生(stu)表(学号(主键),姓名,宿舍号)

    //创建宿舍(house)表(宿舍楼号(主键),宿舍号,学生学号,学生所在宿舍号)

    //创建宿舍查房记录(h_record)表(中间表)(日期(主键),学生学号(外键),宿舍楼(外键),是否缺勤)

2.4.1创建学生(stu)表(学号,姓名,宿舍号)
create table stu (id varchar(20) primary key,
name varchar(20),
h_id int
);
2.4.2创建宿舍(house)表(宿舍楼号(主键),学生学号,学生所在宿舍号)
create table house(number int primary key,
s_id varchar(20),
h_id int
);
2.4.3创建宿舍查房记录(h_record)表(中间表)(日期(主键),学生学号(外键),宿舍楼号(外键),是否缺勤)
create table h_record(time timestamp primary key,
s_id varchar(20),
number int,
absence varchar(5),
foreign key (s_id) references stu(id),
foreign key (number) references house(number)
);

3.新增(插入查询结果)

/*将学生表中的所有数据复制到用户表*/
insert into test_user(name, email) select name, qq_mail from student

4.查询

4.1聚合查询

4.1.1聚合函数
  • count():返回查询到的数据的 数量(结果集);
select count(*) from student where id > 2;
  • sum():返回查询到的数据的 总和,不是数字没有意义;
 select sum(列名) from student;
  • avg():返回查询到的数据的 平均值,不是数字没有意义​
 select avg(列名) from student;
  • max():返回查询到的数据的 最大值,不是数字没有意义;
 select max(列名) from student;
  • min():返回查询到的数据的 最小值,不是数字没有意义
 select min(列名) from student;
4.1.2group by子句(分组)
  • 1.group up字段,分组查询,查询字段需要是分组字段,如果是非分组字段,需要使用最小粒度;

select * from student group by name;/*将学生表中名字一样的放在一组,*一般只使用分组列和计数列(count);
4.1.3having语句(代表分组后过滤) (where是分组前使用的,where…group by…)
  • 显示平均工资低于1500的角色和它的平均工资
select role,max(salary),min(salary),avg(salary) from emp group by role
having avg(salary)<1500;/*先分组在写having条件*/

4.2联合查询

4.2.1内连接
  • 语法:

    select 字段 from 表1 别名1 [inner] join 表2 别名2 on 连接条件 and 其他条件;
    select 字段 from 表1 别名1,表2 别名2 where 连接条件 and 其他条件;
    
4.2.2外连接
  • 概念:外连接分为左外连接和右外连接。如果联合查询,左侧的表完全显示我们就说是左外连接右侧的表完全显示我们就说是右外连接。

  • 语法:(left :左连接 right: 右连接)

-- 左外连接,表1完全显示
select 字段名  from 表名1 left join 表名2 on 连接条件;
-- 右外连接,表2完全显示
select 字段 from 表名1 right join 表名2 on 连接条件;
4.2.3自连接
  • 概念:自连接是指在同一张表连接自身进行查询。
4.2.4子查询
  • 概念:子查询是指嵌入在其他sql语句中的select语句,也叫嵌套查询
  • 分类:单行子查询,多行子查询
4.2.5合并查询(union,union all)
  • union:该操作符用于取得两个结果集的并集。当使用该操作符时,会自动去掉结果集中的重复行
  • union all:该操作符用于取得两个结果集的并集。当使用该操作符时,不会去掉结果集中的重复行

5.一道习题,加深印象

  • 创建A表和添加数据
drop table if exists A;
create table A(name varchar(32),
	grade int
);
/*添加数据*/
insert into A VALUES('zhangshan',80),
('list',60),
('wangwu',84);

Mysql表增删改查进阶—入门+实战面面俱到_第4张图片

  • 创建B表和添加数据
drop table if exists B;
create table B(name varchar(32),
	age int
);
/*添加数据*/
insert into B VALUES('zhangshan',26),
('list',24),
('wangwu',26),
('wutian',26);

Mysql表增删改查进阶—入门+实战面面俱到_第5张图片

  • 根据外连接中的右连接就可以显示如下的表(表A只有三条记录,B有四条,通过A和B建立联系,就可以显示四条记录)
select B.name,A.grade,B.age
from A right join B
on A.name = B.name;

Mysql表增删改查进阶—入门+实战面面俱到_第6张图片

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