oracle的Select语句
select 查询的一般格式是
select {[distinct|all] columns | *} //1 选择列
from {tables | views | other select} //2 数据来源
where conditions //3 选择条件
group by columns //4 分组
having conditions //5 选择
order by columns //6 排序
一、选择列
1. select后面出现的内容可以是from后面的数据来源中的列,也可以是*,也可以是常量或者T-SQL函数。
2. 如果列名很长,或者多个表的列名有冲突,可以使用as来定义别名。
二、数据来源
1. 数据来源可以是表,视图,还可以是其他的select语句(即,行集)。
2. from子句中可以包含连接说明,即inner join,outer join这样的内容。
这个内容参见下面的内容。
3. 可以在from子句中为表,视图,或者其他select语句的结果指定别名,但是不要用as。
三、where子句
1. 多个条件之间可以用and 或者or连接。
2. null值查询要使用is null,或者is not null,而不是=null或者<>null
3. like是进行模式匹配的一种方式,列的数据类型可以是任何字符或者日期数据。
它的否定形式是not like。
%和_是通配符,一个表示0或多个任意字符,一个表示一个任意字符。
但是这两个字符如果不出现在like后面的模式中,就是两个普通字符。
4. text列的where条件只能是like,is null,patindex。
5. 如果要在like中匹配普通字符%和_,可以使用escape定义一个转义字符,这个转义字符可以随意指定。
然后将这个转义字符放在一个通配符或者单引号之前,就表示这个通配符或者单引号是一个普通的字符。
6. in ,not in,between and,not between and.“between a and b”将会包括a和b在内。
in可以转换为一个连接,但是not in不能。
7. where exists R.当且仅当R非空时,条件exists R为真。
其否定形式是where not exists R.
8. where s <| >| = | <>| >=|<= all/any R.否定形式是在s前对整个表达式加not.
四、连接查询
两张表的连接可以用from子句的ansi连接语法或者where子句中的sql连接语法实现。
ansi 连接语法格式为From table1 join_type table2 on(conditions) join_type table3
on(conditions)。
连接有等值连接,笛卡尔积(交叉连接),自然连接,theta连接,外部链接五种。
1 等值连接
select students.* , stu_course.*
from students inner join stu_course
on(students.id = stu_course.studentid)--31条记录,stu_course的记录数目
2 交叉连接(笛卡尔积)
select students.* , stu_course.*
from students cross join stu_course --186条记录,是6*31的结果。
就是两个表的行一一进行组合。
3 自然连接(等值连接的简化)
select students.*, stu_course.courseid, stu_course.credit
from students inner join stu_course
on(students.id = stu_course.studentid)--等值连接中重复列只保留一列,但不仅限于去掉重复列
4 theta连接
select students.*, stu_course.courseid, stu_course.credit
from students inner join stu_course
on(students.id = stu_course.studentid)
and students.sex = 'F'
5 多表连接,同时也是自然连接
select as stuname, as coursename , stu_course.credit
from students
inner inner join stu_course on (students.id = stu_course.studentid)
inner join course on(stu_course.courseid = course.id)--仍然只有31行。
6 外连接
select students.*, stu_course.courseid, stu_course.credit
from students left outer join stu_course
on(students.id = stu_course.studentid)
left outer是除了符合条件的行,还要从左侧表里选出不匹配的行。
7 连接和子查询的比较
如果需要频繁计算聚集数据并将其用再外查询中进行比较,一般用子查询。
如果select中的列,来自多个不同的表,一般用连接。
五、group by和having
select语句中出现的列,都必须出现在group by子句中,除非那一列使用了聚集函数。
having子句是从分组后的结果中筛选行,having的搜索条件在进行分组操作之后应用,所以它必须在group by之后使用。
它和where子句的另一个区别在于,它可以出现聚合函数。
where和having中都可以出现比较运算符,between,in,like,all,any。
六、order by
order by columns用来对结果集进行排序,按照列顺序,嵌套排序。
默认是asc升序,desc 是降序。