写点什么

SQL 碎碎念, 你可能用不到但不能不知道的数据库技巧 (2)

作者:百里丶落云
  • 2022-11-05
    福建
  • 本文字数:2000 字

    阅读完需:约 7 分钟

前言

古语有云,牙疼不是病,疼起来真要命.平时可能看起来不是很重要的内容,等到真正用到时候才是心急如焚.本期讲解你可能不知道但是很实用的数据库技巧第二期.


大家好,这里是百里,SQL 碎碎念, 希望大家喜欢.

一、 领导是个强迫症,数据非要这么放

大家做 bi 时候可能会遇到有序,有规律的数据,我们这个时候 ORDER BY 某个主键排序展示就好,但是是否有遇到过无序数据,或者领导非要某个排序展示呢.


百里就遇到过,只因为领导觉得这个单位他原来待过 (~ ̄(OO) ̄)ブ .

语法

select  字段1 ,字段2 ,字段3  from 表   where 条件1 条件2ORDER BY CHARINDEX(需要排序的字段, + '内容1,内容2,内容3,内容4')
复制代码

实例

select  plantname,cc_type,all_qty  from VIEW_TEXT a where a.docdate='2022-06-30' and cc_type='成型' and in_ex like '%合计%' ORDER BY CHARINDEX(plantname, + '一厂,二厂,自动化车间,防水车间,五厂,射出车间,八厂')
复制代码


二、常用函数经常用,工作轻松就搞定

虽然现在很多后端都集成了 sql ,只需要配置就可以实现自动实现 ORM 但是,一些复杂内容仍然需要使用 sql 来书写。


熟练使用常用函数,可以大大提升工作效率,。


REPLACE()


替换函数


REPLACE ( ''string_replace1'' , ''string_replace2'' , ''string_replace3'' )


参数


''string_replace1''


待搜索的字符串表达式。string_replace1 可以是字符数据或二进制数据。


''string_replace2''


待查找的字符串表达式。string_replace2 可以是字符数据或二进制数据。


''string_replace3''


替换用的字符串表达式。string_replace3 可以是字符数据或二进制数据。


left()


左截断函数


LEFT (<character_expression>, <integer_expression>)


  返回 character_expression 左起 integer_expression 个字符。



charindex()


查询位置函数


CHARINDEX (<’substring_expression’>, <expression>)


返回字符串中某个指定的子串出现的开始位置。


其中 substring _expression 是所要查找的字符表达式,expression 可为字符串也可为列名表达式。如果没有发现子串,则返回 0 值。


此函数不能用于 TEXT 和 IMAGE 数据类型。



stuff()


指定删除函数



--通过在第一个字符串 (abcde) 中删除从第二个位置(字符 b)开始的三个字符,


--然后在删除的起始位置插入第二个字符串,创建并返回一个字符串。


cast()和 conver()


数据类型转换函数


SELECT CAST('1' AS int),CONVERT(int,'1')


SqlServer 也会隐式转换,如:用字符串乘以一个整形,


整形优先级要大,SqlServer 将自动将字符串转为整形


SELECT '1'*2


显示转换安全点,不然出现莫名奇妙的错误都不好找


SELECT CAST('1SET NOCOUNT ON' AS int)*2

三、小细节不要漏,查询速度直线升

大家都知道查询数据库是 io 操作,但是你知道因为你的陋习,可能查询速度比别人慢了很多么。


  1. 大数据存临时表,增加对应索引。

  2. MySQL 官方对索引的定义为:索引(Index)是帮助 MySQL 高效获取数据的数据结构,通俗来讲索引就好比书本的目录,加快数据库的查询速度。

  3. 语法

    在某个字段上创建索引的基本语法如下:

CREATE INDEX index_nameON table_name ( column1, column2.....);
复制代码

index_name 是索引的名字,以后在删除索引时会用到。

示例

使用 SQL 语句创建一个包含七列的 website 表:

CREATE TABLE website (    id      INT              NOT NULL   AUTO_INCREMENT,    name    VARCHAR(20)      NOT NULL,    url     VARCHAR(30),    age     TINYINT UNSIGNED NOT NULL,    alexa   INT UNSIGNED     NOT NULL,    uv      FLOAT                       DEFAULT '0',    country CHAR(3)          NOT NULL,    PRIMARY KEY (`id`));
复制代码

现在您可以针对 name 字段创建索引,用以提高检索姓名时的效率,如下所示:

CREATE INDEX myIndexON website(name);
复制代码

  1. 存储过程不要忘记,SET NOCOUNT ON

  2. 当 SET ONCOUNT ON 时候,不返回计数,当 SET NOCOUNT OFF 时候,返回计数;


转换为


  1. WITH NOLOCK()


当我们在下 SQL Command 时,在语法中加一段 WITH (NOLOCK)

可以改善在线大量查询的环境中数据集被 LOCK 的现象藉此改善查询的效能,据说能提升 33%。

因为 SQL Server 会执行对应的锁定一致性检查。

欲改善整体数据库查询的效能,请将 WITH (NOLOCK)加在您的 SELECT 语法中 Table 名称的后面,虽然(NOLOCK)也可以,但是微软还是建议大家要加 WITH。

除了简单的 SELECT 之外,有 JOIN 的 SELECT 语法也是可以使用的。但是 DELETE、INSERT、UPDATE 这些需要 transaction 的指令就不行了…

例子:

SELECTCOUNT(UserID)   FROM    EMPLOYEE WITH (NOLOCK)           JOIN WORKING_GROUP WITH (NOLOCK)           ON EMPLOYEE.UserID = WORKING_GROUP.UserID  
复制代码


不过有一个弊端, 就是会产生脏读的风险。


总结:

本文介绍了,sql 中一些常用函数的使用方法,并介绍了一些 sql 优化的方式.了解了这些内容,可以让您在工作中解决一些会不重要但是很麻烦的问题. 希望能够帮到您.


今天的不开心就到此为止吧, 明天依旧光芒万丈~ 这里是百里,如果我帮到您,谢谢点个赞~.



发布于: 刚刚阅读数: 2
用户头像

能力越大,责任越大 2020-05-26 加入

python自学患者 某4线小城市,用不到py的python爱好者

评论

发布
暂无评论
SQL 碎碎念,你可能用不到但不能不知道的数据库技巧(2)_数据库_百里丶落云_InfoQ写作社区