六、MySQL的操作使用 把3个rpm包放在linux任意路径之后,在相应路径执行以下命令: rpm -ivh mysql-libs-5.1.73-8.el6_8.i686.rpml rpm -ivh mysql-server-5.1.73-8.el6_8.i686.rpm --force--nodepsrpm -ivh mysql-5.1.73-8.el6_8.i686.rpm --force –nodeps 以下两种安装方法只有使用一种就可以了在线安装: yum install mysql -y ===>安装MySQL的客户端 yum install mysql-server -y ===》安装MySQL的服务端 离线安装: 通过rpm命令进行安装mysql的rpm包 rpm -ivh +对应的rpm包文件 -i:安装软件包 v:可视化,可以提供更多的安装信息h:显示安装进度 rpm -qa lgrep 'mysql' rpm -qa:显示当前Linux系统已经安装的第三方工具 启动MySQL: file:///C:/Users/Zhang/AppData/Local/Temp/msohtmlclip1/01/clip_image002.jpg MySQL正在运行: file:///C:/Users/Zhang/AppData/Local/Temp/msohtmlclip1/01/clip_image004.jpg serivce mysqld start ==>启动mysqld服务 serivce mysqld stop ==>停止mysqld服务serivcemysqld status ==>查看mysqld的状态serivcemysqld restart ==>重启mysqld的服务 file:///C:/Users/Zhang/AppData/Local/Temp/msohtmlclip1/01/clip_image006.jpg file:///C:/Users/Zhang/AppData/Local/Temp/msohtmlclip1/01/clip_image008.jpg file:///C:/Users/Zhang/AppData/Local/Temp/msohtmlclip1/01/clip_image010.jpg 第一次登陆是不需要输入密码: mysql -uroot -p file:///C:/Users/Zhang/AppData/Local/Temp/msohtmlclip1/01/clip_image012.jpg 退出三种方式:quit、exit、Ctrl+cl file:///C:/Users/Zhang/AppData/Local/Temp/msohtmlclip1/01/clip_image014.jpg 设置mysql数据库的登陆密码(要在Linux的界面执行) ∶ mysqladmin -uroot password"123456"设置密码后的两种登陆方式: 明文密码:mysql -uroot -p123456 密文密码:mysql -uroot -p 加回车输入密码 file:///C:/Users/Zhang/AppData/Local/Temp/msohtmlclip1/01/clip_image016.jpg file:///C:/Users/Zhang/AppData/Local/Temp/msohtmlclip1/01/clip_image018.jpg SQL语句---只能在mysql等数据库操作系统中执行的mysql> 每一条SQL语句都是以英文的‘;′结尾的 show databases;==>查看所有的数据库use +库名;==》进入对应的库中进行操作 file:///C:/Users/Zhang/AppData/Local/Temp/msohtmlclip1/01/clip_image020.jpg use+库名;==》进入对应的库中进行操作 show tables;==>查看对应库中所有的表 file:///C:/Users/Zhang/AppData/Local/Temp/msohtmlclip1/01/clip_image022.jpg file:///C:/Users/Zhang/AppData/Local/Temp/msohtmlclip1/01/clip_image024.jpg create database +库名;==》创建xxx库(数据库) file:///C:/Users/Zhang/AppData/Local/Temp/msohtmlclip1/01/clip_image026.jpg select database(); ==>查看当前操作哪个库 create table 表名(字段名1 字段属性,字段名2 字段属性,......); ===>创建表,命名为xx,里面包含xx1字段属性是xxx file:///C:/Users/Zhang/AppData/Local/Temp/msohtmlclip1/01/clip_image028.jpg 常见的数据类型: int:整型,整数数字 只能保存4个字节的数字-2^31~+2^31(-2147483647~2147483647) 0000 0000 0000 0000 0000 0000 0000 0000 当需要保存超过10位数的整数需要使用bigint bigint:大整型,整数数字,可以保存最大8个字节的数字 浮点数: float:保存小数 4个字节 double:保存小数 8个字节 字符串: char:定长字符串,固定占255个字节,性能会更好些,但是不节省资源 varchar:可变长字符串,占0~2^16个字节,性能稍微差,但是节省资源 日期: date 保存日期,固定格式 YYYY-MM-DD 常见的约束: primary key:主键约束,特点:表中主键字段的值不能为空,主键字段的值不能重复(例如上学时,班上的同学姓名可能重复,但是学号是唯一而且必要的) not null:非空约束(必须要填的) default:默认值约束(字段) auto_increment:自增长约束,只能在主键字段使用,而且只能是数据类型为整型的去使用,例如不输入id时,直接跟着原来最大的id+1 desc +表名; ==》查看表结构 file:///C:/Users/Zhang/AppData/Local/Temp/msohtmlclip1/01/clip_image030.jpg 修改表结构的操作:alter table alter table test renametest1; =修改表 test表重命名为test1 alter table test1 rename test; =修改表 test1表 重命名为test file:///C:/Users/Zhang/AppData/Local/Temp/msohtmlclip1/01/clip_image032.jpg alter table test change id sid int(4); ==修改表 test表改变 id字段 为sid字段,属性为int(4),并取消自增长约束 file:///C:/Users/Zhang/AppData/Local/Temp/msohtmlclip1/01/clip_image034.jpg alter table test change sid sid int(4) auto_increment; ==》给sid字段添加自增长约束 file:///C:/Users/Zhang/AppData/Local/Temp/msohtmlclip1/01/clip_image036.jpg alter table test add class int(4); ==修改表 test表增加class字段,属性为int(5)--默认增加在最后 file:///C:/Users/Zhang/AppData/Local/Temp/msohtmlclip1/01/clip_image038.jpg alter table test add sex varchar(5) first;修改表 test表增加sex字段,属性为varchar(5) 放在第一位(first) file:///C:/Users/Zhang/AppData/Local/Temp/msohtmlclip1/01/clip_image040.jpg alter table test add age int(4) after name; =修改表 test表增加age字段,属性为int(4)放在name字段后面 file:///C:/Users/Zhang/AppData/Local/Temp/msohtmlclip1/01/clip_image042.jpg alter table test drop sex; ==修改表 test表 丢弃sex字段 file:///C:/Users/Zhang/AppData/Local/Temp/msohtmlclip1/01/clip_image044.jpg alter table test drop age,drop class; ==修改表 test表丢弃age字段,丢弃class字段 file:///C:/Users/Zhang/AppData/Local/Temp/msohtmlclip1/01/clip_image046.jpg alter table test add(age int(4),class int(4));修改表 test表增加 age字段和class字段 file:///C:/Users/Zhang/AppData/Local/Temp/msohtmlclip1/01/clip_image048.jpg alter table test change age age int(4) after name; ==修改表 test表改变age字段为age字段属性为int(4) 放在name字段后面 file:///C:/Users/Zhang/AppData/Local/Temp/msohtmlclip1/01/clip_image050.jpg alter table test modify class bigint(8) after sid; ==修改表 test表修改class字段属性为bigint(8) 放在sid字段后面 file:///C:/Users/Zhang/AppData/Local/Temp/msohtmlclip1/01/clip_image052.jpg change和modify的区别: 两者都是可以改变表结构,但是使用change时字段是要写两次的,modify则只要写一次就行。change可以对字段名进行重命名,modify则不行 删除主键 因为一张表中最多只要一个主键,使用可以直接通过drop primary key的方式进行删除 mysql> alter table test drop primary key; ERROR 1075 (42000): Incorrect table definition; there can beonly one auto column and it must be defined as a key 直接执行删除主键时,报错,因为这个主键字段还有自增长约束,自增长约束必须依赖主键约束,所以删除主键之前要先删除自增长约束 file:///C:/Users/Zhang/AppData/Local/Temp/msohtmlclip1/01/clip_image054.jpg 1,先删自增长:alter table test modify sid int(4); file:///C:/Users/Zhang/AppData/Local/Temp/msohtmlclip1/01/clip_image056.jpg 2,再删主键约束:alter table test drop primary key; file:///C:/Users/Zhang/AppData/Local/Temp/msohtmlclip1/01/clip_image058.jpg 添加主键: 方式一: alter table test add primary key(sid); 方式二: alter table test change sid sid int(4) primary key; 增删改查 查--select select * from 表; ==>查询 所有字段的值 来源 那张表 file:///C:/Users/Zhang/AppData/Local/Temp/msohtmlclip1/01/clip_image060.jpg 增---insert into 方式一:要求表的字段不多,对表结构要熟悉 1,插入的值的数量必须要跟字段数量一致 2,值的格式必须要一一对应上字段要求的格式 insert into 表名 values (字段1的值,字段2的值,字段3的值,....),(字段1的值,字段2的值,字段3的值,....) file:///C:/Users/Zhang/AppData/Local/Temp/msohtmlclip1/01/clip_image062.jpg 方式二:对指定字段插入数据 insert into 表名(字段4,字段2,字段1) values(字段4的值,字段2的值,字段1的值),(字段4的值,字段2的值,字段1的值); file:///C:/Users/Zhang/AppData/Local/Temp/msohtmlclip1/01/clip_image064.jpg 字符串和日期类型的数据插入必须要加英文的成对引号 file:///C:/Users/Zhang/AppData/Local/Temp/msohtmlclip1/01/clip_image066.jpg NULL和 ' ':NULL是完全的不占系统空间,' '是占系统一个字节0的空间 删除表:drop table +表名; ==》删除表 xx表 删除库:drop database +库名 ==》删除库 xx库 查询数据库test表的数据: 查询---select select *from表;==查询所有字段(*)的值来自于xx表; select sid,name,class,age from test; file:///C:/Users/Zhang/AppData/Local/Temp/msohtmlclip1/01/clip_image068.jpg 条件查询先接where file:///C:/Users/Zhang/AppData/Local/Temp/msohtmlclip1/01/clip_image070.jpg select *from emp where name='李四'; file:///C:/Users/Zhang/AppData/Local/Temp/msohtmlclip1/01/clip_image072.jpg 不等于!=<>(null是不参与等于或者不等于,大小匹配的) select name,incoming from emp where dept2!=101;select name, dept2 from emp where dept2 <> "101"; file:///C:/Users/Zhang/AppData/Local/Temp/msohtmlclip1/01/clip_image074.jpg 多条件查询 and条件:要求两边同时满足 select *from emp where dept2=101 andincoming=3500; file:///C:/Users/Zhang/AppData/Local/Temp/msohtmlclip1/01/clip_image076.jpg or条件:以or为分界,两边只要满足一个 select *from emp where dept2=101 orincoming=7500; file:///C:/Users/Zhang/AppData/Local/Temp/msohtmlclip1/01/clip_image078.jpg null值的匹配 select *from test where score is null; select * from test where score is not null; file:///C:/Users/Zhang/AppData/Local/Temp/msohtmlclip1/01/clip_image080.jpg 大于小于的匹配 select *from test where age > 19 and age <=28; select *from test where age between 19 and 28; file:///C:/Users/Zhang/AppData/Local/Temp/msohtmlclip1/01/clip_image082.jpg in与not in(与or有点类似) select *from test where age in (18,20,28); file:///C:/Users/Zhang/AppData/Local/Temp/msohtmlclip1/01/clip_image084.jpg select *from test where age not in (18,20,28); file:///C:/Users/Zhang/AppData/Local/Temp/msohtmlclip1/01/clip_image086.jpg linux的模糊匹配符: ‘*’‘?’ 但是在mysql中*和?有其他作用 mysql中的模糊匹配符: ‘%’‘_’ '%' :匹配0个或者多个字符 ‘_’:匹配1个字符 file:///C:/Users/Zhang/AppData/Local/Temp/msohtmlclip1/01/clip_image088.jpg select * from test where name like 'xiao_'; select * from test where time like '2022%' select *from test where age like '2%"; file:///C:/Users/Zhang/AppData/Local/Temp/msohtmlclip1/01/clip_image090.jpg 查询限定的数据---分页查询limit,只能放在最后面 select *from test limit 0,3; file:///C:/Users/Zhang/AppData/Local/Temp/msohtmlclip1/01/clip_image092.jpg select *from test where age is not null limit 0,4; 错误的: select *from test limit 0,4 where age=28; file:///C:/Users/Zhang/AppData/Local/Temp/msohtmlclip1/01/clip_image094.jpg 排序order by 如果结合limit使用,那么limit也是放在后面 asc是升序,desc是降序 select *from testorder by age asc; file:///C:/Users/Zhang/AppData/Local/Temp/msohtmlclip1/01/clip_image096.jpg select *from testorder by time desc; file:///C:/Users/Zhang/AppData/Local/Temp/msohtmlclip1/01/clip_image098.jpg 先过滤后排序 file:///C:/Users/Zhang/AppData/Local/Temp/msohtmlclip1/01/clip_image100.jpg select *from testwhere time is not null order by time asc limit 3; ==》先做where条件过滤,在做order by排序,最后做limit限定查询 file:///C:/Users/Zhang/AppData/Local/Temp/msohtmlclip1/01/clip_image102.jpg select *from testorder by phone desc,age asc; ==》 对多个字段同时排序,谁在前谁优先级更高 file:///C:/Users/Zhang/AppData/Local/Temp/msohtmlclip1/01/clip_image104.jpg 分组group by 注意: 1)分组查询要查询指定的字段,对什么进行分组就查询什么字段。因为分组之后,只有分组字段可以正常匹配,其他非分组字殿是随机出现(一般是表中第一条) file:///C:/Users/Zhang/AppData/Local/Temp/msohtmlclip1/01/clip_image106.jpg file:///C:/Users/Zhang/AppData/Local/Temp/msohtmlclip1/01/clip_image108.jpg 2,使用group by分组之后,进行条件过滤,是不能使用where,where条件要写在groupby之前 3,如果希望在group by分组之后进行条件过滤,则使用having (作用类似where,但是只能用在group by之后 1, group by分组一般是结合聚合函数使用,where条件是不能接聚合函数,having才可以接聚合函数 selectdept2 from emp group by dept2; file:///C:/Users/Zhang/AppData/Local/Temp/msohtmlclip1/01/clip_image110.jpg select dept2,avg(incoming) from emp group bydept2; select dept2,avg(incoming) from emp group bydept2 having avg(incoming)>6000; file:///C:/Users/Zhang/AppData/Local/Temp/msohtmlclip1/01/clip_image112.jpg select dept2,avg(incoming) from emp group bydept2 having dept2!=103; select dept2,avg(incoming) from emp wheredept2!=103 group by dept2; file:///C:/Users/Zhang/AppData/Local/Temp/msohtmlclip1/01/clip_image114.jpg 聚合函数: count()统计 select count(*) from表; ==》统计表中行数 select count(1) from表; ==》统计表中行数 select count(字段名) from表; ==》表中对应字段有多少条数据 file:///C:/Users/Zhang/AppData/Local/Temp/msohtmlclip1/01/clip_image116.jpg sum()求和 select sum(incoming) from emp; ==》 对表中某个字段进行求和,求emp表的总收入 avg() file:///C:/Users/Zhang/AppData/Local/Temp/msohtmlclip1/01/clip_image118.jpg select avg(incoming) from emp; max()最大值 min()最小值 file:///C:/Users/Zhang/AppData/Local/Temp/msohtmlclip1/01/clip_image120.jpg SQL中是可以进行四则运算的:(as 可以对字段进行取别名,目的让结果输出的字段名不那么长) select (max(incoming)-min(incoming))*100 as '乱来的' from emp; file:///C:/Users/Zhang/AppData/Local/Temp/msohtmlclip1/01/clip_image122.jpg distinct() 去重复 去重 select distinct(phone) from test; file:///C:/Users/Zhang/AppData/Local/Temp/msohtmlclip1/01/clip_image124.jpg 珠海工行必问SQL题 现在有个科目表,里面只有两个字段:姓名、科目。 求表中选择科目大于两个科目的学生姓名 select姓名from表group by姓名having count (科目) >2; 改--update。。。set update test set class=2239; file:///C:/Users/Zhang/AppData/Local/Temp/msohtmlclip1/01/clip_image126.jpg update test set name= 'dcs39',age=38,score=100,time='20220301'where sid=5; file:///C:/Users/Zhang/AppData/Local/Temp/msohtmlclip1/01/clip_image128.jpg 删--delete delete from test where sid = 258; ==》按照条件删除指定数据. file:///C:/Users/Zhang/AppData/Local/Temp/msohtmlclip1/01/clip_image130.jpg delete from表; ==》 不限定条件删除表中数据, 可以清空表中内容 file:///C:/Users/Zhang/AppData/Local/Temp/msohtmlclip1/01/clip_image132.jpg 面试题: mysqI中删除数据有多少中方式? 1,delete:可以根据条件删除指定数据,如果不接条件删除时,可以清空表中数据,但是重新插入数据时,自增长字段还是会在原来最大值基础上进行累积递增。(只删除表中数据,保留表结构,没有释放空间) 2,truncate:truncate +表名; ==》直接清空表中数据,不能接条件删除指定数据。保留表结构,重新插入数据时,自增长会重新从1开始(清空表中数据并释放空间,保留表结构)3,drop table +表名; ==》删除整张表,删除数据,表定义也被删除(释放空间) 备份: 备份表==》直接在数据库中操作的 1),先备份表结构 create table新表like旧表; 2),再备份表数据(把整张表的数据进行备份) insert into新表select *from旧表; file:///C:/Users/Zhang/AppData/Local/Temp/msohtmlclip1/01/clip_image134.jpg insert into new(sid,name) select sid,name from emp; file:///C:/Users/Zhang/AppData/Local/Temp/msohtmlclip1/01/clip_image136.jpg 备份整个库(整个库中所有的表结构和表数据) ==》在Linux界面执行,通过Linux中mysq|相关的指令进行 1,备份数据库---mysqldump mysqldump -uroot -p123456需要备份的库> ./脚本文件.sql mysqldump -uroot -p123456dcs39 >./mysqldcs39.sqlfile:///C:/Users/Zhang/AppData/Local/Temp/msohtmlclip1/01/clip_image138.jpg 2,还原备份的SQL脚本文件(必须要有对应的库) mysql -uroot -p123456必须在mysq|里面的一个库<./脚本文件.sql mysql -uroot -p123456 dcs40 < ./mysqldcs39.sql mysq|数据库的权限操作: 必须要进入mysq|库中===》usemysq|; 查看当前MySQL中有什么操作用户: select host,user,password from user; file:///C:/Users/Zhang/AppData/Local/Temp/msohtmlclip1/01/clip_image140.jpg 通过插入user表数据的方式来创建用户(一般不使用的,因为要重复赋予权限) insert intouser(host,user,password) values ('localhost'dcs39',password('123456)); 密码的插入需要使用password()函数进行加密 file:///C:/Users/Zhang/AppData/Local/Temp/msohtmlclip1/01/clip_image142.jpg grant all privileges on *.* to 'root' @'%' identified by '123456'; ==》赋予所有的权限在所有的库里面的所有的表 给远程网络权限(%)的root用户密码是123456 创建后权限刷新: flush privileges; show grants for 'root'@'%'; ==》查看指定用户的权限情况 revoke all on ** from '用户'@'网络位置";==》取消所有权限 update mysql.user set password= password("123457') where host= 'localhost' and user='dcs39'; ==》修改'dcs39'@'localhost的密码 删除用户:通过delete from mysqluser where host= '网络位置' and user=用户名: Navicat --个连接数据库的图形化工具收费的,业内很多公司也是用 file:///C:/Users/Zhang/AppData/Local/Temp/msohtmlclip1/01/clip_image144.jpg file:///C:/Users/Zhang/AppData/Local/Temp/msohtmlclip1/01/clip_image146.jpg file:///C:/Users/Zhang/AppData/Local/Temp/msohtmlclip1/01/clip_image148.jpg file:///C:/Users/Zhang/AppData/Local/Temp/msohtmlclip1/01/clip_image150.jpg file:///C:/Users/Zhang/AppData/Local/Temp/msohtmlclip1/01/clip_image152.jpg file:///C:/Users/Zhang/AppData/Local/Temp/msohtmlclip1/01/clip_image154.jpg file:///C:/Users/Zhang/AppData/Local/Temp/msohtmlclip1/01/clip_image156.jpg 索引视图外键 数据库中的DDL和DML 1、DDL:数据库定义语言→对表的定义、表字段进行操作→create(创建),alter table(修改表),drop(丢弃、删除表) 2、DML→数据库操作语言→对表中数据进行操作→增(insert into) 删(delete) 改(update。。。色他) 查(select) 索引:index 为了提高查询性能都会去增加索引(一般增加在常用的字段上→热字段) 索引是对表的字段生效,但是不能对整个表所有的字段都加索引,如果整个表所有字段都加索引就丧失了索引的意义了,反而会导致系统的性能受到影响 注意:1、创建索引的前提:表中有大量的数据(上万行),添加索引会对查询速度有明显的提升 2、不能对一个表的每个字段都添加索引,如果都添加了就丧失了索引的意义,反而会消耗大量的内存或者磁盘的资源,通常只会对热字段(经常需要查询的字段)添加索引 3、索引的优先级:主键pri>唯一uni>普通muL 索引的类型:3种 普通索引:index 允许索引所在字段的值重复和为空的,允许表中存在多个普通索引 唯一索引:unique index 允许索引所在的字段为空,但是不允许重复,允许表中存在多个唯一索引 主键索引 :primary key索引所在的字段的值既不能为空也不能重复(当我们定义了主键约束时,其实就是定义了主键索引,或者说主键约束是主键索引的一个表征),一个表中只能有一个主键索引 创建普通索引:create index(创建) alter table(修改) file:///C:/Users/Zhang/AppData/Local/Temp/msohtmlclip1/01/clip_image158.jpg 给多个字段创建普通索引(创建联合索引) create index bb on grade(age,sex)→创建 普通索引 bb在grade表的age和sex字段上 索引是一种表结构,所以可能通过alter table 的方式进行修改 alter table grade drop index bb;→修改表 grade表的class字段上 通过alter table 创建普通索引 alter table grade add index bb(age;创建表 grade表 添加普通索引 bb在age字段上 创建唯一索引  注意,唯一索引字段的值不能重复) create unique index cc on grade(name);===>创建唯一索引cc 在grade表上的name字段 create unique index xx on grade(chinese); ==》创建唯一索引 xx 在grade表上的chinese字段(但是chinese字段上的值存在重复的情况,所有创建失败) file:///C:/Users/Zhang/AppData/Local/Temp/msohtmlclip1/01/clip_image160.jpg 查看索引的情况: show index from grade;==》展示索引情况来自于grade表 file:///C:/Users/Zhang/AppData/Local/Temp/msohtmlclip1/01/clip_image161.jpg 通过alter table删除唯一索引 alter table grade drop index cc; →修改表后grade表删除索引cc 通过alter table创建唯一索引 alter table grade add unique index ff(name);→修改表 grade表 添加 唯一索引ff在name字段上 主键索引:在创建主键的时候,主键索引就同时创建成功 删除主键索引: 1,先删除自增长约束:alter tablegrade change sid sid int(4); 2, 再删除主键索引:alter table grade drop primary key; 添加主键索引: alter table gradeadd primary key(sid); ==>修改表 grade表添加主键索引在sid字段上 视图 view: 是一种虚拟表,不负责储存数据,是通过实际的基础表创建的,用来表示基础的数据,数据是根据动态生成的 1) 为什么要使用视图view? ①:为了安全,在实际表中有些字段可能是保密的,那么就可以通过创建视图的方式,让用户操作视图从而避免对实际表的保密字段进行操作 ②:为了方便操作,在数据库中有些查询语句比较复杂,就可以通过这些复杂的语句进行加工成视图表,就可以避免复杂的查询重复编写的出错 2)特点
①视图是有实际表(基础表)创建的虚拟表 ②视图时由列(字段)和行(值)组成,他的列可以时多个表中列 ③视图的创建和修改是不影响基础表 ④基础表的修改或者删除会影响到视图表 ⑤基础表和视图中的数据是互相影响额,当一个视图时由复杂的查询创建出来的,不允许修改视图的数据 3)缺点 ①视图的性能差,因为视图查询时本质上时对基础表进行查询 ②视图存在修改限制,当用户想修改视图里面的数据时,本质上需要先转化成对底层的某些信息修改,如果视图的数据来源比较复杂时不允许修改 4)创建视图(可以理解为对基础表的数据进行复制) create view dcs as(selectname,chinese,math from grade);→创建视图 dcs 根据查询grade表的name,Chinese,math字段的值 得到 show tables;==>展示当前库中所有的表(包括基础表和视图表) select *from dcs;==》对视图表dcs表进行查询,得到的结果木质上就是select name , chinese,math from grade show create view dcs;==>查看视图dcs的结构 file:///C:/Users/Zhang/AppData/Local/Temp/msohtmlclip1/01/clip_image163.jpg 5)对视图表中的数据操作可以直接使用 增删改查 增:insert into dcs(name) values(’xiaozhang’); 改:update dcs set Chinese=88 wherename=’xiaozhang’; 删:delete from dcs where name=’lisi’; 对基础表中的数据进行修改,也会影响到视图:delete from grade where sid=1; 创建一个通过多表查询获取视图表:create view duobiao as(lelect *from dept left join emp ondept.dept1=emp,dept2); 删除视图:drop view duobiao; 查看当前库中有哪些视图:show table status wherecomment=’view’; 外键约束 foreign key 外键约束,约束的是表与表之间的关系,目的是为了保持数据的一致性,完整性 使用外键的表,必须是数据引擎为innodb的 把一个表B的某个字段约束到另一个表A的某个字段 1) 当表A字段不存在值时,表B不能进行添加对应的值 2) 当表B 字段存在时,表A对应的值不能改变 现在创建两张表dcs1 和dcs2 dcs1: ==>主表 create table dcs1(id int(4) primary key,name varchar(20)) engine=innodb; 创建表dcs1表包含字段id 类型为int(4)主键约束,字段name类型varchar(20)数据引擎为innodb dcs2:==》子表createtable dcs2( # 创建表dcs2表 sid int(4) primary key , sname varchar(20), #包含字段sid 类型为int(4)主键约束,字段sname类型varchar(20) constraint gz foreign key(sid)referencesdcs1(id) #创建约束名称为gz外键定义在sid引用dcs1表的id字段') engine=innodb;#数据引擎为innodb constraint gz约束名称为gz==》gz外键的名称 foreign key(sid)外键定义在本表中的sid ==》外键加在这个sid字段上 references dcs1(id)引用的是dcs1表中id字段==》dcs1表变成了该表的主表,主表的id字段对应着子表中sid字段 sid字!段的值就受到dcs1表中id字段约束, 如果id的值不存在,那么sid就不能添加对应的值 如果sid已经添加了,那么id不能被删除 id和sid就不能随意改变了 往两张表添加数据: 要先对主表进行添加:insert into dcs1(id,name)values(1,’xiaomai’); select *from dcs1 才可以对主表添加相同的值:insert into dcs2(id,name)values(1,’damai’); 异常的添加: 直接对从表添加主表不存在的数据:insert into dcs2( sid,sname ) values( 2 , 'damai1 ' ); #报错Cannot add orupdate a child row : a foreign key constraint fails 异常的更新: 更新主表,当主表的数据被从表引用,不能直接更新或者删除主表的数据 1)update dcs1 setid=3 where id=1; #报错Cannot delete or update a parent row: a foreign key constraintfails 2)delete from dcs1where id=1; #更新Cannotdelete or update a parent row: a foreign key constraint fails 3)更新子表,当主表没有对应的数据可以被子表引用,子表是不能更新到对应的值的 update dcs2 set sid=2 where sid=1; #报错Cannot add orupdate a child row: a foreign key constraint fails 3) 如果需要删除或者修改主表的数据,就要先删除子表引用的数据 delete from dcs2 where sid=1; update dcs1 set id=3 where id=1; select *from dcs1; da1ete from drc1· 总结: 1, 主表不存在的数据,在相关的从表无法插入与之相关的数据 2,对主表进行删除或者更新,会导致主表没有了外键值时,那么执行会报错 3,对子表进行更新或者插入数据时,如果主表没有这个外键值,那么执行会报错 4,要删除主表的信息,需要先确认从表是否存在,如果从表存在,要先删除从表对应的数据 删除外键约束: alter table dcs2 drop foreign key gz; →修改表 dcs2表 丢弃 外键 gz 添加外键约束 alter table adc2 add constraint gzdcs foreignkey(sid) references dcs1(id); →修改表 dcs2 添加 约束 gzdcs 外键在sid字段上 引用dcs1表的字段 注意:添加外键时,需要确保从表和主表数据的一致性,否则添加失败 存储过程 procedure select version(); 创建存储过程的语句: drop procedure if exists dcs39; #删除 存储过程 如果存在 dcs39这个存储过程 create procedure dcs39(n int) #创建存储过程 命名为的dcs39 增加n为形式参数(形参),类型为int整型 begin #存储过程的函数体==》sql语句集合==》每一条SQL语句都是独立的 drop table if exists mm; create table mm(id int(4) primary key auto_increment,score int(4)); insert into mm values(1,99),(2,88); insert into mm values(3,97),(4,87); insert into mm values(5,96),(6,86); -- select * from mm; -- desc mm; -- select *from mm where id=3; #不带参数的查询,直接把条件写死了,每次执行都是固定的 -- select *from mm where id=n; #带参数额查询,让每次执行时,可以控制这个n的值 if n=0 then #如果满足n=0 那么执行 #if 条件判断语句的单分支判断 select *from mm; else #否则 select *from mm where id=n; end if; end; 调用 当调用存储过程时,本质上就执行 创建时写在begin。。。end 中间的SQL语句 call dcs39(0); →调用存储过程 dcs39 调用存储过程dcs39时,传入实际参数(实参)1 形式参数和实际参数的区别: 形式参数是在定义函数时用来接收实际参数的值 实际参数用来给形式参数进行传递一个实际的值 存储过程本质就是MySQL中的自建函数 file:///C:/Users/Zhang/AppData/Local/Temp/msohtmlclip1/01/clip_image165.jpg file:///C:/Users/Zhang/AppData/Local/Temp/msohtmlclip1/01/clip_image167.jpg file:///C:/Users/Zhang/AppData/Local/Temp/msohtmlclip1/01/clip_image169.jpg file:///C:/Users/Zhang/AppData/Local/Temp/msohtmlclip1/01/clip_image171.jpg file:///C:/Users/Zhang/AppData/Local/Temp/msohtmlclip1/01/clip_image173.jpg file:///C:/Users/Zhang/AppData/Local/Temp/msohtmlclip1/01/clip_image175.jpg file:///C:/Users/Zhang/AppData/Local/Temp/msohtmlclip1/01/clip_image177.jpg file:///C:/Users/Zhang/AppData/Local/Temp/msohtmlclip1/01/clip_image179.jpg file:///C:/Users/Zhang/AppData/Local/Temp/msohtmlclip1/01/clip_image181.jpg
|