oracle 复习

******基本的select语句********

distinct  删除重复行

例如:

SELECT DISTINCT department_id

FROM   employees;

sql 和SQL*Plus的区别:

SQL:
一种语言;
ANSI标准;
关键字不能缩写;
使用语句控制数据库中的表的定义信息和表中的数据
SQL*Plus:
一种环境;
Oracle 的特性之一;
关键字可以缩写;

命令不能改变数据库中的数据的值;

集中运行.


显示表结构:使用 DESCRIBE 命令,表示表的结构    DESCRIBE  tablename

*************
过滤和排序数据
**********

BETWEEN ..AND...  在两个值之间 (包含边界)

例如:

...... WHERE  salary BETWEEN 2500 AND 3500;

IN(set)           等于值列表中的一个  

例如:

.........WHERE  manager_id IN (100, 101, 201);

LIKE              模糊查询             

例如:  

.........WHERE  first_name LIKE 'S%';

IS NULL       空值

例如:

...........WHERE  anager_id IS NULL;

    

使用 LIKE 运算选择类似的值

选择条件可以包含字符或数字:

% 代表零个或多个字符。

_ 代表一个字符。
***********
  oracle中的优先级:
        
1.    算术运算符
    
2 .   连接符
    
3 .   比较符
    
4 .   IS [NOT] NULL, LIKE, [NOT] IN
    
5 .   [NOT] BETWEEN
    
6 .   NOT
    
7 .   AND
    
8 .   OR
 其中可以使用括号改变优先级顺序

ORDER BY + 列名+排序方法(ASC: 升序(默认),DESC: 降序);


************
通用函数
************
这些函数适用于任何数据类型,同时也适用于空值:

NVL (expr1, expr2)    expr1为NULL,返回expr2;不为NULL,返回expr1。注意两者的类型要一致。  

NVL2 (expr1, expr2, expr3)  expr1不为NULL,返回expr2;为NULL,返回expr3。expr2和expr3类型不同的话,expr3会转换

为expr2的类型。

NULLIF (expr1, expr2)   相等返回NULL,不等返回expr1
COALESCE (expr1, expr2, ..., exprn) -- 返回表达式中第一个非空表达式,如有以下语句:  SELECT COALESCE

(NULL,NULL,3,4,5) FROM dual;其返回结果为:3
在 SQL 语句中使用IF-THEN-ELSE 逻辑.
IF-THEN-ELSE的使用:
if a= ..  then
......
elsif a=..  then
....
end if;

使用两种方法:   CASE 表达式; 以及DECODE 函数;

case表达式举例:
SELECT last_name, job_id, salary,
       
    CASE job_id     WHEN 'IT_PROG'  THEN  1.10*salary
                   
            WHEN 'ST_CLERK' THEN  1.15*salary
                   
            WHEN 'SA_REP'   THEN  1.20*salary
       
    ELSE            salary END     "REVISED_SALARY"
    

FROM   employees;

decode函数举例:
SELECT last_name, job_id, salary,
       
DECODE(job_id,  'IT_PROG',  1.10*salary,
                     
          'ST_CLERK', 1.15*salary,
                     
          'SA_REP',   1.20*salary,
              
           salary)
       REVISED_SALARY

FROM   employees;
*****************************
合并 - 连接 查询和子查询******资料.
*****************************
笛卡尔集产生的条件:
1.省略连接条件
2.连接条件无效
3.所有表中的所有行互相连接
为了避免笛卡尔集,可以在where 加入 有效的连接条件;

oracle 1992连接查询语法:
使用连接在多个表中查询数据。

在 WHERE 字句中写入连接条件。

在表中有相同列时,在列名之前加上表名前缀。
例如
SELECT    table1.column, table2.column
FROM    table1, table2

WHERE    table1.column1 = table2.column2;
外连接语法:
使用外连接可以查询不满足连接条件的数据。
外连接的符号是 (+)。(可以理解为带'+'号的显示交集,不带的显示全部)
SELECT    table1.column, table2.column

FROM    table1, table2

WHERE    table1.column(+) = table2.column;

oracle1999语法:
例如:
SELECT e.employee_id, e.last_name, e.department_id,
       
    d.department_id, d.location_id

FROM   employees e JOIN departments d
ON     (e.department_id = d.department_id);
多个on子句的使用:
SELECT employee_id, city, department_name

FROM   employees e
JOIN   departments d

ON     d.department_id = e.department_id
JOIN   locations l
ON     d.location_id = l.location_id;
内连接 与 外连接:
在SQL: 1999中,内连接只返回满足连接条件的数据。

两个表在连接过程中除了返回满足连接条件的行以外还返回左(或右)表中不满足条件的行,这种连接称为左(或右外联接。
两个表在连接过程中除了返回满足连接条件的行以外还返回两个表中不满足条件的行 ,这种连接称为满 外联接。
内连接和外连接:
关键字        作用
join        两个表匹配查询的交集
right join    已右表为基础,左表进行匹配(左表扩展显示,若无匹配项则以null补充)   (右边的显示全部)
left join       已左表为基础,右表进行匹配(右表扩展显示,若无匹配项则以null补充)   (左边的显示全部)
full join     左右表相互匹配(并集),会把左右表中各自未匹配的记录,在另一侧用null补充
;
组函数:
avg平均值,count计数,max最大值,min最小值,sum求和.
组函数不能放在where子句里,可以在having子句中使用组函数.

使用 HAVING 过滤分组:

1.    行已经被分组。

2.    使用了组函数。

3.    满足HAVING 子句中条件的分组将被显示。
SELECT   department_id, MAX(salary)
FROM     employees
GROUP BY department_id

HAVING   MAX(salary)>1000 ;

嵌套组函数:
SELECT   MAX(AVG(salary))

FROM     employees

GROUP BY department_id;
*********
子查询
*********
例子:
SELECT last_name

FROM   employees

WHERE  salary >
              
 (SELECT salary
  FROM employees

 WHERE  last_name = 'Abel');

注意事项:

子查询要包含在括号内。

将子查询放在比较条件的右侧。除非进行Top-N 分析,否则不要在子查询中使用ORDER BY 子句。

单行操作符对应单行子查询,多行操作符对应多行子查询。
执行单行子查询:
SELECT last_name, job_id, salary
FROM   employees
WHERE  job_id =             
(SELECT job_id

  FROM   employees

  WHERE  employee_id = 141)

AND    salary >      

(SELECT salary
  FROM   employees
  WHERE  employee_id = 143);
在子查询中使用组函数:
SELECT last_name, job_id, salary

FROM   employeesWHERE  salary =
(SELECT MIN(salary) FROM   employees);

非法使用子查询:

SELECT employee_id, last_name
FROM   employees
WHERE  salary =
                (SELECT   MIN(salary)
                 FROM     employees
                 GROUP BY department_id);  该写法错误;(多行子查询使用了单行比较符);
SELECT last_name, job_id
FROM   employees
WHERE  job_id =
                (SELECT job_id
                 FROM   employees
                 WHERE  last_name = 'Haas');该写法错误(子查询不返回任何行);























  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值