首页 > 数据库技术 > 详细

Oracle学习(二)_多表操作

时间:2014-07-16 17:55:33      阅读:534      评论:0      收藏:0      [点我收藏+]
--第一部分:SQL基础
  --ch1 简单查询
  --ch2 查询基本概念
  --ch3 数据过滤
  
--第二部分:多表操作
  --ch4 集合理论
  --ch5 内连接
  --ch6 外连接
  --ch7 子查询
  
--第三部分:数据分组
  --ch8 简单统计
  --ch9 数据分组
  --ch10 分组数据过滤
  
--第四部分:SQL函数
  --ch11 内置函数
  --ch12 case表达式

--第五部分:DML语句
  --ch13  插入数据
  --ch14  修改数据
  --ch15  删除数据

------------------------------------------------------------------------  
--第一部分:SQL基础
【ch1 简单的查询】
--1.1 select简介
SELECT 是SQL的核心部分。用于从数据库中提取信息。
SELECT操作可以细分为:
SELECT 语句
SELECT 表达式
SELECT 查询 
三部分

--1.2 select语句
一个select语句由几个独立的关键字组成,这些关键字被称作子句。
由如下五个子句构成:
(1)SELECT 子句
指定查询结果集中想要的列。                     <必要>
(2)FROM 子句
指定select子句中的列是从哪个表或视图中取出的。 <必要>
(3)WHERE 子句
用来过滤from子句返回的行。                     [可选]
where子句后跟一个表达式,称为谓词。其值可能为true、false或unknown。
可以使用比较运算符、逻辑运算符、特殊运算符来检验这些表达式。
(4)GROUP BY 子句
若select子句中使用了统计函数来得到汇总信息,那么可以用
GROUP by子句把这些信息分成不同的组。           [可选]
(5)HAVING 子句
一般和group by组合使用,用来过滤分组后的信息。 [可选]
having子句后也跟着一个其值可能为true、false或unknown的表达式,
也可以使用比较运算符、逻辑运算符、特殊运算符来检验这些表达式。

--1.3基本select查询
1)查询单列
SELECT column_name FROM table_name;

SELECT customer_id FROM customers;
2)查询多列
逗号分隔;列可以不按照顺序
SELECT column_name,column_name,... FROM table_name;

SELECT customer_id, first_name, last_name FROM customers;
3)查询所有列
SELECT * FROM table_name;

SELECT * FROM customers;

--1.4消除重复的行
SELECT product_type_id FROM products;

SELECT DISTINCT product_type_id FROM products;
SELECT DISTINCT product_id, product_type_id FROM products;

SELECT UNIQUE product_type_id FROM products;

--1.5排序序列
select语句返回的结果集一般是无序的;
结果集中的记录之间的顺序主要取决于它们在表中的物理位置。
ORDER BY 子句
--asc 默认升序 desc 降序
--nulls first nulls last
--按列名排序,列名可以不出现在select子句中
SELECT * FROM customers 
ORDER BY customer_id;

SELECT first_name, last_name 
FROM customers 
ORDER BY customer_id;
--按别名排序
SELECT first_name, last_name, salary AS sl
  FROM employees
 ORDER BY sl DESC;
--按列序号排序
SELECT first_name, last_name, salary
  FROM employees
 ORDER BY 3 DESC;
--多列排序
SELECT * FROM products
ORDER BY product_type_id,product_id;
--asc/desc
SELECT * FROM customers 
ORDER BY last_name DESC, dob ASC;
--nulls first/nulls last
SELECT * FROM customers 
ORDER BY phone NULLS FIRST, dob NULLS LAST;

【ch2 查询基本概念】
--2.1select子句内容(select list)
1)列引用
(table_name.)column_name
2)文字值
字符串文字
‘51testing‘
‘This is a sample sql‘
‘12345‘
‘You‘‘d better study hard‘
数值文字
911
-3.1415
.8888
3.4e5
日期文字
DATE‘2012-12-21‘
to_date(‘2012-10-10 20:20:20‘,‘yyyy-mm-dd hh24:mi:ss‘)

--2.2表达式
比如要表达:我爱你!
嘴巴           +         语言            ->     表达的意思
双手           +         手势		 ->	表达的意思

操作符(运算符) +         操作数(数据)    ->     值

将操作数(数据)用操作符(运算符)按一定的规则连接起来的、有意义的式子称为表达式。
操作数(数据)本身就是一个表达式,因为它本身就是一个值。

表达式的两个属性:
1)表达式都有一个类型;
2)表达式都返回一个值。

表达式定义的操作完成,则会返回一个值给SQL语句,参与进一步的处理。

--2.3SQL数据类型
表列的属性:name、type、value
数据库中的每一列都有分配一种数据类型。
这一列存储的数据就只能是这一类的。
数据类型也决定了用户能对这一列所做的操作。
INT
CHAR
VARCHAR2
NUMBER
DATE

--2.4表达式类型
1)连接表达式
把两个或多个项放到一个字符串中
CHARACTER STRING Literal || CHARACTER STRING Literal
COLUMN REFERENCE            COLUMN REFERENCE
51 || ‘testing‘
first_name || last_name
‘This is ‘ || first_name

2)数学表达式
进行加减乘除运算
NUMERIC Literal     +     NUMERIC Literal
COLUMN REFERENCE    -     COLUMN REFERENCE
                    *
                    /
1 + 2
price * 2
price * price
                    
3)日期表达式
日期计算
DATE Literal        +     Non-DECIMAL NUMERIC Literal(非小数数值文字)
COLUMN REFERENCE    -     DATE Literal
                          COLUMN REFERENCE

DATE‘2000-1-1‘ + 1
dob - 1

--2.5在select中使用表达式
在一个查询中创建一个计算列
查找某指定的列值
对结果集中的行进行过滤选择
用join操作连接两个表
1)连接表达式
SELECT first_name || last_name 
FROM customers; 

2)数学表达式
SELECT price, price*2 FROM products;

3)日期表达式
SELECT dob, dob-1 FROM customers;

归纳:
值表达式(返回特定类型值的表达式)
Literal VALUE       +   
COLUMN REFERENCE    -
FUNCTION            *
(VALUE expression)  /
                   ||
CHARACTER  ||
NUMERIC    + - * /
DATE       + -

--2.6空值NULL
1)表示没有或未知
在一个表中,如果一行中的某列没有值,那么就称它为空值(NULL) 
NULL与 0、空字符串或空格不同。     
2)空值带来的问题:
(1)NULL 关系运算符(= <> > >= < <=) -> unknown
SELECT * FROM customers
WHERE  customer_id <> NULL;

(2)NULL 算术运算符(+ - * /)        -> NULL
SELECT NULL+3 FROM dual;

【ch3 数据过滤】
--3.1使用where提炼信息
1)where子句
用来过滤select语句从一个表中取出的信息。
包含一个查询条件,对信息的过滤就是由这个查询条件完成的。
查询条件提供了一种选择机制,仅选择想要的行或把不想要的行从结果中删除。
from子句定义的逻辑表中的所有行,都要经过查询条件的过滤。

查询条件包含一个或多个谓词,每一个谓词都是一个表达式(关系表达式),
检验一个或多个值表达式并返回true、false或unknown。
还可以用and或or这两个逻辑运算符把多个谓词连接在一起组成一个查询条件(逻辑表达式)。

对某一特定的行而言,若整个查询条件的结果为true,则这一行就会出现在最终的结果集中。

SELECT * FROM customers 
WHERE customer_id = 2;

SELECT * FROM customers 
WHERE customer_id > 2 AND dob > DATE‘2000-1-1‘;

2)关系和逻辑表达式
关系表达式:
用关系运算符(= <> > >= < <= BETWEEN AND IN LIKE IS NULL)将两个值表达式连接起来的式子,称为关系表达式。
逻辑表达式:
用逻辑运算符(AND OR NOT)将关系表达式连接起来的有意义的式子称为逻辑表达式。

五个基本谓词:
1)comparision
包括六种比较操作符: = <> < <= > >=
来比较两个值表达式的大小关系
2)RANGE
between谓词可以用来检验一个给定的值表达式的值是否落在一个确定的范围内。
这个值的范围可以用两个值表达式确定,其间可以用and关键字隔开。
value_expr BETWEEN A AND B <=>  
value_expr >=A AND value_expr <= B
3)membership
in谓词用来判定一个值表达式的值是否和一个给定列表中值相匹配。
value_expr IN (v1,v2,v3,...) <=>
value_expr = v1 OR value_expr = v2 OR value_expr = v3 ...
4)pattern match
LIKE谓词用来判定字符串类型的值表达式是否和给定的字符串匹配。
5)NULL
IS NULL谓词用来判断一个值表达式的值是否为空。

--3.2查询条件定义
1)比较
SELECT * FROM customers WHERE customer_id <> 2;
SELECT customer_id, first_name, last_name
  FROM customers
 WHERE customer_id > 8;
2)范围
SELECT *
  FROM customers
 WHERE dob BETWEEN DATE ‘1968-02-05‘ AND DATE ‘1970-05-20‘;
3)集合成员
SELECT * FROM customers 
WHERE customer_id IN (1, 2, 3);
4)模式匹配
--通配符
--下划线 _ 匹配指定位置上的任意一个字符
--百分号 % 匹配从指定位置开始的任意字符
--escape选项可以对通配符进行文本匹配
SELECT * FROM customers WHERE first_name LIKE ‘_o%‘;
INSERT INTO customers VALUES(88,‘cai_zhiguo‘,‘czg‘,SYSDATE,13812345678);
INSERT INTO customers VALUES(88,‘cai|zhiguo‘,‘czg‘,SYSDATE,13812345678);
COMMIT;
SELECT * FROM customers WHERE first_name LIKE ‘%i\_zhi%‘ ESCAPE ‘\‘;
SELECT * FROM customers WHERE first_name LIKE ‘%iH_zhi%‘ ESCAPE ‘H‘;
5)空值
SELECT * FROM customers WHERE dob IS NULL;
6)NOT
SELECT * FROM customers WHERE first_name NOT LIKE ‘_o%‘;
SELECT * FROM customers WHERE dob IS NOT NULL;          

--3.3多个条件的使用
1)AND OR
两个或多个条件可以使用and或or操作符来连接。
and:结果集中出现的每一行必须满足要连接的所有条件(满足所有的关系表达式)。
可以这样理解:
在第一个关系表达式满足的基础上,对第二个关系表达式进行筛选,再在此基础上对第三个关系表达式进行筛选...
依次执行筛选,直到最后一个表达式,最终得到返回的结果集。

AND   TRUE    FALSE
TRUE  TRUE    FALSE
FALSE FALSE   FALSE

SELECT *
  FROM customers
 WHERE dob > DATE ‘1970-6-1‘
   AND customer_id > 3;

OR:结果集中的行只要满足连接条件中的任一个就可以被选择(满足任意一个关系表达式)。
可以这样理解:
先单独求满足第一个关系表达式的结果集,再单独求满足第二个关系表达式的结果集,再单独求第三个...
依次单独求出每个关系表达式的结果集,再对这些结果集进行合并,并剔除重复的记录后,最终得到
返回的结果集。

OR    TRUE    FALSE
TRUE  TRUE    TRUE
FALSE TRUE    FALSE

SELECT *
  FROM customers
 WHERE dob > DATE ‘1970-6-1‘
   OR customer_id > 3;
   
2)AND OR 一起使用
SELECT *
  FROM employees e
 WHERE e.title = ‘CEO‘
    OR e.title = ‘CFO‘
   AND e.salary = 600000;

3)优先级
操作符处理优先级:
+(正)-(负)
* /
+ -
= <> < <= > >= BETWEEN IN LIKE IS NULL
NOT
AND
OR

()改变优先级
带括号的条件是在不带括号的条件之前处理的;
两个或多个带括号的条件,从左至右处理;
嵌套的带括号的条件,从内至外处理。

SELECT *
  FROM employees e
 WHERE (e.title = ‘CEO‘
    OR e.title = ‘CFO‘)
   AND e.salary = 600000;


4)空值补充
任何处理空值的谓词其结果都是unknown。
一行要出现在结果集中,那么其谓词必须为真,
若结果为假或未知的行都会被排除在结果集之外。

AND     TRUE    FALSE     unknown
TRUE    TRUE    FALSE     unknown
FALSE   FALSE   FALSE     FALSE
unknown unknown FALSE     unknown

OR      TRUE    FALSE     unknown
TRUE    TRUE    TRUE      TRUE
FALSE   TRUE    FALSE     unknown
unknown TRUE    unknown   unknown

(expression)   NOT (expression)
TRUE           FALSE
FALSE          TRUE
unknown        unknown

 

Oracle学习(二)_多表操作,布布扣,bubuko.com

Oracle学习(二)_多表操作

原文:http://www.cnblogs.com/qmfsun/p/3847505.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!