MySQL语句

MySQL语句


语句

SQL语言包括数据定义(DDL)、数据操纵(DML),数据控制(DCL)和数据查询(DQL)四个部分。

数据定义:Create Table,Alter Table,Drop Table, Craete/Drop Index等

数据操纵:Select ,insert,update,delete,

数据控制:grant,revoke

数据查询:select


NULL

NULL这个值表示UNKNOWN(未知):它不表示“”(空字符串)。对NULL这个值的任何比较都会生产一个NULL值。您不能把任何值与一个NULL值进行比较,并在逻辑上希望获得一个答案。

使用IS NULL来进行NULL判断


通用SQL函数

  • CONCAT(A, B)
    连接两个字符串值以创建单个字符串输出。通常用于将两个或多个字段合并为一个字段。

  • FORMAT(X, D)
    格式化数字X到D有效数字。

  • CURRDATE(), CURRTIME()
    返回当前日期或时间。

  • NOW()
    将当前日期和时间作为一个值返回。

  • MONTH(),DAY(),YEAR(),WEEK(),WEEKDAY()
    – 从日期值中提取给定数据。

  • HOUR(),MINUTE(),SECOND() – 从时间值中提取给定数据。

  • DATEDIFF(A,B) 确定两个日期之间的差异,通常用于计算年龄

  • SUBTIMES(A,B)
    确定两次之间的差异。

  • FROMDAYS(INT)
    将整数天数转换为日期值。


MySQL外连接、内连接与自连接

  • 交叉连接
    交叉连接又叫笛卡尔积,它是指不使用任何条件,直接将一个表的所有记录和另一个表中的所有记录一一匹配。

  • 内连接
    则是只有条件的交叉连接,根据某个条件筛选出符合条件的记录,不符合条件的记录不会出现在结果集中,即内连接只连接匹配的行。

  • 外连接
    其结果集中不仅包含符合连接条件的行,而且还会包括左表、右表或两个表中的所有数据行,这三种情况依次称之为左外连接,右外连接,和全外连接。

  • 左外连接
    也称左连接,左表为主表,左表中的所有记录都会出现在结果集中,对于那些在右表中并没有匹配的记录,仍然要显示,右边对应的那些字段值以NULL来填充。

  • 右外连接
    也称右连接,右表为主表,右表中的所有记录都会出现在结果集中。左连接和右连接可以互换,MySQL目前还不支持全外连接。


常用但容易忘的

  • 如果有主键或者唯一键冲突则不插入:insert ignore into;
  • 如果有主键或者唯一键冲突则更新,注意这个会影响自增的增量:INSERT INTO room_remarks(room_id,room_remarks)VALUE(1,“sdf”) ON DUPLICATE KEY UPDATE room_remarks = “234”;
  • 如果有就用新的替代,values如果不包含自增列,自增列的值会变化:REPLACE INTO room_remarks(room_id,room_remarks) VALUE(1,“sdf”);
  • 备份表:CREATE TABLE user_info SELECT * FROM user_info;
  • 复制表结构:CREATE TABLE user_v2 LIKE user;
  • 从查询语句中导入:INSERT INTO user_v2 SELECT * FROM user或者INSERT INTO user_v2(id,num) SELECT id,num FROM user;
  • 连表更新:UPDATE user a, room b SET a.num=a.num+1 WHERE a.room_id=b.id;
  • 连表删除:DELETE user FROM user,black WHERE user.id=black.id;

锁相关(作为了解,很少用)

  • 共享锁:select id from tb_test where id = 1 lock in share mode;
  • 排它锁:select id from tb_test where id = 1 for update;

优化时用到

  • 强制使用某个索引:select * from table force index(idx_user) limit 2;
  • 禁止使用某个索引:select * from table ignore index(idx_user) limit 2;
  • 禁用缓存(在测试时去除缓存的影响):select SQL_NO_CACHE from table limit 2;

查看状态

  • 查看字符集:SHOW VARIABLES LIKE ‘character_set%’;
  • 查看排序规则:SHOW VARIABLES LIKE ‘collation%’;

SQL编写注意

  • where语句的解析顺序是从右到左,条件尽量放where不要放having;
  • 采用延迟关联(deferred join)技术优化超多分页场景,比如limit 10000,10,延迟关联可以避免回表;
  • distinct语句非常损耗性能,可以通过group by来优化;
  • 连表尽量不要超过三个表。