一般格式:
SELECT [ALL|DISTINCT]<目标列表达式>[,<目标列表达式>]…
FROM <表名或视图名>[,<表名或视图名>]...
[WHERE <条件表达式>]
[GROUP BY <列名1> [HAVING <条件表达式>]]
[ORDER BY <列名>2 [ASC|DESC] ]
WHEREE的查询条件:
确定范围:BETWEEN AND,NOT BETWEEN AND;
确定集合:IN,NOT IN;
字符匹配:LIKE,NOT LIKE;
通配符:%和_
% 与包含一个或多个字符的字符串匹配
[ ] 与特定范围(例如,[a-f])或特定集(例如,[abcdef])中的任意单字符匹配。
[^] 与特定范围(例如,[^a-f])或特定集(例如,[^abcdef])之外的任意单字符匹配。
例子:
• WHERE FirstName LIKE '_im' 可以找到所有三个字母的、以 im 结尾的名字(例如,Jim、Tim)。
• WHERE LastName LIKE '%stein' 可以找到姓以 stein 结尾的所有员工。
• WHERE LastName LIKE '%stein%' 可以找到姓中任意位置包括 stein 的所有员工。
• WHERE FirstName LIKE '[JT]im' 可以找到三个字母的、以 im 结尾并以 J 或 T 开始的名字(即仅有 Jim 和 Tim)
• WHERE LastName LIKE 'm[^c]%' 可以找到以 m 开始的、后面的(第二个)字母不为 c 的所有姓。
查姓欧阳且全名为3个汉字的学生的姓名: select name from student where name like '欧阳_ _':汉字占两个字符的位置
空值:IS NULLL,IS NOT NULL;
多重条件:AND,OR
集函数:
COUNT([DISTINCT|ALL] *)
COUNT([DISTINCT|ALL] <列名>)
SUM([DISTINCT|ALL] <列名>)
AVG([DISTINCT|ALL]<列名>)
MAX([DISTINCT|ALL]|<列名>)
MIN([DISTINCT|ALL]<列名>)
嵌套查询
一个SELECT_FROM_WHERE 语句称为一个查询块,将一个查询块嵌套在另一个查询块的WHEREE子句或HAVING 短语的条件中的查询称为嵌套查询或子查询
带any嵌套查询
select emp.empno,emp.ename,emp.sal from scott.emp where sal>any(select sal from scott.emp where job='manager');
等价于
select sal from scott.emp where job='manager' 结果为 sal:2975 2850 2450
select emp.empno,emp.ename,emp.sal from scott.emp where sal>2975 or sal>2850 or sal>2450
带some嵌套查询
select emp.empno,emp.ename,emp.sal from scott.emp where sal=some(select sal from scott.emp where job='manager');
等价于
select sal from scott.emp where job='manager' 结果为 sal:2975 2850 2450
select emp.empno,emp.ename,emp.sal from scott.emp where sal=2975 or sal=2850 or sal=2450
注:any与some是等价的
带all嵌套查询
select emp.empno,emp.ename,emp.sal from scott.emp where sal>all(select sal from scott.emp where job='manager');
等价于
select sal from scott.emp where job='manager' 结果为 sal:2975 2850 2450
select emp.empno,emp.ename,emp.sal from scott.emp where sal>2975 and sal>2850 and sal>2450
- ALL与ANY的关系就是,AND 与 OR 的关系。
- ANY与SOME等价,据说搞这两个不同的词出来是为了迁就英语语法。例如,在用= ANY 的地方在(英语)语法上就应该是= SOME。
- IN 与 = ANY 等价,均表示,变量在(子查询)列表之中,即 a IN (table B) 表示 a = ANY B.b
- NOT IN 与 <> ALL 等价,而不等于<> ANY,前两者均表示,变量不在(子查询)列表之中,即 a NOT IN (table B) 表示 a <> ALL B.b。而如果a <> ANY B.b,则只要任意一个b<>a就true了。
- IN 与 EXISTS 的性能区别主要来自,IN 会编列子查询的每行记录,然后再返回,而EXISTS 则只要遇到第一个满足条件的记录就马上返回。
- NOT IN 与 NOT EXISTS 并不能完全等价,只有当子查询中,select 关键字后的字段有not null约束或者有这种暗示时才用NOT IN。