MySQL数据库查询外键设置及枚举(enum)操作

数据库 专栏收录该内容
2 篇文章 0 订阅

数据库的基本查询级一对多的外键创建

1 创建两张表,学生表和班级表,创建命令如下:
班级表:有两个字段:id 和 班级名称

  • create table classes(
    id INT PRIMARY KEY NOT NULL AUTO_INCREMENT,
    name VARCHAR(10)

    学生表:有一个外键class_id关联班级表, id 主键, 学生姓名 name, 性别gender, 分数score

  • create table students( id INT PRIMARY KEY NOT NULL AUTO_INCREMENT,
    name VARCHAR(5) NOT NULL,
    gender ENUM(‘M’,‘W’),
    score INT,
    class_id INT NOT NULL,
    foreign key (class_id) references classes(id) on delete cascade);

  • 创建字段意思简单介绍:
    1 创建枚举, ENUM(‘A’, ‘B’)
    2 不能为空, NOT NULL
    3 VARCHAR(n) 可变字符串
    4 指定外键:foreign key (CharID) references ChineseCharInfo(ID) on delete cascade on update cascade
    主外键关系:
    如果子表试图创建一个在主表中不存在的外键值,数据库会拒绝任何insert或update操作。

如果主表试图update或者delete任何子表中存在或匹配的外键值,最终动作取决于外键约束定义中的on delete和on update选项。

on delete和on update都有下面四种动作。

set null:主表删除或更新相应的数据和,则子表同时将与主表相匹配的行的外键列置为null。当外键列被设置为not null时无效。
no action:数据库拒绝删除或更新主表。
restrict:数据库拒绝删除或更新主表。如果未指定on delete或on update的动作,则on delete或on update的默认动作就为restrict。
  • 构造数据如下:
    在这里插入图片描述

查询操作

1 查询所有
select * from classes;

2  条件查询
  - 按条件查询students;
  select * from students where score >=80
  select * form students where score >=80 and gender = "M"
  select * from students where (score > 90 or score < 60) and gender = "M"
  
3 投影查询
   select id,  name, score from students;

4 排序
- 安score 从低到高
select * from students order by score;
 - 安score 从高到低
 select * from  students order by socre desc;
 - 安score , gender 排序
 select * fromstudetns order by score, gender;

 5 分页查询 
 - offset 表示每页多少个, limit表示从地多少个开始
 - 每页三个,从第0个开始
 select * from students limit 0 offset 3;
 - 查询第二页
 select * from students limit 3 offset 3;

6 聚合查询
 - count  统计个数
   - 统计students总共有多少学生
   - select count(*) from students
   - 统计分数大于70分的学生的个数
   - select count(score) as scor from students where score > 70;
   - 还有如下聚合函数 (AVG统计平均数, SUM 计算总和, MAX最大值, MIN 最小值
   - 聚合查询男生平均成绩
   - select AVG(score) from students where gender='M';

7 分组查询
 - group by 进行分组
 - select count(*) as num from students group by class_id;
 - 分组查出每个班级的平均分
 - select class_id, AVG(score) from students group by class_id;
 - 分别查出每个班男生和女生的平均分(可以分成多个组,之后再进行求平均分)
 -  select class_id, AVG(score) from students group by class_id, gender;

8 多表查询
 - 同时查询两个表, 列数累加,但是行数是N*M行,非常多的冗余数据,所以不建议用这个多表查询,推荐使用联合查询
 - select * from students, classes;

9 链接查询
- 链接查询分内链接和外链接,内链接表示查询两个表共同要查询的数据, 就是交集, 外链接查询就是以某一个表为主,对应的没有就默认为null
- inner join 内链接    选出所有学生,同时返回班级名称
- SELECT s.id, s.name, s.class_id, c.name class_name, s.gender, s.score
FROM students s
INNER JOIN classes c
ON s.class_id = c.id;
 - 外链接
 - SELECT s.id, s.name, s.class_id, c.name class_name, s.gender, s.score
FROM students s
RIGHT OUTER JOIN classes c
ON s.class_id = c.id;

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

参与评论 您还未登录,请先 登录 后发表或查看评论
©️2022 CSDN 皮肤主题:游动-白 设计师:我叫白小胖 返回首页

打赏作者

weixin_42861958

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

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

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

打赏作者

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

抵扣说明:

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

余额充值