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’ 明显会匹配失败;