1.做测试为什么需要学习数据库?

(1)只有会数据库操作,才能更全面准确的开展功能测试;
(2)测试环境搭建:web系统里有数据库,你就必须会数据库,从而搭建好环境,开展测试;
(3)为性能测试做准备;
(4)许多公司在面试或者笔试的时候,会问到数据库相关的基础知识。

2.跟数据库相关的一些基本概念

(1)数据:Data,描述事物的符号记录。注意,数据不仅仅指的是数字,还包括文本、声音、图片等等都是数据。
(2)数据库:Database:DB——存储数据的仓库。比较官方的解释是:长期存储在计算机内的有组织的可共享的大量数据的集合。
(3)数据库管理系统(Database Management System:DBMS):是一种操纵和管理数据库的大型软件,用于建立、使用和维护数据库。

常见的数据库管理系统:MySQL、Oracle、SQLServer、MongoDB、Redis等。

数据库管理软件的分类:

——关系型的数据库管理软件:MySQL、Oracle、SQLServer。
   关系型指的是以表的方式来存储数据。
——非关系型的数据库管理软件:MongoDB、Redis
   不使用表的方式存储数据,而是以文档或字符串的方式来存储数据。

(4)数据库系统(Database System:DBS):是指在计算机系统之中引入了数据库之后的系统。一般由数据库、数据库管理系统、应用系统、数据库管理员组成。

注意:关系型数据库使用通用语言SQL来对数据库进行管理。

SQL:Strunctured Query Language:结构化的查询语言。永远管理和操作关系型数据库的语言。主要包括:

——DQL:Data Query Language:数据查询语言:用于检索数据库的数据。在所有的SQL语句之中,这一部分的语法最为复杂和灵活,也是我们学习的重点。——select

——DML:Data Manipulation Language:数据操作语言:用于改变数据库的数据。——insert,delete,update

——DDL:Data Definition Language:数据定义语言:用于定义数据的结构。——create,alter,drop

——DCL:Data Control Language:数据控制语言:用于定义数据库用户的权限。——grant,revoke等。

4.数据库环境搭建

安装MySQL需要注意:

(1)建议安装前关闭杀毒软件(360,火绒、QQ管家、金山毒霸一类)
(2)win7系统安装的时候,建议右击,以管理员身份运行
(3)MySQL需要.net framwork支持

安装过程:mysql(mysql server 以及命令行的客户端)+navicat for mysql(图形化的客户端)

MySQL可以使用的图形化客户端有很多:navicat for mysql,SQLYOG。。。

64bit的机器既可以安装32bit的MySQL,也可以安装64的MySQL;
32bit的机器就只能安装32bit的MySQL。

如果安装不成功,可以选择使用MySQL_VM,步骤如下:

1.将MySQL_VM下的8个包一起放在某个目录下,然后全选中,右击,解压到这里。等待一段时间,它会生成一个文件夹。
2.打开你的WMware Workstation,打开这个文件夹的vmx文件,将这个虚拟机加载进来,看是否可以正常启动。

如果在解压过程中报错,请安装winrar解压工具进行解压。

5.数据库的基本操作:

(1)数据库管理

1)创建数据库:create database 数据库名字;

eg:create database a;

运行选中SQL语句的快捷方式:ctrl+shift+r

2)查询当前连接下的所有数据库:show databases;
3)使用数据库:use 数据库名字;

eg:use a;

4)删除数据库:drop database 数据库名字;

eg:drop database a;

(2)表的管理

数据库无法直接存储数据,需要先建表,使用表来存储数据。

a.简单的建表语法:

create table 表名称(
    字段名1 字段的数据类型1,
    字段名2 字段的数据类型2,
    ……
    字段名n 字段的数据类型n
);

注解:
1)MySQL常用的数据类型:
——整型:int
——浮点型:float
——字符型:varchar/char
——日期型:date

建表示例:

create table student(
    id int,
    name varchar(20),
    grade int    
);

b.建表通常伴随着约束。

约束是对表中字段的数据的规定和限制。目的在于保证数据是准确的,有意义的。

常用的约束如下:

——主键约束:primary key。主键指的是主关键字,它是表中的一个或多个字段,它的值可以用于唯一的标识表中的每一条记录。如果你对某个字段设置了主键约束,那么这个字段既不能为空,也不能重复。

——非空约束:not null。如果某个字段你给它设置了该约束,那么该字段不能取null值。

——唯一约束:unique。如果某个字段你给它设置了该约束,那么该字段禁止更新为重复的值。

——主外键约束:如果某个字段,在一张表里是主键,然后它出现在另外一张表里,那么就称之为另外一张表的外键。

参考示例如下:

create database a;
use a;
create table student(
    id int,
    name varchar(20),
    grade int    
);

create table student1(
    id int primary key,
    name varchar(20) not null,
    grade int,
    email varchar(50) unique
);

insert into student1(id,name,grade,email) values(1,'zs',60,'zs@qq.com');
insert into student1(id,name,grade,email) values(2,'ss',60,'zs@qq.com');
select * from student1;

c.查看表数据

——查看表结构:desc 表名称;

desc student1;

——显示数据库中的所有表:show tables;

d.表的修改

——修改表名:alter table 旧表名 rename to 新表名;

alter table student rename to student2;

——修改字段名:alter table 表名 change 旧字段名 新字段名 新的数据类型

alter table student2 change name username varchar(20);

——添加字段:alter table 表名 add 字段名 数据类型;

alter table student2 add age int;

——删除字段:alter table 表名 drop 字段名;

alter table student2 drop age;

e.删除表

drop table 表名;

drop table student2;

小结:

——安装;

——基本概念;

——数据库的常用操作;

——表的常用操作。

(3)数据的管理:增删改查

1.数据的插入:

--------------------------------------------------------
准备工作:
#创建一个数据库myseconddb
create database myseconddb;
#指定在哪个数据库下做操作
use myseconddb;
#建表
create table student(
    id int primary key auto_increment,
    name varchar(20) not null,
    grade int,
    gender varchar(5)
);

注解:auto_increment:约束的一种,表示自动增长,如果在表中插入行的时候,没有给该字段赋值,那么MySQL会自动产生一个唯一的标识符。

-----------------------------------------------------------
为该表插入数据:

语法格式1:一次插入一条数据
insert into 表名称(字段1,字段2,……字段n) 
values(值1,值2,……值n);

eg:
insert into student(name,grade,gender)
values('zhangsan',88,'man');

注解:
1)字段名称和字段的值一一对应;
2)id的值设置了auto_increment,可以自动生成及增长,我们不用专门插入;
3)如果插入的数据有中文,查询数据时可能会乱码,这是因为建库的时候我们使用的是默认的字符集支持,默认支持的是英文数据。
4)字符串类型赋值需要加引号;

语法格式2:一次插入多条数据

insert into 表名称(字段1,字段2,……字段n) 
values(第一行值1,第一行值2,……第一行值n),
(第二行值1,第二行值2,……第二行值n),
……
(第n行值1,第n行值2,……第n行值n);

eg:
insert into student(name,grade,gender) 
values('xiaohong',67,'female'),
('xiaoming',78,'man'),
('wangwu',88,'man');

--------------------------------------------------------------
需求:项目的数据成千上万,测试纯使用手工方式做数据插入将耗费大量的时间和精力。
实际工作中,通常使用sql文件一下子导入数据。

这里有两个问题:sql文件的生成和sql文件的导入

——sql文件的生成:数据的导出。步骤如下:

在要导出的数据库上右击,选择“转储SQL文件”,选择“结构和数据”,保存在某个目录下。等待出现“Successfully”,关闭弹窗。——》在保存的目录下,即可找到该sql文件。

——sql文件的导入:数据的导入。步骤如下:

在你的连接下建一个数据库,双击该数据库,然后在该数据库上右击,选择“运行SQL文件”,选中你要导入的sql文件,运行——》当出现"successfully",即导入成功。此时刷新数据库下的表,就可以看到导入的表及其数据。

注解:
在企业中,如果要使用所有的数据,通常可以向开发人员或者数据库管理员或者项目经理索取sql文件,只要执行sql文件,就可以导入项目中的所有数据,然后就可以开展测试。

--------------------------------------------------
数据查询:

准备工作:
create database d;
导入sql文件;

关于导入的表及其字段的说明(拼音首字母):

xsb——学生表

xh 学号    ——主键
    xm 姓名
    xb 性别
    jg 籍贯
    nl 年龄
    bj 班级
    sfzh 身份证号
    zcrq 注册日期

kcb——课程表

kch 课程号 ——主键
    kcm 课程名字

cjb——成绩表

kch 课程号 ——外键 
    xh  学号   ——外键
    cj  成绩

注解:
需求:
成绩表里的kch必须参照课程表里的kch才有意义;
成绩表里的xh必须参照学生表里的xh才有意义。
解决办法:通过主外键关联。

一旦在cjb里添加了外键,那么在往成绩表里插入数据的时候,它就会去kcb和xsb里去看是否有对应的课程号和学号,如果没有,拒绝录入,并且给出错误提示信息。

#主外键关联示例
create table student(
    id int primary key,
    name varchar(20)
);
insert into student(id,name) values(1,'zs');
#关联的表:数学成绩表
create table mathgrade(
    id int primary key,
    grade int,
    constraint fk_mg_id foreign key(id) references student(id) #外键约束,有一个参照关系
);
insert into mathgrade(id,grade) values(1,88);#成功
insert into mathgrade(id,grade) values(2,88);#失败

----------------------------------------------
数据查询操作:

(1)简单查询:

语法:
select *|字段1,字段2,……字段n 
from 表名;

解释:从表中选取特定字段或所有字段(*)

eg:

——查询学生表所有字段信息:select * from xsb;
——查询学生表里的学号和姓名:select xh,xm from xsb;

(2)条件查询:

select *|字段1,字段2,……字段n 
from 表名
[where 查询条件];

解释:
select子句的本质是过滤出满足条件的列/字段;
from子句确定所要查询的数据来自于哪些表;
where子句的本质是过滤出满足条件的行/记录。

eg:
——查询张三的全部信息
select * from xsb where xm='张三';

——查询年龄大于20岁的学生信息
select * from xsb where nl>20;
——查询年龄大于等于20岁的学生信息
select * from xsb where nl>=20;

条件查询还支持多条件:多条件常用的三个逻辑符:

与:并且的意思——and
或:或者的意思——or
非:取反的意思——not

——查询学员张三或李四的信息:

#或者张三或者李四
select * from xsb where xm='张三' or xm='李四';
#既是张三又是李四
select * from xsb where xm='张三' and xm='李四';#没有满足条件的记录

——查询除了张三以外的学员的信息:
select * from xsb where not xm='张三';

——查询既不是张三也不是李四的学员信息:
select * from xsb where not (xm='张三' or xm='李四');

条件查询还支持模糊查询:

——查询姓张的学员信息

select * from xsb where xm like '张%';

select * from xsb where xm like '张_';

注解:模糊查询里常用的通配符:
——%:表示此处有0个或1个或多个字符
——_:表示此处有1个字符

条件查询还支持集合操作:
in 在……里面,任取其一
not in 不在……里面

——查询籍贯是北京的或者山东的或者上海的学生信息

select * from xsb where jg in('北京','山东','上海');
等价于
select * from xsb where jg='北京' or jg='山东' or jg='上海';

——查询除了北京山东和上海的学员信息

select * from xsb where jg not in('北京','山东','上海');

条件查询还支持空值查询:
is null :是空值
is not null:不是空值

——查询没有成绩(成绩为空值)的学生学号

select xh from cjb where cj is null;

条件查询支持范围查询:between 最小值 and 最大值

——查询18岁到21岁之间的学员信息(包含了18岁和21岁)
select * from xsb where nl between 18 and 21;

等价于:

select * from xsb where nl>=18 and nl<=21;

--------------------------------------------------
(3)排序显示

语法:

select *|字段1,字段2,……字段n 
from 表名
[where 查询条件]
[order by 字段 asc|desc];

解释:asc:升序,desc:降序

——按成绩排序

select * from cjb order by cj asc;#升序

select * from cjb order by cj desc;#降序

(4)聚合函数查询

聚合函数一般用于分组统计。

常见的聚合函数有:

count()——统计个数
avg()——求平均值
sum()——求和
max()——求最大值
min()——求最小值

——查询学生表里有多少个学生

select count(*) from xsb;

——查询001号学员的平均成绩,最大成绩,最小成绩,成绩总分

select avg(cj),max(cj),min(cj),sum(cj) from cjb where xh='001';

(5)分组查询

语法:
select *|字段1,字段2,……字段n 
from 表名
[where 查询条件]
[group by 分组字段]
[having 过滤条件]
[order by 字段 asc|desc];

注解:
group by子句:按某个字段做分组
having子句:对分组后的数据做进一步的过滤
where子句:对分组前的数据做过滤

——查询每个学员的总成绩

select xh,sum(cj) from cjb group by xh;

------------------------------------------------------

数据的修改语法:

update 表名 set 修改的内容 [条件];

解释:如果不跟条件,那么表里所有记录都会修改,如果跟了条件,那么只有满足条件的记录会被修改。

——将成绩表里所有人的成绩减少2分:
update cjb set cj=cj-2;
——将成绩表里001的成绩减少2分
update cjb set cj=cj-2 where xh='001';

-----------------------------------------

数据的删除:

语法:

delete from 表名 [条件];

解释:如果不跟条件,那么删除表里所有数据(保留表结构),如果跟条件,就会删除满足条件的记录。

——删除001号学员的信息

delete from xsb where xh='001';

——删除所有学员的信息

delete from xsb;

------------------------------------------------------
MySQL——》典型的关系型数据库——》关系型数据库使用SQL来做数据库的管理——》SQL:结构化的查询语言——》单词+语法规则。

回顾:
DML:数据操作语言:
    insert:插入
    update:更新
    delete:删除
DQL:数据查询语言
    单表查询

语法:
select *|字段1,字段2,……字段n 
from 表名
[where 查询条件]
[group by 分组字段]
[having 过滤条件]
[order by 字段 asc|desc];

注解:

select子句:过滤满足条件的列(字段);——5
from子句:确定数据来自于哪些表;   ——1
where子句:过滤满足条件的行(记录)——分组之前的过滤;——2
group by子句:按字段分组  ——3
having子句:对分组之后的数据做进一步的过滤; ——4
order by子句:对查询的数据进行排序显示  ——6

补充知识点:

(1)排序显示:除了单字段排序以外,还有多字段排序。多字段排序指的是:order by后面可以跟多个字段。表示的含义是:如果第一个字段取值相同,那么就按第二个字段排序,如果第一个字段取值不同,会忽略判断第二个字段。以此类推。。。

例如:将学生表的所有信息按年龄从大到小排序,如果年龄相同,按学号从小到大排序。

select * from xsb order by nl desc,xh asc;

(2)分组之后的进一步过滤——having:

例如:查询有两门及其以上课程不及格的学生的学号

思考1:如何查询课程不及格的学生的学号?
select xh
from cjb
where cj<60;

思考2:如何加上限定条件两门及其以上?——》按xh分组,统计个数,个数>1的记录
select xh
from cjb
where cj<60
group by xh
having count(*)>1;

(3)多字段更新

语法:update 表名 set 修改的内容 [where 更新条件];

例如:将王欣的年龄更新为19,性别更新为男

update xsb set nl=19,xb='男' where xm='王欣';

(4)删除:

删除某一个数据——》update xx set y=null where z=10;
删除某一列数据(包括表头)——》alter 
删除某一列(不包括表头)——》update xx set y=null
删除所有的行(保留表结构)——》delete from xx;
删除特定的行(保留表结构)——》delete from xx where ...
删除所有的行(包括表结构)——》drop table 表名;

-------------------------------------------------------

多表查询
(1)子查询——查询嵌套——》查询里面嵌套了小的查询

引入:

示例1:查询选修了java课程的全部学生的总成绩

分析:
题目里涉及的数据来自于多张表
我们找到的关联关系是:
1)可以在课程表里根据java课程找到对应的课程号
select kch from kcb where kcm='java语言';
2)可以在成绩表里根据课程号可以找到对应的成绩
select cj from cjb where kch=(select kch from kcb where kcm='java语言');
3)最后使用sum()函数求和。
select sum(cj) from cjb where kch=(select kch from kcb where kcm='java语言');

示例2:查询1班叫张三的同学的java语言的成绩

分析:
题目里涉及的数据来自于三张表:xsb kcb cjb

我们找到的关联关系是:

1)如果要查询成绩,那么如果能确定它所对应的学号和课程号,那么就可以查询对对应的成绩;——》2)确定学号和课程号——》3)学号可以在学生表通过“1班张三”来确定;课程号可以在课程表通过“java语言”来确定。

1)确定1班张三对应的学号;
select xh from xsb where bj='1班' and xm='张三';
2)确定java语言对应的课程号;
select kch from kcb where kcm='java语言';
3)在成绩表里查询该成绩
select cj from cjb
where xh=(select xh from xsb where bj='1班' and xm='张三')
and kch=(select kch from kcb where kcm='java语言');

(2)关联查询——将多张表联接成一张大的表,然后从表中查询特定的数据

引入:

示例:查询张三同学的各科成绩,要求显示的字段有姓名、课程号和成绩。

分析:姓名——》来自于xsb;课程号和成绩——》来自于cjb——》需求:希望在查询结果里,不在一张表的字段也能在一起显示——》关联查询可以解决这个问题。

关联查询:将两张及其以上的表合并成一张大的表,然后从这张大的表里过滤出满足需求的数据。

表之间如何合并?——》笛卡尔积运算

笛卡尔积运算:将两张表里任意两个记录(两行)组合在一起形成新的记录,最终形成一张大的表。

a:3行2列

b:2行3列

做笛卡尔积运算生成的表:6行5列——》2*3行(2+3)列

笛卡尔积的SQL语法实现:

select * from xsb,cjb;——》132行11列
xsb——》11行8列
cjb——》12行3列

笛卡尔积运算会产生没有意义的垃圾数据(例如,会将张三(001号)的信息跟002号的成绩关联在一行)——》如何过滤掉这些垃圾数据呢?——》通过添加关联条件来消除笛卡尔积产生的垃圾数据。——》如何寻找关联条件呢?——》分析:我们希望张三的信息连接的是张三的各科成绩,所以我们可以通过让学生表的学号跟成绩表的学号相等这个条件来过滤垃圾数据。——》select * from xsb,cjb where xsb.xh=cjb.xh;

回到例题上,查询张三同学的各科成绩,要求显示的字段有姓名、课程号和成绩。

select xm,kch,cj
from xsb,cjb
where xsb.xh=cjb.xh and xm='张三';

注意:在关联查询里,涉及到同名的字段,一定要加上表名做前缀,否则数据库无法识别它属于哪张表,从而会报错。也可以在关联查询里所有的字段都带上表头:

select xsb.xm,cjb.kch,cjb.cj
from xsb,cjb
where xsb.xh=cjb.xh and xsb.xm='张三';

小结:关联查询——》将多张表合并成一张大的表——》通过笛卡尔积运算——》笛卡尔积运算会产生垃圾数据——》通过添加关联条件进行垃圾数据的消除。
关联查询:

内联接:多表关联的一种,只返回满足关联条件的结果集

外联接:
(1)左外联接:多表关联的一种,指的是除了返回满足关联条件的结果集,还会把左边的那张表完整的展示出来,右边那张表里不满足关联条件的字段位置补空值(null)

(2)右外联接:多表关联的一种,指的是除了返回满足关联条件的结果集,还会把右边的那张表完整的展示出来,左边那张表里不满足关联条件的字段位置补空值(null)

(3)全外联接:多表关联的一种,指的是除了返回满足关联条件的结果集,还会把两边的表完整的展示出来,不满足关联条件的字段位置补空值(null)

示例:查询所有学生的课程和成绩,要求显示学号、姓名、课程号、成绩(没有成绩记录的学员信息也要查询出来)

select xsb.xh,xsb.xm,cjb.kch,cjb.cj
from xsb,cjb
where xsb.xh=cjb.xh;

以上这种查询,没有成绩的学生信息不能查询出来。

可以通过左外联接或者是右外联接来实现查询“所有学生”的信息(不管有没有成绩)

左外联接实现:
select xsb.xh,xsb.xm,cjb.kch,cjb.cj
from xsb left join cjb
on xsb.xh=cjb.xh;

右外联接实现:
select xsb.xh,xsb.xm,cjb.kch,cjb.cj
from cjb right join xsb
on xsb.xh=cjb.xh;

--------------------------------------------------
全外联接:全外联接通常使用full join来实现。然而,MySQL不支持full join,但是在别的数据库比如Oracle中是支持full join的。

那么MySQL是如何实现full join呢?——》通过union集合操作

select xsb.xh,xsb.xm,cjb.kch,cjb.cj
from xsb left join cjb
on xsb.xh=cjb.xh
union
select xsb.xh,xsb.xm,cjb.kch,cjb.cj
from xsb right join cjb
on xsb.xh=cjb.xh;
---------------------------------------------------

补充:

(1)——去重查询——》使用distinct关键字

举例:查询学生表中学生来自的省份(重复的省份只显示一次)

select distinct jg from xsb;

-------------------------------------------------------

回滚:

多表查询:

(1)嵌套查询(子查询)

使用场景:如果给你的查询信息里面涉及了多张表,且所要查询的字段信息只来自于一张表,就可以考虑使用子查询。

(2)关联查询

使用场景:如果给你的查询信息里面涉及了多张表,且需要同时显示多张表里的多个字段信息,就可以考虑使用关联查询

外联接:当给你的查询信息里,涉及到了需要完整的去展示某张表的时候。

扩展:

from a,b——》a表跟b表关联,会将a和b进行合并——》合并的方式是做笛卡尔积运算——》a表的记录和b表的记录两两组合最终生成一张大的表——》笛卡尔积运算会产生没有意义的垃圾数据——》通过添加关联条件的方式来消除垃圾数据。

eg1:两张表的关联——查询学生的学号,名字和成绩。

select xsb.xh,xsb.xm,cjb.cj
from xsb,cjb
where xsb.xh=cjb.xh;

select xsb.xh,xsb.xm,cjb.cj
from xsb inner join cjb
on xsb.xh=cjb.xh;

eg2:三张表的关联——查询学生的学号、姓名、课程名及成绩

分析:查询需求里的数据来自于三张表,xsb,kcb,cjb
from xsb,kcb,cjb——》会做两次笛卡尔积运算——》一次是xsb跟cjb做笛卡尔积运算,还有一次应该是xsb和cjb合并后的那张表跟kcb做笛卡尔积运算

每一次笛卡尔积运算都会产生垃圾数据,都需要添加关联条件来进行垃圾数据的消除
select xsb.xh,xsb.xm,kcb.kcm,cjb.cj
from xsb,kcb,cjb
where xsb.xh=cjb.xh
and kcb.kch=cjb.kch;

也可以写成:

select xsb.xh,xsb.xm,kcb.kcm,cjb.cj
from xsb inner join cjb on xsb.xh=cjb.xh
inner join kcb on kcb.kch=cjb.kch;

-----------------------------------------------------------
eg3:查询java语言课程的学员的名字及成绩

select xsb.xm,cjb.cj
from xsb,cjb
where xsb.xh=cjb.xh
and cjb.kch=(select kch from kcb where kcm='java语言');
----------------------------------------------------------

正则查询:正则表达式查询——》什么是正则表达式?——》正则表达式(regular expression)描述了一种字符串匹配的模式,有点类似于like,但是比like更强大。

学习正则表达式其实就是学习一些匹配符号。

例如:

^代表开头——》^aaa    代表以aaa开头的字符

$代表结尾——》c$    代表以c结尾的字符

[]代表一个范围,在里面任取其一——》[abc]    代表此处要么是a要么b要么c

eg1:

查询名字以L开头的记录

select * from info where name regexp '^l'; (此写法不区分大小写)

select * from info where name regexp binary '^l';(此写法区分大小写)

eg2:

查询名字以c结尾的记录

select * from info where name regexp binary 'c$';

eg3:

查询名字中包含c或者e或者o的记录

select * from info where name regexp '[ceo]';
----------------------------------------------------------------

至此,DDL,DML,DQL相关介绍结束。
MySQL的高级特性(事务、存储过程、触发器)

1.事务(transaction)

(1)什么是事务?

例如:a要给b转100块,本质是对账户的余额字段做更新操作。如下:

update xx set balance=balance-100 where countname='a';
update xx set balance=balance+100 where countname='b';

需求:要求这两个SQL语句要么同时成功要么同时失败,否则将引发纠纷。

在这里转账就是事务。事务指的是一组SQL语句,只允许它们同时成功或同时失败。

(2)事务的4个特性

1)原子性——一个事务中的所有操作,要么全部成功要么全部失败,不会出现中间状态;即将这一组SQL语句看成一个整体,不可分割。
2)隔离性——一个事务在其操作期间,别的事务不可以对其进行干扰。
3)永久性——事务处理结束后,对数据的修改是永久的,即便是系统发生了故障也不会丢失。
4)一致性——在事务开始之前和事务结束之后,数据库的完整性没有被破坏。例如,a+b账户余额一共1万块,那么无论a和b之间进行多少次转账操作(不考虑其他),最终a+b账户余额还应该是1万块。
(3)事务的代码实现

——mysql手动开启事务:start transaction;
——事务提交:commit;
——事务回滚:rollback;(没有提交的事务允许回滚)

(4)事务的示例

数据准备:
create table account(
    id int auto_increment primary key,
    name varchar(50) not null,
    money float
);

insert into account(name,money) values('a',1000),('b',1000);

select * from account;
#如果开启了事务,但是不提交,你所做的数据修改只保存在了客户端 ,没有修改到服务端:
start transaction;
update account set money=money-100 where name='a';
update account set money=money+100 where name='b';

#开启事务并提交,你所做的数据修改就保存到了服务端
start transaction;
update account set money=money-100 where name='a';
update account set money=money+100 where name='b';
commit;

#rollback:在没有提交之前,如果想撤销修改,可以使用rollback,对于已经提交了的,无法rollback;

start transaction;
update account set money=money-100 where name='a';
update account set money=money+100 where name='b';

rollback;

注解:MySQL的默认设置,事务都是自动提交的,即执行mysql语句之后会马上commit,可以使用start transaction显式的开启一个事务,或者执行set auotcommit=0来禁止自动提交。

-----------------------------------------------------------
2.存储过程

(1)需求:比如遇到一些sql语句需要反复使用,每次都要去编写比较耗费精力。比较好的做法是:定义一串代码,给它取个名字,将经常使用的sql语句存放进去,以后需要使用这个sql语句,可以通过名字对它进行调用。

存储过程:将常用的sql语句存放起来,方便以后重复使用。

(2)如何编写存储过程

存储过程定义的语法格式:

delimiter //
create procedure 存储过程的名字([形式参数])
begin
常用的sql语句;
end //
delimiter ;

注解:

delimiter //——将默认的sql的分号分隔改成//分隔
delimiter ;——将//分隔还原成;分隔

存储过程的调用格式:

call 存储过程的名字([实际参数])

(3)示例1

数据准备:

create table student(
    id int primary key auto_increment,
    name varchar(20) not null,
    grade float,
    gender char(2)
);

数据插入:

insert into student(name,grade,gender) 
values('jack',60,'男'),
('rose',80,'女'),
('lucy',100,'女');
创建并调用存储过程:

delimiter //
create procedure x()
begin
    select * from student;
end //
delimiter ;

call x()
(4)示例2

存储过程支持输入参数和输出参数,参数存放在存储过程名字后的小括号中。

需求:用户输入女生,查询的是女生的数量;用户输入男生,查询的是男生的数量。
——即根据不同的输入,得到不同的输出。

定义存储过程:

delimiter //
create procedure y(in s_gender varchar(50),out num int)
begin
    select count(*) into num from student where gender=s_gender;
end //
delimiter ;

注解:
in s_gender varchar(50),out num int——》in后面跟的是输入参数s_gender存放用户输入的内容,out后面跟的是输出参数num存放的是存储过程的结果。

存储过程的调用:

计算女生的数量:

call y('女',@num);
select @num;
select @num as '女生数量'; #给@num去了别名“女生数量”

计算男生的数量:

call y('男',@num);
select @num;

---------------------------------------------------------------
3.触发器

需求:往student表插入数据的时候能够触发另外一个表timelog插入内容。触发的过程就是触发器。
创建触发器的语法:
delimiter //
create trigger 触发器名字 触发的时机 for each row
触发的内容;//
delimiter ;

数据准备,创建timelog表:
写一个触发器实现:当你往student插入数据的时候,它会触发往timelog表插入当前时间。

delimiter //
create trigger z before insert on student
for each row
insert into timelog(savetime) values(now());//
delimiter ;
触发器的效果:

当你执行插入操作:
insert into student(name) values('zhangsan');

它会触发往timelog表里插入当前时间记录:

select * from timelog;
补充1:

查看触发器:show triggers;
删除触发器:drop trigger 触发器的名字;
查看存储过程:show procedure status like '%';
删除存储过程:drop procedure 存储过程的名字;
触发器是在一张表中做操作(插入、修改、删除,不能是查询操作,查询操作无法引发触发)引发另外一张表的操作。
补充2:

1)order by :排序

order by 字段名1 asc/desc, 字段2 asc/desc
说明:
asc:ascend  上升     升序
desc:descend  下降   降序

如果asc和desc都不写,它有一个默认排序,默认是升序。
2)存储在数据库里的数据是区分大小写的,但是sql语句里的关键字、表名、字段名等都是不区分的;

3)select distinct 表示的是:distinct的作用是将重复的记录去掉,只保留一份,所以,指的是行(记录)都不相同
4)主外键关联:

课堂讲解的示例里,主外键关联是通过:同名字段关联(即主键的取名跟外键的取名一样的。),但是需要注意的是,外键和主键的名字并不一定非得一样,也不是说非得在两张表里。

5)聚合函数不允许出现在where子句里。

一万六千字的MySQL数据库操作详细教学,看完别说你不会相关推荐

  1. 三万六千字通关MySQL面试

    本文作者:ThinkWon,感谢提供这么详细的资源. 数据库基础知识 为什么要使用数据库 数据保存在内存 优点:存取速度快 缺点:数据不能永久保存 数据保存在文件 优点:数据永久保存 缺点:1)速度比 ...

  2. [硬核]卷起来!两万六千字总结的JavaWeb核心技术学习笔记

    文章目录 前言 http协议笔记 JavaWEB笔记_1 JavaWEB笔记_2(JSP) JavaWEB笔记_3(web项目) Servlet Tomcat笔记 总结 前言 大家好,我是ChinaM ...

  3. mysql数据库基础知识点总结--看完即入门

    疫情在家,在家简单复习了SQL数据库的基础知识.其实回过头来,当时本科时候学习的时候,还没有多大的感触.现在学习了这么多的语言和结构化知识,再回头来看这门语言,很多东西息息相关.就像是瞬间打通了六脉, ...

  4. 大学毕业论文字数有上限吗,我写了一万六千字,指导老师让我删掉一万字关键第二天就要交,怎么办?...

    毕业论文的字数是有学校规定限制的,一般本科的字数为8000-12000字, 也有一些学校的字数要求是2万以上,不同学校的要求不同,建议你下载下 本校的毕业写作规范,上面会有明细的要求,包括写多少字,查 ...

  5. hashmap取值_一万六千字的HashMap深度剖析

    概论 HashMap 是无论在工作还是面试中都非常常见常考的数据结构.比如 Leetcode 第一题 Two Sum 的某种变种的最优解就是需要用到 HashMap 的,高频考题 LRU Cache ...

  6. MySQL数据库安装教程,看完就会,配图详解!(含数据库安装包)

    安装教程 安装步骤 1.勾选,下一步. 2.勾选下一步(关键选项) 3.点击,等待成功.成功后点击next下一步. 4.点击下一步 5.默认选项,点击下一步. 6.设置密码,确认密码,成功后点击下一步 ...

  7. 三万五千字长文!让你懂透编译原理(六)——第六章 属性文法和语法制导翻译

    三万五千字长文!让你懂透编译原理(六)--第六章 属性文法和语法制导翻译 长文预警 系列文章传送门: 万字长文+独家思维导图!让你懂透编译原理(一)--第一章 引论 万字长文!让你懂透编译原理(二)- ...

  8. 基于Android的漫画阅读器App设计与实现,安卓、MySQL、Java、Andriod Studio,前台用户+后台管理,完美运行,有一万五千字论文。

    基于Android的漫画阅读器App设计与实现,安卓.MySQL.Java.Andriod Studio,前台用户+后台管理,完美运行,有一万五千字论文. 用户模块功能: 引导页:首先进入APP之后会 ...

  9. 《程序员修炼之道:从小工到专家》六千字读后总结

    <程序员修炼之道:从小工到专家>六千字读后总结 读完这本书,其实花的时间并不多,因为我自己有些基本的认知.这里主要是记录了一下当时的思考和总结,仅是我个人思考与经验. 这本书和极客时间的& ...

最新文章

  1. 常见的IaaS安全问题与缓解方法
  2. 虚拟串口最大传输速率_【干货】详解RS232、RS485、RS422、串口amp;amp;握手
  3. Scrapy学习教程
  4. 顺序三元组 java_三元组顺序结构实现稀疏矩阵相加,行序优先(Java语言描述)
  5. SpringCloud导学
  6. 某一个接口403 其他接口可以调通_设计模式HR:不会设计模式,你来面什么试?你以为设计模式只有23种?(真正的入门到精通可以用到入土)...
  7. Android中dp与px互转的方法
  8. 盘点中兴通讯强悍的战斗力
  9. android使用lombok_Android Studio 使用Lombok
  10. kafka原理_Kafka 架构原理,也就这么回事
  11. centos7上安装nodejs
  12. 115网盘资源下载到群晖
  13. 软件项目管理大作业:项目内容介绍
  14. Re: 一个公司如何才能留住员工呢?
  15. 如何上色?怎样才能配出好看的颜色?
  16. linux双显卡配置_linux双显卡配置 linux网络配置
  17. linux手动连接网络打印机驱动_中兴新支点Linux操作系统添加网络打印机的方法...
  18. 【物联网设计记录】基于机智云云平台的Wi-Fi控制开发板
  19. Android 音视频深入 十八 FFmpeg播放视频,有声音(附源码下载)
  20. ​ 众至科技数据防泄露系统,保护企业办公核心数据

热门文章

  1. 前端基建——前端团队技术构建方向指引
  2. Postgre SQL 简介
  3. 算法——最优解之动态规划
  4. linux内核cpu负载计算,Load和CPU利用率是如何算出来的
  5. 手把手教你,嘴对嘴传达------Apache(安全优化防盗链、隐藏版本信息)
  6. Router OS 安装+配置软路由
  7. 我也 30 了,来谈谈程序员的迷茫年龄
  8. 独家分享,一位刚从新加坡回国的朋友最近半年在上海找工作的体验
  9. 篇章级的事件抽取——阅读笔记
  10. DataV(对象类)展示8 ~ 20 °C