MySQL杂乱汇总笔记

AND/OR语句执行优先级

MySQL中,AND的执行优先级高于OR。也就是说,在没有小括号()的干预下,总是先执行AND语句,再执行OR语句。
例:
select * from table where 条件1 AND 条件2 OR 条件3
等价于
select * from table where ( 条件1 AND 条件2 ) OR 条件3
select * from table where 条件1 AND 条件2 OR 条件3 AND 条件4
等价于
select * from table where ( 条件1 AND 条件2) OR ( 条件3 AND 条件4 )
其实and和or运算,就是逻辑运算中的 &(与) 和 |(或)运算。

数据库管理/连接工具

Navicat Lite

开源免费。快速、可靠并价格相宜的资料库管理工具,大可使用来简化资料库的管理及降低系统管理成本。Navicat是以直觉化的使用者图形介面所而建的,让你可以以安全且简单的方式建立、组织、存取并共用资讯。Navicat 支持常见的各种数据库。Navicat 提供商业版 Navicat Premium 和 免费的版本 Navicat Lite 。但目前 Navicat 已不再提供 LITE 版本。
缺点:免费版本已停止更新。

DBeaver

DBeaver,基于Eclipse开发,开源免费,支持各大操作系统,操作界面与Eclipse非常类似。是一个通用的数据库管理工具和 SQL 客户端,支持各种常见的数据库,以及其他兼容 JDBC 的数据库,如一些不常见的数据库如惠普的vertica。DBeaver 提供一个图形界面用来查看数据库结构、执行SQL查询和脚本,浏览和导出数据,处理BLOB/CLOB 数据,修改数据库结构等。更新频繁,个人最爱。

建模工具 MySQL Workbench

MySQL Workbench是数据库架构师和开发人员的可视化数据库设计、管理的工具,它是著名的数据库设计工具DBDesigner4的继任者。你可以用MySQL Workbench设计和创建新的数据库图示,建立数据库文档。它同时有开源和商业化的两个版本。支持主流操作系统。

MAC上的MySQL管理工具 Sequel Pro

Sequel Pro 的原名是CocoaMySQL,是一个与phpMyAdmin相像的MySQL管理工具。它是由Cocoa和面对对象的C(Mac OSX)编写的。Sequel Pro允许你编辑数据库,表格(字段和索引)和列,执行个性化查找和导入导出数据。
缺点:不适用于其他系统。
参考:Mac 平台 MySQL连接工具 Sequel Pro 使用经验之谈

Oracle SQL Developer

Oracle SQL Developer 是一个免费非开源的用以开发数据库应用程序的图形化工具,使用 SQL Developer 可以浏览数据库对象、运行 SQL 语句和脚本、编辑和调试 PL/SQL 语句。另外还可以创建执行和保存报表。该工具可以连接任何 Oracle 9.2.0.1 或者以上版本的 Oracle 数据库,支持主流操作系统。

DataGrip

JetBrain公司出品,操作界面、风格和快捷键和IDEA非常相似,有着IDEA一样的插件化思想。入手快。
参考:DataGrip 使用经验之谈

datetime 和 timestamp 的区别

总结:每个表都应该有一列使用 timestamp 用于自动记录更新时间,如果需要记录创建时间,则使用 datetime。
datetime

  1. 允许为空值,可以自定义值,系统不会自动修改其值;
  2. 不可以设定默认值,所以在不允许为空值的情况下,必须手动指定 datetime 字段的值才可以成功插入数据;
  3. 虽然不可以设定默认值,但是可以在指定 datetime 字段的值的时候使用 now() 变量来自动插入系统的当前时间;
    结论:datetime 类型适合用来记录数据的原始的创建时间,因为无论你怎么更改记录中其他字段的值,datetime 字段的值都不会改变,除非你手动更改它。

timestamp

  1. 允许为空值,但是不可以自定义值,所以为空值时没有任何意义
  2. 默认值为 CURRENT_TIMESTAMP(),其实也就是当前的系统时间
  3. timestamp 列不可以用程序设置值,只能由数据库自动去修改(手动修改也可以 =_=!!!),所以在插入记录时不需要指定 timestamp 字段的名称和 timestamp 字段的值,你只需要在设计表的时候添加一个 timestamp 字段即可,插入后该字段的值会自动变为当前系统时间
  4. 以后任何时间修改表中的记录时,对应记录的 timestamp 值会自动被更新为当前的系统时间
  5. TIMESTAMP列创建后的格式是
    date_change_last_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
    结论:timestamp 类型适合用来记录数据的最后修改时间,因为只要你更改记录中其他字段的值,timestamp字段的值都会被自动更新。
    参考:
    MySQL5 日期类型 DATETIME 和 TIMESTAMP 相关问题详解

各种取数据库取前N条记录的SQL语句

MySQL:
select * from table1 limit 10; 或 select * from table1 limit 0,10;
SELECT * FROM table LIMIT 95,-1; // 检索记录行 96-last
初始记录行的偏移量是 0,指定第二个参数为 -1时表示查询从某一个偏移量到记录集的结束所有的记录行。
SQL Server:
select top (10) * from table1 where 1=1;
每页显示perpage条记录,按照id的排序,取第pageno页的记录:
select top perpage*pageno * from table where id not in(select top (pageno-1)*perpage id from table1);
oracle:
select * from table1 where rownum<=10;
oracle取第11-20条:
select * from (select *,rownum num from table1 where rownum<=20) where num>=10;
oracle按id排序后取11-20条
select * from (select *,rownum num from (select * from table1 tt order by id desc) where rownum<=20) where num>=10;
Access:
select top (10) * from table1;
db2:
select 列名 from table1 where 1=1 fetch first 10 rows only;

MySQL索引失效的几种情况

  1. like查询以%开头,like '%XX' or like '%XX%'
  2. where 子句中使用!=或<>操作符;
  3. in 和 not in 也会导致全表扫描,如:select id from t where num in(1,2,3);,解决方法:1. 换成between:select id from t where num between 1 and 3; 2. 换成exists:select num from a where num in(select num from b);换成select num from a where exists(select 1 from b where num=a.num);
  4. where 子句中对字段进行表达式操作:select id from t where num/2=100;

MySQL优化check清单

  1. 上面索引失效的各种情况就是优化清单其一;
  2. 使用 InnoDB 存储引擎使用 InnoDB 存储引擎
    InnoDB 比 MyISAM 更有优势,它们是如何利用物理内存的:
    MyISAM:仅在内存中保存索引。
    InnoDB:在内存中保存索引和数据。
    表转换存储引擎的命令:ALTER TABLE table_name ENGINE=InnoDB;
  3. 任何地方都不要使用select * from t,用具体的字段列表来代替,不要返回用不到的任何字段。问题:如果确实需要30个字段,一个个写出来不麻烦吗?(注:遗留的老旧系统或者业务特别复杂且没有进行适当业务拆分的系统,有30列字段很常见)?

猜你喜欢

转载自blog.csdn.net/lonelymanontheway/article/details/82766117
今日推荐