mysql 数据库知识
order by 字段 将查到的list集合按指定字段升序排序
order by 字段 DESC 将查到的list集合按指定字段降序排序
GROUP BY 语句用于结合合计函数,根据一个或多个列对结果集进行分组。
关键词 DISTINCT 用于返回唯一不同的值。
SELECT DISTINCT 列名称 FROM 表名称
select id, distinct name from A; --会提示错误,因为distinct必须放在开头 ----------------------------------------------------------------------------------------------------------------------------------
mysql判断字段非空以及非空字符串(mybatis中使用) 单单只是判空可以直接用IFNULL(expr1,expr2) 函数
写法一:if(表达式一,值一,值二) 判空用到了isnull函数 mysql工具上可以运行,但是mybatis中不支持用字符串长度判空字符串的写法
SELECT m.memo AS VALUE, DATE_FORMAT(m.createDate, '%Y-%m-%d %H:%i:%S') AS createDate,
IF(ISNULL((SELECT memo FROM t_user_friend WHERE userid=f.friendid AND friendid=f.userid AND STATUS=1)) ||
LENGTH(TRIM((SELECT memo FROM t_user_friend WHERE userid=f.friendid AND friendid=f.userid AND STATUS=1)))<1,
(SELECT userName FROM t_shop_user WHERE id=f.userid AND STATUS=1),
(SELECT memo FROM t_user_friend WHERE userid=f.friendid AND friendid=f.userid AND STATUS=1)) AS username
,(SELECT path FROM t_shop_user WHERE id=f.userid) AS photourl
FROM t_user_friend_message m
LEFT JOIN t_user_friend f ON f.id=m.parentid
LEFT JOIN t_shop_user u ON f.userid=u.id
WHERE f.friendid=#{id,jdbcType=INTEGER} AND m.status=1
AND DATE_FORMAT(m.createDate, '%Y-%m-%d')=CURRENT_DATE
ORDER BY m.createDate DESC
写法二:格式同上 更改了判空字符串的写法,支持mybatis
SELECT m.memo AS VALUE, DATE_FORMAT(m.createDate, '%Y-%m-%d %H:%i:%S') AS createDate,
IF(ISNULL((SELECT memo FROM t_user_friend WHERE userid=f.friendid AND friendid=f.userid AND STATUS=1)) ||
(SELECT memo FROM t_user_friend WHERE userid=f.friendid AND friendid=f.userid AND STATUS=1)='',
(SELECT userName FROM t_shop_user WHERE id=f.userid AND STATUS=1),
(SELECT memo FROM t_user_friend WHERE userid=f.friendid AND friendid=f.userid AND STATUS=1)) AS username
,(SELECT path FROM t_shop_user WHERE id=f.userid) AS photourl
FROM t_user_friend_message m
LEFT JOIN t_user_friend f ON f.id=m.parentid
LEFT JOIN t_shop_user u ON f.userid=u.id
WHERE f.friendid=#{id,jdbcType=INTEGER} AND m.status=1
AND DATE_FORMAT(m.createDate, '%Y-%m-%d')=CURRENT_DATE
ORDER BY m.createDate DESC
写法三: 判空使用not exists
语法: EXISTS subquery
参数: subquery 是一个受限的 SELECT 语句 (不允许有 COMPUTE 子句和 INTO 关键字)。
结果类型: Boolean 如果子查询包含行,则返回 TRUE ,否则返回 FLASE 。
区别:exists (sql 返回结果集为真)
not exists (sql 不返回结果集为真)
SELECT m.memo AS VALUE, DATE_FORMAT(m.createDate, '%Y-%m-%d %H:%i:%S') AS createDate,(SELECT memo FROM t_user_friend WHERE userid=f.friendid AND friendid=f.userid AND STATUS=1) AS aaa,
IF(NOT EXISTS((SELECT memo FROM t_user_friend WHERE userid=f.friendid AND friendid=f.userid AND STATUS=1)) ||
(SELECT memo FROM t_user_friend WHERE userid=f.friendid AND friendid=f.userid AND STATUS=1)='',
(SELECT userName FROM t_shop_user WHERE id=f.userid AND STATUS=1),
(SELECT memo FROM t_user_friend WHERE userid=f.friendid AND friendid=f.userid AND STATUS=1)) AS username
,(SELECT path FROM t_shop_user WHERE id=f.userid) AS photourl
FROM t_user_friend_message m
LEFT JOIN t_user_friend f ON f.id=m.parentid
LEFT JOIN t_shop_user u ON f.userid=u.id
WHERE f.friendid=1 AND m.status=1
AND DATE_FORMAT(m.createDate, '%Y-%m-%d')=CURRENT_DATE
ORDER BY m.createDate DESC
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
sql调优
①:创建必要的索引
在经常需要进行检索的字段上创建索引,比如要按照姓名进行检索,那么就应该在姓名字段上创建索引,如果
经常要按照员工部门和员工岗位级别进行检索,那么就应该在员工部门和员工岗位级别这两个字段上创建索引。创
建索引给检索带来的性能提升往往是巨大的,因此在发现检索速度过慢的时候应该首先想到的就是创建索引。
②:使用预编译查询
程序中通常是根据用户的输入来动态执行SQL,这时应该尽量使用参数化SQL,这样不仅可以避免SQL注入漏洞
攻击,最重要数据库会对这些参数化SQL进行预编译,这样第一次执行的时候DBMS会为这个SQL语句进行查询优化
并且执行预编译,这样以后再执行这个SQL的时候就直接使用预编译的结果,这样可以大大提高执行的速度。
③:调整Where字句中的连接顺序
DBMS一般采用自下而上的顺序解析where字句,根据这个原理表连接最好写在其他where条件之前,那些可以
过滤掉最大数量记录。
④:尽量将多条SQL语句压缩到一句SQL中
每次执行SQL的时候都要建立网络连接、进行权限校验、进行SQL语句的查询优化、发送执行结果,这个过程
是非常耗时的,因此应该尽量避免过多的执行SQL语句,能够压缩到一句SQL执行的语句就不要用多条来执行。
⑤:用where字句替换HAVING字句
避免使用HAVING字句,因为HAVING只会在检索出所有记录之后才对结果集进行过滤,而where则是在聚合前
刷选记录,如果能通过where字句限制记录的数目,那就能减少这方面的开销。HAVING中的条件一般用于聚合函数
的过滤,除此之外,应该将条件写在where字句中。
⑥:使用表的别名
当在SQL语句中连接多个表时,请使用表的别名并把别名前缀于每个列名上。这样就可以减少解析的时间并减
少哪些友列名歧义引起的语法错误。
⑦:在in和exists中通常情况下使用EXISTS,因为in不走索引。
⑧:避免在索引上使用计算
在where字句中,如果索引列是计算或者函数的一部分,DBMS的优化器将不会使用索引而使用全表查询,函数
属于计算的一种
效率低:select * from person where salary*12>25000(salary是索引列)
效率高:select * from person where salary>25000/12(salary是索引列)
⑨:用union all替换union
当SQL语句需要union两个查询结果集合时,即使检索结果中不会有重复的记录,如果使用union这两个结果集
同样会尝试进行合并,然后在输出最终结果前进行排序,因此如果可以判断检索结果中不会有重复的记录时候,应
该用union all,这样效率就会因此得到提高。
⑩:避免SQL中出现隐式类型转换
当某一张表中的索引字段在作为where条件的时候,如果进行了隐式类型转换,则此索引字段将会不被识别,因
为隐式类型转换也属于计算,所以此时DBMS会使用全表扫面。
最后需要注意的是:防止检索范围过宽
如果DBMS优化器认为检索范围过宽,那么将放弃索引查找而使用全表扫描。下面几种可能造成检索范围过宽的
情况。
a、使用is not null或者不等于判断,可能造成优化器假设匹配的记录数太多。
b、使用like运算符的时候,“a%”将会使用索引,而“a%c”和“%a”则会使用全表扫描,因此“a%c”和“%a”不能被有
效的评估匹配的数量。
mysql 数据库知识的更多相关文章
- Mysql数据库知识-Mysql索引总结 mysql mysql数据库 mysql函数
mysql数据库知识-Mysql索引总结: 索引(Index)是帮助MySQL高效获取数据的数据结构. 下边是自己整理的资料与自己的学习总结,,做一个汇总. 一.真的有必要使用索引吗? 不是每一个性能 ...
- mysql数据库知识
学而时习之,不亦说乎! --<论语> 数据库所有操作的总结. 1.mysql的数据库服务为mysqld.exe windo ...
- mysql数据库第三弹
mysql数据库知识拓展 视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,并可以将其当作表来使用. SELECT ...
- 青铜到王者,快速提升你 MySQL 数据库的段位!
Reference: https://mp.weixin.qq.com/s?src=11×tamp=1513259125&ver=574&signature=Uxls ...
- 170523、快速提升你 MySQL 数据库的段位
MySQL 数据库知识脉络,大致可以分为四大模块: ● MySQL 体系结构: ● MySQL 备份恢复: ● MySQL 高可用集群: ● MySQL 优化. 从四大模块中,抽离7个部分给大家做分析 ...
- MySQL的知识回顾
经过一段时间的NodeJs开发经历,选用的数据库是MySQL,一开始以为自己对数据库的基础知识掌握还ok,因为毕竟自己以前用过Apache+PHP+MySQL做数据库课程设计,但是在开发过程中才知道在 ...
- Java必学MySQL数据库应用场景
Java教程分享Java必学之MySQL数据库应用场景,在当前的后台开发中,MySQL应用非常普遍,企业在选拔Java人才时也会考察求职者诸如性能优化.高可用性.备份.集群.负载均衡.读写分离等问题. ...
- mysql数据库相关知识
什么是数据库? 数据库(Database)是按照数据结构来组织.存储和管理数据的建立在计算机存储设备上的仓库.(来自:百度) 什么是sql? 结构化查询语言(Struct ...
- 数据库 MySQL基础知识
(关于MySQL的安装,具体见下面博客:http://www.cnblogs.com/wj-1314/p/7573242.html) 一.什么是数据库 ? 数据库是按照数据结构来组织,存储和管理数据的 ...
随机推荐
- C语言面试问答(3)
12个滑稽的C语言面试问答——<12个有趣的C语言问答>评析(3) 前文链接:http://www.cnblogs.com/pmer/p/3322429.html 5,atexit wit ...
- Asp.Net MVC 进阶篇:路由匹配 实现博客路径 和文章路径
Asp.Net MVC 进阶篇:路由匹配 实现博客路径 和文章路径 我们要实现 通过路由 匹配出 博客地址 和博客文章地址 例如下面的这两个地址 //http://www.cnblogs.com/ma ...
- Java用jdom.jar解析读取XML文件信息
jdom.jar下载地址1:http://www.jdom.org/downloads/ 下载地址2:http://www.java2s.com/Code/Jar/j/Downloadjdomjar. ...
- SQLSERVER2012 列存储索引的简单研究和测试
SQLSERVER2012 列存储索引的简单研究和测试 SQLSERVER2012 列存储索引的简单研究和测试 看这篇文章之前可以先看一下下面这两篇文章: 列存储索引 http://www.cnblo ...
- Koala Framework
Koala Framework是什么?我为什么要写这个框架? 当时的监管组,技术力量累积的很少,还在直连DB,使用着DataTable.DataSet作为数据的承载,监管是公司最近几年主推的项目, ...
- BST&AVL&红黑树简单介绍
(BST&AVL&红黑树简单介绍) 前言: 节主要是给出BST,AVL和红黑树的C++代码,方便自己以后的查阅,其代码依旧是data structures and algorithm ...
- iphone/ipad/iOS on Linux Debian7/ubuntu12.04/linuxmint13/ubuntu14.04 compiling from source
The packages we need for ubuntu12.04 and its derived destros are: libimobiledevices, libplist, libus ...
- 基于libgdx游戏引擎开发的飞天猫
闲来没事学学游戏,这是鄙人第一个小游戏——飞天猫 1,基于Android开发的小游戏,至少Android2.2以上的系统. 2,界面简洁,美观,游戏易操作,上手快. 3,可以左右摇摆手机来改变飞天猫的 ...
- struts升级到最高版本后遇到的问题。关于actionmessage传递问题。
Struts2升级到最新版本遇到的一些问题 首先是更换对应的jar,如asm.common.ongl.struts等等.更换后发现系统启动不了,按照网上的介绍,先后又更新了slf4j-log4j12- ...
- anadonca环境配置和模块安装
1.最方便的python环境配置: 下载anaconda即可,自带spyder,集成科学计算的库,自带pip,不用折腾. 想用sublime编写python并运行的话,需要自己配置编译环境,并下载插件 ...