1. 对单表执行select查询
select 列名1[,列名2,...] from 表名 ;
2. 选择一个表中所有列
select * from 表名 ;
3. 使用where子句过滤行
SELECT list of items
FROM list of tables
WHERE list of conditions ;
4. 理解行标识符
rowid: 伪列, Oracle数据库中每一行都有一个唯一的行标识符,是18位数字,采用base-64编码;
select rowid ,bin_float from binary_test ;
5. 理解行号
rownum: 伪行, 返回每一行在结果集中的行号;从1开始。
select rownum ,bin_float from binary_test ;
6. 执行算术运算符
1> 用算术表达式来进行算术运算: + - * /
2> 日期运算
3> 列运算
7. 使用列别名
8. 使用连接操作符( "||" )合并列的输出结果
9. 理解空值(null value)
使用相关函数处理空值 nvl(), nvl2()
10. 禁止显示重复行 distinct
11. 比较值
= 、!=或<> 、< 、> 、<= 、>= 、ANY 、SOME 、ALL
12.使用sql操作符
like、in、 between、 is null 、 is nan、 is infinite、与not结合使用,含义相反的
like: 通配符:(_)匹配一个;(%)匹配任意个
13. 使用逻辑操作符 and、 or、 not
14. 理解操作符执行的优先级(推荐使用括号来显示处理)
15. 使用order by 来排序 desc:降序 asc:升序
16. 执行使用两个表的select语句, 要使用一个连接条件
17. 使用表别名,在from语句中指定
18. 笛卡尔积 , 在多表查询时不指定连接条件,
19. 执行使用多于两个表的select语句 连接数=查询中使用的表的总数 - 1
20. 连接条件与连接类型
根据连接条件分:
1> 等连接(equijoin) 使用 =
2> 不等连接(non-equijoin) 使用 <,>,between等
连接类型:
1> 内边接(inner join) 满足连接条件则返回一行;连接条件中有一列为空,则不返回
2> 外连接(outer join) 满足连接条件则返回一行;连接条件中有一列为空,也返回
3> 自连接(self join) 返回连接到同一个表的行
外连接:Oracle特有的外连接操作符是使用圆括号括起来的加号:(+),用空值来填充未匹配项;
1> 左外连接: 外连接操作符是在等于操作符的右边
2> 右外连接: 外连接操作符是在等于操作符的左边
注:
a> 不能在连接的两端使用外连接操作符
b> 不能同时使用外连接条件与in操作符
c> 不能同时使用一个外连接条件和另一个使用or操作符的连接条件
21. 使用SQL/92语法执行连接
1> 对于内连接,可以使用inner join ... on 子句
2> 对于内连接,并满足(查询是等连接且等连接中的列同名),则可以用using关键字简化连接
例: SQL/86格式:
select p.name,pt.name
from products p, product_types pt
where p.product_type_id = pt.product_type_id
order by p.name;
inner join ..。on格式:
select p.name,pt.name
from products p inner join product_types pt
on p.product_type_id = pt.product_type_id
order by p.name;
using格式:
select p.name,pt.name
from products p inner join product_types pt
using(product_type_id)
order by p.name;
3> 对于外连接 from table1 {LEFT | RIGHT | FULL } OUTER JOIN TABLE2
左外连接:
select p.product_type_id,pt.product_type_id,p.name,pt.name
from products p, product_types pt
where p.product_type_id = pt.product_type_id(+)
order by p.name;
右外连接:
select p.product_type_id,pt.product_type_id,p.name,pt.name
from products p, product_types pt
where p.product_type_id(+) = pt.product_type_id
order by p.name;
全外连接:
select p.product_type_id,pt.product_type_id,p.name,pt.name
from products p full outer join product_types pt
using (product_type_id)
order by p.name;
4> 交叉连接 使用 cross join
SQL/86格式: select * from products,product_types ;
SQL/92格式: select * from products cross join product_types ;
注:注意not in 与null时的特殊情况
1:select * from customers where customer_id in (2,3,5);
2:select * from customers where customer_id not in (2,3,5);
3:select customer_id from customers where customer_id not in (2,3,5,null);
4:select customer_id from customers where customer_id not in (null);
对于1,2这两个语句都好理解,对于第3,4条语句,显示结果为空;
3,4语句可以重写为:
3==> select customer_id from customers where customer_id <>2 and customer_id <>3 and customer_id <>5 and customer_id <>null;
4==> select customer_id from customers where customer_id <>null;
解释: "not in ( 列表值1 [,列表值2,...] )" 在该条件的列表中,有一个为空值则判断结果是UNKNOW,结果不是true,where子句只认true,其他都不认,这样就不会有结果集返回了
–如果null参与算术运算,则该算术表达式的值为null。(例如:+,-,*,/ 加减乘除)
–如果null参与比较运算,则结果可视为false。(例如:>=,<=,<> 大于,小于,不等于)
–如果null参与聚集运算,则聚集函数都置为null。除count(*)之外。
-如果在not in子查询中有null值的时候,则不会返回数据。
对于not in 遇到空值时出现的”陷阱“问题:
1. 可以用nvl()函数,先处理数据;
2. 使用not exists 替换处理
in/not in 的结果是依赖于“=”等值判断的结果;
exists/not exists 虽然是判断集合是否为空,但通常里面的子查询做的是值判断。
3. 对于多表关联使用 LEFT OUTER JOIN 替换处理
select 列名1[,列名2,...] from 表名 ;
2. 选择一个表中所有列
select * from 表名 ;
3. 使用where子句过滤行
SELECT list of items
FROM list of tables
WHERE list of conditions ;
4. 理解行标识符
rowid: 伪列, Oracle数据库中每一行都有一个唯一的行标识符,是18位数字,采用base-64编码;
select rowid ,bin_float from binary_test ;
5. 理解行号
rownum: 伪行, 返回每一行在结果集中的行号;从1开始。
select rownum ,bin_float from binary_test ;
6. 执行算术运算符
1> 用算术表达式来进行算术运算: + - * /
2> 日期运算
3> 列运算
7. 使用列别名
8. 使用连接操作符( "||" )合并列的输出结果
9. 理解空值(null value)
使用相关函数处理空值 nvl(), nvl2()
10. 禁止显示重复行 distinct
11. 比较值
= 、!=或<> 、< 、> 、<= 、>= 、ANY 、SOME 、ALL
12.使用sql操作符
like、in、 between、 is null 、 is nan、 is infinite、与not结合使用,含义相反的
like: 通配符:(_)匹配一个;(%)匹配任意个
13. 使用逻辑操作符 and、 or、 not
14. 理解操作符执行的优先级(推荐使用括号来显示处理)
15. 使用order by 来排序 desc:降序 asc:升序
16. 执行使用两个表的select语句, 要使用一个连接条件
17. 使用表别名,在from语句中指定
18. 笛卡尔积 , 在多表查询时不指定连接条件,
19. 执行使用多于两个表的select语句 连接数=查询中使用的表的总数 - 1
20. 连接条件与连接类型
根据连接条件分:
1> 等连接(equijoin) 使用 =
2> 不等连接(non-equijoin) 使用 <,>,between等
连接类型:
1> 内边接(inner join) 满足连接条件则返回一行;连接条件中有一列为空,则不返回
2> 外连接(outer join) 满足连接条件则返回一行;连接条件中有一列为空,也返回
3> 自连接(self join) 返回连接到同一个表的行
外连接:Oracle特有的外连接操作符是使用圆括号括起来的加号:(+),用空值来填充未匹配项;
1> 左外连接: 外连接操作符是在等于操作符的右边
2> 右外连接: 外连接操作符是在等于操作符的左边
注:
a> 不能在连接的两端使用外连接操作符
b> 不能同时使用外连接条件与in操作符
c> 不能同时使用一个外连接条件和另一个使用or操作符的连接条件
21. 使用SQL/92语法执行连接
1> 对于内连接,可以使用inner join ... on 子句
2> 对于内连接,并满足(查询是等连接且等连接中的列同名),则可以用using关键字简化连接
例: SQL/86格式:
select p.name,pt.name
from products p, product_types pt
where p.product_type_id = pt.product_type_id
order by p.name;
inner join ..。on格式:
select p.name,pt.name
from products p inner join product_types pt
on p.product_type_id = pt.product_type_id
order by p.name;
using格式:
select p.name,pt.name
from products p inner join product_types pt
using(product_type_id)
order by p.name;
3> 对于外连接 from table1 {LEFT | RIGHT | FULL } OUTER JOIN TABLE2
左外连接:
select p.product_type_id,pt.product_type_id,p.name,pt.name
from products p, product_types pt
where p.product_type_id = pt.product_type_id(+)
order by p.name;
右外连接:
select p.product_type_id,pt.product_type_id,p.name,pt.name
from products p, product_types pt
where p.product_type_id(+) = pt.product_type_id
order by p.name;
全外连接:
select p.product_type_id,pt.product_type_id,p.name,pt.name
from products p full outer join product_types pt
using (product_type_id)
order by p.name;
4> 交叉连接 使用 cross join
SQL/86格式: select * from products,product_types ;
SQL/92格式: select * from products cross join product_types ;
注:注意not in 与null时的特殊情况
1:select * from customers where customer_id in (2,3,5);
2:select * from customers where customer_id not in (2,3,5);
3:select customer_id from customers where customer_id not in (2,3,5,null);
4:select customer_id from customers where customer_id not in (null);
对于1,2这两个语句都好理解,对于第3,4条语句,显示结果为空;
3,4语句可以重写为:
3==> select customer_id from customers where customer_id <>2 and customer_id <>3 and customer_id <>5 and customer_id <>null;
4==> select customer_id from customers where customer_id <>null;
解释: "not in ( 列表值1 [,列表值2,...] )" 在该条件的列表中,有一个为空值则判断结果是UNKNOW,结果不是true,where子句只认true,其他都不认,这样就不会有结果集返回了
–如果null参与算术运算,则该算术表达式的值为null。(例如:+,-,*,/ 加减乘除)
–如果null参与比较运算,则结果可视为false。(例如:>=,<=,<> 大于,小于,不等于)
–如果null参与聚集运算,则聚集函数都置为null。除count(*)之外。
-如果在not in子查询中有null值的时候,则不会返回数据。
对于not in 遇到空值时出现的”陷阱“问题:
1. 可以用nvl()函数,先处理数据;
2. 使用not exists 替换处理
in/not in 的结果是依赖于“=”等值判断的结果;
exists/not exists 虽然是判断集合是否为空,但通常里面的子查询做的是值判断。
3. 对于多表关联使用 LEFT OUTER JOIN 替换处理