当前位置: 澳门新濠3559 > 数据库 > 正文

for EACH row -- 固定写法

时间:2019-12-09 01:05来源:数据库
视图 创设视图 create view 视图名字 as 查询sql语句; MySQL基础二,mysql基础 drop view 视图名字; 视图 视图是二个设想表(非真实存在),其本质是【根据SQL语句获取动态的数据集,并为其取
  1. 视图
    创设视图
    create view 视图名字 as 查询sql语句;

MySQL基础二,mysql基础

drop view 视图名字;

视图

视图是二个设想表(非真实存在),其本质是【根据SQL语句获取动态的数据集,并为其取名】,客商采纳时只需采纳【名称】就能够获得结果集,并得以将其充任表来接收。

图片 1SELECT * FROM ( SELECT nid, NAME FROM tb1 WHERE nid > 2 卡塔尔国 AS A WHERE A. NAME > 'alex'; 有的时候表搜索

1、成立视图

图片 2--格式:CREATE VIEW 视图名称 AS SQL语句 CREATE VIEW v1 AS SELET nid, name FROM A WHE中华VEnid > 4 View Code

2、删除视图

图片 3--格式:DROP VIEW 视图名称 DROP VIEW v1 View Code

3、匡重视图

图片 4-- 格式:ALTELacrosse VIEW 视图名称 AS SQL语句 ALTELacrosse VIEW v1 AS SELET A.nid, B. NAME FROM A LEFT JOIN B ON A.id = B.nid LEFT JOIN C ON A.id = C.nid WHERE A.id > 2 AND C.nid < 5 View Code

4、使用视图

运用视图时,将其当做表实行操作就能够,由于视图是设想表,所以不能够运用其对切实地工作表实行创办、更新和删除操作,仅能做询问用。

图片 5select * from v1 View Code

alter view 视图名字 as 查询sql语句;

触发器

对有些表实行【增/删/改】操作的光景假如期望触发有些特定的行事时,能够使用触发器,触发器用于定制客商对表的行开展【增/删/改】前后的一坐一起。

1、创制基本语法

图片 6# 插入前 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 View Code 图片 7delimiter // CREATE TRIGGER tri_before_insert_tb1 BEFORE INSERT ON tb1 FOWrangler EACH ROW BEGIN IF NEW. NAME == 'alex' THEN INSERT INTO tb2 (NAME) VALUES ('aa'卡塔尔(英语:State of Qatar) END END// delimiter ; 插入前触发器 图片 8delimiter // CREATE TRIGGER tri_after_insert_tb1 AFTEPAJERO INSERT ON tb1 FOTiggo EACH ROW BEGIN IF NEW. num = 666 THEN INSERT INTO tb2 (NAME卡塔尔国 VALUES ('666'卡塔尔(英语:State of Qatar), ('666'卡塔尔(قطر‎ ; ELSEIF NEW. num = 555 THEN INSERT INTO tb2 (NAME卡塔尔(英语:State of Qatar) VALUES ('555'卡塔尔(قطر‎, ('555'卡塔尔(英语:State of Qatar) ; END IF; END// delimiter ; 插入后触发器

特意的:NEW代表将在插入的数目行,OLD表示将在删除的数据行。

2、删除触发器

图片 9DROP TRIGGER tri_after_insert_tb1; View Code

3、使用触发器

触发器不或许由客户向来调用,而知由于对表的【增/删/改】操作被动引发的。

图片 10insert into tb1(num) values(666) View Code

  1. 触发器
  2. 安排事件触发器
    INSERT INTO order_table(gid,much) VALUES(1,3);

仓库储存进程

储存进程是二个SQL语句集结,当主动去调用存款和储蓄进度时,个中内部的SQL语句会安份守己逻辑施行。

1、成立存款和储蓄进程

图片 11-- 创制存款和储蓄进程 delimiter // create procedure p1(卡塔尔国 BEGIN select * from t1; END// delimiter ; -- 实践存款和储蓄进程 call p1(卡塔尔国 无参数存款和储蓄进程

对此仓储进程,基本上能用参数,其参数有三类:

  • in          仅用于传入参数用
  • out        仅用于再次来到值用
  • inout     不只能够流传又有什么不可充当重临值

图片 12-- 创造存款和储蓄进度 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 ; -- 试行存储进度 DECLARE @t1 INT default 3; DECLARE @t2 INT; CALL p1 (1, 2 ,@t1, @t2卡塔尔(قطر‎; SELECT @t1,@t2; 有参数存款和储蓄进度

2、删除存款和储蓄进程

图片 13drop procedure proc_name; View Code

3、实行存款和储蓄进度

图片 14-- 无参数 call proc_name() -- 有参数,全in call proc_name(1,2) -- 有参数,有in,out,inout DECLARE @t1 INT; DECLARE @t2 INT default 3; call proc_name(1,2,@t1,@t2) View Code 图片 15#!/usr/bin/env python # -*- coding:utf-8 -*- import pymysql conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123', db='t1') cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) # 推行存款和储蓄进度 cursor.callproc('p1', args=(1, 22, 3, 4卡塔尔(قطر‎卡塔尔 # 获取实行完存款和储蓄的参数 cursor.execute("select @_p1_0,@_p1_1,@_p1_2,@_p1_3"卡塔尔 result = cursor.fetchall(卡塔尔(英语:State of Qatar)conn.commit(卡塔尔(قطر‎ cursor.close(卡塔尔国 conn.close(卡塔尔 print(result卡塔尔 pymysql实行存款和储蓄进程

-- update goods set num = num -3 where id =1;

函数

MySQL中提供了数不尽平放函数,举个例子:

图片 16 CHAR_LENGTH(str卡塔尔(قطر‎ 重临值为字符串str 的尺寸,长度的单位为字符。贰个多字节字符算作多个单字符。 对于四个包蕴七个二字节字符集, LENGTH(卡塔尔国再次来到值为 10, 而CHAR_LENGTH(卡塔尔(英语:State of Qatar)的再次来到值为5。 CONCAT(str1,str2,...卡塔尔 字符串拼接 如有任何一个参数为NULL ,则重返值为 NULL。 CONCAT_WS(separator,str1,str2,...卡塔尔(قطر‎ 字符串拼接(自定义连接符) CONCAT_WS(卡塔尔不会忽视任何空字符串。 (可是会忽视全数的 NULL)。 CONV(N,from_base,to_base卡塔尔国 进制调换 举例: SELECT CONV('a',16,2卡塔尔(قطر‎; 表示将 a 由16进制转换为2进制字符串代表 FORMAT(X,D卡塔尔(英语:State of Qatar) 将数字X 的格式写为'#,###,###.##',以四舍五入的方法保存小数点后 D 位, 并将结果以字符串的款型重回。若 D 为 0, 则重返结果不分包小数点,或不含小数部分。 譬喻: SELECT FORMAT(12332.1,4卡塔尔(英语:State of Qatar); 结果为: '12,332.1000' INSERT(str,pos,len,newstr卡塔尔(英语:State of Qatar)在str的内定地点插入字符串 pos:要替换个方式置其实地方 len:替换的长度 newstr:新字符串 非常的: 假诺pos超过原字符串长度,则赶回原字符串 要是len超越原字符串长度,则由新字符串完全替换 INST君越(str,substr)再次来到字符串 str 中子字符串的率先个冒出岗位。 LEFT(str,len卡塔尔(قطر‎ 重回字符串str 从开首的len地方的子类别字符。 LOWELacrosse(str卡塔尔 变小写 UPPELAND(str卡塔尔(قطر‎ 变大写 LT奥德赛IM(str卡塔尔国 重回字符串 str ,其指引空格字符被删除。 RT奥迪Q5IM(str卡塔尔国 重临字符串 str ,结尾空格字符被去除。 SUBST翼虎ING(str,pos,len卡塔尔(قطر‎ 获取字符串子连串LOCATE(substr,str,pos卡塔尔(英语:State of Qatar) 获取子体系索引地方 REPEAT(str,count卡塔尔(英语:State of Qatar)重临三个由重复的字符串str 组成的字符串,字符串str的多少等于count 。 若 count <= 0,则赶回二个空字符串。 若str 或 count 为 NULL,则赶回 NULL 。 REPLACE(str,from_str,to_str卡塔尔国 再次来到字符串str 以至独具被字符串to_str取代的字符串from_str 。 REVEOdysseySE(str卡塔尔(قطر‎ 重返字符串 str ,顺序和字符顺序相反。 HighlanderIGHT(str,len卡塔尔(قطر‎ 从字符串str 在这里以前,重返在此以前边开首len个字符组成的子体系 SPACE(N卡塔尔(قطر‎再次来到一个由N空格组成的字符串。 SUBSTHighlanderING(str,pos卡塔尔 , SUBSTENVISIONING(str FROM pos卡塔尔 SUBST奥迪Q3ING(str,pos,len卡塔尔国 , SUBSTHavalING(str FROM pos FOWrangler len卡塔尔 不含有len 参数的格式从字符串str重临三个子字符串,初阶于位置pos。带有len参数的格式从字符串str再次回到叁个长度同len字符相同的子字符串,初叶于位置pos。 使用 FROM的格式为行业内部 SQL 语法。也说不佳对pos使用多个负值。假如那样,则子字符串的职位开首于字符串结尾的pos 字符,并非字符串的最初地方。在以下格式的函数中得以对pos 使用三个负值。 mysql> SELECT SUBST昂科拉ING('Quadratically',5卡塔尔(قطر‎; -> 'ratically' mysql> SELECT SUBST奥迪Q5ING('foobarbar' FROM 4卡塔尔国; -> 'barbar' mysql> SELECT SUBSTCR-VING('Quadratically',5,6卡塔尔国; -> 'ratica' mysql> SELECT SUBSTSportageING('Sakila', -3卡塔尔(英语:State of Qatar); -> 'ila' mysql> SELECT SUBSTLX570ING('Sakila', -5, 3卡塔尔(قطر‎; -> 'aki' mysql> SELECT SUBSTGL450ING('Sakila' FROM -4 FOLX570 2卡塔尔(قطر‎; -> 'ki' TQashqaiIM([{BOTH | LEADING | TRAILING} [remstr] FROM] str) TRIM(remstr FROM] str卡塔尔(قطر‎ 重回字符串 str , 此中装有remstr 前缀和/或后缀都已经被去除。若分类符BOTH、LEADIN或TRAILING中向来不一个是给定的,则只要为BOTH 。 remstr 为可筛选,在未钦赐意况下,可去除空格。 mysql> SELECT T陆风X8IM(' bar '卡塔尔(قطر‎; -> 'bar' mysql> SELECT T逍客IM(LEADING 'x' FROM 'xxxbarxxx'卡塔尔(英语:State of Qatar); -> 'barxxx' mysql> SELECT TTucsonIM(BOTH 'x' FROM 'xxxbarxxx'卡塔尔国; -> 'bar' mysql> SELECT T锐界IM(TRAILING 'xyz' FROM 'barxxyz'卡塔尔国; -> 'barx' 部分内置函数

更加多函数:猛击这里 OCR-V 猛击这里

1、自定义函数

图片 17delimiter \ create function f1( i1 int, i2 int) returns int BEGIN declare num int; set num = i1 + i2; return(num); END \ delimiter ; View Code

2、删除函数

图片 18drop function func_name; View Code

3、实施函数

图片 19# 获取重回值 declare @i VARCHAENVISION(32卡塔尔国; select UPPETiggo('alex'卡塔尔 into @i; SELECT @i; # 在查询中动用 select f1(11,nid卡塔尔 ,name from tb2; View Code

CREATE TRIGGER tg1 AFTER INSERT on order_table
for EACH row -- 固定写法
BEGIN
update goods set num = num -new.much where id =new.gid;
END

事务

事情用于将或多或少操作的五个SQL作为原子性操作,风流倜傥旦有某叁个冒出错误,就能够回滚到原本的情景,进而确定保证数据库数据完整性。

图片 20delimiter \ 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 ; 辅助职业的存储进程 图片 21DECLARE @i TINYINT; call p1(@i卡塔尔(قطر‎; select @i; 施行存储进度

-- 删除触发器
drop TRIGGER TG1;

索引

目录,是数据库中特地用来援助顾客快捷查询数据的黄金年代种数据构造。相近于字典中的目录,查找字典内容时得以依照目录查找到数据的寄存地点,然后径直拿走就可以。

MySQL中平淡无奇索引有:

  • 平时索引
  • 独一索引
  • 主键索引
  • 结合索引

1、普通索引

日常说来索引唯有四个意义:加速查询

图片 22create table in1( nid int not null auto_increment primary key, name varchar(32) not null, email varchar(64) not null, extra text, index ix_name (name) ) 创建表 + 索引 图片 23create index index_name on table_name(column_name卡塔尔国 创立索引 图片 24drop index_name on table_name; 删除索引 图片 25show index from table_name; 查看索引

潜心:对于开创索引时只若是BLOB 和 TEXT 类型,必需钦赐length。

图片 26create index ix_extra on in1(extra(32)); View Code

2、独一索引

独一索引有五个功效:加快查询 和 唯生龙活虎限制(可含null)

图片 27create table in1( nid int not null auto_increment primary key, name varchar(32) not null, email varchar(64) not null, extra text, unique ix_name (name卡塔尔 卡塔尔 成立表 + 独一索引 图片 28create unique index 索引名 on 表名(列名卡塔尔 创制独一索引 图片 29drop unique index 索引名 on 表名 删除唯一索引

3、主键索引

主键有七个职能:加快查询 和 唯生机勃勃约束(不可含null)

图片 30create table in1( nid int not null auto_increment primary key, name varchar(32) not null, email varchar(64) not null, extra text, index ix_name (name) ) OR create table in1( nid int not null auto_increment, name varchar(32) not null, email varchar(64) not null, extra text, primary key(ni1), index ix_name (name卡塔尔(英语:State of Qatar) 卡塔尔(قطر‎ 成立表 + 创制主键 图片 31alter table 表名 add primary key(列名卡塔尔(قطر‎; 创立主键 图片 32alter table 表名 drop primary key; alter table 表名 modify 列名 int, drop primary key; 删除主键

4、组合索引

整合索引是将n个列组合成叁个索引

其选取场景为:频仍的同时使用n列来进展询问,如:where n1 = 'alex' and n2 = 666。

图片 33create table in3( nid int not null auto_increment primary key, name varchar(32) not null, email varchar(64) not null, extra text ) 创建表 图片 34create index ix_name_email on in3(name,email卡塔尔(英语:State of Qatar); 创造组合索引

如上开创组合索引之后,查询:

  • name and email  -- 使用索引
  • name                 -- 使用索引
  • email                 -- 不利用索引

瞩目:对于同期探寻n个规格时,组合索引的质量好于多少个纯粹索引归总。

2.翻新事件触发器
update order_table set much = much +2 where oid = 6;

其他 

1、条件语句

图片 35delimiter \ CREATE PROCEDURE proc_if () BEGIN declare i int default 0; if i = 1 THEN SELECT 1; ELSEIF i = 2 THEN SELECT 2; ELSE SELECT 7; END IF; END\ delimiter ; if条件语句

2、循环语句

图片 36delimiter \ CREATE PROCEDURE proc_while () BEGIN DECLARE num INT ; SET num = 0 ; WHILE num < 10 DO SELECT num ; SET num = num + 1 ; END WHILE ; END\ delimiter ; while循环 图片 37delimiter \ CREATE PROCEDURE proc_repeat () BEGIN DECLARE i INT ; SET i = 0 ; repeat select i; set i = i + 1; until i >= 5 end repeat; END\ delimiter ; repeat循环 图片 38delimiter \ CREATE PROCEDURE proc_loop () BEGIN declare i int default 0; loop_label: loop select i; set i=i+1; if i>=5 then leave loop_label; end if; end loop; END\ delimiter ; loop

3、动态施行SQL语句

图片 39delimiter \ 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 ; 动态施行SQL

 

视图 视图是二个虚构表(非真实存在),其本质是【依照SQL语句获取动态的数据集,并为其取名】,客商选择时只需...

update goods set num = num+2 where id = 1;

create TRIGGER tg2 AFTER UPDATE ON order_table
for EACH ROW
BEGIN
update goods set num = num+old.much - new.much where id = old.gid;
END
3.删减事件触发器
DELETE FROM order_table where oid =6;

update goods set num = num + 3 where id = 1;

create TRIGGER tg3 AFTER DELETE on order_table
for EACH ROW
BEGIN
update goods set num = num + old.much where id = old.gid;
END
4.翻看触发器
show tiggers;

3.存款和储蓄进程
1.封装
-- CREATE PROCEDURE p1()
-- BEGIN
-- INSERT into goods VALUES (null,'韩涉',50);
-- select * from goods;

-- END

call p1();
2.参数
-- in out inout
CREATE PROCEDURE p3(in i int,inout names varchar(50))
BEGIN
update goods set name = names where id = i;
END

set @names = '大鹅';

call p2(4,@names);

select @names;
into 使用
set @i = 0;
set @n = '';
select num into @i from goods where id = 1;

select @i;
3.判断
CREATE PROCEDURE p3(in flag char(5), in nums int)
BEGIN
if flag = 'true' then
SELECT * from goods where num < nums;
ELSEIF flag ='false' THEN
SELECT * FROM goods where num > nums;
ELSE
SELECT * FROM goods;
END if;

END
call p3('false',20);
4.循环
-- 做 1-100 累计的和
create PROCEDURE p4(in n int,out he int)
BEGIN
declare i int DEFAULT 0;
DECLARE sum int;
set sum = 0;
while i <= n DO
set sum = sum +i;
set i = i + 1;

end WHILE;
set he = sum;
end

set @he = 0;

call p4(100,@he);

select @he;
翻看存款和储蓄进程
show PROCEDURE status;
删去存储进度
drop PROCEDURE p1;

4.函数
create FUNCTION f1(x int,y int)
RETURNS INT

BEGIN
declare sum int DEFAULT 0;
set sum = x +y;
RETURN(sum);
END

select f1(100,2);

select g.*,f1(100,num) FROM goods g;

DROP FUNCTION f1;

5.事物
什么样是东西
黄金年代组sql语句批量举行,要么全部进行成功,要么全部实践停业

东西的多个特色:
原子性:对于其数量修正,要么全都实行,要么全都不实行。
风姿罗曼蒂克致性:数据库原本有怎么样的节制,事务实行之后还须要存在这里么的束缚,全体规规矩矩都必需运用于事情的改良,以维持全数数据的完整性。
隔离性:贰个业务无法理解其余二个事务的实市价况(中间状态).所以同三个多少在有多少个东西访谈时,此中二个得到数码访问改善,别的的事物处于拥塞状态,直到数据被假释,轮到下八个施用。
悠久性:即便现身致命的系统故障也将一直维持。不要告诉本身系统说commit(提交)成功了,回头电话告诉笔者,服务器机房断电了,作者的政工涉及到的数量修正大概没有进去数据库。
start TRANSACTION; -- 开启事物,关闭mysql本人的机动提交格局
SAVEPOINT sa1;

update account set money = money -1000 where id = 4;

SAVEPOINT sa1;

update account set money = money +1000 where id = 3;

-- COMMIT; -- 提交当前东西
select * from account;

ROLLBACK to sa1;-- 回滚当前东西

6.锁
当现身事务同有时间做客贰个能源时,有超大希望形成数据不等同,因而需求后生可畏种机制来将数据访谈顺序化,以保障数据库数据的后生可畏致性。

7.数据库的备份
备份:
mysqldump -uroot -p123456 数据库名 表 > 保存地点.
导入:
mysql> USE 数据库名;
mysql> source 备份文件.sql;

编辑:数据库 本文来源:for EACH row -- 固定写法

关键词:

  • 上一篇:没有了
  • 下一篇:没有了