内置语句
with
创建一个 临时表,当有一部分数据在sql中被频繁用到,可以使用with储存临时数据
比如:select emp_no ,age from ( select * from new_employees limit 20 )as a;
括号内的就是一张临时表,这样创建的效果很差,如果下一条sql语句要使用就得再写一次,这样很麻烦,如果使用with来创建临时表就会便捷很多,
上面的代码创建的临时表只要出了这给sql语句范围会被销毁,当我们再使用这张表就会报错,因为这张表不存在,
with 表格1 as ( select * from new_employees limit 20 ) ( select emp_no ,age ,first_name from 表格1 );
with 表格2 as ( select * from employees limit 20 ) (select emp_no ,null as age ,first_name from 表格2) ;
而使用with创建一个临时表,会在内存申请一块空间进行存储,如果创建很多会造成内存很多被占用,造成mysql运行变慢,sql程序运行结束就消毁。而不使用with创建虽然可以减少内存占用,但是使用范围小,怎么创建临时表要看自己怎么来,
with创建多个临时表
with 表格1 as ( select * from new_employees limit 20 ) , 表格2 as ( select * from employees limit 20 ) ( select emp_no ,age ,first_name from 表格1 ) union all (select emp_no ,null as age ,first_name from 表格2);
instert into select
通过insert语句,将查询到的数据直接写入到目标表格中
前面我们的往表格插入语句是
insert into 表名(字段)values(内容)
表格创建 create table if not exists`学生表格1` ( `id` int auto_increment not null primary key comment '学生id' ,`name` varchar(30) not null default "无名氏" comment '学生姓名' ,`age` int not null comment'学生年龄' ,`date` date comment '学生入校时间' )engine = InnoDB default charset=utf8 comment= '表格1';
insert into select
insert into 学生表格1 ( `id` ,`name` ,`age` ,`date` ) select emp_no ,first_name ,age ,birth_date from new_employees;
注意一下,这个语句只能在一个数据库内进行数据的写入,不能跨数据库
regexp
下面插播一下符号
正则表达式
如果有看过我写过python的正则表达式的博客就会知道
*代表匹配0个或者多个字符
+代表至少匹配1个字符
^以…为开头
& 以…为结尾
. 任意一个字符
[]匹配里面的任意一个等
这里不过多介绍
那怎么在mysql使用正则表达式呢
REGEXP 或 regexp
select * from new_employees where first_name regexp "^G*"; select * from new_employees where first_name regexp "^G*"; select * from new_employees where first_name regexp "G+"; select * from new_employees where first_name regexp "z$"; select * from new_employees where first_name regexp "e|z$";
四则运算
select substring(birth_date,6,2) - month(now()) as 月份 ,substring(birth_date,9,2) - day(now()) as 日期 ,case when substring(birth_date,6,2) - month(now())= 0 and substring(birth_date,9,2) - day(now()) <=7 and substring(birth_date,9,2) - day(now()) >=0 then "符合" else "不符合" end 是否符合 from new_employees;
substring 字符分割
在数据库第十一课有介绍,
MySQL高级
视图
一张虚拟表,不具备数据储存功能,基本表数据发生了改变,视图也会跟着改变。仅仅是SQL查询
语句的结果集。它能够免去每次需要提取该数据的SQL语句查找时间。
视图的用途就是查询。提高数据复用性,提高了数据安全,更加清晰的展示了数据
简单的理解为视图就是查询语句的copy
建表语句查询
show create table 学生表格1;
视图的创建
create view 视图1 as select id ,name ,age from 学生表格1;
如果学生表格1里面 的数据有更改,那么视图1里面的内容也会发生更改,就像软链接
假设屏幕5秒变一次,每变换一次发送一次sql请求,sql语句(还要进行计算等)执行是10秒一次,就会发现 ,请求大于执行,会对服务器造成负担,
使用视图,屏幕发送请求给视图,对计算不沾边,而表格每变化一次,视图就会变化一次,哪怕计算有每隔一段时间执行一次,获取到都是在执行时段的最新数据,
缺点就是如果上一次的sql语句没有执行完,而新一次的sql语句已经开始了,会造成数据的重新计算,
这就需要视图逻辑简单,原数据的更新频率不要太高
事务
例如我需要向张三转账1万块钱。首先,我需要检查自己账户上是否有1万块钱;然后,我的账户会
扣除1万块钱;最后,张三的账户上会增加一万块钱。到此,整个转账过程结束。将分解出来的三个步骤
1.查询
2.扣除自己的钱
3张三的钱增加
必须看作一个整体来执行完成的单位,叫做 事务
四大特性(简称ACID)
原子性(Atomicity)
一个事务必须被视为一个不可分割的最小工作单元,整个事务中的所有操作要么全部提交成功,要么全部失败回滚,对于一个事务来说,不可能只执行其中的一部分操作
一致性(Consistency)
数据库总是从一个状态转换到另一个状态。例如转钱的例子,无论是三步中的哪一个步骤失败,都会在三方显示操作失败。
隔离性(Isolation)
通常来说,一个事务所做的修改在最终提交以前,对其他事务是不可见。
持久性(Durability)
一旦事务提交,则其所做的修改会永久保存到数据库。此时即使系统崩溃,修改的数据也不会丢失。
事务命令
表的引擎类型必须是innodb类型才可以使用事务,show create table table_name; 可以看到表格引擎类型
-- 开启事务 begin; start transaction; -- 提交事务 commit; -- 回滚事务 rollback; -- 执行事务流程 begin; -- 开启事务模式 insert into table_name(name) values('zhouzhou'); -- 此时的数据还没有正式写入表中 commit; -- 执行了提交,新增的数据才正式写入表中 -- 如果发现写入的数据有问题可以将commit换成rollback(回滚),撤销这次写入
注意:
1、修改数据命令会自动的触发事务,包括insert、update、delete
2、SQL语句中,能够手动开启事务的原因是:可以进行多次数据的修改,如果成功一起成功,否则一起
会滚到之前的数据
总结:
本次mysql数据库的介绍到这里了,有不懂的小可爱可以私聊我