2019独角兽企业重金招聘Python工程师标准>>>

很久没写博客了,快过年了,今天工作比较轻松,晚上把之前的一些积累的东西整理一下

文章的题目是我的一个小分享,主要是收集了一些不太常用的sql语法。打算之后做一个oracle的姊妹篇。

ADELETE语法

1 delete可以和orderby及limit同时使用,比较适用于删除某种排序时的前若干条记录

DELETE  FROM `city` where CountryCode='AFG' ORDER BY ID limit 1;

另外这条语句锁表的话是锁全表还是只锁一行?

答案是只锁一行,验证如下:

会话1:delete from tttt order by id limit 1;
会话2:select * from tttt where id =7 for update; -->锁住
select * from tttt where id =9 for update -->没有锁住

2 delete可是适用LOW_PRIORITY关键字

如果指定LOW_PRIORITY,则DELETE的执行被延迟,直到没有其它客户端读取本表时再执行

3 delete可以使用QUICK关键字

对于MyISAM表,如果您使用QUICK关键词,则在删除过程中,存储引擎不会合并索引端结点,这样可以加快部分种类的删除操作的速度

4 delete可以使用IGNORE关键字

在删除行的过程中,IGNORE关键词会使MySQL忽略所有的错误。(在分析阶段遇到的错误会以常规方式处理。)由于使用本选项而被忽略的错误会作为警告返回。

5 如果删除了auto_increment最大的字段,那么下次再插入的时候是否会重复使用这个最大字段?

myisam及innodb不会重复适用,bdb会重新用这个字段

6 多表删除没有order by及limit的关键字

7 多表删除支持*的语法,如果删除的字段不是*,是具体的某个字段可以么?

是不可以的,是会报错的

DELETE city.CountryCode, countrylanguage.* FROM country, city, countrylanguage WHERE city.CountryCode = country.`Code` AND countrylanguage.CountryCode = country.`Code` AND country.`Code` = 'AFG'
Unknown table 'countrycode' in MULTI DELETE

B INSERT语法

1 insert可以使用DELAYED关键字

如果您使用DELAYED关键字,则服务器会把待插入的行放到一个缓冲器中,而发送INSERT DELAYED语句的客户端会继续运行。如果表正在被使用,则服务器会保留这些行。当表空闲时,服务器开始插入行,并定期检查是否有新的读取请求。如果有新的读取请求,则被延迟的行被延缓执行,直到表再次空闲时为止。

客户端使用INSERT DELAYED时,会立刻从服务器处得到一个确定。并且行被排入队列,当表没有被其它线程使用时,此行被插入。另外 INSERT DELAYED仅适用于MyISAM, MEMORY和ARCHIVE表。

与delead有关的一些参数如下:

show status like '%Delayed%';
+--------------------------+-------+
| Variable_name | Value |
+--------------------------+-------+
| Delayed_errors | 0 |
| Delayed_insert_threads | 0 |
| Delayed_writes | 0 |
| Not_flushed_delayed_rows | 0 |
+--------------------------+-------+

2 insert可以什么都不写进行插入,前提是字段不能有非空限定或者有默认值,如下的语句也是可以的,会插入一行空值

INSERT INTO tbl_name () VALUES()

3 insert中没有and关键字,但是下面的语句也不会报错,只是会有逻辑错误

insert into tttt set name='1' and name='3' ,age=3

4 insert有ON DUPLICATE KEY UPDATE的用法,如果插入行导致一个unique索引或者主键冲突而导致插入失败后,on duplicate key 后面的语句依旧会执行

insert into tttt set id=1 ,name='name3' ,age=5
on DUPLICATE key update age=age*3;

插入时遇到id冲突 依旧会执行 age×3的操作

5 ON DUPLICATE KEY UPDATE语法支持values()函数

insert into tttt set id=1 ,name='name3' ,age=5
on DUPLICATE key update age=VALUES(id);

6 insert ...select语法没有 DELAYED关键字

C REPLACE语法

1 replace语法的流程如下:

如果表中的一个旧记录与一个用于PRIMARY KEY或一个UNIQUE索引的新记录具有相同的值,则在新记录被插入之前,旧记录被删除
尝试把新行插入到表中
当因为对于主键或唯一关键字出现重复关键字错误而造成插入失败时:
a.    从表中删除含有重复关键字值的冲突行
b.    再次尝试把新行插入到表中

2如果replace的时候同时发生了主键及唯一键冲突的时候会执行什么操作?

REPLACE into tttt set id =1 ,name='name5'

会有id和name同时冲突的话,原有的id=1的id=2,name=name5的数据被删除,只保留一条id=1 ,name=name5的数据

D SELECT语法

1 别名的AS是可以选择使用的,别名用于gruop by,order by 和having中是可以的

SELECT id as num,CONCAT(CountryCode,'*',District) AS t from city where num>6

select中的别名用于gruop by,order by 和having中,如果别名和现有字段冲突会优先使用别名

SELECT MAX(Population) as ID FROM `city` GROUP BY CountryCode HAVING id>669181;

city表中已经有了ID字段,我们强制把 population别名为ID,在having中使用ID作为分组条件,结果显示使用别名代表的字段即max(population)作为过滤条件

2 order by, group by 可以使用列位置

SELECT id  from city ORDER BY 1

3 group by也可以排序

SELECT a, COUNT(b) FROM test_table GROUP BY a DESC

4 limit可以使用OFFSET关键字

SELECT *  from city LIMIT 1 OFFSET 10;
SELECT *  from city LIMIT 10,1;

这两个语句是等价的

5 在使用行子查询的时候可以使用ROW关键字

SELECT * FROM t1 WHERE (1,2) = (SELECT column1, column2 FROM t2);
SELECT * FROM t1 WHERE ROW(1,2) = (SELECT column1, column2 FROM t2);

6 select中有SQL_CALC_FOUND_ROW关键字,做分页的时候很好用,其好处就是只查询一次数据库,效率提高了一半,其用法如下:

SELECT * FROM city;
SELECT FOUND_ROWS();

总结一下,本文列出了一些mysql中容易被忽略的语法,主要是inert,delete,replace及select,update的语法规则与前面几个相像,所以没有找到特殊的用法,本文的语法规则主要以mysql5.1为准,与5.5的版本是兼容的。

转载于:https://my.oschina.net/zimingforever/blog/108143

那些年我们一起追过的稀奇古怪的SQL相关推荐

  1. 那些年我们一起追过的缓存写法(二)

    感谢园子里的同学对上一篇的支持,很高兴楼主的一些经验及想法能够对大家有一些帮助. 上次主要讨论缓存读写这块各种代码实现,本篇就上次的问题继续来,看看那些年折腾过的各种缓存做法. 阅读目录: 缓存预热 ...

  2. 《那些年我们一起追过的女孩》你真的看懂了吗?

    世上有很多东西是可以挽回的,比如良知,比如体重.但不可挽回的东西也很多,旧梦,岁月,对一个人的感觉.放弃一个很爱你的人并不痛苦,放弃一个你很爱的人才是痛苦.感情无大事,能导致分手的,很多时候是因为一场 ...

  3. 那些年我们踩过的坑,SQL 中的空值陷阱!

    那些年我们踩过的坑,SQL 中的空值陷阱! 置顶 不剪发的Tony老师 2019-12-31 07:31:17 6737 收藏 66 分类专栏: SQL 文章标签: sql 空值 mysql orac ...

  4. 那些年我们一起追过的技术和开源软件

    一转眼,在IT软件行业里已经摸爬滚打十年了,回想多年来的软件开发生涯,研究过很多开源技术和代码,也见识过很多没用过的,下面我就把我接触过或了解过的优秀开源软件给大家做个梳理和总结,以方便大家来参考查阅 ...

  5. 那些年我们一起追过的Shell Script

    原本这是自己在几个月前为公司的一个分享活动写的一个投影片,今天趁大脑负荷比较小,把这个话题拿到blog上面来分享一下.从知道shell算起至今也就几个年头而已,如今勉强算是入门了.对某一个新事物的掌握 ...

  6. 那些年我们一起追过的大佬

    观众朋友们,过年好! 今天我带来的分享主题是"那些年一起追求的大佬",主要内容聊聊就是近两年线上.线下认识的牛人们,从他们身上学到的一些东西. 首先简单自我介绍一下,我是公众号&q ...

  7. 领航服务器系统,应用领航:盘点那些年我们一起追过的OS

    服务器操作系统三分天下 随着科技是时代的到来,操作系统的重要性越加凸显,苹果的成功,HTC的热卖,无疑不说明占领操作系统就会在整个终端市场争夺中握有主动权.而在服务器方面,可以说操作系统更是尤为重要, ...

  8. 那些年我们一起追过的美剧

    " 这些年追美剧成了晚上的重要消遣.谨以此文做一个小结." 斯巴达克斯 几年前,我去英国出差,晚上在公寓休息的时候,打开了电视,那个频道正在播一部电视剧,冷不防出现了一段全裸镜头. ...

  9. 你是否还记得?那些年我们一起追过的(FIDL:Flutter界的AIDL)

    前言 大家好!今天给大家安利一个自认为比较重磅的Flutter开源项目. Flutter的产品定义是一个高性能的跨平台的移动UI框架,能够用一套代码同时构建出Android/iOS/Web/MacOS ...

  10. 那些年我们一起撸过的缓存写法

    上次主要讨论缓存读写这块各种代码实现,本篇就上次的问题继续来,看看那些年折腾过的各种缓存做法. 阅读目录: 缓存预热 多级缓存 线程缓存 内存缓存 文件缓存 分布式缓存 DB缓存 多层缓存 总结 缓存 ...

最新文章

  1. HashMap 源码深入浅出
  2. 按键的使用(一)------verilog
  3. Python属性和内建属性
  4. PHP用substr截取字符串出现中文乱码问题用mb_substr
  5. atomic的安全性?
  6. IBM宣布:成功研制出了量子计算机原型机,量子计算机商业化正在加速!
  7. 阶段5 3.微服务项目【学成在线】_day02 CMS前端开发_22-CMS前端页面查询开发-Api调用-跨域解决...
  8. plot函数_激活函数-双曲正切函数tanh函数
  9. SAP B1打印报表实现本页合计和本单合计的方法
  10. 【Android】五种常用布局方式详解(图文+示例)持续更新中...
  11. 百度地图坐标转换及跨域
  12. PSENet原理与代码解析
  13. 现代笑话二则 木子家创作
  14. 解决Pycharm中下载不了sklearn问题
  15. 7-7 到底是不是太胖了
  16. Google退出中国损失的不止是搜索机会
  17. 转 怎么回答“分布式架构”才能让面试官满意?
  18. PC时代IE浏览器获胜,Web时代呢?
  19. 【数学几何】四等分的角度
  20. RockChip Linux USB 开发(一)

热门文章

  1. 计算机在学前教育中作用论文,学前教育论文
  2. 零基础CSS入门教程(30)–CSS布局实例
  3. PL/SQL Developer 9.0.1.1613
  4. 工控变成用c语言还是plc,浅析工控机与PLC的区别
  5. java 短链跳转原理_短连接跳转的原理
  6. C/S、B/S架构模式的三层结构特点分析
  7. Java类属性字段校验(validation的使用)
  8. mt6735 [AT Command] AP下发AT+CLAC命令后 ,手机出现宕机
  9. 如何计算均值、标准差和标准误差
  10. C语言-函数(一):函数的定义和调用