MySQL除了基本的增删该查功能,还有以下拓展功能:

create table t1(
id int ....,
num int,
xx int,
unique 唯一索引名称 (列名,列名),
constraint ....
) 索引不能重复
功能:
1.加速检索
2.约束数据不重复

索引/联合唯一索引

unique 如果只写一列,关联另一张表的id,实际上就是建立一张一对一关系表。

如果写了两列,分别关联两张表的id字段,实际上就是给两张表建立了多对多关系。

视图:为某个查询语句设置别名,方便以后使用

创建:CREATE VIEW 视图名称 AS  SQL语句
eg:CREATE VIEW tb1 AS SELECT * FROM tb WHERE ID > 10;
这是一个虚拟表,会从数据库动态的添加 修改:ALTER VIEW 视图名称 as SQL语句 删除:DROP VIEW 视图名称
触发器:当对某个表进行增删改时,希望触发某个操作。相当于一个中间件,可以在增删改时执行触发器设定好的操作

增:
CREATE TRIGGER T1 BEFORE INSERT(或为AFTER) ON 表名 FOR EACH ROW(每增加一条数据都会执行)
DELIMITER // (mysql默认分号结尾改为//)
BEGIN
SQL语句,eg:INSERT INTO teacher (name,gender) VALUES('张','男');(触发器的每次都会在teacher表插入新数据)
END //
DELIMITER ;(设定为分号结尾,防止对其他操作影响) 删:
CREATE TRIGGER T2 BEFORE(或为AFTER) DELETE ON 表名 FOR EACH ROW
BEGIN
...
END 改:
CREATE TRIGGER T3 BEFORE(或为AFTER) UPDATE ON 表名 FOR EACH ROW
BEGIN
...
END NEW&OLD数据:
在BEGIN 和 END之间的SQL语句,可以用NEW,OLD变量,NEW表示新加入的数据,OLD可以表示删除或修改后的数据:
eg:INSERT INTO teacher(name) VALUES(NEW.name)可以将插入数据的字段加到teacher表新数据的name字段中 删除触发器:
DROP TRIGGER 触发器名称 调用触发器:
不能有用户调用,是基于某张表的操作时自动调用
函数:MySQL有很多内置函数,可以参考官方文档:https://dev.mysql.com/doc/refman/5.7/en/functions.html
比如字符串拼接:CONCAT('hello',‘world’),时间格式化:SELECT DATE_FORMAT(ctime,"%Y-%m"),COUNT(1) FROM tb GROUP BY DATE_FORMAT(ctime,"%Y-%m") 设置自定义函数:(注意:与触发器不同,函数中不能写sql语句)
delimiter \\
create function f1(
i1 int,
i2 int)
returns int
BEGIN
declare num int;
set num = i1 + i2;
return(num);
END \\
delimiter ; 函数调用:
SELECT f1(nid,id),name FROM tb1 删除函数:
DROP function f1
存储过程:是一个SQL语句集合,当程序调用存储过程的时候,会执行存储过程中的SQL语句
delimiter //
create procedure p1()
BEGIN
select * from t1;
END//
delimiter ; 调用:call p1() 存储过程可以传递参数,参数有三种类型:
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; 注意out类型的值传入要用变量传入
set @t2 = 0;
CALL p1 (1, 2 ,@t1, @t2);
SELECT @t1,@t2; ==========out值的意义========
当我们执行存储过程的时候会返回给我们 SQL语句的结果集,同时也会返回给我们out的数值,这有什么意义呢? 其实在存储过程中如果有很多SQL语句,我们无法确定是否全部执行成功,如果在SQL语句的最后加上一个对out变量的操作,就可以检查存储过程是否执行成功了。
事物:让SQL存储过程支持事物操作
delimiter \\
create PROCEDURE p5(OUT p_return_code tinyint)
BEGIN
DECLARE exit handler for sqlexception (如果发生异常会执行DECLARE部分下的代码)
BEGIN
-- ERROR
set p_return_code = 1;
rollback;
END; START TRANSACTION; (正常执行代码)
DELETE from tb1;
insert into tb2(name)values('seven');
COMMIT; -- SUCCESS
set p_return_code = 2; END\\
delimiter ;

存储过程中用set设置变量,用call来调用存储过程,select查看结果

游标:是SQL中的for循环语法,如果要对数据每一行进行计算处理可以使用,相当于自建一个方法对每一行的字段进行处理。

delimiter //
create procedure p3()
begin
declare ssid int; -- 自定义变量1
declare ssname varchar(50); -- 自定义变量2
DECLARE done INT DEFAULT FALSE; DECLARE my_cursor CURSOR FOR select sid,sname from student;(游标处理哪些数据)
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;(游标停止条件) open my_cursor;
xxoo: LOOP
fetch my_cursor into ssid,ssname;
if done then
leave xxoo;
END IF;(下面写游标完成后执行的操作)
insert into teacher(tname) values(ssname);
end loop xxoo;
close my_cursor;
end //
delimter ;

动态执行SQL(防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 > ?'; (准备阶段预检测SQL语句的合法性)
EXECUTE prod USING @p1;(格式化SQL语句,如拼接)
DEALLOCATE prepare prod; (执行) END\\
delimiter ;

MySQL拓展操作的更多相关文章

  1. MySQL误操作后如何快速恢复数据

    基本上每个跟数据库打交道的程序员(当然也可能是你同事)都会碰一个问题,MySQL误操作后如何快速回滚?比如,delete一张表,忘加限制条件,整张表没了.假如这还是线上环境核心业务数据,那这事就闹大了 ...

  2. MYSQL基础操作

    MYSQL基础操作 [TOC] 1.基本定义 1.1.关系型数据库系统 关系型数据库系统是建立在关系模型上的数据库系统 什么是关系模型呢? 1.数据结构可以规定,同类数据结构一致,就是一个二维的表格 ...

  3. mysql常用操作语句

    mysql常用操作语句 1.mysql -u root -p   2.mysql -h localhost -u root -p database_name 2.列出数据库: 1.show datab ...

  4. PHP mysql基础操作

    mysql连接操作 //建立连接$con = mysql_connect('localhost', 'root', '123456');//判断是否连接成功if($con){ die('连接失败!'. ...

  5. php : mysql数据库操作类演示

    设计目标: 1,该类一实例化,就可以自动连接上mysql数据库: 2,该类可以单独去设定要使用的连接编码(set names XXX) 3,该类可以单独去设定要使用的数据库(use XXX): 4,可 ...

  6. python(pymysql)之mysql简单操作

    一.mysql简单介绍 说到数据库,我们大多想到的是关系型数据库,比如mysql.oracle.sqlserver等等,这些数据库软件在windows上安装都非常的方便,在Linux上如果要安装数据库 ...

  7. MySQL常用操作总结

    MySQL常用操作 前提条件:已安装MySQL. 学习目标:用一条sql语句写出A和B的剩余数量 AA表 BB表 以上为一道面试题,接下来由这道面试题来回顾一些数据库的基本操作. 登录MySQL su ...

  8. Python学习笔记15—mysql的操作

    安装 Python-MySQLdb pip install mysql-Python Python对mysql的操作 建立一个实验数据库demo mysql> create database d ...

  9. php MySQL数据库操作类源代码

    php MySQL数据库操作类源代码: <?php class MySQL{ private $host; //服务器地址 private $name; //登录账号 private $pwd; ...

随机推荐

  1. 有些人表面风光,背地里for循环怎么写都要百度

    代码地址 https://github.com/ljshLLW/homework 题目 最大连续子数组和(最大子段和) 给定n个整数(可能为负数)组成的序列a[1],a[2],a[3],-,a[n], ...

  2. 【题解】Luogu P5313 僕たちはひとつの光([Ynoi2012]D2T2)

    原题传送门 lovelive好评 比赛时只拿到了60pts,还是自己太菜了 这题的思想实际有点像Luogu P3674 小清新人渣的本愿与Luogu P5071 [Ynoi2015]此时此刻的光辉 这 ...

  3. android开发_文本按钮 与 输入框

    1 TextView:    属性与值 android:text="文本" android:textSize="20sp"              //sp为 ...

  4. Android系统应用Mms之Sms短信发送流程(Mms应用部分)二

    1. 新建一条短信, 在发送短信之前, 首先创建的是一个会话Conversation, 以后所有与该接收人(一个或多个接收人)的消息交互, 都在该会话Conversation中. ComposeMes ...

  5. net应用程序池自动关闭的解决方法

    while (true) { using (ServerManager sm = ServerManager.OpenRemote("localhost")) { string p ...

  6. Java基础学习-三元运算符和键盘录入的基本步骤和使用

    1.三元运算符的执行流程   package com.denniscui_05; /*  * 三元运算符:  *         关系表达式?表达式1:表达式2  *  * 执行流程:  *      ...

  7. idea自个常用工具的总结

    1.直接打开某类:ctrl+shift+t2.注释某类:ctrl+?3. implementation :Ctrl+T4.rename:Alt +Shirft +R5.Show Intention A ...

  8. 微信小程序复选框实现 多选一功能

    功能实现界面 data: { checkboxItems: [ { name: '全天(1-8节)', value: 'allday' }, { name: '上午(1-4节)', value: 'a ...

  9. JAVA中的String类(详解)

    Java.lang.String类是final类型的,因此不可以继承这个类.不能修改这个类.String是一个类不属于基本数据类型. 可以从源码中看到,String是一个final类型. String ...

  10. Project Euler 66: Diophantine equation

    题目链接 思路: 连分数求佩尔方程最小特解 参考博客 模板: LL a[]; bool min_pell(LL d, LL &x, LL &y) { LL m = floor(sqrt ...