mysql笔记

1、mysql 判断字符串是否为数字:

CHAR_LENGTH(字符串) = CHAR_LENGTH(CAST(字符串 AS UNSIGNED INTEGER))

2、mysql UNION使用:

select1 union select2

select1和select2 的字段名称及字段的顺序必须保持一致,并且结果会默认去掉重复的记录

select1 union all select2

select1和select2 的字段名称及字段的顺序必须保持一致,结果不会去重。

3、mysql 使用外键实现级联删除和更新(当删除主表的一条记录时,从表中与之对应的记录也会被删除)

以获取京东订单的数据结构举例:

主表:jd_order

CREATE TABLE `jd_order` (
`ID` int(10) unsigned NOT NULL AUTO_INCREMENT,
`order_id` varchar(45) DEFAULT NULL,
`order_source` varchar(45) DEFAULT NULL,
`customs` varchar(45) DEFAULT NULL,
`customs_model` varchar(45) DEFAULT NULL,
`vender_id` varchar(45) DEFAULT NULL,
`pay_type` varchar(45) DEFAULT NULL,
`order_total_price` varchar(45) DEFAULT NULL,
`order_seller_price`varchar(45) DEFAULT NULL,
`order_payment` varchar(45) DEFAULT NULL,
`freight_price` varchar(45) DEFAULT NULL,
`seller_discount` varchar(45) DEFAULT NULL,
`order_state` varchar(45) DEFAULT NULL,
`order_state_remark` varchar(45) DEFAULT NULL,
`delivery_type` varchar(45) DEFAULT NULL,
`invoice_info` varchar(45) DEFAULT NULL,
`order_remark` varchar(45) DEFAULT NULL,
`order_start_time` varchar(45) DEFAULT NULL,
`order_end_time` varchar(45) DEFAULT NULL,
`modified` varchar(45) DEFAULT NULL,
`vender_remark` varchar(45) DEFAULT NULL,
`balance_used` varchar(45) DEFAULT NULL,
`payment_confirm_time` varchar(45) NOT NULL,
`waybill` varchar(45) DEFAULT NULL,
`logistics_id` varchar(45) DEFAULT NULL,
`vat_invoice_info` varchar(45) DEFAULT NULL,
`parent_order_id` varchar(45) DEFAULT NULL,
`pin` varchar(45) DEFAULT NULL,
`return_order` varchar(45) DEFAULT NULL,
`order_type` varchar(45) DEFAULT NULL,
`store_order` varchar(45) DEFAULT NULL,
`flag1` tinyint(4) NOT NULL DEFAULT '0',
`flag2` tinyint(4) NOT NULL DEFAULT '0',
`flag3` tinyint(4) NOT NULL DEFAULT '0',
`REMARK1` varchar(255) DEFAULT NULL,
`REMARK2` varchar(255) DEFAULT NULL,
`REMARK3` varchar(255) DEFAULT NULL,
`REMARK4` varchar(255) DEFAULT NULL,
`NEWUID` int(10) unsigned DEFAULT NULL,
`NEWTID` varchar(45) DEFAULT NULL,
`NEWTIME` char(17) DEFAULT NULL,
`UPDUID` int(10) unsigned DEFAULT NULL,
`UPDTID` varchar(45) DEFAULT NULL,
`UPDTIME` char(17) DEFAULT NULL,
PRIMARY KEY (`ID`),
KEY `order_id` (`order_id`)
) ENGINE=InnoDB AUTO_INCREMENT=260251 DEFAULT CHARSET=utf8;

从表:jd_ordercoupon

CREATE TABLE `jd_ordercoupon` (
`ID` int(10) unsigned NOT NULL AUTO_INCREMENT,
`order_id` varchar(45) DEFAULT NULL,
`sku_id` varchar(45) DEFAULT NULL,
`coupon_type` varchar(45) DEFAULT NULL,
`coupon_price` varchar(45) DEFAULT NULL,
`flag1` tinyint(4) NOT NULL DEFAULT '0',
`flag2` tinyint(4) NOT NULL DEFAULT '0',
`flag3` tinyint(4) NOT NULL DEFAULT '0',
`REMARK1` varchar(255) DEFAULT NULL,
`REMARK2` varchar(255) DEFAULT NULL,
`REMARK3` varchar(255) DEFAULT NULL,
`REMARK4` varchar(255) DEFAULT NULL,
`NEWUID` int(10) unsigned DEFAULT NULL,
`NEWTID` varchar(45) DEFAULT NULL,
`NEWTIME` char(17) DEFAULT NULL,
`UPDUID` int(10) unsigned DEFAULT NULL,
`UPDTID` varchar(45) DEFAULT NULL,
`UPDTIME` char(17) DEFAULT NULL,
PRIMARY KEY (`ID`),
KEY `order_id` (`order_id`),
CONSTRAINT `jd_ordercoupon` FOREIGN KEY (`order_id`) REFERENCES `jd_order` (`order_id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=260251 DEFAULT CHARSET=utf8;

以上是创建两个表jd_order和jd_ordercoupon,

CONSTRAINT `jd_ordercoupon` FOREIGN KEY (`order_id`) REFERENCES `jd_order` (`order_id`) ON DELETE CASCADE ON UPDATE CASCADE

这段sql语句表示的就是将主表jd_order的order_id字段做为从表jd_ordercoupon的外键,以达到级联删除和更新的效果。

4、insert into:

1)插入新行时使用如下语句插入,字段与值必须一 一对应。表中未列出的字段值为其默认值。

INSERT INTO table_name (字段1,字段2,字段3) VALUES(值1,值2,值3)

2)插入新行时使用如下语句插入,必须将表中所有值都列出。

INSERT INTO table_name VALUES(值1,值2,值3,...)

5、update:

1)、UPDATE table_name SET 字段1=新值1,字段2=新值2,字段3=新值3 WHERE 字段1=值1

2)、update test  set 字段1=case when 条件1 then 值1   when 条件2 then 值2  end 

6、delete

DELETE FROM 表名称 WHERE 列名称=值

 7、存储过程

创建存储过程

create procedure P_LoadPageData(in pageIndex int,in pageSize int,out total int)
begin
declare iPageIndex int;  //mysql中在存储过程中声明变量
set iPageIndex=(pageIndex-1)*pageSize;  //给变量赋值
select * from t_game order by ID limit iPageIndex,pageSize;   //mysql中一定范围条数数据用limit,sql server中用top。limit关键字后面只能跟整数,不能跟表达式(如果需要用到表达式就将表达式赋值给一个变量)
select count('a') into total from t_game;   //mysql中将查询结果赋值给变量,sql server 中select total=count('a') from t_game;
end

调用存储过程

call P_LoadPageData(1,2,@a);
select @a;

 存储过程优点:

1)、比Donet直接写sql脚本执行少了一块解析编译的过程,效率更快一点(不是很明显)

2)、使用存储过程,业务逻辑改变的时候只需要改变存储过程,然后业务逻辑就发生变化了,不需要修改C#代码

3)、传递sql脚本数据相对小

缺点:

1)、使用存储过程,数据库可移植性差

2)、把业务放到存储过程里面,相当于业务处理的压力放到数据库里面去

存储过程的使用注意:

1)、因为存储过程是让数据库来处理逻辑,这就增加了数据库的负担,而数据库达到瓶颈之后进行集群分流的难度比起在业务层来做集群,做分流的难度要大得多,所以建议

除非在非常有必要的时候用存储过程,其余时候能不用存储过程就不用。在开发的过程中最好都使用sql脚本的方式来实现逻辑,避免使用存储过程。

posted @ 2017-02-16 13:38  你是我的四月天  阅读(266)  评论(0编辑  收藏  举报