MySQL(三)
一、mysql多表查询
多表查询是指两个或两个以上的表查询。假设有以下几张表:
//查找量表中的所有记录当Student表的sno=SC表的sno时
select * from Student,SC
where Student.sno=SC.sno;
自连接是指在同一张表的连接查询【将同一张表看作两张表】
mysql表子查询:子查询是指嵌入在其他sql语句中的select语句,也叫嵌套查询。
//查询和李勇性别相同的学生的所有信息
select*from Student
where gender={
select gender from Student
where sname='李勇'
}
//找出性别为女的学生选择的所有科目
select distinct major
from Student
where gender='女';
//显示所有女生选择的专业的所有科目
select*from Student
where major in {
select distinct major
from Student
where gender='女'
}
在多行子查询中使用all操作符:
//找出SC表中学生21012101比学生21012102所有成绩都高的科目
select*from Student
where sno='21012101' and grade>all(
select grade from Student
where sno='21012102'
)
select*from Student
where sno='21012101' and grade>(
select max(grade) from Student
where sno='21012102'
)
在多行子查询中使用any操作符:
如何显示成绩比21012102的其中一个成绩高的记录
select*from Student
where sno='21012101' and grade>any(
select grade from Student
where sno='21012102'
)
select*from Student
where sno='21012101' and grade>(
select min(grade) from Student
where sno='21012102'
)
多列子查询:多列子查询是指查询返回多个列数据的子查询语句。
//请查询所有与李勇性别和选课完全相同的学生。
select*from Student
where(gender,major)={
select gender,major
from Student
where sname='李勇'
}
二、合并查询
为了合并多个select语句的结果,有时候可用集合操作符号union、union all
1.union all:该操作符用于取得两个结果集的并集。当使用该操作符时,不会取消重复行。
2.union:此操作符与union all类似,但会自动去掉结果集中的重复行。
三、表外连接
1.左外连接(如果左侧的完全显示就是左外连接)
显示所有学生的学号、姓名以及他们的选课情况(左侧完全显示,右侧没有信息则为null)
select Student.sno,Student.sname,SC.cno
from Student left join SC
on Student.sno=Sc.sno;
2.右外连接(如果右侧的完全显示就是右外连接)
select Student.sno,Student.sname,SC.cno
from SC right join Student
on Student.sno=Sc.sno;
四、mysql约束
约束用于确保数据库的数据满足特定的商业规则。在mysql中,约束包括:not null、unique、primary key、foreign key和check五种。
1.primary key(主键)
primary key不能重复且不能为null
一张表最多只能有一个主键,但可以是复合主键
逐渐的指定方式有两种
直接在字段名后制定:字段名 primary key
在表定义最后写primary key(列名)
使用desc表名,可以看到primary key地情况
在实际开发中,每个表往往都设计一个主键。
2.not null(非空)
如果在列上定义了not null,那么当插入数据时,必须为列提供数据。
3.unique(唯一)
当定义了唯一约束后,该列值是不能重复的。
如果没有指定not null,则unique字段可以有多个null
一张表可以有多个unique字段
4.foreign key(外键)
用于定义主表和从表之间的关系,外键约束要定义在从表上,主表必须具有主键约束或是unique约束,当定义外键约束后,要求外键数据必须在主表的主键列存在或是为null
foreign key(本表字段名)references
主表名(主键名或unique字段名)
细节:外键指向的表的字段,要求是primary key或者是unique
表的类型是innodb,这样的表才支持外键
外键字段的类型要和主键字段的类型一致(长度可以不同)
外键字段的值,必须在主键字段中出现过,或者为null
一旦建立主外键的关系,数据不能随意删除。
5.check
用于强制行数据必须满足的条件
sex varchar(6) check(sex in('man','woman'))
五、自增长
在某张表中,存在一个id列(整数),我们希望在添加记录的时候,该列从1开始,自动的增长。
字段名 整型 primary key auto_increment
添加自增长的字段方式:
insert into xxx(字段1,字段2......)values(null,'值'......);
自增长默认从1开始,你也可以通过如下命令修改:alter table 表名 auto_increment=新的开始值。
六、索引
1.添加索引:
create [unique] index index_name on tabl_name(col_name[(length)] [asc|desc],......);
alter table table_name add index [index_name] (index_col_name,......)
2.添加主键(索引)alter table 表名 add primary key(列名,...);
3.删除索引
drop index index_name on tbl_name;
alter table table_name drop index index_name;
4.删除主键索引:alter table t_b drop primary key;
5.查询索引(三种方式)
show index(es) from table_name;
show keys from table_name;
desc table_name;
七、mysql事务
事务是用于保证数据的一致性,它由一组相关的dml语句组成,该组的dml语句要么全部成功,要么全部失败。
事务和锁:当执行事务操作时(dml语句),mysql会在表上加锁,防止其他用户修改表的数据。
mysql数据控制台事务的几个重要操作
- start transaction --开始一个事务
- savepoint 保存点名 --设置保存点
- rollback to 保存点名 --回退事务
- rollback --回退全部事务
- commit --提交事务,所有操作生效,不能回退
细节:
- 如果不开始事务,默认情况下,dml是自动提交的,不能回滚
- 可以在事务没有提交前,选择回退到哪个保存点
事务隔离级别
介绍:
- 多个连接开启各自事务操作数据库中数据时,数据库系统要负责隔离操作,以保证各个连接在获取数据时的准确性。
- 如果不考虑隔离性,可能会引发:
- 脏读:当一个事务读取另一个事务尚未提交的改变时产生脏读;
- 不可重复读:同一查询在同一事务中多次进行,由于其他提交事务所做的修改或删除,每次返回不同的结果集,此时发生不可重复读;
- 幻读:同一查询在同一事务中多次进行,由于其他提交事务所做的插入操作,每次返回不同的结果集,此时发生幻读。
事务的acid特性
- 原子性:原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
- 一致性:事务必须使数据库从一个一致性状态变换到另一个一致性状态。
- 隔离性:事物的隔离性是多个用户并发访问数据库时,数据为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。
- 持久性:持久性指一个事务一旦被提交,它对数据库中数据的改变就是持久性的,接下来即使数据库发生故障也不应该对其有任何影响。
八、mysql表类型和存储引擎
- mysql的表类型由存储引擎决定,主要包括MyISAM、innoBDB、Memory。
- mysql数据表主要支持六种类型,分别是:CSV、Memory、ARCHIVE、MRG_MYISAM、MYISAM、InnoBDB。
- 这六种又分为两类,一类是“事务安全型”,如:InnoDB;其余都属于第二类,称为“非事务安全型”;
细节:
- MyISAM不支持事务,也不支持外键,但其访问速度快,对事务完整性没有要求
- InnoDB存储引擎提供了具有提交,回滚和崩溃恢复能力的事务安全。但比起MyISAM存储引擎,InnoDB效率差一些并且会占用更多的磁盘空间以保留数据和索引。
- MEMORY存储引擎使用存在内存中的内容来创建表。每个MEMORY表只实际对应一个磁盘文件。MEMORY类型的表访问非常快,因为它的数据是放在内存中的,并且默认使用HASH索引。但是一旦mysql服务关闭,表中的数据就会丢失掉,表的结构还在。
九、视图
基本概念
- 视图是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含列,其数据来自对应的真实表。
- 通过视图可以修改基表的数据。
- 基表的改变也会影响到视图的数据。
视图基本使用
- create view 视图名 as select语句
- alter view 视图名 as select 语句 --更新成新的视图
- show create view 视图名
- drop view 视图名1,视图名2
十、mysql管理
mysql中的用户,都存储在系统数据库mysql中user表中
其中user表的重要字段说明:
1.host:允许登陆的“位置”,localhost表示该用户只允许本机登录,也可以指定ip地址
2.user:用户名
3.authentication_string:密码,是通过mysql的password()函数加密之后的密码。
创建用户:
create user '用户名' @ '允许登陆位置' identified by '密码';
删除用户:
drop user '用户名' @ '允许登陆位置';
用户修改密码:
set password=password('密码');(修改自己的密码)
set password for '用户名'@'登陆位置'=password('密码');
给用户授权:
grant 权限列表 on 库.对象名 to '用户名'@'登陆位置';
回收用户授权:
revoke 权限列表 on 库.对象名 from '用户名'@'登录位置';
权限生效指令:
flush privileges;
原文地址:https://blog.csdn.net/weixin_73975059/article/details/139774508
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!