MySQL数据库学习day5

回顾

连接查询:多张表连接到一起,不管记录数如何,字段数一定会增加

分类:内连接,外连接,自然连接和交叉连接

交叉连接:cross join(笛卡尔积)

内连接:inner join,左右两张表中有连接条件匹配(不匹配的忽略)

外连接:outer(left/right) join,主表的记录一定会存在,匹配了就保留副表字段数据,没匹配到副表字段置空

自然连接:natural join,自动匹配(相同的字段名),using关键字

PHP操作mysql:

PHP充当客户端:开启mysql扩展

连接认证:mysql_connect

发送SQL获取结果:mysql_query

解析结果集:mysql_fetch系统

释放资源:mysql_free_result和mysql_close

错误处理:mysql_errno和mysql_error

外键

外键:foreign key,外面的键(键不在自己表中):如果一张表中有一个字段(非主键)指向另外一个表的主键那么该字段称之为外键

增加外键

外键可以在创建表的时候或者创建表之后增加(但是要考虑数据的问题)

一张表可以有多个外键

创建表的时候增加外键:在所有的表字段之后,使用foreign key(外键字段) references 外部表(主键字段)

在新增表之后增加外键:修改表结构

alter table 表名 add [constraint 外键名字] foreign key(外键字段) references 父表(主键字段);

修改外键&&删除外键

外键不可修改,只能先删除后新增

删除外键语法

alter table 表名 drop foreign key 外键名; -- 一张表中可以有多个外键,但是名字不能相同

外键作用

外键默认的作用有两点:一个对父表,一个对子表(外键字段所在的表)

对子表约束:子表数据进行写操作(新增和更新)的时候,如果对应的外键字段在父表中找不到对应的匹配,那么会操作失败(约束子表数据操作)

对父表约束:父表数据进行写操作(删除和修改:都必须涉及到主键本身),如果对应的主键在子表中已经被数据引用,那么就不允许操作

外键条件

  1. 外键要存在:首先必须保证表的存储引擎是innodb(默认的存储引擎):如果不是innodb存储引擎,那么外键可以创建成功,但是没有约束效果

  2. 外键字段的字段类型(列类型)必须与父表的主键类型完全一致

  3. 一张表中的外键名字不能重复

  4. 增加外键的字段(数据已存在),必须保证数据与父表主键要求对应

外键约束

所谓外键约束:就是外键的作用

之前所讲的外键作用:是默认的作用;其实可以通过对外键的需求,进行定制操作

外键约束有三种约束模式:都是针对父表的约束

district:严格模式(默认的),父表不能删除或者更新一个已经被子表数据引用的记录

cascade:级联模式:父表的操作,对应子表关联的数据也跟着被更新

set null:置空模式:父表的操作之后,子表对应的数据(外键字段)被置空

通常的一个合理做法(约束模式):删除的时候子表置空,更新的时候子表级联操作

指定模式的语法

foreign key(外键字段) references 父表(主键字段) on delete set null on update cascade

更新操作:级联更新

删除操作:置空

删除置空的前提条件:外键字段允许为空(如果不满足条件,外键无法创建)

外键虽然很强大,能够进行各种约束:但是对于PHP来讲,外键的约束降低了PHP对数据的可控性:通常在实际开发中,很少使用外键来处理

联合查询

联合查询:将多次查询(select语句),在记录上进行拼接(字段不会增加)

基本语法

多条select语句构成:每一条select语句获取的字段必须严格一致(但是字段类型无关)

select 语句1

union

select 语句2

union选项:与select选项一样有两个:

all:保留所有(不管重复)

district:去重(整个重复) 默认的

联合查询只要求字段一样,跟数据类型无关

意义

联合查询的意义分为两种:

  1. 查询同一张表,但是需求不同:如查询学生信息,男生身高升序,女生身高降序

  2. 多表查询:多张表的结构是完全一样的,保存的数据(结构)也是一样的

order by使用

在联合查询中:order by不能直接使用,需要对查询语句使用括号才行

若要order by生效,必须搭配limit:limit使用限定的最大数即可

子查询

子查询:sub query,查询是在某个查询结果之上进行的(一条select语句内部包含了另外一条select语句)

子查询分类

子查询有两种分类方式:按位置分类,按结果分类

按位置分类:子查询(select语句)在外部查询(select语句)中出现的位置

from子查询:子查询跟在from之后

where子查询:子查询出现在where条件中

exists子查询:子查询出现在exists里面

按结果分类:根据子查询得到的数据进行分类(理论上讲任何一个查询得到的结果都可以理解为二维表)

标量子查询:子查询的结果是一行一列

列子查询:子查询的结果是一列多行

行子查询:子查询的结果是多行一列(多行多列)

    上面几个出现的位置都是在where之后

表子查询:子查询得到的结果是多行多列(出现的位置是在from之后)

标量子查询

需求:知道班级名字为PHP0710,想获取该班的所有学生

  1. 确定数据源:获取所有学生

select * from my_student where c_id = ?;

  1. 获取班级id:可以通过班级名字确定

select id from my_class where c_name = 'PHP0710'; -- id一定只有一个值(一行一列)

标量子查询实现

列子查询

需求:查询所有在读班级的学生(班级表中存在的班级)

  1. 确定数据源:学生

select * from my_student where c_id in (?);

  1. 确定有效的班级的id:所有班级id

select id from my_class;

列子查询

列子查询返回的结果会比较多:一列多行,需要使用in作为条件匹配:其实在mysql中还有几个类似的条件:any,some,all

=any <===> in; -- 其中一个即可

any <===> some; -- any跟some是一样

all <===> 全部

肯定结果

否定结果

行子查询

行子查询:返回的结果可以是多行多列(一行多列)

需求:要求查询整个学生中,年龄最大且身高是最高的学生

  1. 确定数据源

select * from my_student where age = ? and height = ?;

  1. 确定最大的年龄和最高的身高

select max(age), max(height) from my_student;

行子查询:需要构造行元素:行元素由多个字段构成

表子查询

表子查询:子查询返回的结果是多行多列的二维表,子查询返回的结果是当做二维表来使用

需求:找出每个班中最高的一个学生

  1. 确定数据源:先将学生按照身高进行降序排序

select * from my_student order by height desc;

  1. 从每个班选出第一个学生
    select * from (数据源) group by c_id; -- 每班选出第一个学生

表子查询:from子查询:得到的结果作为from的数据源

exists子查询

exists:是否存在的意思,exists子查询就是用来判断某些条件是否满足(跨表),exists是接在where之后:exists返回的结果只有0和1

需求:查询所有学生:前提条件是班级存在

  1. 确定数据源

select * from my_student where ?;

  1. 确定条件是否满足

exists (select * from my_class); -- 是否成立

exists子查询

视图

视图:view,是一种结构(有行有列)但是没结果(结构中不存放真实数据)的虚拟表,虚拟表的结构来源不是自己定义,而是从对应的基表中产生(视图的数据来源)

创建视图

基本语法

create view 视图名字 as select语句; -- select语句可以是普通查询,也可以是连接查询,可以是联合查询,可以是子查询

创建单表视图:基表只有一个

创建多表视图:基表来源至少两个

查看视图

查看视图:查看视图的结构(show tables; desc 以及show create table)

视图比表还是有一个关键字的区别:view,查看“表(视图)”的创建语句的时候可以使用view关键字

视图一旦创建:系统会在视图对应的数据库文件夹下创建一个对应的结构文件:frm文件

使用视图

使用视图主要是为了查询:将视图当做表一样查询即可

视图的执行:其实本质就是执行封装的select语句

修改视图

视图本身不可修改,但是视图的来源是可以修改的

修改视图:修改视图本身的来源(select语句)

alter view 视图名字 as 新的select语句

删除视图

drop view 视图名字;

视图意义

  1. 视图可以节省SQL语句:将一条复杂的查询语句使用视图进行保存:以后可以直接对视图进行操作

  2. 数据安全:视图操作主要是针对查询的,如果对视图结构进行处理(删除),不会影响表数据(相对安全)

  3. 视图往往是在大项目中使用,而且是多系统使用:可以对外提供有用的数据,但是隐藏关键(无用)的数据:数据安全

  4. 视图可以对外提供友好型:不同的视图提供不同的数据,对外好像专门设计

  5. 视图可以更好(容易)的进行权限控制

视图数据操作

视图是的确可以进行数据写操作的:但是有很多限制

将数据直接在视图上进行操作

新增数据

数据新增就是直接对视图进行数据新增

  1. 多表视图不能新增数据
  1. 可以向单表视图插入数据:但是视图中包含的字段必须有基表所有不能为空(或者没有默认值)字段
  1. 视图是可以向基表中插入数据
删除数据

多表视图不能删除数据

单表视图可以删除数据

更新数据

理论上不论单表视图还是多表视图都可以更新数据

更新限制:with check option,如果对视图在新增的时候,限定了某个字段有限制:那么在对视图进行数据更新操作时,系统会进行验证:要保证更新之后,数据
依然可以被视图查询出来,否则不让更新

视图算法

视图算法:系统对视图以及外部查询视图的select语句的一种解析方式

视图算法分为三种:

undefined:未定义的(默认的),这不是一种实际使用算法,是一种推卸责任的算法:告诉系统,视图没有定义算法,系统看着办

temptable:临时表算法:系统应该先执行视图的select语句,后执行外部查询语句

merge:合并算法:系统应该先将视图对应的select语句与外部查询视图的select语句进行合并,然后执行(效率高:常态)

算法指定:在创建视图的时候

create algorithm = 指定算法 view 视图名字 as select语句;

视图算法选择:如果视图的select语句中会包含一个查询子句(五子句),而且很有可能顺序比外部的查询语句要靠后,一定要使用算法temptable,其他情况
可以不用指定(使用默认即可)

数据备份与还原

备份:将当前已有的数据或记录保留

还原:将已经保留的数据恢复到对应的表中

为什么要做备份还原?

  1. 防止数据丢失:被盗,误操作

  2. 保护数据记录

数据备份还原的方式有很多种:数据表备份,单表数据备份,SQL备份,增量备份

数据表备份

不需要通过SQL来备份:直接进入到数据库文件夹复制对应的表结构以及数据文件,以后还原的时候,直接将备份的内容放进去即可

数据表备份有前提条件:根据不同的存储引擎有不同的区别

存储引擎:mysql进行数据存储的方式:主要是两种innodb和myisam(免费)

对比myisam和innodb:数据存储方式

innodb:只有表结构,数据全部存储到ibdata1文件中

myisam:表,数据和索引全部单独分开存储

这种文件备份通常适用于myisam存储引擎:直接复制三个文件即可,然后放到对应的数据库下既可以使用

单表数据备份

每次只能备份一张表,只能备份数据(表结构不能备份)

通常的使用:将表中的数据进行导出文件

备份:从表中选出一部分数据保存到外部文件中(outfile)

select */字段列表 into outfile 文件所在路径 from 数据源; -- 前提:外部文件不存在

高级备份:自己指定字段和行的处理方式

select */字段列表 into outfile 文件所在路径 fields字段处理 lines行处理 from 数据源;

fields:字段处理

enclosed by:字段用什么内容包裹,默认是''字符串

terminated by:字段以什么结束,默认是"\t",tab键

escaped by:特殊符号用什么方式处理,默认是"\\",使用反斜杠转义

lines:行处理

starting by:每行以什么开始,默认是'',空字符串

terminated by:每行以什么结束,默认是"\r\n",换行符

数据还原:将一个在外部保存的数据重新恢复到表中(如果表结构不存在,那么sorry)

load data infile 文件所在路径 into table 表名[(字段列表)] fields 字段处理 lines 行处理; -- 怎么备份的怎么还原

SQL备份

备份的是SQL语句:系统会对表结构以及数据进行处理,变成对应的SQL语句,然后进行备份:还原的时候只要执行SQL指令即可(主要就是针对表结构)

备份:mysql没有提供备份指令:需要利用mysql提供的软件:mysqldump.exe

mysqldump.exe 也是一种客户端,需要操作服务器:必须连接认证

mysqldump/mysqldump.exe -hPup 数据库名字 [数据表名字1[数据表名字2...]] > 外部文件目录(建议使用.sql)

单表备份

整库备份

mysqldump/mysqldump.exe -hPup 数据库名字 > 外部文件目录(建议使用.sql)

SQL还原数据:两种方式还原

方案1:使用mysql.exe客户端还原

mysql.exe/mysql -hPup 数据库名字 < 备份文件目录

方案2:使用SQL指令还原

source 备份文件所在路径;

SQL备份优缺点:

1.优点:可以备份结构

2.缺点:会浪费空间(会额外的增加SQL指令)

增量备份

不是针对数据或者SQL指令进行备份:是针对mysql服务器的日志文件进行备份

增量备份:指定时间段开始备份,备份数据不会重复,而且所有的操作都会备份(大项目都用增量备份)

day 6

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,233评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,013评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,030评论 0 241
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,827评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,221评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,542评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,814评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,513评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,225评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,497评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,998评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,342评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,986评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,055评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,812评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,560评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,461评论 2 266

推荐阅读更多精彩内容