DML操纵数据语句
更新:insert/update/delete
查询:select
select 列1 as 别名,列2 as 别名 from 表名 as 对表取别名 where 对行的筛选 group by 分组的列名 having 配合统计函数进行对组的筛选 order by 排序的列 asc/desc limit 偏移量,获得条数
嵌套子查询:select中嵌套另一个select
例如有一张学生表
学生编号 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 |
作用:用于区分同一张表中不同的记录,作为唯一的标识符。保证实体完整性。主键自带非空、唯一约束。
作用:建立表之间的联系,保证参照完整性。
例如 A表中的某一个非主键列column1指向B表的主键列。
表示A表的非主键列column1的值必须来源于B表的主键列的值。
在A表中该column1列称之为A表的外键。
A表是从表,B表是主表。
添加数据的时候,应该先添加主表,再添加从表。
删除数据的时候,应该先删除从表,再删除主表。
表示在定义表的时候将外键关系一同显式设置。可以保证数据的完整性和一致性。
表示在定义表的时候不强行设置表和表之间的外键关系,但是表和表之间仍然有一个关联的列。
图书管理系统中图书类型和图书关系
图书类型:图书–>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
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 …
– 1. 查询所有图书的详细信息(图片+类型)
– 2. 查询"玄幻"类型的图书列表
– 3. 查询每种图书类型的图书数量/总价格/平均价格
– 显示格式: 类型编号,类型名,图书数量,总价格,平均价格
– 4. 查询每种图书类型的图书数量/总价格/平均价格,按照图书数量升序
– 显示格式: 类型编号,类型名,图书数量,总价格,平均价格
如果需要对多个表结果进行合并,可以使用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 …
示例:
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后执行
drop: drop table 表名
drop属于DDL定义语句,用于删除表结构,删除操作立即生效,原数据不放到rollback segment中,不能回滚,数据不可以回滚恢复。
truncate:truncate table 表名
truncate属于DDL定义语句,用于删除表所有数据,删除操作立即生效,原数据不放到rollback segment中,不能回滚,数据不可以回滚恢复。
delete:delete from 表 where 子句
delete属于DML操纵语句,用于删除表内数据,可以带where条件,删除的数据将存储在系统回滚段rollback segment中,需要的时候,数据可以回滚恢复。
物理外键:在定义表结构时显式声明外键关系,保证数据的完整性和一致性。添加和删除的需要注意主从表顺序。
逻辑外键:在定义表结构不显式声明外键关系,逻辑上我们知道表和表之间的关联列即可。
不管设置逻辑外键还是物理外键,SQL语句进行关联查询不需要做改变。
select * from 表 inner/ left/right/ join 表 on 关联关系
· now()函数返回的是当前时间的年月日时分秒
· curdate()函数返回的是年月日信息
· curtime()函数返回的是当前时间的时分秒信息
· now()与sysdate()类似,只不过now()在执行开始时就获取,而sysdate()可以在函数执行时动态获取。
· 对一个包含年月日时分秒日期格式化成年月日格式,可以使用DATE(time)函数
· 对一个包含年月日时分秒日期格式化成年格式,可以使用YEAR(time)函数
学生表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分为及格)