mysql进阶3_MySQL进阶

1.视图

概述:视图就相当于一个临时表,但是只定义了对应关系,用这个视图的时候,就会自行执行视图里定义好的sql语句,视图是只能去查原表的数据,不能去修改原表里面的数据的;

视图的增删改查:

1.创建视图:

语法:CREATE VIEW 视图名称 AS SQL语句

示例:

CREATE VIEW v1 AS

SELECT nid, name FROM user

WHERE nid > 3;

2.删除视图:

语法:DROP 视图名称

3.修改视图

语法:ALTER VIEW 视图名称 AS sQL语句

示例:

ALTER VIEW v1 AS

SELECT sex, birthday FROM user

WHERE nid > 1

4.使用视图:

示例:

select nid, name from v1;

2.触发器

概述:对某个表进行【增/删/改】操作的前后如果希望触发某个特定的行为时,可以使用触发器,触发器用于定制用户对表的行进行【增/删/改】前后的行为。

触发器的创建

# 插入前

CREATE TRIGGER tri_before_insert_tb1 BEFORE INSERT ON tb1 FOR EACH ROW

BEGIN

...

END

# 插入后

CREATE TRIGGER tri_after_insert_tb1 AFTER INSERT ON tb1 FOR EACH ROW

BEGIN

...

END

# 删除前

CREATE TRIGGER tri_before_delete_tb1 BEFORE DELETE ON tb1 FOR EACH ROW

BEGIN

...

END

# 删除后

CREATE TRIGGER tri_after_delete_tb1 AFTER DELETE ON tb1 FOR EACH ROW

BEGIN

...

END

# 更新前

CREATE TRIGGER tri_before_update_tb1 BEFORE UPDATE ON tb1 FOR EACH ROW

BEGIN

...

END

# 更新后

CREATE TRIGGER tri_after_update_tb1 AFTER UPDATE ON tb1 FOR EACH ROW

BEGIN

...

END

示例1:

delimiter //

CREATE TRIGGER tri_before_insert_tb1 BEFORE INSERT ON tb1 FOR EACH ROW

BEGIN

IF NEW. NAME == 'alex' THEN

INSERT INTO tb2 (NAME)

VALUES

('aa')

END

END//

delimiter ;

示例2:

delimiter //

CREATE TRIGGER tri_before_insert_tb1 BEFORE INSERT ON tb1 FOR EACH ROW

BEGIN

IF NEW. NAME == 'alex' THEN

INSERT INTO tb2 (NAME)

VALUES

('aa')

END

END//

delimiter ;

注意:delimiter // 把默认以“;”作为结束符改为了以//作为结束符,NEW表示即将插入的数据行,OLD表示即将被删除的数据行

触发器的删除

语法:DROP TRIGGER 触发器的名称;

使用触发器

触发器无法由用户直接调用,而知由于对表的【增/删/改】操作被动引发的

3.存储过程

概述:存储过程是一个SQL语句集合,当主动去调用存储过程时,其中内部的SQL语句会按照逻辑执行

创建存储过程

1.无参数的存储过程

示例:

-- 创建存储过程

delimiter //

create procedure p1()

BEGIN

select * from t1;

END//

delimiter ;

-- 执行存储过程

call p1()

2.有参数的存储过程

对于存储过程,可以接收三类参数:

in:仅用于传入参数用

out:仅用于返回值用

inout:既可以传入又可以当作返回值

创建有参数的存储过程示例:

-- 创建存储过程

delimiter \\

create procedure p1(

in i1 int,

in i2 int,

inout i3 int,

out r1 int

)

BEGIN

DECLARE temp1 int;

DECLARE temp2 int default 0;

set temp1 = 1;

set r1 = i1 + i2 + temp1 + temp2;

set i3 = i3 + 100;

end\\

delimiter ;

-- 执行存储过程

set @t1 =4;

set @t2 = 0;

CALL p1 (1, 2 ,@t1, @t2);

SELECT @t1,@t2;

事务型存储过程示例:

delimiter \\

create PROCEDURE p1(

OUT p_return_code tinyint

)

BEGIN

DECLARE exit handler for sqlexception

BEGIN

-- ERROR

set p_return_code = 1;

rollback;

END;

DECLARE exit handler for sqlwarning

BEGIN

-- WARNING

set p_return_code = 2;

rollback;

END;

START TRANSACTION;

DELETE from tb1;

insert into tb2(name)values('seven');

COMMIT;

-- SUCCESS

set p_return_code = 0;

END\\

delimiter ;

删除存储过程

drop procedure 存储过程名称

4.函数

MySQL中的内置函数

INSTR(str, len):返回字符串str从开始的len位置的子序列字符

LEFT(str, len):返回字符串str从开始的len位置的子序列字符

LOWER(str):变小写

UPPER(str):变大写

...

自定义函数

1.定义一个函数:

delimiter \\

create function f1(

i1 int,

i2 int)

returns int

BEGIN

declare num int;

set num = i1 + i2;

return(num);

END \\

delimiter ;

-- 执行函数:

f1(1, 3);

2.删除函数:

drop function 函数名称

5.事务

概述:事务用于将某些操作的多个SQL作为原子性操作,一旦有某一个出现错误,即可回滚到原来的状态,从而保证数据库数据完整性

6.索引

概述:索引是数据库中专门用于帮助用户快速查询数据的一种数据结构,类似于字典中的目录,查找字典内容时可以根据目录查找找到数据的存放位置,然后直接获取即可

MySQL中常见索引有:

1.普通索引:仅有一个功能,那就是加快查询

create index 索引名 ob 表名(列名)

2.唯一索引:加速查询和唯一约束(可为null)

create unique index 索引名 on 表名(列名)

3.主键索引:加速查询和唯一约束(不可为null)

alter table 表名 add primary key(列名);

4.联合索引:将n个列组合成一个索引

create index 索引名 on 表名(列名1,列名2。。。);

联合索引需要注意的点:

联合索引的最左匹配原则,即最左优先,以最左边的为起点任何连续的索引都能匹配上。同时遇到范围查询(>、

多字段的联合索引在查询单个字段时是否可以用到索引:如下面的联合索引的语法所示,如果你查询单个字段时,查询的是列名1和列名2或者查询列名1的话,就能命中索引,如果只查询列名2就中不了索引

索引相关命令

查看表结构:

desc 表名

查看生成表的sql

show create table 表名

查看执行时间:

set profilling = 1;

SQL语句...

show profiles

查看执行计划:

explain select * from tb2;

执行计划里面type属性的值代表的意思

type

查询时的访问方式,性能:all < index < range < index_merge < ref_or_null < ref < eq_ref < system/const

ALL 全表扫描,对于数据表从头到尾找一遍

select * from tb1;

特别的:如果有limit限制,则找到之后就不在继续向下扫描

select * from tb1 where email = 'seven@live.com'

select * from tb1 where email = 'seven@live.com' limit 1;

虽然上述两个语句都会进行全表扫描,第二句使用了limit,则找到一个后就不再继续扫描。

INDEX 全索引扫描,对索引从头到尾找一遍

select nid from tb1;

RANGE 对索引列进行范围查找

select * from tb1 where name < 'alex';

PS:

between and

in

> >= < <= 操作

注意:!= 和 > 符号

INDEX_MERGE 合并索引,使用多个单列索引搜索

select * from tb1 where name = 'alex' or nid in (11,22,33);

REF 根据索引查找一个或多个值

select * from tb1 where name = 'seven';

EQ_REF 连接时使用primary key 或 unique类型

select tb2.nid,tb1.name from tb2 left join tb1 on tb2.nid = tb1.nid;

CONST 常量

表最多有一个匹配行,因为仅有一行,在这行的列值可被优化器剩余部分认为是常数,const表很快,因为它们只读取一次。

select nid from tb1 where nid = 2 ;

SYSTEM 系统

表仅有一行(=系统表)。这是const联接类型的一个特例。

select * from (select nid from tb1 where nid = 1) as A;

7.动态执行sql语句

示例:

delimiter \\

DROP PROCEDURE IF EXISTS proc_sql \\

CREATE PROCEDURE proc_sql ()

BEGIN

declare p1 int;

set p1 = 11;

set @p1 = p1;

PREPARE prod FROM 'select * from tb2 where nid > ?';

EXECUTE prod USING @p1;

DEALLOCATE prepare prod;

END\\

delimiter ;

8.如何优化SQL语句

1.列类型尽量定义成数值类型,且长度尽可能短,如主键和外键,类型字段等等

2.建立单列索引

3.根据需要建立多列联合索引

当单个列过滤之后还有很多数据,那么索引的效率将会比较低,即列的区分度较低,那么如果在多个列上建立索引,那么多个列的区分度就大多了,将会有显著的效率提高。

4.根据业务场景建立覆盖索引

只查询业务需要的字段,如果这些字段被索引覆盖,将极大的提高查询效率

5.多表连接的字段上需要建立索引这样可以极大的提高表连接的效率

6.where条件字段上需要建立索引

7.排序字段上需要建立索引

8.分组字段上需要建立索引

9.where条件上不要使用运算函数,以免索引失效

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/505796.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python 反射和动态加载_Python的反射

什么是反射反射是一个很重要的概念&#xff0c;它可以把字符串映射到实例的变量或者实例的方法然后可以去执行调用、修改等操作。它有四个重要的方法&#xff1a;getattr 获取指定字符串名称的对象属性setattr 为对象设置一个对象hasattr 判断对象是否有对应的对象(字符串)dela…

oracle和mysql通用建表语句_mysql建表语句到oracle怎么写?

mysql建表语句到oracle怎么写&#xff1f;CREATE TABLE Advertisment ( AdId int(8) NOT NULL auto_increment, AderId int(8) default NULL, AdName varchar(50) default NULL, AdKind varchar(30) default NULL, CreateMan varchar(30) default NULL, StartDate date d…

onenote快捷键_高效飞快地使用onenote快捷键:快捷键功能架构解析

默认快捷键有近200组&#xff0c;涉及到的功能如此之多&#xff0c;但真正频繁使用的&#xff0c;可能也就几十组。如何从这么多快捷键中选择出自己需要的呢&#xff1f;你需要一张功能架构参考图。1默认快捷键功能架构图官方文档已对快捷键做了初步分类&#xff0c;但比较抽象…

怎么设置php.ini允许sql语句插入空值到mysql里_php读取.sql文件,写入mysql,navicat显示乱码,编码设置...

案例&#xff1a;php文件&#xff1a;install.php--------编码&#xff1a;php保存文件的编码、php header编码、php程序的默认编码、php写入数据库的编码php读取的sql代码文件&#xff1a;php.sql--------编码&#xff1a;sql保存文件的编码mysql数据库&#xff1a;test1-----…

ueditor如何设置上传图片的高度宽度_上百张图片上传并对齐,你加班2小时没搞定,同事简单三步就完成...

Excel除了汇总数据还可以上传保存相片&#xff0c;比如我们在人力信息表中将每个人的相片放到表格里面去&#xff0c;或者我们需要将宠物对应的相片放到表格里面去&#xff0c;这就涉及到图片的批量上传以及对齐的操作。如图所示&#xff0c;我们需要将每个动物对应的图片&…

pdf在线翻译_如何免费快速地翻译pdf英文文档,并保留很好的格式?

对于那些科研工作者&#xff0c;每天阅读外文文献是必须要做的&#xff0c;大家都知道&#xff0c;一份外文的pdf文献内容是很多的&#xff0c;阅读量也是非常大&#xff0c;边看边翻译的话&#xff0c;这个任务还是很艰巨的&#xff0c;面对如此大的阅读量&#xff0c;该怎么快…

java的super_Java中this和super的用法总结

这几天看到类在继承时会用到this和super&#xff0c;这里就做了一点总结&#xff0c;与各位共同交流&#xff0c;有错误请各位指正~thisthis是自身的一个对象&#xff0c;代表对象本身&#xff0c;可以理解为&#xff1a;指向对象本身的一个指针。this的用法在java中大体可以分…

服务器具有挂起的重新启动_ESP8266与网络服务器实时通讯

背景知识视频教程Bootstrap 4布局&#xff1a;响应式单页设计​viadean.comNode.js&#xff0c;Express&#xff0c;MongoDB等&#xff1a;2020年完整的训练营 - 国外课栈​viadean.com高级Express - 国外课栈​viadean.com目前&#xff0c;所有已呈现的通信都是基于请求响应方…

java除号_Java的运算符

1.算数运算符 加(正号)  - 减(符号)  * 乘  / 除% 取模(取余)   自增  -- 自减号的几种作用&#xff1a;加法运算  表示为一个正数  还可以用来作字符串的拼接整数相除只能得到整数。如果想得到小数&#xff0c;必须把参与计算的数据变化为浮点类型的数据。自增和…

strace命令_在软件部署中使用 strace 进行调试

我最喜欢的用来解决“为什么这个软件无法在这台机器上运行&#xff1f;”这类问题的工具就是 strace。-- Simon Arneaud&#xff08;作者&#xff09;我的大部分工作都涉及到部署软件系统&#xff0c;这意味着我需要花费很多时间来解决以下问题&#xff1a;这个软件可以在原开发…

java 写文件filewriter_使用FileWriter写文件

package textMyself;//使用FileWriter写文件import java.io.FileNotFoundException;import java.io.FileReader;import java.io.FileWriter;import java.io.IOException;public class text2 {public static void main(String[] args) {// TODO 自动生成的方法存根try {/** 先产…

procreate 笔刷_Procreate新手漫画入门:笔刷,图层,上色

上个月新入手了一个新的ipad&#xff0c;又打开了一种关于漫画的新的可能性~同时验证了那句话&#xff1a;对生活保持好奇&#xff0c;你将收获更多。于是就有一些喜欢画画的小伙伴有私信这样的漫画怎么画的&#xff1f;这个秘密工具就是&#xff1a;ipad ➕ Apple pencil ➕ a…

pycharm中python的默认安装路径_mac PyCharm添加Python解释器及添加package路径的方法...

一、背景PyCharm执行Python时&#xff0c;找不到自己安装的package&#xff0c;例如pandas、numpy、scipy、scikit等&#xff0c;在执行时报如下错误ImportError: No module named pandas&#xff1a;Traceback (most recent call last):File "", line 1, in File &q…

java kettle6_java 调用kettle 6.1 转换

有人用过java 调用kettle6.1 转换脚本吗&#xff1f; 我用同样的代码&#xff0c;可以执行kettle 4.1的脚本&#xff0c;可6.1始终不行&#xff1f; 是6.1 不支持了&#xff1f;还是写法变了&#xff1f;如下这段代码4.1可以&#xff0c;6.1就不行。求解&#xff01;&…

transactional注解的使用_Java:Spring @Transactional工作原理

本文将深入研究Spring的事务管理。主要介绍Transactional在底层是如何工作的。之后的文章将介绍&#xff1a;propagation(事务传播)和isolation(隔离性)等属性的使用事务使用的陷阱有哪些以及如何避免JPA和事务管理很重要的一点是JPA本身并不提供任何类型的声明式事务管理。如果…

java 2d划线 刷子_月光软件站 - 编程文档 - Java - Java图形设计中,利用Bresenham算法实现直线线型,线宽的控制(NO 2D GRAPHICS)...

Java 2D Graphics提供了强大的画线功能&#xff0c;可以控制线型&#xff0c;线宽&#xff0c;刷子的形状等&#xff0c;但在JDK1.2以前&#xff0c;没有提供这样一个功能&#xff0c;为了保持与旧版JDK的相容&#xff0c;实现一个可控制线型&#xff0c;线宽的画直线方法还是…

python socketserver最大连接_大聊Python----SocketServer

什么是SocketServer&#xff1f;SocketServer的最主要的作用是实现并发处理,也就是可以多个用户同时上传和下载文件。socketserver模块简化了编写网络服务器的任务。socketserver一共有这么几种类型class socketserver.TCPServer(server_address, RequestHandlerClass, bind_an…

java 位运算符在实际开发中的用处_java 位运算 和实际应用

public class Test {public static void main(String[] args) {// 1、左移( <// 0000 0000 0000 0000 0000 0000 0000 0101 然后左移2位后&#xff0c;低位补0&#xff1a;//// 0000 0000 0000 0000 0000 0000 0001 0100 换算成10进制为20System.out.println(5 <// 2、右…

python django开发工具_利用pyCharm编辑器创建Django项目开发环境-python开发工具第一篇...

【前置说明】1、django环境与python对应关系&#xff1a;Django versionPython versions1.112.7, 3.4, 3.5, 3.6, 3.7 (added in 1.11.17)2.03.4, 3.5, 3.6, 3.72.13.5, 3.6, 3.72.23.5, 3.6, 3.7, 3.8 (added in 2.2.8)3.03.6, 3.7, 3.8【正式进入部署开发环境之pyCharm】安装…

mock教程 java_java代码实现mock数据

废话不多说&#xff0c;直接上代码。1 /** 2 * 发get请求&#xff0c;获取文本 3 * 4 * param getUrl 5 * return 网页context 6 */ 7 public static String sendGetRequest(String getUrl) { 8 String result null; 9 CloseableHttpClient httpClient HttpClients.createDef…