distinct 删除重复行
例如:
SELECT DISTINCT department_idFROM employees;
sql 和SQL*Plus的区别:
一种语言;
ANSI标准;
关键字不能缩写;
使用语句控制数据库中的表的定义信息和表中的数据
SQL*Plus:
一种环境;
Oracle 的特性之一;
关键字可以缩写;
命令不能改变数据库中的数据的值;
集中运行.
显示表结构:使用 DESCRIBE 命令,表示表的结构 DESCRIBE tablename
*************过滤和排序数据
**********
BETWEEN ..AND... 在两个值之间 (包含边界)
例如:
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 函数;
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 >
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');该写法错误(子查询不返回任何行);