MySQL-3

复习

DML操纵数据语句
更新:insert/update/delete
查询:select
 
select 列1 as 别名,列2 as 别名 from 表名 as 对表取别名 where 对行的筛选 group by 分组的列名 having 配合统计函数进行对组的筛选 order by 排序的列 asc/desc limit 偏移量,获得条数
 
嵌套子查询:select中嵌套另一个select
 

1 为何需要外键

例如有一张学生表

学生编号
stu_id
姓名
stu_name
班级编号class_id 班级名class_name 班级描述class_detail
20320532001 张三 XM-2021001 JJA2101 java全栈开发…
20320532002 王五 XM-2021001 JJA2101 java全栈开发…
20320532003 李四 XM-2021002 JPH2101 PHP开发…
20320532004 田七 XM-2021002 JPH2101 PHP开发…


上面这一张存在问题,不满足数据库设计原则三大范式规则,导致如下问题
问题1:  班级信息冗余
问题2:班级信息不便于修改
 
解决问题:将班级信息专门设置一张表,然后学生表和班级表通过外键关联
 
创建班级信息表,班级编号是主键

班级编号class_id 班级名class_name 班级描述class_detail
XM-2021001 JJA2101 java全栈开发…
XM-2021002 JPH2101 PHP开发…


修改学生表结构,学生编号是主键,班级编号是外键。

学生编号
stu_id
姓名
stu_name
班级编号class_id
20320532001 张三 XM-2021001
20320532002 王五 XM-2021001
20320532003 李四 XM-2021002
20320532004 田七 XM-2021002

2 外键

主键:primary key 简称pk

作用:用于区分同一张表中不同的记录,作为唯一的标识符。保证实体完整性。主键自带非空、唯一约束。
 

外键:foreign key简称fk

作用:建立表之间的联系,保证参照完整性。
例如 A表中的某一个非主键列column1指向B表的主键列。
 
表示A表的非主键列column1的值必须来源于B表的主键列的值。
 
在A表中该column1列称之为A表的外键。
 
A表是从表,B表是主表。
 
添加数据的时候,应该先添加主表,再添加从表。
删除数据的时候,应该先删除从表,再删除主表。
 

3 外键设置:

方式1:物理外键:

表示在定义表的时候将外键关系一同显式设置。可以保证数据的完整性和一致性。

方式2:逻辑外键:

表示在定义表的时候不强行设置表和表之间的外键关系,但是表和表之间仍然有一个关联的列。
 

4 多表,设置物理外键

步骤1:设计表:

图书管理系统中图书类型和图书关系
图书类型:图书–>1:N
一种图片类型对应多本图书
一本图书只属于一个图书类型
 
图书类型表book_type
type_id(PK)  type_name  type_detail
1        玄幻        具体描述…
2        都市言情    具体描述…
3        武侠        具体描述…
4        名著        具体描述…
 
 
 
图书表 book
book_id(PK)   book_name      price  book_type_id(FK)
1        玄幻书第一本         15     1
2        玄幻书第二本         25     1
3        霸道总裁爱上我       10     2
4         神雕侠侣            50     3
  
 

步骤2:创建表、设置外键关系、添加测试数据

方式1:通过可视化操作

可视化工具建表

MySQL-3_第1张图片
 
MySQL-3_第2张图片
 
 
 

可视化工具为book表设置物理外键关系

MySQL-3_第3张图片

可视化添加数据

添加主表数据
MySQL-3_第4张图片
添加从表数据
MySQL-3_第5张图片

方式2:DDL定义语句

MySQL-3_第6张图片
 
 
 
 
 

5多表关联查询

概念:

MySQL支持3种关联查询
①内连接:inner join
根据ON后给出的两表的条件将两表连接起来。结果只显示符合连接条件的行。
即得到的是两张表的关联数据
 
②左连接:left join 
是以左表为基础,根据ON后给出的两表的条件将两表连接起来。
结果会将左表所有的查询信息列出,而右表只列出ON后条件与左表满足的部分。
 
③右连接right join是以右表为基础,根据ON后给出的两表的条件将两表连接起来。结果会将右表所有的查询信息列出,而左表只列出ON后条件与右表满足的部分。

语法:

select 列1,列2,… from 表1  inner/left/right join 表2 on 表1.主键列 = 表2.外键列  where …
 

表内数据:

MySQL-3_第7张图片
MySQL-3_第8张图片

内连接


MySQL-3_第9张图片

左连接

MySQL-3_第10张图片
 

右连接

MySQL-3_第11张图片

多表关联中对表取别名

MySQL-3_第12张图片
 

关联查询练习:

– 1. 查询所有图书的详细信息(图片+类型)
– 2. 查询"玄幻"类型的图书列表
– 3. 查询每种图书类型的图书数量/总价格/平均价格
– 显示格式: 类型编号,类型名,图书数量,总价格,平均价格
– 4. 查询每种图书类型的图书数量/总价格/平均价格,按照图书数量升序
– 显示格式: 类型编号,类型名,图书数量,总价格,平均价格
MySQL-3_第13张图片

N张表关联

MySQL-3_第14张图片

6 union和union all

如果需要对多个表结果进行合并,可以使用union和union all
 
union:对两个结果集进行并集操作,不包括重复行,同时进行默认规则的排序;
union all:对两个结果集进行并集操作,包括重复行,不进行排序;
 
UNION 操作符用于合并两个或多个 SELECT 语句的结果集。需要满足以下条件:
1、相同数量的列;
2、列也必须拥有相似的数据类型;
3、同时,每条 SELECT 语句中的列的顺序必须相同。
** **
语法:
select 列 from 表1 where …
union all
select 列 from 表1 where …
union all
select 列 from 表1 where …
 
 
示例:
MySQL-3_第15张图片
 
MySQL-3_第16张图片

7 where和having区别

1.where可以用于select、update、delete语句,having只能用于select语句中
2.where子句用来筛选 from子句中指定的操作所产生的行(对表的行进行筛选)
3.having子句用来从分组的结果中筛选行
4.having子句可以用集合函数(sum、count、avg、max和min),而where子句不可以。
5.即如果where和having一起用时,where会先执行,having后执行
 

8 drop、truncate、delete的区别

drop: drop table 表名
drop属于DDL定义语句,用于删除表结构,删除操作立即生效,原数据不放到rollback segment中,不能回滚,数据不可以回滚恢复。
 
truncate:truncate table 表名
truncate属于DDL定义语句,用于删除表所有数据,删除操作立即生效,原数据不放到rollback segment中,不能回滚,数据不可以回滚恢复。
 
delete:delete from 表 where 子句
delete属于DML操纵语句,用于删除表内数据,可以带where条件,删除的数据将存储在系统回滚段rollback segment中,需要的时候,数据可以回滚恢复。
 
 

9 物理外键和逻辑外键

物理外键:在定义表结构时显式声明外键关系,保证数据的完整性和一致性。添加和删除的需要注意主从表顺序。
 
逻辑外键:在定义表结构不显式声明外键关系,逻辑上我们知道表和表之间的关联列即可。
 
不管设置逻辑外键还是物理外键,SQL语句进行关联查询不需要做改变。
select  *  from 表 inner/ left/right/ join 表 on 关联关系 
 

10 日期时间函数

·          now()函数返回的是当前时间的年月日时分秒
·          curdate()函数返回的是年月日信息
·          curtime()函数返回的是当前时间的时分秒信息
·          now()与sysdate()类似,只不过now()在执行开始时就获取,而sysdate()可以在函数执行时动态获取。
·          对一个包含年月日时分秒日期格式化成年月日格式,可以使用DATE(time)函数
·          对一个包含年月日时分秒日期格式化成年格式,可以使用YEAR(time)函数
 

示例1:获得当前系统时间

MySQL-3_第17张图片

示例2:日期时间格式转换

MySQL-3_第18张图片
 
 
MySQL-3_第19张图片
 
 
MySQL-3_第20张图片
 
 

11 MYSQL中还有很多函数…

针对数学运算、字符串、日期时间等函数MySQL-3_第21张图片
 
 

综合作业

学生表t_student
字段名 数据类型 说明 备注
stu_id int 学生编号 pk
stu_name varchar(10) 学生姓名
hiredate date 入学年月日
class_id int 班级编号 FK 和班级表主键关联


班级表t_class
字段名 数据类型 说明 备注
class_id int 班级编号 pk
class_name varchar(10) 班级名称
teacher_id int 老师编号 FK 和老师表关联

教师表 t_teacher
字段名 数据类型 说明 备注
teacher_id int 教师编号 pk
teacher_name varchar(10) 教师姓名
hiredate date 入职年月日


课程表 t_course
字段名 数据类型 说明 备注
course_id int 课程编号 pk
course_name varchar(10) 课程名

选修课程成绩表 t_score
字段名 数据类型 说明 备注
stu_id int 学生编号 与course_id作为联合主键,同时外键,和学生表关联
course_id int 课程编号 与stu_id作为联合主键,同时外键,和课程表关联
score int 分数


备注:
对于成绩表的解释:
学生和课程成绩关系 N-N ;
一个学生可以考多门课程 ,一门课程可以被多个学生考,需要设置中间表
联合主键就是2个值不重复。 
 
 
使用SQL语句对各表插入数据
对教师表插入数据:
1号 陈老师 入职时间2020-01-01 
2号 黄老师 入职时间2021-05-15 
3号 白老师 入职时间2019-03-18 
 
对班级表插入数据:
班级编号1 班级名:软件1班   授课老师编号:1
班级编号2 班级名:软件2班   授课老师编号:2
班级编号3 班级名:计算机1班 授课老师编号:3
班级编号4 班级名:计算机2班 授课老师编号:1
班级编号5 班级名:自动化1班 授课老师编号:2
 
 
对学生插入数据:
1号学生名: 王五  入学时间2018-01-01  所属班级编号: 1
2号学生名: 田七  入学时间2018-01-02  所属班级编号: 1
3号学生名: 李四  入学时间2018-02-01  所属班级编号: 2
4号学生名: 小八  入学时间2019-08-11  所属班级编号: 2
5号学生名: 小九  入学时间2019-10-01  所属班级编号: 3
6号学生名: 大黄  入学时间2020-06-01  所属班级编号: 4
7号学生名: 张三  入学时间2021-07-01  所属班级编号: 5
8号学生名: 张三  入学时间2021-08-01  所属班级编号: 4
 
对课程表插入数据:
课程编号1 课程名:JAVA基础
课程编号2 课程名:JAVA框架应用
课程编号3 课程名:PHP编程
 
对成绩表插入数据
   让1,2,3,4,5,6,7同学均参加Java基础、JAVA框架应用、PHP编程课程的考试
 
– 1.使用DDL语句或者可视化工具建表,设置物理外键关系。
** **
– 2.通过批量插入SQL语句完成上面的插入数据任务
 
– 3.列出所有班级信息及授课老师的姓名和入职日期
 
– 4.列出陈老师和黄老师所带的班级
 
– 5.查询”软件1班”的学生数量
 
– 6.查询每个班级的班级名和学生数量,并按照学生数量升序显示
 
– 7.列出每门课程的课程号,课程名,选课人数,最高分
 
– 8.列出选修”JAVA基础”课程的学生学号,学生姓名,课程名,分数,并按照分数降序
– 9.列出在今年入学的学生编号,学生名,所在班级号,班级名
 
– 10.列出”软件1”班和”软件2班”的考试信息:学生编号,学生姓名,班级编号,班级名,课程名,分数
 
– 12.列出全校学生的考试信息,学生编号,学生姓名,班级编号,班级名,课程名,课程成绩(包括未选修课程的学生)
 
– 13.列出每个学生选修数量信息:学号,姓名,班级名,选修数量
 
– 14.列出课程平均分大于80分的课程名和平均分,并按平均分降序显示
 
– 15.列出选修人数超过2人的课程名和人数,并按照选修人数升序显示
 
– 16.列出每门课考试都及格的学生学号、学生姓名、班级名(60分为及格)
 

参考答案

公司笔试题:

第一家:

MySQL-3_第22张图片
 
 
MySQL-3_第23张图片

第二家:



MySQL-3_第24张图片

第三家:


MySQL-3_第25张图片

第四家:

MySQL-3_第26张图片
MySQL-3_第27张图片

第五家:

MySQL-3_第28张图片
MySQL-3_第29张图片

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