1.目录

就mysql而言,在SQL搜索语义从层面上:

  • 可以将表中数据看都看作字符串,在写SQL的时候,将数字写成’1’,‘2’仍能被识别成数字;
  • 可以不用区分浮点数和整数;
  • 可以将子串等字符串操作用在数值类型数据上;
  • 可以将大小关系等用在字符串操作上,不过这个本来就可以,毕竟有字典序之类概念;

2.查询

固定列、所有列

  • 所有列的语法,SELECT * FROM table;
  • 格式化问题,SQL返回的数据是裸数据,需要在程序中进行格式处理;

去重

  • 写法为SELECT DISTINCT col0, col1 … coln FROM products;
  • 去重会作用在多个列上,除非col0, col1 … coln的组合是需要去重的,否则不起任何效果;

行数限定

  • 其实就类似于head指令;
  • 写法为LIMIT 5 或 LIMIT 4,5(从第4行开始输出5行)或LIMIT 5 OFFSET 4;
  • 在OFFSET中第一行应该是0,是从0开始计数的;

完全限定表

  • SELECT products.prod_name FROM sqlLearning.products;

3.排序

排序数据、多列排序

  • 排序可以指定多行,ORDER BY vend_id, product_id这样
  • 不应该假设未排序的查询结果的顺序具有意义,也就是一般别去理会由于底层结构从而得到的默认顺序;
  • 可用非SELECT的列排序;

指定排序的升降序

  • 使用DESC(降序)、ASC(升序),一般ASC用不上因为是默认的,
    ORDER BY vend_id DESC这样,少数在查询内容后面的关键字;
  • 可以多列排序,但每个列指定不同的方向;
SELECT products.prod_name  
    FROM products
    ORDER BY vend_id DESC, prod_name;

4.查询条件

单值匹配、不匹配

  • 从此处可得开头的结论,在SQL语义上是尽量不去区分字符串、数值的。例如字符串也实现了字典序,数值在SQL语句上用’1’等表示也能识别成数值,数值也可以用字符串的求子串等操作;

空值检查

  • 空值与0、空格等都不相同,就是特殊值NULL,所以也有了特别的控制检查;
  • 空值检查写法为IS NULL,非空值检查写法为IS NOT NULL;

连续范围查询

  • 写法为BETWEEN x AND y;
  • 在Mysql中是[x, y]的形式,上下边界都被包含;
  • 不但可用于数值,也可用于字符串的字典序;
  • 可用 t >= x AND t <= y来实现,查询速度基本相等,暂未知详细差异;

组合条件

  • 关键字AND和OR,其实就相当于&&和||,连优先级都一样,&&高于||;

特殊关键字NOT

  • 可用于修饰NULL、BETWEEN、IN、EXIST;

离散范围查询

  • 写法为IN(val0, val1 … valn);
  • 明显可用于数值、字符串;
  • 可嵌套SELECT语句;

模糊查询

  • 是一种类似类似于正则表达式的东西,可以描述一种字符串模式;
  • 但是和正则表达式具有区别,具体为:
    例如搜索字符串是"string",REGEXP 'str’会匹配成功,LIKE ‘str’会匹配失败;
  • 写法为LIKE xxx,通配符%表示任意个数任意字符,通配符_表示一个任意字符;
  • 明显是用来搜索字符串的,但如上所说,mysql中数值也兼有字符串的一些性质;
  • 一般不建议 ‘%ring’ 这种在开头使用通配符的写法,搜索会很慢;
  • 结尾如果存在尾空格的话,例如 ‘string ‘,那么’%ing’ 明显会匹配失败;