MySQL之SQL语句零碎总结
一、MySQL中有个ifnull函数,跟Oracle的nvl类似,用法如下:
select* from Ta t where ifnull(pro, 0) < 100;
解释:当pro是null的时候返回0,否则返回pro本身;通过这个方法可以用来给参数定义默认值
,比如对于存储过程传来的参数如果是null则给它赋默认值-1:
if(ifnull(param, -1) < 10) then
...
elseif(...) then
...
else
...
end if;
二、创建函数:
在MySQL里函数和存储过程的内部语法其实很像,各自主要的特点是:
①存储过程可以通过call sp_xxx(..)单独调用,而函数则必须存在于其它SQL语句(比如select ifnull(..)、where ifnull(..)等)。
②存储过程可以调用存储过程,也可以直接调用函数(比如在if判断里),函数可以调用函数但是不能调用存储过程。
③存储过程的参数有三种类型in、out、inout,默认是in(没有指明任意一种类型的情况下)
,注意out类型的参数无论外部传来的参数是什么都会变为null,如果存储过程不对这个参数做任何操作则最终将输出null,而inout则类似C#的ref关键字。
④函数的参数不能带in、out、inout
⑤存储过程的方法签名里没有返回类型,后面直接接begin。。end块;而函数的方法签名最后面有returns 返回类型(如bigint)然后接begin。。end块。
⑥存储过程虽然方法签名里没有返回类型,但是它会返回内部select的集合,有多少个select语句就会返回多少个结果集,在C#里可以用DataSet一次性存储
,但是select..into和if(select..)等情况下的查询结果集不会作为存储过程的“返回值”。
创建函数的例子(不具备编程意义):
delimiter ;;
drop function if exists f_nvl;;
create function f_nvl(param varchar(20), defaultVal varchar(20)) RETURNs VARCHAR(20)
BEGIN
if(ifnull(param,null) is not null) THEN
return param;
ELSE -- elseif块后面也要then
return defaultVal;
end if;
END;;
创建存储过程的例子(不具备编程意义):
delimiter ;;
drop procedure if exists sp_test;;
create procedure sp_test(in pro varchar(20))
begin
-- create temporary table tmp select* from student; -- 不会存储到存储过程的返回结果集(DataSet)里而是放在临时表里
-- if(select count(1) from student) then -- 不会存储到返回结果集里
select* from monitor; -- 会存储到返回的结果集里,作为第一个记录集
select count(1) into @mm from student; -- 不会存储到返回结果集里
-- end if;
end;;
delimiter ;
三、delimiter的作用:
如上,在drop procedure。。之前先有个delimiter ;;的作用是告诉SQL解释器将“提交符”变更为;;,那么当SQL解释器看到;;后就会将;;之前的SQL语句
作为一个整体执行,类似SQLServer的go,也有点像Oracle增删改等情况下的commit(Oracle增删改等是需要commit;才会生效的);
这样子SQL解释器就能知道drop...;;这部分是一个整体。create。。。end;;这部分是一个整体而不会出现drop。。还没执行就接着create的情况。
四、个人经验:
建议大家学习SQL里的存储过程、函数、触发器、event等内容以及写一些的时候一定要和自己熟悉的编程语言关联起来,毕竟我们大多是都是代码写的
多存储过程、SQL函数等写的少;如果将存储过程和函数看成是Java、C#里的方法(有部分不同,但是内部业务逻辑实现流程还是很像的),而表就看成是
po对象集合,这样子会思路清晰很多。
五、distinct用法:
SQL:select distinct name,gender from student
解释:从student数据表里查询所有记录的name,gender列,并且去除name和gender同时重复的记录
,注意即便distinct(name),gender。。也是去除name和gender同时重复的记录而非只是name重复的记录(也是一种记录虚拟合并)
且distinct必须放在查询字段的开头,即select gender, distinct name 。。是错误的。其实distinct在功能上完全可以用group by代替,但是
如果只是去重且重复的记录很多则distinct效率以及方便程度都要比group by要好,如果需要对部分列去重但又要保留其它列的一些信息则要用group by和聚合函数。
六、SQL语句执行时间测试:
①是通过执行后的显示信息会提示耗时多少。
②当①情况为0时(即耗时太短时)可以用show profiles看duration和query列查看更详细的信息。
七:其它一些sql语句
1.insert into score_temp(score) select score from student limit 0, 1000;可以将第二个查询出来的结果放到第一个表里,一般用于临时表的数据插入,或定期将某表数据备份到另一个表(星期/月/年);
2.truncate table student;和delete比起来更快,因为它不需要有日志记录,但是delete是可恢复的,而truncate后不可恢复;
MySQL之SQL语句零碎总结的更多相关文章
- Mysql 常用 SQL 语句集锦
Mysql 常用 SQL 语句集锦 基础篇 //查询时间,友好提示 $sql = "select date_format(create_time, '%Y-%m-%d') as day fr ...
- Mysql 常用 SQL 语句集锦 转载(https://gold.xitu.io/post/584e7b298d6d81005456eb53)
Mysql 常用 SQL 语句集锦 基础篇 //查询时间,友好提示 $sql = "select date_format(create_time, '%Y-%m-%d') as day fr ...
- MySQL数据库sql语句的一些简单优化
1.查询条件的先后顺序 有多个查询条件时,要把效率高能更精确筛选记录的条件放在后边.因为MySQL解析sql语句是从后往前的(不知是否准确). 例: select a.*,b.* from UsrIn ...
- mysql下sql语句 update 字段=字段+字符串
mysql下sql语句 update 字段=字段+字符串 mysql下sql语句令某字段值等于原值加上一个字符串 update 表明 SET 字段= 'feifei' || 字段; (postgr ...
- MySQL数据库SQL语句基本操作
一.用户管理: 创建用户: create user '用户名'@'IP地址' identified by '密码'; 删除用户: drop user '用户名'@'IP地址'; 修改用户: renam ...
- mysql执行sql语句过程
开发人员基本都知道,我们的数据存在数据库中(目前最多的是mysql和oracle,由于作者更擅长mysql,所以这里默认数据库为mysql),服务器通过sql语句将查询数据的请求传入到mysql数据库 ...
- MySQL与SQL语句的操作
MySQL与SQL语句的操作 Mysql比较轻量化,企业用的是Oracle,基本的是熟悉对数据库,数据表,字段,记录的更新与修改 1. mysql基本信息 特殊数据库:information_sche ...
- mysql 操作sql语句 目录
mysql 操作sql语句 操作数据库 mysql 操作sql语句 操作数据表 mysql 操作sql语句 操作数据表中的内容/记录
- 不登录到MySQL执行SQL语句
mysql -e 不登录到MySQL执行SQL语句 mysql -u root -p -e "SHOW DATABASES"
随机推荐
- 前端-CSS-7-标准文档流&行内元素和块级元素转换
1.什么是标准文档流 <!-- 什么是标准文档流 宏观的将,我们的web页面和ps等设计软件有本质的区别 web 网页的制作 是个“流” 从上而下 ,像 “织毛衣” 而设计软件 ,想往哪里画东 ...
- 低版本eclipse离线集成svn步骤,亲测有效!!!
1.下载svn离线版的插件: 百度云盘链接:http://pan.baidu.com/s/1eSnMoHO 密码:6oef 2.解压出来的额目录如下: 3.将features和plugins里面的ja ...
- linux no space left on device
一般有两个原因: 1.磁盘空间不足 2.inode不足 用df -h查看磁盘空间使用情况 用df -i查看inode使用情况
- Hystrix-超时设置
由于客户端请求服务端方法时,服务端方法响应超过1秒将会触发降级,所以我们可以配置Hystrix默认的超时配置 如果我们没有配置默认的超时时间,Hystrix将取default_executionTim ...
- 使用FIO测试磁盘iops
我们如何衡量一个存储的性能呢?IOPS(Input/Output OperationsPer Second),即每秒进行读写(I/O)操作的次数是国际上通用的存储性能衡量标准,IOPS越高意味着在同一 ...
- Html解析类的新选择CsQuery
今天在做一个html解析的方法,以前用HtmlAgilityPack或Winista.HTMLParser. 现在发现了一个巨好用的项目叫CsQuery,这货据说不仅能解析html还能提取css. 选 ...
- 中文路径读取乱码,json乱码
strPath = 'E:\新建文件夹' #含有中文的路径,使用unicode函数转换. strPath = unicode(strPath , "utf8") 参考:http:/ ...
- onsubmit return false仍提交表单
博主之前遇到这样的问题,是因为代码有错,改正之后就正常了. 但今天确定代码没错,仍然return false提交表单. 总结网上各路大神的解释: 1.onsubmit的作用是防止form只有一个inp ...
- [leetcode]131. Palindrome Partitioning字符串分割成回文子串
Given a string s, partition s such that every substring of the partition is a palindrome. Return all ...
- 绑定服务-----------binderService TimerTask的使用
绑定服务 服务中通过定义Binder对象的子类让这个子类成为桥梁 在onBind()中返回子类对象 这样就可以在activity中调用这个子类的方法 在Activity中通过ServiceConn ...