MySQL数据库(进阶部分)

一、数据库函数

1.合计/统计函数(count)

count()函数,返回行的总数

#统计函数
#统计表中一共有多少条数据
select count(*) from student 

#统计表中数学大于80分的总人数
select count(*) AS '优秀人数' from student where math > 80

#统计总分大于250分的总人数
select count(*) as '优秀人数' from student where (math + chinese + english) > 200

#count(*) 和 count(列) 的区别
#count(*)会统计总人数,count(列)与count(*)相仿,但是不会统计null
insert into student values (null,90,90,90)
select count(*) from student
select count(sname) from student

2.sum函数(总值函数)

#获得一个班级math的总值
select sum(math) from student

#统计一个班级各科的总成绩和所有成绩总和
select sum(math) as '数学',sum(chinese) as '语文',sum(english) as '英语',sum(math+chinese+english) as '总和' from student

#不使用avg获得班级语文平均分
select sum(chinese) / count(chinese) as '语文平均分' from student

3.avg函数(平均值函数)

#求一个班的数学平均分
select avg(math) from student

#求一个班的总分平均分
select avg(math + chinese + english) from student

4.max和min函数(最大最小值函数)

#求班级最高分和最低分
select max(math + chinese + english) as '最高分',min(math + chinese + english) as '最低分' from student

5.分组group by与筛选 having

(1)编撰测试表

#创建用于测试的表
CREATE TABLE dept( /*部门表*/
deptno MEDIUMINT UNSIGNED NOT NULL DEFAULT 0, dname VARCHAR(20) NOT NULL DEFAULT "", loc VARCHAR(13) NOT NULL DEFAULT ""
)

select * from dept

INSERT INTO dept VALUES(10, 'ACCOUNTING', 'NEW YORK'), (20, 'RESEARCH', 'DALLAS'), (30, 'SALES', 'CHICAGO'), (40, 'OPERATIONS', 'BOSTON');
-- 员工表
CREATE TABLE emp
(empno MEDIUMINT UNSIGNED NOT NULL DEFAULT 0, /*编号*/
ename VARCHAR(20) NOT NULL DEFAULT "", /*名字*/
job VARCHAR(9) NOT NULL DEFAULT "",/*工作*/
mgr MEDIUMINT UNSIGNED ,/*上级编号*/
hiredate DATE NOT NULL,/*入职时间*/
sal DECIMAL(7,2) NOT NULL,/*薪水*/
comm DECIMAL(7,2) ,/*红利 奖金*/
deptno MEDIUMINT UNSIGNED NOT NULL DEFAULT 0 /*部门编号*/
);

INSERT INTO emp VALUES(7369, 'SMITH', 'CLERK', 7902, '1990-12-17', 800.00,NULL , 20), (7499, 'ALLEN', 'SALESMAN', 7698, '1991-2-20', 1600.00, 300.00, 30), (7521, 'WARD', 'SALESMAN', 7698, '1991-2-22', 1250.00, 500.00, 30), (7566, 'JONES', 'MANAGER', 7839, '1991-4-2', 2975.00,NULL,20), (7654, 'MARTIN', 'SALESMAN', 7698, '1991-9-28',1250.00,1400.00,30),(7698, 'BLAKE','MANAGER', 7839,'1991-5-1', 2850.00,NULL,30), (7782, 'CLARK','MANAGER', 7839, '1991-6-9',2450.00,NULL,10), (7788, 'SCOTT','ANALYST',7566, '1997-4-19',3000.00,NULL,20), (7839, 'KING','PRESIDENT',NULL,'1991-11-17',5000.00,NULL,10), (7844, 'TURNER', 'SALESMAN',7698, '1991-9-8', 1500.00, NULL,30), (7900, 'JAMES','CLERK',7698, '1991-12-3',950.00,NULL,30), (7902, 'FORD', 'ANALYST',7566,'1991-12-3',3000.00, NULL,20), (7934,'MILLER','CLERK',7782,'1992-1-23', 1300.00, NULL,10)

select * from emp

-- 工资级别
#工资级别表
CREATE TABLE salgrade
(
grade MEDIUMINT UNSIGNED NOT NULL DEFAULT 0, /*工资级别*/
losal DECIMAL(17,2) NOT NULL, /* 该级别的最低工资 */
hisal DECIMAL(17,2) NOT NULL /* 该级别的最高工资*/
);

INSERT INTO salgrade VALUES (1,700,1200);
INSERT INTO salgrade VALUES (2,1201,1400);
INSERT INTO salgrade VALUES (3,1401,2000);
INSERT INTO salgrade VALUES (4,2001,3000);
INSERT INTO salgrade VALUES (5,3001,9999);

select * from salgrade
select * from emp
select * from dept

(2)group by的使用 

#测试表已经实现,使用group by进行分组,having进行筛选
#显示每个部门的平均、最低和最高工资
#使用科学记数法保留小数数据,使用FORMAT关键字,format(x,d)x为该小数,d为要保留的位数
select deptno,format(avg(sal),2) as '平均工资' ,format(min(sal),2) as '最低工资',max(sal) as '最高工资'
from emp group by deptno

#显示平均工资低于2000的部门号和平均工资
SELECT format(avg(sal),2) AS '平均工资',deptno AS '部门' 
FROM emp GROUP BY deptno 
HAVING AVG(sal) < 2000

6.字符串相关函数

7.数字相关函数 

8.时间与日期相关函数

9.加密与系统函数 

#加密函数
#查看用户,DUAL属于模拟表,在不需要from后条件时,又要保证语句的正确性,加上DUAL
select user() from DUAL

#查看数据库信息,会得到数据库名称
select database()

#MD5(STR)加密,给字符串一个MD5的密码值
SELECT MD5('我的马') FROM DUAL

#PASSWORD(STR) 从原文密码中计算一个密码字符串
DROP TABLE `lock`
CREATE TABLE `lock` (
	uesrname VARCHAR(10),
	pwd CHAR(32)
)

insert into `lock` values('aaa',md5('tan'))

select * from `lock`

 10.流程控制函数

#使用流程控制函数,类似于java中的逻辑运算符
#IF与IFNULL的使用
SELECT ename,IF(comm IS NULL,0.0,comm) FROM emp
SELECT ename,IFNULL(0.0,comm) from emp

SELECT * FROM emp

#SELECT CASE WHEN THEN的使用
SELECT ename,(SELECT CASE
 WHEN job = 'CLERK' THEN '职员'
 WHEN job = 'SALESMAN' THEN '售货员'
 WHEN job = 'MANAGER' THEN '经理'
 WHEN job = 'PRESIDENT' THEN '老板' 
 ELSE job	END)
 FROM emp

 二、MYSQL表查询

1.表查询-加强

(1)回顾like和order by

#查找1992年1月1日后入职的员工
select * from emp where hiredate > '1992-1-1'

#like关键字的使用
#%表示0到多个字符  _表示一个字符
#显示首字符为S的员工姓名与工资
select ename,sal from emp where ename like 'S%'
#显示第三个字符为O的员工姓名和工资
select ename,sal from emp where ename like '__O%'

#显示没有上级的雇员情况
select * from emp where mgr is null

#使用order by子句
#按照工资的从高到低的顺序显示员工信息
select * from emp order by sal desc
#按照部门升序和员工工资降序排序
select * from emp order by deptno,sal desc

(2)分页查询

#分页查询
#使用select...limit start,end  从第start+1行开始取,取end行
#按照一页三条数据,写出前三页
select * from emp order by empno limit 0,3
select * from emp order by empno limit 3,3
select * from emp order by empno limit 6,3

(3)使用分组函数和分组子句

select count(job),job,format(avg(sal),2) from emp group by job 
select count(*) as '总员工数',count(comm) as '补贴人数' from emp
#distinct去重复值
select count(distinct mgr) as '管理者总数' from emp
select max(sal) - min(sal) as '最大差额' from emp

-- 应用案例:请统计各个部门 group by 的平均工资 avg,
-- 并且是大于 1000 的 having,并且按照平均工资从高到低排序, order by
-- 取出前两行记录 limit 0, 2
select deptno,avg(sal) as 'avg_sal' from emp
	group by deptno
	having (avg_sal > 1000)
	order by avg_sal DESC
	limit 0,2

2.多表查询

注意:多表查询的条件不能少于表的个数-1,否则会出现笛卡尔集

(1)多表查询练习

#多表查询
#查询雇员名,雇员工资以及所对应的部门名称
select ename,sal,dname from emp,dept where emp.deptno = dept.deptno

#显示部门号为10的部门名,员工名和工资
select dname,ename,sal from emp,dept where emp.deptno = dept.deptno and emp.deptno = 10

#显示各个员工的姓名,工资和工资级别
select ename,sal,grade from emp,salgrade where sal > losal and sal < hisal

(2)自连接

#自连接
#显示员工名字和上级名字
#自连接意味着把一张表当两张表使用,在from后将这张表赋予两个变量名,一个为worker,一个为boss
select worker.ename as '员工名称', boss.ename as '上司名称' from emp worker,emp boss where worker.mgr = boss.empno

3.子查询

(1)单行子查询

#返回与SMITH同一个部门的所有员工
/*
1. 先查询到 SMITH 的部门号得到
2. 把上面的 select 语句当做一个子查询来使用
*/
select * from emp where deptno = 
(select deptno from emp where ename = 'SMITH')

(2)多行子查询

#查询和部门10的工作相同的员工的名字、岗位、工资、部门号,但是不包括部门10
#<>这是不等号,类似于!=
select ename,job,sal,deptno from emp where job in 
(select distinct job from emp where deptno = 10) and deptno <> 10

(3)all与any的使用

#all与any的使用
#显示工资比部门30的所有员工的工资高的员工的姓名、工资和部门号
select ename,sal,deptno from emp where sal > all(select sal from emp where deptno = 30)

#显示工资比部门 30 的其中一个员工的工资高的员工的姓名、工资和部门号
select ename,sal,deptno from emp where sal > any(select sal from emp where deptno = 30)

(4)多列子查询

#查询与 allen 的部门和岗位完全相同的所有雇员(并且不含 allen 本人
select * from emp where deptno = 
(select deptno from emp where ename = 'ALLEN')
and job = (select job from emp where ename = 'ALLEN')
and ename <> 'ALLEN'
#简化版
select * from emp where (deptno,job) = 
(select deptno,job from emp where ename = 'ALLEN')
and ename <> 'ALLEN'

(5)在from子句中使用子查询

#查询每个部门工资高于该部门平均工资的员工信息
#可以把查询到的含有多个数据的结果当做一张表
select ename,sal,temp.avg_sal,emp.deptno 
from emp,(select deptno,avg(sal) as avg_sal 
from emp 
group by deptno
)temp 
where emp.deptno = temp.deptno and emp.sal > temp.avg_sal

三、表复制

1.自我表复制(蠕虫复制)

#表复制
#为了对某个 sql 语句进行效率测试,我们需要海量数据时,可以使用此法为表创建海量数据
CREATE TABLE my_tab01
( id INT, `name` VARCHAR(32), sal DOUBLE, job VARCHAR(32), deptno INT);
DESC my_tab01
SELECT * FROM my_tab01;

#使用插入其他表中对应数据的方法进行复制
insert into my_tab01 (id,`name`,sal,job,deptno) select empno,ename,sal,job,deptno from emp

#表的自我复制,把表中的数据重新插入表中
insert into my_tab01 select * from my_tab01

select * from emp

2.删除表中重复项

#删除表中的重复项
#使用like可以复制表结构
create table tab02 like emp

insert into tab02 
	select * from emp

select * from tab02

select count(*) from tab02
#考虑去重 my_tab02 的记录
/*
思路
(1) 先创建一张临时表 my_tmp , 该表的结构和 my_tab02 一样
(2) 把 my_tmp 的记录 通过 distinct 关键字 处理后 把记录复制到 my_tmp
(3) 清除掉 my_tab02 记录
(4) 把 my_tmp 表的记录复制到 my_tab02
(5) drop 掉 临时表 my_tmp
*/
create table temp_01 like tab02

insert into temp_01 select distinct * from tab02

#使用delete清除表中数据,drop是删除表
delete from tab02

insert into tab02 select * from temp_01

#删除临时表
drop table temp_01
select * from temp_01

四、合并查询

#合并查询
#使用union,union all在两个select语句之间,可以将两个查询结果放在同一个结果中显示
#区别:union可以去重,union all不会去重
select * from emp where sal > 2500
union select * from emp where job = 'MANAGER'

select * from emp where sal > 2500
union all select * from emp where job = 'MANAGER'

五、外连接

#外连接
#列出部门名称和这些部门的员工名称和工作,同时显示出那些没有员工的部门
select * from emp
select * from dept

select dept.dname,emp.ename,emp.job from emp,dept where emp.deptno = dept.deptno order by dname

#左外连接,在from后使用 表一 left join 表二 on 条件,表一就是左表
#使用on后就可以不用使用where
select dept.dname,emp.ename,emp.job from dept left join emp on emp.deptno = dept.deptno order by dname
#右外连接,在from后使用 表一 right join 表二 on 条件,表二就是右表
select dept.dname,emp.ename,emp.job from emp right join dept on emp.deptno = dept.deptno order by dname
#创建stu表与exam表并存入信息
CREATE TABLE stu (
id INT, `name` VARCHAR(32));
INSERT INTO stu VALUES(1, 'jack'),(2,'tom'),(3, 'kity'),(4, 'nono');
SELECT * FROM stu;
CREATE TABLE exam(
id INT, grade INT);
INSERT INTO exam VALUES(1, 56),(2,76),(11, 8);
SELECT * FROM exam;

#左外连接
#显示所有人的成绩,如果没有成绩,也要显示该人的姓名和 id 号,成绩显示为空
select grade,`name`,stu.id from stu left join exam on stu.id = exam.id
#右外连接
#显示所有成绩,如果没有名字匹配,显示空
select grade,`name`,stu.id from stu right join exam on stu.id = exam.id

六、约束

 1.primary key主键的使用

#约束
#主键的使用
#创建主键表
create table key_01(
	id INT primary key,
	kname VARCHAR(32)
)

SELECT * FROM key_01

#主键特点
#主键的值不能重复且非空
insert into key_01 values(0,'kai');
insert into key_01 values(null,'kai');-- 运行失败
insert into key_01 values(0,'bob');-- 运行失败

#主键只能有一个,但是可以是复合主键
create table key_02(
	id INT primary key,
	`name` VARCHAR(32) primary key
) -- 运行失败

#复合主键,以如下方式即可运行成功,且是复合主键
create table key_02(
	id INT,
	`name` VARCHAR(32),
	PRIMARY KEY(id,`name`)
)

#主键的注入方式如上两种,一种是写在列名之后,一种是在()的最后写上primary key(),括号中标注要设置为主键的列名

 2.非空not null

同样是在创建表的列名的后面标注该规则

#非空
create table key_03(
	id int not null,
	`name` varchar(32)
)

insert into key_03 values (NULL,'sss') -- 运行失败

3.unique唯一

定义了unique之后,该列的字段是不能重复的,如果该列没有定义not null,那么是可以存在多个null值的,且一个表中可以存在多个unique值

#unique唯一
create table key_04(
	id int unique,
	`name` varchar(32)
)

insert into key_04 values(0,'ss') -- 运行成功
insert into key_04 values(0,'ss') -- 运行失败
insert into key_04 values(null,'ss')-- 运行成功
insert into key_04 values(null,'ss')-- 运行成功

4.foreign key(外键)

#外键
#创建表一
create table tab_1(
	id int primary key,
	`name` varchar(32)
)
#创建外键表二
#要作为外键连接的字段连接到的字段必须是主键或者unique
create table tab_2(
	id int primary key,
	`name` varchar(32),
	id_2 int,
	foreign key (id_2) references tab_1(id)
)

desc tab_2

#为外键的表插入值时,外键所对应的字段的值必须存在主表对应的值,否则插入失败
insert into tab_1 values(1,'luolin'),(2,'sky'),(3,'hukong');
insert into tab_2 values(1,'luoxiangtian',1),(2,'linhaoran',2),(3,'huyue',3)
insert into tab_2 values(4,'jiase',4)  -- 运行失败

#存在外键,不能随意删除数据
delete from tab_1 where id = 1

#没有设置not null,则可以插入null值
insert into tab_2 values(4,'jiase',null)

5.check

check仅在oracle和sql server中生效,仅作为了解

#一旦被设置check校准,那插入数据时,必须满足check条件,否则就会插入失败
CREATE TABLE t23 (
id INT PRIMARY KEY, `name` VARCHAR(32) , sex VARCHAR(6) CHECK (sex IN('man','woman')), sal DOUBLE CHECK ( sal > 1000 AND sal < 2000)
);

6.练习

create table goods(
	goods_id int primary key,
	goods_name varchar(32),
	unitprice float check(unitprice > 1.0 and unitprice < 9999.99),
	category varchar(32),
	provider varchar(32)
)

create table customer(
	customer_id int primary key,
	`name` varchar(32) not null,
	address varchar(64),
	email varchar(32) unique,
	sex char(2) check (sec in('男','女')),
	card_Id char(18)
)

create table purchase (
	order_id int primary key,
	customer_id int,
	goods_id int,
	num int,
	foreign key (customer_id) REFERENCES customer(customer_id),
	foreign key (goods_id) REFERENCES goods(goods_id)
)

七、自增长

#自增长
#使用auto_increment 实现自增长,默认值为1
#一般与主键一块使用,且默认是int类型,如果不使用主键,也可以使用unique
create table temp00(
	id int primary key auto_increment,
	`name` varchar(32)
)
#使用了自增长就可以传入null值,他会自动赋予新值,如果传入固定值,那么会代替自增长值,且下次自增长会从传入的值这开始
insert into temp00 values (null,'sa')
insert into temp00 values (9,'sa')

#修改自增长值的方法
#直接在创建表的时候使用auto_increment = num ,num为要修改的自增长值
#或者使用alter
ALTER TABLE temp00 auto_increment = 2

八、索引

1.索引介绍

索引是用来提高数据库性能最物美价廉的东西,不用加内存,不用改程序,不用调sql,极大地提高了查询速度

2.创建海量表的方式

-- 创建测试数据库 tmp
CREATE DATABASE tmp;
CREATE TABLE dept( /*部门表*/
deptno MEDIUMINT UNSIGNED NOT NULL DEFAULT 0, dname VARCHAR(20) NOT NULL DEFAULT "", loc VARCHAR(13) NOT NULL DEFAULT ""
) ;
#创建表 EMP 雇员
CREATE TABLE emp
(empno MEDIUMINT UNSIGNED NOT NULL DEFAULT 0, /*编号*/
ename VARCHAR(20) NOT NULL DEFAULT "", /*名字*/
job VARCHAR(9) NOT NULL DEFAULT "",/*工作*/
mgr MEDIUMINT UNSIGNED NOT NULL DEFAULT 0,/*上级编号*/
hiredate DATE NOT NULL,/*入职时间*/
sal DECIMAL(7,2) NOT NULL,/*薪水*/
comm DECIMAL(7,2) NOT NULL,/*红利*/
deptno MEDIUMINT UNSIGNED NOT NULL DEFAULT 0 /*部门编号*/
) ;
#工资级别表
CREATE TABLE salgrade
(
grade MEDIUMINT UNSIGNED NOT NULL DEFAULT 0, losal DECIMAL(17,2) NOT NULL, hisal DECIMAL(17,2) NOT NULL
);
#测试数据
INSERT INTO salgrade VALUES (1,700,1200);
INSERT INTO salgrade VALUES (2,1201,1400);
INSERT INTO salgrade VALUES (3,1401,2000);
INSERT INTO salgrade VALUES (4,2001,3000);
INSERT INTO salgrade VALUES (5,3001,9999);
DELIMITER $$
#创建一个函数,名字 rand_string,可以随机返回我指定的个数字符串
CREATE FUNCTION rand_string(n INT)
RETURNS VARCHAR(255) #该函数会返回一个字符串
BEGIN
#定义了一个变量 chars_str, 类型 varchar(100)
#默认给 chars_str 初始值 'abcdefghijklmnopqrstuvwxyzABCDEFJHIJKLMNOPQRSTUVWXYZ' DECLARE chars_str VARCHAR(100) DEFAULT
'abcdefghijklmnopqrstuvwxyzABCDEFJHIJKLMNOPQRSTUVWXYZ';
DECLARE return_str VARCHAR(255) DEFAULT '';
DECLARE i INT DEFAULT 0;
WHILE i < n DO
# concat 函数 : 连接函数 mysql 函数
SET return_str =CONCAT(return_str,SUBSTRING(chars_str,FLOOR(1+RAND()*52),1));
SET i = i + 1;
END WHILE;
RETURN return_str;
END $$
#这里我们又自定了一个函数,返回一个随机的部门号
CREATE FUNCTION rand_num( )
RETURNS INT(5)
BEGIN
DECLARE i INT DEFAULT 0;
SET i = FLOOR(10+RAND()*500);
RETURN i;
END $$
#创建一个存储过程, 可以添加雇员
CREATE PROCEDURE insert_emp(IN START INT(10),IN max_num INT(10))
BEGIN
DECLARE i INT DEFAULT 0;
#set autocommit =0 把 autocommit 设置成 0
#autocommit = 0 含义: 不要自动提交
SET autocommit = 0; #默认不提交 sql 语句
REPEAT
SET i = i + 1;
#通过前面写的函数随机产生字符串和部门编号,然后加入到 emp 表
INSERT INTO emp VALUES ((START+i) ,rand_string(6),'SALESMAN',0001,CURDATE(),2000,400,rand_num());
UNTIL i = max_num
END REPEAT;
#commit 整体提交所有 sql 语句,提高效率
COMMIT;
END $$
#添加 8000000 数据
CALL insert_emp(100001,8000000)$$
#命令结束符,再重新设置为;
DELIMITER ;
SELECT COUNT(*) FROM emp;

-- 在没有创建索引时,我们的查询一条记录
SELECT *
FROM emp
WHERE empno = 1234567;
-- 使用索引来优化一下, 体验索引的牛
-- 在没有创建索引前 , emp.ibd 文件大小 是 524m
-- 创建索引后 emp.ibd 文件大小 是 655m [索引本身也会占用空间.]
-- 创建 ename 列索引,emp.ibd 文件大小 是 827m
-- empno_index 索引名称
-- ON emp (empno) : 表示在 emp 表的 empno 列创建索引
CREATE INDEX empno_index ON emp (empno);
-- 创建索引后, 查询的速度如何
SELECT *
FROM emp
WHERE empno = 1234578; -- 0.003s 原来是 4.5s
-- 创建索引后,只对创建了索引的列有效
SELECT *
FROM emp
WHERE ename = 'PjDlwy'; -- 没有在 ename 创建索引时,时间 4.7s
CREATE INDEX ename_index ON emp (ename); -- 在 ename 上创建索

3.创建索引与分类

CREATE INDEX ename_index ON emp (ename) -- 在 ename 上创建索

#主键索引与unique索引
#主键与unique本身就是索引的一种,因为他们不重复,都可以加快查找速度
#一般这两种索引在创建表的时候创建,也可以使用alter进行创建
#添加索引
create table index01(
	id int primary key,
	`name` varchar(32)
)

#查看表中索引
show index from index01

#创建唯一索引
create unique index index_id on index01(id)
#创建普通索引
#方式一
create index index_id on index01(id)
#方式二
alter table index01 add index index_id(id)

#删除索引
drop index index_id on index01
#删除主键索引
alter table index_id drop primary key -- 因为主键只有一个,所以直接删除

#查询索引的三种方式
#方式一
show index from index01
#方式二
show indexes from index01
#方式三
show keys from index01

 4.创建索引的练习

#方式一
create table order1(
	id int primary key,
	goods_name varchar(32),
	order_people varchar(32),
	num int
)
#方式二
create table order2(
	id int,
	goods_name varchar(32),
	order_people varchar(32),
	num int
)
alter table order2 add primary key(id)

show keys from order2

#方式一
create table menu1(
	id int unique,
	cook_name varchar(32),
	cooker varchar(32),
	id_card char(18),
	price float
)
#方式二
create table menu2(
	id int,
	cook_name varchar(32),
	cooker varchar(32),
	id_card char(18),
	price float
);
create unique index index_id on menu2(id);

show keys from menu2

#方式一
create table sportman1(
	id int,
	`name` varchar(32),
	long_part varchar(32)
);
create index index_id on sportman1(id);
#方式二
create table sportman2(
	id int,
	`name` varchar(32),
	long_part varchar(32)
);
alter table sportman2 add index index_id(id);

 九、事务

1.事务的特性

    • 原子性:一个事务的操作要么全部成功,要么全部失败
    • 一致性:事务的操作要实现减少多少就要增加多少,举例:如银行转账,A转给B,A转出多少钱,B就一定要收到多少钱
    • 隔离性:事务与事务之间要互不影响
    • 持久性:事务操作提交后的结果要保证永久有效

2.事务的操作 

#事务
create table commit_01(
	id int,
	`name` varchar(32)
)
#开启事务,在开启事务之后的操作,都是可以回滚回当前状态
start TRANSACTION

insert into commit_01 values(1,'sda');
insert into commit_01 values(2,'daw');
#事务回滚,回到最近存档点
ROLLBACK
#提交事务
commit;

 十、事务的隔离级别

 

 

十一、类型和存储引擎

1.基本介绍

2.主要存储引擎或表的类型特点

 3.各引擎特点说明

4.如何选择引擎 

5.修改引擎 

alter table '表名' engine = 引擎名

十二、视图

1.视图使用

视图目的是只显示可以让他人访问的数据,其他数据无法被访问到

#视图
#创建视图
create view my_view as select losal,hisal from salgrade

#查看视图
desc salgrade
select * from my_view
select * from salgrade
#也能对视图进行操作,操作会影响到基表,基表中没有显示的数据会插入默认值
insert into my_view values(702,432)

#查看创建视图
show create view my_view

2.视图细节

3.视图练习 

create view my_view as 
select emp.empno,emp.ename,dept.dname,salgrade.grade 
from emp,dept,salgrade 
where emp.deptno = dept.deptno and emp.sal > salgrade.losal and emp.sal < salgrade.hisal
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值