查询语句
# 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...):

