1. 常量和变量以及运算:
1) SQL中的常量和C语言以及其它语言中的常量定义完全相同,就是一些字面值,比如15、'xyz'就分别是数值型字面值和字符串型字面值,它们都属于常量;
2) 而变量是可以定义在SQL脚本中的,但是我们平时写查询语句中用的最多的变量就是列(属性)了,例如:select col1, col2 from table1;中的col1、col2分别表示table1中的两个列,但其实可以理解为当前查询出的条目中col1列和col2列的值,而这两个值先分别临时存放在临时变量col1和col2中了,因此这两个当然是变量,并且完全可以当做变量使用;
3) 所有的常量和变量都可以参与到SQL的运算当中(算术运算(加减乘除)、逻辑运算(与或非)、比较运算(大于、小于等);
!!SQL规定,任何运算里有null参与(即算术表达式中有null作为操作数)那么整个表达式的结果将是null,比如5 + null = null,true and null = null等等,同时字符串连接时如果连接的一方有null那么结果还是null,比如concat('haha', null) = null!!
2. 算术运算符:
1) SQL中的算术运算符包括+、-、*、/四则运算,这四个运算符可以运用到任何数值类型数据上(整型、浮点型等等);
2) 有些特殊类型,比如日期类型,只允许走+和-两种运算(算天数、时间差等等);
3) 示例:select stu_age + 5 from table_stu; // 查询结果的那一列就是学生的岁数的再加上5的结果!
4) 字符串连接:在SQL中不使用+连接字符串,SQL中没有运算符重载的概念,SQL仅仅是一种查询语言,并不是一种严格的编程语言,因此不提供运算符重载的功能;
!!SQL字符串连接只能使用SQL库函数concat,用法是:concat(str1, str2); // 直接将str1+str2的结果返回;
3. 比较运算符:
1) SQL中有>、>=、<、<=、=、<>,注意!相等比较就是一个=而不是C或Java中的==!而不等于是<>而不是!=,而SQL中的辅助运算符是:=
2) 上述的最基本的比较运算符,任何比较都可以用上述的组合来完成,但SQL还定义了一些特殊比较运算符可以简化查询语句的编写:expr都是指SQL中具有值的表达式
i. 区间检查:expr between expr1 and expr2 // 即检查expr是否∈[expr1, expr2],这是闭区间
ii. 范围检查:expr in(expr1, expr2, ...) // 检查expr的值是否落在in()中指定的各值中
iii. 空检查:expr is null // 检查expr是否是空值
3) 示例:
select * from table_stu
where
1. id between 2 and 999
2. 88 between stu_num and id + 15
3. id in(2, 5, 90)
4. id in(3, stu_num)
5. name is null
!这里给出了5中写法,可以看到只要是表达式(不管是常量还是变量)都可以放入这些运算符的相应位置上;
4. 逻辑运算符:
1) 主要就是与或非三种,分别是and、or、not,这里不再是C/Java中的&&、||、!,一定要注意;
2) 逻辑常量只有true和false两种;
3) 一般用来连接各种比较运算形成复杂的逻辑推理;
5. 运算符优先级:
1) SQL运算符的优先级完全和C/Java一样,都是算术运算符>比较运算符>逻辑运算符,并且表达式是从左往右计算的;
2) 如果想打破这种优先级规律,就必须使用()运算符进行组合;
6. SQL专门为字符串匹配提供了一个运算符like——实现模糊查询:
1) 也是一种特殊的比较运算符,用于模糊匹配字符串,是专门为字符串准备的,可以模糊查询字符串;
2) like支持两种通配符,_代表任意的一个字符,而%代表任意多个字符,如果匹配的刚好就包含下划线和百分号,那么就需要转义,转义符号是\,那么下划线和百分号就是这样表示的'\_'和'\%';
3) 举例:
name like '孙%'; // 姓孙的名字
name like '__'; // 两个字的名字
id like '\_%'; // 以下划线开头的ID
id like '\%%'; // 以百分号开头的ID
4) 笨笨的like:like默认情况下将反斜杠\作为转义字符(\也是like的特殊字符,特殊字符有_、%和\),那么如何匹配'\'本身呢?你可能会想这样like '\\%'就是匹配以反斜杠开头的字符串,那你就错了,like有点笨,在like中一旦一个字符被当做转移字符,那它就一辈子都是转义字符,like扫描到第一个\,发现它是个转移字符,然后接着扫描第二个\,发现还是一个转义字符,两个连续的转义字符当然是错误的了;
!!因此like处理转义字符的逻辑和其它语言完全不同,其它语言都是扫描到转义字符之后,无论后面跟着的字符是什么字符,都会当成纯字符处理;
!!那么这样该如何转义特殊字符\,like有一个escape语法,可以让你自定义转义字符而不是顽固地死用默认的\作为转义字符,比如:id like '@\%' escape '@';的意思就是在这条like语句里将@作为转义字符,那么当@遇到特殊字符\时就将\转义成纯文本字符了;
!!!转义的意思就是将语句中起到特殊作用的特殊字符转变成对应的纯文本字符;
!!因此上述的4个例子也可以这样写:
id like '/_%' escape '/';
id like '$%%' escape '$';
!!注意:显然不能将特殊字符本身(%、_、\)定义成转义字符,即一个字符不能有两种身份,这三个字符已经有一种身份了(即特殊字符),因此不能再给它们加另外的身份(转义字符),只能将那些没有任何身份的纯文本字符指定为转义字符;
!!escape指定的转义字符只在所在的like中有效;