找回密码
 立即注册

推荐阅读

  • 便民服务
  • 关注我们
  • 社区新手
六、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

分享至 : QQ空间
收藏

0 个回复

您需要登录后才可以回帖 登录 | 立即注册