导图社区 数据库应用与开发期末极速版
这是一个关于数据库应用与开发期末极速版的思维导图,数据库(Database DB) 是长期存储在计算机内,有组织,可共享的大量数据的集合。
编辑于2024-01-07 09:48:04数据库应用与开发期末极速版
第1章.MySQL数据库概述
1.2数据库的基本概念
1.2.1信息与数据库
1.2.1.1数据和信息
数据(Data)是描述事物的符号记录,它有多种表现形式,可以是文本,图表,图形,图像,声音,语言,视频等
1.2.1.2数据库
数据库(Database DB)是长期存储在计算机内,有组织,可共享的大量数据的集合。数据库中的数据需要创建数据模型来描述,如网络,层次,关系模型。在数据库中的数据具有冗余度小,独立性高和易扩展的特点。
1.2.2结构化查询语言(SQL)—SQL查询语言的组成
(1)数据定义语言(Data Definition Language,DDL),语句包括create,alter,drop.在数据库中创建,修改或删除数据库对象,如表,索引,视图,存储过程,触发器,事件
(2)数据操作语言(Data Manipulation Language,DML),包括select,insert,update,delete用于查询,插入,修改,删除表中数据行
(3)数据控制语言(Data Control Language,DCL),包括grant,revoke,用于获得权限许可,撤销权限许可
1.2.3数据库管理系统(Database Management System,DBMS)
1.2.4数据库系统
1.2.4.1数据库系统的组成 数据库系统(Database System,DBS)通常由硬件,软件,数据库和用户组成,管理的对象是数据
1.3关系数据库理论
1.3.1概念模型及其表达方法
一对一(1:1)
一对多(1:M)
多对多(M:N)
E-R图参考
1.3.3.1关系运算
(1)选择.从行的角度进行运算
(2)投影.从列的角度进行运算
(3)连接.从两个表中选择满足条件的记录
1.3.3.2关系模型的规范化设计
(1)第一范式(1NF),确保每列的原子性,如果每列都是不可再分的最小数据单元,则满足第一范式
(2)第二范式(2NF),在第一范式的基础上,要求确保表中的每列都与主码(主键)相关
(3)第三范式(3NF),在第二范式的基础上,确保表中的每列都和主码(主键)直接相关,而不是间接相关。
第2章.MySQL语言基础
2.1.4.2系统变量
系统变量,名称前加两个@@
如select @@version,current_date;
修改系统变量的值,如将全局变量sort_buffer_size的值改为25000
set @@global.sort_buffer_size=25000;
会话变量,前面加一个@,随时定义和使用,会话结束就释放
2.2.1字符串类型
特殊类型enum,该类型的列只可以容纳所列值之一或为null set,该类型的列可以容纳一组值或为null
2.3MySQL的运算符和表达式
2.3.2比较运算符
!=或<> 不等于 between 区间比较 in/not in 属于/不属于 like/not like 模式匹配 regexp 常规表达式
regexp同样用于匹配字符串,但其使用的是正则表达式进行匹配 x1 regexp '匹配方式' 如果x1满足匹配方式,结果返回1,否则将返回0,一般用来与表中的字段值匹配,判断是否以指定字符开头,中间的字符或结尾,同时判定是否包含指定字符串
2.3.3逻辑运算符
&&或and 与 丨丨或or 或 not 非 xor 异或
2.4.4聚合函数
avg 返回组中数据的平均值,忽略null值 count 返回组中项目的数量 max 返回多个数据比较的最大值,忽略null值 min 返回多个数据比较的最小值,忽略null值 sum 返回组中数据的和,忽略null值
第3章.MySQL数据库的基本操作
3.1.3查看数据库
show database;
3.3用户数据库的创建和管理
3.3.2管理数据库
打开数据库
use databasename;
修改数据库
alter database databasename default Character set Charset_name Collate Collation_name;
显示数据库结构
Show Create Database Databasename;
删除数据库
drop Database if exists Databasename;
3.3.1创建数据库
create database if not exists databasename Character set Charset_name //指定数据库默认字符集 Collate Collation_name; //指定字符集的校对规则
第4章.表及数据完整性
4.1MySQL数据库表的管理
4.1.2创建数据库表
Create Table if not exists table_name;
例如: create table if not exists student ( studentno char (11) not null comment '学号', sname char (8) not null comment'姓名', sex enum('男','女') default '男' comment'性别', birthdate date not null comment'出生日期', entrance int(3) null comment'入学成绩', phone varchar(12) not null comment'电话', Email varchar(20) not null comment'电子信箱', primary key (studentno) );
4.1.3查看表
查看已经创建的表
show tables;
查看表的基本结构
describe table_name;
查看表的详细结构
show create table table_name;
4.1.4修改数据库表
alter table table_name
例.在student表的Email例后增加一列address alter table student add address varchar (30) not null after Email; (同理,在某一字段之前则将after改为first)
将表sc重命名为se_course alter table sc rename to se_course;
修改course表的type字段定义为.type enum('必修','选修')default'必修' alter table course modify type enum('必修','选修')default'必修';
删除student表的字段address alter table student drop address;
4.1.5删除数据库表
drop table table_name
4.2表的数据操作
4.2.1表记录的插入
insert into table_name values
【例4-12】利用insert 命令向表student中插入一行数据。 insert into student (studentno, sname, sex,birthdate, entrance, phone, Email) values('18122210009','许东山‘,'男','1999/11/5’,789,'13623456778','gwe@163.com');
【例4-13】利用insert命令向表student中插人多行数据。 insert into student values ('18122221324','何白露‘,'女','2000/12/4','879','13178978999','heyy@sina.com'), ('18125111109','敬横江‘,‘男','2000/3/1','789','15678945623','jing@sina.com');
使用set字句插入数据 使用set字句插入数据时可以不按列顺序插入数据,对允许空值的列可以不插入
【例4-18】 利用set子句向se_course表插入数据 insert into se_course set studentno='19120000111',courseno ='c01236',teacherno ='t01237';
4.2.2表记录的修改
update table_name set [where语句] set子句:根据where子句中指定的条件,对符合条件的数据行进行修改 若语句中不设定where子句,则更新所有行
【例4-20】 将学号为18137221508的学生的课程号为c08106的平时成绩daily修改为80分。 update score set daily=80 where studentno ='18137221508'&& courseno ='c08106';
【例4-21】将课程student01表中低于700分的入学成绩增加8% update student01 set entrance=entrance*1.08 where entrance<700;
4.2.3表记录的删除
delete [ignore] from table_name //ignore.忽略删除错误,提高运行速度
【例4-22】删除student01表中入学成绩低于750分的记录 delete from student01 where entrance<750;
【例4-23】删除student01表中入学成绩最低的2行记录 delete from student01 order by entrance limit 2;
4.4表的数据完整性
非空约束
null not null
主键约束
primary key
【例4-25]修改表student02的主键,删除原来主键sname,增加studentno为主键 alter table studento2 add primary key (sname); //增加主键sname alter table studento2 drop primary key; //删除主键 alter table student02 add primary key (studentno); //增加主键studentno
外键约束
表与表之间的父子关系 例如,字段student是表score的属性,且依赖于表student的主键studentno,那么,称表student为父表,score为子表。通常将studentno设为表score的外键
constraint foreign_key_name foreign key() references table_name() [on delete] [on update]
【例4-26】用alter table 语句在数据库teaching中为表score 添加外键约束 alter table score add constraint fk_st_score //constraint 定义外键约束和约束名 foreign key (studentno) references student (studentno);
【例4-27】在mysqltest 数据库中参照 score表创建scorel表,其中studentno作为外键,参照student02表中的studentno字段。 create table if not exists scorel (studentno char(11) not null, courseno char(6) not null, daily float(3,1) default 0, final float(3,1) default 0, primary key (studentno, courseno), foreign key(studentno), references student02(studentno) on update cascade on delete cascade);
检查约束
check
【例4-28】在mysqltest数据库中,对student02表的birthdate列添加check约束,要求出生日期必须大于1999年12月31日。 alter table student02 add constraint ch_ stu_birth check(birthdate>'1999-12-31');
唯一性约束
unique 一个数据表只能创建一个主键 但可以有若干unique约束
【例4-29]在mysqltest数据库中,对student02表的Email列添加唯一约束。 alter table studento2 add unique (Email);
第5章.数据检索
5.1基本查询语句
select [distinct] selection list from table_source [where] [group by] [having] [order by丨asc,desc] [limit]
说明: distinct.取消结果集中的重复行 group by.分组 having.应用于分组集的附加条件,通常与group by一起使用 order by.对查询结果进行排序.asc升序,desc降序 limit.限制查询的输出行,通常与order by一起使用
5.2单表查询
5.2.2使用where子句过滤结果集
1.为字段起别名.as
2.带in关键字的查询 in可以判断某个字段的值是否在指定的集合中
3.带between and的范围查询 X between 10 and 27相当于X>=10 and X<=27
4.带like的字符匹配查询 % 可以匹配一个或多个字符 _ 只匹配一个字符
所有姓何的学生 sname like '何%'; 所有姓何且姓名只有两个字的学生 sname like '何_';
5.用is null关键字查询空值
6.带and的多条件查询
7.带or的多条件查询
5.2.3使用order by子句对结果集排序
【例5-12】在student表中查询高于850分的学生学号、姓名和入学成绩,并按照入学成绩的降序排列。 select studentno 学号,sname 姓名,entrance入学成绩 from student where entrance> 850 order by entrance desc;
【例5-13】在score表中查询总评成绩大于90分的学生的学号、课程号和总评成绩,并先按照课程号的升序、再按照总评成绩的降序排列。总评成绩计算公式如下: 总评成绩=daily*0.2+finalx0.8 select courseno 课程号,daily *0.2+ final*0.8as'总评',studentno学号 from score where daily * 0.2 + final* 0.8>90 -> order by courseno, daily * 0.2+ final * 0.8 desc;
5.2.4group by子句和having子句的使用
2.group by关键字与group_concat()函数一起使用 可以将组中每个字段都显示出来
【例5-15】 使用group by关键字和group_concat()函数对 score 表中的studentno字段进行分组查询。可以查看选学该门课程的学生学号。 select courseno 课程号,group_concat(studentno)选课学生学号 from score -> group by courseno ;
3.group by关键与having一起使用 只有满足having指定的搜索条件的行才用来构建结果集
5.2.5用limit限制结果集的数量
5.3聚合函数查询
5.3.1 count()函数 返回表中记录总数
5.3.2 sum()函数和avg()函数 sum.求和 avg.求平均值
5.3.3max()函数和min()函数 max.求最大值 min.求最小值
5.4多表连接
5.4.1内连接 Inner Join
【例5-23】查询选修课程号为c05109的学生的学号、姓名和期末成绩。 select student. studentno, sname, final from student inner join score on student. studentno= score. studentno where score. courseno = 'c05109';
5.4.2外连接 Outer Join
1.左外连接left join
【例5-24】在mysqltest 数据库中利用左外连接方式查询学生的学号、姓名、平时成绩和期末成绩 select student02. studentno, sname, daily, final from student02 left join scorel on student02. studentno = scorel. studentno;
2.右外连接right join
【例5-25】利用右外连接方式查询教师的排课情况 select teacher. teacherno, tname, major, courseno from teacher right join teach_course on teacher. teacherno = teach_course. teacherno;
5.4.3交叉连接cross join
【例5-26】 显示student 表和score表的笛卡儿积 select student. studentno, sname, score.* from student cross join score;
5.4.4连接多个表
【例5-27】查询18级学生的学号、姓名、课程名、期末成绩及学分 select student. studentno, sname, cname,final, round(period/16,1) from score join student on student. studentno = score. studentno join course on score. courseno = course. courseno -> where substring(student. studentno,1,2)='18';
5.5子查询
5.5.1利用子查询做表达式
【例5-29】 查询学号为18125121107的学生的入学成绩、所有学生的平均入学成绩及该学生成绩与所有学生的平均人学成绩的差 select studentno, sname, entrance, (select avg(entrance)from student)平均成绩, entrance-(select avg(entrance) from student)分差 from student where studentno ='18125121107';
5.5.2利用子查询做派生表
例5-30】查询期末成绩高于85分、总评成绩高于90分的学生的学号,课程号和总评成绩 select TT.studentno学号,TT.courseno课程号, TT.final*0.8+TT.daily※0.2总评 from (select * from score where final>85) as TT where TT.final * 0.8 + TT.daily*0.2>90;
5.5.3where 子句中的子查询
1.带比较运算符
【例5-31】查询期末成绩比选修该课程平均期末成绩低的学生的学号、课程号和期末成绩 select studentno, courseno, final from score as a where final <(select avg(final) from score as b where a. courseno = b. courseno group by courseno);
2.带in关键字
【例5-32】获取期末成绩中含有高于93分的学生的学号、姓名、电话和 Email。 select studentno, sname, phone, Email from student where studentno in ( select studentno from score where final>93);
3.带exists关键字
【例5-33】查询student 表中是否存在2001年12月12日以后出生的学生,如果存在,输出学生的学号、姓名、生日和电话。 select studentno, sname, birthdate, phone from student where exists( select* from student where birthdate <'2001-12-12');
4.对比较运算进行限制
【例5-34】 查找score 表中所有比c05109课程期末成绩都高的学号、姓名、电话和期末成绩。 select student, studentno, sname, phone, final from score inner join student on score. studentno = student.studentno where final >all (select final from score where courseno ='c05109');
5.5.4利用子查询插入,更新与删除数据
插入
【例5-35】将student表中2001年以后出生的学生记录添加到student02表中。 insert into mysqltest. student02 (select * from student where birthdate>='2001-12-31');
更新
【例5-36】将student 表中入学成绩低于800分的所有学生的期末成绩增加5%。 update score set final= final* 1.05 -where studentno in (select studentno from student where entrance <800);
5.6正则表达式模糊查询where字段名regexp‘操作符·
1.查询以特定字符或字符串开头的记录
【例5-37】查询student 表中姓“赵”的学生的部分信息。 select studentno, sname, birthdate, phone from student ->where sname regexp'^赵';
2.查询以特定字符或字符串结尾的记录
【例5-38】查询student表中学生电话号码尾数为5的学生部分信息。 select studentno, sname, phone, Email from student where phone regexp '5$';
3.用符号“.”来替代字符串中的任意一个字符
【例5-39】 要实现查询学生姓名sname字段中以“赵”开头,以“江”结束,中间包含两个字符的学生信息,可以通过正则表达式查询来实现,其中正则表达式中“^”表示字符串的开始位置,$表示字符串的结束位置,表示除“\n”以外的任何单个字符(此例中汉字按两个字符计算)。
select studentno, sname, phone from student where sname regexp"^赵..江今'
4.匹配指定字符串
【例5-40】查询学生电话号码出现131或132数字的学生信息。 select studentno, sname, phone, Email from student where phone regexp '131|132'; //如果指定多个字符串,需要用符号“|”隔开。只要匹配这些字符串中的任意一个即可。