文章目录
- MySQL的安装与卸载
- SQL操作数据库
- 概念:结构化查询语言 Structured Quary Language
- DDL 语言
- DML 增删改数据库中的表的数据
- DQL 查询表中的记录 select .... from .....
- 查询
- 数据库备份和还原
- 数据库表的约束
- 约束总结
- 表与表之间的关系
- 数据库设计的范式
- 多表连接查询
- 事物
MySQL的安装与卸载
暂略
SQL操作数据库
概念:结构化查询语言 Structured Quary Language
作用
- 是一种数据库的查询的标准,对所有的数据库都支持
- 不同的数据库SQL语句可能有点不同 (方言),mysql oracle DB2
sql语句分类
- DDL:操作数据库、表 数据定义语言 Data Definition Language
- DML:增删改表中的记录 数据操作语言 Data Manipulation Language
- DQL: 查询表中的记录 数据查询语言 Data Query language
- DCL: 管理用户与授权 Data Control language 数据控制语言
DDL 语言
- 操作数据库 CRUD操作
- 创建数据库 方式有很多种: C —create
- create database 数据库名;
- create database if not exists 数据库名;// 创建的时候先判断数据库是否存在
- create database 数据库名 character set 编码字符集;// 创建数据库的指定编码字符集
-- 分号 一般是sql语句的结束标志
create DATABASE java31;
-- 创建数据库的第二种方式 create database if not exists 数据库名;
create database if not EXISTS apartment;
-- 创建数据库的第三种方式 create database 数据库名 character set 编码字符集;
create database school character set utf8;
-- 三者组合到一起表达
create database if not EXISTS college character set utf8;
- 查询 r —>retrieve
- 查询当前数据库服务器的所有的数据库
show databases; - 查询某个数据库的编码字符集:查询某个创建的数据库的编码字符集
show create database 数据库名称;
- 修改 u—>update
- 修改数据库的编码字符集
alter database 数据库名称 character set 编码字符集;
-- alter database 数据库名称 character set 编码字符集;
alter database college character set gbk;
- 删除 d -->delete drop
- 删除数据库
drop database 数据库名称; - 判断数据库是否存在,如果存在删除掉
drop database if exists 数据库名称;
-- drop database if exists 数据库名称;
drop database if EXISTS school;
- 操作表
- 创建表 C --> create
- 语法:
create table 表名(
列名1 数据类型,
列名2 数据类型,
。。。。。。。
); - 数据类型
- 整数类型 tinyint(微整形) 8位 smallint(小整形)16位 mediumint(中整形)24位 int(integer) 整形32位
- 小数类型 double 8个字节 float 4个字节
- 日期类型 date (年月日) time (时分秒) datetime (年月日时分秒) timestamp 时间戳 年月日时分秒
时间戳,如果该字段为时间戳类型,没有赋值或者该字段值为null,则默认使用系统当前的时间自动赋值。一般情况一张表中只能有一个字段使用时间戳数据类型。 - 字符串类型 char(固定长度的字符串) varchar(可变长度的字符串) 使用几个字符就占几个
- 二进制类型 tinyblob(允许0~255个字节) big large blob(允许0~65535个字节) longblob(非常大)
- 文本类型 tinytext (允许长度为0~255个字节) text(允许0~65535个字节) longtext(非常大)
- 查看表 查询 retrieve
- show tables 查看当前使用的数据库下面的所有的表
- desc 表名; 描述该表的结构
- 查看创建的表 show create table 表名;---->查看该表创建使用到的sql语句
- 快速创建一个表结构相同的表 create table 新表名 like 旧表名;
- 修改 update
- 修改表名 alter
alter table 旧表名 rename to 新表名; - 修改表的字符集
alter table 表名 character set 编码字符集; - 添加一列字段 add
alter table 表名 add 列名 数据类型; - 删除一列 drop
alter table 表名 drop 列名; - 修改列名 数据类型
- change alter table 表名 change 旧列名 新列名 新数据类型;
- modify alter table 表名 modify 列名 新数据类型;
- 删除 delete
- 删除表 drop table 表名;
- 删除判断表是否存在 drop table if exists 表名;
大多数情况下我们是直接借助于图形化管理工具 Navicat直接操作。
DML 增删改数据库中的表的数据
- 添加数据:
- 语法:
- insert into 表名(列名1,列名2,…列名n) values(值1,值2,…值n);
- 注意事项:
- 列名和后面值的类型要保持一致。
- 如果表名后面没有指定列名,默认为给该表中的所有的列添加对应的值。注意依然是有顺序的。
insert into 表名 values(值1,值2,…值n); - 除了数字类型外(int,double),其他类型一律要使用引号(单引号和双引号都可以)引起来。
- 删除数据:
- 语法: delete
delete from 表名 [where 条件]; - 注意事项:
- 如果后面不跟条件 ,则删除整张表的数据
- 删除表的所有的记录 delete from student / truncate table 表名;(底层是先把表删除掉,然后再创建一张一模一样的表)
- 如果条件中的字段值有重复的,凡是符合条件的都删除。
- 修改数据:update
- 语法:
update 表名 set 列名1 = 替换值1, 列名2 =替换值2,…列名n = 替换值n [where 条件]; - 注意:
- 如果不带条件,则会修改表中的所有记录
DQL 查询表中的记录 select … from …
查询
- 查询表中所有的行和列的数据
select * from 表名; - 查询指定列的数据:如果有多个列,中间由逗号隔开
select 列名1,列名2 …from 表名 - 查询时指定列的的别名
- 使用关键字 as
- 使用别名的好处:显示的时候指定新的名字,并不修改表的原有结构
- 对指定列进行别名操作:select 列名1 as 新名字,列名2 as 新名字,…from 表名;
- 对表名和列同时进行别名操作:select 列名1 as 新名字,列名2 as 新名字,…from 表名 as 新表名;
如:对学生表进行操作:查询学生表的姓名和年龄:
select s.name as 名字,s.age as 年龄 from stu as s;
-- (as关键字可以省略不写)
- 取出重复查询
- 使用关键字 distinct 去掉重复的记录
- 语法格式:select distinct 字段名 from 表名;
例如:
-- 查询本班同学都来自于哪些地方
select distinct address from stu;
- 查询的结果值可以参与数学运算
- 查询出来的列和其他列可以进行数学运算
- 语法: select 列名1+、-、/、 * 列2… from表名:
- 注意:能够参与数学运算的是前提 是列的数据类型是数值型.整数和小数
例如:
-- 查询本班同学的数学成绩和历史成绩的和
select s.math+s.history as 综合 from student as s;
-- as 可以省略
- 条件查询
- 查询的时候,有时候只想获取符合条件的结果值,并不是获取表中的所有记录
- 语法: select 字段列表 from 表名where 条件表达式;
- 结果值:符合条件的记录就会被返回,如果条件不符合就不返回过滤掉)
- 运算符:
>,<,>=,<=,!= ,=,<>(不等于),没有"==" | 在sql中,不等于有两种表示方式,!=,<> |
between…and | 表示的是一个区间范围 如 between A and B[A,B] |
in(具体的取值) | 里面放的是一个个数据,如有多个,中间用逗号隔开 |
like | 模糊查询,根据关键字查询,一般搭配"%" |
is null | 查询某一列为null的值,注意在sql字段名=null |
is not null | 查询某一列不为null的值 |
- 操作:
-- 比较运算符的操作
-- 查询数学成绩50分以上的同学
select * from student as s where s.math > 50;
-- BETWEEN AND
-- 查询数学成绩在70-100分之间的
select * from student as s where s.math BETWEEN 70 and 100;
-- in(某几个散列值)
-- 查询历史成绩为80分和100分的同学
select * from student as s where s.history in(80,100);
-- 模糊查询 like 搭配使用 %
-- 查询学生地址中含有"阳"的同学
select * from student as s where s.address like '%阳%';
-- 查询本班同学中含有小的同学信息
SELECT * from student as s where s.username like '%刘%';
-- 查询生日为空的同学有哪些
select * from student as s where s.birthday is not null;
备注:在模糊查询时,通配符有两种表示方式:% _
%匹配任意多个字符
_匹配单个字符
两者都需要注意书写的位置:
一般我们使用[%]作为模糊查询的通配符
- 逻辑运算符与或非
与: && – and
或:II --> or
非: ! - 组合排序
- 同时对表中的多个字段进行排序,如果前面的字段值相同,再根据后面的字段再次排序
- 语法: select 字段列表 from 表名 where 条件 order by字段1 desc/asc,字段
- 操作:
-- 逻辑运算符 与或非
-- 查询历史成绩为80分和100分的同学 or
select * from student as s where s.history = 80 or s.history = 100;
-- 查询本班同学成绩在70分以上的 and
SELECT * from student as s where s.math > 70 and s.history > 70;
-- 取非 !
SELECT * from student as s where ! (s.math > 70 and s.history > 70);
排序
- 单列排序
通过 order by语句来实现排序,只是将查询出来的结果值进行排序,并不影响查询的结果,不进行条件过滤,影响的是显示的方式(从大到小还是从小到大)
升序:asc 默认就是升序
降序:desc
单列排序:根据表中的某个字段、某列进行排序
语法: select 字段列表 from 表名 where 条件 order by 字段名 asc、desc;
如:
--对查询出来的同学信息根据历史成绩降序排序
select * from student as s order by s.history desc;
组合排序
- 同时对表中的多个字段进行排序,如果前面的字段值相同,再根据后面的字段再次排序
- 语法: select 字段列表 from 表名 where 条件 order by 字段1 desc|asc,字段名2 desc|asc;
- 操作:
-- 根据数学成绩进行升序排序,当数学成绩相同再根据历史成绩降序排序
select * from student as s order by s.math asc,s.history desc;
- 聚合函数
- 常用的聚合函数
- 求一个最大值 max
- 求一个最小值 min
- 求一下平均数 avg
- 求一下总和 sum
- 统计查询结果的记录数 count
使用count统计记录数的时候,如果count中填写的是表中的某个字段, 如果某条件中该字段为null,则该记录会被过滤掉。
ifnull(表达式1,表达式2),如果前面的字段为null,后面的表达式2可以替换掉前面的字段为null的值。可以统计带null的值
- 分组查询group by
select
字段列表
from
表名列表
where
条件列表
group by
分组字段
having
分组之后的条件
limit
分页限定
概念:使用group by 对查询的结果信息进行分组,相同的数据分成一组
语法:select 字段列表 from 表名 group by 分组字段 having 分组之后的条件
eg.
将查询出来的结果值内容,在按照性别进行分组,分两组.
-- 统计成男人男女个多少个?
SELECT
s.sex,
COUNT( s.sex )
FROM
stu s
WHERE
s.sage >= 18
GROUP BY
s.sex;-- 统计成男人男女个多少个?只显示个数小于3的那一组成员
SELECT
s.sex 性别,
COUNT( s.sex ) 个数
FROM
stu s
WHERE
s.sage >= 18
GROUP BY
s.sex
HAVING
COUNT( s.sex ) < 5;
having和where的区别
- where语句: 将查询结果分组前的符合条件返回数据,不符合条件的过滤掉,即先过滤再分组。where后面不能使用聚合函数。
- having语句: 在分组之后过滤数据,即先分组再过滤。
- 分页查询
- 使用关键字 limit,它是mysql中的方言操作
- 作用:对查询的结果值进行分页展示,每次显示多少条记录
- 语法: select 字段列表from 表名where 条件group by分组字段having分组之后条件order by升降序limit分页限定条件
- 分页限定条件 -----> 起始值 展示记录数 limit offset,length
- 操作:
-- 查询学生表中的数据,从第一条开始,每页显示2条,第一次只能看到前两条
SELECT
s.username as 姓名,s.age as 年龄,s.gender as 性别
FROM
student as s
LIMIT
0,2
-- 查询学生表中的数据,从第4条,展示3条
SELECT
*
FROM
student
LIMIT
3,3
-- 分页 转换分页查询的起始值和页码数,每页展示的个数确定的
-- 0,15 第一页
-- 15,15 第二页
-- 30,15 第三页
-- 查询第28页的数据 15条记录
-- 页码数已知的 pageNum 起始值是未知的 beginNum ,记录数为num
-- totalNum 总记录数 根据记录数进行分页
-- beginNum = (pageNum - 1) * num
LIMIT
(pageNum - 1) * num;
-- 如果你查询的记录值是从第一条开始的,这个0可以省略
SELECT
*
FROM
student as s
LIMIT
5;
-- 如果你查询的是最后几条,有几条显示几条,不会报分页错误
-- 查询从第三条开始,查询5条
SELECT
*
FROM
student as s
LIMIT
2,5;
备注:
如果查询从第一条开始,那么起始值可以省略,如果查询最后几条, 那么有几条,显示几条,不会报分页错误.
数据库备份和还原
- 图形化界面工具Navicat
- 备份
选中数据库右键–>转储sq(文件–结构和数据–>指定磁盘中sq|文件存储的位置。 - 还原
先通过Navicat创建中放据库(需要和sq|文件中的数据库保持同名) -->右键运行sql文件—>浏览磁盘中存储的sql文件,点击运行,最后—>刷新
- dos指令操作
- 备份
在不登录的情况下使用mysqldump -u登录名-p登录密码备份数据库名>存储磁盘的位置(绝对路径) - 还原
登录mysql,首先创建同名的数据库,然后使用当前创建的数据库use创建数据库名,然后source 磁盘中sq|文件存储的位置
备份:
还原:
数据库表的约束
- 概述
对表中的数据进行限定,保证数据的有效性、完整性和正确性。一个表一旦添加了约束,那么不正确的数据将无法添加进来,所以一般约束在创建表设定字段的时候添加上 - 主键约束
- 主键:一般是用来唯一标识数据库表中的某一条记录,不能为空
- 通常情况下,一般会给表添加一个id字段,用作唯一标识,设置为主键,主键一般是提供给数据库操作使用的(查询,修改,删除等等),主键不能重复,也不能为空。
比如: 一个人的身份证号、一个人手机号,一个学生的学号,一个员工工号 - 语法: 使用关键字 primary key
- 操作:
-- 查询
SELECT * FROM user;
-- 非法数据插入 唯一 不重复
INSERT INTO user values(7,'0008','123123','小花','12312312313','女',19);
-- 非法数据插入 null值插入 非空
INSERT INTO user values(null,'0008','123123','小花','12312312313','女',19);
-- 删除主键 sql语句
alter table user drop PRIMARY key;
-- 添加主键
alter table user add PRIMARY KEY(id);
- 主键自增
如果希望在添加表记录时,不设定表中主键值,系统会自动给主键添加自增值
- 语法: auto_increment 表示自动自增
-- 非法数据插入 null值插入
INSERT INTO user values(null,'0010','123123','小周','12312312313','男',25);
- 修改自增的起始值为100
alter table user auto_increment = 起始值; - 唯一约束
- 概念:字段值唯一,不允许重复
- 关键字: unique
- 语法:
- 字段名字段数据类型unique
- 操作:
-- 插入数据
insert into role values(null,'CEO');
insert into role values(null,'manager');
insert into role values(null,'CTO');
-- 查询角色表
SELECT * from role;
insert into role values(null,null);
备注:如果插入是null,表明是没有数据,不存在数据重复问题,可以重复插入。
- 非空约束
- 概念:记录中的某个字段不能为null
- 语法: 字段名 字段数据类型 not null
-- 创建一张部门表
create table department (
id int PRIMARY KEY auto_increment, -- id 主键自增
departmentname VARCHAR(10) not null -- 部门不能为空
)
insert into department values(null,'总裁办');
insert into department values(null,'财务部');
insert into department values(null,'人事部');
insert into department values(null,'研发部');
insert into department values(null,'销售部');
-- 查询该表数据
SELECT * from department;
insert into department values(null,null);
- 默认值:
- 概念:当没有给字段赋值,系统会赋上一个指定的默认值
- 语法: 字段名 字段数据类型 default 默认值
- 操作:
-- 创建一张表 employee 员工表
create table employee (
id int PRIMARY key auto_increment,
username VARCHAR(10) not null,
gender VARCHAR(1) DEFAULT '男',
age int
)
insert into employee(id,username,age) values(null,'小孙',20);
-- 查询员工表
SELECT * from employee;
insert into employee(id,username,gender,age) values(null,'小丽','女',20);
备注:
如果给表中的 某个字段既添加了非空约束又添加了唯一约束,那么该字段是不是主键呢?
一般情况下,一张表中只能有一个主键。
- 外键约束
- 在新标中添加外键约束语法:constraint 外键约束名称 foreign key(外键的字段名称) references 主表表名(主键字段名)
- 在已有表中添加外键约束: alter table 从表表名 add constraints 外键约束名称 foreign key (外键的字段名称) references 主表表名(主键字段名)
- 删除外键语法: alter table从表表名drop foreign key外键名称;
- 级联操作:
- 注意:
在从表中,修改关联主表中不存在的数据,是不合法的
在主表中,删除从表中已经存在的主表信息,是不合法的.直接删除主表(从表中有记录数据关联)会报删除失败.
- 概念:在修改或者更新主表的主键时,同时它会更新或者删除从表中的外键值,这种动作我们称之为级联操作.
- 语法:
- 更新级联:on update cascade 级联更新 只能是创建表的时候创建级联关系.当更新主表中的主键,从表中的外键字段会同步更新.
- 删除级联:on delete cascade 级联删除
-- 给从表student添加级联操作
create table student(
s_id int PRIMARY key ,
s_name VARCHAR(10) not null,
s_c_id int,
-- constraint 外键约束名称 foreign key(外键的字段名称) references 主表表名(主键字段名)
CONSTRAINT stu_cour_id FOREIGN key(s_c_id) REFERENCES course(c_id) -- 给s_c_id 添加外键约束
ON UPDATE CASCADE ON DELETE CASCADE
)
insert into student VALUE(1,'小孙',1),(2,'小王',2),(3,'小刘',4);
insert into student VALUE(4,'小司马',1),(5,'小赵',1),(6,'小钱',1);
-- 查询学生表中的记录
select * from student;
-- 级联操作。
-- 更新级联 on update cascade 级联更新 只能是创建表的时候创建级联关系。当更新主表中的主键,从表中的外键字段会同步更新。
update course set c_id = 10 where c_id = 1;
-- 删除级联 on delete cascade 级联删除 当删除主表中的主键时,从表中的含有该字段的记录值会同步删除。
delete from course where c_id = 10;
约束总结
约束名 | 关键字 | 描述 |
主键 | primary key | 唯一不为空 |
默认 | default | 插入数据,该字段没有赋值,系统会自动赋值指定默认值 |
非空 | not null | 该字段不能为null(空) |
唯一 | unique | 该字段的值在整个表中只能出现1次 |
外键 | foreign key | 从表中添加外键,关联主表中的主键字段 |
表与表之间的关系
可以分成三类:
- 一对一的关系:一般情况下,一对一的关系基本不用,当发现两张表是一对一的关系,合成一张表
- 一对多的关系:在表中关系最多的情况,也是最常见的,比如:部门和员工
- 多对多:从两个方向观察都是1-n的关系,比如:学生表和课程表,企业和应聘者 双选会
- 操作:
学生表、课程表 多对多关系
用户表 、角色表 一对多关系
-- 创建学生表
drop table student;
create table student(
s_id int PRIMARY key auto_increment, -- 主键约束
s_name VARCHAR(10) not null, -- 非空约束
s_num int unique not null -- 唯一约束,非空约束
);
-- 创建课程表
drop table course;
create table course (
c_id int PRIMARY key auto_increment COMMENT '课程id', -- 主键约束
c_name VARCHAR(10) not null unique COMMENT '课程名称' -- 唯一 非空约束
);
-- 中间表
create table t_stu_cour (
s_id int,
c_id int,
CONSTRAINT stu_id foreign key(s_id) REFERENCES student(s_id),
CONSTRAINT cour_id foreign key(c_id) REFERENCES course(c_id)
);
-- 创建用户表
drop table user;
create table user (
u_id int PRIMARY key auto_increment COMMENT '用户表主键id', -- 主键约束
u_name VARCHAR(10) not null, -- 非空约束
u_phone VARCHAR(11) unique, -- 唯一约束
u_rid int, -- 需要添加的外键信息
CONSTRAINT user_rid FOREIGN key(u_rid) REFERENCES role(r_id)
);
-- 创建角色表
drop table role;
create table role (
r_id int PRIMARY key auto_increment COMMENT '角色表主键id', -- 主键约束
r_name VARCHAR(10) not null UNIQUE, -- 唯一约束 非空约束
r_desc VARCHAR(255)
)
-- 如果两张表是一对多关系 设计创建时,先创建主表,再创建从表
- 表与表之间关系总结
表之间关系 | 关系维护,创建 |
一对一 | 合表,互为外键约束,表之间关系很少 |
一对多 | 在从表(多的那一方)的那一方创建外键,关联主表的主键字段,先创建主表,再创建从表 |
多对多 | 创建中间表,中间表分别添加外键约束关联各自对应的主键 |
数据库设计的范式
- 什么是范式?
在设计数据库的时候,需要遵从的规范要求,根据这些规范要求设计出合理的数据库.这些规范称为范式.这些范式针对的是关系型数据库
目前关系型数据库的范式有六种:第一范式、第二范式、第三范式、第四范式、第五范式(完美范式)、巴斯科德范式。各种范式呈递次规范,越高的范式数据库的冗余性就越低. - 前三种范式介绍:
- 第一范式(1NF):数据库中的每一列是不可分割的原子数据项
- 第二范式(2NF):在第一范式的基础上,非码属性必须完全依赖于码(第一范式的基础上消除非主属性对主属性的部分函数依赖)
- 概念:
- 函数依赖:A—>B 如果通过A属性(属性组)的值,可以确定唯一的B属性值, 可以称B依赖于A
- 完全函数依赖:A—>B 如果A是一个属性组,则B属性值的确定需要依赖于A属性
- 部分函数依赖—>如果A是一个属性组, 则B属性值的确定只需要依赖于A属性组中某一个或某一 些属性值即可。
- 传递函数依赖A—>B B-- _>C 如果通过A属性(属性组)的值,可以唯确定B属性的值,在通过B属性的值可以唯一确定C属性的值, 可以称C传递依赖于A
- 码:如果在一张表中,一个属性或者属性组,被其他所有属性所完全依赖,则称这个属性(属性组)为该表的码.
- 主属性:码属性组中的所有属性
- 非主属性:除主属性外的其他属性
- 第三范式(3NF):在第二范式的基础上,任何非主属性不依赖与其他的非主属性(在2NF基础上,消除传递函数依赖)
- 三大范式总结
范式 | 特征 |
1NF | 表中的每一列具有原子性,表中的每一列不可分割 |
2NF | 消除部分函数依赖,一张表只做一件事 |
3NF | 消除传递函数依赖,表中的每一列都直接依赖于码(主键),不需要通过其他的字段(列)间接依赖于主键 |
多表连接查询
- 分类:内连接
- 笛卡尔积现象:
- 左表中的每条记录和右表中的每条记录全关联组合,这种效果就称之为笛卡尔积现象。
- 消除笛卡尔积现象
添加条件过滤,使用where条件语句,达到过滤无效的数据 - 内连接
- 显示内连接:使用内连接关键字inner join on语句inner可以省略
- 语法:select 字段列表 from 表名1 [inner] join 表名2 on 条件语句
- 操作:
- 隐式内连接:省略掉内连接关键字 inner join
- 语法:select 字段列表 from 表名1,表名2,…where 条件语句
- 操作: select * from department,employee where d_ id=e_did;
- 总结
- 查询哪些表
- 确定表关联的条件
- 使用连接的方式
- 确定查询的字段信息,尽量少用 *
- 外连接
- 左外连接:使用left [outer] join … on 条件语句 outer关键字可以省略
- 语法:select 字段列表 from 左表(主表) left [outer] join 右表(从表/辅表) on 条件语句.
- 注意事项:用左表中的记录数据去匹配右表中的记录数据,如果符合条件的则显示,不显示的数据一律插入null.保证左表中的数据全部显示.
- 操作:select d.*,e.e_username form department left join employee on e.e_did = d.d_id;
- 右外连接:使用right[outer] join … on 条件语句 outer关键字可以省略
- 语法:select 字段列表 from 右表(主表) right[outer] join 左表(从表/辅表) on 条件语句.
- 注意事项:用右表中的记录数据去匹配左表中的记录数据,如果符合条件的则显示,不显示的数据一律插入null.保证左表中的数据全部显示.
- 操作:select d.*,e.e_username form employee right join department on e.e_did = d.d_id;
- 子查询
- 概念:一个查询的结果是另一个查询的条件,形成查询嵌套,里面的查询称之为子查询.
- 子查询三种情况:
- 子查询结果可以是单行单列,只有一个字段,这一个只有一个值
- 也可以是多行单利,只有一个字段,这个字段有多个值
- 还可以是多行多列,有多个字段,多个字段分别有多个值。
- 操作:
- 第一种情况:单行单列
1.语法: select查询字段列表from表名where字段比较运算符(子查询);
2.特征:我们可以在where的后面使用比较运算符><>=<=!=<> - 第二种情况:多行单列
- 语法: select 查询字段列表 from 表名 where 字段 in (子查询)
- 特征:结果值是一个集合或者一个数组,父查询使用in运算符
- 操作:
select
d_name
from
department
WHERE
d_id
in (
SELECT
DISTINCT e_did
FROM
employee
WHERE
age > (
SELECT
avg(age)
FROM
employee
)
)
- 第三种情况:多行多列,一般情况下我们可以作为一张虚拟表,进行关联二次查询,一般需要给这个虚拟表其一个别名来实现.
- 语法: select查询字段列表from表名.(子查询) as新表名where条件语句;
- 特征:多行多列不能再使用in运算符或者比较运算符,而是需要进行多表关联,给查询出来的多行多列起别名.
- 子查询总结:
- 单行单列:只有一个值,在where后面可以使用比较运算符,作为条件
- 多行单列:是一个集合值或者数组值,在where后面使用的是in运算符,作为条件
- 多行多列:大多数多列结果值是放在from后面的,作为多表关联的。可以进行二次查询
事物
- 什么是事物?
应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所作的所有更改都会被撤消. - 操作:张三给李四转账10000,张三的账户减掉10000,李四的账户增加1万块
-- 创建账户表
create table account (
id int PRIMARY key auto_increment, -- 主键id
username VARCHAR(10) not null, -- 账户
balance double -- 账户余额
)
-- 插入两条数据
insert into account values(null,'张三',20000),(null,'李四',20000);
-- 张三给李四转账1000块钱
-- 先让张三的钱减掉10000
update account set balance = balance - 10000 where username = '张三';
-- 添加一条语句
update account set balance = balance - 10000 username = '张三';
-- 再让李四的钱增加10000
update account set balance = balance + 10000 where username = '李四';
-- 还原数据
update account set balance = 20000;
-- 查询账户表
SELECT * from account;
- 手动操作事物:
- 三个动作:
- 开启事务:start transaction;
- 提交事务:commit;
- 回滚事务:rollback;
- 事务的特性(ACID特性)
A:原子性(Atomicity)
事务是数据库的逻辑工作单位,事务中包括的诸操作要么全做,要么全不做。
B:一致性(Consistency)
事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。
C:隔离性(Isolation)
一个事务的执行不能被其他事务干扰。
D:持续性/永久性(Durability)
一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。 - 事务的隔离级别:读未提交–>read uncommitted 读已提交—>read committed 可重复读 ----> repeatable read
串行化-----> serializable 锁表 安全性最高 性能最低 - 由事务隔离级别引发并发访问操作的问题:脏读、不可重复读、幻读。