查询语句
# 0x0.总览
# 格式
- all/distinct:全保留/去除重复项
- having:子组时使用,代替where
- asc/desc:排序时升序或降序,不选择默认为升序。
# 三张表
下面例子用的三张表,用于例子演示:
# 常用的查询条件
==注意:between and一般是闭区间,即包含边界值的。==(实际使用中不同数据库可能不一样。)
逻辑顺序:
# 通配符%和_
%代表任意字符串,任意长度,包括0,类似正则中(*)
_代表一个未知字符串,无类似
如果带查询的字符串中有通配符,可以用\和ESCAPE关键字,如下:
# order by排序子句
例子:
# 常用聚集函数
例子:
# group by细化对象子句
例子:
# 条件判断用having
分为组的时候用having限定条件,而不是where,如下:
这里需要理解,having的作用对象是一个“组”,相当于一个小型的表,所以having可以使用如max,min等函数,而where却不可以。
# 常用谓词
# in
判断结果是否在一个集合中,常用于不相关子查询的嵌套查询。
# 比较运算符(>,<,=,>=,<=,!=或<>)
当验证的子集为母集单元素时,in谓词可以用=号替换。
# any,all
子查询返回单值时可以用比较运算符;
返回多值时要用ANY或ALL谓词修饰;
于此同时,必须使用比较运算符;
例子:
可以用聚集函数实现,如果有索引,这个方法自然更快:
# exists
# 存在量词
这是sql中的存在量词,而sql中不存在全称量词。
例子:
# 全称量词
因为没有全称量词,所以用not exists双重否定就可以表示全程量词的逻辑,此时,利用了相关子查询:
利用exists/not exists实现逻辑蕴函:
# 0x1.单表查询
# 1.选择列
# 2.选择元组
涉及空值的查询:
# 0x2.连接查询
# 执行过程:
# 嵌套循环法
# 排序合并法
效率比前者高,需要查询次数够多。
# 索引连接法
# 0.注意要点
- 当在查询否定意义的数据时,使用连接很有可能多出一些查询结果,而不如嵌套查询清楚正确,此时最好使用嵌套查询,不然就仔细检测逻辑。
# 1.简单连接
简单连接两者没啥好说,就是会有重复的列:
# 1-2.自然连接
这个自然连接居然是手动的,好家伙:
# 2.自身连接
自身连接必须使用别名,别忘了。
# 3.外连接
# 4.多表连接
# 0x3.嵌套查询
嵌套查询和连接查询一般可以互换,但是一般是嵌套查询效率更高。
例子:
# 0.嵌套查询谓词
嵌套查询经常用到查询谓词,所以要熟练。
另外,利用exists/not exists谓词实现逻辑蕴函是难点,要着重理解。exists谓词讲解
# 1.不相关子查询
例子,用到了谓词in:
# 2.相关子查询
例子,用到了比较运算符:
可能的执行过程:
# 0x4.集合查询
注意使用集合查询时列数必须相同,数据类型也必须相同!
# 1.union并操作
可以用or或者and代替,效率更高:
# 2.intersect交操作
可以用or或者and代替,效率更高:
# 3.except差操作
可以用or或者and代替,效率更高:
# 0x5.基于派生表的查询
派生表就是根据查询需求临时构建一张表来进行查询,一般来说,效率可能更高。
即在from后直接创建一张表,创建的这张表用as来起名字表名(属性名1,属性名2...)
: